إذا كنت تشحن سلعًا مادية، فستحتاج في النهاية إلى طباعة GS1-128 يقرأه ماسح يدوي حقيقي في مستودع حقيقي وتحت إضاءة ومسافة حقيقيتين. يبدو الأمر تفصيلًا صغيرًا، لكنه من أكثر أسباب فشل توليد PDF إزعاجًا.
يوضح هذا المقال ما تعنيه دقة “0.1 mm” في GS1-128، ولماذا تتعثر مسارات HTML/CSS في الحفاظ عليها، وما القواعد الصغيرة التي تجعل الباركود يطبع صحيحًا من المرة الأولى على ماسحات DHL وFedEx وUSPS وAmazon.
ما معنى دقة الباركود
يعتمد GS1-128 (المعروف سابقًا باسم UCC/EAN-128) على عرض الأشرطة والفجوات بنسب دقيقة. الوحدة الأساسية هي X-dimension: عرض أضيق شريط أو فجوة. كل شيء آخر هو مضاعفات X.
الماسح لا يحكم على الشكل العام؛ إنه يقيس النسب. أكثر مشكلتين شيوعًا في الإنتاج:
- X-dimension غير متسق داخل الرمز: يقرّب العارض الأشرطة المتجاورة بطرق مختلفة، فتظهر أشرطة 8 px ثم شريط 7 px في المنتصف.
- طول إجمالي أو تحجيم خاطئ: يُرسم الرمز ثم يُصغّر أو يُكبّر لاحقًا، فيهبط X-dimension تحت حد GS1 الأدنى (غالبًا 0.495 mm عند 1.0×).
تظهر المشكلة كالتالي: عينة واحدة تُقرأ، لكن دفعة الإنتاج تسجل رفضًا مثل 1 من كل 30. ماسح التطوير غالبًا أكثر تسامحًا من ماسح المستودع.
قاعدة 0.1 mm
الدقة هنا تعني أن الطول الإجمالي للباركود يبقى ضمن 0.1 mm من هدف المواصفة. لا تعني أن كل شريط عرضه 0.1 mm؛ الأشرطة عادة 0.495 mm أو أكبر.
لرمز GS1-128 نموذجي يحمل 18 رقمًا:
- يحتوي الرمز على نحو 120 شريطًا وفجوة
- الطول عند 1.0× يقارب 58 mm
- 0.1 mm تساوي نحو 0.17% من الطول كله
- ميزانية الاتساق لكل شريط تقترب من 0.001 mm
لذلك فإن رسم شريط كان يجب أن يكون 7.4 px بعرض 7 px فقط قد يكون كافيًا للفشل. أخطاء sub-pixel تتراكم عبر الرمز.
لماذا يصعب ذلك عبر HTML/CSS
المسار الشائع هو توليد SVG أو عناصر <div>، إدراجها في HTML، ثم تحويل الصفحة إلى PDF عبر Puppeteer أو Prince. كل حلقة يمكن أن تضيف انحرافًا.
1. المتصفح يقرّب أثناء التحويل النقطي
حتى SVG داخل HTML يمر عبر طبقة الرسم في المتصفح. تحتاج إلى shape-rendering="crispEdges"، وحدود بكسل صحيحة، وتوافق نظيف بين DPI وعرض الشريط. من السهل كسر أحد هذه الشروط.
2. CSS قد يغيّر القياس بصمت
خاصية مثل transform: scale(0.95) أُضيفت لحل مشكلة تخطيط أخرى ستشوّه كل باركود في الصفحة. PDF يبدو جيدًا؛ الماسح لا يقرأه.
3. محرك PDF يكمّم الإحداثيات
عند كتابة PDF، بعض المحركات تقرب الإحداثيات إلى شبكة داخلية. النتيجة تبدو قريبة من الصحيح لكنها تراكم خطأً هندسيًا.
4. خطوط Code 128 أسوأ
خط Code 128 قد يكون vector، لكن font hinting يغيّر العروض الصغيرة ليجعلها أجمل للعين البشرية. هذا عكس ما يحتاجه الماسح.
نهج rendering منظم
gPdf يحسب نمط الأشرطة والفجوات من مواصفة GS1-128 ويكتب PDF vector primitives مباشرة: بلا HTML، بلا ترجمة SVG، وبلا font hinting.
{
"pages": [{
"size": "label_100_150",
"elements": [
{
"type": "barcode",
"format": "gs1128",
"content": "(00)123456789012345678",
"x": 4,
"y": 8,
"width": 58.0,
"height": 18.0,
"barcode_text": { "enabled": true, "position": "bottom" }
}
]
}]
}
في عنصر barcode، يعني width الطول الإجمالي للرمز بالملليمتر، أي ما تقيسه بالفرجار على الملصق المطبوع. عند width: 58.0:
- يحسب العارض قيمة X-dimension من الطول المستهدف وعدد أشرطة الرمز.
- يرسم كل شريط بالقيمة نفسها تمامًا.
- يكتب العروض في PDF كإحداثيات floating-point.
- لا يوجد rounding من CSS ولا تحجيم من التخطيط ولا font hinting.
إذا لم تضف الطابعة تحجيمًا خاصًا بها، يبقى الطول الإجمالي ضمن 0.1 mm من الهدف.
ماذا تطبع فعليًا
القاعدة 1: حدّد الطول الإجمالي
width هو التحكم الصحيح لأنه قابل للقياس. إذا ضبطت X-dimension فقط، فسيتغير طول الرمز مع طول البيانات المشفرة.
- ملصق شحن 4×6 in: العرض 100 mm تقريبًا، وGS1-128 عادة ~58–72 mm
- ملصق compliance 4×4 in: نحو ~45–58 mm
- ملصق carton 2×1 in (Amazon UPC): ليس مجال GS1-128؛ استخدم UPC-A
القاعدة 2: المناطق الهادئة دائمًا
يحتاج GS1-128 إلى مناطق هادئة ≥ 10X على الجانبين. عند 1.0× (X = 0.495 mm)، يعني ذلك 4.95 mm على الأقل من فراغ أبيض. وضع الرمز عند x: 0 يمنع الماسح أحيانًا من إيجاد البداية. يجب أن يحجز العارض هذه المساحة تلقائيًا؛ gPdf يفعل ذلك.
القاعدة 3: اختبر على الماسح الهدف
كاميرا الهاتف أكثر تسامحًا من Honeywell أو Zebra صناعي. اطبع 50 ملصقًا على طابعة الإنتاج، وبسرعة الإنتاج، ثم مرّرها على الماسح الحقيقي. قراءة أقل من 99% تعني أن شيئًا في X-dimension أو الطباعة يحتاج مراجعة.
واقع تعدد الصيغ
غالبًا لا يحتوي الملصق على GS1-128 وحده:
| Symbol | الاستخدام | مصدر المواصفة |
|---|---|---|
| GS1-128 | وحدات لوجستية، GTIN + serial + lot | GS1 General Specifications |
| QR with FNC1 | تجارة إلكترونية قابلة للمسح من الجوال | ISO/IEC 18004 |
| Data Matrix | أدوية (DSCSA / EU FMD) | ISO/IEC 16022 |
| PDF417 | رخص قيادة وبطاقات صعود | ISO/IEC 15438 |
| Aztec | تذاكر نقل | ISO/IEC 24778 |
| MaxiCode | UPS تحديدًا | ISO/IEC 16023 |
العارض الذي يدعم GS1-128 فقط سيدفعك لاحقًا إلى أداة ثانية. لذلك يجمع gPdf هذه الصيغ في عارض واحد.
التعامل مع رفض الماسح في الإنتاج
- خذ عينات من الملصقات الفاشلة بدل الاعتماد على المتوسطات.
- قس بالفرجار الطول الإجمالي وX-dimension.
- راجع النص المقروء للبشر أسفل الرمز؛ إذا فشل أيضًا فالمشكلة أعمق.
- تحقق من المناطق الهادئة على الجانبين.
- جرّب ماسحًا آخر لعزل مشاكل التوافق.
- قارن بملصق مرجعي معروف الجودة.
TL;DR
دقة GS1-128 ليست عن مدى نحافة الشريط، بل عن بقاء X-dimension متسقًا عبر الرمز كله وضمن جزء صغير من الملليمتر. مسار HTML/CSS يضيف drift في مراحل متعددة؛ أما PDF vector primitives فتتجنب هذه المصادر.
إذا كان لديك معدل رفض ماسحات بين 1% و5% في حزمة PDF الحالية، فهذا مؤشر قوي. يمكن لـ Playground توليد عينة GS1-128 مع width مطابق لمواصفة الملصق، ثم قياسها بعد الطباعة.