Introduction▲
Pour les besoins d'une application de gestion d'une fédération sportive, je devais générer des images de code barre qui seront destinées à être imprimées sur les cartes des adhérents. On peut bien évidemment appliquer ce code à d'autres destinations de gestion d'articles.
Il existe des librairies qui permettent de générer le code barre très facilement. Généralement ces librairies permettent de générer plusieurs types d'images (graphiques, codes, camemberts et autres) mais, dans mon cas, je n'aurai utilisé qu'une toute petite partie d'une de ces librairies alors qu'on peut générer le code barre avec seulement quelques lignes de code.
Il existe aussi des polices spéciales pour les codes barre, mais les polices gratuites sont peu probantes. Les polices commerciales sont très efficaces mais onéreuses.
Bien que le code source soit commenté, cet article vous permettra de mieux comprendre comment est fabriqué un code barre Code 39. Vous pourrez donc le modifier à volonté pour les besoins de votre application.
II. A propos du code 39 ou Code 3 de 9▲
Sans entrer dans le détail de la symbiologie du Code 39, nous allons voir ici ses principales caractéristiques :
Le Code 39 nous permet d'utiliser les 43 caractères suivants :
- Les chiffres 0 à 9
- Les lettres en majuscule de A à Z
- Les caractères suivants : le tiret (-), le point (.), l'espace ( ), l'astérisque (*), le dollar ($), le slash (/), le signe plus (+) et le signe pourcentage (%).
Le Code 39 est structuré comme ci-dessous :
- Le caractère astérisque (*) qui marque le début du code
- Le texte codé
- Un caractère de contrôle facultatif
- Le caractère astérisque (*) qui marque la fin du code barre
Chaque caractère du Code 39 est composé de 9 barres blanches ou noires dont trois sont plus larges. C'est d'ici qu'il tient l'autre nom de Code 3 de 9
Chaque caractère du Code 39 est écrit avec des "zéro" et des "un".
C'est ainsi que par exemple, la lettre "A" s'écrira comme ceci "111010100010111"
Le chiffre "1" correspondra à une barre verticale noire (n)
Le chiffre "0" à une barre verticale blanche (b)
Ce qui donnera pour le caractère "A" :
Lorsque trois barres de la même couleur se suivent, cela compte pour une seule barre large.
On voit donc ici que nous avons bien 3 barres larges et 6 barres fines = 9 barres au total.
Chaque caractère qui formera le texte à coder sera ensuite séparé par une barre blanche fine (un 0).
Le code est ensuite délimité par le caractère astérisque *. Ce caractère ne sera pas décodé par le lecteur optique. Vous prendrez soin de ne pas utiliser l'astérisque dans le texte à coder.
Nous allons donc remplacer les barres par des lignes de couleurs (noir/blanc) en utilisant la librairie graphique PHP GD.
III. Le caractère de contrôle▲
Un caractère de contrôle peut être ajouté au texte à coder. Il permettra de vérifier l'intégrité du texte original.
Ce caractère de contrôle est facultatif et rarement utilisé.
Calcul du caractère de contrôle
Les caractères sont stockés dans un tableau (array()). Nous allons donc calculer la somme de tous les indexes des caractères du texte à coder, puis nous diviserons ce total par 43 (le nombre de caractères dans le tableau) . Le chiffre résultant de cette opération sera l'index du caractère de contrôle qu'il faudra donc ajouter au texte à coder.
IV. Pré-requis▲
PHP 4 >= 4.0.6, PHP 5
GD2 et supérieur
Extension BCmath
V. Code source▲
<?php
// ############## GENERER UN CODE BARRE CODE 39 AVEC PHP/GD ################# //
// Date de création : 11/11/2007 //
// Auteur : Thierry Godin //
// http://thierry-godin.developpez.com/ //
// //
// Remerciements à Guillaume Rossolini pour les corrections et les conseils //
// http://g-rossolini.developpez.com/ //
// ########################################################################## //
//Vérification des paramètres passés par l'URL =================================
if
(isset($_GET
[
'string'
]
))
{
$TheString
=
preg_replace('¤[^0-9A-Z. $/+%*-]¤'
,
''
,
strtoupper($_GET
[
'string'
]
));
}
else
{
$TheString
=
'ERREUR'
;
}
if
(isset($_GET
[
'control'
]
) and
$_GET
[
'control'
]
==
"1"
)
{
$AddControl
=
TRUE
;
}
else
{
$AddControl
=
FALSE
;
}
//------------------------------------------------------------------------------
//création de l'image temporaire ===============================================
$thumb
=
imagecreatetruecolor(500
,
25
);
$fond
=
imagecolorallocate($thumb
,
255
,
0
,
255
);
// fond
imagefill($thumb
,
0
,
0
,
$fond
);
//------------------------------------------------------------------------------
// tableau Char -> Code ========================================================
$TabCode
=
array
(
'0'
=>
'101000111011101'
,
'1'
=>
'111010001010111'
,
'2'
=>
'101110001010111'
,
'3'
=>
'111011100010101'
,
'4'
=>
'101000111010111'
,
'5'
=>
'111010001110101'
,
'6'
=>
'101110001110101'
,
'7'
=>
'101000101110111'
,
'8'
=>
'111010001011101'
,
'9'
=>
'101110001011101'
,
'A'
=>
'111010100010111'
,
'B'
=>
'101110100010111'
,
'C'
=>
'111011101000101'
,
'D'
=>
'101011100010111'
,
'E'
=>
'111010111000101'
,
'F'
=>
'101110111000101'
,
'G'
=>
'101010001110111'
,
'H'
=>
'111010100011101'
,
'I'
=>
'101110100011101'
,
'J'
=>
'101011100011101'
,
'K'
=>
'111010101000111'
,
'L'
=>
'101110101000111'
,
'M'
=>
'111011101010001'
,
'N'
=>
'101011101000111'
,
'O'
=>
'111010111010001'
,
'P'
=>
'101110111010001'
,
'Q'
=>
'101010111000111'
,
'R'
=>
'111010101110001'
,
'S'
=>
'101110101110001'
,
'T'
=>
'101011101110001'
,
'U'
=>
'111000101010111'
,
'V'
=>
'100011101010111'
,
'W'
=>
'111000111010101'
,
'X'
=>
'100010111010111'
,
'Y'
=>
'111000101110101'
,
'Z'
=>
'100011101110101'
,
'-'
=>
'100010101110111'
,
'.'
=>
'111000101011101'
,
' '
=>
'100011101011101'
,
'$'
=>
'100010001000101'
,
'/'
=>
'100010001010001'
,
'+'
=>
'100010100010001'
,
'%'
=>
'101000100010001'
,
'*'
=>
'100010111011101'
);
//------------------------------------------------------------------------------
// convertir la chaine en code =================================================
$CodeBar
=
''
;
// tableau des caractères seuls
$TabKeys
=
array_keys($TabCode
);
$TotalChar
=
0
;
for
($i
=
0
;
$i
<
strlen($TheString
);
$i
++
)
{
$CodeBar
.=
"0"
.
$TabCode
[
$TheString
[
$i
]]
.
"<br>"
;
//récupération de l'index du caractère + calcul de la somme des indexes
foreach
($TabKeys
as
$key
=>
$value
) {
if
($value
===
$TheString
[
$i
]
){
$TotalChar
+=
$key
;}
}
}
//------------------------------------------------------------------------------
//calculer le caractère de controle ============================================
$IndexControl
=
bcmod($TotalChar
,
43
);
//------------------------------------------------------------------------------
//ajouter le caratère de controle ==============================================
if
($AddControl
)
{
$CodeBar
.=
"0"
.
$TabCode
[
$TabKeys
[
$IndexControl
]];
}
//------------------------------------------------------------------------------
//on rajoute * en début et en fin de code ======================================
$xCodeBar
=
$TabCode
[
"*"
]
.
$CodeBar
.
"0"
.
$TabCode
[
"*"
];
//------------------------------------------------------------------------------
// dessiner le code barre ======================================================
$c_w
=
imagecolorallocate($thumb
,
255
,
255
,
255
);
// blanc
$c_b
=
imagecolorallocate($thumb
,
0
,
0
,
0
);
// noir
$x_ref
=
0
;
for
($x
=
0
;
$x
<
strlen($xCodeBar
);
$x
++
)
{
if
($xCodeBar
[
$x
]
==
"1"
)
{
imageline($thumb
,
$x_ref
,
0
,
$x_ref
,
25
,
$c_b
);
}
else
{
imageline($thumb
,
$x_ref
,
0
,
$x_ref
,
25
,
$c_w
);
}
$x_ref
++;
}
//------------------------------------------------------------------------------
// Création de l'image définitive ==============================================
$IMG
=
imagecreatetruecolor($x_ref
,
25
);
imagefill($IMG
,
0
,
0
,
$fond
);
imagecopymerge ($IMG
,
$thumb
,
0
,
0
,
0
,
0
,
500
,
25
,
100
);
//------------------------------------------------------------------------------
header("Content-type: image/png"
);
imagepng($IMG
);
?>
VI. Appel du script▲
Le script sera appelé depuis une balise image. Nous passerons en paramètres le texte à coder ainsi qu'une valeur pour le caractère de contrôle 0 ou 1
<?php
$string_a_coder
=
"ThierryGodin"
;
//mettre control=0 pour ne pas utiliser le caractère de controle
echo "<img src='php-gd-img-barcode-code39.php?string="
.
htmlentities($string_a_coder
,
ENT_QUOTES,
"ISO8859-1"
) .
"&control=1'/>"
;
?>
Ce qui donnera ceci :
VII. Remerciements▲
Remerciements à Guillaume RossoliniLa page de Guillaume Rossolini pour les conseils et corrections.
Remerciements à RideKickRideKick pour la relecture de cet article.