ब्लॉग

JSON से 0.1 mm precision वाले GS1-128 barcode

GS1-128 आसान लगता है, जब तक 240 dpi पर scanner पढ़ना बंद न कर दे। Overall length, X-dimension, quiet zones और HTML/CSS की सीमा पर व्यावहारिक guide.

अगर आप physical goods ship करते हैं, तो किसी न किसी समय आपको ऐसा GS1-128 barcode छापना पड़ेगा जिसे warehouse की असली रोशनी, असली दूरी और असली handheld scanner पढ़ सके। यह छोटा detail लगता है, लेकिन PDF generation में यही अक्सर सबसे महंगा failure बन जाता है।

यह guide बताती है कि GS1-128 में “0.1 mm precision” का मतलब क्या है, HTML/CSS based rendering chain क्यों drift पैदा करती है, और कौन से नियम DHL, FedEx, USPS और Amazon inbound जैसे scanner flows में rejection घटाते हैं।

Barcode precision का अर्थ

GS1-128 (पहले UCC/EAN-128) data को bar width और gap width के अनुपात से encode करता है। सबसे छोटी इकाई X-dimension है: सबसे narrow bar या space की width। बाकी widths X के multiples होते हैं (Code 128 pattern में 1X, 2X, 3X, 4X)।

Scanner image नहीं, relative widths मापता है। Production में दो failures सबसे सामान्य हैं:

  1. Symbol के अंदर inconsistent X-dimension: renderer adjacent bars पर अलग-अलग sub-pixel rounding करता है; कुछ bars 8 px और बीच में कोई 7 px बन जाता है।
  2. गलत overall length या scaling: symbol render होने के बाद scale होता है और X-dimension GS1 minimum से नीचे चला जाता है (1.0× magnification पर सामान्यतः 0.495 mm)।

परिणाम अक्सर misleading होता है: एक sample scan हो जाता है, लेकिन production batch में 1-in-30 rejection दिखता है। Dev scanner warehouse scanner से अधिक forgiving होता है।

0.1 mm rule

यहां precision का अर्थ है overall barcode length का spec target से 0.1 mm tolerance में रहना। इसका अर्थ यह नहीं कि हर bar 0.1 mm wide है; bars सामान्यतः 0.495 mm या उससे बड़े होते हैं।

18 numeric characters वाले typical GS1-128 के लिए:

  • Symbol में लगभग 120 bars और gaps होते हैं
  • 1.0× magnification पर total length लगभग 58 mm
  • 0.1 mm total tolerance लगभग 0.17% accuracy है
  • Per-bar consistency budget लगभग 0.001 mm तक आ जाता है

इसलिए 7.4 px होना चाहिए था लेकिन 7 px बना bar fatal हो सकता है। Sub-pixel rounding 120 elements पर जुड़ती जाती है।

HTML/CSS क्यों संघर्ष करता है

Common path है: GS1-128 data से SVG बनाओ, उसे HTML में embed करो, फिर Puppeteer या Prince से PDF बनाओ। हर step geometry को थोड़ा बदल सकता है।

1. Browser rasterisation round करता है

HTML के अंदर SVG भी browser painter से गुजरता है। सही output के लिए shape-rendering="crispEdges", integer pixel boundary और DPI-to-bar-width alignment चाहिए। ये तीनों conditions आसानी से टूटती हैं।

2. CSS layout silently scale कर सकता है

Stylesheet में कहीं transform: scale(0.95) लगा हो तो वह barcode सहित पूरी geometry बदल देता है। PDF screen पर ठीक दिखता है, scanner पर नहीं।

3. PDF emitter quantization जोड़ सकता है

Browser जब PDF operators लिखता है, कुछ engines coordinates को internal grid पर snap करते हैं। Coordinates align न हों तो output almost सही दिखता है, पर error accumulate होता है।

4. Font-based Code 128 और खराब है

Code 128 font vector हो सकता है, लेकिन font hinting small sizes पर widths बदलता है ताकि text human eye को बेहतर लगे। Scanner के लिए यही गलत है।

Structured rendering approach

gPdf GS1-128 spec से bar/gap pattern compute करता है और सीधे PDF vector primitives emit करता है: no HTML, no SVG translation, no 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 में। यही वह value है जिसे printed label पर caliper से मापा जा सकता है। width: 58.0 का मतलब:

  • Renderer symbol के bar count और target length से X-dimension निकालता है।
  • हर bar exactly उसी X-dimension से draw होता है।
  • Widths PDF में floating-point coordinates के रूप में लिखी जाती हैं।
  • CSS pixel rounding, layout scaling और font hinting नहीं आते।

यदि printer खुद scaling न करे, तो output requested target से 0.1 mm के भीतर रह सकता है।

Production में क्या print करें

Rule 1: overall length specify करें

width सही knob है क्योंकि इसे measure किया जा सकता है। केवल X-dimension specify करने पर 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 use करें

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 start edge नहीं खोज पाता। Renderer को quiet zones reserve करने चाहिए; gPdf करता है।

Rule 3: target scanner पर test करें

Phone camera Honeywell या Zebra industrial scanner से ज्यादा forgiving है। Actual production printer पर 50 labels print करें, real scanner और real conveyor speed पर scan करें। Read rate < 99% हो तो X-dimension consistency जांचें।

Multi-format reality

Label में अक्सर सिर्फ GS1-128 नहीं होता:

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 workflow को दूसरी toolchain पर धकेल देगा। Shipping/logistics में कम से कम दो formats की जरूरत सामान्य है।

Scanner rejection कैसे debug करें

  1. Failed labels sample करें; aggregate metrics पर भरोसा न करें।
  2. Caliper से measure करें: overall length और X-dimension।
  3. Human-readable text देखें; fallback OCR भी fail हो तो symbol malformed है।
  4. Quiet zones verify करें
  5. दूसरे scanner model से test करें
  6. Known-good reference label से compare करें

TL;DR

GS1-128 precision पतली bars छापने की बात नहीं है; यह पूरी symbol length में consistent X-dimension रखने की बात है। HTML/CSS rendering chain कई जगह sub-pixel drift डालती है। Structured PDF vector rendering उन drift sources को हटाता है।

अगर current PDF stack में 1–5% scanner rejection है, तो यह strong signal है। Playground में GS1-128 sample का width अपनी label spec पर set करें, print करें और caliper से measure करें।