Zend Framework

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 27-11-2011 14:47:44

nh75020
Nouveau membre
Date d'inscription: 27-11-2011
Messages: 7

Options pour code barre 128 ?

Bonjour,

Je cherche à dessiner un code barre type 128 en alternant les trois jeux de caractères ASCII définis (A,B,C). Ceci correspond aux spécifications des colissimo de LaPoste.

Je souhaite pouvoir générer un seul code barre avec le renderer pdf. Au pire je créerai 3 codes barre sans zone de silence ni checksum pour les "coller" (sans être certain que le scanneur tolérera ces "collages").

Mon code actuel (sans erreur) ne convient pas puisqu'il ne me permet pas choisir l'encodage du code barre :
$bc0ptionsObject = array('text'    => "8V41392078260",
        'drawText'    => false,
        'withQuietZones'    => false
        'withChecksumInText'=> false);    
$bc0ptionsRender = array();

$pdf = Zend_Barcode::factory('code128', 'pdf', $bc0ptionsObject, $bc0ptionsRender )->setResource($pdf)->draw();

Après avoir ouvert ZendFramework\library\Zend\Barcode\Object\Code128.php, j'ai vu qu'il existe une variable protected $_charSets qui défini les jeux de caractères A,B,C; mais je ne suis pas certain qu'ils soient réellement implémentés. 


Comment puis-je définir le $_charSets dans mon tableau $bc0ptionsObject lorsque j'appelle barcode::factory ?


Référence:
From http://en.wikipedia.org/wiki/Code_128
Subtypes
Code 128 includes 101 symbols: 103 data symbols, 3 start codes, and 1 stop code. To represent all 128 ASCII values, there are three code sets (A, B, C), which can be mixed within a single barcode (by using codes 98 and 99 in code sets A and B, 100 in code sets A and C and 101 in code sets B and C to switch between them):
    128A (Code Set A) - ASCII characters 00 to 95 (0-9, A-Z and control codes), special characters, and FNC 1-4
    128B (Code Set B) - ASCII characters 32 to 127 (0-9, A-Z, a-z), special characters, and FNC 1-4
    128C (Code Set C) - 00-99 (encodes each two digits with one code) and FNC1


NB: La page wiki liste une implémentation PERL, mais j'en cherche une en PHP puisque j'utilise Zend Framework 1.11 sous W7.

Merci d'avance pour votre aide.

Hors ligne

 

#2 30-11-2011 11:58:19

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1175
Site web

Re: Options pour code barre 128 ?

Hello,

Il est certain que le "collage" ne marchera pas. Outre les zones de silence, il y a les START et STOP.
Peux-tu m'en dire plus sur l'utilisation des codesets que tu souhaites (ordre...) ?

Aujourd'hui Zend_Barcode_Object_Code128 optimise au mieux les changements de codesets à la volée et on ne peux pas en forcer 1. Mais si le besoin existe, je peux bien sûr modifier Zend_Barcode.

Le script PERL semble fournir la même implémentation que Zend_Barcode avec peut-être une option de type "preferredCodeset" mais qui ne permet pas de choisir plusieurs codeset dans un code-barres mais plutôt de forcer un codeset pour tout le code-barres.

@+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#3 30-11-2011 13:48:05

nh75020
Nouveau membre
Date d'inscription: 27-11-2011
Messages: 7

Re: Options pour code barre 128 ?

Bonjour mikaelkael,

Merci beaucoup d'avoir pris en compte cette discussion.

Voici un extrait de la spécification Colissimo :
<début>
La symbologie des codes à barres type 128 permet le codage des caractères dans les deux principaux modes suivants :
  - Jeu A : caractères alphanumériques ASCII (de 00 à 95) ou jeu B : caractères alphanumériques ASCII (de 32 à 127)
  - Jeu C : caractères numériques uniquement, autorisant une densité double

Afin de réduire la largeur des codes à barres, l'optimisation des compressions doit-être à minima réalisée de la façon suivante :

