Tehnički članak

Generisanje skenabilnih bar-kodova u PDF-u pomocu HotPDF-a u Delphi-ju

Bar-kod nije slika kojom ukrašavate dokument. To je merenje, a skener je instrument koji ga cita. To redefinisanje odreduje gotovo sve o tome kako bi trebalo da ga nacrtate u PDF-u. Linije ne nose informacije svojom crnilom; informacije zive u odnosu sirina linija i sirina razmaka, a citac ih preuzima mereci vreme prelaza dok laser ili senzor prelaze preko njih. Ako stisnete tu geometriju, zamutite je ili nagomilate njene margine, napravicete nesto sto izgleda bas kao bar-kod i skenira se kao mrlja. HotPDF vam daje dva nacina da postavite bar-kod na stranicu, a razlika izmedju njih je upravo u tome da li kontrolisete tu geometriju ili odustajete od nje

PDF stranica koja prikazuje mrezu linearnih bar-kodova u razlicitim simbologijama nacrtanih pomocu HotPDF-a u Delphi-ju
Linearne simbologije bar-kodova nacrtane u jednom PDF-u pomocu HotPDF-a

Sta HotPDF moze da kodira

HotPDF crta linearne (jednodimenzionalne) simbologije, a taj skup je siri nego sto je vecini projekata potrebno. Nabrajanje THPDFBarcodeType pokriva porodicu Code 2 of 5 u njenim isprepleteNIM (interleaved), industrijskim i matricnim oblicima; Code 39 i njegovu prosirenu varijantu; tri podskupa Code 128 (A, B i C); Code 93 obican i prosireni; MSI; PostNet; Codabar; maloprodajnu UPC i EAN grupu, odnosno EAN-8, EAN-13, UPC-A, kompresovane UPC-E0 i UPC-E1, kao i dopunske dvocifrene i petocifrene UPC dodatke; i podskupove GS1-128 (EAN-128). To je dovoljno da pokrije oznake u lancu snabdevanja, maloprodajna mesta i starije industrijske kodove koji su jos uvek aktivni u skladistima

Ono sto ne iscrtava jeste dvodimenzionalna porodica bar-kodova. Ovde nema QR-a, Data Matrix-a ili PDF417 koda. Oni kodiraju bajtove u mrezi sa sopstvenom matematikom za ispravljanje gresaka, i ako vasi zahtevi navode neki od njih, ovo je pogresan alat i to bi trebalo da znate pre nego sto pocnete da gradite sistem oko njega, a ne nakon toga. Za jednodimenzionalne kodove prakticno pitanje je uze: koja simbologija prihvata podatke koje zaista imate, jer kodiranja nisu medusobno zamenljiva

Ogranicenja podataka su stvarna i udaraju u vreme generisanja. Varijante Code 2 of 5 i MSI prihvataju samo cifre. Code 39 prenosi velika slova, cifre i nekoliko znakova interpunkcije; ako su vam potrebna mala slova ili pun ASCII opseg, to je Code 39 Extended ili podskup Code 128. Code 128C pakuje dve cifre u svaki simbol radi gustine, pa zahteva iskljucivo numericki string parne duzine. EAN-13 ocekuje dvanaest cifara i racuna trinaestu kao kontrolnu; EAN-8 ocekuje sedam i racuna osmu; UPC-A uzima dvanaest cifara. Prosledite simbologiji podatke koje ne moze da predstavi i necete dobiti koristan izuzetak, vec bar-kod koji kodira pogresne podatke, sto je jos gore, jer izgleda u redu sve dok ga neko ne skenira na kasi

Dve putanje iscrtavanja, dva nivoa kontrole

