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.
Exemple :
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.
Depuis début 2005 tous les magasins des Etats-Unis doivent accepter le code
EAN13, il n'y a donc plus de raison de produire des codes UPC-A.
Signification des chiffres.
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
Certains code EAN13 sont suivi d'un «supplément» de 2 ou 5 chiffres, notamment sur les livres et magazines.
Ce supplément est codé à l'aide des tables A & B. Le choix, pour chaque chiffre du supplément, de la table A ou B dépend d'une somme de contrôle qu'il faut calculer.
Calcul de la somme de contrôle :
Soit x, la valeur du supplément
Soit m le nombre divisible par 4 immédiatement inférieur à x
La somme de contrôle est : x - m
Exemple :
x = 35 --> m = 32
Somme contrôle = 35 - 32 = 3
Calcul de la somme de contrôle :
Soit x, la somme des chiffres pairs et y la somme des chiffres impairs
Calculons z = 9 * x + 3 * y
Soit m le nombre divisible par 10 immédiatement inférieur à z
La somme de contrôle est : z - m
Exemple :
Supplément = 12345
x = 2 + 4 = 6 et y = 1 + 3 + 5 = 9 donc z = 9 * 6 + 3 * 9 = 81
Somme de contrôle = 81 - 80 = 1
De plus un supplément débute par un délimiteur spécial de 4 modules dont la formule est : 1011 et chaque caractère, sauf le dernier, est suivi d'un séparateur de formule 01.
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 :
La plupart des polices pour codes barre EAN trouvées sur le net (Polices de démonstration incomplètes) sont payantes (Parfois très chères) et de 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 EAN13 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 barre d'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)
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 :
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 :
Visual Foxpro
Emile MAITREJEAN
Delphi
John SWIJSEN
Delphi
YARDIMLI EKIM E YARDIMLI
Delphi
Francisco FERNANDEZ
C#
Russell SAYERS
Perl
Simone FIORAVANTI
Axapta
Søe JESPER
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.
Nous utiliserons donc aussi la police EAN13 avec cette fonction :
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