مقال تقني

إنشاء باركودات قابلة للمسح في PDF باستخدام HotPDF في Delphi

الباركود ليس صورة تزيّن بها المستند، بل هو قياس، والقارئ الضوئي هو الأداة التي تقرأه. هذه النظرة تغيّر تقريباً كل شيء في طريقة رسمه داخل PDF. الأشرطة نفسها لا تحمل المعلومة بكونها سوداء، بل تحملها نسبة عرض الشريط إلى عرض الفراغ، ويستعيدها القارئ عبر توقيت الانتقالات بينما يمسحها الليزر أو المستشعر. إذا ضيّقت هذه الهندسة أو شوّهتها أو ضيّقت هوامشها، ستحصل على شيء يبدو باركوداً تماماً لكنه يُمسح مثل لطخة. يمنحك HotPDF طريقتين لوضعه على الصفحة، والفرق بينهما هو نفسه الفرق بين التحكم في هذه الهندسة والتنازل عنها

A PDF page showing a grid of linear barcodes in different symbologies drawn by HotPDF in Delphi
صيغ باركود خطية مرسومة داخل ملف PDF واحد باستخدام HotPDF

ما الذي يستطيع HotPDF ترميزه

يرسم HotPDF الصيغ الخطية، أي أحادية البعد، ومجموعتها أوسع مما تحتاجه معظم المشاريع. تغطي مجموعة THPDFBarcodeType عائلة Code 2 of 5 بأشكالها المتداخلة والصناعية والمصفوفية، وCode 39 ونسخته الموسعة، والتقسيمات الثلاثة لـ Code 128 وهي A وB وC، وCode 93 العادي والموسّع، وMSI، وPostNet، وCodabar، ومجموعة UPC وEAN الخاصة بالتجزئة، أي EAN-8 وEAN-13 وUPC-A وUPC-E0 وUPC-E1 المضغوطتين، والإضافات الفرعية UPC ذات الرقمين والخمسة أرقام، وتقسيمات 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 يأخذ اثني عشر. إذا أعطيت صيغة بيانات لا تستطيع تمثيلها فلن تحصل على استثناء مفيد، بل ستحصل على باركود يرمز بيانات فاسدة، وهذا أسوأ لأنه يبدو سليماً حتى يحاول أحدهم مسحه عند نقطة البيع

مساران للرسم، ومستويان من التحكم

الطريقة التي تعتمد عليها في الإنتاج هي DrawBarcode على كائن الصفحة. وهي تأخذ الصيغة، والموقع، والارتفاع، ومعلمة واحدة أهم من غيرها: MUnit، أي عرض الوحدة. الوحدة هي عرض أضيق شريط، وهي الذرة التي تُبنى عليها كل القياسات الأخرى في الرمز، وهنا تُعبَّر بالنقاط. كل شيء يتعلق بقابلية مسح الناتج المطبوع يعود إلى هذا العدد الفردي الواحد

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 mil، أي نحو 0.33 مم، وكثير من أدلة التجزئة والصناعة تتعامل معه كحد أدنى لا كهدف. إذا حولت ذلك إلى وحدات PDF، فالنقطة الواحدة تساوي 1/72 بوصة، أي نحو 0.353 مم، وبالتالي فإن وحدة بعرض نقطة واحدة تقع تقريباً عند هذا الحد. لهذا السبب يعد MUnit := 1 أصغر قيمة يمكنك الوثوق بها لرمز سيذهب إلى قارئ فعلي، ولهذا أيضاً يمنحك مضاعفته إلى 2 هامشاً إضافياً لا يكاد يكلف شيئاً على بطاقة فيها مساحة كافية

اربط ذلك بدقة الإخراج، لأن الوحدة يجب أن تنجو أيضاً من الطابعة. على طابعة ليزر بدقة 300 DPI تكون كل نقطة جهاز 1/300 بوصة، لذا فإن وحدة بعرض نقطة واحدة تساوي تقريباً أربع نقاط جهاز. أربع نقاط بالكاد تكفي لإظهار حافة نظيفة، وانتشار الحبر وخطأ المحاذاة البسيط يستهلكان هذا الهامش، فيطبع الشريط الذي قِستَه بنقطة واحدة في PDF أعرض أو أضيق مما يسمح به المعيار. ارفع الوحدة إلى نقطتين، وسيصبح لديك ثماني نقاط جهاز للعمل بها، وهذا يمتص ذلك التشويش. القاعدة التي تستحق أن تحفظها: عرض الوحدة الذي تحدده بالنقاط يجب أن يتحول إلى عدد كامل ومريح من نقاط الجهاز عند دقة الطباعة الحقيقية، لا عند الدقة التي تتمنى لو كانت متاحة. الرمز الذي يُمسح بلا مشاكل من الشاشة ويفشل على طابعة المستودع يكون غالباً قد أخفق في هذا الفحص

