Etudions le mode d'encodage.
- La largeur d'une barre fine est appelée le module.
- Il existe des barres de 1, 2, 3 ou 4 modules; de même pour les espaces.
- Il existe 107 motifs, chacun codé sur 11 modules comprenant 3 barres et 3 espaces (Le motif de STOP possède une 4ème barre).
- Il existe 3 tables donnant le caractère ou la fonction affecté à chaque motif.
- La table A contient les lettres majuscules, les chiffres, les ponctuations, des codes de contrôle et des codes spéciaux.
- La table B contient les lettres majuscules et minuscules, les chiffres, les ponctuations et des codes spéciaux.
- La table C contient des paires de chiffres (Permettant de doubler la densité) et des codes spéciaux.
- Il faut des marges blanches de 10 modules au moins à gauche et à droite.
- Il y a un caractère de START au début du code. Il existe 3 caractères de START déterminant la table utilisée au départ.
- Le code se termine par un caractère de STOP.
- Des caractères spéciaux (99, 100 & 101) permettent de passer d'une table à l'autre; le caractère SHIFT (98) permute le caractère suivant entre les tables A & B.
- Les codes de fonction (FNC1 à FNC4) ne sont pas tous définis.
- Une clé de contrôle doit être ajoutée; sa valeur est calculée en totalisant la valeur du START puis la valeur de chaque motif multipliée par son rang; puis en prenant
le reste de la division de cette somme par 103.
- Dans le tableau suivant le module de barre est symbolisé par "1" et le module d'espace par "0".
- Les colonnes "Code ASCII" et "Caractère" indiquent l'emplacement des motifs dans la police "code128.ttf" (Voir plus loin)
- Le caractère n° 0 (Espace) est obtenue avec le code 32 ou avec le code 212 car certains outils de programmation ne peuvent pas utiliser le code 32.
Valeur
Table A
Table B
Table C
Code ASCII
Caractère
Motif
0
Espace
Espace
00
0032 ou 0212
Espace ou Ô
11011001100
1
!
!
01
0033
!
11001101100
2
"
"
02
0034
"
11001100110
3
#
#
03
0035
#
10010011000
4
$
$
04
0036
$
10010001100
5
%
%
05
0037
%
10001001100
6
&
&
06
0038
&
10011001000
7
'
'
07
0039
'
10011000100
8
(
(
08
0040
(
10001100100
9
)
)
09
0041
)
11001001000
10
*
*
10
0042
*
11001000100
11
+
+
11
0043
+
11000100100
12
,
,
12
0044
,
10110011100
13
-
-
13
0045
-
10011011100
14
.
.
14
0046
.
10011001110
15
/
/
15
0047
/
10111001100
16
0
0
16
0048
0
10011101100
17
1
1
17
0049
1
10011100110
18
2
2
18
0050
2
11001110010
19
3
3
19
0051
3
11001011100
20
4
4
20
0052
4
11001001110
21
5
5
21
0053
5
11011100100
22
6
6
22
0054
6
11001110100
23
7
7
23
0055
7
11101101110
24
8
8
24
0056
8
11101001100
25
9
9
25
0057
9
11100101100
26
:
:
26
0058
:
11100100110
27
;
;
27
0059
;
11101100100
28
<
<
28
0060
<
11100110100
29
=
=
29
0061
=
11100110010
30
>
>
30
0062
>
11011011000
31
?
?
31
0063
?
11011000110
32
@
@
32
0064
@
11000110110
33
A
A
33
0065
A
10100011000
34
B
B
34
0066
B
10001011000
35
C
C
35
0067
C
10001000110
36
D
D
36
0068
D
10110001000
37
E
E
37
0069
E
10001101000
38
F
F
38
0070
F
10001100010
39
G
G
39
0071
G
11010001000
40
H
H
40
0072
H
11000101000
41
I
I
41
0073
I
11000100010
42
J
J
42
0074
J
10110111000
43
K
K
43
0075
K
10110001110
44
L
L
44
0076
L
10001101110
45
M
M
45
0077
M
10111011000
46
N
N
46
0078
N
10111000110
47
O
O
47
0079
O
10001110110
48
P
P
48
0080
P
11101110110
49
Q
Q
49
0081
Q
11010001110
50
R
R
50
0082
R
11000101110
51
S
S
51
0083
S
11011101000
52
T
T
52
0084
T
11011100010
Valeur
Table A
Table B
Table C
Code ASCII
Caractère
Motif
53
U
U
53
0085
U
11011101110
54
V
V
54
0086
V
11101011000
55
W
W
55
0087
W
11101000110
56
X
X
56
0088
X
11100010110
57
Y
Y
57
0089
Y
11101101000
58
Z
Z
58
0090
Z
11101100010
59
[
[
59
0091
[
11100011010
60
\
\
60
0092
\
11101111010
61
]
]
61
0093
]
11001000010
62
^
^
62
0094
^
11110001010
63
_
_
63
0095
_
10100110000
64
nul
`
64
0096
`
10100001100
65
soh
a
65
0097
a
10010110000
66
stx
b
66
0098
b
10010000110
67
etx
c
67
0099
c
10000101100
68
eot
d
68
0100
d
10000100110
69
eno
e
69
0101
e
10110010000
70
ack
f
70
0102
f
10110000100
71
bel
g
71
0103
g
10011010000
72
bs
h
72
0104
h
10011000010
73
ht
i
73
0105
i
10000110100
74
lf
j
74
0106
j
10000110010
75
vt
k
75
0107
k
11000010010
76
ff
l
76
0108
l
11001010000
77
cr
m
77
0109
m
11110111010
78
s0
n
78
0110
n
11000010100
79
s1
o
79
0111
o
10001111010
80
dle
p
80
0112
p
10100111100
81
dc1
q
81
0113
q
10010111100
82
dc2
r
82
0114
r
10010011110
83
dc3
s
83
0115
s
10111100100
84
dc4
t
84
0116
t
10011110100
85
nak
u
85
0117
u
10011110010
86
syn
v
86
0118
v
11110100100
87
etb
w
87
0119
w
11110010100
88
can
x
88
0120
x
11110010010
89
em
y
89
0121
y
11011011110
90
sub
z
90
0122
z
11011110110
91
esc
{
91
0123
{
11110110110
92
fs
|
92
0124
|
10101111000
93
gs
}
93
0125
}
10100011110
94
rs
~
94
0126
~
10001011110
95
us
del
95
0200
È
10111101000
96
Fnc 3
Fnc 3
96
0201
É
10111100010
97
Fnc 2
Fnc2
97
0202
Ê
11110101000
98
Shift
Shift
98
0203
Ë
11110100010
99
Code C
Code C
99
0204
Ì
10111011110
100
Code B
Fnc 4
Code B
0205
Í
10111101110
101
Fnc 4
Code A
Code A
0206
Î
11101011110
102
Fnc 1
Fnc 1
Fnc 1
0207
Ï
11110101110
103
Start A
Start A
Start A
0208
Ð
11010000100
104
Start B
Start B
Start B
0209
Ñ
11010010000
105
Start C
Start C
Start C
0210
Ò
11010011100
106
Stop
Stop
Stop
0211
Ó
1100011101011
Exemple de clé de contrôle en utilisant la table B pour : ZB65
104 + (1 x 58) + (2 x 34) + (3 x 22) + (4 x 21) = 380
380 / 103 = 3, reste 71 qui est la valeur de la clé.
La création des codes barres.
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 méthode graphique où chaque barre est «dessinée» comme un rectangle plein. Cette méthode permet de calculer la largeur de chaque
barre au pixel près et de travailler sur des multiples de la largeur d'un pixel du périphérique utilisé. Cela donne une bonne précision surtout si
le périphérique a une faible densité comme c'est le cas des écrans et des imprimantes à jet d'encre. Cette méthode demandes des routines de programmations
spécifiques et ne permet pas de réaliser des codes barres avec un logiciel courant.
-
La police spécifique dans laquelle chaque caractère est remplacé par le code barre d'un caractère. Cette méthode permet d'utiliser n'importe quel programme comme un traitement
de texte ou un tableur (Par exemple LibreOffice, le clone gratuit de MSoffice !) Les mises à l'échelles en fonction du corps (La taille quoi) choisi peuvent entrainer de
petites distorsions du dessin des barres. Avec une imprimante laser il n'y a aucun problème.
La plupart des polices pour codes barre 128 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 128 et de la proposer en
téléchargement. Je l'ai testé sur une imprimante laser en corps 17, ce qui donne un très petit code barre d'environ 1,7mm de largeur par caractère, résultat :
lecture à 100% ! Sur une bonne imprimante à jet d'encre on peut descendre (Hé oui !) au corps 15 ce qui donne des caractères de 1,5mm de large.
La police " code128.ttf "
Cette police contient les 107 motifs du code. Les codes de START et de STOP intégrent les marges. Le ZIP contient deux versions : hauteur normale et hauteur réduite.
Copiez ce fichier dans le répertoire des polices, le plus souvent : \Windows\Fonts
Structure d'un code 128.
Un code barre 128 sera donc constitué de la manière suivante :
- L'un des trois code de START, le plus souvent START B.
- Autant de caractères que nécessaires, des codes spéciaux permettent de passer d'une table à l'autre. Un algorithme intelligent permettra d'utiliser la ou les tables donnant le code barre le plus court possible.
- Une clé de contrôle.
- Un code STOP.
Un petit programme pour tester tout ça.
Notez l'optimisation de "3754" en "EV" de la table C
Voici un petit programme écrit en Visual Basic 6 ; le
fichier d'installation copiera le programme,
les dépendances Visual Basic, les fichiers sources et la police.
Fichier d'auto-installation :
Fichier ZIP sans installation :

