Générateur de code barre code 39

Soyez le premier à donner votre avis sur cette source.

Snippet vu 25 126 fois - Téléchargée 28 fois

Contenu du snippet

J'ai déjà trouvé des sources qui reprennent despolices True Type (TTF) afin de les mettres en images: ce n'est pas paramétrable et les essais que j'ai fait sont souvent infructueux
En fait ce petit script permet de générer un code barre code 39 sous une forme graphique en dessinant chacune des barres, de ce fait sont paramétrables: la largeur et hauteur du code barre et aussi l'affichage du texte en clair en dessous du code barre
en espérant avoir été utile à ceux qui en ont besoin, pour ma part, j'ai développé ce code pour que les internautes puissent imprimer une feuille A4 qu'ils doivent faire tamponer par un partenaire et me la retourner par fax (participation gratuite à un jeux concours): ça me permet d'automatiser la réception des fax en mettant un scanner de code barre au dessus de la sortie du fax !!!!!!!!! Rapide, pas cher et entièrement automatisé (traitement par lot en recevant les fax sur une email)

obligatoire: la librairie GD !

Source / Exemple :


<?php
// code barre Code 39
// Le 27/05/2005

//Chacun des 43 caractères du mode simple se compose d'un motif fixe constitué de 5 barres noires et de 4 barres blanches (espace).
//Les barres peuvent être fines ou larges (Les larges font 2,2 à 3 fois la largeur des fines)
//Il y a toujours 3 barres larges parmi les 9 barres.
//Une barre blanche fine ajoutée à la fin permet l'espacement avec le caractère suivant.
//Un caractère spécial (Affecté au symbole *) sert de délimiteur de début et de fin.
//Une clé de contrôle peut être ajoutée; elle est calculée en totalisant les valeurs de chaque caractère tirées du tableau suivant, puis en prenant le reste de la division de cette somme par 43.
//Dans le tableau suivant les barres noires étroites sont symbolisées par "1", les larges par "111", les barres blanches étroites par "0" et les larges par "000".

//Exemple de clé de contrôle pour : ZB65732
//35 + 11 + 6 +5 +7 +3 +2 = 69
//69 / 43 = 1, reste 26 qui correspond à la lettre Q
//Nouveau code avec la clé : ZB65732Q

// Merci à http://grandzebu.net/informatique/codbar/code39.htm pour l'explication ci-dessus

//il suffit d'appeler le script: codebarre.php?texte=0123456789&h=80&L=2

