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:
- X-dimension inconsistente no mesmo símbolo: o renderer arredonda subpíxeis de forma diferente em barras vizinhas.
- 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
- Pegue amostras reais que falharam.
- Meça com paquímetro comprimento total e X-dimension.
- Confira o texto legível abaixo do código.
- Verifique as zonas silenciosas.
- Teste outro modelo de scanner.
- 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.