Générer des codes barres en lignes de commandes sous Linux (barcode)
Je dispose, à titre professionnel, de quelques lecteurs optiques USB qui prenaient paisiblement la poussière sur un coin d’étagère. Je souhaitais, depuis un bout de temps, les remettre en service pour pouvoir, par exemple, décoder un code barre client qui serait imprimé sur un courrier, un dossiers ou un formulaire et ainsi automatiser sa recherche dans notre base de données. J’imaginais encore, faciliter le fastidieux inventaire du matériel informatique, par la lecture optique d’étiquettes « maison ». Ni les idées, ni le matériel ne me manquaient, il me restait juste à trouver comment générer et imprimer mes propres codes barres et si possible en lignes de commandes (c’est bien plus pratique pour écrire des scripts – ).
Côté lecture et matériel, aucun problème : le lecteur et reconnu sous Linux comme un périphérique d’entrée tout ce qu’il y a de plus classique; les données décodées sont tout simplement envoyées sur l’entrée standard et récupérables de la même manière que du texte saisi au clavier. Du vrai Plug&Play !
Côté génération et logiciel, pas de grande difficulté non plus… Un coup de « aptitude search barcode » (sous Debian) révèle deux candidats :
- Barcode : Un outil et ses librairies pour générer des codes barres,
- kbarcode : Un outil graphique de génération de codes barres, (qui est ni plus, ni moins, un front-end amélioré de barcode).
D’après l’utilisation que je veux en faire (les scripts et tout et tout), c’est surtout le premier qui va m’intéresser…
Barcode (Gnu-Barcode)
Une lecture rapide du man m’apprend que Barcode lit par défaut, une chaîne de caractères sur l’entrée standard et renvoie du code postscript sur la sortie tout aussi standard.
En utilisation très basique, ça donne :
$ barcode %!PS-Adobe-2.0 %%Creator: "barcode", libbarcode sample frontend %%DocumentPaperSizes: a4 %%EndComments %%EndProlog 0123456789 %%Page: 1 1 % Printing barcode for "0123456789", scaled 1.00, encoded using "ISBN" % The space/bar succession is represented by the following widths (space first): % 911113123121112322212212141111111113212311114131212131114111 [ % height xpos ypos width height xpos ypos width [75.00 19.50 15.00 0.85] [75.00 21.50 15.00 0.85] [70.00 24.50 20.00 2.85] [70.00 28.00 20.00 1.85] [70.00 32.50 20.00 0.85] [70.00 35.50 20.00 0.85] [70.00 37.50 20.00 0.85] [70.00 41.50 20.00 2.85] [70.00 46.00 20.00 1.85] [70.00 49.50 20.00 0.85] [70.00 53.00 20.00 1.85] [70.00 56.00 20.00 1.85] [70.00 60.00 20.00 3.85] [70.00 63.50 20.00 0.85] [75.00 65.50 15.00 0.85] [75.00 67.50 15.00 0.85] [70.00 69.50 20.00 0.85] [70.00 72.50 20.00 2.85] [70.00 76.50 20.00 0.85] [70.00 80.50 20.00 2.85] [70.00 83.50 20.00 0.85] [70.00 85.50 20.00 0.85] [70.00 90.50 20.00 0.85] [70.00 94.50 20.00 0.85] [70.00 97.50 20.00 0.85] [70.00 100.50 20.00 0.85] [70.00 104.50 20.00 0.85] [70.00 106.50 20.00 0.85] [75.00 111.50 15.00 0.85] [75.00 113.50 15.00 0.85] ] { {} forall setlinewidth moveto 0 exch rlineto stroke} bind forall [ % char xpos ypos fontsize [(9) 10.00 10.00 12.00] [(7) 22.00 10.00 0.00] [(8) 29.00 10.00 0.00] [(0) 36.00 10.00 0.00] [(1) 43.00 10.00 0.00] [(2) 50.00 10.00 0.00] [(3) 57.00 10.00 0.00] [(4) 69.00 10.00 0.00] [(5) 76.00 10.00 0.00] [(6) 83.00 10.00 0.00] [(7) 90.00 10.00 0.00] [(8) 97.00 10.00 0.00] [(6) 104.00 10.00 0.00] ] { {} forall dup 0.00 ne { /Helvetica findfont exch scalefont setfont } {pop} ifelse moveto show} bind forall % End barcode for "0123456789" showpage |
J’obtiens bien du code Postscript. Cette sortie peut être envoyé vers un fichier (ou une imprimante) grâce à une redirection classique (« >« ) ou avec l’option « -o« suivie du nom de fichier.
De même, il est possible de lire la chaîne à encoder depuis un fichier à l’aide de l’option « -i » ou directement depuis un paramètre passé avec l’option « -b« .
Enfin, l’option « -e » permet de définir le format d’encodage. Par défaut, c’est ISBN qui est utilisé. ( cf le man pour les différentes normes).
Les autre options vont permettre d’affiner la mise en page, mais ne sont pas capitales dans ce cas précis.
Ainsi :
$ barcode -b 0123456789 -e 39 -o test.ps
Génère un fichier Postscript « test.ps » contenant le code barre « 0123456789 » encodé en « code39« .
Le fichier est lisible avec Ghostscript, ou tout autre logiciel/matériel comprenant le langage Postscript.
$ gs test.ps
Me voilà avec un beau fichier .ps, alors qu’une image serait bien plus pratique pour l’insertion dans un document… Il va me falloir travailler un peu Ghostscript pour arriver au résultat attendu.
Ghostscript
Ghostscript va me permettre de retailler la page et de transformer le résultat en image, moyennant le passage de quelques arguments :
$ gs -g300x130 -r96x96 -sDEVICE=pbmraw -sOutputFile=test.pbm -sNOPAUSE -q test.ps -c showpage quit
Ok, ça quelques explications :
- -g300x130 : Représente la taille de la page à générer. Pour la définir, j’ai fabriqué un code barre type et mesuré à l’aide de Gimp, dans le fichier .ps, le nombre de pixels en longueur et en largeur occupés par le dessin. Le point d’origine (0,0) étant le coin bas gauche. ( pile-poil l’angle où se situe le dessin… C’est quand même bien fait !). Il doit y avoir moyen de récupérer ses informations dans le fichier postscript, mais comme mes codes barres vont avoir tous la même tête, je n’ai pas jugé utile de creuser dans ce sens,
- -r96x96 : La résolution de sortie… 96×96 dpi, c’est bien et suffisant pour ce type d’impression,
- -sDEVICE=pbmraw : C’est le format de sortie, c’est à dire le driver à utiliser pour générer l’image. Il en existe une belle palette (gs –help), un format d’image sans trop de compression semble être une bonne option pour éviter les surprises à la lecture,
- -sOutPutFile=test.pbm : Là, c’est facile, c’est le nom du fichier en sortie,
- -sNOPAUSE : Par défaut, Ghostscript fait une pause entre chaque page, même s’il n’y en a qu’une (un peu comme moi quand je rédige un rapport). Cette option annule cette pause (un peu comme mon chef …),
- -sBATCH : Permet à GhostScript de sortir, après avoir terminé son travail (mais seulement après préciserait mon chef !),
- -q : (Quiet) – force le travail en silence (oui… bon… J’arrête avec mon chef… ),
- test.ps : Le nom du fichier généré par Barcode et donc utilisé en entrée…
Pour finir, voici un exemple de petit script prenant en paramètre les caractères à encoder et générant un code barre dans un fichier image au format jpeg.
#!/bin/sh if [ $# != 1 ]; then echo Usage : genbarcode.sh string_to_encode exit fi barcode -b $1 -e 39 | gs -g300x130 -r96x96 -sDEVICE=jpeg -sOutputFile=$1.jpg -sNOPAUSE -sBATCH - |