Génération d'un code barre (Code 39)
avec PHP et GD
Date de publication : 11/11/2007
Par
Thierry Godin (Voir les autres articles)
Ce code source permet de générer une image de code barre (Code 39) par programmation en utilisant le langage PHP et la librairie GD.
Introduction
II. A propos du code 39 ou Code 3 de 9
III. Le caractère de contrôle
IV. Pré-requis
V. Code source
VI. Appel du script
VII. Remerciements
VIII. Téléchargement
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-gd-img-barcode-code39.php |
<?php
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;
}
$thumb = imagecreatetruecolor(500, 25);
$fond = imagecolorallocate($thumb, 255, 0, 255);
imagefill($thumb, 0, 0, $fond);
$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'
);
$CodeBar = '';
$TabKeys = array_keys($TabCode);
$TotalChar = 0;
for($i = 0; $i < strlen($TheString); $i++)
{
$CodeBar .= "0" . $TabCode[$TheString[$i]] . "<br>";
foreach($TabKeys as $key => $value) {
if($value === $TheString[$i]){ $TotalChar += $key;}
}
}
$IndexControl = bcmod($TotalChar, 43);
if($AddControl)
{
$CodeBar.= "0" . $TabCode[$TabKeys[$IndexControl]];
}
$xCodeBar = $TabCode["*"] . $CodeBar . "0" . $TabCode["*"];
$c_w = imagecolorallocate($thumb, 255, 255, 255);
$c_b = imagecolorallocate($thumb, 0, 0, 0);
$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++;
}
$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";
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 à
RideKick pour la relecture de cet article.
VIII. Téléchargement


Les sources présentées sur cette page sont libres de droits,
et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©
2007 Thierry Godin. Aucune reproduction,
même partielle, ne peut être faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc sans l'autorisation expresse de l'auteur.
Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E
de dommages et intérêts.
Cette page est déposée à la
SACD.