Un cod de bare nu este o imagine cu care decorați un document. Este o măsurătoare, iar scanerul este instrumentul care o citește. Această reîncadrare hotărăște aproape tot despre felul în care ar trebui să desenați unul într-un PDF. Barele nu poartă informație prin negreala lor; informația stă în raportul dintre lățimile barelor și lățimile spațiilor, iar un cititor o recuperează cronometrând tranzițiile în timp ce un laser sau un senzor mătură peste ele. Strângeți acea geometrie, încețoșați-o sau înghesuiți-i marginile și obțineți ceva ce arată exact ca un cod de bare, dar se scanează ca o pată. HotPDF vă oferă două moduri de a pune unul pe o pagină, iar diferența dintre ele este exact diferența dintre a controla acea geometrie și a renunța la ea

Ce poate codifica HotPDF
HotPDF desenează simbologii liniare (unidimensionale), iar setul este mai larg decât are nevoie majoritatea proiectelor. Enumerarea THPDFBarcodeType acoperă familia Code 2 of 5 în formele ei intercalată, industrială și matriceală; Code 39 și varianta lui extinsă; cele trei subseturi Code 128 A, B și C; Code 93 simplu și extins; MSI; PostNet; Codabar; grupul de comerț UPC și EAN, adică EAN-8, EAN-13, UPC-A, variantele comprimate UPC-E0 și UPC-E1 și suplimentele UPC de 2 și 5 cifre; precum și subseturile GS1-128 (EAN-128). Este suficient pentru a acoperi etichetele din lanțul de aprovizionare, punctele de vânzare din comerț și codurile industriale mai vechi, încă vii în depozite
Ce nu desenează este familia bidimensională. Nu există aici QR, Data Matrix sau PDF417. Acelea codifică octeți într-o grilă, cu propria matematică de corecție a erorilor, iar dacă o cerință numește una dintre ele, acesta este instrumentul greșit și ar fi bine să știți asta înainte de a construi în jurul lui, nu după. Pentru codurile unidimensionale, întrebarea practică este mai îngustă: care simbologie acceptă datele pe care le aveți efectiv, pentru că aceste codificări nu sunt interschimbabile
Constrângerile de date sunt reale și mușcă la momentul generării. Variantele Code 2 of 5 și MSI acceptă doar cifre. Code 39 poartă litere mari, cifre și câteva semne de punctuație; dacă aveți nevoie de litere mici sau de întregul interval ASCII, aceea este treaba lui Code 39 Extended sau a unui subset Code 128. Code 128C împachetează două cifre în fiecare simbol, pentru densitate, deci vrea un șir numeric de lungime pară și nimic altceva. EAN-13 așteaptă douăsprezece cifre și o calculează pe a treisprezecea drept cifră de control; EAN-8 așteaptă șapte și o calculează pe a opta; UPC-A primește douăsprezece. Dați unei simbologii date pe care nu le poate reprezenta și nu obțineți o excepție utilă, ci un cod de bare care codifică gunoi, ceea ce este mai rău, pentru că arată bine până când cineva îl scanează la casă
Două căi de desenare, două niveluri de control
Metoda la care să apelați în producție este DrawBarcode, de pe obiectul pagină. Ea primește simbologia, o poziție, o înălțime și un parametru care contează mai mult decât restul: MUnit, lățimea modulului. Modulul este lățimea celei mai înguste bare, atomul din care orice altă măsură a codului este un multiplu, și este exprimat aici în puncte. Tot ce ține de faptul că rezultatul tipărit se scanează sau nu se reduce la acel singur număr întreg
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'label.pdf';
Pdf.BeginDoc;
// BCType, X, Y, Height, MUnit (lățimea modulului în puncte), unghi,
// date, UseCheckSum, culoarea barelor, culoarea fundalului.
Pdf.CurrentPage.DrawBarcode(
bcCodeEAN13, // simbologia
72, 680, // X, Y în puncte, din stânga jos
60, // înălțimea barelor
1, // MUnit: cea mai îngustă bară de 1pt
0, // fără rotație
'123456789012', // 12 cifre; a 13-a este cifra de control
True, // adaugă cifra de control modulo 10
clBlack, clWhite); // bare negre, fundal alb
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
Două argumente merită o privire mai atentă. UseCheckSum adaugă cifra de control modulo 10 pe care o așteaptă simbologia, iar pentru codurile de comerț aproape întotdeauna o vreți True; opriți-o doar când datele dumneavoastră poartă deja o cifră de control precalculată, altfel veți obține o cifră dublată. Culorile barelor și ale fundalului sunt ultimii doi parametri, iar tentația de a fi creativ acolo este o capcană discutată mai jos. Rețineți și originea coordonatelor: ca la orice alt apel de desenare din HotPDF, X și Y se măsoară din colțul din stânga jos al paginii, în puncte, cu Y crescând în sus, aceeași convenție parcursă în exemplul Hello World
A doua cale este DirectDrawBarcode, care primește datele și o casetă de încadrare, X, Y, Width, Height, și scalează tiparul barelor ca să umple acea lățime. Este comodă pentru așezarea codurilor pe o grilă, pentru că numiți amprenta, iar metoda potrivește barele în ea. Acea comoditate este și pericolul ei. Când îi dați o lățime, nu mai stabiliți dumneavoastră dimensiunea modulului; metoda împarte spațiul pe care îl permiteți între câte bare are nevoie codul, iar cea mai îngustă bară devine ce iese din acea împărțire. Cereți un șir Code 128 dens într-o casetă prea îngustă și modulele scad sub ce poate distinge orice scaner, în tăcere. Pentru orice trebuie să se scaneze fiabil, preferați DrawBarcode și setați MUnit intenționat. Păstrați DirectDrawBarcode pentru previzualizări și pentru aranjamente în care ați măsurat că barele rezultate rămân lizibile
Lățimea modulului este o decizie de rezoluție
Iată aritmetica ce hotărăște dacă eticheta dumneavoastră funcționează. Atât un scaner cu laser, cât și o cameră au un detaliu minim pe care îl pot distinge, iar bara îngustă trebuie să rămână confortabil deasupra lui după tipărire. Pragul citat pe scară largă pentru codurile liniare de uz general este o bară îngustă de 13 mil, aproximativ 0,33 mm, iar multe ghiduri de comerț și industriale tratează asta ca pe un minim, nu ca pe o țintă. Traduceți în unități PDF: un punct este 1/72 dintr-un inch, aproximativ 0,353 mm, deci un singur punct de lățime de modul stă chiar la acel prag. De aceea MUnit := 1 este cea mai mică valoare în care ar trebui să aveți încredere pentru un cod destinat unui scaner real și de aceea dublarea ei la 2 cumpără o marjă care nu costă aproape nimic pe o etichetă cu spațiu de rezervă
Acum legați asta de rezoluția de ieșire, pentru că modulul trebuie să supraviețuiască și imprimantei. Pe o imprimantă laser de 300 DPI, un punct de dispozitiv este 1/300 dintr-un inch, deci un modul de un punct are cam patru puncte de dispozitiv lățime. Patru puncte abia ajung pentru a reda o muchie curată; împrăștierea tonerului și mica eroare de registru mușcă din ele, iar bara care măsura un punct în PDF-ul dumneavoastră se tipărește mai groasă sau mai subțire decât permite specificația. Ridicați modulul la 2 puncte și aveți opt puncte de dispozitiv la dispoziție, ceea ce absoarbe acel zgomot. Regula care merită interiorizată: lățimea de modul pe care o setați în puncte trebuie să se mapeze pe un număr întreg și confortabil de puncte de dispozitiv la rezoluția de tipărire reală, nu la rezoluția pe care v-ați dori-o. Un cod care se scanează impecabil de pe ecran și eșuează de pe imprimanta din depozit aproape întotdeauna a picat această verificare
Zona liniștită face parte din simbol
Cel mai frecvent motiv pentru care un cod de bare codificat corect nu se scanează este zona liniștită, marginea albă de pe fiecare parte a barelor. Scanerele folosesc acel gol ca să găsească unde începe și unde se termină codul; fără el, cititorul nu poate deosebi prima bară de orice altceva stă lângă ea pe pagină. Standardele sunt precise. Majoritatea simbologiilor liniare vor o zonă liniștită de cel puțin zece ori lățimea modulului pe fiecare parte, iar codurile de comerț UPC și EAN cer nouă module în stânga și șapte în dreapta. Cu un modul de un punct, asta înseamnă aproximativ zece puncte, cam a șaptea parte dintr-un inch, de spațiu alb garantat de o parte și de alta a barelor
HotPDF desenează barele și nimic altceva. Nu vă rezervă zona liniștită, ceea ce înseamnă că responsabilitatea este a dumneavoastră și că se uită ușor. Modul de eșec este subtil: așezați un cod de bare lipit de bordura unei celule de tabel sau lăsați aranjamentul paginii să înghesuie un logo lângă el, iar codul care a trecut fiecare test pe o pagină albă încetează să se scaneze în clipa în care ajunge într-un document real. Bugetați marginea explicit. Înainte de a apela DrawBarcode, lăsați cel puțin zece lățimi de modul de spațiu liber pe ambele părți și tratați orice grafic, linie sau text care intră în acea bandă ca pe un defect, nu ca pe o alegere cosmetică
Culoare, contrast și linia lizibilă de om
Culorile barelor și ale fundalului există ca să puteți respecta o paletă de brand și sunt cea mai rapidă cale de a strica un cod funcțional. Scanerele citesc contrast, clasic cu lumină roșie, și așteaptă bare întunecate pe un câmp deschis. Negru pe alb este singura combinație la care ar trebui să apelați fără testare. Albastru închis sau verde închis pe alb pot trece; orice are contrast de luminanță scăzut, și în special barele roșii, pe care un scaner cu lumină roșie le vede ca fundal, nu vor trece. Dacă un designer cere coduri de bare colorate, răspunsul cinstit este că barele rămân negre, iar culoarea merge în altă parte pe etichetă
Calea DrawBarcode poate randa și textul lizibil de om de sub bare, cifrele pe care un casier le tastează atunci când scanarea eșuează. Acel text este o soluție de rezervă, nu o decorațiune, așa că, atunci când vă puneți propria legendă, țineți-o departe de zona liniștită; o etichetă cu numele simbologiei înghesuită în marginea laterală anulează chiar spațiul alb de care depinde scanerul. Câmpurile din exemplul de aici, inclusiv TextOut pentru orice etichete din jur, sunt aceleași apeluri de desenare tratate în ghidul de generare a rapoartelor, locul potrivit atunci când codul de bare este un element dintr-o pagină compusă mai amplă
Un scurt obicei de verificare
Barele vectoriale sunt un avantaj care merită numit. Fiindcă DrawBarcode scrie codul ca operatori de desenare PDF, nu ca imagine rasterizată, barele rămân clare la orice nivel de mărire, iar fișierul nu poartă nicio rezoluție proprie; singura rezoluție care contează este cea a imprimantei. Asta nu vă scutește de testare, ci doar înseamnă că testul trebuie să se petreacă pe hârtie. Generați o mostră, tipăriți-o pe cel mai slab dispozitiv ca rezoluție pe care codurile dumneavoastră îl vor întâlni în realitate și scanați-o cu aceeași clasă de cititor pe care o țin utilizatorii în mână, nu cu imagerul scump de pe biroul dumneavoastră. Verificați zonele liniștite cu o riglă pe hârtia tipărită, confirmați că lățimea modulului a supraviețuit drumului de la puncte la puncte de dispozitiv și verificați că valoarea decodificată se potrivește cu ce ați codificat, cu tot cu cifra de control. Cinci minute cu un scaner real prind fiecare eșec descris mai sus și le prind înaintea unui palet de marfă etichetată greșit
Metodele DrawBarcode și DirectDrawBarcode prezentate aici fac parte din HotPDF Delphi Component pentru Delphi și C++Builder