CB suivi (ex: 8V41392078260)
3 premiers caractères alphanumériques du jeu A ou B
10 caractères numériques suivants du jeu C (5 blocs de 2 chiffres)
ou
2 premiers caractères alphanumériques du jeu A ou B
10 caractères numériques suivants du jeu C (5 blocs de 2 chiffres)
1 dernier caractère alphanumériques du jeu A ou B
ou
2 premiers caractères alphanumériques du jeu A ou B
8 caractères numériques suivants du jeu C (4 blocs de 2 chiffres)
3 derniers caractères alphanumériques du jeu A ou B


CB prise en charge (ex: 8V1750159647440150001164)
8 premiers caractères alphanumériques du jeu A ou B
16 caractères numériques suivants du jeu C (8 blocs de 2 chiffres)
<fin>

RQ. Les variantes définies dans la spécification sont relatives aux destinations internationales. 

Vu ton niveau d'expertise, je n'ai rien à ajouter à priori car toute suggestion d'implémentation ou de configuration serai ridicule de ma part.

A ta disposition pour toute info supplémentaire.

Hors ligne

 

#4 30-11-2011 14:07:33

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1175
Site web

Re: Options pour code barre 128 ?

Hello,

Je viens de tester Zend_Barcode_Object_Code128 avec 8V41392078260, il donne ton 2ème cas :
- 2 premiers caractères alphanumériques du jeu A ou B
- 10 caractères numériques suivants du jeu C (5 blocs de 2 chiffres)
- 1 dernier caractère alphanumériques du jeu A ou B

Par contre pour ton 2ème, il optimise un peu plus :
- 2 premiers caractères alphanumériques du jeu A ou B
- 22 caractères numériques suivants du jeu C (11 blocs de 2 chiffres)

Je pense donc que Zend_Barcode respecte à minima la spécification Colissimo smile.

@+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#5 30-11-2011 16:06:23

nh75020
Nouveau membre
Date d'inscription: 27-11-2011
Messages: 7

Re: Options pour code barre 128 ?

Merci pour ta réponse rapide !

Il y a un hic, forcement smile.

Pour respecter la spécification Colissimo il faut pouvoir produire les 4 cas ci-dessous suivant les destinations. Et quand la spécification dit "...doit-être à minima réalisée..." cela doit se comprendre "...doit-être strictement réalisée..." sous peine de voir tous les colis rejetés.

Du coup, laisser (bien) faire Zend ne produit pas à coup sûr le résultat requis suivant le contexte d'envoi et peut évoluer après un éventuel refactoring de la classe en 2.x. 

Est-il envisageable de pouvoir ajouter un array($pos ou lenght=>[],$_charSet=>[],$pos ou lenght=>[],$_charSet=>[]...) dans mon array de config avant l'appel à Zend_Barcode::factory ?

Si oui, champagne wink !

@+

Hors ligne

 

#6 30-11-2011 16:39:55

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1175
Site web

Re: Options pour code barre 128 ?

Hello,

Je n'ai pas accès à la spécification Colissimo mais Zend_Barcode cherchera toujours l'algorithme optimum pour tracer le code-barres. Dans le cas 1 chiffre / 1 lettre / 11 chiffres, il donnera toujours (même en ZF2 wink) :
- 2 premiers caractères alphanumériques du jeu A ou B
- 10 caractères numériques suivants du jeu C (5 blocs de 2 chiffres)
- 1 dernier caractère alphanumériques du jeu A ou B

D'après ce que je lis, tu dois obligatoirement tracer les 3 codes-barres à chaque fois. C'est bien ça ?

Industriellement, j'ai du mal à comprendre. Un lecteur CAB (Code128) peut lire les 3 codesets. La seule limitation provient de la largeur finale du code-barres et de la taille d'un module. Zend_Barcode cherchera toujours à tracer le code-barres le plus concis (ce qui explique le cas du long code-barres que tu fournis).

@+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#7 01-12-2011 00:48:29

nh75020
Nouveau membre
Date d'inscription: 27-11-2011
Messages: 7

Re: Options pour code barre 128 ?

Bonsoir,

Je suis d’accord avec toi, le dosage entre les codeset ne doit pas gêner le scanner. A mon avis, le principal problème risque de venir de la filiale de ColisPoste qui est en charge de valider et d’approuver les étiquettes de tout nouveau client. Je crains que mes étiquettes soient refusées au motif qu’elles ne respectent pas la spécification neutral.