Metoda koju treba koristiti u produkciji je DrawBarcode na objektu stranice. Ona uzima simbologiju, poziciju, visinu i jedan parametar koji je vazniji od ostalih: MUnit, sirinu modula. Modul je sirina najuze linije, osnovna jedinica iz koje su sve ostale mere u kodu izvedene, i ovde je izrazen u tackama. Sve u vezi sa time da li ce odstampani rezultat moci da se skenira svodi se na taj jedan ceo broj

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 argumenta zasluzuju blizi pregled. UseCheckSum dodaje kontrolnu cifru po modulu 10 koju simbologija ocekuje, i za maloprodajne kodove skoro uvek zelite da bude True; iskljucite ga samo kada vasi podaci vec sadrze unapred izracunatu kontrolnu cifru, inace cete dobiti dvostruku cifru. Boje linija i pozadine su poslednja dva parametra, a iskušenje da tu budete kreativni je zamka o kojoj se govori u nastavku. Obratite paznju i na koordinatni pocetak: kao i svaki drugi poziv za crtanje u HotPDF-u, X i Y se mere u tackama od donjeg levog ugla stranice, pri cemu Y raste nagore, ista konvencija koju primer Hello World prolazi

Druga putanja je DirectDrawBarcode, koja uzima podatke i uokvirujuci kvadrat, X, Y, Width, Height, i skalira sablon linija tako da popuni tu sirinu. Zgodna je za raspored kodova na mrezi jer definisete prostor, a metoda prilagodava linije njemu. Ta pogodnost je ujedno i njena opasnost. Kada joj date sirinu, vise ne podesavate velicinu modula; metoda deli raspolozivi prostor sa brojem linija koje su potrebne podacima, a najuza linija postaje ono sto propadne iz te podele. Zatrazite gusti Code 128 string unutar preuskog okvira i moduli ce se smanjiti ispod onoga sto skener moze da razresi, tiho. Za bilo sta sto mora pouzdano da se skenira, dajte prednost metodi DrawBarcode i svesno podesite MUnit. Rezervisite DirectDrawBarcode za preglede i za rasporede gde ste izmerili da dobijene linije ostaju citljive

Sirina modula je odluka o rezoluciji

Evo racunice koja odreduje da li vasa nalepnica radi. Laserski skener i kamera imaju najmanji detalj koji mogu da razlikuju, a uska linija mora biti dovoljno iznad toga nakon stampanja. Siroko prihvacena donja granica za linearne kodove opste namene je uska linija od 13 mil, oko 0.33 mm, a mnogi maloprodajni i industrijski vodici to tretiraju kao minimum, a ne kao cilj. Prevedite to u PDF jedinice: jedna tacka je 1/72 inca, priblizno 0.353 mm, tako da se sirina modula od jedne tacke nalazi tacno na toj donjoj granici. Zato je MUnit := 1 najmanja vrednost kojoj bi trebalo da verujete za kod namenjen pravom skeneru, i zasto njeno dupliranje na 2 kupuje sigurnosnu marginu koja ne kosta gotovo nista na nalepnici sa dovoljno prostora

Sada povezite to sa izlaznom rezolucijom, jer modul mora da prezivi i stampac. Na laserskom stampаcu od 300 DPI jedna tacka uredaja je 1/300 inca, tako da je modul od jedne tacke sirok oko cetiri tacke uredaja. Cetiri tacke su jedva dovoljne da se iscrta cista ivica; sirenje tonera i blaga greska u pozicioniranju ih smanjuju, pa linija koja je merila jednu tacku u vasem PDF-u moze biti odstampana sire ili uze nego sto specifikacija dozvoljava. Povecajte modul na 2 tacke i imacete osam tacaka uredaja za rad, sto neutralise tu buku. Pravilo koje vredi zapamtiti: sirina modula koju podesite u tackama mora se mapirati na ceo, komotan broj tacaka uredaja na vasoj stvarnoj stamparskoj rezoluciji, ne onoj koju biste zeleli da imate. Kod koji se besprekorno skenira sa ekrana i ne uspeva sa stampaca skladista gotovo uvek nije prosao ovu proveru

Mirna zona je deo simbola

