<?php 
/*
* barcode.php
*
* Frédéric LOIRETTE - 2002-2005
*
* http://www.loirette.fr/frederic
*/

if (isset($Source))
{
    
show_source("barcode.php");
    exit;
}
class 
codeabarre 

    var 
$strCode
    
/** 
    * Déclaration des propriétés 
    */ 
    
var $arrayGroup = array('A' => array( 
                
=> "0001101"=> "0011001"
                
=> "0010011",    => "0111101"
                
=> "0100011",    => "0110001"
                
=> "0101111",    => "0111011"
                
=> "0110111",    => "0001011" 
                
), 
                
'B' => array( 
                
=> "0100111",    => "0110011"
                
=> "0011011",    => "0100001"
                
=> "0011101",    => "0111001"
                
=> "0000101",    => "0010001"
                
=> "0001001",    => "0010111" 
                
), 
                
'C' => array( 
                
=> "1110010",    => "1100110"
                
=> "1101100",    => "1000010"
                
=> "1011100",    => "1001110"
                
=> "1010000",    => "1000100"
                
=> "1001000",    => "1110100" 
                

                ); 
     
    var 
$arrayFamily = array( 
                    
=> array('A','A','A','A','A','A'), 
                    
=> array('A','A','B','A','B','B'), 
                    
=> array('A','A','B','B','A','B'), 
                    
=> array('A','A','B','B','B','A'), 
                    
=> array('A','B','A','A','B','B'), 
                    
=> array('A','B','B','A','A','B'), 
                    
=> array('A','B','B','B','A','A'), 
                    
=> array('A','B','A','B','A','B'), 
                    
=> array('A','B','A','B','B','A'), 
                    
=> array('A','B','B','A','B','A'
                    ); 
    var 
$keyFamily = array(
                    
=> 1,
                    
=> 3,
                    
=> 1,
                    
=> 3,
                    
=> 1,
                    
=> 3,
                    
=> 1,
                    
=> 3,
                    
=> 1,
                    
=> 3,
                    
10 => 1,
                    
11 => 3
                    
);
     
    
/** 
    * Constructeur 
    * 
    * Initialise la classe 
    * 
    * @EAN13            string        code EAN13 
    * 
    * return            void 
    */ 
    
function codeabarre($EAN13
    { 
        
settype($EAN13,'string'); 
        
//Transformation de la chaine EAN en tableau 
        
for($i=0;$i<13;$i++) 
        { 
            
$this->EAN13[$i] = substr($EAN13,$i,1); 
        } 
         
        
$this->strCode $this->makeCode(); 
    } 
     
     
    
/** 
    * Création du code binaire 
    * 
    * Crée une chaine contenant des 0 ou des 1 pour indiquer les espace blancs ou noir 
    * 
    * return            string        Chaine résultante 
    */ 
    
function makeCode() 
    { 
        
//On récupère la classe de codage de la partie qauche 
        
$arryLeftClass $this->arrayFamily[$this->EAN13[0]]; 
         
        
//Premier séparateur (101) 
        
$strCode '101'
         
        
//Codage partie gauche 
        
for ($i=1$i<7$i++) 
        { 
            
$strCode .= $this->arrayGroup[$arryLeftClass[$i-1]][$this->EAN13[$i]]; 
        } 
         
        
//Séparateur central (01010) 
        
$strCode .= '01010'
         
        
//Codage partie droite (tous de classe C) 
        
for ($i=7$i<13$i++) 
        { 
            
$strCode .= $this->arrayGroup['C'][$this->EAN13[$i]]; 
        } 
         
        
//Dernier séparateur (101) 
        
$strCode .= '101'
         
        return 
$strCode
    } 
     
     
    
/** 
    * Création de l'image 
    * 
    * Crée une image GIF ou PNG du code généré par giveCode 
    * 
    * return            void 
    */ 
    
function makeImage($imageType="png"
    { 
        
//Initialisation de l'image 
        
$img=imagecreate(210110); 
         
        
$color[0] = ImageColorAllocate($img255,255,255); 
        
$color[1] = ImageColorAllocate($img0,0,0); 
         
        
$coords[0] = 10
        
$coords[1] = 10
        
$coords[2] = 2
        
$coords[3] = 80
         
        
imagefilledrectangle($img00190160$color[0]); 
         
        for(
$i=0;$i<strlen($this->strCode);$i++) 
        { 
            
$posX $coords[0]; 
            
$posY $coords[1]; 
            
$intL $coords[2]; 

            if ((
$i<4) || (($i>=strlen($this->strCode)/2-2) && ($i<=strlen($this->strCode)/2+2)) || (($i>=strlen($this->strCode)-3) && ($i<=strlen($this->strCode))))
                
$intH $coords[3]+8
            else
                
$intH $coords[3]; 
             
            
$fill_color substr($this->strCode,$i,1); 
             
            
imagefilledrectangle($img$posX$posY$posX+1, ($posY+$intH), $color[$fill_color]); 
             
            
//Deplacement du pointeur 
            
$coords[0] = $coords[0] + $coords[2]; 
        } 
         
        
imagestring($img5090substr(implode('',$this->EAN13),0,1), $color[1]);
        for(
$i=1;$i<=6;$i++)
            
imagestring($img56+14*$i90substr(implode('',$this->EAN13),$i,1), $color[1]);  
        for(
$i=1;$i<=6;$i++)
            
imagestring($img598+14*$i90substr(implode('',$this->EAN13),$i+6,1), $color[1]);  
        
imagestring($img520390">"$color[1]);
         
        
Header"Content-type: image/".$imageType);  
        
$func_name 'image'.$imageType
        
$func_name($img); 
        
imagedestroy($img);  
    } 

    
/** 
    * Création de la clé de contrôle
    * 
    * 
    * 
    * return            char
    */ 
    
function makeKey() 
    { 
        
$total 0;
        for(
$i=0;$i<13;$i++) 
            
$total += $this->EAN13[$i] * $this->keyFamily[$i]; 
        if (
$total==0)
            return -
1;
        else
            return ((
10-($total 10))%10);
    }


if(IsSet(
$cb)) 
    
$codebarre = new codeabarre($cb); 
else 
    
$codebarre = new codeabarre("0000000000000"); 
if(IsSet(
$op)) 

    
$codebarre->makeImage(); 
    exit;

else
{
    
$key $codebarre->makeKey();
    if (
$codebarre->EAN13[12]=="")
    {
        if (
$key<>-1)
        {
            
$codebarre->EAN13[12]=$key;
            
$cb .= $key;
        }
    }
    echo 
"<HTML>";
    echo 
"<HEAD><TITLE>G&eacute;n&eacute;ration de code &agrave; barre</TITLE></HEAD>";
    echo 
"<BODY>";
    echo 
"<CENTER><IMG SRC='barcode.php?op=1&cb=$cb'></CENTER>\n";
    echo 
"<hr><!--Saut de page sur les impressions Explorer 4+ -->\n";
    echo 
"<DIV style='page-break-before:always'></DIV>\n";
    echo 
"<form name='CodeBar' method='POST' ACTION='barcode.php'>\n";
    echo 
"Code Barre : <INPUT TYPE='text' SIZE='13' MAXLENGTH='13' NAME='cb' VALUE='$cb'>\n";
    echo 
"<INPUT TYPE='submit' VALUE='Afficher'><BR>\n";
    echo 
"Norme EAN 13 chiffres<br>\n";
    if (
strlen(implode('',$codebarre->EAN13))<>13)
        echo 
"<FONT COLOR='red'>Nombre de chiffres incorrect !</FONT>\n";
    elseif (
$codebarre->EAN13[12]==$key)
        echo 
"<FONT COLOR='green'>Cl&eacute; valide</FONT>\n";
    elseif (
$key<>-1)
        echo 
"<FONT COLOR='red'>Cl&eacute; invalide ! Ce code devrait se terminer par un ".$key.".</FONT>\n";
    echo 
"</form>\n";
}

?> 
La structure du code EAN 13 :<BR>
<IMG SRC='ean13.gif'><BR>
Les codes qui commencent par :
<TABLE width="70%" border=1>
  <TBODY> 
  <TR> 
    <TH width="25%">Code pays</TH>
    <TH width="50%">Pays</TH>
    <TH width="25%">Code ISO du pays</TH>
  </TR>
  <TR> 
    <TD align=middle>00 à 13</TD>
    <TD>USA &amp; Canada</TD>
    <TD align=middle>us &amp; ca</TD>
  </TR>
  <TR> 
    <TD align=middle>20 à 29</TD>
    <TD>Usage privé uniquement</TD>
    <TD align=middle>&nbsp;</TD>
  </TR>
  <TR> 
    <TD align=middle><b>30 à 37</b></TD>
    <TD><b>France</b></TD>
    <TD align=middle><b>fr</b></TD>
  </TR>
  <TR> 
    <TD align=middle>380</TD>
    <TD>Bulgarie</TD>
    <TD align=middle>bg</TD>
  </TR>
  <TR> 
    <TD align=middle>383</TD>
    <TD>Slovénie</TD>
    <TD align=middle>si</TD>
  </TR>
  <TR> 
    <TD align=middle>385</TD>
    <TD>Croatie</TD>
    <TD align=middle>hr</TD>
  </TR>
  <TR> 
    <TD align=middle>387</TD>
    <TD>Bosnie Herzegovine</TD>
    <TD align=middle>ba</TD>
  </TR>
  <TR> 
    <TD align=middle>400 à 440</TD>
    <TD>Allemagne</TD>
    <TD align=middle>de</TD>
  </TR>
  <TR> 
    <TD align=middle>45 &amp; 49</TD>
    <TD>Japon</TD>
    <TD align=middle>jp</TD>
  </TR>
  <TR> 
    <TD align=middle>460 à 469</TD>
    <TD>Fédération de Russie</TD>
    <TD align=middle>ru</TD>
  </TR>
  <TR> 
    <TD align=middle>471</TD>
    <TD>Taiwan</TD>
    <TD align=middle>tw</TD>
  </TR>
  <TR> 
    <TD align=middle>474</TD>
    <TD>Estonie</TD>
    <TD align=middle>ee</TD>
  </TR>
  <TR> 
    <TD align=middle>475</TD>
    <TD>Lettonie</TD>
    <TD align=middle>lv</TD>
  </TR>
  <TR> 
    <TD align=middle>476</TD>
    <TD>Azerbaijan</TD>
    <TD align=middle>az</TD>
  </TR>
  <TR> 
    <TD align=middle>477</TD>
    <TD>Lithuanie</TD>
    <TD align=middle>lt</TD>
  </TR>
  <TR> 
    <TD align=middle>478</TD>
    <TD>Ouzbekistan</TD>
    <TD align=middle>uz</TD>
  </TR>
  <TR> 
    <TD align=middle>479</TD>
    <TD>Sri Lanka</TD>
    <TD align=middle>lk</TD>
  </TR>
  <TR> 
    <TD align=middle>480</TD>
    <TD>Philippines</TD>
    <TD align=middle>ph</TD>
  </TR>
  <TR> 
    <TD align=middle>481</TD>
    <TD>Belarus</TD>
    <TD align=middle>by</TD>
  </TR>
  <TR> 
    <TD align=middle>482</TD>
    <TD>Ukraine</TD>
    <TD align=middle>ua</TD>
  </TR>
  <TR> 
    <TD align=middle>484</TD>
    <TD>Moldavie</TD>
    <TD align=middle>md</TD>
  </TR>
  <TR> 
    <TD align=middle>485</TD>
    <TD>Arménie</TD>
    <TD align=middle>am</TD>
  </TR>
  <TR> 
    <TD align=middle>486</TD>
    <TD>Georgie</TD>
    <TD align=middle>ge</TD>
  </TR>
  <TR> 
    <TD align=middle>487</TD>
    <TD>Kazakhstan</TD>
    <TD align=middle>kz</TD>
  </TR>
  <TR> 
    <TD align=middle>489</TD>
    <TD>Honk-Kong</TD>
    <TD align=middle>hk</TD>
  </TR>
  <TR> 
    <TD align=middle>50</TD>
    <TD>Royaume-Uni</TD>
    <TD align=middle>uk</TD>
  </TR>
  <TR> 
    <TD align=middle>520</TD>
    <TD>Grèce</TD>
    <TD align=middle>gr</TD>
  </TR>
  <TR> 
    <TD align=middle>528</TD>
    <TD>Liban</TD>
    <TD align=middle>lb</TD>
  </TR>
  <TR> 
    <TD align=middle>529</TD>
    <TD>Chipre</TD>
    <TD align=middle>cy</TD>
  </TR>
  <TR> 
    <TD align=middle>531</TD>
    <TD>Macédoine</TD>
    <TD align=middle>mk</TD>
  </TR>
  <TR> 
    <TD align=middle>535</TD>
    <TD>Malte</TD>
    <TD align=middle>mt</TD>
  </TR>
  <TR> 
    <TD align=middle>539</TD>
    <TD>Irlande</TD>
    <TD align=middle>ie</TD>
  </TR>
  <TR> 
    <TD align=middle>54</TD>
    <TD>Belgique &amp; Luxembourg</TD>
    <TD align=middle>be &amp; lu</TD>
  </TR>
  <TR> 
    <TD align=middle>560</TD>
    <TD>Portugal</TD>
    <TD align=middle>pt</TD>
  </TR>
  <TR> 
    <TD align=middle>569</TD>
    <TD>Islande</TD>
    <TD align=middle>is</TD>
  </TR>
  <TR> 
    <TD align=middle>57</TD>
    <TD>Danemark</TD>
    <TD align=middle>dk</TD>
  </TR>
  <TR> 
    <TD align=middle>590</TD>
    <TD>Pologne</TD>
    <TD align=middle>pl</TD>
  </TR>
  <TR> 
    <TD align=middle>594</TD>
    <TD>Roumanie</TD>
    <TD align=middle>ro</TD>
  </TR>
  <TR> 
    <TD align=middle>599</TD>
    <TD>Hongrie</TD>
    <TD align=middle>ie</TD>
  </TR>
  <TR> 
    <TD align=middle>609</TD>
    <TD>Ile Maurice</TD>
    <TD align=middle>mu</TD>
  </TR>
  <TR> 
    <TD align=middle>611</TD>
    <TD>Maroc</TD>
    <TD align=middle>ma</TD>
  </TR>
  <TR> 
    <TD align=middle>613</TD>
    <TD>Algérie</TD>
    <TD align=middle>ie</TD>
  </TR>
  <TR> 
    <TD align=middle>619</TD>
    <TD>Kenya</TD>
    <TD align=middle>ke</TD>
  </TR>
  <TR> 
    <TD align=middle>619</TD>
    <TD>Tunisie</TD>
    <TD align=middle>tn</TD>
  </TR>
  <TR> 
    <TD align=middle>621</TD>
    <TD>Syrie</TD>
    <TD align=middle>sy</TD>
  </TR>
  <TR> 
    <TD align=middle>622</TD>
    <TD>Égypte</TD>
    <TD align=middle>eg</TD>
  </TR>
  <TR> 
    <TD align=middle>624</TD>
    <TD>Lybie</TD>
    <TD align=middle>ly</TD>
  </TR>
  <TR> 
    <TD align=middle>625</TD>
    <TD>Jordanie</TD>
    <TD align=middle>jo</TD>
  </TR>
  <TR> 
    <TD align=middle>626</TD>
    <TD>Iran</TD>
    <TD align=middle>ir</TD>
  </TR>
  <TR> 
    <TD align=middle>627</TD>
    <TD>Koweit</TD>
    <TD align=middle>kw</TD>
  </TR>
  <TR> 
    <TD align=middle>628</TD>
    <TD>Arabie Saoudite</TD>
    <TD align=middle>sa</TD>
  </TR>
  <TR> 
    <TD align=middle>629</TD>
    <TD>Émirats Arabes Unis</TD>
    <TD align=middle>ae</TD>
  </TR>
  <TR> 
    <TD align=middle>64</TD>
    <TD>Finland</TD>
    <TD align=middle>fi</TD>
  </TR>
  <TR> 
    <TD align=middle>690 à 693</TD>
    <TD>Chine</TD>
    <TD align=middle>cn</TD>
  </TR>
  <TR> 
    <TD align=middle>70</TD>
    <TD>Norvège</TD>
    <TD align=middle>no</TD>
  </TR>
  <TR> 
    <TD align=middle>729</TD>
    <TD>Israël</TD>
    <TD align=middle>il</TD>
  </TR>
  <TR> 
    <TD align=middle>73</TD>
    <TD>Suède</TD>
    <TD align=middle>se</TD>
  </TR>
  <TR> 
    <TD align=middle>740</TD>
    <TD>Guatemala</TD>
    <TD align=middle>gt</TD>
  </TR>
  <TR> 
    <TD align=middle>741</TD>
    <TD>Salvador</TD>
    <TD align=middle>sv</TD>
  </TR>
  <TR> 
    <TD align=middle>742</TD>
    <TD>Honduras</TD>
    <TD align=middle>hn</TD>
  </TR>
  <TR> 
    <TD align=middle>743</TD>
    <TD>Nicaragua</TD>
    <TD align=middle>ni</TD>
  </TR>
  <TR> 
    <TD align=middle>744</TD>
    <TD>Costa Rica</TD>
    <TD align=middle>cr</TD>
  </TR>
  <TR> 
    <TD align=middle>745</TD>
    <TD>Panama</TD>
    <TD align=middle>pa</TD>
  </TR>
  <TR> 
    <TD align=middle>746</TD>
    <TD>République Dominicaine</TD>
    <TD align=middle>do</TD>
  </TR>
  <TR> 
    <TD align=middle>750</TD>
    <TD>Mexique</TD>
    <TD align=middle>mx</TD>
  </TR>
  <TR> 
    <TD align=middle>759</TD>
    <TD>Venezuela</TD>
    <TD align=middle>ve</TD>
  </TR>
  <TR> 
    <TD align=middle>76</TD>
    <TD>Suisse</TD>
    <TD align=middle>ch</TD>
  </TR>
  <TR> 
    <TD align=middle>770</TD>
    <TD>Colombie</TD>
    <TD align=middle>co</TD>
  </TR>
  <TR> 
    <TD align=middle>773</TD>
    <TD>Uruguay</TD>
    <TD align=middle>uy</TD>
  </TR>
  <TR> 
    <TD align=middle>775</TD>
    <TD>Pérou</TD>
    <TD align=middle>pe</TD>
  </TR>
  <TR> 
    <TD align=middle>777</TD>
    <TD>Bolivie</TD>
    <TD align=middle>bo</TD>
  </TR>
  <TR> 
    <TD align=middle>779</TD>
    <TD>Argentine</TD>
    <TD align=middle>ar</TD>
  </TR>
  <TR> 
    <TD align=middle>780</TD>
    <TD>Chili</TD>
    <TD align=middle>cl</TD>
  </TR>
  <TR> 
    <TD align=middle>784</TD>
    <TD>Paraguay</TD>
    <TD align=middle>py</TD>
  </TR>
  <TR> 
    <TD align=middle>786</TD>
    <TD>Équateur</TD>
    <TD align=middle>ec</TD>
  </TR>
  <TR> 
    <TD align=middle>789</TD>
    <TD>Brésil</TD>
    <TD align=middle>br</TD>
  </TR>
  <TR> 
    <TD align=middle>80 à 83</TD>
    <TD>Italy</TD>
    <TD align=middle>it</TD>
  </TR>
  <TR> 
    <TD align=middle>84</TD>
    <TD>Espagne</TD>
    <TD align=middle>es</TD>
  </TR>
  <TR> 
    <TD align=middle>850</TD>
    <TD>Cuba</TD>
    <TD align=middle>cu</TD>
  </TR>
  <TR> 
    <TD align=middle>858</TD>
    <TD>Slovaquie</TD>
    <TD align=middle>sk</TD>
  </TR>
  <TR> 
    <TD align=middle>859</TD>
    <TD>République Tchèque</TD>
    <TD align=middle>cz</TD>
  </TR>
  <TR> 
    <TD align=middle>860</TD>
    <TD>Yougoslavie</TD>
    <TD align=middle>yu</TD>
  </TR>
  <TR> 
    <TD align=middle>867</TD>
    <TD>Corée du Nord</TD>
    <TD align=middle>kp</TD>
  </TR>
  <TR> 
    <TD align=middle>869</TD>
    <TD>Turquie</TD>
    <TD align=middle>tr</TD>
  </TR>
  <TR> 
    <TD align=middle>87</TD>
    <TD>Pays-Bas</TD>
    <TD align=middle>nl</TD>
  </TR>
  <TR> 
    <TD align=middle>880</TD>
    <TD>Korée du Sud</TD>
    <TD align=middle>kr</TD>
  </TR>
  <TR> 
    <TD align=middle>885</TD>
    <TD>Thailande</TD>
    <TD align=middle>th</TD>
  </TR>
  <TR> 
    <TD align=middle>888</TD>
    <TD>Singapour</TD>
    <TD align=middle>sg</TD>
  </TR>
  <TR> 
    <TD align=middle>890</TD>
    <TD>Inde</TD>
    <TD align=middle>in</TD>
  </TR>
  <TR> 
    <TD align=middle>893</TD>
    <TD>Vietnam</TD>
    <TD align=middle>vn</TD>
  </TR>
  <TR> 
    <TD align=middle>899</TD>
    <TD>Indonésie</TD>
    <TD align=middle>id</TD>
  </TR>
  <TR> 
    <TD align=middle>90 et 91</TD>
    <TD>Autriche</TD>
    <TD align=middle>at</TD>
  </TR>
  <TR> 
    <TD align=middle>93</TD>
    <TD>Australie</TD>
    <TD align=middle>au</TD>
  </TR>
  <TR> 
    <TD align=middle>94</TD>
    <TD>Nouvelle-Zélande</TD>
    <TD align=middle>nz</TD>
  </TR>
  <TR> 
    <TD align=middle>955</TD>
    <TD>Malaysie</TD>
    <TD align=middle>my</TD>
  </TR>
  <TR> 
    <TD align=middle>958</TD>
    <TD>Macao</TD>
    <TD align=middle>mo</TD>
  </TR>
  <TR> 
    <TD align=middle>977</TD>
    <TD>Périodiques (ISSN)</TD>
    <TD align=middle>&nbsp;</TD>
  </TR>
  <TR> 
    <TD align=middle>978 &amp; 979</TD>
    <TD>Livres (ISBN)</TD>
    <TD align=middle>&nbsp;</TD>
  </TR>
  <TR> 
    <TD align=middle>980</TD>
    <TD>Reçus de remboursement</TD>
    <TD align=middle>&nbsp;</TD>
  </TR>
  <TR> 
    <TD align=middle>981 et 982</TD>
    <TD>Coupons</TD>
    <TD align=middle>&nbsp;</TD>
  </TR>
  <TR> 
    <TD align=middle>99</TD>
    <TD>Coupons</TD>
    <TD align=middle>&nbsp;</TD>
  </TR>
  </TBODY> 
</TABLE>
</BODY>
</HTML>