Technical Article

Barkodovi u PDF-u s Delphi-jem: QR, PDF417, DataMatrix

Barkod na otpremnoj naljepnici ili ra?unu ima jedan zadatak, a to je da ga skener o?ita iz prvog poku?aja. Ho?e li pre?ivjeti taj poku?aj odlu?uje se mnogo prije nego ?to paket stigne na utovarnu rampu. Odlu?uje se na?inom na koji je simbol postavljen na stranicu. Naj?e??a pogre?ka u Delphi cjevovodu za izvje?tavanje je renderiranje barkoda kao bitmape negdje drugdje i postavljanje te slike u PDF. Izgleda dobro na zaslonu na jednoj razini zumiranja, a zatim degradira svugdje drugdje

Alternativa je crtanje simbola kao vektorskog sadr?aja, izravno na stranicu. PDFlibPas izla?e obitelj poziva za crtanje upravo za to, pokrivaju?i 2D matri?ne simbole QR, PDF417 i DataMatrix, linearne obitelji kroz Code128 i GS1-128, te USPS Intelligent Mail za po?tansku automatizaciju. Argument za vektore nije estetski. Radi se o tome ho?e li linije sletjeti tamo gdje skener o?ekuje

Zašto vektor pobjeđuje postavljenu bitmapu

Barkod je uzorak linija i razmaka, ili u dvije dimenzije mre?a tamnih i svijetlih modula. Dekoder radi mjerenjem omjera tih ?irina. Sve ?to iskrivljuje omjere je ?um koji tro?i prora?un pogre?aka simbola. Rasterizirana slika barkoda nosi fiksne piksele. Kada se PDF iscrtava na pisa?u ?ije se to?ke ne dijele ravnomjerno u mre?u slike, rasterizator mora ponovno uzorkovati, a rubovi modula koji bi trebali biti o?tri ?ire se na dva piksela ure?aja. Uska linija mo?e se podebljati, susjedni prostor stanjiti, a omjer ?irine na koji se dekoder oslanja pluta

Nacrtan kao vektorski sadr?aj, isti simbol je skup ispunjenih pravokutnika opisanih u koordinatama korisni?kog prostora PDF-a. Nema fiksne mre?e piksela s kojom se treba boriti. Prilikom ispisa, ure?aj iscrtava svaki pravokutnik u rezoluciji koju stvarno ima, tako da je svaki rub modula o?tar onoliko koliko hardver dopu?ta, u bilo kojem mjerilu i bilo kojoj veli?ini ispisa. Pove?ajte vektorski simbol za paletnu naljepnicu ili ga smanjite za paket i geometrija ostaje to?na. Ta preciznost je ono ?to odr?ava visoku stopu ?itanja iz prvog poku?aja, ?to je i smisao postavljanja barkoda na stranicu

QR kodovi i četiri razine ispravka

QR je 2D matri?ni simbol koji se ?ita u obje osi odjednom, zbog ?ega pakira puno podataka u mali kvadrat. Njegova tolerancija na o?te?enja dolazi od Reed-Solomonove korekcije pogre?aka, ponu?ene na ?etiri razine. Razina L oporavlja otprilike 7 posto kodnih rije?i, M oko 15 posto, Q oko 25 posto, a H oko 30 posto. Vi?a razina korekcije nije besplatna. Kodne rije?i za oporavak zauzimaju kapacitet modula, pa za fiksnu koli?inu podataka vi?a razina name?e gu??i ili fizi?ki ve?i simbol

Kompromis je pitanje o okru?enju u kojem ?e simbol ?ivjeti. ?ist digitalni dokument koji ?e se skenirati samo sa zaslona mo?e ostati na razini L i biti kompaktan. Naljepnica koja ?e se ispisivati, dr?ati u rukama, strugati i mo?da djelomi?no prekriti trakom zahtijeva Q ili H, jer je dodatna redundantnost ono ?to omogu?uje dekoderu da rekonstruira korisni teret iz simbola koji vi?e nije besprijekoran. DrawQRCode uzima poziciju i SymbolSize koji fiksira nacrtanu ?irinu i visinu, plus vrijednost EncodeOptions koja odabire na?in rada podataka (0 za automatski, ili numeri?ke, alfanumeri?ke, ISO-8859-1 i UTF-8 varijante) i vrijednost DrawOptions za orijentaciju

var
  Pdf: TPDFlib;
begin
  Pdf := TPDFlib.Create(nil);
  try
    Pdf.NewDocument;
    Pdf.SetPageSize('A4');
    Pdf.SetMeasurementUnits(1);   // 1 = millimetres
    Pdf.NewPage;

    // 30 mm square QR, automatic encoding, normal orientation
    Pdf.DrawQRCode(20, 20, 30, 'https://www.loslab.com/', 0, 0);

    Pdf.SaveToFile('Label_QR.pdf');
  finally
    Pdf.Free;
  end;
