Techninis straipsnis

Nuskaitomų brūkšninių kodų generavimas PDF formatu su „HotPDF“ programoje „Delphi“

Brūkšninis kodas nėra paveikslėlis, kuriuo puošiate dokumentą. Tai yra išmatavimas, o skaitytuvas – prietaisas, kuris jį nuskaito. Toks požiūris lemia beveik viską, kaip turėtumėte jį atvaizduoti PDF faile. Brūkšnių juodumas nesuteikia jokios informacijos; informacija slypi brūkšnių ir tarpų pločių santykyje, o skaitytuvas ją atkuria fiksuodamas perėjimus, kai lazeris ar jutiklis slenka per paviršių. Suspauskite tą geometriją, suliekite ją arba sumažinkite paraštes, ir gausite tai, kas atrodo lygiai taip pat kaip brūkšninis kodas, bet nuskaitoma kaip dėmė. „HotPDF“ suteikia du būdus, kaip jį patalpinti puslapyje, ir skirtumas tarp jų yra būtent skirtumas tarp šios geometrijos kontroliavimo ir jos atsisakymo

PDF puslapis, kuriame pavaizduotas įvairių simbologijų linijinių brūkšninių kodų tinklelis, nubraižytas naudojant „HotPDF“ programoje „Delphi“
Linijinių brūkšninių kodų simbologijos, nupieštos viename PDF faile su „HotPDF“

Ką „HotPDF“ gali užkoduoti

„HotPDF“ piešia linijines (vienamares) simbologijas, ir šis rinkinys yra platesnis, nei reikia daugeliui projektų. THPDFBarcodeType išvardinimas apima „Code 2 of 5“ šeimą jos interleaved, industrial ir matrix formose; „Code 39“ ir jo išplėstinį variantą; tris „Code 128“ poaibius A, B ir C; standartinį bei išplėstinį „Code 93“; MSI; „PostNet“; „Codabar“; mažmeninės prekybos UPC ir EAN grupę, t.y., EAN-8, EAN-13, UPC-A, suglaudintus UPC-E0 bei UPC-E1 ir UPC papildomus 2-jų bei 5-ių skaitmenų priedus; taip pat GS1-128 (EAN-128) poaibius. To pakanka, kad būtų padengtos tiekimo grandinės etiketės, mažmeninės prekybos pardavimo vietos bei senesni pramoniniai kodai, kurie vis dar naudojami sandėliuose

Ko jis nepiešia, tai dvimačių kodų šeimos. Čia nerasite QR, „Data Matrix“ ar PDF417. Jie koduoja baitus tinklelyje, naudodami savo klaidų taisymo matematiką, ir jei reikalavimuose nurodytas vienas iš jų, tai reiškia, kad pasirinktas netinkamas įrankis, ir tai turėtumėte žinoti prieš kurdami sistemą aplink jį, o ne po to. Vienamačiams kodams praktinis klausimas yra siauresnis: kuri simbologija priima jūsų faktiškai turimus duomenis, nes koduotės nėra sukeičiamos tarpusavyje

Duomenų apribojimai yra realūs ir jie pasireiškia generavimo metu. „Code 2 of 5“ variantai ir MSI priima tik skaitmenis. „Code 39“ perneša didžiąsias raides, skaitmenis ir kelis skyrybos ženklus; jei reikia mažųjų raidžių arba viso ASCII diapazono, tam tinka išplėstinis „Code 39“ arba „Code 128“ poaibis. „Code 128C“ kompaktiškumui sudeda po du skaitmenis į kiekvieną simbolį, todėl jam reikalinga porinio ilgio skaitmenų eilutė ir nieko daugiau. EAN-13 tikisi dvylikos skaitmenų, o tryliktąjį apskaičiuoja kaip kontrolinį; EAN-8 tikisi septynių ir apskaičiuoja aštuntą; UPC-A priima dvylika. Padavus simbologijai duomenis, kurių ji negali atvaizduoti, negausite jokios pagalbinės išimties, bet gausite brūkšninį kodą, koduojantį „šiukšles“, ir tai yra dar blogiau, nes jis atrodo puikiai tol, kol kas nors jį nuskenuos kasoje

