บาร์โค้ดไม่ใช่รูปภาพสำหรับใช้ตกแต่งเอกสาร แต่มันคือการวัดสัดส่วน และเครื่องสแกนก็คือเครื่องมือที่ใช้อ่านค่านั้น การปรับมุมมองนี้จะตัดสินแทบทุกอย่างเกี่ยวกับวิธีการวาดบาร์โค้ดลงใน PDF แถบสีดำไม่ได้เก็บข้อมูลใดๆ จากความดำของมัน แต่ข้อมูลอยู่ในอัตราส่วนระหว่างความกว้างของแถบต่อความกว้างของช่องว่าง และเครื่องอ่านจะกู้คืนข้อมูลนี้โดยการจับเวลาการเปลี่ยนแปลงขณะที่เลเซอร์หรือเซนเซอร์กวาดผ่าน หากคุณบีบอัดรูปทรงเรขาคณิตนั้น ทำให้มันเบลอ หรือทำให้ขอบเขตของมันแคบลง คุณก็จะได้สิ่งที่ดูเหมือนบาร์โค้ดทุกประการแต่สแกนออกมาเป็นแค่รอยเปื้อน HotPDF มีสองวิธีให้คุณวางบาร์โค้ดลงบนหน้ากระดาษ และความแตกต่างระหว่างสองวิธีนี้ก็คือความแตกต่างระหว่างการควบคุมรูปทรงเรขาคณิตกับการปล่อยปละละเลยมัน

