En strekkode er ikke et bilde du dekorerer et dokument med. Det er en måling, og skanneren er instrumentet som leser den. Den omformuleringen avgjør nesten alt om hvordan du bør tegne en inn i en PDF. Strekene bærer ingen informasjon i sin svarthet; informasjonen ligger i forholdet mellom strekbredder og mellombredder, og en leser gjenskaper den ved å tidsregistrere overgangene når en laser eller sensor sveiper over. Klem den geometrien, gjør den uskarp, eller treng sammen margene, og du produserer noe som ser nøyaktig ut som en strekkode og skannes som en flekk. HotPDF gir deg to måter å plassere en på en side, og forskjellen mellom dem er nettopp forskjellen mellom å kontrollere den geometrien og å gi slipp på den

Hva HotPDF kan kode
HotPDF tegner lineære (endimensjonale) symbologier, og settet er bredere enn de fleste prosjekter trenger. THPDFBarcodeType-enumerasjonen dekker Code 2 of 5-familien i sine flettede (interleaved), industrielle og matrise-former; Code 39 og dens utvidede variant; de tre Code 128-delsettene A, B og C; Code 93 vanlig og utvidet; MSI; PostNet; Codabar; detaljhandel-UPC- og EAN-gruppen, nemlig EAN-8, EAN-13, UPC-A, de komprimerte UPC-E0 og UPC-E1, og UPC-tilleggene med 2 og 5 sifre; og GS1-128 (EAN-128)-delsettene. Det er nok til å dekke forsyningskjedeetiketter, detaljhandel-kassasystemer, og de eldre industrielle kodene som fremdeles lever i varehus
Det den ikke tegner, er den todimensjonale familien. Det er ingen QR, Data Matrix eller PDF417 her. Disse koder byte i et rutenett med sin egen feilkorrigeringsmatematikk, og hvis et krav nevner en av dem, er dette feil verktøy, og du bør vite det før du bygger rundt det snarere enn etter. For endimensjonale koder er det praktiske spørsmålet snevrere: hvilken symbologi aksepterer dataene du faktisk har, fordi kodingene ikke er utskiftbare
Databegrensningene er reelle, og de gjør seg gjeldende under generering. Code 2 of 5-variantene og MSI tar kun sifre. Code 39 bærer store bokstaver, sifre og en håndfull skilletegn; hvis du trenger små bokstaver eller hele ASCII-spekteret, er det Code 39 Extended eller et Code 128-delsett. Code 128C pakker to sifre inn i hvert symbol for tetthet, så den ønsker en sifferstreng med partallslengde og ingenting annet. EAN-13 forventer tolv sifre og beregner det trettende som en sjekk; EAN-8 forventer syv og beregner det åttende; UPC-A tar tolv. Gi en symbologi data den ikke kan representere, og du får ikke et nyttig unntak, du får en strekkode som koder søppel, noe som er verre, fordi det ser fint ut til noen skanner det i kassen
To tegningsstier, to nivåer av kontroll
Metoden å gripe til i produksjon er DrawBarcode, på sideobjektet. Den tar symbologien, en posisjon, en høyde, og én parameter som betyr mer enn resten: MUnit, modulbredden. Modulen er bredden på den smaleste streken, atomet hvert annet mål i koden er et multiplum av, og det uttrykkes her i punkter. Alt om hvorvidt det utskrevne resultatet skannes spores tilbake til dette ene heltallet
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'label.pdf';
Pdf.BeginDoc;
// BCType, X, Y, Height, MUnit (modulbredde i punkter), vinkel,
// data, UseCheckSum, strekfarge, bakgrunnsfarge.
Pdf.CurrentPage.DrawBarcode(
bcCodeEAN13, // symbologi
72, 680, // X, Y i punkter fra nederst til venstre
60, // strekhøyde
1, // MUnit: 1pt smaleste strek
0, // ingen rotasjon
'123456789012', // 12 sifre; det 13. er sjekksifferet
True, // legg til modulo-10 sjekksiffer
clBlack, clWhite); // streker svarte, bakgrunn hvit
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
To argumenter fortjener en nærmere kikk. UseCheckSum legger til modulo-10-sjekksifferet som symbologien forventer, og for detaljhandelskodene vil du nesten alltid ha det True; slå det av bare når dataene dine allerede bærer en forhåndsberegnet sjekk, ellers vil du få et dobbelt siffer. Strek- og bakgrunnsfargene er de to siste parameterne, og fristelsen til å være kreativ der er en felle diskutert nedenfor. Legg også merke til koordinatopprinnelsen: som alle andre tegningskall i HotPDF, måles X og Y fra nederste venstre hjørne av siden i punkter, hvor Y vokser oppover, den samme konvensjonen Hello World-eksemplet går gjennom
Den andre stien er DirectDrawBarcode, som tar dataene og en avgrensningsboks, X, Y, Width, Height, og skalerer strekmønsteret for å fylle den bredden. Den er praktisk for å legge koder ut på et rutenett fordi du navngir fotavtrykket og metoden tilpasser strekene til det. Den bekvemmeligheten er også dens fare. Når du gir den en bredde, angir du ikke lenger modulstørrelsen; metoden deler uansett hvilken plass du tillater blant uansett hvor mange streker dataene trenger, og den smaleste streken blir hva enn som faller ut av den divisjonen. Be om en tett Code 128-streng inni en boks som er for smal, og modulene krymper under det noen skanner kan løse opp, i stillhet. For alt som må skannes pålitelig, foretrekk DrawBarcode og angi MUnit bevisst. Reserver DirectDrawBarcode for forhåndsvisninger og for arrangementer hvor du har målt at de resulterende strekene forblir lesbare
Modulbredde er en oppløsningsbeslutning
Her er aritmetikken som avgjør om etiketten din fungerer. En laserskanner og et kamera har begge en minste egenskap de kan skjelne, og den smale streken må lande komfortabelt over den etter utskrift. Det mye siterte gulvet for generelle lineære koder er en 13 mil smal strek, ca 0,33 mm, og mange detaljhandels- og industriguider behandler det som et minimum snarere enn et mål. Oversett det til PDF-enheter: ett punkt er 1/72 tomme, grovt 0,353 mm, så ett enkelt punkt med modulbredde sitter rett på det gulvet. Det er grunnen til at MUnit := 1 er den minste verdien du bør stole på for en kode bestemt for en reell skanner, og hvorfor dobling av den til 2 kjøper margin som nesten ingenting koster på en etikett med plass til overs
Koble det nå til utskriftsoppløsning, for modulen må også overleve skriveren. På en 300 DPI laserskriver er én enhetsprikk (dot) 1/300 tomme, så en ett-punkts modul er omtrent fire prikker bred. Fire prikker er så vidt nok til å gjengi en ren kant; tonerspredning og lett registreringsfeil spiser seg inn i den, og streken som målte ett punkt i PDF-en din skrives ut tykkere eller tynnere enn spesifikasjonen tillater. Øk modulen til 2 punkter, og du har åtte prikker å jobbe med, som absorberer den støyen. Regelen verdt å internalisere: modulbredden du angir i punkter må kartlegges til et helt, komfortabelt antall enhetsprikker ved din virkelige utskriftsoppløsning, ikke oppløsningen du skulle ønske du hadde. En kode som skannes feilfritt fra skjermen og svikter fra lagerskriveren, feilet nesten alltid i denne sjekken
Den stille sonen er en del av symbolet
Den desidert vanligste grunnen til at en korrekt kodet strekkode ikke vil skannes, er den stille sonen, den blanke margen på hver side av strekene. Skannere bruker den tomheten til å finne hvor koden begynner og slutter; uten den kan ikke leseren skille den første streken fra hva som helst som sitter ved siden av den på siden. Standardene er spesifikke. De fleste lineære symbologier ønsker en stille sone på minst ti ganger modulbredden på hver side, og detaljhandelskodene UPC og EAN krever ni moduler til venstre og syv til høyre. Med en ett-punkts modul er det grovt ti punkter, om lag en syvendedel av en tomme, med garantert hvit plass som flankerer strekene
HotPDF tegner strekene og ingenting annet. Den reserverer ikke den stille sonen for deg, noe som betyr at ansvaret er ditt og det er lett å glemme. Feilmodusen er subtil: du plasserer en strekkode helt inntil en tabellcellekant, eller du lar sideoppsettet trenge en logo opp ved siden av den, og koden som besto hver test på en blank side slutter å skannes det øyeblikket den sendes inni et ekte dokument. Budsjett margen eksplisitt. Før du kaller DrawBarcode, la det være minst ti modulbredder med fri plass på begge sider, og behandle all grafikk, linjer eller tekst som trenger inn i det båndet som en defekt, ikke et kosmetisk valg
Farge, kontrast, og den lesbare linjen for mennesker
Strek- og bakgrunnsfargene eksisterer slik at du kan matche en merkepalett, og de er den raskeste måten å ødelegge en fungerende kode. Skannere leser kontrast, klassisk med rødt lys, og de forventer mørke streker på et lyst felt. Svart på hvitt er den eneste kombinasjonen du bør gripe til uten å teste. Mørk blå eller mørk grønn på hvit kan passere; alt med lav luminanskontrast, og spesielt røde streker, som en rødt-lys-skanner ser som bakgrunn, vil ikke det. Hvis en designer ber om fargede strekkoder, er det ærlige svaret at strekene forblir svarte og fargen går et annet sted på etiketten
DrawBarcode-stien kan også gjengi den lesbare teksten under strekene, sifrene en kontorist taster inn når en skanning svikter. Den teksten er en reserveløsning, ikke dekorasjon, så når du plasserer din egen bildetekst hold den unna den stille sonen; en etikett for symbologien presset inn i sidemargen overvinner det samme blanke rommet skanneren er avhengig av. Feltene i eksemplet her, inkludert TextOut for eventuelle omkringliggende etiketter, er de samme tegningskallene dekket i veiledningen for rapportutdata, som er stedet å gå når strekkoden er ett element i en større komponert side
En kort verifiseringsvane
Vektorstreker er en fordel verdt å navngi. Fordi DrawBarcode skriver koden som PDF-tegningsoperatorer snarere enn et rasterisert bilde, forblir strekene skarpe ved enhver zoom og filen bærer ingen egen oppløsning; den eneste oppløsningen som betyr noe, er skriverens. Det unnskylder deg ikke fra å teste, det betyr bare at testen må skje på papir. Generer en prøve, skriv den ut på enheten med lavest oppløsning kodene dine faktisk vil møte, og skann den med samme klasse leser som brukerne dine holder, ikke den eksklusive bildeskanneren (imager) på skrivebordet ditt. Sjekk de stille sonene med en linjal på utskriften, bekreft at modulbredden overlevde turen fra punkter til prikker, og verifiser at den avkodede verdien samsvarer med det du kodet, sjekksiffer og alt. Fem minutter med en ekte skanner fanger opp hver feil beskrevet ovenfor, og det fanger dem før en pall med feilmerkede varer gjør det
Metodene DrawBarcode og DirectDrawBarcode vist her er en del av HotPDF-komponenten for Delphi og C++Builder