Du braižymo keliai, du kontrolės lygiai

Metodas, kurį reikėtų naudoti gamybinėje aplinkoje, yra DrawBarcode, esantis puslapio objekte. Jam reikalinga nurodyti simbologiją, padėtį, aukštį ir vieną parametrą, kuris yra svarbesnis už kitus: MUnit – modulio plotį. Modulis yra siauriausio brūkšnio plotis, t. y. bazinis vienetas, kurio kartotinis yra visi kiti kode esantys matmenys, ir čia jis išreiškiamas taškais (points). Viskas, kas lemia nuskaitomumą, priklauso nuo šio vieno sveikojo skaičiaus

var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := 'label.pdf';
    Pdf.BeginDoc;

    // BCType, X, Y, Height, MUnit (modulio plotis taškais), kampas,
    // data, UseCheckSum, bar color, background color.
    Pdf.CurrentPage.DrawBarcode(
      bcCodeEAN13,           // simbologija
      72, 680,               // X, Y taškais nuo apatinio kairiojo kampo
      60,                    // brūkšnių aukštis
      1,                     // MUnit: 1 pt siauriausias brūkšnys
      0,                     // be pasukimo
      '123456789012',        // 12 skaitmenų; 13-asis yra kontrolinis
      True,                  // pridėti modulo-10 kontrolinį skaitmenį
      clBlack, clWhite);     // brūkšniai juodi, fonas baltas

    Pdf.EndDoc;
  finally
    Pdf.Free;
  end;
end;

Du argumentai verti atidesnio žvilgsnio. UseCheckSum prideda modulo-10 kontrolinį skaitmenį, kurio tikisi simbologija, ir mažmeninės prekybos kodams beveik visada norėsite, kad jis būtų True; jį išjunkite tik tada, kai jūsų duomenyse jau yra iš anksto apskaičiuotas kontrolinis skaičius, antraip gausite dvigubą skaitmenį. Brūkšnių ir fono spalvos yra paskutiniai du parametrai, ir pagunda čia būti kūrybiškiems yra spąstai, aptarti žemiau. Taip pat atkreipkite dėmesį į koordinačių pradžią: kaip ir kiekvienas kitas „HotPDF“ braižymo iškvietimas, X ir Y matuojami nuo puslapio apatinio kairiojo kampo taškais, Y didėjant į viršų – tai pati konvencija, kuri detaliai aprašyta „Hello World“ pavyzdyje

Antrasis būdas yra DirectDrawBarcode, kuris paima duomenis ir ribojantįjį stačiakampį X, Y, Width, Height, ir keičia brūkšnių modelio mastelį taip, kad jis užpildytų tą plotį. Tai patogu išdėstant kodus tinklelyje, nes nurodote užimamą plotą, ir metodas pritaiko brūkšnius jam. Šis patogumas taip pat yra ir jo pavojus. Kai suteikiate jam plotį, jūs nebesudarote modulio dydžio; metodas padalija bet kokią jūsų leidžiamą erdvę tarp tiek brūkšnių, kiek reikalauja duomenys, ir siauriausiu brūkšniu tampa tai, kas gaunasi po to padalijimo. Paprašykite sutalpinti tankią „Code 128“ eilutę į per siaurą dėžutę, ir moduliai nepastebimai susitrauks žemiau ribos, kurią gali atskirti bet koks skaitytuvas. Viskam, kas turi būti patikimai nuskaitoma, pirmenybę teikite DrawBarcode ir apgalvotai nustatykite MUnit. Rezervuokite DirectDrawBarcode peržiūroms ir išdėstymams, kur išmatavote, kad gauti brūkšniai išlieka įskaitomi

