Viivakoodi ei ole kuva, jolla koristelet asiakirjaa. Se on mittaus, ja skanneri on instrumentti, joka lukee sen. Tämä uudelleenkehystys ratkaisee melkein kaiken siinä, miten sinun tulisi piirtää sellainen PDF-tiedostoon. Viivat eivät kanna tietoa mustuudellaan; tieto asuu viivojen leveyksien ja välilyöntien leveyksien suhteessa, ja lukija palauttaa sen ajoittamalla siirtymät, kun laser tai sensori pyyhkäisee sen yli. Purista tuota geometriaa, sumenna sitä tai ahdasta sen marginaalit, ja tuotat jotain, mikä näyttää täsmälleen viivakoodilta ja skannautuu kuin tahra. HotPDF antaa sinulle kaksi tapaa sijoittaa viivakoodi sivulle, ja niiden välinen ero on nimenomaan ero tuon geometrian hallinnan ja siitä luopumisen välillä

Mitä HotPDF voi koodata
HotPDF piirtää lineaarisia (yksiulotteisia) symboliikkoja, ja valikoima on laajempi kuin useimmat projektit tarvitsevat. THPDFBarcodeType-lueteltu tyyppi (enumeration) kattaa Code 2 of 5 -perheen lomitetussa, teollisessa ja matriisimuodossaan; Code 39:n ja sen laajennetun variantin; kolme Code 128 -osajoukkoa A, B ja C; Code 93:n tavallisena ja laajennettuna; MSI:n; PostNetin; Codabarin; vähittäiskaupan UPC- ja EAN-ryhmän, eli EAN-8, EAN-13, UPC-A, pakatun UPC-E0:n ja UPC-E1:n sekä UPC:n täydentävät 2- ja 5-numeroiset lisäosat; sekä GS1-128 (EAN-128) -osajoukot. Se riittää kattamaan toimitusketjujen etiketit, vähittäiskaupan myyntipisteet ja vanhemmat teolliset koodit, jotka ovat edelleen elossa varastoissa
Mitä se ei piirrä, on kaksiulotteinen perhe. Täällä ei ole QR:ää, Data Matrixia tai PDF417:ää. Ne koodaavat tavuja ruudukossa omalla virheenkorjausmatematiikallaan, ja jos vaatimus nimeää jonkin niistä, tämä on väärä työkalu, ja sinun tulisi tietää se ennen kuin rakennat sen ympärille eikä sen jälkeen. Yksiulotteisille koodeille käytännön kysymys on kapeampi: mikä symboliikka hyväksyy tiedot, joita sinulla todellisuudessa on, koska koodaukset eivät ole keskenään vaihdettavissa
Tietojen rajoitukset ovat todellisia, ja ne iskevät luontivaiheessa. Code 2 of 5 -variantit ja MSI ottavat vain numeroita. Code 39 kantaa isoja kirjaimia, numeroita ja kourallisen välimerkkejä; jos tarvitset pieniä kirjaimia tai koko ASCII-alueen, se on Code 39 Extended tai Code 128 -osajoukko. Code 128C pakkaa kaksi numeroa kuhunkin symboliin tiheyden vuoksi, joten se haluaa parillisen pituisen numeromerkkijonon eikä mitään muuta. EAN-13 odottaa kahduttatoista numeroa ja laskee kolmannentoista tarkistusnumeroksi; EAN-8 odottaa seitsemää ja laskee kahdeksannen; UPC-A ottaa kaksitoista. Anna symboliikalle tietoa, jota se ei voi esittää, etkä saa avuliasta poikkeusta (exception), vaan saat viivakoodin, joka koodaa roskaa, mikä on pahempaa, koska se näyttää hyvältä, kunnes joku skannaa sen kassalla
Kaksi piirtopolkua, kaksi hallinnan tasoa
Tuotannossa tavoiteltava menetelmä on DrawBarcode, sivun objektissa (page object). Se ottaa symboliikan, sijainnin, korkeuden ja yhden parametrin, joka on tärkeämpi kuin muut: MUnit, moduulin leveyden. Moduuli on kapeimman viivan leveys, atomi, jonka kerrannaisia kaikki muut koodin mitat ovat, ja se ilmaistaan tässä pisteinä (points). Kaikki siinä, pystytäänkö tulostettu tulos skannaamaan, palautuu tähän yhteen kokonaislukuun
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'label.pdf';
Pdf.BeginDoc;
// BCType, X, Y, Height, MUnit (moduulin leveys pisteinä), angle,
// data, UseCheckSum, viivojen väri, taustaväri.
Pdf.CurrentPage.DrawBarcode(
bcCodeEAN13, // symboliikka
72, 680, // X, Y pisteinä vasemmasta alakulmasta
60, // viivojen korkeus
1, // MUnit: 1 pt kapein viiva
0, // ei kiertoa
'123456789012', // 12 numeroa; 13. on tarkistusnumero
True, // lisää modulo-10 -tarkistusnumero
clBlack, clWhite); // viivat mustia, tausta valkoinen
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
Kaksi argumenttia ansaitsee tarkemman katsauksen. UseCheckSum lisää modulo-10 -tarkistusnumeron, jota symboliikka odottaa, ja vähittäiskaupan koodeille haluat sen lähes aina olevan True; kytke se pois päältä vain, kun tietosi kantavat jo ennalta laskettua tarkistusta, tai saat kaksinkertaisen numeron. Viivan ja taustan värit ovat kaksi viimeistä parametria, ja houkutus olla luova tässä on ansa, jota käsitellään jäljempänä. Huomioi myös koordinaattien origo: kuten kaikki muutkin HotPDF:n piirtokutsut, X ja Y mitataan sivun vasemmasta alakulmasta pisteinä, ja Y kasvaa ylöspäin, sama konventio, jota Hello World -esimerkki käy läpi
Toinen polku on DirectDrawBarcode, joka ottaa tiedot ja rajauslaatikon (bounding box), X, Y, Width, Height, ja skaalaa viivakuvion täyttämään tuon leveyden. Se on kätevä koodien sijoitteluun ruudukkoon, koska sinä nimeät jalanjäljen ja menetelmä sovittaa viivat siihen. Tämä mukavuus on myös sen vaara. Kun annat sille leveyden, et enää aseta moduulin kokoa; menetelmä jakaa sille sallimasi tilan sille viivamäärälle, jonka tiedot tarvitsevat, ja kapeimmasta viivasta tulee se, mitä tuosta jaosta sattuu tulemaan. Jos pyydät tiheää Code 128 -merkkijonoa liian kapeaan laatikkoon, moduulit kutistuvat äänettömästi sen alle, mitä yksikään skanneri voi erottaa. Käytä kaikenlaisille koodeille, jotka on skannattava luotettavasti, mieluummin DrawBarcode-funktiota ja aseta MUnit harkitusti. Varaa DirectDrawBarcode esikatseluihin ja asetteluihin, joissa olet mitannut, että tuloksena syntyvät viivat pysyvät luettavina
Moduulin leveys on resoluutiopäätös
Tässä on aritmetiikka, joka määrittää, toimiiko etikettisi. Laserskannerilla ja kameralla kummallakin on pienin ominaisuus (feature), jonka ne voivat erottaa, ja kapean viivan on asututtava mukavasti sen yläpuolella tulostuksen jälkeen. Laajasti lainattu alaraja yleiskäyttöisille lineaarisille koodeille on 13 mil:n kapea viiva, noin 0,33 mm, ja monet vähittäiskaupan ja teollisuuden oppaat pitävät sitä miniminä pikemminkin kuin tavoitteena. Käännä se PDF-yksiköiksi: yksi piste on 1/72 tuumaa, karkeasti 0,353 mm, joten yhden pisteen moduulin leveys istuu juuri tuolla alarajalla. Siksi MUnit := 1 on pienin arvo, johon sinun pitäisi luottaa oikealle skannerille tarkoitetussa koodissa, ja siksi sen kaksinkertaistaminen arvoon 2 ostaa marginaalin, joka ei maksa juuri mitään etiketissä, jossa on tilaa jäljellä
Yhdistä tämä nyt tulostusresoluutioon, koska moduulin on selviydyttävä myös tulostimesta. 300 DPI:n lasertulostimessa yksi laitteen piste (dot) on 1/300 tuumaa, joten yhden pisteen (point) moduuli on noin neljä tulostuspistettä leveä. Neljä tulostuspistettä on juuri ja juuri tarpeeksi puhtaan reunan renderöimiseen; väriaineen leviäminen ja hienoinen kohdistusvirhe syövät sitä, ja viiva, joka PDF-tiedostossasi oli yhden pisteen levyinen, tulostuu paksumpana tai ohuempana kuin määrittely sallii. Nosta moduuli 2 pisteeseen ja sinulla on kahdeksan tulostuspistettä työskenneltävänä, mikä vaimentaa tuon kohinan. Sääntö, joka kannattaa sisäistää: pisteinä asettamasi moduulin leveyden on vastattava kokonaista, mukavaa lukumäärää laitteen tulostuspisteitä (device dots) todellisella tulostusresoluutiollasi, ei sillä resoluutiolla, jonka toivoisit omaavasi. Koodi, joka skannautuu virheettömästi näytöltä ja epäonnistuu varastotulostimelta, on lähes aina epäonnistunut tässä tarkistuksessa
Hiljainen alue on osa symbolia
Yleisin yksittäinen syy sille, miksi oikein koodattu viivakoodi ei skannaudu, on hiljainen alue (quiet zone), tyhjä marginaali viivojen kummallakin puolella. Skannerit käyttävät tuota tyhjyyttä löytääkseen, mistä koodi alkaa ja mihin se päättyy; ilman sitä lukija ei voi erottaa ensimmäistä viivaa mistä tahansa, mikä istuu sen vieressä sivulla. Standardit ovat tarkkoja. Useimmat lineaariset symboliikat haluavat vähintään kymmenen kertaa moduulin leveyden suuruisen hiljaisen alueen kummallekin puolelle, ja UPC- ja EAN-vähittäiskauppakoodit vaativat yhdeksää moduulia vasemmalle ja seitsemää oikealle. Yhden pisteen moduulilla se on karkeasti kymmenen pistettä, noin seitsemäsosa tuumaa, taattua valkoista tilaa viivojen kummallakin puolella
HotPDF piirtää viivat eikä mitään muuta. Se ei varaa hiljaista aluetta puolestasi, mikä tarkoittaa, että vastuu on sinun ja se on helppo unohtaa. Vikatila on hienovarainen: asetat viivakoodin tasaisesti taulukon solun reunaa vasten, tai annat sivun asettelun ahtaa logon ylös sen viereen, ja koodi, joka läpäisi jokaisen testin tyhjällä sivulla, lakkaa skannautumasta sillä hetkellä, kun se lähetetään todellisen asiakirjan sisällä. Budjetoi marginaali eksplisiittisesti. Ennen kuin kutsut DrawBarcode-funktiota, jätä vähintään kymmenen moduulin leveyden verran tyhjää tilaa molemmille puolille, ja käsittele mitä tahansa grafiikkaa, viivaa tai tekstiä, joka tunkeutuu tuolle kaistaleelle, vikana, ei kosmeettisena valintana
Väri, kontrasti ja ihmisen luettavissa oleva rivi
Viivojen ja taustan värit ovat olemassa, jotta voit sovittaa ne brändin palettiin, ja ne ovat nopein tapa rikkoa toimiva koodi. Skannerit lukevat kontrastia, klassisesti punaisella valolla, ja ne odottavat tummia viivoja vaalealla kentällä. Musta valkoisella on ainoa yhdistelmä, johon sinun pitäisi tarttua ilman testausta. Tummansininen tai tummanvihreä valkoisella voi mennä läpi; mikään, jolla on alhainen luminanssikontrasti, ja erityisesti punaiset viivat, jotka punavalo-skanneri näkee taustana, eivät toimi. Jos suunnittelija pyytää värillisiä viivakoodeja, rehellinen vastaus on, että viivat pysyvät mustina ja väri menee jonnekin muualle etikettiin
DrawBarcode-polku voi myös renderöidä ihmisen luettavissa olevan tekstin (human-readable text) viivojen alle, numerot, jotka myyjä näppäilee, kun skannaus epäonnistuu. Tuo teksti on varajärjestelmä, ei koriste, joten kun asetat oman kuvatekstisi, pidä se poissa hiljaiselta alueelta; sivumarginaaliin ahdettu symboliikan nimike tuhoaa saman tyhjän tilan, josta skanneri on riippuvainen. Tässä esimerkissä olevat kentät, mukaan lukien TextOut mille tahansa ympäröiville nimikkeille, ovat samat piirtokutsut, joita käsitellään raportin tulostusoppaassa, joka on oikea paikka, kun viivakoodi on yksi elementti suuremmassa sommitellussa sivussa
Lyhyt varmennustapa
Vektori-viivat ovat etu, joka kannattaa nimetä. Koska DrawBarcode kirjoittaa koodin PDF-piirto-operaattoreina rasteroidun kuvan sijaan, viivat pysyvät terävinä millä tahansa zoomaustasolla, eikä tiedosto kanna omaa resoluutiotaan; ainoa resoluutio, jolla on väliä, on tulostimen. Se ei vapauta sinua testaamisesta, se vain tarkoittaa, että testin on tapahduttava paperilla. Generoi näyte, tulosta se alhaisimman resoluution laitteella, jonka koodisi todellisuudessa kohtaavat, ja skannaa se saman luokan lukijalla, jota käyttäjäsi pitelevät, ei työpöydälläsi olevalla huipputason kuvanlukijalla. Tarkista hiljaiset alueet viivaimella tulosteesta, varmista, että moduulin leveys selvisi matkasta pisteistä (points) tulostuspisteisiin (dots), ja varmista, että purettu arvo vastaa sitä, mitä koodasit, tarkistusnumeroineen kaikkineen. Viisi minuuttia oikean skannerin kanssa saa kiinni jokaisen yllä kuvatun vian, ja se saa ne kiinni ennen kuin lavallinen väärin merkittyä varastoa ehtii
Tässä esitetyt DrawBarcode- ja DirectDrawBarcode-menetelmät ovat osa HotPDF-komponenttia Delphille ja C++Builderille