end;

Samu razinu korekcije odabire enkoder kako bi podatke uklopio u simbol koji ste tra?ili. Ako vam je potrebna zajam?ena visoka razina za grubo okru?enje, velikodu?no odaberite veli?inu simbola tako da enkoder ima dovoljno prostora za redundantnost umjesto da bude prisiljen smanjiti je radi uklapanja

PDF417 za ID-ove i naljepnice za otpremu

PDF417 je slo?eni linearni simbol. Svaki red je kratki linearni barkod, a redovi se sla?u kako bi stvorili blok, zbog ?ega se pojavljuje na voza?kim dozvolama, ukrcajnim propusnicama i otpremnim naljepnicama prijevoznika gdje ?iri niz podataka mora sjediti u pravokutnom obliku. Njegova korekcija pogre?aka kre?e se na ljestvici od 0 do 8. Svaki korak otprilike udvostru?uje broj kodnih rije?i za ispravak, tako da razina 5 nosi daleko vi?e redundantnosti od razine 1, pod cijenu vi?e kodnih rije?i na stranici

Oblik bloka PDF417 je prilagodljiv, a to je va?no jer naljepnica ima fiksno podru?je za popunjavanje. DrawPDF417SymbolEx izla?e kontrole koje osnovni poziv nema. FixedColumns i FixedRows fiksiraju broj stupaca podataka i broj redaka, pri ?emu 0 zna?i da enkoder sam odlu?uje. ErrorLevel uzima -1 za automatski ili eksplicitno 0 do 8. ModuleSize je ?irina naju?eg elementa u trenutnoj mjernoj jedinici, a HeightWidthRatio postavlja koliko je svaki modul visok u odnosu na svoju ?irinu, ?to je na?in na koji blok ?inite kratkim i ?irokim ili visokim i uskim kako bi odgovarao prostoru koji imate

// Fixed 10 data columns, automatic rows, error level 5,
// module 0.30 mm wide, rows three times the module width tall
Pdf.DrawPDF417SymbolEx(20, 60, 'PDF417 PAYLOAD 0123456789',
  0,        // Options: 0 = normal orientation
  10,       // FixedColumns
  0,        // FixedRows: 0 = automatic
  5,        // ErrorLevel: 0 to 8
  0.30,     // ModuleSize, in the current measurement unit
  3.0);     // HeightWidthRatio

Fiksiranje stupaca je uobi?ajena poluga na predlo?ku naljepnice. Konstantan broj stupaca daje bloku predvidljivu ?irinu, tako da se okolni izgled ne pomi?e kako kodirani korisni teret mijenja duljinu od jednog dokumenta do drugog, dok enkoder dodaje redove prema dolje kako bi apsorbirao razliku

DataMatrix za male oznake

DataMatrix je simbol za kojim treba posegnuti kada oznaka mora biti mala. To je kompaktna 2D mre?a koja koristi ECC 200, modernu Reed-Solomonovu shemu, i ostaje ?itljiva na veli?inama na kojima bi QR simbol istih podataka bio nespretan. To ga ?ini standardnim izborom za izravno ozna?avanje dijelova, male elektroni?ke komponente i guste logisti?ke naljepnice

DrawDataMatrixSymbol uzima ModuleSize za korak to?ke, Encoding s vrijedno??u 1 za ASCII i SymbolSize koji je ili 0 za automatski ili jedna od standardnih kvadratnih i pravokutnih dimenzija, od 10x10 do 132x132. Parametar Options kombinira orijentaciju sa ?irinom mirne zone, gdje dodavanje 100 do 400 postavlja bijeli obrub od jednog do ?etiri modula. Mirna zona nije ukras. Dekoder treba tu ?istu marginu kako bi prona?ao uzorak pronalaza?a simbola, a simbol stije?njen uz drugu tintu je simbol koji se ne uspijeva o?itati

// Auto-sized ASCII DataMatrix, 0.5 mm module, normal orientation
// with a one-module quiet zone (Options 0 + 100)
Pdf.DrawDataMatrixSymbol(20, 110, 0.5, 'DMX-SN-4408812',
  1,        // Encoding: 1 = ASCII
  0,        // SymbolSize: 0 = automatic
  100);     // Options: normal + one-module quiet zone

Gdje 1D barkodovi i dalje vladaju