Voici des informations supplémentaires provenant de la spécification :
  Une étiquette colissimo fait au maximum 100x150mm; pour ne pas avoir à passer mon temps à régler les marges au millimètre lors des impressions des étiquettes, je réduis la taille à 96x144mm.
  Au sein de l'étiquette de nombreuses zones (textes, logos, CB) se juxtaposent et sont positionnées/générés avec Zend_Pdf. Sur chaque étiquette, deux codes barres doivent apparaître :
  - le code barre de suivi à 13 caractères (celui du colissimo),
  - le code barre de prise en charge à 24 caractères (qui n’est lu que lors de la prise en charge par LaPoste)
Les codes barres sont effectivement contraints par :
- l'espace de la zone attribuée (approx. 55mm –hors zones silence- pour le CB suivi ;  83mm –hors zones silence- pour le CB prise en charge)
- hauteur des barres min 27mm
- module de base (plus petite barre ou espace) entre 0,33 et 0,375mm
- zones de silence droite et gauche min 10x le module de base
- un trait d'environ 1mm sous le code barre de suivi

En résumé, pour le code barre de suivi :
1)    Pour les colis France et outre-mer (ex. 8V41392078260 et 7A20524752032) pas de problème puisque la spéc demande 2(A ou B)+10(C)+1(A ou B) ce que génère Zend_Barcode_Object_Code128.
2)    Pour les colis international (ex. CY245619837FR) la spéc demande 2(A ou B)+8(C)+3(A ou B) ou bien 3(A ou B)+8(C)+2(A ou B), que génère Zend_Barcode_Object_Code128 ?

En revanche il y a un souci pour le code barre de prise en charge :
3)    Pour les colis France, outre-mer et international (ex. 8V1722409000010860000037, 7A1722409000010860000037 et CY2GBW1A9000010860000037) écart entre la spéc 8(A ou B)+16(C) et ce que génère Zend_Barcode_Object :  2(A ou B)+22(C).

Avec un peu de chance le point 2) sera nativement généré par Zend_Barcode_Object_Code128 . Il ne me restera qu’un souci sur le point 3) car le CB est trop optimisé par la classe Zend wink

En plus des deux points ci-dessus, j’ai quelques questions relatives à Zend_Barcode et Zend_pdf :
4)    Comment fais-tu pour connaître le mix des codeset pour un code barre 128 ? La classe Zend_Validate_Barcode ne permet pas de le faire, as-tu écris un validateur spécifique ? Peux-tu le partager ?
5)    Pour Zend_Barcode_Object,  quelles sont les unités de 'barHeight' , 'setbarThinWidth', getWidth() et getOffsetTop() ? En mm ? Qu’il me faut ensuit convertir en points pdf (0,353mm) ?
6)    Suivant la réponse du point 6, je peux avoir un autre souci, car la spéc demande un module de base d’environ une mesure pdf (0,353mm) et comme ‘barThinWidth’ (je suppose qu’il s’agit de la même notion) est un entier, le mm est 3x trop large.
7)    Comme le CB de suivi doit être souligné et non entouré, Zend_Barcode_Object  'withBorder' ne convient pas. Pour palier à cela je compte faire un Zend_Pdf_Page->drawLine(avec des positions calculées grâce à Zend_Barcode_Object-> getQuietZone() , getOffsetLeft() ). Cela te parait-il la bonne approche ou l'ajout d'un attribut 'underligne' est envisageable wink ?

Désolé pour cette longue réponse, qui j’espère ne te découragera pas ; en tout cas ton aide est précieuse car je me sens seul sur ce sujet, même sur Google.

Dernière modification par nh75020 (01-12-2011 00:49:40)

Hors ligne

 

#8 01-12-2011 09:32:09

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1175
Site web

Re: Options pour code barre 128 ?

Hello,

Ta réponse est bien et complète.

D'ores et déjà les 1) et 2) sont en natifs.