Modulio plotis yra sprendimas dėl raiškos

Štai aritmetika, lemianti, ar jūsų etiketė veiks. Tiek lazerinis skaitytuvas, tiek kamera turi smulkiausią detalę, kurią jie gali atskirti, ir siaurasis brūkšnys turi po atspausdinimo patogiai viršyti šią ribą. Plačiai cituojama minimali riba bendrosios paskirties linijiniams kodams yra 13 mil siaurasis brūkšnys (apie 0,33 mm), ir daugelis mažmeninės prekybos bei pramonės vadovų tai vertina kaip minimumą, o ne kaip tikslą. Išverskime tai į PDF vienetus: vienas taškas yra 1/72 colio, maždaug 0,353 mm, todėl vieno taško modulio plotis atsiduria tiesiai ant šios ribos. Štai kodėl MUnit := 1 yra mažiausia reikšmė, kuria turėtumėte pasitikėti kuriant kodą, skirtą tikram skaitytuvui, ir kodėl jos padvigubinimas iki 2 suteikia saugumo ribą, kuri etiketėje su laisva vieta nekainuoja beveik nieko

Dabar susiekite tai su išvesties skiriamąja geba, nes modulis taip pat turi atlaikyti spausdintuvą. 300 DPI lazeriniame spausdintuve vienas prietaiso taškas yra 1/300 colio, taigi vieno taško modulis yra maždaug keturių spausdintuvo taškų pločio. Keturių taškų vos pakanka švariam kraštui atvaizduoti; dažų išplitimas ir nedidelė registracijos paklaida jį sumažina, ir brūkšnys, kuris jūsų PDF formate buvo vieno taško pločio, atspausdinamas storesnis arba plonesnis nei leidžia specifikacija. Padidinus modulį iki 2 PDF taškų, turėsite aštuonis spausdintuvo taškus, kurie sugeria tą triukšmą. Taisyklė, kurią verta įsisąmoninti: modulio plotis, kurį nustatote PDF taškais, turi atitikti sveiką, patogų skaičių tikrų spausdintuvo taškų jūsų faktinėje spausdinimo raiškoje, o ne raiškoje, kurios norėtumėte. Kodas, kuris nepriekaištingai nuskaitomas iš ekrano, bet sugenda atspausdinus sandėlio spausdintuvu, beveik visada neatlaikė šio patikrinimo

Ramybės zona yra simbolio dalis

Pati dažniausia priežastis, dėl kurios teisingai užkoduotas brūkšninis kodas nenuskaitomas, yra ramybės zona – tuščia paraštė abiejose brūkšnių pusėse. Skaitytuvai naudoja šią tuštumą, kad rastų, kur kodas prasideda ir kur baigiasi; be jos skaitytuvas negali atskirti pirmojo brūkšnio nuo to, kas šalia jo yra puslapyje. Standartai yra konkretūs. Dauguma linijinių simbologijų reikalauja, kad ramybės zona kiekvienoje pusėje būtų bent dešimt kartų platesnė už modulio plotį, o UPC ir EAN mažmeninės prekybos kodams reikia devynių modulių kairėje ir septynių dešinėje. Su vieno taško moduliu tai sudaro maždaug dešimt taškų, apie septintadalį colio garantuotos baltos erdvės, supančios brūkšnius

„HotPDF“ nupiešia brūkšnius ir nieko daugiau. Jis nerezervuoja jums ramybės zonos, o tai reiškia, kad atsakomybė tenka jums ir tai lengva pamiršti. Gedimo režimas yra subtilus: patalpinate brūkšninį kodą lygiai su lentelės langelio kraštine, arba puslapio išdėstymas pritraukia logotipą šalia jo, ir kodas, praėjęs kiekvieną testą tuščiame puslapyje, nustoja būti nuskaitomu, kai tik jis išsiunčiamas realiame dokumente. Planuokite paraštę aiškiai. Prieš iškviesdami DrawBarcode, abiejose pusėse palikite bent dešimties modulių pločių laisvą erdvę, ir bet kokią grafiką, liniją ar tekstą, kuris įsibrauna į tą juostą, traktuokite kaip defektą, o ne kaip kosmetinį pasirinkimą