المنطقة الهادئة جزء من الرمز

السبب الأكثر شيوعاً لعدم مسح باركود مشفّر بشكل صحيح هو المنطقة الهادئة، أي الهامش الفارغ على كل جانب من الأشرطة. يستخدم القارئ هذا الفراغ ليحدد أين يبدأ الرمز وأين ينتهي؛ ومن دونه لا يستطيع التمييز بين أول شريط وما يجاوره على الصفحة. المعايير واضحة. معظم الصيغ الخطية تريد منطقة هادئة لا تقل عن عشرة أضعاف عرض الوحدة على كل جانب، بينما تتطلب رموز UPC وEAN الخاصة بالتجزئة تسع وحدات على اليسار وسبعاً على اليمين. ومع وحدة بعرض نقطة واحدة فهذا يعادل تقريباً عشر نقاط، أي نحو سبع بوصة، من المساحة البيضاء المضمونة على جانبي الأشرطة

يرسم HotPDF الأشرطة فقط ولا يرسم شيئاً غيرها. وهو لا يحجز المنطقة الهادئة نيابة عنك، وهذا يعني أن المسؤولية تقع عليك، ومن السهل أن تنساها. نمط الفشل هنا دقيق: تضع باركوداً ملاصقاً لحد خلية جدول، أو تسمح لتخطيط الصفحة بأن يزاحم شعاراً بجانبه، ثم يتوقف الرمز الذي اجتاز كل اختبار على صفحة فارغة عن المسح لحظة إدراجه داخل مستند فعلي. خصص الهامش صراحةً. قبل أن تستدعي DrawBarcode، اترك ما لا يقل عن عشرة أضعاف عرض الوحدة من الفراغ الواضح على الجانبين، وتعامل مع أي عنصر رسومي أو خط أو نص يتداخل مع هذا النطاق بوصفه عيباً لا خياراً جمالياً

الألوان والتباين والسطر المقروء للبشر

يوجد لون الأشرطة ولون الخلفية كي ينسجم الرمز مع هوية العلامة، وهما أسرع طريقة لتعطيل رمز يعمل. تقرأ أجهزة المسح التباين، تقليدياً بالضوء الأحمر، وتتوقع أشرطة داكنة على أرضية فاتحة. الأسود على الأبيض هو الخيار الوحيد الذي ينبغي أن تلجأ إليه من دون اختبار. الأزرق الداكن أو الأخضر الداكن على الأبيض قد ينجحان، أما أي شيء منخفض التباين اللوني، وبخاصة الأشرطة الحمراء التي يراها القارئ الأحمر خلفية، فلن ينجح. إذا طلب مصمم باركودات ملوّنة، فالجواب الصادق هو أن الأشرطة تبقى سوداء، ويذهب اللون إلى مكان آخر على الملصق

يمكن لمسار DrawBarcode أيضاً أن يرسم النص المقروء بشرياً أسفل الأشرطة، أي الأرقام التي يكتبها الموظف عندما يفشل المسح. هذا النص احتياط وليس زينة، لذا عندما تضيف تعليقك الخاص أبقه بعيداً عن المنطقة الهادئة؛ فكتابة اسم الصيغة في الهامش الجانبي تفسد الفراغ نفسه الذي يعتمد عليه القارئ. الحقول في المثال هنا، بما في ذلك TextOut لأي تسميات محيطة، هي نفس أوامر الرسم المغطاة في دليل إخراج التقارير، وهو المكان المناسب عندما يكون الباركود عنصراً واحداً داخل صفحة مركبة أكبر

عادة تحقق قصيرة

الأشرطة المتجهة ميزة تستحق أن نذكرها بالاسم. لأن DrawBarcode يكتب الرمز كأوامر رسم PDF لا كصورة نقطية، تبقى الأشرطة حادة عند أي تكبير ولا يحمل الملف دقة خاصة به؛ الدقة الوحيدة المهمة هي دقة الطابعة. لكن هذا لا يعفيك من الاختبار، بل يعني فقط أن الاختبار يجب أن يحدث على الورق. أنشئ عينة، واطبعها على أقل جهاز دقة ستواجهه رموزك فعلياً، وامسحها بنفس فئة القارئ التي يستخدمها جمهورك، لا بجهاز التصوير عالي المواصفات على مكتبك. افحص المناطق الهادئة بمسطرة على المطبوع، وتحقق من أن عرض الوحدة نجا من الرحلة من النقاط إلى النقاط الجهازية، وتأكد من أن القيمة المفكوكة تطابق ما رمّزته، بما في ذلك رقم التحقق. خمس دقائق مع قارئ حقيقي تكشف كل فشل وُصف أعلاه، وتكشفه قبل أن تكتشفه منصة من البضائع الموسومة خطأً

تُعد الطريقتان DrawBarcode وDirectDrawBarcode المعروضتان هنا جزءاً من HotPDF Component لـ Delphi وC++Builder