Pour le point 3), est-tu vraiment certain que cela ne passe pas ? (désolé d'insister mais le changement dans le code est non négligeable sad)

4) j'ai fait tourner en mode debug mais si je dois changer le code pour 3) je le mettrais dans ZF.

5) Les unités sont des modules pour Zend_Barcode_Object. Ensuite chaque renderer possède sa correspondance :
image : 1module=1px et pdf : 1module=0.5pt. Si tu veux changer, tu fais :

Code:

$renderer->setModuleSize(0.353);

6) cf ci-dessus

7) le drawLine() me plait bien big_smile

@+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#9 01-12-2011 16:41:12

nh75020
Nouveau membre
Date d'inscription: 27-11-2011
Messages: 7

Re: Options pour code barre 128 ?

Bonjour,

  Donc à part le point 3, les bonnes nouvelles s'accumulent smile tant mieux.

  A vrai dire je ne sais pas encore si cela sera bloquant ou pas. Le processus de validation des étiquettes commencera dès que le contrat sera signé. Mais au préalable de cette signature, le développement de l'application doit être terminée. Donc j'ai 50/50 d'être dans une impasse mi-janvier et cela retardera le démarrage de mon activité.

  Je comprend que tu ne veuilles pas entreprendre un refactoring sans être sûr que cela soit nécessaire à 100%, c'est le YAGNI d'XP.
 
  Merci en tout cas pour le support et les infos (notamment les unités qui sont dans la doc, que j'ai lu pourtant plusieurs fois, sans comprendre que c'était la réponse).

@+

Dernière modification par nh75020 (01-12-2011 16:43:18)

Hors ligne

 

#10 16-07-2012 18:15:47

nh75020
Nouveau membre
Date d'inscription: 27-11-2011
Messages: 7

Re: Options pour code barre 128 ?

Bonjour,

  Si vous avez besoin de modifier certains détails de la génération d'un code barre (dans mon cas je dois le souligner et non l'entourer), voici pour info trois exemples qui fonctionnent :

  1) Créez votre propre classe héritant de Zend_Barcode_Object_*
  class My_Code128 extends Zend_Barcode_Object_Code128
  {
    // Surchargez les methodes nécessaires 
    protected function _calculateBarcodeWidth()
    { }
    protected function _drawBorder()
    { }
  }
 
  2) Dans votre code, 3 options :

    $barcode->setOptions($bcOptionsObject); // incluant 'barcodeNamespace' => 'My',  // voir doc Zend
    Zend_Barcode::factory('code128', 'pdf', $bcOptionsObject, $bcOptionsRender )->setResource($pdf)->draw();
   
    -- OU --

      $barcode = new My_Code128();
    $barcode->setOptions($bcOptionsObject); // les infos pour dessiner le code barre, voir doc Zend
   
    // $barcode n'est pas obligatoirement une string, mais peut aussi être un adapter vers votre classe
    Zend_Barcode::factory($barcode, 'pdf', $bcOptionsObject, $bcOptionsRender )->setResource($pdf)->draw();
   
    -- OU --
   
      $barcode = new My_Code128();
    $barcode->setOptions($bcOptionsObject);
       
    $renderer = new Zend_Barcode_Renderer_Pdf();
    $renderer->setOptions($bcOptionsRender); //  voir doc Zend
    $renderer->setBarcode($barcode);
    $renderer->setResource($pdf)->draw();

   
    Voilà, c'est peut-être trivial, mais cela peut faire gagner du temps sur ce sujet.

Dernière modification par nh75020 (17-07-2012 00:19:59)

Hors ligne

 

#11 26-07-2012 16:49:35

nh75020
Nouveau membre
Date d'inscription: 27-11-2011
Messages: 7

Re: Options pour code barre 128 ?

Mikaelkael,

  Voici la conclusion de ce thread :

- Les codes barres générés par Zend conviennent pour Colissimo, même s'ils ne suivent pas strictement l'encodage défini dans le cahier des charges.

- le seul point bloquant de Zend_Barcode_Object_Code128 (pour Colissimo) est l'absence de soulignement du code barre. En l'état actuel il faut donc surcharger cette classe.

Merci pour ton support et désolé de t'avoir un peu trop sollicité.

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages