Technical Article

Generiranje čitljivih barkodova u PDF-u s HotPDF-om u Delphiju

Barkod nije samo slika kojom ukrašavate dokument. To je mjera, a skener je instrument koji je čita. Taj pristup odlučuje o gotovo svemu u vezi s načinom na koji biste ga trebali nacrtati u PDF-u. Same crne linije ne nose informacije; informacije žive u omjeru širina crnih linija i razmaka između njih, a čitač ih prepoznaje mjerenjem vremena prijelaza dok laser ili senzor prelazi preko njih. Stisnite tu geometriju, zamutite je ili nagurajte njezine margine i dobit ćete nešto što izgleda točno kao barkod, ali se skenira kao mrlja. HotPDF vam daje dva načina za postavljanje barkoda na stranicu, a razlika između njih je upravo razlika između kontrole te geometrije i odustajanja od nje.

Linearne simbologije barkodova nacrtane u jednom PDF-u pomoću HotPDF-a
Linearne simbologije barkodova nacrtane u jednom PDF-u pomoću HotPDF-a.

Što HotPDF može kodirati

HotPDF crta linearne (jednodimenzionalne) simbologije, a njihov je skup širi nego što je većini projekata potrebno. Enumeracija THPDFBarcodeType pokriva obitelj Code 2 of 5 u njezinim isprepletenim (interleaved), industrijskim i matričnim oblicima; Code 39 i njegovu proširenu varijantu; tri podskupa Code 128 (A, B i C); Code 93 obični i prošireni; MSI; PostNet; Codabar; maloprodajnu skupinu UPC i EAN, odnosno EAN-8, EAN-13, UPC-A, sažete UPC-E0 i UPC-E1 te UPC dodatke od 2 i 5 znamenki; i podskupove GS1-128 (EAN-128). To je dovoljno za pokrivanje etiketa u lancu opskrbe, maloprodajnih blagajni i starijih industrijskih kodova koji su još uvijek u upotrebi u skladištima.

Ono što HotPDF ne crta je dvodimenzionalna obitelj kodova. Ovdje nema QR-a, Data Matrixa ili PDF417. Oni kodiraju bajtove u mrežu s vlastitom matematikom ispravljanja pogrešaka, pa ako vaši zahtjevi navode jedan od njih, ovo je pogrešan alat i to biste trebali znati prije nego što počnete graditi rješenje oko njega, a ne nakon toga. Za jednodimenzionalne kodove praktično je pitanje uže: koja simbologija prihvaća podatke koje zapravo imate, jer kodiranja nisu međusobno zamjenjiva.

Ograničenja podataka su stvarna i stvaraju probleme u trenutku generiranja. Varijante Code 2 of 5 i MSI prihvaćaju samo znamenke. Code 39 prenosi velika slova, znamenke i nekoliko znakova interpunkcije; ako trebate mala slova ili puni ASCII raspon, to je Code 39 Extended ili podskup Code 128. Code 128C pakira dvije znamenke u svaki simbol radi gustoće, pa zahtijeva numerički niz parne duljine i ništa drugo. EAN-13 očekuje dvanaest znamenki i izračunava trinaestu kao kontrolnu; EAN-8 očekuje sedam i izračunava osmu; UPC-A prima dvanaest znamenki. Ako simbologiji proslijedite podatke koje ne može prikazati, nećete dobiti korisnu iznimku, već barkod koji kodira smeće, što je još gore jer izgleda u redu sve dok ga netko ne skenira na blagajni.

Dva puta iscrtavanja, dvije razine kontrole

Metoda koju treba koristiti u produkciji je DrawBarcode na objektu stranice. Ona prima simbologiju, položaj, visinu i jedan parametar koji je važniji od ostalih: MUnit, širinu modula. Modul je širina najuže crne linije, osnovna jedinica iz koje su izvedene sve ostale mjere u kodu, a ovdje je izražen u točkama. Sve o tome hoće li se ispisani rezultat uspješno skenirati svodi se na taj jedan cijeli broj.

Dva argumenta zaslužuju detaljniji pregled. UseCheckSum dodaje kontrolnu znamenku modulo-10 koju simbologija očekuje, a za maloprodajne kodove gotovo je uvijek želite postaviti na True; isključite je samo kada vaši podaci već sadrže unaprijed izračunatu kontrolnu znamenku, inače ćete dobiti dvostruku znamenku. Boje linija i pozadine su posljednja dva parametra, a napast da tu budete kreativni je zamka o kojoj se govori u nastavku. Također pripazite na ishodište koordinatnog sustava: kao i svaki drugi poziv za crtanje u HotPDF-u, X i Y mjere se od donjeg lijevog kuta stranice u točkama, s Y koji raste prema gore, što je ista konvencija objašnjena u Hello World primjeru.

Drugi put je DirectDrawBarcode, koji prima podatke i okvir ograničenja (bounding box) X, Y, širinu, visinu te skalira uzorak crnih linija kako bi ispunio tu širinu. To je prikladno za raspoređivanje kodova na mreži jer odredite prostor, a metoda prilagođava crne linije tom prostoru. Ta je praktičnost ujedno i opasnost. Kada mu zadate širinu, više ne postavljate veličinu modula; metoda dijeli prostor koji dopustite na broj linija koje podaci zahtijevaju, pa najuža crta postaje ono što proizađe iz tog dijeljenja. Ako zatražite gusti Code 128 niz unutar preuskog okvira, moduli će se tiho smanjiti ispod onoga što skener može razlučiti. Za sve što se mora pouzdano skenirati, dajte prednost metodi DrawBarcode i namjerno postavite MUnit. Rezervirajte DirectDrawBarcode za preglede i rasporede gdje ste provjerili da dobivene crne linije ostaju čitljive.

Širina modula je odluka o razlučivosti

Evo matematike koja određuje hoće li vaša naljepnica raditi. Laserski skener i kamera imaju najmanju značajku koju mogu razlikovati, a uska linija nakon ispisa mora biti znatno iznad te granice. Široko prihvaćena donja granica za linearne kodove opće namjene je uska linija od 13 mil (tisućinki inča), oko 0,33 mm, a mnogi maloprodajni i industrijski vodiči to tretiraju kao minimum, a ne kao cilj. Prevedite to u PDF jedinice: jedna točka je 1/72 inča, otprilike 0,353 mm, pa širina modula od jedne točke stoji točno na toj donjoj granici. Zato je MUnit := 1 najmanja vrijednost kojoj biste trebali vjerovati za kod namijenjen stvarnom skeneru, a njezino udvostručavanje na 2 osigurava sigurnosnu marginu koja ne košta gotovo ništa na naljepnici s dovoljno prostora.

Sada to povežite s izlaznom razlučivosti, jer modul mora preživjeti i ispis na pisaču. Na laserskom pisaču od 300 DPI, jedna točka uređaja je 1/300 inča, pa je modul od jedne točke širok oko četiri točke pisača. Četiri točke jedva su dovoljne za prikaz čistog ruba; širenje tonera i male pogreške u pozicioniranju je nagrizaju, pa se crna linija koja je u vašem PDF-u mjerila jednu točku može ispisati deblja ili tanja nego što specifikacija dopušta. Povećajte modul na 2 točke i imat ćete osam točaka za rad, što apsorbira te smetnje. Pravilo koje vrijedi usvojiti: širina modula koju postavite u točkama mora se mapirati u cijeli, ugodan broj točaka uređaja pri vašoj stvarnoj razlučivosti ispisa, a ne razlučivosti koju biste željeli imati. Barkod koji se besprijekorno skenira sa zaslona, a ne radi na skladišnom pisaču, gotovo je uvijek pao na ovoj provjeri.

Prazan prostor (quiet zone) je dio simbola

Jedini najčeći razlog zašto se ispravno kodiran barkod neće skenirati je prazan prostor (quiet zone), prazna margina sa svake strane crnih linija. Skeneri koriste tu prazninu kako bi pronašli gdje kod počinje i završava; bez nje čitač ne može razlikovati prvu liniju od onoga što se nalazi pokraj nje na stranici. Standardi su specifični. Većina linearnih simbologija zahtijeva prazan prostor od najmanje deset puta veći od širine modula sa svake strane, a maloprodajni kodovi UPC i EAN zahtijevaju devet modula s lijeve i sedam s desne strane. S modulom od jedne točke to je otprilike deset točaka (oko sedmine inča) zajamčenog bijelog prostora koji okružuje crne linije.

HotPDF crta linije i ništa drugo. Ne rezervira prazan prostor za vas, što znači da je odgovornost vaša i lako se zaboravlja. Način neuspjeha je suptilan: postavite barkod tik uz obrub ćelije tablice ili dopustite da raspored stranice nagura logotip odmah pokraj njega, pa kod koji je prošao svaki test na praznoj stranici prestane raditi čim se nađe unutar stvarnog dokumenta. Eksplicitno planirajte marginu. Prije nego što pozovete DrawBarcode, ostavite najmanje deset širina modula slobodnog prostora s obje strane, i tretirajte svaku grafiku, crtu ili tekst koji ulazi u taj pojas kao pogrešku, a ne kao estetski izbor.

Boja, kontrast i tekst čitljiv ljudima

Boje linija i pozadine postoje kako biste ih mogli uskladiti s paletom brenda, ali one su najbrži način da pokvarite ispravan kod. Skeneri čitaju kontrast, obično crvenim svjetlom, i očekuju tamne linije na svijetloj pozadini. Crno na bijelom je jedina kombinacija koju biste trebali odabrati bez prethodnog testiranja. Tamnoplava ili tamnozelena na bijelom mogu proći; bilo što s niskim kontrastom svjetline, a posebno crvene linije koje skener s crvenim svjetlom vidi kao pozadinu, neće raditi. Ako dizajner zatraži barkodove u boji, iskren odgovor je da linije moraju ostati crne, a boja može ići negdje drugdje na etiketi.

Metoda DrawBarcode također može prikazati tekst čitljiv ljudima ispod crnih linija, što su znamenke koje blagajnik utipka kada skeniranje ne uspije. Taj tekst je alternativa (fallback), a ne ukras, pa kada postavljate vlastiti natpis držite ga podalje od praznog prostora; oznaka simbologije nagurana u bočnu marginu uništava isti onaj prazni prostor o kojem ovisi skener. Polja u ovom primjeru, uključujući TextOut za sve okolne natpise, isti su pozivi za crtanje obuhvaćeni vodičem za izradu izvještaja, što je pravo mjesto za posjetiti kada je barkod samo jedan element na većoj sastavljenoj stranici.

Kratka navika provjere

Vektorske linije su prednost koju vrijedi spomenuti. Budući da DrawBarcode zapisuje kod kao PDF operatore crtanja, a ne kao rasteriziranu sliku, linije ostaju oštre pri svakom zumiranju i datoteka nema vlastitu razlučivost; jedina razlučivost koja je važna je ona pisača. To vas ne oslobađa testiranja, to samo znači da se test mora provesti na papiru. Generirajte uzorak, ispišite ga na uređaju s najnižom razlučivosti s kojom će se vaši kodovi stvarno susresti, i skenirajte ga istom klasom čitača koju drže vaši korisnici, a ne vrhunskim uređajem na vašem stolu. Provjerite prazne prostore ravnalom na ispisu, potvrdite da je širina modula preživjela pretvorbu iz točaka u ispisne točke i provjerite odgovara li dekodirana vrijednost onoj koju ste kodirali, uključujući kontrolnu znamenku. Pet minuta sa stvarnim skenerom otkriva svaki gore opisani neuspjeh, i to prije nego što se to dogodi s cijelom paletom pogrešno označenih zaliha.

Metode DrawBarcode i DirectDrawBarcode prikazane ovdje dio su HotPDF komponente za Delphi i C++Builder.