আপনি physical goods ship করলে একসময় এমন GS1-128 barcode ছাপতেই হবে, যা বাস্তব warehouse আলো, বাস্তব দূরত্ব এবং বাস্তব handheld scanner-এ পড়বে। এটি ছোট detail মনে হলেও PDF generation-এ এটিই প্রায়ই সবচেয়ে বিরক্তিকর failure mode।
এই লেখায় বোঝানো হয়েছে GS1-128-এ “0.1 mm precision” আসলে কী, HTML/CSS based renderer কেন তা ধরে রাখতে লড়ে, এবং কোন নিয়মগুলো DHL, FedEx, USPS ও Amazon inbound scanner-এ rejection কমায়।
Barcode precision মানে কী
GS1-128 (আগে UCC/EAN-128) data encode করে bar width ও gap width-এর নির্দিষ্ট অনুপাত দিয়ে। মূল unit হলো X-dimension: সবচেয়ে সরু bar বা gap-এর width। বাকি সব width X-এর multiple।
Scanner ছবি দেখে না; relative width মাপে। Production-এ সবচেয়ে সাধারণ দুটি failure:
- একই symbol-এ inconsistent X-dimension: renderer adjacent bars-এ ভিন্ন sub-pixel rounding করে; কিছু bar 8 px, মাঝখানে কোনোটি 7 px।
- ভুল overall length বা scaling: symbol render হওয়ার পরে scale হয়, ফলে X-dimension GS1 minimum-এর নিচে নেমে যায় (1.0× magnification-এ সাধারণত 0.495 mm)।
এটি sample-এ ধরা পড়ে না: একটি label scan হয়, কিন্তু production batch-এ 1-in-30 rejection দেখা যায়। Development scanner warehouse scanner-এর চেয়ে বেশি forgiving।
0.1 mm rule
প্রাসঙ্গিক precision হলো overall barcode length spec target থেকে 0.1 mm tolerance-এর মধ্যে থাকা। এর মানে নয় প্রতিটি bar 0.1 mm wide; bar সাধারণত 0.495 mm বা বেশি।
18 numeric characters বহন করা একটি typical GS1-128:
- Symbol-এ প্রায় 120 bars ও gaps থাকে
- 1.0× magnification-এ total length প্রায় 58 mm
- 0.1 mm tolerance মানে total length জুড়ে ~0.17% accuracy
- Per-bar budget প্রায় 0.001 mm
তাই 7.4 px হওয়া উচিত ছিল এমন bar যদি 7 px হয়, সেটি fatal হতে পারে। Sub-pixel rounding পুরো symbol জুড়ে জমে।
HTML/CSS কেন কঠিন
সাধারণ workflow: GS1-128 data থেকে SVG বানানো, HTML-এ embed করা, তারপর Puppeteer বা Prince দিয়ে PDF render করা। প্রতিটি ধাপ geometry বদলাতে পারে।
1. Browser rasterisation rounding করে
HTML-এর ভিতরে SVG-ও browser painter দিয়ে যায়। ঠিক রাখতে হলে shape-rendering="crispEdges", integer pixel boundary এবং DPI-to-bar-width alignment দরকার। এগুলো সহজেই ভেঙে যায়।
2. CSS layout scale করতে পারে
কোনো পুরোনো transform: scale(0.95) পুরো barcode geometry বিকৃত করতে পারে। PDF দেখতে ঠিক, scanner পড়তে ব্যর্থ।
3. PDF emitter quantize করে
Browser যখন PDF operators লেখে, কিছু engine internal grid-এ coordinates snap করে। Output প্রায় ঠিক দেখায়, কিন্তু error accumulate করে।
4. Font-based encoding আরও ঝুঁকিপূর্ণ
Code 128 font vector হলেও font hinting ছোট size-এ width সরায় যাতে human eye-তে ভালো লাগে। Scanner-এর জন্য এটি ভুল trade-off।
Structured rendering approach
gPdf GS1-128 spec থেকে bar/gap pattern compute করে এবং সরাসরি PDF vector primitives emit করে: HTML নেই, SVG translation নেই, 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 element-এ width হলো symbol-এর overall length, mm-এ। Printed label-এ caliper দিয়ে এটিই মাপা যায়। width: 58.0 মানে:
- Renderer target length ও symbol bar count থেকে X-dimension হিসাব করে।
- প্রতিটি bar একই X-dimension দিয়ে আঁকে।
- Width PDF-এ floating-point coordinates হিসেবে লেখা হয়।
- CSS pixel rounding, layout scaling বা font hinting নেই।
Printer নিজে scaling না করলে output requested target থেকে 0.1 mm-এর মধ্যে থাকে।
কীভাবে print করবেন
Rule 1: overall length specify করুন
width সঠিক control কারণ এটি measure করা যায়। শুধু X-dimension দিলে encoded data বদলালেই symbol length বদলাবে।
- 4×6 in shipping label: 100 mm wide; GS1-128 সাধারণত ~58–72 mm
- 4×4 in compliance label: ~45–58 mm
- 2×1 in carton label (Amazon UPC): GS1-128 নয়; UPC-A ব্যবহার করুন
Rule 2: quiet zones সবসময় রাখুন
GS1-128-এর দুই পাশে ≥ 10X quiet zones দরকার। 1.0×-এ (X = 0.495 mm), এটি অন্তত 4.95 mm clear white space। Barcode-কে x: 0-তে ঠেলে দিলে scanner শুরু খুঁজে পায় না। Renderer-এর উচিত এই space reserve করা; gPdf করে।
Rule 3: target scanner-এ test করুন
Phone camera Honeywell বা Zebra industrial scanner-এর চেয়ে বেশি forgiving। Production printer-এ 50 labels print করুন, real scanner ও real speed-এ scan করুন। Read rate < 99% হলে X-dimension consistency দেখুন।
Multi-format reality
Label-এ প্রায়ই GS1-128 ছাড়াও অন্য code থাকে:
| Symbol | Use | Spec source |
|---|---|---|
| GS1-128 | Logistics units, GTIN + serial + lot | GS1 General Specifications |
| QR with FNC1 | Mobile-scannable ecommerce | ISO/IEC 18004 |
| Data Matrix | Pharmaceutical (DSCSA / EU FMD) | ISO/IEC 16022 |
| PDF417 | Drivers’ licences, boarding passes | ISO/IEC 15438 |
| Aztec | Transport tickets | ISO/IEC 24778 |
| MaxiCode | UPS specifically | ISO/IEC 16023 |
শুধু GS1-128 handle করা renderer শেষ পর্যন্ত দ্বিতীয় tool দরকার করাবে। Shipping/logistics workflow প্রায়ই অন্তত দুই format চায়।
Production rejection debug
- Failed labels সংগ্রহ করুন; aggregate metrics যথেষ্ট নয়।
- Caliper দিয়ে মাপুন: overall length ও X-dimension।
- Human-readable text দেখুন; bars fail হলে অনেক scanner OCR fallback চেষ্টা করে।
- Quiet zones verify করুন।
- অন্য scanner model দিয়ে test করুন।
- Known-good reference label-এর সঙ্গে compare করুন।
TL;DR
GS1-128 precision মানে bar কত সরু তা নয়; পুরো symbol-এ X-dimension কতটা consistent থাকে। HTML/CSS rendering chain একাধিক জায়গায় sub-pixel drift যোগ করে। Structured renderer সরাসরি PDF vector primitives লিখে সেই drift এড়ায়।
Current PDF stack-এ 1–5% scanner rejection থাকলে এটিই প্রথম suspect। Playground-এ GS1-128 sample-এর width আপনার label spec অনুযায়ী set করুন, print করুন এবং caliper দিয়ে মাপুন।