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