Génération d'un code barre (Code 39)avec PHP et GD

Thierry Godin

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.

- Titre : Génération d'un code barre (Code 39)avec PHP et GD

- Auteur : Thierry Godin

- Parution : 11 novembre 2007

- Licence : 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 œuvre intellectuelle protégée par les droits d'auteur. 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'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- 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
// ############## 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('&#164;[^0-9A-Z. $/+%*-]&#164;', '', 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") . "&amp;control=1'/>";
?>

Ce qui donnera ceci :

VII - Remerciements

Remerciements à Guillaume Rossolini pour les conseils et corrections.

Remerciements à RideKick pour la relecture de cet article.

VIII - Téléchargement

Téléchargez le script : php-gd-img-barcode-code39.zip