Spalva, kontrastas ir žmogaus skaitoma eilutė

Brūkšnių ir fono spalvos egzistuoja tam, kad galėtumėte prisiderinti prie prekės ženklo paletės, ir tai yra pats greičiausias būdas sugadinti veikiantį kodą. Skaitytuvai skaito kontrastą, klasikiniu atveju – raudonoje šviesoje, ir jie tikisi tamsių brūkšnių šviesiame fone. Juoda ant balto yra vienintelė kombinacija, kurią turėtumėte naudoti be papildomų testavimų. Tamsiai mėlyna ar tamsiai žalia ant balto fono gali veikti; bet kas, turintis mažą skaisčio kontrastą, o ypač raudoni brūkšniai, kuriuos raudonos šviesos skaitytuvas mato kaip foną, neveiks. Jei dizaineris prašo spalvotų brūkšninių kodų, sąžiningas atsakymas yra toks, kad brūkšniai lieka juodi, o spalva etiketėje atsiduria kur nors kitur

Per DrawBarcode kelią taip pat galima atvaizduoti žmogui skaitomą tekstą po brūkšniais – skaitmenis, kuriuos pardavėjas įveda ranka, jei nepavyksta nuskenuoti. Šis tekstas yra atsarginis variantas, o ne dekoracija, todėl dedant savo nuosavą užrašą, laikykitės atokiau nuo ramybės zonos; simbologijos pavadinimas, įspraustas į šoninę paraštę, paneigia tą pačią tuščią erdvę, nuo kurios priklauso skaitytuvas. Laukeliai šiame pavyzdyje, įskaitant TextOut, skirtą bet kokioms supančioms etiketėms, naudoja tuos pačius braižymo iškvietimus, aprašytus ataskaitų išvedimo vadove, kuris yra pagrindinis šaltinis, kai brūkšninis kodas yra vienas elementas didesniame, sudėtiniame puslapyje

Trumpas patikrinimo įprotis

Vektoriniai brūkšniai yra privalumas, kurį verta paminėti. Kadangi DrawBarcode įrašo kodą kaip PDF braižymo operatorius, o ne kaip rastrizuotą vaizdą, brūkšniai išlieka ryškūs bet kokiu priartinimu, ir failas neturi savo vidinės skiriamosios gebos; vienintelė skiriamoji geba, kuri turi reikšmės, yra spausdintuvo. Tai neatleidžia jūsų nuo testavimo, tai tiesiog reiškia, kad testas turi vykti ant popieriaus. Sugeneruokite pavyzdį, atspausdinkite jį pačios mažiausios raiškos įrenginiu, su kuriuo jūsų kodai realiai susidurs, ir nuskenuokite to paties lygio skaitytuvu, kurį turi jūsų vartotojai, o ne aukščiausios klasės vaizdo skaitytuvu ant savo stalo. Liniuote patikrinkite ramybės zonas atspausdintame lape, įsitikinkite, kad modulio plotis išlaikė perėjimą nuo PDF taškų iki spausdintuvo taškų, ir patikrinkite, ar iškoduota reikšmė atitinka tai, ką užkodavote, įskaitant kontrolinį skaitmenį. Penkios minutės su tikru skaitytuvu padeda sugauti kiekvieną aukščiau aprašytą klaidą, ir jas sugauna dar prieš tai, kai bus išsiųsta paletė su klaidingai paženklintomis prekėmis

Čia parodyti DrawBarcode ir DirectDrawBarcode metodai yra „HotPDF“ komponento, skirto „Delphi“ ir „C++Builder“, dalis