Čiarový kód nie je iba obrázok, ktorým ozdobíte dokument. Predstavuje presné meranie a skener je prístrojom, ktorý ho číta. Tento pohľad rozhoduje takmer o všetkom, čo sa týka jeho vykresľovania do PDF. Samotná čierna farba čiar nenesie žiadnu informáciu; tá spočíva v pomere šírok čiar k šírkam medzier, a čítačka ju získava meraním prechodov, keď laser alebo snímač prechádza po kóde. Ak túto geometriu stlačíte, rozmažete alebo zmenšíte jej okraje, vytvoríte niečo, čo síce vyzerá ako čiarový kód, no pre skener bude len nečitateľnou škvrnou. HotPDF ponúka dva spôsoby, ako umiestniť čiarový kód na stránku, a rozdiel medzi nimi spočíva práve v tom, či máte túto geometriu pod kontrolou, alebo ju prenecháte náhode.

Čo všetko dokáže HotPDF zakódovať
HotPDF vykresľuje lineárne (jednorozmerné) symbológie a ich ponuka je širšia, než väčšina projektov vyžaduje. Enumerácia THPDFBarcodeType pokrýva rodinu Code 2 of 5 v jej prekladaných (interleaved), priemyselných a maticových formách; Code 39 a jeho rozšírenú verziu; tri podskupiny Code 128 (A, B a C); Code 93 v základnej a rozšírenej verzii; MSI; PostNet; Codabar; skupinu maloobchodných kódov UPC a EAN, konkrétne EAN-8, EAN-13, UPC-A, komprimované UPC-E0 and UPC-E1 a doplnkové 2- a 5-ciferné kódy UPC; a podskupiny GS1-128 (EAN-128). To plne postačuje na pokrytie potrieb pre logistické štítky, maloobchodné pokladne a staršie priemyselné kódy stále používané v skladoch.
Čo však nevykresľuje, je rodina dvojrozmerných (2D) kódov. Nenájdete tu QR, Data Matrix ani PDF417. Tieto kódy ukladajú bajty do mriežky s vlastnou matematikou opravy chýb. Ak vaše zadanie vyžaduje jeden z nich, HotPDF nie je správny nástroj a je dobré to vedieť hneď na začiatku. Pri jednorozmerných kódoch je praktická otázka užšia: ktorá symbológia dokáže prijať vaše reálne dáta, keďže jednotlivé kódovania nie sú navzájom zameniteľné.
Obmedzenia dát sú reálne a prejavia sa pri generovaní. Varianty Code 2 of 5 a MSI prijímajú iba číslice. Code 39 prenáša veľké písmená, číslice a niekoľko interpunkčných znamienok; ak potrebujete malé písmená alebo celý rozsah ASCII, musíte použiť Code 39 Extended alebo podskupinu Code 128. Code 128C balí kvôli hustote dve číslice do každého symbolu, takže vyžaduje číselný reťazec párnej dĺžky a nič iné. EAN-13 očakáva dvanásť číslic a trinástu vypočíta ako kontrolnú; EAN-8 očakáva sedem a vypočíta ôsmu; UPC-A vyžaduje dvanásť číslic. Ak odovzdáte symbológii dáta, ktoré nedokáže reprezentovať, nedostanete užitočnú výnimku, ale čiarový kód, ktorý zakóduje nezmysly, čo je horšie, pretože vizuálne vyzerá v poriadku, kým ho niekto neskúsi naskenovať na pokladni.
Dve cesty vykresľovania, dve úrovne kontroly
Metóda, ktorú by ste mali v produkcii používať, je DrawBarcode na objekte stránky. Prijíma symbológiu, pozíciu, výšku a jeden parameter, ktorý je dôležitejší ako ostatné: MUnit, čiže šírku modulu. Modul je šírka najužšej čiary – základný stavebný prvok, od ktorého sa odvíja každá ďalšia miera v kóde, a udáva sa v bodoch. Všetko ohľadom toho, či vytlačený kód bude skenovateľný, závisí od tohto jediného čísla.
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'label.pdf';
Pdf.BeginDoc;
// BCType, X, Y, Height, MUnit (module width in points), angle,
// data, UseCheckSum, bar color, background color.
Pdf.CurrentPage.DrawBarcode(
bcCodeEAN13, // symbology
72, 680, // X, Y in points from the bottom-left
60, // bar height
1, // MUnit: 1pt narrowest bar
0, // no rotation
'123456789012', // 12 digits; the 13th is the check
True, // append the modulo-10 check digit
clBlack, clWhite); // bars black, background white
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
Dva parametre si zaslúžia podrobnejší pohľad. UseCheckSum pripojí kontrolnú číslicu modulo-10, ktorú symbológia vyžaduje. Pri maloobchodných kódoch ju takmer vždy chcete mať nastavenú na True. Vypnite ju iba vtedy, ak vaše dáta už prepočítanú kontrolnú číslicu obsahujú, inak dôjde k zdvojeniu číslice. Farby čiar a pozadia sú poslednými dvoma parametrami a pokušenie experimentovať s nimi je pascou, o ktorej píšeme nižšie. Všimnite si tiež počiatok súradníc: ako každé iné volanie kreslenia v HotPDF, aj tu súradnice X a Y merajú vzdialenosť od ľavého dolného rohu stránky v bodoch, pričom Y rastie smerom nahor. Ide o rovnakú konvenciu, ktorú podrobne rozoberá príklad Hello World.
Druhou cestou je DirectDrawBarcode, ktorá prijíma dáta a ohraničujúci rámec X, Y, Width, Height, pričom prispôsobí vzor čiar tak, aby vyplnil túto šírku. Je to pohodlné pri rozmiestňovaní kódov do mriežky, pretože určíte plochu a metóda do nej čiary napasuje. Toto pohodlie je však zároveň rizikom. Keď zadáte pevnú šírku, už neurčujete veľkosť modulu. Metóda rozdelí vyhradený priestor medzi toľko čiar, koľko dáta vyžadujú, a najužšia čiara bude mať takú šírku, aká vyjde z tohto delenia. Ak umiestnite hustý reťazec Code 128 do príliš úzkeho rámca, moduly sa ticho zmenšia pod rozlišovaciu schopnosť akéhokoľvek skenera. Pre všetko, čo musí byť spoľahlivo skenovateľné, uprednostnite metódu DrawBarcode a nastavte MUnit explicitne. Metódu DirectDrawBarcode si ponechajte na náhľady alebo pre situácie, kde máte overené, že výsledné čiary zostanú dostatočne čitateľné.
Šírka modulu je rozhodnutie o rozlíšení
Tu je matematika, ktorá určuje, či bude váš štítok fungovať. Laserový skener aj kamera majú minimálnu veľkosť detailu, ktorú dokážu rozlíšiť, a najužšia čiara must po vytlačení ležať bezpečne nad touto hranicou. Všeobecne uvádzané minimum pre lineárne kódy je šírka najužšej čiary 13 mil (približne 0,33 mm) a mnohé maloobchodné a priemyselné normy to považujú za absolútne minimum, nie za cieľ. Prepočítané na jednotky PDF: jeden bod je 1/72 palca, čo je približne 0,353 mm, so šírka modulu s hodnotou 1 leží presne na tejto minimálnej hranici. Preto je MUnit := 1 najmenšia hodnota, ktorej by ste mali dôverovať pri kódoch určených pre skutočné skenery, a prečo jej zdvojnásobenie na 2 prináša bezpečnú rezervu na štítkoch, kde je dostatok miesta.
Prepojte to aj s rozlíšením výstupu, pretože modul must prežiť prechod tlačiarňou. Na laserovej tlačiarni s rozlíšením 300 DPI predstavuje jeden tlačový bod 1/300 palca, so jednobodový modul má šírku približne štyri tlačové body. Štyri body sotva stačia na vykreslenie čistej hrany. Rozpíjanie tonera a drobné chyby posunu papiera z nej uberajú, a čiara, ktorá mala v PDF veľkosť jedného bodu, sa vytlačí hrubšia alebo tenšia, než povoľuje špecifikácia. Zvýšte šírku modulu na 2 body a získate osem tlačových bodov, ktoré tento šum absorbujú. Pravidlo, ktoré si treba zapamätať: šírka modulu nastavená v bodoch sa must na vašej skutočnej tlačiarni zobraziť ako celé a dostatočné množstvo tlačových bodov, nie ako rozlíšenie, ktoré by ste chceli mať. Kód, ktorý sa bez problémov skenuje z obrazovky, ale zlyháva po vytlačení v sklade, takmer vždy stroskotal na tomto overení.
Ochranná zóna (quiet zone) je súčasťou symbolu
Najčastejším dôvodom, prečo správne zakódovaný čiarový kód nie je možné naskenovať, je chýbajúca ochranná zóna – prázdny okraj na oboch stranách čiar. Skener používajú toto prázdne miesto na určenie začiatku a konca kódu. Bez neho čítačka nedokáže rozlíšiť prvú čiaru od iných prvkov na stránke. Normy sú v tomto jednoznačné. Väčšina lineárnych symbológií vyžaduje na každej strane ochrannú zónu s veľkosťou aspoň desaťnásobku šírky modulu. Maloobchodné kódy UPC a EAN vyžadujú deväť modulov vľavo a sedem vpravo. Pri jednobodovom module to znamená približne desať bodov (asi sedmina palca) garantovaného prázdneho miesta po stranách kódu.
HotPDF vykresľuje výhradne čiary a nič iné. Nerezervuje za vás ochrannú zónu, čo znamená, že táto zodpovednosť leží na vás a ľahko sa na ňu zabúda. Zlyhanie býva nenápadné: umiestnite čiarový kód tesne k okraju bunky tabuľky alebo necháte rozloženie stránky natlačiť logo hneď vedľa neho. Kód, ktorý prešiel všetkými testami na prázdnej stránke, sa stane neskenovateľným v reálnom dokumente. Vyhraďte tento okraj vopred. Pred volaním DrawBarcode nechajte na oboch stranách čistý priestor s veľkosťou aspoň desaťnásobku modulu a považujte akúkoľvek grafiku, čiaru alebo text, ktorý do tohto pásma zasahuje, za chybu a nie za estetickú voľbu.
Farba, kontrast a ľudsky čitateľný riadok
Možnosť nastavenia farby čiar a pozadia existuje preto, aby ste mohli kód prispôsobiť firemnej palete, no ide o najrýchlejší spôsob, ako znefunkčniť inak správny kód. Skener snímajú kontrast, spravidla pomocou červeného svetla, a vyžadujú tmavé čiary na svetlom pozadí. Čierna na bielej je jediná kombinácia, ktorú by ste mali použiť bez predchádzajúceho testovania. Tmavomodrá alebo tmavozelená na bielej môžu prejsť; čokoľvek s nízkym jasovým kontrastom a najmä červené čiary (ktoré červený laser skenera vidí ako biele pozadie) fungovať nebudú. Ak dizajnér požaduje farebné čiarové kódy, správna odpoveď je, že čiary zostanú čierne a farby sa použijú inde na štítku.
Metóda DrawBarcode dokáže pod čiarami zobraziť aj ľudsky čitateľný text – číslice, ktoré môže pracovník zadať ručne, ak skenovanie zlyhá. Tento text slúži ako záloha, nie ako ozdoba, preto pri umiestňovaní vlastných popisov dajte pozor, aby nezasahovali do ochrannej zóny. Označenie symbológie natlačené v bočnom okraji znehodnotí rovnaké prázdne miesto, na ktorom závisí skener. Polia v tomto príklade, vrátane volaní TextOut pre okolité popisy, sú rovnakými kresliacimi operáciami, aké rozoberá sprievodca reportovými výstupmi. To je správne miesto, kam sa pozrieť, ak je čiarový kód len jedným z prvkov zložitejšej stránky.
Návyk rýchleho overovania
Vektorové čiary sú výhodou, ktorú netreba opomenúť. Keďže metóda DrawBarcode zapisuje kód ako kresliace operácie PDF, a nie ako rasterizovaný obrázok, čiary zostávajú ostré pri akomkoľvek priblížení a súbor nemá žiadne vlastné rozlíšenie. Jediným dôležitým rozlíšením je rozlíšenie tlačiarne. To vás však nezbavuje povinnosti testovať, iba to znamená, že test sa musí uskutočniť na papieri. Vygenerujte vzorku, vytlačte ju na tlačiarni s najnižším rozlíšením, s akou sa vaše kódy môžu stretnúť, a naskenujte ju rovnakou čítačkou, akú používajú vaši koncoví používatelia, nie drahým priemyselným snímačom na vašom stole. Skontrolujte pravítkom ochranné zóny na výtlačku, overte, či šírka modulu prežila prevod z bodov na tlačové body, a skontrolujte, či dešifrovaná hodnota zodpovedá tomu, čo ste zakódovali vrátane kontrolnej číslice. Päť minút s reálnym skenerom odhalí každé z vyššie popísaných zlyhaní, a to skôr, než odíde celá paleta nesprávne označeného tovaru.
Volania DrawBarcode a DirectDrawBarcode uvedené v tomto článku sú súčasťou komponentu HotPDF pre Delphi a C++Builder.