Ce programme de test ne gère pas les codes de contrôle ASCII, il utilise les tables B & C avec optimisation de la longueur du code obtenu.
La fonction Code128$ 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 Office.
Public Function Code128$(chaine$)
'V 2.0.0
'Paramètres : une chaine
'Parameters : a string
'Retour : * une chaine qui, affichée avec la police CODE128.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 CODE128.TTF font
' * an empty string if the supplied parameter is no good
Dim i%, checksum&, mini%, dummy%, tableB As Boolean
Code128$ = ""
If Len(chaine$) > 0 Then
'Vérifier si caractères valides
'Check for valid characters
For i% = 1 To Len(chaine$)
Select Case Asc(Mid$(chaine$, i%, 1))
Case 32 To 126, 203
Case Else
i% = 0
Exit For
End Select
Next
'Calculer la chaine de code en optimisant l'usage des tables B et C
'Calculation of the code string with optimized use of tables B and C
Code128$ = ""
tableB = True
If i% > 0 Then
i% = 1 'i% devient l'index sur la chaine / i% become the string index
Do While i% <= Len(chaine$)
If tableB Then
'Voir si intéressant de passer en table C / See if interesting to switch to table C
'Oui pour 4 chiffres au début ou à la fin, sinon pour 6 chiffres / yes for 4 digits at start or end, else if 6 digits
mini% = IIf(i% = 1 Or i% + 3 = Len(chaine$), 4, 6)
GoSub testnum
If mini% < 0 Then 'Choix table C / Choice of table C
If i% = 1 Then 'Débuter sur table C / Starting with table C
Code128$ = Chr$(210)
Else 'Commuter sur table C / Switch to table C
Code128$ = Code128$ & Chr$(204)
End If
tableB = False
Else
If i% = 1 Then Code128$ = Chr$(209) 'Débuter sur table B / Starting with table B
End If
End If
If Not tableB Then
'On est sur la table C, essayer de traiter 2 chiffres / We are on table C, try to process 2 digits
mini% = 2
GoSub testnum
If mini% < 0 Then 'OK pour 2 chiffres, les traiter / OK for 2 digits, process it
dummy% = Val(Mid$(chaine$, i%, 2))
dummy% = IIf(dummy% < 95, dummy% + 32, dummy% + 105)
Code128$ = Code128$ & Chr$(dummy%)
i% = i% + 2
Else 'On n'a pas 2 chiffres, repasser en table B / We haven't 2 digits, switch to table B
Code128$ = Code128$ & Chr$(205)
tableB = True
End If
End If
If tableB Then
'Traiter 1 caractère en table B / Process 1 digit with table B
Code128$ = Code128$ & Mid$(chaine$, i%, 1)
i% = i% + 1
End If
Loop
'Calcul de la clé de contrôle / Calculation of the checksum
For i% = 1 To Len(Code128$)
dummy% = Asc(Mid$(Code128$, i%, 1))
dummy% = IIf(dummy% < 127, dummy% - 32, dummy% - 105)
If i% = 1 Then checksum& = dummy%
checksum& = (checksum& + (i% - 1) * dummy%) Mod 103
Next
'Calcul du code ASCII de la clé / Calculation of the checksum ASCII code
checksum& = IIf(checksum& < 95, checksum& + 32, checksum& + 105)
'Ajout de la clé et du STOP / Add the checksum and the STOP
Code128$ = Code128$ & Chr$(checksum&) & Chr$(211)
End If
End If
Exit Function
testnum:
'si les mini% caractères à partir de i% sont numériques, alors mini%=0
'if the mini% characters from i% are numeric, then mini%=0
mini% = mini% - 1
If i% + mini% <= Len(chaine$) Then
Do While mini% >= 0
If Asc(Mid$(chaine$, i% + mini%, 1)) < 48 Or Asc(Mid$(chaine$, i% + mini%, 1)) > 57 Then Exit Do
mini% = mini% - 1
Loop
End If
Return
End Function
Fichier Excel de démonstration
Fichier pour Libre Office
Depuis la première parution de cette page, j'ai reçu de nombreuses versions dans différents langages. (attention avant 2008 dans une première version de la police les codes > 94 étaient différents.)
Language
Auteur
WinDev 5.5
Laurent PERICAUD
L4G Progress
André SEJOURNET
Visual Foxpro
Emile MAITREJEAN
Delphi
Jean-Camille POPULUS
Delphi
Francisco FERNANDEZ
PL/SQL pour Oracle
Nicolas FANCHAMPS
PLpgSQL
Nicolas FANCHAMPS
Crystal Report
Sébastien REZÉ
Python
Michel CLAVEAU
Java
Virginie LHUILLIER
Java
Jean-Luc BLOECHLE
ASP
G!L
PHP
F. Odouard & P. Guizard
C #
Joffrey VERDIER
Les codes EAN.UCC 128
Ce sont des codes 128 dont le contenu est normalisé et correspond à une utilisation dans le domaine de la logistique. Un code EAN128 commence par le caractère Fnc1 suivi d'un ou plusieurs champs
de données. Chaque champ commence par un
AI (Identificateur d'application) qui indique ce que contient le champ
(Numéro de colis ou date de péremption par exemples) suivi par les données elles-même. Ces données sont de longueur fixe ou variable, numériques ou alphanumériques,
avec ou sans somme de controle et tout ceci en fonction de chaque AI.
Si un champ est à longueur variable, que la longueur maximale n'est pas utilisé et qu'il n'est pas le dernier champ, alors on le fait suivre par un caractère Fnc1. Certains AI nécessite que
les données soient suivies par une somme de controle; celle-ci est calculée de la manière suivante :
- Les chiffres sont numérotés de droite à gauche, puis on calcule x la somme des chiffres pairs
et y la somme des chiffres impairs
-
Calculons z = x + 3 * y
-
Soit m le nombre divisible par 10 immédiatement supérieur à z
-
La somme de contrôle est : m - z
J'ai réalisé un petit programme permettant de créer facilement des codes EAN128 et prenant en compte ces caractéristiques.
Fichier d'auto-installation
Fichier ZIP sans installation