مقال تقني

الرموز الشريطية (Barcodes) في PDF باستخدام Delphi: QR، PDF417، DataMatrix

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

البديل هو رسم الرمز كمحتوى متجه، مباشرة في الصفحة. يكشف PDFlibPas عن مجموعة من استدعاءات الرسم لهذا الغرض بالضبط، وتغطي رموز المصفوفة ثنائية الأبعاد QR، PDF417، و DataMatrix، والعائلات الخطية من خلال Code128 و GS1-128، و USPS Intelligent Mail للأتمتة البريدية. الحجة المؤيدة للمتجه ليست جمالية. إنها تتعلق بما إذا كانت الأشرطة ستهبط حيث يتوقعها الماسح الضوئي

لماذا يتفوق المتجه على الصورة النقطية الموضوعة

الرمز الشريطي هو نمط من الأشرطة والفراغات، أو في بعدين شبكة من الوحدات الداكنة والفاتحة. يعمل جهاز فك التشفير عن طريق قياس نسبة تلك العروض. أي شيء يشوه النسب هو ضجيج يلتهم ميزانية أخطاء الرمز. تحمل صورة الرمز الشريطي النقطية بكسلات ثابتة. عندما يتم عرض 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. هذه هي الطريقة الأكثر إحكاما لوضع رمز شريطي رقمي طويل، ويجمع تنفيذ PDFlibPas Code128 مجموعتي 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 Intelligent Mail، المسمى أيضًا OneCode، بتشفير بيانات التوجيه والتتبع في رمز شريطي واحد معدّل الارتفاع للأتمتة البريدية. يأخذ DrawIntelligentMailBarcode هندسة صريحة لعرض الشريط، والارتفاع الكامل للشريط، وارتفاع المتعقب، وعرض الفراغ، مع البيانات المقدمة كسلسلة من 20، 25، 29، أو 31 رقمًا من الأرقام فقط. توجد ارتفاعات الشريط والمتعقب الصريحة لأن الرمز يحمل معلومات حول ما إذا كان كل شريط عبارة عن شريط كامل، أو صاعد (ascender)، أو هابط (descender)، ويعتمد القارئ البريدي على التمسك بهذه الارتفاعات وفقًا للمواصفات

الرسم في الصفحة والقياس للتخطيط

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

يستفيد تخطيط العائلات الخطية من القياس أولاً. يُرجع GetBarcodeWidth العرض المرسوم الإجمالي لرمز شريطي لعرض شريط ضيق معين ونوع رمز شريطي، بحيث يمكنك حجز المساحة الأفقية الدقيقة قبل الالتزام بالرسم، بدلاً من التخمين واكتشاف تداخل بعد بناء الصفحة. الرموز ثنائية الأبعاد أبسط في الوضع لأنك تقوم بتعيين حجمها المرسوم مباشرة من خلال SymbolSize أو ModuleSize، ويملأ الرمز تلك البصمة. في كلتا الحالتين، الانضباط هو نفسه. حدد الحجم الفعلي من بيئة المسح الضوئي، وأكد أن الرمز يناسب الفتحة التي لديك، ودع الهندسة المتجهة تبقي كل حافة حادة من معاينة الشاشة إلى الطباعة النهائية

بالنسبة لسير عمل بناء الصفحة الأوسع نطاقًا الذي تدخل فيه هذه الرموز الشريطية، تغطي التقنيات الواردة في مقالنا حول استخراج النص والصور والخطوط قراءة المحتوى مرة أخرى من PDF، ويوضح الدليل لدمج وتقسيم ملفات PDF الكبيرة مع الوصول المباشر كيفية تجميع مستندات كبيرة الحجم بكفاءة. يقترن كلاهما بشكل طبيعي مع واجهة برمجة تطبيقات الرسم الموضحة هنا، والتي يتم شحنها كجزء من Delphi PDF Library لـ Delphi و C++Builder إلى جانب واجهات برمجة تطبيقات النص والرسومات والنموذج والتوقيع التي تمت تغطيتها في مكان آخر في هذه المدونة