Črtna koda na odpremno nalepki ali računu ima eno samo nalogo: bralnik jo mora prebrati v prvem poskusu. Ali bo ta poskus uspel, pa se odloči že dolgo preden paket prispe na nakladalno rampo. Odvisno je od tega, kako je bil simbol postavljen na stran. Najpogostejša napaka v cevovodu za poročanje v Delphiju je upodabljanje črtne kode kot bitne slike nekje drugje in njena postavitev v PDF. Na zaslonu je videti v redu pri eni stopnji povečave, nasto pa se njena kakovost poslabša povsod drugod.
Alternativa je risanje simbola kot vektorske vsebine neposredno na stran. PDFlibPas za to ponuja družino risalnih klicev, ki pokrivajo 2D matrične simbole QR, PDF417 in DataMatrix, linearne družine preko Code128 in GS1-128, ter USPS Intelligent Mail za avtomatizacijo pošte. Argument za vektorje ni estetske narave. Gre za to, ali črte pristanejo tam, kjer jih bralnik pričakuje.
Zakaj vektorji premagajo nameščeno bitno sliko
Črtna koda je vzorec črt in presledkov, v dveh dimenzijah pa mreža temnih in svetlih modulov. Dekodirnik deluje z merjenjem razmerja teh širin. Vse, kar popači ta razmerja, je šum, ki zmanjšuje proračun za napake simbola. Rasterizirana slika črtne kode vsebuje fiksne slikovne pike. Ko se PDF upodablja na tiskalniku, katerega pike se ne delijo enakomerno v mrežo slike, mora rasterizator izvesti ponovno vzorčenje, robovi modulov, ki bi morali biti ostri, pa se porazdelijo čez dve slikovni piki naprave. Ozkega črta se lahko odebeli, sosednji prostor se lahko stanša, razmerje širin, na katerega se zanaša dekodirnik, pa se zamakne.
Narisan kot vektorska vsebina je isti simbol niz zapolnjenih pravokotnikov, opisanih v koordinatah PDF. Ni fiksne mreže slikovnih pik, s katero bi se morali boriti. Ob tiskanju naprava izriše vsak pravotnik v dejanski ločljivosti, ki jo ima, zato je vsak rob modula tako oster, kot strojna oprema dopušča, pri kateri koli lestvici in velikosti tiska. Povečajte vektorski simbol za paletno nalepko ali ga pomanjšajte za paket in geometrija ostane natančna. Ta natančnost ohranja visoko stopnjo branja v prvem poskusu, kar je sploh namen postavitve črtne kode na stran.
Kodi QR in štiri ravni popravkov
QR je 2D matrični simbol, ki se bere v obeh oseh hkrati, zato stisne veliko podatkov v majhen kvadrat. Njegova odpornost proti poškodbam izhaja iz Reed-Solomonovega popravljanja napak, ki je na voljo na štirih ravneh. Raven L obnovi približno 7 odstotkov kodnih besed, M približno 15 odstotkov, Q približno 25 odstotkov in H približno 30 odstotkov. Višji popravek ni brezplačen. Obnovitvene kodne besede zasedajo zmogljivost modulov, zato pri fiksni količini podatkov višja raven sili v gostejši ali physically večji simbol.
Kompromis je vprašanje o okolju, v katerem bo simbol živel. Čist digitalni dokument, ki se bo skeniral le z zaslona, lahko uporablja raven L in ostane kompakten. Nalepka, ki bo natisnjena, prenašana, odrgnjena in morda delno prekrita s lepilnim trakom, zahteva raven Q ali H, saj dodatna redundanca omogoča dekodirniku, da rekonstruira koristno vsebino iz simbola, ki ni več brezhiben. DrawQRCode sprejme položaj in SymbolSize, ki določa narisano širino in višino, ter vrednost EncodeOptions, ki izbere podatkovni način (0 za samodejno, ali različice numeric, alphanumeric, ISO-8859-1 in UTF-8) in vrednost DrawOptions za usmerjenost.
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;
Raven popravka izbere kodirnik sam, da podatke prilagodi simbolu, ki ste ga zahtevali. Če potrebujete zajamčeno visoko raven za zahtevno okolje, velikost simbola načrtujte velikodušno, da ima kodirnik proračun modulov za porabo na redundanci, namesto da bi se moral krčiti za prilagoditev.
PDF417 za identifikacijske dokumente in odpremne nalepke
PDF417 je zložen linearni simbol. Vsaka vrstica je kratek linearni črtni kod, vrstice pa se zlagajo v blok, zato se pojavlja na vozniških dovoljenjih, prepustnicah za vkrcanje in prevoznih nalepkah, kjer mora širši pas podatkov sedeti v pravokotni obliki. Njegovo popravljanje napak poteka na lestvici od 0 do 8. Vsak korak približno podvoji število popravljalnih kodnih besed, tako da raven 5 prinaša veliko več redundance kot raven 1, na račun večjega števila kodnih besed na strani.
Oblika bloka PDF417 je prilagodljiva, kar je pomembno, ker ima nalepka fiksno območje za zapolnitev. Metoda DrawPDF417SymbolEx ponuja nadzorne elemente, ki jih osnovni klic ne vsebuje. FixedColumns in FixedRows določata število podatkovnih stolpcev in vrstic, pri čemer 0 pomeni, naj se odloči kodirnik. ErrorLevel sprejme -1 za samodejno ali eksplicitno vrednost od 0 do 8. ModuleSize je širina najožjega elementa v trenutni merski enoti, HeightWidthRatio pa določa, kako visok je vsak modul glede na svojo širino, s čimer naredite blok kratek in širok ali visok in ozek, da ustreza prostoru, ki ga imate.
// 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
Določanje števila stolpcev je običajen vzvod pri predlogah nalepk. Konstantno število stolpcev daje bloku predvidljivo širino, zato se okoliška postavitev ne spreminja, ko se spreminja dolžina kodirane vsebine od enega dokumenta do drugega, medtem ko kodirnik dodaja vrstice navzdol, da absorbira razliko.
DataMatrix za majhne oznake
DataMatrix je simbol, po katerem posežemo, ko mora biti oznaka majhna. Gre za kompaktno 2D mrežo, ki uporablja ECC 200, sodobno Reed-Solomonovo shemo, in ostaja čitljiva pri velikostih, kjer bi bil simbol QR za iste podatke neroden. Zato je standardna izbira za neposredno označevanje delov, majhne elektronske komponente in goste logistične nalepke.
Metoda DrawDataMatrixSymbol sprejme ModuleSize za korak pik, Encoding z vrednostjo 1 za ASCII in SymbolSize, ki je bodisi 0 za samodejno ali ena od standardnih kvadratnih in pravokotnih dimenzij od 10x10 do 132x132. Parameter Options združuje usmerjenost s širino mirnega območja (quiet zone), kjer prištevanje od 100 do 400 določa bel rob v širini od enega do štirih modulov. Mirno območje ni okras. Dekodirnik potrebuje ta čist rob, da najde vzorec iskalnika simbola, simbol, stisnjen ob drugo črnilo, pa je simbol, ki ga ni mogoče prebrati.
// 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
Kje še vedno vladajo 1D črtne kode
Dvodimenzionalni simboli pritegnejo pozornost, vendar linearne črtne kode še vedno obvladujejo večji del maloprodaje in logistike, razlog pa je nameščena baza laserskih čitalnikov, ki berejo z enim zamahom. Code128 is delovni konj za alfanumerične podatke, njegova učinkovitost pa izhaja iz treh naborov znakov. Nabor A pokriva kontrolne znake in velike črke, nabor B pokriva celoten tiskalni obseg ASCII, nabor C pa je tisti, ki je pomemben za številke. Podnabor C kodira par števk v enem samem simbolu znaka, zato zaporedje številskih podatkov porabi pol manj simbolnih znakov kot v naboru A ali B. To je najbolj kompakten način za zapis dolge številčne črtne kode, implementacija Code128 v PDFlibPas pa samodejno združuje nabora B in C, da to doseže.
GS1-128, standard, prej imenovan EAN-128, gradi na Code128 z prenašanjem identifikatorjev uporabe (Application Identifiers), to so predpone v oklepajih, ki sprejemnemu sistemu povedo, ali so naslednje števke serijska številka, koda serije ali rok uporabnosti. Izpeljava se označi z znakom FNC1, posebnim nepodatkovnim znakom, ki označuje simbol kot kodiran po standardu GS1 in ločuje polja spremenljive dolžine. V knjižnici PDFlibPas narišete simbol GS1-128 z metodo DrawBarcode z uporabo vrste Code128 in literala [FNC1], ki ga postavite v podatkovni niz tam, kjer se začne posamezen identifikator uporabe.
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;
Za pošto USPS Intelligent Mail, imenovan tudi OneCode, kodira podatke o usmerjanju in sledenju v eni sami višinsko modulirani črtni kodi za avtomatizacijo pošte. Metoda DrawIntelligentMailBarcode sprejme eksplicitno geometrijo za širino črte, celotno višino črte, višino sledilnika (tracker height) in širino presledka, pri čemer so podatki podani kot niz s 20, 25, 29 ali 31 števkami. Eksplicitne višine črt in sledilnikov obstajajo zato, ker simbol prenaša informacije o tem, ali je posamezna črta polna črta, dvigalka (ascender) ali spustalka (descender), poštni bralnik pa je odvisen od teh višin, ki morajo ustrezati specifikaciji.
Risanje na stran in merjenje za postavitev
Vsak klic, prikazan tukaj, riše v vsebino trenutno izbrane strani, to je isto površino, ki prejme vaše besedilo in slike, zato se črtna koda ustvari kot del običajnega generiranja dokumenta in ne kot uvoženo sredstvo. Ker so simboli vektorska vsebina, so podatki, ki jih kodirajo, in geometrija, ki jo zasedajo, znani ob času risanja, kar vam omogoča deterministično postavljanje.
Pri postavitvi za linearne družine je koristno najprej opraviti meritev. Metoda GetBarcodeWidth vrne celotno narisano širino črtne kode za določeno širino ozke črte in vrsto črtne kode, tako da lahko rezervirate natančen vodoravni prostor, preden izvedete risanje, namesto da ugibate in odkrijete prekrivanje po tem, ko je stran že zgrajena. Simbole 2D je enostavneje postaviti, ker nastavite njihovo narisano velikost neposredno prek parametra SymbolSize ali ModuleSize, simbol pa zapolni ta odtis. V vsakem primeru je disciplina enaka. Določite fizično velikost iz okolja skeniranja, potrdite, da se simbol prilega režo, ki jo imate, in pustite, da vektorska geometrija ohrani vsak rob oster od predogleda na zaslonu do končnega tiska.
Za širši delovni tok gradnje strani, v katerega se umeščajo te črtne kode, tehnike v našem članku o ekstrakciji besedila, slik in pisav pokrivajo branje vsebine nazaj iz PDF, vodnik za združevanje in deljenje velikih PDF z neposrednim dostopom pa prikazuje, kako učinkovito sestaviti obsežne dokumente. Oboje se naravno ujema z risalnim vmesnikom API, opisanim tukaj, ki se dostavlja kot del knjižnice Delphi PDF Library za Delphi in C++Builder, skupaj z vmesniki API za besedilo, grafiko, obrazce in podpise, ki so obravnavani drugje na tem blogu.