Jedan od najcescih razloga zasto ispravno kodiran bar-kod nece biti skeniran je mirna zona, prazna margina sa svake strane linija. Skeneri koriste tu prazninu da pronadu gde kod pocinje i zavrsava; bez nje citac ne moze da razlikuje prvu liniju od onoga sto se nalazi pored nje na stranici. Standardi su specificni. Vecina linearnih simbologija zahteva mirnu zonu od najmanje deset puta sirine modula sa svake strane, a maloprodajni UPC i EAN kodovi zahtevaju devet modula sa leve i sedam sa desne strane. Sa modulom od jedne tacke to je priblizno deset tacaka, oko sedmine inca, garantovanog belog prostora koji flankirа linije

HotPDF crta linije i nista drugo. On ne rezervise mirnu zonu umesto vas, sto znaci da je odgovornost vasa i lako je zaboraviti. Nacin na koji to propada je suptilan: postavite bar-kod uz ivicu celije tabele, ili neka raspored stranice gurne logo pored njega, i kod koji je prosao sve testove na praznoj stranici prestaje da se skenira u trenutku kada se isporuci unutar pravog dokumenta. Planirajte marginu eksplicitno. Pre nego sto pozovete DrawBarcode, ostavite najmanje deset sirina modula cistog prostora sa obe strane, i tretirajte svaku grafiku, liniju ili tekst koji zalazi u tu zonu kao defekt, a ne kao kozmeticki izbor

Boja, kontrast i red sa tekstom koji se moze procitati

Boje linija i pozadine postoje kako biste mogli da uskladite paletu brendа, i to je najbrzi nacin da unistite funkcionalni kod. Skeneri citaju kontrast, klasicno crvenim svetlom, i ocekuju tamne linije na svetlom polju. Crno na belom je jedina kombinacija kojoj bi trebalo da posegnete bez testiranja. Tamno plava ili tamno zelena na beloj pozadini mogu proci; bilo sta sa niskim kontrastom luminancije, a posebno crvene linije, koje crveni laser vidi kao pozadinu, nece. Ako dizajner trazi obojene bar-kodove, iskren odgovor je da linije ostaju crne, a boja ide negde drugde na nalepnici

Putanja DrawBarcode moze takode prikazati tekst koji se moze procitati ispod linija, cifre koje sluzbenik unosi rucno kada skeniranje ne uspe. Taj tekst je rezervni plan, ne dekoracija, pa kada postavljate sopstveni natpis drzite ga dalje od mirne zone; natpis simbologije uguran u bočnu marginu porazi isti prazni prostor od kojeg skener zavisi. Polja u ovom primeru, ukljucujuci TextOut za bilo koje okolne natpise, isti su pozivi za crtanje obradeni u vodicu za izlaz izvestaja, koji je pravo mesto kada je bar-kod jedan element u vecoj kompoziciji stranice

Kratka navika verifikacije

Vektorske linije su prednost koju vredi pomenuti. Posto DrawBarcode pise kod kao PDF operatore crtanja, a ne kao rasterizoanu sliku, linije ostaju ostре pri bilo kom uvecanju i fajl nema sopstvenu rezoluciju; jedina rezolucija koja je vazna je ona stampaca. To vas ne oslobada od testiranja, samo znaci da testiranje mora da se dogodi na papiru. Generisiite uzorak, odstampajte ga na uredaju najnize rezolucije sa kojim ce vasi kodovi zaista biti koristeni, i skenirajte ga sa istom klasom citaca koji vasi korisnici drze, a ne skupim imidzerom na vasem stolu. Proverite mirne zone lenjinom na otisak, potvrdite da je sirina modula prezivela put od tacaka do tacaka uredaja, i proverite da dekodirani vrednost odgovara onome sto ste kodirali, ukljucujuci kontrolnu cifru. Pet minuta sa pravim skenerom otkriva svaki kvar opisan gore, i otkriva ih pre nego sto to ucini paleta pogresno oznacene robe

Metode DrawBarcode i DirectDrawBarcode prikazane ovde deo su HotPDF komponente za Delphi i C++Builder