Баркодът не е картина, с която украсявате документ. Това е измерване, а скенерът е инструментът, който го чете. Това преосмисляне решава почти всичко относно това как трябва да го нарисувате в PDF. Чертите не носят информация чрез своята чернота; информацията живее в съотношението между ширините на чертите и ширините на интервалите, а четецът я възстановява, като засича времето на преходите, докато лазерът или сензорът преминава напречно. Свийте тази геометрия, замъглете я или претъпкайте нейните граници и ще произведете нещо, което изглежда точно като баркод и се сканира като размазано петно. HotPDF ви дава два начина да поставите такъв на страницата, и разликата между тях е точно разликата между това да контролирате тази геометрия и да се откажете от нея

Какво може да кодира HotPDF
HotPDF чертае линейни (едноизмерни) символики и наборът е по-широк от това, от което се нуждаят повечето проекти. Изброяването THPDFBarcodeType покрива семейството Code 2 of 5 в неговите interleaved, industrial и matrix форми; Code 39 и неговия разширен (extended) вариант; трите подмножества на Code 128 - A, B и C; Code 93 обикновен и разширен; MSI; PostNet; Codabar; групата за търговия на дребно UPC и EAN, а именно EAN-8, EAN-13, UPC-A, компресираните UPC-E0 и UPC-E1, както и 2- и 5-цифрените допълнения към UPC; и подмножествата GS1-128 (EAN-128). Това е достатъчно, за да покрие етикети за веригата на доставки, пунктове за продажба на дребно (POS) и по-старите индустриални кодове, които все още са живи в складовете
Това, което не чертае, е двуизмерното семейство. Тук няма QR, Data Matrix или PDF417. Те кодират байтове в мрежа (grid) със собствена математика за корекция на грешки и ако изискване посочва някой от тях, това е грешният инструмент и трябва да знаете това, преди да градите около него, а не след това. За едноизмерните кодове практическият въпрос е по-тесен: коя символика приема данните, с които реално разполагате, защото кодиранията не са взаимозаменяеми
Ограниченията за данните са реални и хапят по време на генерирането. Вариантите на Code 2 of 5 и MSI приемат само цифри. Code 39 носи главни букви, цифри и шепа препинателни знаци; ако имате нужда от малки букви или пълния набор от ASCII, това е Code 39 Extended или подмножество на Code 128. Code 128C опакова две цифри във всеки символ за плътност, така че иска цифров низ с четна дължина и нищо друго. EAN-13 очаква дванадесет цифри и изчислява тринадесетата като проверка; EAN-8 очаква седем и изчислява осмата; UPC-A приема дванадесет. Подайте на дадена символика данни, които не може да представи, и няма да получите полезно изключение, а ще получите баркод, който кодира боклук, което е по-лошо, защото изглежда добре, докато някой не го сканира на касата
Два пътя за чертаене, две нива на контрол
Методът, към който да посегнете в продукция, е DrawBarcode върху обекта на страницата. Той приема символиката, позицията, височината и един параметър, който има по-голямо значение от останалите: MUnit, ширината на модула. Модулът е ширината на най-тясната черта – атомът, на който всяка друга мярка в кода е кратна, и тук е изразен в пунктове (points). Всичко относно това дали отпечатаният резултат се сканира се свежда до това единствено цяло число
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'label.pdf';
Pdf.BeginDoc;
// BCType, X, Y, Height, MUnit (module width in points), angle,
// data, UseCheckSum, bar color, background color.
Pdf.CurrentPage.DrawBarcode(
bcCodeEAN13, // symbology
72, 680, // X, Y in points from the bottom-left
60, // bar height
1, // MUnit: 1pt narrowest bar
0, // no rotation
'123456789012', // 12 digits; the 13th is the check
True, // append the modulo-10 check digit
clBlack, clWhite); // bars black, background white
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
Два аргумента заслужават по-внимателен поглед. UseCheckSum добавя контролната цифра по модул 10, която символиката очаква, и за кодовете на дребно почти винаги го искате True; изключете го само когато данните ви вече носят предварително изчислена проверка, иначе ще получите удвоена цифра. Цветовете на чертите и фона са последните два параметъра, и изкушението да бъдете креативни там е капан, обсъден по-долу. Обърнете внимание и на началото на координатите: като всяко друго извикване за чертаене в HotPDF, X и Y се измерват от долния ляв ъгъл на страницата в пунктове, като Y нараства нагоре – същата конвенция, през която преминава примерът Hello World
Вторият път е DirectDrawBarcode, който приема данните и ограничаваща кутия (bounding box), X, Y, Width, Height, и мащабира модела на чертите, за да запълни тази ширина. Удобно е за разполагане на кодове върху мрежа, защото вие назовавате отпечатъка и методът напасва чертите към него. Това удобство е и неговата опасност. Когато му зададете ширина, вече не задавате размера на модула; методът разделя каквото пространство му позволите сред колкото черти са необходими на данните, и най-тясната черта става това, което се получи от това деление. Поискайте плътен низ от Code 128 вътре в кутия, която е твърде тясна, и модулите се свиват под това, което всеки скенер може да разпознае, безшумно. За всичко, което трябва да се сканира надеждно, предпочитайте DrawBarcode и задавайте MUnit умишлено. Запазете DirectDrawBarcode за прегледи и за подредби, където сте измерили, че получените черти остават четливи
Ширината на модула е решение, свързано с разделителната способност
Ето аритметиката, която определя дали вашият етикет работи. Лазерен скенер и камера – и двете имат най-малка характеристика, която могат да различат, и тясната черта трябва да попадне комфортно над нея след отпечатване. Широко цитираният праг за линейни кодове с общо предназначение е 13 mil тясна черта, около 0.33 mm, и много ръководства за търговия на дребно и индустрията третират това като минимум, а не като цел. Преведете това в PDF единици: един пункт е 1/72 инча, приблизително 0.353 mm, така че един единствен пункт ширина на модула се намира точно на този праг. Ето защо MUnit := 1 е най-малката стойност, на която трябва да се доверите за код, предназначен за реален скенер, и защо удвояването ѝ до 2 купува марж, който не струва почти нищо на етикет с достатъчно място
Сега свържете това с разделителната способност на изхода, защото модулът също трябва да преживее принтера. На лазерен принтер с 300 DPI една точка на устройството е 1/300 инча, така че модул от един пункт е широк около четири точки. Четири точки са едва достатъчни за рендиране на чист ръб; разпръскването на тонера и леката грешка при регистрацията го изяждат, и чертата, която е измервала един пункт във вашия PDF, се отпечатва по-дебела или по-тънка, отколкото спецификацията позволява. Увеличете модула до 2 пункта и имате осем точки, с които да работите, което абсорбира този шум. Правилото, което си струва да се усвои вътрешно: ширината на модула, която задавате в пунктове, трябва да се съпостави с цяло, комфортно число точки на устройството при вашата реална разделителна способност на печат, а не разделителната способност, която ви се иска да имате. Код, който се сканира безупречно от екрана и се проваля от складовия принтер, почти винаги се е провалил на тази проверка
Тихата зона (quiet zone) е част от символа
Единствената най-честа причина един правилно кодиран баркод да не се сканира е тихата зона – празното поле от всяка страна на чертите. Скенерите използват тази празнота, за да намерят къде започва и свършва кодът; без нея четецът не може да различи първата черта от каквото и да е, което стои до нея на страницата. Стандартите са специфични. Повечето линейни символики изискват тиха зона от поне десет пъти ширината на модула от всяка страна, а кодовете на дребно UPC и EAN изискват девет модула отляво и седем отдясно. С модул от един пункт това са грубо десет пункта, около една седма от инча, гарантирано бяло пространство, обграждащо чертите
HotPDF чертае чертите и нищо друго. Той не запазва тихата зона вместо вас, което означава, че отговорността е ваша и е лесно да се забрави. Режимът на повреда е тънък: поставяте баркод плътно до границата на клетка от таблица или оставяте оформлението на страницата да притисне лого до него, и кодът, който е преминал всеки тест на празна страница, спира да се сканира в момента, в който се достави в реален документ. Бюджетирайте полето изрично. Преди да извикате DrawBarcode, оставете поне десет ширини на модула чисто пространство от двете страни и третирайте всяка графика, линия (rule) или текст, които навлизат в тази лента, като дефект, а не като козметичен избор
Цвят, контраст и редът, четим от човек (human-readable line)
Цветовете на чертите и фона съществуват, за да можете да съвпаднете с палитра на марката, и те са най-бързият начин да счупите работещ код. Скенерите четат контраста, класически с червена светлина, и очакват тъмни черти на светло поле. Черно на бяло е единствената комбинация, към която трябва да посегнете без тестване. Тъмно синьо или тъмно зелено на бяло може да мине; всичко с нисък контраст на осветеността, и по-специално червените черти, които скенерът с червена светлина вижда като фон, няма да мине. Ако дизайнер поиска цветни баркодове, честният отговор е, че чертите остават черни, а цветът отива някъде другаде по етикета
Пътят DrawBarcode може също да рендира текста, четим от човек, под чертите – цифрите, които служителят въвежда, когато сканирането е неуспешно. Този текст е резервен вариант, а не декорация, така че когато поставяте свой собствен надпис, пазете го извън тихата зона; етикет за символиката, натъпкан в страничното поле, побеждава същото това празно пространство, от което зависи скенерът. Полетата в примера тук, включително TextOut за всякакви обкръжаващи надписи, са същите извиквания за чертаене, разгледани в ръководството за изход на отчети, което е мястото, където трябва да отидете, когато баркодът е един елемент в по-голяма съставена страница
Кратък навик за верификация
Векторните черти са предимство, което си струва да се назове. Тъй като DrawBarcode записва кода като PDF оператори за чертаене, а не като растерно изображение, чертите остават резки при всякакво увеличение и файлът не носи собствена разделителна способност; единствената разделителна способност, която има значение, е тази на принтера. Това не ви извинява от тестване, просто означава, че тестът трябва да се случи на хартия. Генерирайте мостра, отпечатайте я на устройството с най-ниска разделителна способност, което вашите кодове реално ще срещнат, и я сканирайте със същия клас четец, който държат вашите потребители, а не с висок клас имиджър на бюрото ви. Проверете тихите зони с линийка върху разпечатката, потвърдете, че ширината на модула е преживяла пътуването от пунктове до точки и проверете дали декодираната стойност съвпада с това, което сте кодирали, заедно с контролната цифра и всичко останало. Пет минути с реален скенер улавят всяка повреда, описана по-горе, и ги улавят, преди един палет с грешно етикетирана стока да го направи
Методите DrawBarcode и DirectDrawBarcode, показани тук, са част от компонента HotPDF за Delphi и C++Builder