MacroBar Code128 dokumentacja użytkowa

Transkrypt

MacroBar Code128 dokumentacja użytkowa
Drukowanie kodów paskowych — kroje pism
Opis implementacji Kodu 128: MacroBar Code128
Andrzej Odyniec, MacroSoft S.A., 2003-04-03
Wprowadzenie............................................................................................................................ 2
Kod 128 — opis standardu......................................................................................................... 2
Tabele znaków........................................................................................................................ 3
Znak kontrolny ....................................................................................................................... 5
Przykład.............................................................................................................................. 5
Wymiary................................................................................................................................. 5
Implementacja ............................................................................................................................ 5
Krój pisma .............................................................................................................................. 6
Wygenerowanie...................................................................................................................... 6
Licencjonowanie .................................................................................................................... 8
Wykorzystanie kroju .............................................................................................................. 8
Wybór odmiany i stopnia ................................................................................................... 8
Znak wyciszenia................................................................................................................. 9
Znak kontrolny ................................................................................................................... 9
Uwagi implementacyjne..................................................................................................... 9
Testowanie ............................................................................................................................... 10
Specyfikacja testów podstawowych..................................................................................... 10
Specyfikacja testów odmian................................................................................................. 12
Wynik testów........................................................................................................................ 12
Podsumowanie ......................................................................................................................... 13
Inne kody paskowe............................................................................................................... 13
Bibliografia............................................................................................................................... 13
Wprowadzenie
Od lat już kilkunastu w Polsce w ślad za innymi krajami stosuje się do różnego rodzaju
oznakowań kody paskowe. I dotyczy to nie tylko kodów towarowych, ale coraz częściej różnych innych oznakowań w celach organizacyjnych czy ewidencyjnych.
Różnych kodów paskowych jest kilkaset. Spośród nich kilkadziesiąt doczekało się jednolitych opracowań standaryzacyjnych. Należą do nich między innymi:
— Kody towarowe EAN/UPC
— Kody 2 z 5: przeplatane ITF, IATA, macierzowy
— Kodabar: 18, 2, ABC
— Kod 39 z rozszerzeniami
— Kod 128 z rozszerzeniami
— Kod 93
— Kody piętrowe: 49, 16K, PDF417
Najczęściej można spotkać w życiu codziennym kody towarowe EAN/UPC, gdyż nimi są
znakowane wszystkie wyroby sprzedawane w sklepach a odpowiednia sieć komitetów standaryzacyjnych dba o to, aby numery przydzielane towarom były unikalne. Kodów tych nie drukuje się raczej z aplikacji bazodanowych. Umieszczane są na opakowaniach produktów i to
w sposób nierzadko skomponowany z całością projektu opakowania.
Kiedy jednak chodzi o znakowanie kodami paskowymi przedmiotów czy dokumentów
ewidencjonowanych jednocześnie w bazie danych, kody towarowe są mało przydatne, między
innymi z powodu swojej niewielkiej pojemności — zazwyczaj tylko cyfry i to nie więcej, niż
13. Jeżeli rozmiar porcji danych umieszczanych na kodzie paskowym liczony jest w dziesiątkach znaków, najczęściej używanymi kodami są Kod 39 i Kod 128.
Każdy z nich ma swoje zalety i wady, ale Kod 128 (ang. Code 128) jest chyba najpopularniejszy, między innymi ze względu na jego uniwersalny charakter. Najistotniejsze cechy
Kodu 128, to:
— Możliwość zakodowania wszystkich 128 znaków kodu ASCII,
— Możliwość składania długiej treści w kilku symbolach,
— Ciągłość i modularność — możliwość składania z gotowych „czcionek”,
— Samosprawdzalność (wykrywanie i poprawianie niewielkich błędów drukarskich),
— Duża gęstość kodowania,
— Możliwość dodatkowego zwiększenia gęstości przy danych cyfrowych,
— Rozszerzony standard EAN-128 formalizujący budowę symbolu dla prezentacji dodatkowych informacji o produktach, artykułach i opakowaniach.
Wychodząc naprzeciw zapotrzebowaniu na własne metody składania i druku kodów paskowych, podjęliśmy wykonanie zestawu krojów TrueType (TTF) umożliwiających składanie
i drukowanie kodów paskowych. I zaczynamy właśnie od Kodu 128.
Kod 128 — opis standardu
Kod 128 (ang. Code 128) zawdzięcza swoją nazwę temu, iż można w nim reprezentować
wszystkie 128 znaków podstawowego kodu ASCII. W porównaniu z innymi kodami, ma dużą
gęstość upakowania informacji — dla symboli dłuższych, niż 5 znaków w zapisie będzie
krótszy, niż jakikolwiek inny kod liniowy. Dodatkowo: Kod 128 jest kodem ciągłym, tzn. że
między poszczególnymi znakami nie trzeba (i nie można) umieszczać żadnych odstępów.
2
Tabele znaków
Każdy znak w tym kodzie składa się z jedenastu czarnych lub białych modułów. Jedynie znak
stopu (kończący symbol) składa się z trzynastu
modułów. Na te jedenaście modułów składają się
naprzemiennie trzy paski czarne i trzy białe. I jedne
i drugie mogą osiągać szerokość od jednego do
czterech modułów. Znak stopu ma dodatkowo na
końcu jeszcze jeden, dwumodułowy pasek czarny.
Symbol składa się ze strefy wyciszenia (dziesięciomodułowej), znaku startu, danych, znaku
kontrolnego, znaku stopu i ponownej strefy wyciszenia.
W kodzie mamy 106 różnych kombinacji
trzech pasków i trzech odstępów. Każda z tych
kombinacji może być interpretowana na trzy różne
sposoby w zależności od rejestru (tutaj zwanego
Code). Właściwy rejestr otwiera odpowiedni znak
startu, stąd mamy trzy różne znaki startu.
Znaki o wartościach od 0 do 63 odpowiadają
zarówno w rejestrze A jak i w rejestrze B znakom
ASCII o kodach od 32 do 95 (druga i trzecia
ćwiartka kodu ASCII). Tak więc kody znaków na
wartości można przeliczać odpowiednio odejmując
lub dodając 32. Znakami tymi są: odstęp, !, ", #, $,
%, &, ', (, ), *, +, przecinek, -, kropka, /, 0, 1, 2, 3,
4, 5, 6, 7, 8, 9, :, ;, <, =, >, ?, @, A, B, C, D, E, F,
G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W,
X, Y, Z, [, \, ], ^ i _. Aby kodować znaki z tego
zakresu należy rozpocząć kod znakiem startu
otwierającym raczej rejestr B. Rejestr A wybieramy jedynie wtedy, gdy będą nas interesować znaki
sterujące kodu ASCII a nie małe litery alfabetu.
Należy pamiętać, że późniejsze przełączenie rejestrów kosztuje zawsze jeden znak a więc wydłuża
kod.
Przez cały kod bez mała rozciąga się rejestr C,
który kolejne znaki interpretuje jako dwie cyfry od
00 do 99. Daje to możliwość dodatkowego upakowania informacji, o ile będą spełnione pewne
warunki:
— Kolejnych cyfr będzie co najmniej cztery i będą występować na początku albo na końcu
symbolu (wtedy dla czterech cyfr kodowanie
w rejestrze B zajęłoby przestrzeń czterech znaków a w rejestrze C dwa znaki plus przełączenie na/z rejestru B jeden znak — razem znaki
trzy)
Wartość
Cz B Cz B Cz B
znaku
000
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
2
2
2
1
1
1
1
1
1
2
2
2
1
1
1
1
1
1
2
2
2
2
2
3
3
3
3
3
3
3
2
2
2
1
1
1
1
1
1
2
2
2
1
1
1
1
1
1
3
2
2
2
2
2
3
3
3
3
3
3
3
2
4
1
1
2
2
2
2
3
2
2
3
2
2
3
1
2
2
1
2
2
2
2
2
1
2
1
1
2
2
1
2
2
1
1
3
1
3
3
1
3
3
1
3
3
1
1
3
1
1
3
1
1
3
1
1
1
1
1
3
1
1
3
1
2
3
1
2
2
2
1
1
1
2
2
2
1
1
1
2
2
2
3
3
3
3
1
1
3
3
2
1
1
1
2
2
2
2
2
2
1
1
1
2
2
2
1
1
1
2
2
2
3
3
3
3
1
1
3
3
3
1
1
1
2
2
2
4
1
1
1
2
1
2
2
3
2
2
3
2
2
3
2
2
1
2
2
1
2
2
1
2
2
1
1
2
1
2
2
1
2
1
3
1
3
1
3
3
1
3
3
1
3
1
3
1
1
3
1
1
3
1
1
3
1
1
3
1
1
3
1
1
4
1
2
2
2
2
2
2
2
1
1
1
1
1
1
3
3
3
2
2
2
1
3
3
1
1
3
2
2
2
1
1
1
2
2
2
2
2
2
1
1
1
1
1
1
3
3
3
2
2
2
2
3
3
1
1
3
2
2
2
1
1
1
1
1
1
2
2
2
1
3
2
2
3
2
2
3
2
2
2
2
1
2
2
1
1
2
1
2
2
1
2
2
1
2
2
1
3
1
1
3
3
1
3
3
1
3
3
1
3
1
1
3
1
1
1
1
1
3
1
1
3
1
1
3
1
1
1
1
1
4
Rejestry
Rejestr
Code A
Code C
Code B
SP
00
!
01
"
02
#
03
$
04
%
05
&
06
'
07
(
08
)
09
*
10
+
11
,
12
13
.
14
/
15
0
16
1
17
2
18
3
19
4
20
5
21
6
22
7
23
8
24
9
25
:
26
;
27
<
28
=
29
>
30
?
31
@
32
A
33
B
34
C
35
D
36
E
37
F
38
G
39
H
40
I
41
J
42
K
43
L
44
M
45
N
46
O
47
P
48
Q
49
R
50
S
51
T
52
U
53
V
54
W
55
X
56
Y
57
Z
58
[
59
\
60
]
61
^
62
_
63
3
— Ciąg cyfr wystąpi w dowolnym miejscu symbolu i będzie ich co najmniej sześć (wtedy
dla sześciu cyfr kodowanie w rejestrze B zajęłoby przestrzeń sześciu znaków a w rejestrze
C trzy znaki plus dwa znaki przełączenia na, a potem z rejestru C — razem znaków pięć)
— Będziemy dysponować algorytmem,
który potrafi ocenić opłacalność takiego
kodowania (jeżeli algorytm miałby podejmować błędne decyzje, to być może
lepiej wszystko kodować w rejestrze B)
Znaki o wartościach od 64 do 96 są interpretowane różnie w rejestrach A i B.
W rejestrze B odpowiadają znakom ASCII
o kodach od 95 do 127 (czwarta ćwiartka
kodu ASCII). Znakami tymi są: `, a, b, c, d,
e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w,
x, y, z, {, |, }, ~ i DEL. Kody znaków na
wartości można przeliczać odpowiednio
odejmując lub dodając 32, podobnie jak
w przypadku znaków o wartościach od 0 do
63.
W rejestrze A natomiast te same kody
reprezentują znaki ASCII o kodach od 0 do
31 (pierwsza ćwiartka kodu ASCII). Znakami tymi są: NUL, SOH, STX, ETX, EOT,
ENQ, ACK, BEL, BS, HT, LF, VT, FF, CR,
SO, SI, DLE, DC1, DC2, DC3, DC4, NAK,
SYN, ETB, CAN, EM, SUB, ESC, FS, GS,
RS i US. Są to znaki sterujące, niedrukowalne w większości systemów. Zazwyczaj używane są do sterowania urządzeniami i jest
mało prawdopodobną potrzeba ich użycia
w typowych zastosowaniach. Jednak w wypadku korzystania z rejestru A w tej ćwiartce do przeliczania wartości symboli na kody
znaków należy użyć offsetu nie 32, ale 64
i to z przeciwnym znakiem.
Wartość
Rejestr Rejestr Rejestr
Cz B Cz B Cz B
znaku
Code A Code B Code C
064
1 1 1 4 2 2
NUL
`
64
Wartość
Cz B Cz B Cz B Cz
znaku
096
1 1 4 3 1 1
Rejestr
Code B
FNC 3
Rejestr
Code A
FNC 3
065
1
2
1
1
2
4
SOH
a
65
066
1
2
1
4
2
1
STX
b
66
067
1
4
1
1
2
2
ETX
c
67
068
1
4
1
2
2
1
EOT
d
68
069
1
1
2
2
1
4
ENQ
e
69
070
1
1
2
4
1
2
ACK
f
70
071
1
2
2
1
1
4
BEL
g
71
072
1
2
2
4
1
1
BS
h
72
073
1
4
2
1
1
2
HT
i
73
074
1
4
2
2
1
1
LF
j
74
075
2
4
1
2
1
1
VT
k
75
076
2
2
1
1
1
4
FF
l
76
077
4
1
3
1
1
1
CR
m
77
078
2
4
1
1
1
2
SO
n
78
079
1
3
4
1
1
1
SI
o
79
080
1
1
1
2
4
2
DLE
p
80
081
1
2
1
1
4
2
DC1
q
81
082
1
2
1
2
4
1
DC2
r
82
083
1
1
4
2
1
2
DC3
s
83
084
1
2
4
1
1
2
DC4
t
84
085
1
2
4
2
1
1
NAK
u
85
086
4
1
1
2
1
2
SYN
v
86
087
4
2
1
1
1
2
ETB
w
87
088
4
2
1
2
1
1
CAN
x
88
089
2
1
2
1
4
1
EM
y
89
090
2
1
4
1
2
1
SUB
z
90
091
4
1
2
1
2
1
ESC
{
91
092
1
1
1
1
4
3
FS
|
92
093
1
1
1
3
4
1
GS
}
93
094
1
3
1
1
4
1
RS
~
94
095
1
1
4
1
1
3
US
DEL
95
Rejestr
Code C
96
Rejestr wybiera
znak START. Zmia097
4 1 1 1 1 3
FNC 2
FNC 2
97
ny rejestru w środku
098
4 1 1 3 1 1
SHIFT
SHIFT
98
symbolu można do099
1 1 3 1 4 1
CODE C
CODE C
99
konać znakami CO100
1 1 4 1 3 1
CODE B
FNC 4
CODE B
DE (wartości 101,
101
3 1 1 1 4 1
FNC 4
CODE A
CODE A
100 i 99).
102
4 1 1 1 3 1
FNC 1
FNC 1
FNC 1
Warto
zauwa103
2 1 1 4 1 2
START (Code A) START (Code A) START (Code A)
żyć, że znaki zmie104
2 1 1 2 1 4
START (Code B) START (Code B) START (Code B)
niające rejestr w tym
105
2 1 1 2 3 2
START (Code C) START (Code C) START (Code C)
samym rejestrze są
—
2 3 3 1 1 1 2
STOP
STOP
STOP
wykorzystane do innych celów. Chwilowej zmiany rejestru z A na B lub z B na A (chwilowej, tzn. tylko na następny znak) dokonujemy znakiem SHIFT. Znak ten zazwyczaj będzie wykorzystywany przy
4
stałej pracy w rejestrze B i sporadycznym uzyskiwaniu jakiegoś sterującego znaku ASCII.
Natomiast kody funkcyjne służą do sterowania czytnikiem kodów:
— FNC1 jest zarezerwowany dla systemu UCC/EAN i współtworzy formalizm EAN-128
— FNC2 informuje czytnik, aby odczytany kod zamiast transmitować zapamiętał i dokleił
doń następny odczytany kod; Całość będzie transmitowana po odczytaniu pierwszego kodu bez FNC2
— FNC3 jest zarezerwowany do inicjacji, programowania i innych funkcji czytnika kodów
— FNC4 jest zarezerwowany dla przyszłych zastosowań.
Znak kontrolny
Wszystkie znaki (za wyjątkiem znaku STOP) mają swoją wartość, która jest liczbą od 0
do 105. Wartość ta jest używana do wyliczania znaku kontrolnego.
Znak kontrolny jest umieszczony bezpośrednio przed znakiem STOP i wyliczany jest ze
wszystkich znaków poprzedzających go w taki sposób, że:
— Sumę inicjujemy wartością znaku START (103, 104 lub 105)
— Do sumy dodajemy wartości kolejnych kodów pomnożone przez ich pozycję w symbolu.
Pierwszy znak po znaku START ma pozycję 1.
— Tak uzyskaną sumę dzielimy przez 103
— Jako znak kontrolny wybieramy ten, którego wartość określa reszta z powyższego dzielenia.
Przykład
— Treść symbolu: MacroBar
Znak Start B
Pozycja
Wartość
104
—
—
—
—
M
1
45
a
2
65
c
3
67
r
4
82
o
5
79
B
6
34
a
7
65
r
8
82
Suma: 104+(45×1)+(65×2)+(67×3)+(82×4)+(79×5)+(34×6)+(65×7)+(82×8) = 2518
Iloraz: 2518/103 = 24 reszty 46
Znak kontrolny: 46 → N
Ostateczna treść symbolu: (Start B)MacroBarN(Stop), czyli:
nk0DFUR%DU1mn
Warto zauważyć, że znaki odstępu mają wartość 0 i tym samym nie wpływają na wartość
znaku kontrolnego.
Wymiary
Wysokość pasków powinna mieć co najmniej 15% długości symbolu (bez obszarów wyciszenia) lub ¼ cala.
Implementacja
Aby zaimplementować drukowanie kodów paskowych potrzebny jest krój pisma zawierający komponenty do składu oraz oprogramowanie wspomagające skład symbolu ze znaków
kroju. Przedmiotem niniejszego projektu jest stworzenie takiego kroju i sformułowanie wskazówek umożliwiających oprogramowanie składu.
5
Tworzenie kroju pisma
Możliwe jest stworzenie kroju pisma przy pomocy jakiegoś narzędzia graficznego. Jest
jednak ryzyko, że minimalne pomyłki przy pozycjonowaniu węzłów określających kształty
pasków uczynią taki krój trudnym do odczytania. Wykrycie takowych błędów może się okazać bardzo trudne lub wręcz niemożliwe.
Ze względu na pewne wymogi, co do wymiarów komponentów, które są zależne między
innymi od długości symbolu, mogą się okazać potrzebne kroje z różnymi proporcjami szerokości do wysokości elementów. Tworzenie każdej odmiany ręcznie istotnie podnosi koszty
przedsięwzięcia.
Wreszcie może się okazać, że dziś najpopularniejszy format opisu krojów pism: TrueType
(TTF) jest w jakiejś sytuacji niewystarczający a konwersja do formatu nowego (np. Adobe
Type 1) wprowadza pewne niedokładności.
Same niedoskonałości urządzenia drukującego wystarczą, aby obarczyć drukowany kod
błędami uniemożliwiającymi jego odczyt, dlatego krój pisma należy stworzyć z pełną dokładnością, na jaką pozwala specyfikacja formatu.
Takim wymogom może sprostać tylko programowe sterowanie procesem tworzenia kroju.
I tą właśnie metodą wygenerowano grupę krojów pisma ze znakami Kodu 128 w formacie
TTF o nazwach:
Rysunek 1. Przykładowy
— MacroBar Code128-10,
znak Stop przy szerokości
— MacroBar Code128-12,
60 jednostek na moduł
podstawowy
i modułach
— MacroBar Code128-15,
kolejno 2331112 musi
— MacroBar Code128-20,
mieć dokładnie 780 jedno— MacroBar Code128-24,
stek, wszystkie współrzęd— MacroBar Code128-30,
ne x węzłów wielokrotno— MacroBar Code128-40,
ściami 60-ciu a stemy dokładnie pionowe
— MacroBar Code128-60.
Gdyby zaistniała taka potrzeba można bez większego trudu wygenerować tą samą metodą
kroje w innych formatach, jak np. Adobe Postscript Type 1 czy OTF z Type 1 wewnątrz.
Wygenerowanie
Podczas generowania fontów w wypadku Kodu 128 nie podejmowaliśmy ryzyka unikodowania (chociaż wszystkie znaki mają przydzielone unikody z grupy prywatnych F020+),
gdyż w niektórych systemach takie kroje w ogóle nie działają a w niektórych aplikacjach może dojść do mapowania innego, niż byśmy się spodziewali. Dlatego na razie takie fonty generujemy w kodowaniu MS Windows Symbol. Ta strona zapewni nam niezmienione pozycje
znaków w kroju niezależnie od aplikacji. Gdybyśmy w przyszłości chcieli generować ten krój
unikodowany, należy zadbać o pozostałe ustawienia nagłówkowe, m.in. o właściwy dobór
stron kodowych (Symbol Charakter Set) i specyfikację zbioru symboli (Private Use).
Każdy krój ma nie tylko oddzielną nazwę, ale i oddzielną nazwę rodziny (aby nie kojarzyć różnych odmian w jedną rodzinę (gdyż rodzina w Windowsach rozumiana jest jako normalny, kursywa, wytłuszczony i tłusta kursywa).
Do znaków z rejestru B można się dostawać tak, jak do innych tekstów ASCII. Wystarczy
wybrać krój „MacroBar Code128-nn”, aby sam tekst był złożony poprawnie. Niektóre procesory tekstu wkładają czasami swoje „autorskie” dodatki i trzeba na nie uważać.
Oto tablica znaków wygenerowanych krojów:
6
Kod
128
#
C
$
D
%
E
&
F
'
G
(
H
)
I
*
J
+
K
,
L
M
.
N
/
O
0
P
1
Q
2
R
3
S
4
T
5
U
6
V
7
W
8
X
9
Y
:
Z
;
[
<
\
=
]
>
^
?
_
@
`
A
!
a
B
"
b
Należy jednak zadbać, aby między znakami nie były wkładane dodatkowe odstępy. Do
poprawnego odczytania kodu przez czytnik niezbędne są jeszcze znaki startu, kontrolny
i stopu. Znaki sterujące są umieszczone na kodach powyżej 128:
Rejestr A
Rejestr B
Rejestr C
Wartość Kod ASCII kod
FNC 3
FNC 3
96
096
128
c
FNC 2
FNC 2
97
097
129
d
SHIFT
SHIFT
98
098
130
e
CODE C
CODE C
99
099
131
f
CODE B
FNC 4
CODE B
100
132
g
FNC 4
CODE A
CODE A
101
133
h
FNC 1
FNC 1
FNC 1
102
134
i
START (Code A) START (Code A) START (Code A)
103
135
j
START (Code B) START (Code B) START (Code B)
104
136
k
START (Code C) START (Code C) START (Code C)
105
137
l
STOP
STOP
STOP
106
138
m
Znak
ASCII
SP
!
"
#
$
%
&
'
(
)
*
+
,
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
Kod
ASCII
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Kod
128
Znak
ASCII
@
ASCII
ASCII
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
Kod
ASCII
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
Kod 128
Znak
ASCII
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
DEL
Kod
ASCII
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
7
Licencjonowanie
Krój TrueType (TTF) jest programem i jako taki podlega ochronie przez prawo autorskie
jak i inne programy komputerowe. Jest własnością intelektualną firmy MacroSoft S.A. i tym
samym nie wolno go kopiować i używać poza warunkami określonymi w licencji na instalację oprogramowania.
Jako wygenerowane od początku do końca własnymi siłami, kroje nasze są naszym dziełem autorskim i niemożliwe jest zakwestionowanie tego faktu na gruncie prawnym.
Wykorzystanie kroju
Aby wygenerowanych krojów używać, należy je zainstalować, czyli skopiować do katalogu \Windows\Fonts. Podczas umieszczania znaków na kontekście graficznym drukarki
należy zadbać, aby między kolejnymi znakami symbolu nie było żadnych dodatkowych odstępów. Biała przestrzeń na końcu znaku jest nośnikiem informacji i bezpośrednio po niej
musi wystąpić czarny pasek znaku następnego. Jedynie znak STOP kończy się czarnym paskiem i nie wymaga następnika.
Wybór odmiany i stopnia
Wybierając odmianę i stopień należy wziąć pod uwagę parametry urządzenia drukującego, jego rozdzielczość i jakość wydruku oraz przewidywaną długość składanego symbolu.
Warto zadbać o to, by kreski dobrze rozwijały się na drukarce niezależnie od położenia
ich na jej kontekście graficznym i od szerokości modułu podstawowego. Istotne jest to wtedy,
gdy szerokość modułu mierzona jest w kilku kropkach drukarki — wtedy bowiem zaokrąglenie o jeden pixel w tę czy w tę może dawać różnicę rzędu kilkudziesięciu procent, co ma
szansę uczynić symbol nieczytelnym. Warto więc zadbać o to, aby stopień pisma dawał się
dokładnie przeliczyć na kropki drukarkowe.
Zawsze w takich sytuacjach wychodzimy od rozmiaru kreski w jednostkach projektowych, po czym bierzemy pod uwagę fakt, że na stopień pisma podany w punktach typograficznych wchodzi 1000 jednostek projektowych a w calu jest 72 punkty. Wiedząc, ile kropek
na cal stawia drukarka (rozdzielczość w dpi) możemy poprzez wyliczenia dobrać taki stopień
pisma, aby moduł składał się z całkowitej liczby kropek.
Powinniśmy także wziąć pod uwagę ograniczenia, co do minimalnej wysokości symbolu,
która nie powinna być mniejsza niż ¼ cala (przy wysokości 750 jednostek to jest 24 pt) i 15%
długości symbolu.
Symbol nie może też być fizycznie dłuższy, niż pozwala na to czytnik kodu. Typowe
czytniki czytają kody o szerokości nawet do 2¼ cala i taki wymiar uwzględniono przy przygotowaniu prezentowanego poniżej zestawienia. Wzięto tutaj pod uwagę typowe zastosowania, (gdy drukarka ma rozdzielczość 600 dpi, moduł składa się z całkowitej liczby kropek
a stopień pisma jest liczbą całkowitą).
Kropek
2
na moduł
Odm. kroju pt zn
Code128-10
Code128-12
Code128-15
Code128-20
Code128-24
Code128-30
Code128-40
Code128-60
3
pt
4
zn
5
6
7
8
9
10
11
12
pt
zn
pt
zn
pt
zn
Pt
zn
pt
zn
pt
zn
pt
zn
pt
zn
pt
zn
24 42 36 38 48
20
30 35 40
16
24 27 32
12
18
24
15
20
12
16
12
27
27
27
20
60
50
40
30
25
20
15
21
21
21
20
16
72
60
48
36
30
24
18
12
17
17
17
17
16
12
84
70
56
42
35
28
21
14
14
14
14
14
14
12
96
80
64
48
40
32
24
16
12
12
12
12
12
12
8
108
90
72
54
45
36
27
18
10
10
10
10
10
10
8
120
100
80
60
50
40
30
20
9
9
9
9
9
9
8
132
110
88
66
55
44
33
22
8
8
8
8
8
8
8
144
120
96
72
60
48
36
24
7
7
7
7
7
7
7
4
8
W tabeli tej możemy odnaleźć, że: odmianą kroju Code 128-20 (20 jednostek na moduł)
możemy z powodzeniem drukować kod na drukarce 600 dpi i aby uzyskać moduł składający
się z czterech kropek (jakość w miarę przyzwoita) powinniśmy wybrać stopień pisma 24 pt.
Tak składany symbol może mieć maksymalną pojemność 20 znaków (poza znakiem startu,
kontrolnego i stopu). Długość ogranicza tutaj albo szerokość czytnika (przyjęto 2¼ cala, choć
bywają czytniki szersze) albo dozwolona proporcja wysokości symbolu do jego długości
(15%). Doświadczenie uczy, że niższe symbole mogą się czytać równie dobrze. Zalecam jednak respektować powyższą tabelę i kombinacji nie umieszczonych w niej lub stopni zaznaczonych kursywą unikać.
Namawiałbym na unikanie kodów drukowanych z dużą gęstością (poniżej 4 kropek na
moduł przy 600 dpi albo poniżej 2 kropek przy 300 dpi). Na jakość wydruku przy takich rozdzielczościach wpływa także faktura papieru i późniejsze łuszczenie się tonera. Wysokie rozdzielczości kodu mogą utrudniać kopiowanie kserograficzne dokumentów i w tym zakresie
mogą być niekiedy pożyteczne. Niemniej zachęcam, aby każdorazowo skrajne rozdzielczości
lub wymiary symboli weryfikować na czytnikach, jakimi dysponuje użytkownik.
Przy powyższych wyliczeniach (i przy wyborze szerokości modułu w jednostkach generowanych) przyjmowałem jako podstawę rozdzielczości wynikające z podziału 600/cal, gdyż
takie rozdzielczości oferują typowe drukarki laserowe. Przy rozdzielczościach wywodzących
się z podziału 720/cal należałoby być może wygenerować zarówno nowe odmiany krojów jak
i wygenerować na nowo powyższą tabelę. Warto zauważyć, że dla tej rodziny rozdzielczości
(najczęściej związanych z drukarkami atramentowymi Epson) całkowite stopnie czcionek
w punktach będą dawać tylko odmiany kroju o szerokości modułu 10, 20, 25 i 50 jednostek
projektowych.
Jeżeli jednak urządzenie drukujące będzie miało dość dużą rozdzielczość (np. 1440+ dpi)
a wybrany stopień i odmiana nie będą najdrobniejsze, to prawdopodobnym jest, że tak wydrukowane kody będą dobrze czytelne niezależnie od dopasowania parametrów. Takie wypadki trzeba oddzielnie przetestować.
Znak wyciszenia
Jeżeli nie możemy zagwarantować kontekstem składu strefy wyciszenia przed i po symbolu, możemy się posłużyć znakiem wyciszenia, którego szerokość wynosi nominalne 10
modułów. Znak ten jest umieszczony w kroju zaraz po znaku stopu na pozycji kodu ASCII
139.
Znak kontrolny
Przed znakiem STOP musi być umieszczony prawidłowo obliczony znak kontrolny. Inaczej czytniki kodu nie będą na symbol reagować nawet, jeżeli będzie czytelny i dobrze wydrukowany. Algorytm wyliczania znaku kontrolnego jest opisany w rozdziale Znak kontrolny
na stronie 5.
Uwagi implementacyjne
Dla krojów MacroBar Code128 nie należy stosować jakiejkolwiek programowej translacji
położeń znaków, gdyż może to w sposób istotny utrudnić wyliczanie znaku kontrolnego. Kroje z tej grupy są zadeklarowane jako symboliczne (tej samej klasy co Symbol, Windings itp.).
Oprogramowanie powinno dla wybieranych krojów sprawdzać, czy są symboliczne i w takim
przypadku zaniechać jakichkolwiek mapowań.
Warto jeszcze raz podkreślić, że Kod 128 jest ciągłym, tzn., że odstępy między znakami
mają istotne znaczenie i są już w znakach zawarte. Dla takich krojów należy wykluczyć jakiekolwiek dodatkowe odstępy między znakami.
9
W niniejszych krojach znak odstępu nie jest biały i jego treść jest znacząca. Wszędzie
tam, gdzie zakłada się, że odstęp jest biały i w jego miejsce wstawia się pewien wyliczony do
celów justunkowych odstęp, działania takiego należy zaniechać.
W szczególności w takich programach, jak Word nie należy stosować tego kroju do całych akapitów. Wolno go włączyć tylko na pewien ciąg znaków w linii i to bez żadnego sąsiedztwa ze znakami zmiany linii itp. gdyż wtedy Word zaczyna używać znaku o kodzie 32
(odstępu) do zaznaczania działań specjalnych, co zakłóca treść drukowanych symboli.
Testowanie
Kroje pism zostały przetestowane poprzez wydrukowanie wszystkich 96 znaków
w rejestrze B i C na drukarce laserowej i wczytanie czytnikiem kodów kreskowych Welch
Allyn ScanTeam 3110. Jest to urządzenie stare, od wielu lat już nie produkowane. Wczytywane znaki podaje symulując klawiaturę komputera. Należy się spodziewać, że współczesne
czytniki są nie mniej sprawne. Znaki kontrolne były wyliczane opisanym w cytowanej specyfikacji algorytmem. Dla testów wygenerowane fonty zainstalowano poprzez wrzucenie ich do
katalogu \Windows\Fonts. W niniejszym dokumencie fonty te są osadzone poprzez wybór
opcji zachowywania. Zmiana tych opcji może spowodować, że kody paskowe widoczne
w tym dokumencie znikną a na ich miejsce pojawią się znaki z jakiegoś kroju domyślnego.
Specyfikacja testów podstawowych
Testy zostały przygotowane w arkuszu Excel. Zadbano o to, aby wszystkie kombinacje
kodów paskowych (wszystkie 106 znaków) zostały umieszczone w symbolach testowych tak,
aby można je było wczytać dowolnym czytnikiem kodów paskowych. Poniższa tabele prezentuje zestawienie wszystkich symboli testowych.
nr start
treść symbolu
1
2
3
4
5
6
7
!
"
#
$ % &
B
34
R
50
b
66
r
82
z
0 90
C
35
S
51
c
67
s
83
{
91
D
36
T
52
d
68
t
84
|
92
stop
8
9
10
11
12
13
14
15
16
k
'
(
)
*
+
,
-
.
/
6
J
42
Z
58
j
74
z
90
‚
97 98
K
43
[
59
k
75
{
91
M
45
]
61
m
77
}
93
#
3
N
46
^
62
n
78
~
94
…
101
O
47
_
63
o
79
Š
1 104 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 22 106
‡
0 1 2 3 4 5 6 7 8 9 : ; < = > ? B Š
2 103 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 34 106
104
3
104
104
4
104
‰
105
@
32
P
48
`
64
p
80
†
102
A
33
Q
49
a
65
q
81
E
37
U
53
e
69
u
85
}
93
F
38
V
54
F
70
v
86
~
94
G
39
W
55
g
71
w
87
H
40
X
56
h
72
x
88
€
95 96
I
41
Y
57
i
73
y
89
L
44
\
60
l
76
|
92
„
99 100
P
48
]
61
j
74
w
95 87
@ B
32 32
Š
106
Š
106
Š
106
Š
106
Š
106
Jak można zauważyć, przygotowano siedem zestawów testowych. Liczba testów wynika z
przyjętego maksymalnego rozmiaru symbolu, który z kolei wynikał z chęci zastosowania kroju, który w sytuacjach kłopotliwych będzie na tyle czytelny, że oko ludzkie będzie mogło
oszacować ewentualne błędy.
10
W każdym teście w treści symbolu jest umieszczonych 16 kodów, z których to kodów
oraz wybranego kodu startu wyliczany jest znak kontrolny (k). Aby testy można było sprawdzić przy pomocy większości dostępnych urządzeń, respektowano nominalną proporcję wysokości symbolu do jego szerokości. Testy złożono odmianą kroju o szerokości modułu 15
jednostek (MacroBar Code128-15) i stopniu pisma 48 punktów typograficznych.
1. Test pierwszy zawiera symbole od 0 do 15 czyli
znaki ASCII o kodach od 32 do 47 (drukowalne znaki
specjalne). Znaki są złożone w rejestrze B. Pod symbolem umieszczona jest między pionowymi kreskami
jego odczytywana zawartość. Warto zwrócić uwagę
|0123456789:;<=>?|
na znak odstępu, który jest niewidoczny. Pionowe
kreski w podpisach nie należą do treści symboli.
Test 1. Cyfry
2. Test drugi zawiera symbole od 16 do 31 czyli
znaki ASCII od 48 do 63. Są to cyfry od 0 do 9 i kilka
znaków specjalnych. W celu przetestowania kodu 103
ten symbol jest złożony w rejestrze A. Dla odczytu
treści symbolu rejestr nie ma znaczenia, gdyż znaki te
| !"#$%&'()*+,-./|
są takie same w rejestrach A i B. Jednak po poprawnym wczytaniu tego symbolu kod Start A mamy
Test 2. Znaki specjalne ASCII
sprawdzony.
nj !"%mn
nk
mn
nk#$%&'()*+,-./0123mn nk3456789:;<=>?@AB@mn
|@ABCDEFGHIJKLMNO|
|PQRSTUVWXYZ[\]^_|
nkCDEFGHIJKLMNOPQRMmn nkSTUVWXYZ[\]^_`abZmn
|`abcdefghijklmno|
|pqrstuvwxyz{|}~ |
Test 3. Litery
3. W kolejnych symbolach w rejestrze B testujemy kody od 32 do 95. Są to cztery kolejne
symbole zawierające znaki ASCII od 64 do 127. Warto zwrócić uwagę na ostatni znak w teście szóstym. Jest to znak ASCII o kodzie 127 (DEL). Ze swojej natury znak ten jest niedrukowalny i dlatego może być podczas wczytywania czytnikiem albo przezeń pomijany albo
gubiony gdzieś po drodze. Jeżeli jednak symbol zostanie odczytany, to możemy mieć pewność, że zgodziła się suma kontrolna i znak tego kodu jest prawidłowy.
4. W ostatnim teście sprawdzamy pozostałe
kody. Stąd symbol ten jest złożony w rejestrze C
(test kodu Start C). Pierwszym jest dwuznak
„00”, który powstaje z tego samego kodu, co
znak odstępu (powtórny test kodu 0). Potem kody |0090919293949596979899#@|
dwuznaków „90”–„99” dają test pewności dla
kodu 95 (ASCII 127) — znaku, którego nie Test 4. Dwuznaki i funkcyjne
widzieliśmy
dzieliśmy
orazoraz
dla kodów
dla kodów
FNC FNC
3, FNC
3, 2,FNC
SHIFT
2,
i CODE C widocznych w rejestrze C jako dwuznaki „96”, „97”, „98” i „99”. Nie mamy innego sposobu testowania znaków funkcyjnych, jak tylko poprzez uwidacznianie ich jako dwu-
nli]^_`abcdefgh#%mn
11
znaki, gdyż ich działanie zależy od firmware czytnika. I wreszcie kody 100 i 101 przełączają
nas kolejno na rejestr B skąd bierzemy znak „#” i na rejestr A, skąd mamy znak „@”. Jako
pierwszy znak tego symbolu umieszczamy kod 102, który we wszystkich rejestrach ma to
samo znaczenie FNC 1. Jednym z objawów poprawności tego znaku może być to, że symbol
wczyta się bez tego znaku. Czytnik obsługujący wewnętrznie kod EAN-128 może protestować, gdyż w tym kodzie położenie znaku FNC 1 jest sformalizowane. Po nim ma wystąpić
zestandaryzowany kod zastosowania. Nasz czytnik (Welch Allyn ScanTeam 3010) jednak
EAN-128 nie obsługuje i jedynym dowodem na poprawność kodu FNC 1 jest wczytanie symbolu (musiała się zgodzić suma kontrolna).
Specyfikacja testów odmian
Aby przetestować inne odmiany wygenerowanych krojów wykonałem jedynie
test 2. Założenie, iż wszystkie inne odmiany były generowane tym samym algoMacroBar Code128-10 48pt
rytmem skutkuje tezą, iż najprawdopodobniej z faktu czytelności jednego symbolu wynika czytelność wszystkich pozostałych. Chyba, że nieczytelność spowodowana jest przyczynami pozamerytoMacroBar Code128-12 48pt
rycznymi (jakość druku czy jakość czytnika).
Symbol z testu nr 2 złożyłem krojami:
MacroBar Code128-10 48pt, MacroBar
MacroBar Code128-15 48pt
Code128-12 48pt, MacroBar Code128-15
48pt, MacroBar Code128-20 48pt, MacroBar Code128-24 40pt, MacroBar Code128-30 32pt, MacroBar Code128-40
MacroBar Code128-20 48pt
24pt i MacroBar Code128-60 16pt.
Aby nie komplikować zadania, dla
szerszych odmian nie zmniejszałem tutaj
MacroBar Code128-24 40pt
długości symbolu a jedynie zmniejszyłem
stopień pisma. Stąd od odmiany 24 do 60
stopień pisma jest za każdym razem
MacroBar Code128-30 32pt
mniejszy.
Konsekwencją takiego zabiegu jest
niezachowanie wymaganych 15% wysoMacroBar Code128-40 24pt
kości symbolu, ale przy starannym
nj !"%mn
umieszczeniu czytnika kodów kody te
MacroBar Code128-60 16pt
udaje się wczytać bez większych problemów.
Dzięki takiemu zabiegowi widać pełną zgodność w układzie pasków, gdyż dobrane stopnie dają tę samą szerokość modułu podstawowego.
nj !"%mn
nj !"%mn
nj !"%mn
nj !"%mn
nj !"%mn
nj !"%mn
nj !"%mn
Wynik testów
Wszystkie zamieszczone tutaj testy zostały wraz z całym dokumentem wydrukowane na
bardzo starej drukarce laserowej Lexmark Optra Lx+ przy rozdzielczości 300, 600 i 1200 dpi
i wczytane wiekowym już czytnikiem Welch Allyn ScanTeam 3010. Wszystkie symbole zostały wczytane prawidłowo.
12
Podsumowanie
Jeżeli jakieś urządzenie drukujące ma wbudowaną funkcję druku kodów paskowych, należy spróbować wykorzystać tę funkcję, gdyż zwykle wbudowane w firmware mechanizmy
dopasowane są do rozdzielczości urządzenia i jego technicznych własności.
Stworzone kroje są jednak niezbędnym rozwiązaniem, gdy kodami paskowych trzeba
umieszczać na drukowanych dokumentach np. numery faktur czy dane identyfikacyjne kontrahentów. Ufam, że kroje te będą wykorzystywane z pożytkiem dla nas i naszych klientów.
Inne kody paskowe
Gdyby zachodziła taka potrzeba, można rozważać późniejszą realizację innych kodów,
szczególnie kodu 39/93 czy EAN/UPC. Inne kody mogą wymagać dużo poważniejszego
wsparcia algorytmicznego podczas składania, gdyż dla tego samego znaku używa się tam albo
różnych „czcionek” w zależności od położenia znaku w symbolu albo koduje się niektóre
znaki sekwencjami wieloznakowymi. Warto jednak rozważyć implementację Kodu 39, szczególnie ze względu na poniższe cechy:
— Nieciągłość: w przeciwieństwie do Kodu 128 każdy znak Kodu 39 rozpoczyna się i kończy czarnym paskiem a odstępy między znakami nie są ściśle zestandaryzowane; stąd dopuszczalne jest dodatkowe rozstrzelanie znaków
— Brak konieczności umieszczania znaku kontrolnego: dzięki temu proste kody alfanumeryczne można składać bez wsparcia algorytmicznego
— Niewielką liczbę znaków: wszystkie znaki mieszczą się w podstawowym kodzie ASCII
start i stop zaznacza się znakiem „*”.
Dzięki tym cechom używanie Kodu 39 w niektórych sytuacjach może być prostsze. Jednak przy poważniejszych zastosowaniach wspomniane wyżej zalety mogą być poważnymi
wadami, dlatego zawsze najpierw należy rozważać stosowanie i wdrażanie rozwiązań z Kodem 128. Wydaje się, że po doświadczeniach związanych z Kodem 128 stworzenie krojów
dla kodu 39 nie powinno być jakimkolwiek problemem.
Bibliografia
Adams Russell E.; BarCode1 HomePage; http://www.adams1.com/pub/russadam/info.html;
Adams Communications 1995–2003.
Adams Russell E.; Sourcebook Of Automatic Identification And Data Collection; Van
Nostrand Reinhold; 1990.
Barcode Island; Barcode Symbologies; http://www.barcodeisland.com/symbolgy.phtml; Vault
Information Services 2000–2001.
Brown Stephen A.; Revolution at the Checkout Counter: Explosion of the Bar Code; Harvard
University Press 1977.
Bushnell Richard D., Meyers Richard B.; Getting Started With Bar Codes: A Systematic
Guide; Tower Hill Press, 1998.
Nelson Benjamin; Punched Cards to Bar Codes; Helmers Publishing Inc., Peterborough
1998.
Pearce Stephen, Bushnell Richard D.; The Bar Code Implementation Guide: Using Bar Codes
in Distribution; Helmers Publishing Inc., Peterborough 1995.
Szyszka Grzegorz red.; Kody kreskowe: rodzaje, standardy, sprzęt, zastosowania; Instytut
Gospodarki Magazynowej; Poznań 1994.
13

Podobne dokumenty