Čiarový kód na prepravnom štítku alebo faktúre má jedinú úlohu – byť prečítaný skenerom na prvý pokus. O tom, či prežije tento pokus, sa rozhoduje dlho predtým, ako balík dorazí do prístavu. Rozhoduje o tom to, ako bol symbol umiestnený na stránku. Najčastejšou chybou v reportovacom postupe v Delphi je vykresliť čiarový kód ako bitmapu niekde inde a vložiť tento obrázok do PDF. Na obrazovke to vyzerá dobre pri jednej úrovni priblíženia a potom degraduje všade inde.
Alternatívou je nakresliť symbol ako vektorový obsah priamo do stránky. PDFlibPas odhaľuje rodinu kresliacich volaní presne pre toto, pokrývajúcu 2D maticové symboly QR, PDF417 a DataMatrix, lineárne rodiny cez Code128 a GS1-128, a USPS Intelligent Mail pre poštovú automatizáciu. Argument pre vektor nie je estetický. Ide o to, či čiary pristanú tam, kde ich skener očakáva.
Prečo vektor poráža umiestnenú bitmapu
Čiarový kód je vzor čiar a medzier, alebo v dvoch rozmeroch mriežka tmavých a svetlých modulov. Dekodér funguje tak, že meria pomer týchto šírok. Čokoľvek, čo skresľuje pomery, je šum, ktorý uberá z chybového rozpočtu symbolu. Rastrovaný obrázok čiarového kódu nesie pevné pixely. Keď sa PDF vykresľuje na tlačiarni, ktorej body sa nedelia rovnomerne do mriežky obrázka, rastrizátor musí prevzorkovať dáta a okraje modulov, ktoré by mali byť ostré, sa rozložia na dva pixely zariadenia. Úzka čiara sa môže rozšíriť, susedná medzera zúžiť a pomer šírok, na ktorý sa dekodér spolieha, sa posunie.
Nakreslený ako vektorový obsah je ten istý symbol sadou vyplnených obdĺžnikov popísaných v používateľských súradniciach PDF. Neexistuje žiadna pevná mriežka pixelov, s ktorou by bolo treba bojovať. Pri tlači zariadenie vykreslí každý obdĺžnik v rozlíšení, ktoré skutočne má, so každý okraj modulu je taký ostrý, ako hardvér umožňuje, pri akejkoľvek mierke a akejkoľvek veľkosti tlače. Zväčšite vektorový symbol pre paletový štítok alebo ho zmenšite pre balík a geometria zostáva presná. Táto presnosť je to, čo udržiava mieru úspešnosti čítania na prvý pokus vysokú, čo je celým zmyslom umiestnenia čiarového kódu na stránku.
QR kódy a štyri úrovne korekcie chýb
QR je a 2D maticový symbol čítaný v oboch osiach súčasne, a preto balí veľa dát do malého štvorca. Jeho tolerancia voči poškodeniu pochádza z Reed-Solomonovej korekcie chýb, ponúkanej v štyroch úrovniach. Úroveň L obnovuje približne 7 percent kódových slov, M približne 15 percent, Q približne 25 percent a H približne 30 percent. Vyššia korekcia nie je zadarmo. Obnovovacie kódové slová zaberajú kapacitu modulov, so pre pevné množstvo dát vyššia úroveň vynucuje hustejší alebo fyzicky väčší symbol.
Tento obchod je otázkou prostredia, v ktorom bude symbol žiť. Čistý digitálny dokument, ktorý sa bude kedykoľvek skenovať iba z obrazovky, môže zostať na úrovni L a byť kompaktný. Štítok, ktorý sa bude tlačiť, manipulovať s ním, odierať sa a možno ho čiastočne zakryje lepiaca páska, vyžaduje Q alebo H, pretože extra redundancia je to, čo umožňuje dekodéru rekonštruovať náklad zo symbolu, ktorý už nie je nedotknutý. DrawQRCode prijíma pozíciu a SymbolSize, ktoré fixujú vykreslenú šírku a výšku, plus hodnotu EncodeOptions, ktorá vyberá dátový režim (0 pre automatický, prípadne číselný, alfanumerický, ISO-8859-1 a UTF-8 varianty) a hodnotu DrawOptions pre orientáciu.
var
Pdf: TPDFlib;
begin
Pdf := TPDFlib.Create(nil);
try
Pdf.NewDocument;
Pdf.SetPageSize('A4');
Pdf.SetMeasurementUnits(1); // 1 = millimetres
Pdf.NewPage;
# 30 mm square QR, automatic encoding, normal orientation
Pdf.DrawQRCode(20, 20, 30, 'https://www.loslab.com/', 0, 0);
Pdf.SaveToFile('Label_QR.pdf');
finally
Pdf.Free;
end;
end;
Samotná úroveň korekcie je vybraná enkóderom tak, aby sa dáta zmestili do symbolu, ktorý ste požadovali. Ak potrebujete zaručenú vysokú úroveň pre náročné prostredie, dimenzujte symbol veľkoryso, aby mal enkóder rozpočet modulov na redundanciu a nebol nútený ísť s úrovňou nadol, aby sa zmestil.
PDF417 pre preukazy a prepravné štítky
PDF417 je skladaný lineárny symbol. Každý riadok je krátky lineárny čiarový kód a riadky sa ukladajú na seba, aby vytvorili blok, čo je dôvod, prečo sa objavuje na vodičských preukazoch, palubných lístkoch a prepravných štítkoch prepravcov, kde širší pás dát musí sedieť v obdĺžnikovom pôdoryse. Jeho korekcia chýb beží na stupnici od 0 do 8. Každý krok zhruba zdvojnásobuje počet opravných kódových slov, so úroveň 5 nesie oveľa viac redundancie než úroveň 1, a to na úkor väčšieho počtu kódových slov na stránke.
Tvar bloku PDF417 je nastaviteľný, čo je dôležité, pretože štítok má pevnú plochu na vyplnenie. DrawPDF417SymbolEx odhaľuje ovládacie prvky, ktoré základné volanie nemá. Parametre FixedColumns a FixedRows pripnú počet dátových stĺpcov a riadkov, pričom 0 znamená nechať rozhodnúť enkóder. ErrorLevel prijíma -1 pre automatickú voľbu alebo explicitné hodnoty 0 až 8. ModuleSize je šírka najužšieho prvku v aktuálnej mernej jednotke a HeightWidthRatio určuje, aký vysoký je každý modul vo vzťahu k svojej šírke, čo je spôsob, ako urobiť blok krátky a široký alebo vysoký a úzky, aby zodpovedal priestoru, ktorý máte.
// Fixed 10 data columns, automatic rows, error level 5,
// module 0.30 mm wide, rows three times the module width tall
Pdf.DrawPDF417SymbolEx(20, 60, 'PDF417 PAYLOAD 0123456789',
0, // Options: 0 = normal orientation
10, // FixedColumns
0, // FixedRows: 0 = automatic
5, // ErrorLevel: 0 to 8
0.30, // ModuleSize, in the current measurement unit
3.0); // HeightWidthRatio
Zafixovanie stĺpcov je zvyčajná páka na šablóne štítku. Konštantný počet stĺpcov dáva bloku predvídateľnú šírku, so okolitý layout sa neposúva, keď kódovaný náklad mení dĺžku od jedného dokumentu k druhému, zatiaľ čo enkóder pridáva riadky smerom nadol, aby absorboval rozdiel.
DataMatrix pre malé značky
DataMatrix je symbol, po ktorom treba siahnuť, keď značka musí byť malá. Ide o kompaktnú 2D mriežku, ktorá používa ECC 200, modernú Reed-Solomonovu schému, a zostáva čitateľná aj pri veľkostiach, kde by bol QR symbol rovnakých dát nepraktický. Vďaka tomu je štandardnou voľbou pre priame značenie dielov, malé elektronické súčiastky a husté logistické štítky.
DrawDataMatrixSymbol prijíma ModuleSize pre rozstup bodov, Encoding s hodnotou 1 pre ASCII a SymbolSize, ktorá je buď 0 pre automatickú voľbu alebo jeden zo štandardných štvorcových a obdĺžnikových rozmerov, od 10x10 až po 132x132. Parameter Options kombinuje orientáciu so šírkou tichej zóny (quiet-zone), kde pripočítanie 100 až 400 nastavuje biely okraj s veľkosťou jedného až štyroch modulov. Tichá zóna nie je dekorácia. Dekodér potrebuje tento voľný okraj na nájdenie vyhľadávacieho vzoru symbolu (finder pattern) a symbol natlačený na iný atrament je symbolom, ktorý sa nepodarí načítať.
// Auto-sized ASCII DataMatrix, 0.5 mm module, normal orientation
// with a one-module quiet zone (Options 0 + 100)
Pdf.DrawDataMatrixSymbol(20, 110, 0.5, 'DMX-SN-4408812',
1, // Encoding: 1 = ASCII
0, // SymbolSize: 0 = automatic
100); // Options: normal + one-module quiet zone
Kde stále vládnu 1D čiarové kódy
Dvojrozmerné symboly síce priťahujú pozornosť, ale lineárne čiarové kódy stále vlastnia veľkú časť maloobchodu a logistiky. Dôvodom je inštalovaná základňa laserových skenerov, ktoré čítajú na jeden prechod. Code128 je ťažným koňom pre alfanumerické dáta a jeho efektivita pochádza z troch znakových sád. Sada A pokrýva riadiace znaky a veľké písmená, sada B pokrýva plný rozsah tlačiteľného ASCII a sada C je tá, na ktorej záleží pri číslach. Podsada C kóduje dvojicu číslic do jedného znaku symbolu, so rad číselných dát zaberie polovicu znakov symbolu, než by tomu bolo v sade A alebo B. To je najkompaktnejší spôsob, ako zapísať dlhý číselný čiarový kód, a implementácia Code128 v PDFlibPas automaticky kombinuje sady B a C na jeho dosiahnutie.
GS1-128, štandard predtým známy pod názvom EAN-128, stavia na Code128 tým, že nesie aplikačné identifikátory (Application Identifiers), čo sú predpony v zátvorkách, ktoré prijímajúcemu systému hovoria, či nasledujúce číslice sú sériové číslo, kód šarže alebo dátum exspirácie. Štruktúra je označená ako FNC1, špeciálny nedátový znak, ktorý označuje symbol ako GS1-kódovaný a oddeľuje polia s premenlivou dĺžkou. V PDFlibPas kreslíte symbol GS1-128 pomocou DrawBarcode s použitím typu Code128 a vložením literálneho markeru [FNC1] do dátového reťazca tam, kde začína každý aplikačný identifikátor.
var
W: Double;
begin
// Code128, with FNC1 markers this becomes a GS1-128 symbol.
// AI 21 (serial) = ABC123, AI 20 (variant) = 13
Pdf.DrawBarcode(20, 150, 60, 18, '[FNC1]21ABC123[FNC1]2013',
3, // Barcode: 3 = Code128
0); // Options: 0 = default drawing
// Measure the rendered width for a 0.30 mm narrow bar before laying out
W := Pdf.GetBarcodeWidth(0.30, '[FNC1]21ABC123[FNC1]2013', 3);
end;
Pre poštu USPS Intelligent Mail, nazývaný aj OneCode, kóduje smerovacie a sledovacie dáta do jedného výškovo modulovaného čiarového kódu pre poštovú automatizáciu. Metóda DrawIntelligentMailBarcode prijíma explicitnú geometriu pre šírku čiary, plnú výšku čiary, výšku sledovača (tracker) a šírku medzery, pričom dáta sa dodávajú ako 20, 25, 29 alebo 31-miestny reťazec zložený iba z číslic. Explicitné výšky čiar a sledovačov existujú preto, lebo symbol nesie informáciu v tom, či je každá čiara plná, stúpajúca (ascender) alebo klesajúca (descender), a poštová čítačka závisí od toho, aby tieto výšky zodpovedali špecifikácii.
Kreslenie do stránky a meranie pre rozvrhnutie (layout)
Každé tu zobrazené volanie kreslí do obsahu aktuálne vybranej stránky, na rovnaký povrch, ktorý prijíma váš text a obrázky, takže čiarový kód sa vytvára ako súčasť bežného generovania dokumentu a neimportuje sa ako samostatné aktívum. Keďže symboly sú vektorovým obsahom, dáta, ktoré kódujú, aj geometria, ktorú zaberajú, sú známe v čase kreslenia, čo vám umožňuje ich deterministické umiestnenie.
Rozvrhnutie pre lineárne rodiny ťaží z predbežného merania. GetBarcodeWidth vracia celkovú nakreslenú šírku čiarového kódu pre danú šírku úzkej čiary a typ čiarového kódu, takže si môžete vyhradiť presné horizontálne miesto predtým, než vykonáte kreslenie, namiesto hádania a zisťovania prekrytia až po zostavení stránky. 2D symboly sa umiestňujú jednoduchšie, pretože ich nakreslenú veľkosť nastavujete priamo cez SymbolSize alebo ModuleSize a symbol vyplní tento pôdorys. V oboch prípadoch je disciplína rovnaká. Rozhodnite o fyzickej veľkosti na záklase skenovacieho prostredia, potvrďte, že sa symbol zmestí do slotu, ktorý máte, a nechajte vektorovú geometriu udržať každý okraj ostrý od náhľadu na obrazovke až po finálnu tlač.
Pre širší proces tvorby stránok, do ktorého tieto čiarové kódy spadajú, techniky v našom článku o extrakcii textu, obrázkov a písiem pokrývajú spätné čítanie obsahu z PDF a sprievodca spájaním a rozdeľovaním veľkých PDF s priamym prístupom ukazuje, ako efektívne skladať veľkoobjemové dokumenty. Obe témy sa prirodzene spájajú s kresliacim API opísaným tu, ktoré sa dodáva ako súčasť Delphi PDF Library pre Delphi a C++Builder spolu s API na text, grafiku, formuláre a podpisy, ktoré sú popísané inde na tomto blogu.