Brūkšninis kodas nėra tik paveikslėlis, kuriuo puošiamas dokumentas. Tai yra matmuo, o skeneris yra prietaisas, kuris jį nuskaito. Šis požiūrio pakeitimas lemia beveik viską, kaip turėtumėte jį nubraižyti PDF faile. Brūkšneliai nesukelia jokios informacijos vien savo juodumu; informacija slypi brūkšnelių pločio ir tarpų pločio santykyje, o skaitytuvas ją atkuria fiksuodamas perėjimo laiką, kai lazeris arba jutiklis slenka per kodą. Suspauskite šią geometriją, suliekite ją arba sumažinkite jos paraštes, ir gausite tai, kas atrodo tiksliai kaip brūkšninis kodas, bet nuskaitoma kaip dėmė. HotPDF siūlo du būdus, kaip patalpinti jį puslapyje, o skirtumas tarp jų yra būtent skirtumas tarp šios geometrijos valdymo ir jos praradimo.

Ką gali koduoti HotPDF
HotPDF braižo tiesines (vienmates) simbolikas, o jų rinkinys yra platesnis, nei reikia daugeliui projektų. THPDFBarcodeType sąrašas apima Code 2 of 5 šeimą (interleaved, industrial ir matrix formas), Code 39 ir jo išplėstinį variantą, tris Code 128 poaibius A, B ir C, Code 93 įprastą bei išplėstinį, MSI, PostNet, Codabar, mažmeninės prekybos UPC ir EAN grupę (EAN-8, EAN-13, UPC-A, suspaustus UPC-E0 ir UPC-E1 bei UPC papildomus 2 ir 5 skaitmenų priedus) ir GS1-128 (EAN-128) poaibius. To pakanka tiekiant prekių etiketes, mažmeninės prekybos vietose ir senesniems pramoniniams kodams, vis dar naudojamiems sandėliuose.
Ko jis nebraižo, tai dvimačių kodų šeimos. Čia nėra QR, Data Matrix ar PDF417. Šie kodai koduoja baitus tinklelyje naudodami savo klaidų taisymo matematiką, ir jei reikalavimuose nurodytas vienas iš jų, tai yra netinkamas įrankis, ir tai turėtumėte žinoti prieš pradėdami kurti, o ne po to. Vienmačių kodų atveju praktinis klausimas yra siauresnis: kuri simbolika priima jūsų turimus duomenis, nes kodavimo būdai nėra suderinami tarpusavyje.
Duomenų apribojimai yra realūs ir išryškėja generavimo metu. Code 2 of 5 variantai ir MSI priima tik skaitmenis. Code 39 palaiko didžiąsias raides, skaitmenis ir kelis skyrybos ženklus; jei reikia mažųjų raidžių arba viso ASCII diapazono, tam tinka Code 39 Extended arba Code 128 poaibis. Code 128C tankumui užtikrinti pakuoja po du skaitmenis į kiekvieną simbolį, todėl jam reikalinga lyginio ilgio skaitinė eilutė ir nieko daugiau. EAN-13 tikisi dvylikos skaitmenų ir apskaičiuoja tryliktąjį kaip kontrolinį; EAN-8 tikisi septynių ir apskaičiuoja aštuntąjį; UPC-A priima dvylika skaitmenų. Perduokite simbolikai duomenis, kurių ji negali atvaizduoti, ir gausite ne naudingą klaidą, o brūkšninį kodą, koduojantį šiukšles, kas yra dar blogiau, nes jis atrodo gerai, kol kas nors jo nenuskaito kasoje.
Du braižymo būdai, du valdymo lygiai
Gamybinėje aplinkoje rekomenduojamas metodas yra puslapio objekto DrawBarcode. Jis priima simboliką, poziciją, aukštį ir vieną parametrą, kuris yra svarbesnis už visus kitus: MUnit, modulio plotį. Modulis yra siauriausio brūkšnelio plotis, t. y. elementas, kurio kartotinis yra kiekvienas kitas kodo matmuo, ir čia jis išreiškiamas taškais (points). Viskas, kas susiję su tuo, ar atspausdintas rezultatas bus nuskaitomas, priklauso nuo šio vienintelio sveikojo skaičiaus.
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;
Du argumentai verti atidesnio žvilgsnio. UseCheckSum prideda simbolikos numatytą modulo-10 kontrolinį skaitmenį, ir mažmeninės prekybos kodams beveik visada norėsite nustatyti reikšmę True; išjunkite ją tik tada, kai jūsų duomenyse jau yra iš anksto apskaičiuotas kontrolinis skaitmuo, kitaip gausite pasikartojantį skaitmenį. Brūkšnelių ir fono spalvos yra paskutiniai du parametrai, o pagunda čia būti kūrybingiems yra spąstai, aptariami toliau. Taip pat atkreipkite dėmesį į koordinačių pradžią: kaip ir bet kuris kitas HotPDF braižymo iškvietimas, X ir Y matuojami taškais nuo apatinio kairiojo puslapio kampo, o Y didėja į viršų – tai ta pati konvencija, kuri aprašyta Hello World pavyzdyje.
Antrasis būdas yra DirectDrawBarcode, kuris priima duomenis ir ribojantį rėmelį X, Y, Width, Height bei pakeičia brūkšnelių šabloną taip, kad jis užpildytų tą plotį. Tai patogu išdėstant kodus tinklelyje, nes nurodote užimamą plotą, o metodas pritaiko brūkšnelius pagal jį. Šis patogumas taip pat yra ir pavojus. Kai nurodote plotį, nebepasirenkate modulio dydžio; metodas padalija bet kokią jūsų nurodytą erdvę iš tiek brūkšnelių, kiek reikia duomenims, o siauriausias brūkšnelis tampa tuo, kas gaunasi po šio padalijimo. Jei bandysite sutalpinti tankią Code 128 eilutę į per siaurą rėmelį, moduliai susitrauks žemiau ribos, kurią gali atskirti bet koks skeneris, ir tai įvyks tyliai. Visais atvejais, kai kodą reikia nuskaityti patikimai, rinkitės DrawBarcode ir sąmoningai nustatykite MUnit. Naudokite DirectDrawBarcode tik peržiūroms ir tiems atvejams, kai išmatavote, kad gauti brūkšneliai išliks įskaitomi.
Modulio plotis yra skiriamosios gebos pasirinkimas
Štai aritmetika, kuri lemia, ar jūsų etiketė veiks. Lazerinis skeneris ir kamera turi mažiausią elementą, kurį gali atskirti, o siaurasis brūkšnelis po spausdinimo turi būti pastebimai didesnis už jį. Dažnai nurodoma žemiausia riba bendrosios paskirties tiesiniams kodams yra 13 milių (mil) siaurasis brūkšnelis, t. y. apie 0,33 mm, ir daugelis mažmeninės bei pramoninės prekybos vadovų tai laiko minimumu, o ne siektinu tikslu. Paverskime tai PDF vienetais: vienas taškas (point) yra 1/72 colio, maždaug 0,353 mm, todėl vieno taško modulio plotis yra ties šia žemiausia riba. Todėl MUnit := 1 yra mažiausia reikšmė, kuria turėtumėte pasitikėti kodui, skirtam tikram skeneriui, o padvigubinus ją iki 2 gaunama paklaida, kuri beveik nieko nekainuoja etiketėje, kurioje yra pakankamai laisvos vietos.
Dabar susiekite tai su išvesties skiriamąja geba, nes modulis taip pat turi išlikti įskaitomas ir spausdintuvui. 300 DPI lazeriniame spausdintuve vienas įrenginio taškas yra 1/300 colio, todėl vieno taško modulis yra maždaug keturių taškų pločio. Keturių taškų vos pakanka švariam kraštui suformuoti; dažų sklaida ir nedidelė padėties nustatymo klaida jį sumažina, o brūkšnelis, kuris PDF faile buvo vieno taško pločio, atspausdinamas storesnis arba plonesnis nei leidžia specifikacija. Padidinkite modulį iki 2 taškų, ir turėsite aštuonis taškus, kas padeda amortizuoti šį triukšmą. Taisyklė, kurią verta įsiminti: modulio plotis taškais turi atitikti sveikąjį, patogų įrenginio taškų skaičių jūsų tikrojoje spausdinimo skiriamojoje geboje, o ne toje, kurios norėtumėte. Kodas, kuris puikiai nuskaitomas iš ekrano, bet neveikia atspausdintas sandėlio spausdintuvu, beveik visada neatlaikė šio patikrinimo.
Apsauginė zona yra simbolio dalis
Pati dažniausia priežastis, kodėl teisingai užkoduotas brūkšninis kodas nenuskaitomas, yra apsauginė zona (quiet zone) – tuščia paraštė abiejose brūkšnelių pusėse. Skeneriai naudoja šią tuštumą, kad nustatytų, kur kodas prasideda ir baigiasi; be jos skaitytuvas negali atskirti pirmojo brūkšnelio nuo to, kas yra šalia jo puslapyje. Standartai yra konkretūs. Daugumai tiesinių simbolikų reikia apsauginės zonos, kuri abiejose pusėse būtų bent dešimt kartų didesnė už modulio plotį, o UPC ir EAN mažmeninės prekybos kodams reikalaujama devynių modulių kairėje ir septynių dešinėje. Su vieno taško moduliu tai yra maždaug dešimt taškų, apie septintadalį colio, garantuotos tuščios erdvės abipus brūkšnelių.
HotPDF nubraižo brūkšnelius ir nieko daugiau. Jis nerezervuoja apsauginės zonos už jus, o tai reiškia, kad atsakomybė tenka jums ir tai lengva pamiršti. Klaidos pasireiškimas yra subtilus: patalpinate brūkšninį kodą glaudžiai prie lentelės langelio kraštinės arba leidžiate puslapio maketui pristumti logotipą šalia jo, ir kodas, kuris išlaikė visus testus tuščiame puslapyje, nustoja veikti, kai atsiduria tikrame dokumente. Suplanuokite šią paraštę iš anksto. Prieš iškviesdami DrawBarcode, palikite bent dešimties modulių pločio laisvą erdvę abiejose pusėse ir bet kokią grafiką, liniją ar tekstą, kuris patenka į šią zoną, laikykite defektu, o ne estetiniu pasirinkimu.
Spalva, kontrastas ir žmogui įskaitoma eilutė
Brūkšnelių ir fono spalvos egzistuoja tam, kad galėtumėte jas priderinti prie prekės ženklo paletės, tačiau tai yra greičiausias būdas sugadinti veikiantį kodą. Skeneriai nuskaito kontrastą, klasikiškai naudodami raudoną šviesą, ir jie tikisi tamsių brūkšnelių šviesiame fone. Juoda spalva baltame fone yra vienintelis derinys, kurį turėtumėte naudoti neatlikę bandymų. Tamsiai mėlyna arba tamsiai žalia spalva baltame fone gali tikti, tačiau bet koks derinys su mažu ryškumo kontrastu, ypač raudoni brūkšneliai, kuriuos raudonos šviesos skeneris mato kaip foną, neveiks. Jei dizaineris prašo spalvotų brūkšninių kodų, sąžiningas atsakymas yra tas, kad brūkšneliai lieka juodi, o spalva nukreipiama kitur etiketėje.
Metodas DrawBarcode taip pat gali atvaizduoti žmogui įskaitomą tekstą po brūkšneliais – skaitmenis, kuriuos darbuotojas įveda rankiniu būdu, kai nepavyksta nuskaityti kodo. Šis tekstas yra atsarginis variantas, o ne dekoracija, todėl kai dedate savo užrašą, laikykite jį atokiau nuo apsauginės zonos; šoninėje paraštėje įspraustas simbolikos pavadinimas panaikina tą pačią tuščią erdvę, nuo kurios priklauso skenerio darbas. Šio pavyzdžio laukai, įskaitant TextOut bet kokiems aplinkiniams užrašams, yra tie patys braižymo iškvietimai, aprašyti ataskaitų išvesties vadove, kurį verta peržiūrėti, kai brūkšninis kodas yra tik vienas iš elementų didesniame puslapyje.
Trumpas patikrinimo įprotis
Vektoriniai brūkšneliai yra privalumas, kurį verta paminėti. Kadangi DrawBarcode įrašo kodą kaip PDF braižymo operatorius, o ne kaip rasterizuotą vaizdą, brūkšneliai išlieka aiškūs bet kokiu masteliu, o pats failas neturi savo skiriamosios gebos; vienintelė svarbi skiriamoji geba yra spausdintuvo. Tai neatleidžia jūsų nuo testavimo, tiesiog reiškia, kad testas turi vykti popieriuje. Sukurkite pavyzdį, atspausdinkite jį žemiausios skiriamosios gebos įrenginiu, kurį iš tikrųjų naudos jūsų kodams spausdinti, ir nuskaitykite jį su tokios pačios klasės skaitytuvu, kokį naudos jūsų vartotojai, o ne su pažangiu skeneriu ant jūsų stalo. Patikrinkite apsaugines zonas liniuote ant spaudinio, įsitikinkite, kad modulio plotis išliko tinkamas perėjus iš taškų į spausdintuvo taškus, ir patikrinkite, ar iškoduota reikšmė atitinka jūsų užkoduotą informaciją, įskaitant kontrolinį skaitmenį. Penkios minutės su tikru skeneriu padeda pastebėti visus aukščiau aprašytus gedimus, ir tai padaryti anksčiau, nei tai bus pastebėta ant klaidingai pažymėtų prekių padėklo.
Čia parodyti DrawBarcode ir DirectDrawBarcode metodai yra HotPDF komponento, skirto Delphi ir C++Builder, dalis.