Blog

Códigos GS1-128 com precisão de 0,1 mm em JSON

GS1-128 parece simples até o scanner falhar a 240 dpi. Um guia sobre comprimento total, X-dimension, zonas silenciosas e por que HTML/CSS dificulta essa precisão.

Quem envia produtos físicos acaba precisando imprimir um GS1-128 que seja lido por um scanner real, em um armazém real, com luz e distância reais. Parece um detalhe operacional, mas costuma ser uma das falhas mais barulhentas em geração de PDF.

Este artigo explica o que “precisão de 0,1 mm” significa para GS1-128, por que renderizadores baseados em HTML/CSS têm dificuldade nesse ponto e quais regras ajudam a evitar rejeições em DHL, FedEx, USPS e scanners de inbound da Amazon.

O que “precisão” significa em um código de barras

GS1-128 (antes UCC/EAN-128) codifica dados usando larguras de barras e espaços em proporções rígidas. A unidade mínima é a X-dimension: a largura da barra ou espaço mais estreito. As demais larguras são múltiplos de X.

O scanner mede larguras relativas. Dois problemas aparecem com frequência:

  1. X-dimension inconsistente no mesmo símbolo: o renderer arredonda subpíxeis de forma diferente em barras vizinhas.
  2. Comprimento total ou escala errados: o símbolo é renderizado e depois escalado, reduzindo a X-dimension abaixo do mínimo GS1, normalmente 0,495 mm em 1,0×.

O sintoma engana: uma amostra isolada lê bem, mas o lote real mostra rejeições como 1 em 30. O scanner de desenvolvimento costuma ser mais tolerante que o do armazém.

A regra dos 0,1 mm

A precisão relevante é o comprimento total do barcode dentro de 0,1 mm do alvo da especificação. Não significa que cada barra tenha 0,1 mm; barras geralmente têm 0,495 mm ou mais.

Em um GS1-128 típico com 18 caracteres numéricos:

  • O símbolo tem cerca de 120 barras e espaços
  • O comprimento em 1,0× fica perto de 58 mm
  • 0,1 mm de tolerância total equivale a ~0,17% de precisão
  • O orçamento por barra fica perto de 0,001 mm

Por isso, uma barra que deveria ter 7,4 px e sai com 7 px pode ser fatal. O arredondamento subpíxel se acumula ao longo do símbolo.

Por que HTML/CSS sofre aqui

O caminho comum é gerar SVG, embutir em HTML e converter para PDF via Puppeteer ou Prince. Cada etapa pode introduzir desvio.

1. O navegador arredonda ao rasterizar

Mesmo SVG dentro de HTML passa pelo painter do navegador. Para manter arestas corretas, você precisa de shape-rendering="crispEdges", contêiner em coordenadas de pixel inteiro e uma relação limpa entre DPI e largura de barra.

2. CSS pode escalar sem aviso

Um transform: scale(0.95) adicionado para corrigir outro layout distorce todos os barcodes da página. O PDF parece certo; o scanner mede outra coisa.

3. O emissor PDF quantiza coordenadas

Ao escrever o PDF, alguns motores ajustam coordenadas a uma grade interna. O resultado fica quase correto, mas o erro acumulado derruba a tolerância.

4. Fontes Code 128 são piores

Fontes são vetoriais, mas font hinting desloca larguras pequenas para melhorar a leitura humana. Isso é exatamente o oposto do que um scanner precisa.

Renderização estruturada

gPdf calcula o padrão de barras e espaços a partir da especificação GS1-128 e emite primitivas vetoriais PDF diretamente: sem HTML, sem tradução SVG e sem 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" }
      }
    ]
  }]
}

No elemento barcode, width é o comprimento total do símbolo em mm, aquilo que você mede com um paquímetro no rótulo impresso. Com width: 58.0:

  • O renderer calcula a X-dimension a partir do comprimento alvo e da contagem de barras.
  • Cada barra é desenhada com a mesma X-dimension.
  • As larguras são gravadas no PDF como coordenadas floating-point.
  • Não há arredondamento de CSS, escala de layout nem hinting de fonte.

Desde que a impressora não aplique escala própria, o comprimento fica dentro de 0,1 mm do alvo.

O que imprimir de fato

Regra 1: especifique o comprimento total

width é o controle correto porque pode ser medido. Especificar só a X-dimension faz o comprimento mudar conforme os dados codificados.

  • Etiqueta 4×6 in: largura de 100 mm; GS1-128 em geral ~58–72 mm
  • Etiqueta 4×4 in de compliance: ~45–58 mm
  • Etiqueta carton 2×1 in (Amazon UPC): não é caso de GS1-128; use UPC-A

Regra 2: zonas silenciosas sempre

GS1-128 exige zonas silenciosas ≥ 10X nos dois lados. Em 1,0× (X = 0,495 mm), isso significa pelo menos 4,95 mm de branco livre. Colocar o código em x: 0 para economizar espaço pode impedir o scanner de encontrar a borda. gPdf reserva essa área automaticamente.

Regra 3: teste no scanner real

A câmera do celular perdoa mais que scanners industriais Honeywell ou Zebra. Imprima 50 etiquetas na impressora de produção, na velocidade real, e passe pelo scanner real. Leitura abaixo de 99% normalmente aponta para inconsistência de X-dimension.

Realidade multiformato

Sua etiqueta provavelmente precisa de mais de um formato:

Symbol Uso Fonte da especificação
GS1-128 Unidades logísticas, GTIN + serial + lote GS1 General Specifications
QR with FNC1 Ecommerce escaneável por celular ISO/IEC 18004
Data Matrix Farmacêutico (DSCSA / EU FMD) ISO/IEC 16022
PDF417 Carteiras de motorista, cartões de embarque ISO/IEC 15438
Aztec Bilhetes de transporte ISO/IEC 24778
MaxiCode UPS especificamente ISO/IEC 16023

Um renderer que só faz GS1-128 cedo ou tarde exige uma segunda ferramenta. Em logística, dois formatos no mesmo fluxo são comuns.

Como lidar com rejeições em produção

  1. Pegue amostras reais que falharam.
  2. Meça com paquímetro comprimento total e X-dimension.
  3. Confira o texto legível abaixo do código.
  4. Verifique as zonas silenciosas.
  5. Teste outro modelo de scanner.
  6. Compare com uma etiqueta de referência conhecida.

TL;DR

Precisão em GS1-128 não é sobre imprimir barras finíssimas; é sobre manter a X-dimension consistente em todo o símbolo. HTML/CSS introduz drift subpíxel em várias fases. Renderização estruturada que emite vetores PDF elimina essas fontes de erro.

Se o seu stack atual mostra 1–5% de rejeição de scanner, esse é o indício. O Playground pode gerar um GS1-128 com width igual à sua especificação; imprima e meça com paquímetro.