|
Ce code utilisé sur tous les articles de consommation courante permet le codage de 12 chiffres, le treizième chiffre étant une clé de contrôle qu'il faudra générer. Avant d'entrer dans la technique, deux petites digressions.
Le code barre type UPC-A utilisé aux états unis Il ne comporte que 11 chiffres plus la clé. C'est en réalité un code EAN13 dont le premier chiffre serait zéro et dont la présentation serait légérement différente. Le code UPC-A est un sous-ensemble du code EAN13.
Ces
deux codes barre sont identiques, on a rajouté un zéro devant le code UPC-A
pour obtenir le code EAN13 mais le motif des barres est strictement identique. |
Signification des chiffres. - 2 chiffres pour le code pays ou code système
|
Les chiffres sont numérotés de droite à gauche; Exemple : 978020113447 |
Symbolisons le module de barre par "1" et le module d'espace par "0"
Les chiffres sont convertis selon l'une des 3 tables ci dessous; les codes des tables A et B commencent par un espace alors que ceux de la table C commencent par une barre.
chiffre |
Table A |
Table B |
Table C |
0 |
0001101 |
0100111 |
1110010 |
1 |
0011001 |
0110011 |
1100110 |
2 |
0010011 |
0011011 |
1101100 |
3 |
0111101 |
0100001 |
1000010 |
4 |
0100011 |
0011101 |
1011100 |
5 |
0110001 |
0111001 |
1001110 |
6 |
0101111 |
0000101 |
1010000 |
7 |
0111011 |
0010001 |
1000100 |
8 |
0110111 |
0001001 |
1001000 |
9 |
0001011 |
0010111 |
1110100 |
Le premier chiffre n'est pas codé, chacun des 6 chiffres suivants est
converti
soit par la table A soit par la table B, et cela en fonction du premier chiffre.
Les 6 derniers chiffres sont convertis par la table C.
Une nouvelle table
indique l'utilisation des tables A ou B en fonction du chiffre N°1
Selon chiffre 1 |
chiffre 2 |
chiffre 3 |
chiffre 4 |
chiffre 5 |
chiffre 6 |
chiffre 7 |
0 |
A |
A |
A |
A |
A |
A |
1 |
A |
A |
B |
A |
B |
B |
2 |
A |
A |
B |
B |
A |
B |
3 |
A |
A |
B |
B |
B |
A |
4 |
A |
B |
A |
A |
B |
B |
5 |
A |
B |
B |
A |
A |
B |
6 |
A |
B |
B |
B |
A |
A |
7 |
A |
B |
A |
B |
A |
B |
8 |
A |
B |
A |
B |
B |
A |
9 |
A |
B |
B |
A |
B |
A |
|
Maintenant que nous savons créer le motif d'un code barre, il nous reste à le dessiner à l'écran et à l'imprimer sur papier. Deux approches sont possibles :
Toutes les polices pour codes barre EAN trouvées sur le net (Polices de démonstration incomplètes) sont payantes (Parfoistrès chères) etde qualité douteuse; la largeur des modules n'étant pas toujours constante dans la définition de la police. J'ai donc décidé de dessiner entièrement une police EAN 13 et de la proposer en téléchargement. Je l'ai testé sur une imprimante laser en corps 14, ce qui donne un très petit code barred'environ 13 mm de largeur,résultat : lecture à 100% ! Sur une bonne imprimante à jet d'encre, ce même corps de 14 fonctionne parfaitement.
Cette police contient 5 jeux des 10 chiffres pour les trois tables A, B et C étudiées plus haut ainsi que 2 jeux pour l'inscription du premier chiffre (Table D & E)
Le tableau suivant indique la correspondance entre le code barre dessiné et la lettre tapée (Code ASCII entre parenthèse)
|
Copiez ce fichier |
Le délimiteur de début seul (Code 58) et la table E ont étés
ajoutés pour les utilisateurs des logiciels SAGE qui devront alors
configurer dans leur logiciel le tableau de codage de la police EAN13 comme suit :
|
Un code barre EAN13 sera donc constitué de la manière suivante :
|
Voici un petit programme écrit |
La fonction EAN13$ peut -être réutilisée dans n'importe quel autre programme écrit en Visual Basic 6 ; elle peut également être recopiée telle quelle dans une macro VBA rattachée à un document Excel ou Word.
Public Function ean13$(chaine$) 'Cette fonction est régie par la Licence Générale Publique Amoindrie GNU (GNU LGPL) 'This function is governed by the GNU Lesser General Public License (GNU LGPL) 'V 1.1.1 'Paramètres : une chaine de 12 chiffres 'Parameters : a 12 digits length string 'Retour : * une chaine qui, affichée avec la police EAN13.TTF, donne le code barre ' * une chaine vide si paramètre fourni incorrect 'Return : * a string which give the bar code when it is dispayed with EAN13.TTF font ' * an empty string if the supplied parameter is no good Dim i%, checksum%, first%, CodeBarre$, tableA As Boolean ean13$ = "" 'Vérifier qu'il y a 12 caractères 'Check for 12 characters If Len(chaine$) = 12 Then 'Et que ce sont bien des chiffres 'And they are really digits For i% = 1 To 12 If Asc(Mid$(chaine$, i%, 1)) < 48 Or Asc(Mid$(chaine$, i%, 1)) > 57 Then i% = 0 Exit For End If Next If i% = 13 Then 'Calcul de la clé de contrôle 'Calculation of the checksum For i% = 12 To 1 Step -2 checksum% = checksum% + Val(Mid$(chaine$, i%, 1)) Next checksum% = checksum% * 3 For i% = 11 To 1 Step -2 checksum% = checksum% + Val(Mid$(chaine$, i%, 1)) Next chaine$ = chaine$ & (10 - checksum% Mod 10) Mod 10 'Le premier chiffre est pris tel quel, le deuxième vient de la table A 'The first digit is taken just as it is, the second one come from table A CodeBarre$ = Left$(chaine$, 1) & Chr$(65 + Val(Mid$(chaine$, 2, 1))) first% = Val(Left$(chaine$, 1)) For i% = 3 To 7 tableA = False Select Case i% Case 3 Select Case first% Case 0 To 3 tableA = True End Select Case 4 Select Case first% Case 0, 4, 7, 8 tableA = True End Select Case 5 Select Case first% Case 0, 1, 4, 5, 9 tableA = True End Select Case 6 Select Case first% Case 0, 2, 5, 6, 7 tableA = True End Select Case 7 Select Case first% Case 0, 3, 6, 8, 9 tableA = True End Select End Select If tableA Then CodeBarre$ = CodeBarre$ & Chr$(65 + Val(Mid$(chaine$, i%, 1))) Else CodeBarre$ = CodeBarre$ & Chr$(75 + Val(Mid$(chaine$, i%, 1))) End If Next CodeBarre$ = CodeBarre$ & "*" 'Ajout séparateur central / Add middle separator For i% = 8 To 13 CodeBarre$ = CodeBarre$ & Chr$(97 + Val(Mid$(chaine$, i%, 1))) Next CodeBarre$ = CodeBarre$ & "+" 'Ajout de la marque de fin / Add end mark ean13$ = CodeBarre$ End If End If End Function |
Depuis la première parution de cette page, j'ai reçu de nombreuses versions dans différents langages, les voici :
Language |
Auteur |
|
Jean-Louis HUVE |
||
Visual Foxpro |
Emile MAITREJEAN |
|
Delphi |
John SWIJSEN |
|
C# |
Russell SAYERS |
|
Perl |
Simone FIORAVANTI |
|
Axapta |
Søe JESPER |
Le code EAN 8 Il ressemble beaucoup au code EAN 13. Il comporte 7 chiffres
et une somme de contrôle calculée exactement de la même manière
que pour le code EAN13. Les délimiteurs gauche (On utilisera l'ASCII
58), central et droit sont les mêmes. Les 4 premiers chiffres sont
construits avec la table A et les 4 derniers avec la table C. Public Function EAN8$(chaine$) 'V 1.0.0 'Paramètres : une chaine de 7 chiffres 'Parameters : a 7 digits length string 'Retour : * une chaine qui, affichée avec la police EAN13.TTF, donne le code barre ' * une chaine vide si paramètre fourni incorrect 'Return : * a string which give the bar code when it is dispayed with EAN13.TTF font ' * an empty string if the supplied parameter is no good Dim i%, checksum%, first%, CodeBarre$, tableA As Boolean EAN8$ = "" 'Vérifier qu'il y a 7 caractères 'Check for 7 characters If Len(chaine$) = 7 Then 'Et que ce sont bien des chiffres 'And they are really digits For i% = 1 To 7 If Asc(Mid$(chaine$, i%, 1)) < 48 Or Asc(Mid$(chaine$, i%, 1)) > 57 Then i% = 0 Exit For End If Next If i% = 8 Then 'Calcul de la clé de contrôle 'Calculation of the checksum For i% = 7 To 1 Step -2 checksum% = checksum% + Val(Mid$(chaine$, i%, 1)) Next checksum% = checksum% * 3 For i% = 6 To 1 Step -2 checksum% = checksum% + Val(Mid$(chaine$, i%, 1)) Next chaine$ = chaine$ & (10 - checksum% Mod 10) Mod 10 'Les 4 premier chiffre viennent de la table A 'The first 4 digits come from table A CodeBarre$ = ":" 'Ajout marque de début / Add start mark For i% = 1 To 4 CodeBarre$ = CodeBarre$ & Chr$(65 + Val(Mid$(chaine$, i%, 1))) Next CodeBarre$ = CodeBarre$ & "*" 'Ajout séparateur central / Add middle separator For i% = 5 To 8 CodeBarre$ = CodeBarre$ & Chr$(97 + Val(Mid$(chaine$, i%, 1))) Next CodeBarre$ = CodeBarre$ & "+" 'Ajout de la marque de fin / Add end mark EAN8$ = CodeBarre$ End If End If End Function |
Vous aimez cette page ? Cliquez ici ! |