
|
Ce code fait partie de la famille des codes à 2 dimensions, c'est en fait un code de plusieurs lignes qui peut encoder jusqu'à 2700 octets d'où son nom de "Portable Document File". L'encodage se fait en deux étapes : tout d'abord les données sont converties en "mots-clé" (Encodage de haut niveau) puis ceux-ci sont convertis en motifs de barres et d'espaces. (Encodage de bas niveau) De plus un système de correction des erreurs à plusieurs niveaux est inclus, il permet de reconstituer des données mal imprimées, effacées, floues ou arrachées. Dans la suite de cet exposé, l'expression "mot-clé" sera abrégée en MC.
|
D é b u t
|
G1 |
D15 |
D14 |
Dr1 |
F i n
|
|
G2 |
D13 |
D12 |
Dr2 |
||
|
G3 |
D11 |
D10 |
Dr3 |
||
|
G4 |
D9 |
D8 |
Dr4 |
||
|
G5 |
D7 |
D6 |
Dr5 |
||
|
G6 |
D5 |
D4 |
Dr6 |
||
|
G7 |
D3 |
D2 |
Dr7 |
||
|
G8 |
D1 |
D0 |
Dr8 |
||
|
G9 |
C3 |
C2 |
Dr9 |
||
|
G10 |
C1 |
C0 |
Dr10 |
D15 = descripteur de longueur (16 dans cet exemple)
D0
= bourrage
D1 à D14 = données
G1 à G10 = MC de coté gauche
Dr1
à Dr10 = MC de coté droit
C0 à C3 = correction d'erreur, niveau 1

