Bar-kod nije slika kojom se ukrašava dokument. To je mjerenje, a skener je instrument koji ga očitava. Ta promjena gledišta određuje gotovo sve o tome kako biste ga trebali iscrtati u PDF. Linije ne nose informaciju svojom crninom; informacija leži u omjeru širina linija naspram širina praznina, a čitač je oporavlja mjereći vrijeme prijelaza dok laser ili senzor prelazi preko njih. Stisnete li tu geometriju, zamutite je ili joj natrpate margine, dobit ćete nešto što izgleda potpuno kao bar-kod, a skenira se kao mrlja. HotPDF vam nudi dva načina postavljanja bar-koda na stranicu, a razlika među njima točno je razlika između kontroliranja te geometrije i njezina prepuštanja slučaju

Što HotPDF može kodirati
HotPDF iscrtava linearne (jednodimenzionalne) simbolike, a taj je skup širi nego što većini projekata treba. Enumeracija THPDFBarcodeType obuhvaća porodicu Code 2 of 5 u njezinu isprepletenom, industrijskom i matričnom obliku; Code 39 i njegovu proširenu inačicu; 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 dodatne UPC dodatke od 2 i 5 znamenki; i podskupove GS1-128 (EAN-128). To je dovoljno za naljepnice u opskrbnom lancu, maloprodajna prodajna mjesta, i starije industrijske kodove koji su još uvijek u uporabi u skladištima
Ono što ne iscrtava je dvodimenzionalna porodica. Ovdje nema QR-a, Data Matrixa ni PDF417. Oni kodiraju bajtove u mreži uz vlastitu matematiku ispravljanja pogrešaka, i ako zahtjev traži jedan od njih, ovo je pogrešan alat, i to biste trebali znati prije nego počnete graditi oko toga, a ne poslije. Za jednodimenzionalne kodove praktično je pitanje uže: koja simbolika prihvaća podatke koje zapravo imate, jer kodiranja nisu međusobno zamjenjiva
Ograničenja podataka su stvarna i osjete se u trenutku generiranja. Varijante Code 2 of 5 i MSI primaju samo znamenke. Code 39 nosi velika slova, znamenke i pregršt interpunkcijskih znakova; ako trebate mala slova ili puni raspon ASCII-a, to je Code 39 Extended ili neki podskup Code 128. Code 128C pakira dvije znamenke u svaki simbol radi gustoće, pa traži 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. Predate li simbolici podatak koji ne može prikazati, ne dobivate koristan izuzetak, dobivate bar-kod koji kodira smeće, što je gore, jer izgleda ispravno sve dok ga netko ne skenira na blagajni
Dva puta iscrtavanja, dvije razine kontrole
Metoda po koju posegnuti u produkciji je DrawBarcode, na objektu stranice. Ona uzima simboliku, poziciju, visinu, i jedan parametar koji je važniji od svih ostalih: MUnit, širinu modula. Modul je širina najuže linije, atom čiji je umnožak svaka druga mjera u kodu, a ovdje se izražava u točkama. Sve što odlučuje hoće li se ispisani rezultat skenirati svodi se na taj jedan cijeli broj
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'label.pdf';
Pdf.BeginDoc;
// BCType, X, Y, Height, MUnit (širina modula u točkama), kut,
// podaci, UseCheckSum, boja linija, boja pozadine.
Pdf.CurrentPage.DrawBarcode(
bcCodeEAN13, // simbolika
72, 680, // X, Y u točkama od donjeg lijevog ruba
60, // visina linija
1, // MUnit: najuža linija 1pt
0, // bez rotacije
'123456789012', // 12 znamenki; 13. je kontrolna
True, // dodaj kontrolnu znamenku modulo-10
clBlack, clWhite); // linije crne, pozadina bijela
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
Dva argumenta zaslužuju pomniji pogled. UseCheckSum dodaje kontrolnu znamenku modulo-10 koju simbolika očekuje, a za maloprodajne kodove gotovo uvijek je želite postaviti na True; isključite je samo kad vaši podaci već nose unaprijed izračunatu kontrolu, inače ćete dobiti udvostručenu znamenku. Boje linija i pozadine posljednja su dva parametra, a iskušenje da tu budete kreativni zamka je o kojoj se govori niže. Primijetite i ishodište koordinata: kao i svaki drugi poziv za iscrtavanje u HotPDF-u, X i Y mjere se od donjeg lijevog kuta stranice u točkama, pri čemu Y raste prema gore, ista konvencija koju obrađuje primjer Hello World
Drugi put je DirectDrawBarcode, koji uzima podatke i okvir, X, Y, Width, Height, te skalira uzorak linija tako da ispuni tu širinu. Prikladan je za raspoređivanje kodova u mreži jer imenujete prostor koji zauzimaju, a metoda im linije prilagođava. Ta pogodnost je ujedno i njezina opasnost. Kad joj zadate širinu, više ne postavljate veličinu modula; metoda dijeli prostor koji dopustite na onoliko linija koliko podaci trebaju, a najuža linija postaje što god proizađe iz te podjele. Zatražite li gust niz za Code 128 unutar preuskog okvira, moduli se smanje ispod onoga što bilo koji skener može razlučiti, i to bez upozorenja. Za sve što se mora pouzdano skenirati, radije koristite DrawBarcode i namjerno postavite MUnit. Ostavite DirectDrawBarcode za pretpreglede i za rasporede kod kojih ste izmjerili da linije ostaju čitljive
Širina modula je odluka o rezoluciji
Evo aritmetike koja određuje hoće li vaša naljepnica raditi. I laserski skener i kamera imaju najmanju značajku koju mogu razlučiti, a uska linija nakon ispisa mora sigurno ostati iznad te granice. Široko citirana donja granica za linijske kodove opće namjene je uska linija od 13 mila, otprilike 0,33 mm, a mnogi maloprodajni i industrijski vodiči tretiraju to kao minimum, a ne kao cilj. Prevedite to u PDF jedinice: jedna točka je 1/72 inča, otprilike 0,353 mm, pa jedna točka širine modula stoji točno na toj granici. Zato je MUnit := 1 najmanja vrijednost kojoj biste trebali vjerovati za kod namijenjen stvarnom skeneru, i zato udvostručenje na 2 kupuje marginu koja na naljepnici s prostora na pretek košta gotovo ništa
Sad to povežite s izlaznom rezolucijom, jer modul mora preživjeti i pisač. Na laserskom pisaču od 300 DPI jedna je uređajska točka 1/300 inča, pa je modul od jedne točke širok otprilike četiri točke. Četiri točke jedva su dovoljne za čist rub; širenje tonera i sitna pogreška registracije nagrizu ga, pa se linija koja je u PDF-u mjerila jednu točku ispisuje deblja ili tanja nego što specifikacija dopušta. Povećajte modul na 2 točke i imate osam točaka za rad, što upija taj šum. Pravilo vrijedno usvajanja: širina modula koju postavite u točkama mora se preslikati na cijeli, udoban broj uređajskih točaka pri vašoj stvarnoj rezoluciji ispisa, a ne pri rezoluciji koju biste željeli imati. Kod koji besprijekorno skenira s ekrana, a ne uspijeva s pisača u skladištu, gotovo uvijek nije prošao upravo ovu provjeru
Tiha zona je dio simbola
Najčešći pojedinačni razlog zašto se ispravno kodiran bar-kod ne skenira jest tiha zona, prazna margina sa svake strane linija. Skeneri tu prazninu koriste kako bi pronašli gdje kod počinje i završava; bez nje čitač ne može razlikovati prvu liniju od bilo čega što se nalazi pored nje na stranici. Standardi su precizni. Većina linearnih simbolika traži tihu zonu od barem deset puta širine modula sa svake strane, a maloprodajni kodovi UPC i EAN traže devet modula lijevo i sedam desno. Uz modul od jedne točke to je otprilike deset točaka, oko sedminu inča, zajamčenog bijelog prostora uz linije
HotPDF iscrtava linije i ništa više. Ne rezervira tihu zonu umjesto vas, što znači da je odgovornost na vama, a lako se zaboravi. Način na koji to zakaže je suptilan: postavite bar-kod uz sam rub ćelije tablice, ili dopustite da raspored stranice natrpa logotip odmah pored njega, pa kod koji je prošao svaki test na praznoj stranici prestane se skenirati čim se isporuči unutar stvarnog dokumenta. Planirajte marginu izričito. Prije poziva DrawBarcode, ostavite barem deset širina modula slobodnog prostora sa svake strane, i svaku grafiku, liniju ili tekst koji zadire u taj pojas tretirajte kao grešku, a ne kao kozmetički izbor
Boja, kontrast i ljudima čitljiv redak
Boje linija i pozadine postoje kako biste ih uskladili s paletom brenda, i one su najbrži način da pokvarite ispravan kod. Skeneri čitaju kontrast, klasično crvenim svjetlom, i očekuju tamne linije na svijetlom polju. Crno na bijelom jedina je kombinacija po koju biste trebali posegnuti bez testiranja. Tamnoplava ili tamnozelena na bijelom mogu proći; sve s niskim kontrastom svjetline, a osobito crvene linije, koje skener s crvenim svjetlom vidi kao pozadinu, neće. Ako dizajner zatraži obojene bar-kodove, iskren je odgovor da linije ostaju crne, a boja ide negdje drugdje na naljepnici
Put DrawBarcode može ispisati i ljudima čitljiv tekst ispod linija, znamenke koje referent upisuje kad skeniranje ne uspije. Taj je tekst rezervni mehanizam, a ne ukras, pa kad postavljate vlastitu oznaku, držite je izvan tihe zone; naziv simbolike natrpan u bočnu marginu poništava isti taj prazan prostor o kojem ovisi skener. Polja u ovom primjeru, uključujući TextOut za bilo koje okolne oznake, isti su pozivi za iscrtavanje obrađeni u vodiču za izlaz izvještaja, mjestu kamo se treba obratiti kad je bar-kod samo jedan element unutar veće složene stranice
Kratka navika provjere
Vektorske linije prednost su vrijedna spomena. Budući da DrawBarcode piše kod kao PDF operacije crtanja, a ne kao rasteriziranu sliku, linije ostaju oštre pri bilo kojem zumu, a datoteka ne nosi vlastitu rezoluciju; jedina rezolucija koja je bitna je ona pisača. To vas ne oslobađa testiranja, samo znači da se test mora dogoditi na papiru. Generirajte uzorak, ispišite ga na uređaju s najnižom rezolucijom s kojim će se vaši kodovi zapravo susresti, i skenirajte ga istom klasom čitača kakvu drže vaši korisnici, a ne vrhunskim skenerom na vašem stolu. Provjerite tihe zone ravnalom na ispisu, potvrdite da je širina modula preživjela put od točaka do uređajskih točaka, i provjerite odgovara li dekodirana vrijednost onome što ste kodirali, uključujući kontrolnu znamenku. Pet minuta sa stvarnim skenerom otkriva svaki gore opisani propust, i otkriva ga prije nego što to učini paleta krivo označene robe
Metode DrawBarcode i DirectDrawBarcode prikazane ovdje dio su HotPDF Delphi komponente za Delphi i C++Builder