Bar-kod nije slika kojom ukrašavate dokument. To je merenje, a skener je instrument koji ga čita. To redefinisanje određuje skoro sve o tome kako bi trebalo da ga nacrtate u PDF-u. Linije ne nose informacije svojom crnilom; informacije žive u odnosu širine linija i širine razmaka, a čitač ih preuzima mereći vreme prelaza dok laser ili senzor prelaze preko njih. Ako stisnete tu geometriju, zamutite je ili nagomilate njene ivice, napravićete nešto što izgleda baš kao bar-kod, ali se skenira kao mrlja. HotPDF vam daje dva načina da postavite bar-kod na stranicu, a razlika između njih je upravo u tome da li kontrolišete tu geometriju ili odustajete od nje.

Šta HotPDF može da kodira
HotPDF crta linearne (jednodimenzionalne) simbologije, a taj skup je širi nego što je većini projekata potrebno. Nabrajanje THPDFBarcodeType pokriva porodicu Code 2 of 5 u njenim 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čan i prošireni; 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 još uvek aktivni u skladištima.
Ono što ne iscrtava jeste dvodimenzionalna porodica bar-kodova. Ovde nema QR-a, Data Matrix-a ili PDF417 koda. Oni kodiraju bajtove u mreži sa sopstvenom matematikom za ispravljanje grešaka, i ako vaši zahtevi navode neki od njih, ovo je pogrešan alat i to bi trebalo da znate pre nego što počnete da gradite sistem oko njega. Za jednodimenzionalne kodove praktično pitanje je uže: koja simbologija prihvata podatke koje stvarno imate, jer kodiranja nisu međusobno zamenljiva.
Ograničenja podataka su stvarna i utiču na proces 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, za to se koristi Code 39 Extended ili podskup Code 128. Code 128C pakuje dve cifre u svaki simbol radi gustine, pa zahteva isključivo numerički string parne dužine. EAN-13 očekuje dvanaest cifara i računa trinaestu kao kontrolnu; EAN-8 očekuje sedam i računa osmu; UPC-A uzima dvanaest cifara. Ako prosledite simbologiji podatke koje ne može da predstavi, nećete dobiti koristan izuzetak, već bar-kod koji kodira pogrešne podatke, što je još 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 važniji od ostalih: MUnit, širinu modula. Modul je širina najuže linije, osnovna jedinica iz koje su sve ostale mere u kodu izvedene, i ovde je izražen u tačkama (points). Sve u vezi sa tim da li će odštampani rezultat moći 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 zaslužuju detaljniji pregled. UseCheckSum dodaje kontrolnu cifru po modulu 10 koju simbologija očekuje, i za maloprodajne kodove skoro uvek želite da bude True; isključite ga samo kada vaši podaci već sadrže unapred izračunatu kontrolnu cifru, inače ćete 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 pažnju i na koordinatni početak: kao i svaki drugi poziv za crtanje u HotPDF-u, X i Y se mere u tačkama od donjeg levog ugla stranice, pri čemu Y raste nagore, što je ista konvencija koju prolazi Hello World primer.
Druga putanja je DirectDrawBarcode, koja uzima podatke i uokvirujući kvadrat (bounding box), X, Y, Width, Height, i skalira šablon linija tako da popuni tu širinu. Zgodna je za raspoređivanje kodova na mreži jer definišete prostor, a metoda prilagođava linije njemu. Ta pogodnost je ujedno i njena opasnost. Kada joj date širinu, više ne podešavate veličinu modula; metoda deli raspoloživi prostor sa brojem linija koje su potrebne podacima, a najuža linija postaje ono što proizađe iz te podele. Ako zatražite gusti Code 128 string unutar preuskog okvira, moduli će se smanjiti ispod onoga što skener može da razreši, i to u tišini. Za bilo šta što mora pouzdano da se skenira, dajte prednost DrawBarcode metodi i svesno podesite MUnit. Rezervišite DirectDrawBarcode za preglede i situacije u kojima ste izmerili da dobijene linije ostaju čitljive.
Širina modula je odluka o rezoluciji
Evo računice koja određuje da li vaša nalepnica radi. Laserski skener i kamera imaju najmanji detalj koji mogu da razlikuju, a uska linija mora biti dovoljno veća od toga nakon štampanja. Široko prihvaćena donja granica za linearne kodove opšte namene je uska linija od 13 mil (hiljaditih delova 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 tačka je 1/72 inča, otprilike 0.353 mm, tako da se širina modula od jedne tačke nalazi tačno na toj donjoj granici. Zato je MUnit := 1 najmanja vrednost kojoj bi trebalo da verujete za kod namenjen pravom skeneru, i zašto njegovo dupliranje na 2 kupuje sigurnosnu marginu koja ne košta gotovo ništa na nalepnici sa dovoljno prostora.
Sada povežite to sa izlaznom rezolucijom, jer modul mora da preživi i štampač. Na laserskom štampaču od 300 DPI, jedna tačka uređaja (device dot) je 1/300 inča, tako da je modul od jedne tačke širok oko četiri tačke uređaja. Četiri tačke su jedva dovoljne da se iscrta čista ivica; širenje tonera i blaga greška u pozicioniranju je smanjuju, pa linija koja je merila jednu tačku u vašem PDF-u može biti odštampana šire ili uže nego što specifikacija dozvoljava. Povećajte modul na 2 tačke i imaćete osam tačaka uređaja za rad, što neutrališe te smetnje. Pravilo koje vredi zapamtiti: širina modula koju podesite u tačkama mora se mapirati na ceo, komotan broj tačaka uređaja na ciljnom DPI-ju. Polovične tačke ne postoje, pa drajver štampača će zaokružiti razliku, ostavljajući vas sa linijama koje variraju u širini unutar istog koda.
Mirna zona je deo koda
Skener pronalazi bar-kod tražeći nagli prelaz sa široke, ujednačene pozadine na prvu liniju. Ta ujednačena pozadina je mirna zona (quiet zone), i ako unutar nje nacrtate tekst ili linije, skener ne može da pronađe početak šablona. Za Code 39 i Code 128 ta margina mora biti najmanje deset puta veća od širine modula ili 0.25 inča, šta god je veće. Maloprodajni UPC i EAN kodovi su još stroži i zahtevaju specifične margine sa leve i desne strane kako bi se sprečilo da se ivica nalepnice očita kao linija.
Kod u nastavku prikazuje kako da izračunate tu marginu u tačkama. Kada postavljate više kodova ili poravnavate jedan sa tekstom, koristite izračunatu marginu umesto nagađanja.
function GetQuietZonePoints(const CodeType: THPDFBarcodeType; const MUnitPoints: Double): Double;
begin
case CodeType of
bcCode39, bcCode128:
// 10x module width or 0.25 inches (18 points), whichever is larger
if (MUnitPoints * 10) > 18.0 then
Result := MUnitPoints * 10
else
Result := 18.0;
bcCodeEAN13:
// EAN-13 wants 9x module on the left, 7x on the right; pad to 9x
Result := MUnitPoints * 9;
else
Result := 18.0; // safe default
end;
end;
Primetite da se margina dodaje koordinati koja se prosleđuje metodi DrawBarcode. Metoda ne dodaje prazan prostor (padding) interno; ona postavlja prvu liniju tačno na X, tako da mirna zona mora postojati u praznom prostoru koji ostavite levo od te koordinate.
Boja, kontrast i zašto crvena boja ne uspeva
Poslednji parametri metode DrawBarcode podešavaju boje linija i pozadine. Iako HotPDF prihvata bilo koji TColor, zahtev je jednostavan: visok kontrast. Crne linije na beloj pozadini pružaju maksimalni mogući kontrast, i to podrazumevano pravilo treba prekršiti samo kada vas smernice brenda na to primoravaju.
Ako morate da koristite boju, zapamtite kako skeneri bar-kodova rade. Većina linearnih skenera koristi crveni izvor svetlosti (obično oko 630-670 nm). Za crveni laser, crveno mastilo reflektuje svetlost baš kao i bela pozadina. Nacrtajte crvene linije na beloj nalepnici i skener će videti jednobojni beli blok. Nacrtajte crne linije na crvenoj nalepnici i on će videti jednobojni crni blok. U oba slučaja skeniranje ne uspeva. Plave, zelene i tamnosmeđe linije reflektuju vrlo malo crvene svetlosti, pa se uspešno skeniraju na beloj ili žutoj pozadini. Ipak, najsigurniji izbor je onaj koji radi već pedeset godina: crno na belom.
Pozivi DrawBarcode i DirectDrawBarcode prikazani ovde deo su HotPDF komponente za Delphi i C++Builder.