สิ่งที่ HotPDF สามารถเข้ารหัสได้
HotPDF วาดสัญลักษณ์แบบเส้นตรง (หนึ่งมิติ) ซึ่งมีให้เลือกมากกว่าที่โปรเจ็กต์ส่วนใหญ่ต้องการ ค่า enumeration THPDFBarcodeType ครอบคลุมตระกูล Code 2 of 5 ทั้งในรูปแบบ interleaved, industrial และ matrix; Code 39 และรุ่น extended; Code 128 ทั้งสามกลุ่มย่อย A, B และ C; Code 93 รุ่นธรรมดาและ extended; MSI; PostNet; Codabar; กลุ่มบาร์โค้ดปลีก UPC และ EAN ได้แก่ EAN-8, EAN-13, UPC-A, UPC-E0 และ UPC-E1 แบบบีบอัด และส่วนเสริม UPC 2 และ 5 หลัก; รวมไปถึงกลุ่มย่อย GS1-128 (EAN-128) ซึ่งเพียงพอที่จะครอบคลุมทั้งฉลากซัพพลายเชน จุดขายปลีก และโค้ดอุตสาหกรรมเก่าๆ ที่ยังคงใช้งานอยู่ในโกดัง
สิ่งที่มันวาดไม่ได้คือตระกูลบาร์โค้ดแบบสองมิติ ที่นี่ไม่มี QR, Data Matrix หรือ PDF417 พวกมันเข้ารหัสไบต์ลงในตารางด้วยคณิตศาสตร์การแก้ไขข้อผิดพลาดของมันเอง และหากความต้องการระบุถึงหนึ่งในนั้น นี่ก็ไม่ใช่เครื่องมือที่เหมาะสม และคุณควรรู้เรื่องนี้ก่อนที่จะสร้างระบบครอบมันไว้ ไม่ใช่หลังจากนั้น สำหรับโค้ดแบบหนึ่งมิติ คำถามในทางปฏิบัตินั้นแคบกว่า: สัญลักษณ์ใดที่ยอมรับข้อมูลที่คุณมีจริงๆ เนื่องจากรูปแบบการเข้ารหัสไม่สามารถใช้สลับกันได้
ข้อจำกัดของข้อมูลเป็นเรื่องจริงและมันจะส่งผลในขั้นตอนการสร้าง รูปแบบย่อยของ Code 2 of 5 และ MSI รับเฉพาะตัวเลขเท่านั้น Code 39 รับตัวอักษรพิมพ์ใหญ่ ตัวเลข และเครื่องหมายวรรคตอนเพียงไม่กี่ตัว; หากคุณต้องการตัวอักษรพิมพ์เล็กหรือช่วง ASCII แบบเต็ม นั่นคือ Code 39 Extended หรือกลุ่มย่อยของ Code 128 ส่วน Code 128C จะบีบอัดตัวเลขสองหลักลงในแต่ละสัญลักษณ์เพื่อเพิ่มความหนาแน่น ดังนั้นมันจึงต้องการสตริงตัวเลขที่มีความยาวเป็นเลขคู่และไม่รับอย่างอื่นเลย EAN-13 คาดหวังตัวเลขสิบสองหลักและคำนวณหลักที่สิบสามเป็นตัวตรวจสอบ; EAN-8 คาดหวังตัวเลขเจ็ดหลักและคำนวณหลักที่แปด; UPC-A ใช้สิบสองหลัก หากคุณส่งข้อมูลที่สัญลักษณ์ไม่สามารถนำเสนอได้ คุณจะไม่ได้รับ exception ที่มีประโยชน์ใดๆ แต่คุณจะได้บาร์โค้ดที่เข้ารหัสข้อมูลขยะแทน ซึ่งแย่กว่า เพราะมันดูปกติจนกระทั่งมีคนไปสแกนมันที่แคชเชียร์
สองเส้นทางการวาดภาพ สองระดับการควบคุม
เมธอดที่ควรนำมาใช้ในระบบ production คือ 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 จะต่อท้ายด้วยตัวตรวจสอบ modulo-10 ที่สัญลักษณ์คาดหวัง และสำหรับบาร์โค้ดขายปลีก คุณมักจะต้องการให้เป็น True เสมอ; ให้ปิดการใช้งานเฉพาะในกรณีที่ข้อมูลของคุณมีตัวตรวจสอบที่คำนวณล่วงหน้าไว้แล้วเท่านั้น มิฉะนั้นคุณจะได้ตัวเลขซ้ำซ้อนกัน สีของแถบและสีพื้นหลังคือพารามิเตอร์สองตัวสุดท้าย และความอยากที่จะสร้างสรรค์ตรงจุดนี้คือกับดักที่จะมีการพูดถึงด้านล่าง นอกจากนี้ โปรดสังเกตจุดกำเนิดของพิกัด: เช่นเดียวกับการเรียกการวาดอื่นๆ ใน HotPDF ค่า X และ Y จะวัดจากมุมซ้ายล่างของหน้ากระดาษในหน่วยพอยต์ โดยที่ Y จะเพิ่มขึ้นในทิศทางด้านบน ซึ่งเป็นธรรมเนียมปฏิบัติเดียวกันกับที่อธิบายไว้ใน ตัวอย่าง Hello World
เส้นทางที่สองคือ DirectDrawBarcode ซึ่งจะรับข้อมูลและกรอบเขตแสดงผล หรือ X, Y, Width, Height และปรับขนาดรูปแบบแถบให้พอดีกับความกว้างนั้น มันสะดวกสำหรับการจัดเรียงโค้ดลงบนตารางกระดาษเพราะคุณกำหนดพื้นที่ และเมธอดจะปรับแถบให้พอดีกับพื้นที่นั้น ความสะดวกนี้ก็เป็นความเสี่ยงเช่นกัน เมื่อคุณกำหนดความกว้าง คุณจะไม่ได้ตั้งค่าขนาดโมดูลอีกต่อไป; เมธอดนี้จะแบ่งพื้นที่ที่คุณจัดสรรให้กับจำนวนแถบทั้งหมดที่ข้อมูลต้องใช้ และแถบที่แคบที่สุดจะกลายเป็นผลลัพธ์ที่ได้จากการหารนั้น หากคุณขอสตริง Code 128 ที่มีความหนาแน่นสูงภายในกล่องที่แคบเกินไป โมดูลก็จะหดตัวลงจนต่ำกว่าที่เครื่องสแกนใดๆ จะสามารถแยกแยะได้โดยไม่แจ้งเตือน สำหรับสิ่งใดๆ ที่ต้องการการสแกนอย่างน่าเชื่อถือ ให้เลือก DrawBarcode และตั้งค่า MUnit อย่างจงใจ สงวน DirectDrawBarcode ไว้สำหรับการดูตัวอย่างและการจัดเรียงที่คุณได้วัดแล้วว่าแถบที่ได้ยังคงอ่านได้อย่างชัดเจน
ความกว้างของโมดูลคือการตัดสินใจเรื่องความละเอียด
นี่คือคณิตศาสตร์ที่กำหนดว่าฉลากของคุณจะใช้ได้หรือไม่ ทั้งเครื่องสแกนเลเซอร์และกล้องถ่ายรูปต่างก็มีรายละเอียดที่เล็กที่สุดที่พวกมันสามารถแยกแยะได้ และแถบที่แคบจะต้องมีขนาดใหญ่กว่านั้นอย่างพอเพียงหลังจากพิมพ์ออกมา ขีดจำกัดล่างที่ถูกอ้างอิงอย่างกว้างขวางสำหรับบาร์โค้ดแบบเส้นตรงที่ใช้งานทั่วไปคือแถบแคบขนาด 13 มิลลิอินช์ หรือประมาณ 0.33 มม. และคู่มือการค้าปลีกและอุตสาหกรรมหลายแห่งถือว่านั่นเป็นค่าต่ำสุดแทนที่จะเป็นเป้าหมาย แปลงค่านั้นเป็นหน่วย PDF: หนึ่งพอยต์คือ 1/72 นิ้ว หรือประมาณ 0.353 มม. ดังนั้นความกว้างของโมดูลขนาดหนึ่งพอยต์จึงอยู่ตรงระดับขีดจำกัดล่างนั้นพอดี นั่นคือสาเหตุที่ MUnit := 1 เป็นค่าที่เล็กที่สุดที่คุณควรเชื่อถือสำหรับโค้ดที่กำหนดไว้สำหรับเครื่องสแกนจริง และเหตุใดการเพิ่มค่าเป็นสองเท่า หรือ 2 จึงช่วยเผื่อระยะปลอดภัยโดยแทบไม่เสียค่าใช้จ่ายอะไรเลยบนฉลากที่มีพื้นที่เหลือ
ตอนนี้มาเชื่อมโยงสิ่งนั้นกับความละเอียดในการพิมพ์ออก เพราะโมดูลจะต้องอยู่รอดผ่านเครื่องพิมพ์ด้วยเช่นกัน บนเครื่องพิมพ์เลเซอร์ขนาด 300 DPI จุดของอุปกรณ์หนึ่งจุดคือ 1/300 นิ้ว ดังนั้นโมดูลหนึ่งพอยต์จึงมีความกว้างประมาณสี่จุด สี่จุดแทบจะไม่เพียงพอที่จะเรนเดอร์ขอบให้คมชัด; การกระจายตัวของผงหมึกและข้อผิดพลาดในการลงทะเบียนเล็กน้อยจะกัดกินมันเข้าไป และแถบที่วัดได้หนึ่งพอยต์ในไฟล์ PDF ของคุณก็จะถูกพิมพ์ออกมาหนาหรือบางกว่าที่สเปกกำหนด หากเพิ่มโมดูลเป็น 2 พอยต์ คุณก็จะมีแปดจุดให้ใช้งาน ซึ่งจะช่วยดูดซับความคลาดเคลื่อนนั้นได้ กฎที่ควรจดจำไว้ให้ขึ้นใจ: ความกว้างของโมดูลที่คุณกำหนดเป็นพอยต์จะต้องจับคู่กับจำนวนจุดอุปกรณ์ทั้งหมดที่เหมาะสมที่ความละเอียดในการพิมพ์จริงของคุณ ไม่ใช่ความละเอียดที่คุณคาดหวังว่าจะมี โค้ดที่สแกนได้อย่างไร้ที่ติจากหน้าจอแต่กลับล้มเหลวจากเครื่องพิมพ์ในโกดัง มักจะล้มเหลวจากการตรวจสอบในจุดนี้เสมอ
พื้นที่ว่างเป็นส่วนหนึ่งของสัญลักษณ์
เหตุผลที่พบบ่อยที่สุดที่ทำให้บาร์โค้ดที่เข้ารหัสอย่างถูกต้องไม่สามารถสแกนได้คือ quiet zone หรือระยะขอบที่ว่างเปล่าในแต่ละด้านของแถบ เครื่องสแกนจะใช้ความว่างเปล่านั้นเพื่อค้นหาว่าโค้ดเริ่มต้นและสิ้นสุดที่จุดใด; หากไม่มีพื้นที่นั้น เครื่องอ่านจะไม่สามารถแยกแยะแถบแรกจากสิ่งอื่นๆ ที่อยู่ถัดจากมันบนหน้ากระดาษได้ มาตรฐานนั้นมีความเฉพาะเจาะจง สัญลักษณ์แบบเส้นตรงส่วนใหญ่ต้องการพื้นที่ว่างอย่างน้อยสิบเท่าของความกว้างของโมดูลในแต่ละด้าน และโค้ดขายปลีกอย่าง UPC และ EAN ต้องการเก้าโมดูลทางด้านซ้ายและเจ็ดโมดูลทางด้านขวา สำหรับโมดูลขนาดหนึ่งพอยต์ นั่นคือประมาณสิบพอยต์ หรือประมาณหนึ่งในเจ็ดนิ้วของพื้นที่สีขาวที่ต้องรับประกันว่าจะขนาบข้างแถบเหล่านั้น
HotPDF จะวาดเฉพาะแถบและไม่วาดสิ่งอื่นใด มันไม่สงวนพื้นที่ว่างให้คุณ ซึ่งหมายความว่าความรับผิดชอบนั้นเป็นของคุณและเป็นเรื่องง่ายที่จะลืมเลือน รูปแบบความล้มเหลวนั้นละเอียดอ่อน: คุณวางบาร์โค้ดชิดกับขอบเซลล์ตาราง หรือคุณปล่อยให้เค้าโครงหน้ากระดาษเบียดโลโก้ขึ้นมาข้างๆ และโค้ดที่ผ่านการทดสอบทุกครั้งบนหน้ากระดาษเปล่าก็จะหยุดสแกนได้ทันทีที่มันถูกส่งเข้าไปในเอกสารจริง โปรดจัดสรรระยะขอบอย่างชัดเจน ก่อนที่คุณจะเรียก DrawBarcode ให้เว้นพื้นที่ว่างอย่างน้อยสิบความกว้างของโมดูลในทั้งสองด้าน และถือว่ากราฟิก เส้น หรือข้อความใดๆ ที่ล่วงล้ำเข้าไปในแถบนั้นเป็นข้อบกพร่อง ไม่ใช่ทางเลือกเพื่อความสวยงาม
สี คอนทราสต์ และบรรทัดข้อความที่มนุษย์อ่านได้
สีของแถบและพื้นหลังมีอยู่เพื่อให้คุณสามารถจับคู่กับชุดสีของแบรนด์ได้ และพวกมันก็เป็นวิธีที่เร็วที่สุดในการทำลายโค้ดที่ทำงานได้ เครื่องสแกนจะอ่านจากคอนทราสต์ โดยปกติจะใช้แสงสีแดง และพวกมันคาดหวังแถบสีเข้มบนพื้นหลังสีอ่อน สีดำบนสีขาวเป็นเพียงการจับคู่เดียวที่คุณควรเลือกใช้โดยไม่ต้องทดสอบ สีน้ำเงินเข้มหรือสีเขียวเข้มบนสีขาวสามารถใช้ได้; สีใดๆ ก็ตามที่มีคอนทราสต์ความสว่างต่ำ และโดยเฉพาะอย่างยิ่งแถบสีแดง ซึ่งเครื่องสแกนแสงสีแดงจะมองเห็นเป็นพื้นหลังนั้น จะไม่สามารถสแกนได้ หากนักออกแบบขอให้สร้างบาร์โค้ดแบบมีสี คำตอบที่ตรงไปตรงมาก็คือ แถบต้องเป็นสีดำและสีสันต่างๆ ควรจะไปอยู่ที่อื่นบนฉลาก
เส้นทาง DrawBarcode ยังสามารถเรนเดอร์ข้อความที่มนุษย์อ่านได้ไว้ใต้แถบ ซึ่งก็คือตัวเลขที่พนักงานจะคีย์เข้าไปเมื่อการสแกนล้มเหลว ข้อความนั้นเป็นระบบสำรอง ไม่ใช่ของตกแต่ง ดังนั้นเมื่อคุณวางคำบรรยายภาพของคุณเอง โปรดกันให้ห่างจาก quiet zone; ฉลากระบุสัญลักษณ์ที่อัดแน่นอยู่ในระยะขอบด้านข้างจะทำลายพื้นที่ว่างแบบเดียวกับที่เครื่องสแกนต้องพึ่งพา ฟิลด์ต่างๆ ในตัวอย่างนี้ ซึ่งรวมถึง TextOut สำหรับป้ายกำกับที่อยู่รอบๆ ล้วนเป็นการเรียกการวาดภาพแบบเดียวกันกับที่ครอบคลุมอยู่ใน คู่มือการนำเสนอรายงาน (report output guide) ซึ่งเป็นจุดที่ควรไปดูต่อเมื่อบาร์โค้ดเป็นเพียงองค์ประกอบหนึ่งในหน้ากระดาษที่ประกอบขึ้นมาขนาดใหญ่
นิสัยการตรวจสอบแบบสั้นๆ
แถบเวกเตอร์เป็นข้อได้เปรียบที่ควรระบุไว้ เนื่องจาก DrawBarcode จะเขียนโค้ดเป็นชุดคำสั่งตัวดำเนินการวาด PDF แทนที่จะเป็นภาพแรสเตอร์ (rasterized) แถบจึงยังคงคมชัดที่ทุกระดับการซูมและไฟล์จะไม่มีความละเอียดในตัวเอง ความละเอียดเพียงอย่างเดียวที่สำคัญคือความละเอียดของเครื่องพิมพ์ นั่นไม่ได้เป็นข้ออ้างให้คุณไม่ต้องทดสอบ มันเพียงแค่หมายความว่าการทดสอบจะต้องเกิดขึ้นบนกระดาษ สร้างตัวอย่างขึ้นมา พิมพ์ลงบนอุปกรณ์ที่มีความละเอียดต่ำที่สุดที่โค้ดของคุณจะไปเจอจริงๆ และสแกนด้วยเครื่องอ่านระดับเดียวกับที่ผู้ใช้ของคุณถืออยู่ ไม่ใช่เครื่องอ่านภาพระดับไฮเอนด์บนโต๊ะทำงานของคุณ ตรวจสอบ quiet zones ด้วยไม้บรรทัดบนงานพิมพ์ ยืนยันว่าความกว้างของโมดูลอยู่รอดจากการแปลงจากจุดพอยต์ไปเป็นจุดดอต และตรวจสอบว่าค่าที่ถอดรหัสตรงกับสิ่งที่คุณเข้ารหัส ตัวเลขสำหรับตรวจสอบ และทุกสิ่งทุกอย่าง ห้านาทีกับเครื่องสแกนของจริงจะสามารถตรวจจับความล้มเหลวทุกอย่างที่อธิบายไว้ข้างต้น และมันจะจับข้อผิดพลาดเหล่านั้นได้ก่อนที่คลังสินค้าที่ติดฉลากผิดพลาดทั้งพาเลทจะทำ
เมธอด DrawBarcode และ DirectDrawBarcode ที่แสดงไว้ที่นี่เป็นส่วนหนึ่งของ HotPDF Component สำหรับ Delphi และ C++Builder