if(isset($_GET['texte'])) {
  $text = $_GET['texte'];
  function str_split( $str ) {
    $arr = array();
    for ($j = 0; $j < strlen($str); $j++) {
      $arr[] = substr($str,$j,1);
    }
    return $arr;
  }
  //echo $text;
  //putenv('GDFONTPATH=' . realpath($_GET['prof'].'../images/'));
  //putenv('GDFONTPATH='/home/.sites/143/site40/web/images/');
  putenv('GDFONTPATH=' . realpath('.'));
  //echo realpath('.');
  if(!isset($_GET['h'])) {$barcode_hauteur = 80; } else {$barcode_hauteur = $_GET['h'];}
  $tab['0']=' 101000111011101';	$tab2[0]='0';	$tab3['0']=0;	$tab['F']='101110111000101';	$tab2[15]='F';	$tab3['F']=15;	$tab['U']='111000101010111';	$tab2[30]='U';	$tab3['U']=30;
  $tab['1']=' 111010001010111';	$tab2[1]='1';	$tab3['1']=1;	$tab['G']=' 101010001110111';	$tab2[16]='G';	$tab3['G']=16;	$tab['V']='100011101010111';	$tab2[31]='V';	$tab3['V']=31;
  $tab['2']=' 101110001010111';	$tab2[2]='2';	$tab3['2']=2;	$tab['H']=' 111010100011101';	$tab2[17]='H';	$tab3['H']=17;	$tab['W']='111000111010101';	$tab2[32]='W';	$tab3['W']=32;
  $tab['3']=' 111011100010101';	$tab2[3]='3';	$tab3['3']=3;	$tab['I']=' 101110100011101';	$tab2[18]='I';	$tab3['I']=18;	$tab['X']='100010111010111';	$tab2[33]='X';	$tab3['X']=33;
  $tab['4']=' 101000111010111';	$tab2[4]='4';	$tab3['4']=4;	$tab['J']=' 101011100011101';	$tab2[19]='J';	$tab3['J']=19;	$tab['Y']='111000101110101';	$tab2[34]='Y';	$tab3['Y']=34;
  $tab['5']=' 111010001110101';	$tab2[5]='5';	$tab3['5']=5;	$tab['K']=' 111010101000111';	$tab2[20]='K';	$tab3['K']=20;	$tab['Z']='100011101110101';	$tab2[35]='Z';	$tab3['Z']=35;
  $tab['6']=' 101110001110101';	$tab2[6]='6';	$tab3['6']=6;	$tab['L']=' 101110101000111';	$tab2[21]='L';	$tab3['L']=21;	$tab['-']='100010101110111';	$tab2[36]='-';	$tab3['-']=36;
  $tab['7']='101000101110111';	$tab2[7]='7';	$tab3['7']=7;	$tab['M']=' 111011101010001';	$tab2[22]='M';	$tab3['M']=22;	$tab['.']='111000101011101';	$tab2[37]='.';	$tab3['.']=37;
  $tab['8']=' 111010001011101';	$tab2[8]='8';	$tab3['8']=8;	$tab['N']=' 101011101000111';	$tab2[23]='N';	$tab3['N']=23;	$tab[' ']='100011101011101';	$tab2[38]=' ';	$tab3[' ']=38;
  $tab['9']=' 101110001011101';	$tab2[9]='9';	$tab3['9']=9;	$tab['O']=' 111010111010001';	$tab2[24]='O';	$tab3['O']=24;	$tab['$']='100010001000101';	$tab2[39]='$';	$tab3['$']=39;
  $tab['A']=' 111010100010111';	$tab2[10]='A';	$tab3['A']=10;	$tab['P']=' 101110111010001';	$tab2[25]='P';	$tab3['P']=25;	$tab['/']='100010001010001';	$tab2[40]='/';	$tab3['/']=40;
  $tab['B']='101110100010111';	$tab2[11]='B';	$tab3['B']=11;	$tab['Q']='101010111000111';	$tab2[26]='Q';	$tab3['Q']=26;	$tab['+']='100010100010001';	$tab2[41]='+';	$tab3['+']=41;
  $tab['C']='111011101000101';	$tab2[12]='C';	$tab3['C']=12;	$tab['R']='111010101110001';	$tab2[27]='R';	$tab3['R']=27;	$tab['%']='101000100010001';	$tab2[42]='%';	$tab3['%']=42;
  $tab['D']='101011100010111';	$tab2[13]='D';	$tab3['D']=13;	$tab['S']='101110101110001';	$tab2[28]='S';	$tab3['S']=28;
  $tab['E']='111010111000101';	$tab2[14]='E';	$tab3['E']=14;	$tab['T']='101011101110001';	$tab2[29]='T';	$tab3['T']=29;	$tab['*']='100010111011101';

  $j=0;
  $barcode= $tab['*'].'0';
  foreach ( str_split( $text ) as $caractere ) {
    $barcode.= $tab[$caractere].'0';
    $j+=$tab3[$caractere];
  }
  // calcul du code de contôle
  $taille_police=5;
  $j=fmod($j, 43);
  $barcode.=$tab[$tab2[$j]].'0';
  $barcode.=$tab['*'].'0';
  $text='*'.$text.$tab2[$j].'*';
  //barre détermine le nombre de pixel d'une barre
  //le coef est la différence de largeur entre les barres fines et les épaisse, il doit être entre 2,2 et 3
  //mais vu qu'on travail avec de barres de 1 pixels les couples possibles sont
  // dimension 0  1  2  3  4  5  6  7  8 
  $tab=array(
"barre"=>array(1, 2, 3, 4, 5, 6, 8, 9, 10),
"coef"=> array(3, 3, 3, 3, 3, 3, 3, 3, 3));
  //dimension permet de sélectionner une taille (largeur) dans le tableau ci-dessus
  if(!isset($_GET['L'])) {$dimension = 2; } else {$dimension = $_GET['L'];}
  $barre=$tab["barre"][$dimension];
  $coef=$tab["coef"][$dimension];
  //le nombre total de barre : 3 barres larges pour 6 fines plus 1 barre fine d'espacement
  $nbre=(3*$coef+6+1)*$barre;
  //le nombre de barre d'1 pixel (avec le code de contôle et le "*" à chaque extrémité)
  $barcode_longueur=strlen($barcode)*$barre;
  //creation de l'image
  $im = imagecreate($barcode_longueur,$barcode_hauteur);
  $white = imagecolorallocate($im, 255,255,255);
  $black = imagecolorallocate($im, 0,0,0);
  $font_hauteur = imagefontheight( $taille_police );
  $font_largeur = imagefontwidth( $taille_police );
  //détermination de la hauteur des barre
  $barcode_hauteur=$barcode_hauteur-$font_hauteur;
  //on construit chaque barre
  $xpos=0;
  foreach ( str_split($barcode) as $caractere ) {
    for($a=0;  $a<$barre; $a++) {
      if ( $caractere == 0 ) {
        imageline( $im, $xpos, 0, $xpos, $barcode_hauteur, $white );
      } else {
        imageline( $im, $xpos, 0, $xpos, $barcode_hauteur, $black );
      }
      $xpos++;
    }
  }
  //on ajoute le texte lisible en dessous
  imagestring( $im, $taille_police,($barcode_longueur-$font_largeur*strlen($text))/2,$barcode_hauteur,$text,$black);
  //on finalise l'image
  header("Content-type: image/png");
  imagepng($im);
  imagedestroy($im);
}
?>