|
Première table |
Deuxième table |
Troisième table |
|
|
111 0 1 0 1 0 111 000000 |
11111 0 1 0 1 0 11 00000 |
11 0 1 0 1 0 11111 00000 |
|
|
1111 0 1 0 1 0 1111 0000 |
111111 0 1 0 1 0 111 000 |
111 0 1 0 1 0 111111 000 |
|
|
11111 0 1 0 1 0 11111 00 |
1111 0 1 0 1 00 1 000000 |
1 0 1 0 1 00 1111 000000 |
|
|
111 0 1 0 1 00 111 00000 |
11111 0 1 0 1 00 11 0000 |
11 0 1 0 1 00 11111 0000 |
|
|
..... |
..... |
..... |
|
Type de compression |
Données à coder |
Taux de compression |
|
"Octet" |
ASCII 0 à 255 | 1,2 octet par MC |
|
"Texte" |
ASCII 9, 10, 13 & 32 à 127 | 2 caractères par MC |
|
"Numérique" |
Chiffres seuls 0 à 9 | 2,9 chiffres par MC |
|
MC numéro : |
Fonction |
|
900 |
Passer en mode "Texte" |
|
901 |
Passer en mode "Octet" |
|
902 |
Passer en mode "Numérique" |
|
903 à 912 |
Réservé |
|
913 |
Passer en mode "Octet" pour le prochain MC |
|
914 à 920 |
Réservé |
|
921 |
Initialisation |
|
922 |
Terminaison de bloc pour les macro PDF |
|
923 |
Séquence d'identification de champ dans un macro PDF |
|
924 |
Passer en mode "Octet" (Si nombre d'octet multiple de 6) |
|
925 |
Identifiant personnalisé ECI |
|
926 |
Identifiant général ECI |
|
927 |
Identifiant ECI pour jeu de caractères ou page de code |
|
928 |
Début de bloc pour les macro PDF |
Le sous-mode par défaut est "Majuscules", dans ce sous-mode deux caractères sont codés dans chaque MC, voici la table des caractères :
|
Valeur |
Majuscules |
Minuscules |
Mixte |
Ponctuation |
|
0 |
A |
a |
0 |
; |
|
1 |
B |
b |
1 |
< |
|
2 |
C |
c |
2 |
> |
|
3 |
D |
d |
3 |
@ |
|
4 |
E |
e |
4 |
[ |
|
5 |
F |
f |
5 |
\ |
|
6 |
G |
g |
6 |
] |
|
7 |
H |
h |
7 |
_ |
|
8 |
I |
I |
8 |
` (Quote) |
|
9 |
J |
j |
9 |
~ |
|
10 |
K |
k |
& |
! |
|
11 |
L |
l |
CR |
CR |
|
12 |
M |
m |
HT |
HT |
|
13 |
N |
n |
, |
, |
|
14 |
O |
o |
: |
: |
|
15 |
P |
p |
# |
LF |
|
16 |
Q |
q |
- |
- |
|
17 |
R |
r |
. |
. |
|
18 |
S |
s |
$ |
$ |
|
19 |
T |
t |
/ |
/ |
|
20 |
U |
u |
+ |
“ |
|
21 |
V |
v |
% |
| |
|
22 |
W |
w |
* |
* |
|
23 |
X |
x |
= |
( |
|
24 |
Y |
y |
^ |
) |
|
25 |
Z |
z |
PON |
? |
|
26 |
SP |
SP |
SP |
{ |
|
27 |
MIN |
T_MAJ |
MIN |
} |
|
28 |
MIX |
MIX |
MAJ |
' (Apostrophe) |
|
29 |
T_PON |
T_PON |
T_PON |
MAJ |
|
Exemple, séquence à encoder : Super ! S : 18, MIN : 27, u : 20, p : 15, e : 4, r : 17, ESPACE
: 26, T_PON : 29, ! : 10 |
|
Exemple 1 : séquence à encoder : alcool La suite d'octets (En ASCII) est donc : 97, 108, 99,
111, 111, 108 Exemple 2 : séquence à encoder : alcoolique La suite d'octets (En ASCII) est donc : 97, 108, 99,
111, 111, 108, 105, 113, 117, 101 |
|
Exemple, séquence à encoder : 01234 Il y aura donc 5 \ 3 + 1 = 2 MC |
|
N° de table utilisée pour encoder |
X pour le MC de |
X pour le MC de |
|
1 |
(Nombre de lignes -1) \ 3 |
Nombre de colonnes de données - 1 |
|
2 |
(Niveau de sécurité x 3) |
(Nombre de lignes -1) \ 3 |
|
3 |
Nombre de colonnes de données - 1 |
(Niveau de sécurité x 3) |
|
Niveau |
Nombre de MC requis par la correction |
Nombre maximum de MC de données |
|
0 |
2 |
925 |
|
1 |
4 |
923 |
|
2 |
8 |
919 |
|
3 |
16 |
911 |
|
4 |
32 |
895 |
|
5 |
64 |
863 |
|
6 |
128 |
799 |
|
7 |
256 |
671 |
|
8 |
512 |
415 |
|
Nombre de MC de données |
Niveau recommandé |
|
1 à 40 |
2 |
|
41 à 160 |
3 |
|
161 à 320 |
4 |
|
321 à 863 |
5 |
For i = 0 To m - 1
t = (d(i) + c(k - 1)) Mod 929
For j = k - 1 To 0 Step -1
If j = 0 Then
c(j) = (929 - (t * a(j)) Mod 929) Mod 929
Else
c(j) = (c(j - 1) + 929 - (t * a(j)) Mod 929) Mod 929
End If
Next
Next
For j = 0 To k - 1
If c(j) <> 0 Then c(j) = 929 - c(j)
Next
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 :
Il semble qu'il n'y ait pas de police gratuite pour codes barre PDF417
sur le net. J'ai donc décidé de dessiner entièrement cette police et de la proposer en téléchargement. Le
fait qu'il y ait 929 MC avec pour chacun 3 variantes va nous obliger à diviser
les 17 bits d'un MC en plusieurs parties. Mais diviser 17 ... hein ... il va
falloir ruser. Si l'on considère que le premier bit est toujours "1"
et le dernier "0", on peut imaginer un séparateur de forme "01"
et il ne reste plus que 15 bits dans chaque MC; on peut alors diviser ces 15
bits en 3 quintets,. Il existera alors 25 = 32 quintets possibles
affectés à 32 caractères de la police. Le programme d'encodage sera chargé de
transformer les 3 quintets de chaque MC en une chaine de 3 caractères.
La
police va donc contenir les caractères suivants :
La chaine de caractère à envoyer à l'imprimante ressemblera donc à quelque chose comme : +*gfA*jhD*BAl*gCt*hjk*- et ceci pour chaque ligne.
Cette police contient les 35 motifs décrits ci-dessus. Les codes de début de ligne et de fin de ligne intégrent des marges de 2 modules. La hauteur est égale à 3 modules ce qui correspond au cas le plus courant.
|
Copiez ce fichier |
Le programme devra se dérouler en 4 étapes :
Du fait de l'interaction entre les différents modes de compression et
les différents sous-modes du mode "texte" il est difficile de faire
une optimisation à 100%. Le programme va donc décomposer la chaine en "blocs"
de type "numérique", "texte" ou "octet" puis il
repassera certains blocs dans un autre mode si la surcharge dûe aux MC de commutation
est supérieure au gain de compression. On ne pourra pas tenir compte de tous
les paramètres tels les rembourrages, les gains sur les multiples de 6 octets,
les commutateurs mono-caractère ou les commutations entres sous-modes du
mode "texte" : il faudrait pour cela plusieurs milliers de lignes
de programme.
Une autre difficulté vient de la grandeur des nombres manipulés,
par exemple l'opération "Modulo 900" appliquée à un nombre de 44 chiffres
engendre inévitablement un dépassement de capacité; le programme devra effectuer
ce type de calcul par étapes.
|
|
Voici un petit programme écrit |
La fonction PDF417$ fait environ 500 lignes, je ne la reproduis
donc pas ici, il suffit de la récuperer dans le fichier "form1.frm"
qui se trouve avec le programme ci-dessus ;
avec le programme d'auto-installation le fichier "form1.frm" se trouve dans
le répertoire du programme, sous-répertoire "sources".
La fonction s'appelle de la manière suivante
: resultat$ = pdf417$(Chaine$, Sécu%, NbCol%, CodeErr%)
avec Chaine$
qui doit contenir la chaine à coder, Sécu% pour le niveau de correction (-1
= auto.), NbCol%
pour le nombre de colonnes de données par ligne (<1 = auto.) et CodeErr% pour récupérer un
éventuel numéro d'erreur. Ces trois derniers paramètres sont optionnels et sont
passés par références; au retour ils contiennent les valeurs réellement utilisées. Valeurs
de CodeErr% au retour de la fonction :
Il suffit maintenant d'afficher ou d'imprimer la chaine resultat$ avec la police
pdf417 par exemple dans un traitement de texte. Les utilisateurs de Word pourront
même intégrer la fonction pdf417$ dans une macro afin d'automatiser le traitement.
Pour arriver à effectuer tous les traitements dans une unique fonction, j'ai
dû utiliser des "Gosub" au lieu de fonctions avec paramètres; j'entends
déjà les esthètes de la programmation hurler au sacrilège.
|
Vous aimez cette page ? Cliquez ici ! |