Bar-kod na otpremnoj nalepnici ili fakturi ima jedan posao, a to je da ga skener pročita iz prvog pokušaja. Da li će preživeti taj prolaz odlučuje se mnogo pre nego što paket stigne do rampe. Odlučuje se načinom na koji je simbol postavljen na stranicu. Najčešća greška u Delphi cevovodu za izveštavanje je renderovanje bar-koda kao bitmape na nekom drugom mestu i postavljanje te slike u PDF. Izgleda dobro na ekranu na jednom nivou zumiranja, a zatim degradira na svim ostalim mestima.
Alternativa je iscrtavanje simbola kao vektorskog sadržaja, direktno na stranici. PDFlibPas izlaže porodicu poziva za iscrtavanje upravo za to, pokrivajući 2D matrične simbole QR, PDF417 i DataMatrix, linearne porodice kroz Code128 i GS1-128, kao i USPS Intelligent Mail za poštansku automatizaciju. Argument za vektor nije estetski. Reč je o tome da li linije sleću tamo gde ih skener očekuje.
Zašto je vektor bolji od postavljene bitmape
Bar-kod je šablon linija i razmaka, ili u dve dimenzije mreža tamnih i svetlih modula. Dekoder radi tako što meri odnos tih širina. Sve što iskrivljuje odnose je šum koji troši budžet za greške simbola. Rasterizovana slika bar-koda nosi fiksne piksele. Kada se PDF renderuje na štampaču čije se tačke ne dele ravnomerno u mrežu slike, rasterizator mora ponovo da uzorkuje, a ivice modula koje bi trebale biti oštre šire se na dva piksela uređaja. Uska linija se može proširiti, susedni razmak se može smanjiti, i odnos širina na koji se dekoder oslanja odstupa.
Iscrtan kao vektorski sadržaj, isti simbol je skup popunjenih pravougaonika opisanih u koordinatama korisničkog prostora PDF-a. Nema fiksne mreže piksela sa kojom se treba boriti. Prilikom štampanja, uređaj renderuje svaki pravougaonik u rezoluciji koju stvarno poseduje, tako da je svaka ivica modula oštra onoliko koliko hardver dozvoljava, na bilo kojoj skali i veličini štampe. Povećajte vektorski simbol za paletnu nalepnicu ili ga smanjite za paket i geometrija ostaje tačna. Ta preciznost je ono što održava visoku stopu čitanja iz prvog prolaza, što je i poenta postavljanja bar-koda na stranicu.
QR kodovi i četiri nivoa korekcije
QR je 2D matrični simbol koji se čita u obe ose istovremeno, zbog čega pakuje mnogo podataka u mali kvadrat. Njegova tolerancija na oštećenja dolazi od Reed-Solomon korekcije grešaka, koja se nudi na četiri nivoa. Nivo L oporavlja oko 7 procenata kodnih reči, M oko 15 procenata, Q oko 25 procenata, a H oko 30 procenata. Veća korekcija nije besplatna. Kodne reči za oporavak zauzimaju kapacitet modula, pa za fiksnu količinu podataka viši nivo nameće gušći ili fizički veći simbol.
Kompromis je pitanje okruženja u kom će simbol živeti. Čist digitalni dokument koji će se skenirati samo sa ekrana može biti na nivou L i ostati kompaktan. Nalepnica koja će se štampati, premeštati, habati i eventualno delimično prekriti trakom zahteva nivo Q ili H, jer je dodatna redundantnost ono što omogućava dekoderu da rekonstruiše sadržaj iz simbola koji više nije netaknut. DrawQRCode uzima poziciju i SymbolSize koji fiksira iscrtanu širinu i visinu, plus vrednost EncodeOptions koja bira režim podataka (0 za automatski, ili numeričke, alfanumeričke, ISO-8859-1 i UTF-8 varijante) i vrednost 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;
Sam nivo korekcije bira enkoder kako bi uklopio podatke u simbol koji ste tražili. Ako vam je potreban zagarantovano visok nivo za surovo okruženje, dimenzionišite simbol velikodušno tako da enkoder ima budžet modula koji može potrošiti na redundantnost umesto da bude primoran da ga smanji radi uklapanja.
PDF417 za identifikacione dokumente i otpremne nalepnice
PDF417 is a stacked linear symbol. Each row is a short linear barcode, and the rows stack to form a block, which is why it appears on driver licenses, boarding passes, and carrier shipping labels where a wider strip of data has to sit in a rectangular footprint. Its error correction runs on a scale of 0 to 8. Each step roughly doubles the number of correction codewords, so level 5 carries far more redundancy than level 1, at the cost of more codewords on the page.
Oblik PDF417 bloka je podesiv, a to je važno jer nalepnica ima fiksnu površinu koju treba popuniti. DrawPDF417SymbolEx izlaže kontrole koje osnovni poziv nema. FixedColumns i FixedRows fiksiraju broj kolona podataka i broj redova, pri čemu 0 znači da enkoder sam odluči. ErrorLevel uzima -1 za automatski ili eksplicitnih 0 do 8. ModuleSize je širina najužeg elementa u trenutnoj jedinici mere, a HeightWidthRatio postavlja visinu svakog modula u odnosu na njegovu š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 kolona je uobičajena poluga na šablonu nalepnice. Konstantan broj kolona daje bloku predvidljivu širinu, tako da se okolni raspored ne pomera kako kodirani sadržaj menja dužinu od jednog dokumenta do drugog, dok enkoder dodaje redove nadole da apsorbuje 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-Solomon šemu, i ostaje čitljiva na veličinama na kojima bi QR simbol istih podataka bio nezgodan. To je čini standardnim izborom za direktno označavanje delova, male elektronske komponente i guste logističke nalepnice.
DrawDataMatrixSymbol uzima ModuleSize za korak tačke (dot pitch), Encoding od 1 za ASCII, i SymbolSize koji je ili 0 za automatski ili jednu od standardnih kvadratnih i pravougaonih dimenzija, od 10x10 do 132x132. Parametar Options kombinuje orijentaciju sa širinom mirne zone (quiet-zone), gde dodavanje 100 do 400 postavlja belu granicu od jednog do četiri modula. Mirna zona nije ukras. Dekoderu je potrebna ta čista margina da pronađe šablon lokatora simbola, a simbol sabijen uz drugo mastilo je simbol koji ne uspeva da se očita.
// 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
Gde 1D bar-kodovi i dalje vladaju
Dvodimenzionalni simboli privlače pažnju, ali linearni bar-kodovi i dalje poseduju velike delove maloprodaje i logistike, a razlog je instalirana baza laserskih skenera koji čitaju jednim prelaskom. Code128 je glavni radni konj za alfanumeričke podatke, a njegova efikasnost dolazi iz tri skupa karaktera. Skup A pokriva kontrolne karaktere i velika slova, skup B pokriva puni opseg ASCII karaktera koji se mogu štampati, a skup C je onaj koji je važan za brojeve. Podskup C kodira par cifara u jednom karakteru simbola, tako da niz numeričkih podataka zauzima upola manje karaktera simbola nego u skupu A ili B. To je najkompaktniji način da se postavi dugi numerički bar-kod, a PDFlibPas Code128 implementacija automatski kombinuje skupe B i C da bi to postigla.
GS1-128, standard ranije poznat kao EAN-128, nadograđuje se na Code128 prenoseći aplikacione identifikatore (Application Identifiers), zagradama označene prefikse koji prijemnom sistemu govore da li su sledeće cifre serijski broj, kod serije ili datum isteka. Deonica je označena karakterom FNC1, posebnim ne-podatkovnim karakterom koji označava simbol kao GS1-kodiran i razdvaja polja promenljive dužine. U PDFlibPas-u iscrtavate GS1-128 simbol pomoću DrawBarcode koristeći Code128 tip i literalni marker [FNC1] postavljen u niz podataka gde počinje svaki aplikacioni 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);
// 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đe nazvan OneCode, kodira podatke o rutiranju i praćenju u jednom bar-kodu modulisane visine za poštansku automatizaciju. DrawIntelligentMailBarcode uzima eksplicitnu geometriju za širinu linije, punu visinu linije, visinu trakera i širinu razmaka, sa podacima koji se dostavljaju kao niz od 20, 25, 29 ili 31 cifre. Eksplicitne visine linija i trakera postoje jer simbol nosi informacije o tome da li je svaka linija puna linija, gornji produžetak (ascender) ili donji produžetak (descender), a poštanski čitač zavisi od toga da te visine budu u skladu sa specifikacijom.
Iscrtavanje na stranici i merenje za raspored
Svaki poziv prikazan ovde crta u sadržaj trenutno izabrane stranice, istu površinu koja prima vaš tekst i slike, tako da se bar-kod proizvodi kao deo normalnog generisanja dokumenta, a ne uvozi se kao zasebno sredstvo. Pošto su simboli vektorski sadržaj, podaci koje kodiraju i geometrija koju zauzimaju poznati su u vreme crtanja, što vam omogućava da ih postavite deterministički.
Raspoređivanje linearnih porodica ima koristi od prethodnog merenja. GetBarcodeWidth vraća ukupnu iscrtanu širinu bar-koda za datu širinu uske linije i tip bar-koda, tako da možete rezervisati tačan horizontalni prostor pre nego što izvršite crtanje, umesto da nagađate i otkrijete preklapanje nakon što je stranica izgrađena. 2D simbole je lakše postaviti jer njihovu iscrtanu veličinu podešavate direktno preko SymbolSize ili ModuleSize, i simbol popunjava taj otisak. U svakom slučaju, disciplina je ista. Odlučite o fizičkoj veličini na osnovu okruženja skeniranja, potvrdite da simbol odgovara mestu koje imate i pustite da vektorska geometrija zadrži svaku ivicu oštrom od pregleda na ekranu do konačnog štampanja.
Za širi tok rada izgradnje stranica u koji se ovi bar-kodovi uklapaju, tehnike u našem članku o ekstrakciji teksta, slika i fontova pokrivaju čitanje sadržaja nazad iz PDF-a, a vodič za spajanje i deljenje velikih PDF-ova sa direktnim pristupom pokazuje kako da efikasno sastavite dokumente velikog obima. Oba se prirodno povezuju sa API-jem za iscrtavanje opisanim ovde, koji se isporučuje kao deo Delphi PDF Library za Delphi i C++Builder zajedno sa API-jima za tekst, grafiku, formulare i potpise koji su pokriveni na drugim mestima na ovom blogu.