ব্লগ

JSON দিয়ে 0.1 mm precision-এর GS1-128 barcode

GS1-128 সহজ মনে হয়, যতক্ষণ না 240 dpi-তে scanner পড়া বন্ধ করে। Overall length, X-dimension, quiet zone এবং HTML/CSS কেন কঠিন করে তোলে—তার ব্যবহারিক guide.

আপনি 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:

  1. একই symbol-এ inconsistent X-dimension: renderer adjacent bars-এ ভিন্ন sub-pixel rounding করে; কিছু bar 8 px, মাঝখানে কোনোটি 7 px।
  2. ভুল 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

  1. Failed labels সংগ্রহ করুন; aggregate metrics যথেষ্ট নয়।
  2. Caliper দিয়ে মাপুন: overall length ও X-dimension।
  3. Human-readable text দেখুন; bars fail হলে অনেক scanner OCR fallback চেষ্টা করে।
  4. Quiet zones verify করুন
  5. অন্য scanner model দিয়ে test করুন
  6. 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 দিয়ে মাপুন।