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