Dvodimenzionalni simboli privla?e pozornost, ali linearni barkodovi i dalje posjeduju velike dijelove maloprodaje i logistike, a razlog je instalirana baza laserskih skenera koji ?itaju jednim prelaskom. Code128 je radni konj za alfanumeri?ke podatke, a njegova u?inkovitost dolazi iz tri skupa znakova. Skup A pokriva kontrolne znakove i velika slova, skup B pokriva cijeli ispisivi ASCII raspon, a skup C je onaj koji je va?an za brojeve. Podskup C kodira par znamenki u jednom znaku simbola, tako da niz numeri?kih podataka zauzima upola manje znakova simbola nego ?to bi u skupu A ili B. To je najkompaktniji na?in za postavljanje dugog numeri?kog barkoda, a PDFlibPas implementacija Code128 automatski kombinira skupove B i C kako bi ga postigla

GS1-128, standard ranije nazvan EAN-128, nadogra?uje se na Code128 nose?i aplikacijske identifikatore, prefikse u zagradama koji primateljskom sustavu govore jesu li sljede?e znamenke serijski broj, ?ifra serije ili datum isteka valjanosti. Struktura je ozna?ena s FNC1, posebnim nepodatkovnim znakom koji ozna?ava simbol kao GS1-kodiran i razdvaja polja varijabilne duljine. U PDFlibPas-u crtate GS1-128 simbol pomo?u DrawBarcode koriste?i tip Code128 i literalni marker [FNC1] postavljen u niz podataka gdje po?inje svaki aplikacijski identifikator

var
  W: Double;
begin
  // Code128, with FNC1 markers this becomes a GS1-128 symbol.
  // AI 21 (serial) = ABC123, AI 20 (variant) = 13
  Pdf.DrawBarcode(20, 150, 60, 18, '[FNC1]21ABC123[FNC1]2013',
    3,        // Barcode: 3 = Code128
    0);       // Options: 0 = default drawing

  // Measure the rendered width for a 0.30 mm narrow bar before laying out
  W := Pdf.GetBarcodeWidth(0.30, '[FNC1]21ABC123[FNC1]2013', 3);
end;

Za po?tu, USPS Intelligent Mail, tako?er nazvan OneCode, kodira podatke o usmjeravanju i pra?enju u jednom barkodu moduliranom visinom za po?tansku automatizaciju. DrawIntelligentMailBarcode uzima eksplicitnu geometriju za ?irinu linije, punu visinu linije, visinu traga?a i ?irinu prostora, s podacima koji se dostavljaju kao niz od 20, 25, 29 ili 31 znamenke. Eksplicitne visine linije i traga?a postoje jer simbol nosi informacije o tome je li svaka linija puna, uzlazna ili silazna, a po?tanski ?ita? ovisi o tome dr?e li se te visine specifikacija

Praktični kontekst

Svaki ovdje prikazani poziv crta u sadr?aj trenutno odabrane stranice, istu povr?inu koja prima va? tekst i slike, tako da se barkod proizvodi kao dio uobi?ajenog generiranja dokumenta, a ne uvozi kao zaseban resurs. Budu?i da su simboli vektorski sadr?aj, podaci koje kodiraju i geometrija koju zauzimaju poznati su u trenutku crtanja, ?to vam omogu?uje da ih postavite deterministi?ki

Izgled linearnih obitelji ima koristi od prethodnog mjerenja. GetBarcodeWidth vra?a ukupnu nacrtanu ?irinu barkoda za zadanu ?irinu uske linije i tip barkoda, tako da mo?ete rezervirati to?an vodoravni prostor prije nego ?to izvr?ite crtanje, umjesto naga?anja i otkrivanja preklapanja nakon ?to se stranica izgradi. 2D simbole je jednostavnije postaviti jer njihovu nacrtanu veli?inu postavljate izravno putem SymbolSize ili ModuleSize, i simbol popunjava taj otisak. U svakom slu?aju, disciplina je ista. Odredite fizi?ku veli?inu na temelju okru?enja skeniranja, potvrdite da simbol stane u utor koji imate i dopustite vektorskoj geometriji da odr?i svaki rub o?trim od pregleda na zaslonu do kona?nog ispisa

Za ?iri tijek rada izgradnje stranica u koji se ovi barkodovi uklapaju, tehnike u na?em ?lanku o ekstrakciji teksta, slika i fontova pokrivaju ?itanje sadr?aja natrag iz PDF-a, a vodi? za spajanje i dijeljenje velikih PDF-ova s izravnim pristupom pokazuje kako u?inkovito sastaviti dokumente velikog volumena. Obje se prirodno povezuju s API-jem za crtanje koji je ovdje opisan, a koji se isporu?uje kao dio softvera Delphi PDF Library za Delphi i C++Builder, zajedno s API-jima za tekst, grafiku, obrasce i potpis koji su pokriveni drugdje na ovom blogu