Blog

JSON ile 0,1 mm hassasiyetinde GS1-128 barkod

GS1-128 basit görünür; ta ki scanner 240 dpi'da okumayı bırakana kadar. Toplam uzunluk, X-dimension, quiet zone ve HTML/CSS sınırları için pratik rehber.

Fiziksel ürün gönderiyorsanız, sonunda gerçek depo ışığında ve gerçek mesafede okunacak bir GS1-128 barkod basmanız gerekir. Küçük bir etiket ayrıntısı gibi görünür, ama PDF üretiminde en gürültülü hata kaynaklarından biridir.

Bu yazı GS1-128 için “0,1 mm hassasiyet” ne demektir, HTML/CSS tabanlı renderer’lar bunu neden zor tutar ve DHL, FedEx, USPS veya Amazon inbound scanner akışlarında hangi kurallar rejection oranını düşürür, bunları anlatır.

Barkod hassasiyeti ne demektir

GS1-128 (eski adıyla UCC/EAN-128) veriyi bar ve boşluk genişlikleri ile kodlar. Temel birim X-dimension değeridir: en dar bar veya boşluk genişliği. Diğer genişlikler X’in katlarıdır.

Scanner görüntüye değil, göreli genişliklere bakar. Production’da en yaygın iki sorun:

  1. Sembol içinde tutarsız X-dimension: renderer komşu barlarda farklı sub-pixel rounding yapar.
  2. Yanlış toplam uzunluk veya scaling: sembol render edilir, sonra ölçeklenir ve X-dimension GS1 minimumunun altına iner; 1,0× için genelde 0,495 mm.

Tek örnek okunabilir, ama üretim batch’inde 30 etiketten biri reddedilir. Development scanner çoğu zaman depo scanner’ından daha toleranslıdır.

0,1 mm kuralı

Buradaki hassasiyet barkodun toplam uzunluğunun spec hedefinden 0,1 mm tolerans içinde kalmasıdır. Her bar 0,1 mm demek değildir; barlar genellikle 0,495 mm veya daha geniştir.

18 rakam taşıyan tipik bir GS1-128 için:

  • Sembol yaklaşık 120 bar ve boşluk içerir
  • 1,0× büyütmede toplam uzunluk yaklaşık 58 mm’dir
  • 0,1 mm toplam tolerans ~0,17% doğruluk demektir
  • Bar başına bütçe yaklaşık 0,001 mm’ye iner

Bu yüzden 7,4 px olması gereken bir barın 7 px çizilmesi bile ölümcül olabilir. Sub-pixel rounding sembol boyunca birikir.

HTML/CSS neden zorlanır

Yaygın yol: GS1-128 verisinden SVG üretmek, HTML içine gömmek, sonra Puppeteer veya Prince ile PDF almak. Her aşama geometriyi kaydırabilir.

1. Browser rasterizasyon sırasında yuvarlar

HTML içindeki SVG bile browser painter’dan geçer. shape-rendering="crispEdges", integer pixel boundary ve DPI-bar width uyumu gerekir. Bunlardan biri kolayca bozulur.

2. CSS sessizce ölçekleyebilir

Başka bir layout sorununu düzeltmek için eklenmiş transform: scale(0.95) sayfadaki tüm barkodları bozar. PDF iyi görünür; scanner farklı ölçer.

3. PDF emitter koordinatları quantize eder

Bazı motorlar PDF yazarken koordinatları internal grid’e snap eder. Sonuç neredeyse doğru görünür, ama hata birikir.

4. Code 128 font kullanmak daha riskli

Font vector olabilir, fakat font hinting küçük boyutlarda insan gözü için genişlikleri değiştirir. Scanner için gereken şey bunun tersidir.

Structured rendering yaklaşımı

gPdf, GS1-128 specification’dan bar/gap pattern hesaplar ve doğrudan PDF vector primitives yazar: HTML yok, SVG translation yok, font hinting yok.

{
  "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’inde width, mm cinsinden sembolün toplam uzunluğudur; basılı etikette kumpasla ölçebileceğiniz değer budur. width: 58.0 şu anlama gelir:

  • Renderer hedef uzunluk ve bar count’tan X-dimension hesaplar.
  • Her bar aynı X-dimension ile çizilir.
  • Genişlikler PDF’e floating-point coordinates olarak yazılır.
  • CSS pixel rounding, layout scaling ve font hinting yoktur.

Printer kendi scaling’ini eklemezse toplam uzunluk hedefin 0,1 mm içinde kalır.

Ne basılmalı

Kural 1: toplam uzunluğu belirtin

width doğru ayardır çünkü ölçülebilir. Sadece X-dimension belirtmek, symbol length’i encoded data’ya bağımlı yapar.

  • 4×6 in shipping label: 100 mm genişlik; GS1-128 genelde ~58–72 mm
  • 4×4 in compliance label: ~45–58 mm
  • 2×1 in carton label (Amazon UPC): GS1-128 alanı değil; UPC-A kullanın

Kural 2: quiet zone her zaman

GS1-128 her iki tarafta ≥ 10X quiet zones ister. 1,0× için (X = 0,495 mm), bu en az 4,95 mm temiz beyaz alan demektir. Barkodu x: 0 konumuna itmek scanner’ın başlangıcı bulmasını engelleyebilir. gPdf bunu otomatik ayırır.

Kural 3: hedef scanner ile test edin

Telefon kamerası Honeywell veya Zebra endüstriyel scanner’dan daha toleranslıdır. Production printer’da 50 label basın, gerçek hızda gerçek scanner ile okutun. Read rate 99% altındaysa X-dimension tutarlılığını inceleyin.

Multi-format gerçekliği

Etiketinizde çoğu zaman sadece GS1-128 yoktur:

Symbol Kullanım 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

Sadece GS1-128 destekleyen renderer sonunda ikinci bir tool gerektirir. Logistics workflows genelde en az iki format ister.

Production scanner rejection teşhisi

  1. Failed label örneklerini alın.
  2. Kumpasla ölçün: toplam uzunluk ve X-dimension.
  3. Human-readable text’i kontrol edin.
  4. Quiet zones ölçün.
  5. Başka scanner model deneyin.
  6. Known-good reference label ile karşılaştırın.

TL;DR

GS1-128 hassasiyeti ince bar basmak değil; tüm sembolde X-dimension’ı tutarlı tutmaktır. HTML/CSS rendering zinciri birden fazla noktada sub-pixel drift üretir. Doğrudan PDF vector primitives yazan structured renderer bu kaynakları atlar.

Mevcut PDF stack’inizde 1–5% scanner rejection varsa güçlü işaret budur. Playground içinde width değerini label spec’e ayarlayıp GS1-128 örneğini render edin, basın ve kumpasla ölçün.