Générer des codes barres en lignes de commandes sous Linux (barcode)

jopafrJe 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 :

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

code_view

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 :

test

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 -

Laissez votre message après le bip...Biiiiip

Commentaires

Excellent, je vais tester ça au plus vite :)

Super, si t’as un lecteur à vendre, je prends… :-)

Sinon, une bibliothèque plus simple d’utilisation (et plus puissante) existe, Barby: http://toretore.github.com/barby/

Laisser un commentaire

(requis)

(requis)


*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Anti-spam image