Lähetystarrassa tai laskussa olevalla viivakoodilla on yksi tehtävä: se on pystyttävä lukemaan skannerilla ensimmäisellä yrityksellä. Se, selviääkö se tuosta yrityksestä, ratkaistaan kauan ennen kuin paketti saapuu laiturille. Sen ratkaisee se, miten symboli asetettiin sivulle. Yleisin virhe Delphi-raportointiputkessa on renderöidä viivakoodi bittikarttana jossain muualla ja asettaa kyseinen kuva PDF-tiedostoon. Se näyttää hyvältä näytöllä yhdellä zoomaustasolla ja heikkenee sitten kaikkialla muualla.
Vaihtoehtona on piirtää symboli vektorisisältönä suoraan sivulle. PDFlibPas tarjoaa piirtokutsujen perheen juuri tähän, kattaen 2D-matriisisymbolit QR, PDF417 ja DataMatrix, lineaariset perheet Code128 ja GS1-128 sekä USPS Intelligent Mail -viivakoodit postiautomaatiota varten. Perustelu vektorille ei ole esteettinen. Ky Scan-ympäristöstä riippumatta viivojen on osuttava sinne, minne skanneri ne odottaa.
Miksi vektori voittaa asetetun bittikartan
Viivakoodi on viivojen ja välien kuvio, tai kahdessa ulottuvuudessa tummien ja vaaleiden moduulien ruudukko. Dekooderi toimii mittaamalla näiden leveyksien suhdetta. Mikä tahansa, mikä vääristää suhteita, on kohinaa, joka kuluttaa symbolin virhebudjettia. Rasteroitu viivakoodikuva kantaa kiinteitä pikseleitä. Kun PDF renderöidään tulostimelle, jonka pisteet eivät jakaudu tasan kuvaruudukon kanssa, rasterointiohjelman on näytteistettävä uudelleen, ja moduulien reunat, joiden pitäisi olla teräviä, leviävät kahdelle laitepikselille. Kapea viiva voi paksuntua, viereinen väli ohentua, ja leveyssuhde, johon dekooderi luottaa, siirtyy.
Vektorisisältönä piirrettynä sama symboli on joukko täytettyjä suorakulmioita, jotka on kuvattu PDF-käyttäjäavaruuden koordinaateissa. Ei ole kiinteää pikseliruudukkoa, jota vastaan taistella. Tulostushetkellä laite renderöi jokaisen suorakulmion sen todellisella resoluutiolla, joten jokainen moduulin reuna on niin terävä kuin laitteisto sallii, missä tahansa mittakaavassa ja tulostuskoossa. Skaalaa vektorisymboli suuremmaksi lavatarraa varten tai kutista se pakettia varten, ja geometria pysyy tarkkana. Tämä tarkkuus pitää ensimmäisen lukukerran onnistumisprosentin korkeana, mikä on koko viivakoodin sivulle asettamisen idea.
QR-koodit ja neljä korjaustasoa
QR on 2D-matriisisymboli, joka luetaan molemmilla akseleilla kerralla, minkä vuoksi se pakkaa paljon tietoa pieneen neliöön. Sen vaurionsieto tulee Reed-Solomon-virheenkorjauksesta, jota tarjotaan neljällä tasolla. Taso L palauttaa noin 7 prosenttia koodisanoista, M noin 15 prosenttia, Q noin 25 percent ja H noin 30 prosenttia. Korkeampi korjaustaso ei ole ilmainen. Palautuskoodisanat vievät moduulikapasiteettia, joten kiinteälle tietomäärälle korkeampi taso pakottaa tiheämmän tai fyysisesti suuremman symbolin.
Valinta riippuu ympäristöstä, jossa symboli elää. Puhdas digitaalinen dokumentti, joka skannataan vain näytöltä, voi olla tasolla L ja pysyä kompaktina. Tarra, joka tulostetaan, jota käsitellään, hankataan ja mahdollisest osittain peitetään teipillä, vaatii tason Q tai H, koska ylimääräinen redundanssi antaa dekooderin rekonstruoida hyötykuorman symbolista, joka ei ole enää virheetön. DrawQRCode ottaa sijainnin ja piirretyn leveyden sekä korkeuden kiinnittävän SymbolSize-arvon, sekä tietotilan valitsevan EncodeOptions-arvon (0 automaattiselle tai numeeriselle, aakkosnumeeriselle, ISO-8859-1- ja UTF-8-varianteille) ja suuntauksen DrawOptions-arvon.
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;
Kooderi valitsee korjaustason sovittaakseen tiedot pyytämääsi symboliin. Jos tarvitset taatun korkean tason vaativaan ympäristöön, mitoita symboli reilusti, jotta kooderilla on moduulibudjettia käytettäväksi redundanssiin sen sijaan, että se pakotettaisiin alas mahtumaan.
PDF417 henkilökorteille ja lähetystarroille
PDF417 on pinottu lineaarinen symboli. Jokainen rivi on lyhyt lineaarinen viivakoodi, ja rivit pinoutuvat muodostamaan lohkon, minkä vuoksi se esiintyy ajokorteissa, tarkastuskorteissa ja kuljetusliikkeiden lähetystarroissa, joissa laajemman tietokaistaleen on mahduttava suorakulmaiseen tilaan. Sen virheenkorjaus toimii asteikolla 0-8. Jokainen askel karkeasti kaksinkertaistaa korjauskoodisanojen määrän, joten taso 5 kantaa paljon enemmän redundanssia kuin taso 1, sivulla olevien koodisanojen kustannuksella.
PDF417-lohkon muoto on säädettävissä, ja sillä on merkitystä, koska tarralla on kiinteä alue täytettävänä. DrawPDF417SymbolEx tuo käyttöön säätimet, joita peruskutsu ei tarjoa. FixedColumns ja FixedRows kiinnittävät tietosarake- ja rivimäärän, arvon 0 antaessa kooderin päättää. ErrorLevel ottaa arvon -1 automaattiselle tai nimenomaisen 0-8 arvon. ModuleSize on kapeimman elementin leveys nykyisessä mittayksikössä, ja HeightWidthRatio asettaa, kuinka korkea kukin moduuli on suhteessa leveyteensä, jolla lohkosta saadaan matala ja leveä tai korkea ja kapea sopimaan tilaasi.
// 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
Sarakkeiden kiinnittäminen on tavallinen keino tarrastruktuurissa. Vakio sarakemäärä antaa lohkolle ennustettavan leveyden, joten ympäröivä asettelu ei siirry, kun koodattu hyötykuorma muuttaa pituuttaan dokumentista toiseen, kooderin lisätessä rivejä alaspäin eron absorboimiseksi.
DataMatrix pieniin merkintöihin
DataMatrix on symboli, johon kannattaa tarttua, kun merkinnän on oltava pieni. Se on kompakti 2D-ruudukko, joka käyttää ECC 200 -menetelmää (moderni Reed-Solomon-skeema), ja se pysyy luettavana koossa, jossa saman tiedon QR-symboli olisi hankala. Se tekee siitä vakiovalinnan osien suoraan merkintään, pieniin elektronisiin komponentteihin ja tiheisiin logistiikkatarroihin.
DrawDataMatrixSymbol ottaa ModuleSize-arvon pistevälille, Encoding-arvon 1 ASCII-koodaukselle ja SymbolSize-arvon, joka on joko 0 automaattiselle tai jokin standardeista neliö- ja suorakulmamitoista välillä 10x10 - 132x132. Options-parametri yhdistää suuntauksen hiljaisen alueen (quiet-zone) leveyteen, jossa arvojen 100-400 lisääminen asettaa yhdestä neljään moduulin valkoisen reunuksen. Hiljainen alue ei ole koriste. Dekooderi tarvitsee tämän puhtaan marginaalin symbolin etsintäkuvion löytämiseksi, ja muiden musteiden viereen tungettu symboli on symboli, jota ei voida lukea.
// 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
Missä 1D-viivakoodit edelleen hallitsevat
Kaksiulotteiset symbolit saavat huomion, mutta lineaariset viivakoodit hallitsevat edelleen suuria osia vähittäiskaupasta ja logistiikasta. Syynä on laser-skannerien laitekanta, joka lukee yhdellä pyyhkäisyllä. Code128 on aakkosnumeerisen tiedon työjuhta, ja sen tehokkuus tulee kolmesta merkkijoukosta. Joukko A kattaa ohjausmerkit ja suuraakkoset, joukko B kattaa koko tulostettavan ASCII-alueen, ja joukko C on se, jolla on merkitystä numeroille. Osajoukko C koodaa numeroparin yhdeksi symbolimerkiksi, joten numeerisen tiedon sarja vie puolet vähemmän symbolimerkkejä kuin joukossa A tai B. Se on kompaktein tapa esittää pitkä numeerinen viivakoodi, ja PDFlibPas-kirjaston Code128-toteutus yhdistää B- ja C-joukot automaattisesti saavuttaakseen tämän.
GS1-128, standardi, joka aiemmin tunnettiin nimellä EAN-128, rakentuu Code128:n päälle kantamalla sovellustunnisteita (Application Identifier) - sulkeissa olevia etuliitteitä, jotka kertovat vastaanottavalle järjestelmälle, ovatko seuraavat numerot sarjanumero, eräkoodi vai vanhenemispäivä. Rakenne merkitään FNC1-merkillä, joka on erityinen ei-tietomerkki, joka liputtaa symbolin GS1-koodatuksi ja erottaa vaihtelevan pituiset kentät. PDFlibPas-kirjastossa piirrät GS1-128-symbolin DrawBarcode-metodilla käyttäen Code128-tyyppiä ja nimenomaista [FNC1]-merkintää asetettuna tietojonoon kohdassa, josta kukin sovellustunniste alkaa.
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;
Postia varten USPS Intelligent Mail -viivakoodi, jota kutsutaan myös nimellä OneCode, koodaa reititys- ja seurantatiedot yhteen korkeusmoduloituun viivakoodiin postiautomaatiota varten. DrawIntelligentMailBarcode ottaa nimenomaisen geometrian viivan leveydelle, koko viivan korkeudelle, seurantaviivan korkeudelle ja välin leveydelle, tiedon ollessa toimitettuna vain numeroista koostuvana 20, 25, 29 tai 31 numeron jonona. Nimenomaiset viivan ja seurantaviivan korkeudet ovat olemassa, koska symboli kantaa tietoa siitä, onko kukin viiva kokonainen viiva, ylälinjan viiva vai alalinjan viiva, ja postinlukija riippuu siitä, että nämä korkeudet pidetään määritysten mukaisina.
Piirtäminen sivulle ja mittaaminen asettelua varten
Jokainen tässä näytetty kutsu piirtää parhaillaan valitun sivun sisältöön, samalle pinnalle, joka vastaanottaa tekstisi ja kuvasi, joten viivakoodi tuotetaan osana normaalia dokumentin luontia sen sijaan, että se tuotaisiin erillisenä resurssina. Koska symbolit ovat vektorisisältöä, niiden koodaama tieto ja niiden viemä geometria ovat molemmat tiedossa piirtohetkellä, mikä sallii sinun sijoittaa ne deterministisesti.
Lineaaristen perheiden asettelu hyötyy ensin mittaamisesta. GetBarcodeWidth palauttaa viivakoodin kokonaisleveyden annetulle kapean viivan leveydelle ja viivakoodityypille, joten voit varata tarkan vaakasuuntaisen tilan ennen piirtämistä sen sijaan, että arvailet ja huomaat päällekkäisyyden sivun rakentamisen jälkeen. 2D-symbolit on helpompi sijoittaa, koska asetat niiden koon suoraan SymbolSize- tai ModuleSize-arvolla, ja symboli täyttää kyseisen tilan. Molemmissa tapauksissa kuri on sama. Päätä fyysinen koko skannausympäristön mukaan, varmista symbolin sopivan sille varattuun tilaan ja anna vektorigeometrian pitää jokainen reuna terävänä näytön esikatselusta lopulliseen tulosteeseen.
Laajempaa sivujen rakentamisen työnkulkua varten, johon nämä viivakoodit putoavat, tekniikat our article on text, image, and font extraction kattavat sisällön lukemisen takaisin PDF-tiedostosta, ja the guide to large PDF merge and split with direct access näyttää, kuinka suuria dokumentteja kootaan tehokkaasti. Molemmat pariutuvat luonnollisesti tässä kuvatun piirto-rajapinnan kanssa, joka toimitetaan osana Delphi- ja C++Builder-ohjelmille tarkoitettua Delphi PDF Library -kirjastoa yhdessä muiden tässä blogissa käsiteltyjen teksti-, grafiikka-, lomake- ja allekirjoitusrajapintojen kanssa.