الرمز الشريطي (الباركود) الموجود على ملصق الشحن أو الفاتورة له وظيفة واحدة، وهي أن يقرأه الماسح الضوئي في المرة الأولى. يتم تقرير ما إذا كان سينجو من تلك المرة قبل فترة طويلة من وصول الحزمة إلى الرصيف. يتم تقرير ذلك من خلال كيفية وضع الرمز في الصفحة. الخطأ الأكثر شيوعاً في خط أنابيب تقارير Delphi هو رسم الرمز الشريطي كصورة نقطية (bitmap) في مكان آخر ووضع هذه الصورة في ملف PDF. تبدو جيدة على الشاشة عند مستوى تكبير واحد ثم تتدهور في كل مكان آخر.
البديل هو رسم الرمز كالمحتوى المتجهي (vector)، مباشرة في الصفحة. يكشف PDFlibPas عن عائلة من استدعاءات الرسم لهذا الغرض تماماً، والتي تغطي رموز المصفوفة ثنائية الأبعاد QR و PDF417 و DataMatrix، والعائلات الخطية من خلال Code128 و GS1-128، وبريد USPS الذكي للأتمتة البريدية. الحجة للمحتوى المتجهي ليست جمالية. بل تتعلق بما إذا كانت الأشرطة تهبط في المكان الذي يتوقعه الماسح الضوئي.
لماذا يتفوق المتجه على الصورة النقطية الموضوعة
الرمز الشريطي هو نمط من الأشرطة والمساحات، أو في بعدين شبكة من الوحدات الداكنة والفاتحة. يعمل مفكك التشفير عن طريق قياس نسبة تلك العروض. أي شيء يشوه النسب هو ضوضاء تأكل من ميزانية خطأ الرمز. تحمل صورة الرمز الشريطي النقطية بكسلات ثابتة. عندما يتم رسم ملف PDF على طابعة لا تنقسم نقاطها بالتساوي إلى شبكة الصورة، يتعين على برنامج التنقيط إعادة أخذ العينات، وتنتشر حواف الوحدات التي يجب أن تكون حادة عبر بكسلين للجهاز. يمكن للشريط الضيق أن يتسع، ويمكن للمساحة المجاورة أن تضيق، وتنحرف نسبة العرض التي يعتمد عليها مفكك التشفير.
يرسم الرمز كالمحتوى المتجهي، والرمز نفسه عبارة عن مجموعة من المستطيلات المملوءة الموصوفة في إحداثيات مساحة مستخدم PDF. لا توجد شبكة بكسل ثابتة للمحاربة. في وقت الطباعة، يرسم الجهاز كل مستطيل بالدقة التي يمتلكها بالفعل، لذا فإن كل حافة وحدة تكون حادة بقدر ما تسمح به الأجهزة، بأي مقياس وأي حجم طباعة. قم بتكبير رمز متجه لملصق منصة نقالة أو تقليصه لطرد وتظل الهندسة دقيقة. هذه الدقة هي ما يحافظ على معدل القراءة المرتفع في المرة الأولى، وهو الهدف الكامل من وضع الرمز الشريطي في الصفحة.
رموز QR ومستويات التصحيح الأربعة
رمز QR هو رمز مصفوفة ثنائي الأبعاد يُقرأ في كلا المحورين في نفس الوقت، ولهذا السبب يحزم الكثير من البيانات في مربع صغير. تأتي قدرته على تحمل التلف من تصحيح الأخطاء Reed-Solomon، المقدم في أربعة مستويات. يسترد المستوى L حوالي 7 بالمائة من كلمات الكود، و M حوالي 15 بالمائة، و Q حوالي 25 بالمائة، و H حوالي 30 بالمائة. التصحيح العالي ليس مجانياً. تشغل كلمات كود الاسترداد سعة الوحدة، لذا بالنسبة لكمية ثابتة من البيانات، يفرض المستوى الأعلى رمزاً أكثر كثافة أو أكبر مادياً.
المقايضة هي سؤال حول البيئة التي سيعيش فيها الرمز. يمكن للمستند الرقمي النظيف الذي سيتم مسحه ضوئياً فقط من الشاشة أن يظل عند L ويبقى مضغوطاً. الملصق الذي سيتم طباعته وتداوله وخدشه وتغطيته جزئياً بالشريط اللاصق يريد Q أو H، لأن التكرار الإضافي هو ما يسمح لمفكك التشفير بإعادة بناء الحمولة من رمز لم يعد ناصعاً. يأخذ DrawQRCode الموضع و SymbolSize الذي يحدد العرض والارتفاع المرسومين، بالإضافة إلى قيمة EncodeOptions التي تحدد وضع البيانات (0 للمتغيرات التلقائية، أو الرقمية، أو الأبجدية الرقمية، و ISO-8859-1، و UTF-8) وقيمة DrawOptions للاتجاه.
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;
يتم اختيار مستوى التصحيح نفسه بواسطة المرمز لملاءمة البيانات في الرمز الذي طلبته. إذا كنت بحاجة إلى مستوى عالٍ مضمون لبيئة قاسية، فحدد حجم الرمز بسخاء بحيث يمتلك المرمز ميزانية وحدات لإنفاقها على التكرار بدلاً من إجباره على النزول للملاءمة.
PDF417 لبطاقات الهوية وملصقات الشحن
PDF417 هو رمز خطي مكدس. كل صف عبارة عن رمز شريطي خطي قصير، وتتراص الصفوف لتشكل كتلة، ولهذا السبب يظهر على رخص القيادة وبطاقات الصعود إلى الطائرة وملصقات شحن الناقل حيث يتعين على شريط أوسع من البيانات الجلوس في مساحة مستطيلة. يعمل تصحيح الأخطاء فيه على مقياس من 0 إلى 8. تضاعف كل خطوة تقريباً عدد كلمات كود التصحيح، لذا يحمل المستوى 5 تكراراً أكبر بكثير من المستوى 1، على حساب المزيد من كلمات الكود في الصفحة.
شكل كتلة PDF417 قابل للتعديل، وهذا مهم لأن الملصق له مساحة ثابتة لملئها. يكشف DrawPDF417SymbolEx عن عناصر التحكم التي لا يوفرها الاستدعاء الأساسي. يثبت FixedColumns و FixedRows عدد أعمدة البيانات وعدد الصفوف، حيث يعني 0 ترك المرمز يقرر. يأخذ ErrorLevel القيمة -1 للتلقائي أو من 0 إلى 8 صراحة. ModuleSize هو عرض العنصر الأضيق في وحدة القياس الحالية، ويحدد HeightWidthRatio مدى ارتفاع كل وحدة بالنسبة لعرضها، وهي كيفية جعل الكتلة قصيرة وعريضة أو طويلة وضيقة لتناسب المساحة التي لديك.
// 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
تثبيت الأعمدة هو الرافعة المعتادة في قالب الملصق. يعطي عدد الأعمدة الثابت الكتلة عرضاً متوقعاً، لذا لا يتغير التخطيط المحيط مع تغير طول الحمولة المشفرة من مستند إلى آخر، بينما يضيف المرمز صفوفاً إلى الأسفل لاستيعاب الفرق.
DataMatrix للعلامات الصغيرة
DataMatrix هو الرمز الذي يجب الوصول إليه عندما يجب أن تكون العلامة صغيرة. إنها شبكة ثنائية الأبعاد مدمجة تستخدم ECC 200، مخطط Reed-Solomon الحديث، وتتراص وتظل قابلة للقراءة في أحجام حيث يكون رمز QR لنفس البيانات محرجاً. يجعلها ذلك الخيار القياسي لتعليم الأجزاء المباشر، والمكونات الإلكترونية الصغيرة، وملصقات الخدمات اللوجستية الكثيفة.
يأخذ DrawDataMatrixSymbol قيمة ModuleSize لتباعد النقاط، و Encoding بقيمة 1 لـ ASCII، و SymbolSize الذي يكون إما 0 للتلقائي أو أحد الأبعاد المربعة والمستطيلة القياسية، من 10x10 حتى 132x132. تدمج معلمة Options الاتجاه مع عرض المنطقة الهادئة (quiet-zone)، حيث يحدد جمع 100 إلى 400 حداً أبيض من وحدة واحدة إلى أربع وحدات. المنطقة الهادئة ليست للزينة. يحتاج مفكك التشفير إلى هذا الهامش الواضح للعثور على نمط مكتشف الرمز، والرمز المحشور ضد حبر آخر هو رمز يفشل في الالتقاط.
// 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
أين لا تزال الرموز الشريطية أحادية البعد (1D) تحكم
تحظى الرموز ثنائية الأبعاد بالاهتمام، لكن الرموز الشريطية الخطية لا تزال تمتلك أجزاء كبيرة من تجارة التجزئة والخدمات اللوجستية، والسبب هو القاعدة المثبتة للماسحات الضوئية الليزرية التي تقرأ مسحاً واحداً. يعد Code128 هو العمود الفقري للبيانات الأبجدية الرقمية، وتأتي كفاءته من ثلاث مجموعات أحرف. تغطي المجموعة A الأحرف التحكمية والأحرف الكبيرة، وتغطي المجموعة B نطاق ASCII القابل للطباعة بالكامل، والمجموعة C هي المجموعة التي تهم الأرقام. يرمز الجزء الفرعي C زوجاً من الأرقام في حرف رمز واحد، لذا فإن تشغيل البيانات الرقمية يأخذ نصف أحرف الرمز التي سيأخذها في المجموعة A أو B. هذه هي الطريقة الأكثر دمجاً لوضع رمز شريطي رقمي طويل، ويجمع تنفيذ Code128 في PDFlibPas بين المجموعتين B و C تلقائياً للوصول إليها.
يبني GS1-128، وهو المعيار الذي كان يسمى سابقاً EAN-128، على Code128 من خلال حمل معرفات التطبيق (Application Identifiers)، وهي البادئات بين أقواس التي تخبر النظام المستلم ما إذا كانت الأرقام التالية هي رقم تسلسلي، أو رمز دفعة، أو تاريخ انتهاء الصلاحية. يتم تمييز البنية بواسطة FNC1، وهو حرف خاص غير بيانات يشير إلى أن الرمز مشفر كـ GS1 ويفصل الحقول متغيرة الطول. في PDFlibPas، ترسم رمز GS1-128 باستخدام DrawBarcode باستخدام نوع Code128 وعلامة [FNC1] الحرفية الموضوعة في سلسلة البيانات حيث يبدأ كل معرف تطبيق.
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;
بالنسبة للبريد، يرمز بريد USPS الذكي (USPS Intelligent Mail)، والذي يطلق عليه أيضاً OneCode، بيانات التوجيه والتتبع في رمز شريطي واحد معدل الارتفاع للأتمتة البريدية. يأخذ DrawIntelligentMailBarcode هندسة صريحة لعرض الشريط، وارتفاع الشريط الكامل، وارتفاع المتتبع، وعرض المسافة، مع توفير البيانات كسلسلة مكونة من 20 أو 25 أو 29 أو 31 رقماً فقط. توجد ارتفاعات الأشرطة والمتتبعات الصريحة لأن الرمز يحمل معلومات في ما إذا كان كل شريط عبارة عن شريط كامل، أو صاعد، أو هابط، ويعتمد قارئ البريد على الاحتفاظ بهذه الارتفاعات للمواصفات.
الرسم في الصفحة والقياس للتخطيط
يرسم كل استدعاء معروض هنا في محتوى الصفحة المحددة حالياً، وهو نفس السطح الذي يتلقى نصك وصورك، لذا يتم إنتاج الرمز الشريطي كجزء من توليد المستند العادي بدلاً من استيراده كأصل منفصل. ولأن الرموز هي محتوى متجهي، فإن البيانات التي ترميزها والهندسة التي تشغلها معروفة في وقت الرسم، وهو ما يتيح لك وضعها بشكل حتمي.
يستفيد التخطيط للعائلات الخطية من القياس أولاً. يرجع GetBarcodeWidth العرض المرسوم الإجمالي للرمز الشريطي لعرض شريط ضيق معين ونوع رمز شريطي، بحيث يمكنك حجز المساحة الأفقية الدقيقة قبل الالتزام بالرسم، بدلاً من التخمين واكتشاف التداخل بعد بناء الصفحة. رموز ثنائية الأبعاد أسهل في الوضع لأنك تحدد حجمها المرسوم مباشرة من خلال SymbolSize أو ModuleSize، ويملأ الرمز تلك المساحة. وفي كلتا الحالتين، يكون الانضباط هو نفسه. حدد الحجم المادي من بيئة المسح، وتأكد من أن الرمز يناسب الموضع الذي لديك، ودع هندسة المتجهات تحافظ على حدة كل حافة من معاينة الشاشة إلى الطباعة النهائية.
بالنسبة لسير عمل بناء الصفحات الأوسع الذي تسقط فيه هذه الرموز الشريطية، فإن التقنيات في مقالنا حول استخراج النصوص والصور والخطوط تغطي قراءة المحتوى مرة أخرى من ملف PDF، ويعرض دليل دمج وتقسيم ملفات PDF الكبيرة مع الوصول المباشر كيفية تجميع المستندات عالية الحجم بكفاءة. يقترن كلاهما بشكل طبيعي بواجهة برمجة تطبيقات الرسم الموصوفة هنا، والتي يتم شحنها كجزء من مكتبة Delphi PDF لـ Delphi و C++Builder جنباً إلى جنب مع واجهات برمجة التطبيقات للنصوص والرسومات والنماذج والتوقيعات المغطاة في مكان آخر في هذه المدونة.