Conclusion :


Si vous avez des améliorations ou des commentaire et même des critiques, tout est bienvenue

A voir également

Ajouter un commentaire

Commentaires

cs_Anthomicro
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8 -
Salut,

bah très bonne source et très intéressante. Je te mets 9/10.

Tu peux enlever les quotes dans les tableaux à indices numériques :

$tab['1'] devient $tab[1]

c'est légèrement plus rapide.

a +
cs_troudbal
Messages postés
14
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
28 mai 2005
-
Salut, chez moi j'ai une erreur fatale à l'exécution:

Fatal error: Cannot redeclare str_split() in c:\Root\Web\untitled-1.php on line 22

Ca serait bien de mettre le code dans un zip, ca évite de virer tous les n° de ligne aprés le copier-coller.
malalam
Messages postés
10844
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
Hello,

tu m'etonnes : cela veut dire que tu as php5, et que ce code n'a pas ete prevu pour php5.
La fonction str-split() existe deja en php5. Donne lui juste un autre nom dans ce code.
cs_GRenard
Messages postés
1663
Date d'inscription
lundi 16 septembre 2002
Statut
Membre
Dernière intervention
30 juillet 2008
1 -
Il ne faut pas effectuer le changement qu'a dit anthomicro... les chiffres sont entre ' car c'est des caractères et c'est correct. Par contre, pourquoi avoir 3 tableaux de la sorte ? Je ne pense pas que cela soit utile...
$tab3 c'est un index tout bête et $tab2 c'est un array_flip de $tab... donc tu peux virer tout ca...
En passant, tu les as testé tes codes avec un lecteur ?

Générateur de codes barres :
http://www.phpcs.com/code.aspx?ID=23927
cs_Anthomicro
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8 -
"Il ne faut pas effectuer le changement qu'a dit anthomicro... les chiffres sont entre ' car c'est des caractères et c'est correct"

Je dis pas que c'est incorrect, je dis que de mettre des quotes est débile vu qu'elles seront analysées par PHP comme étant des chaînes ce qui est plus lent...

Vérifie tes sources...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.