Introdução
Nós como engenheiros de software já nos deparamos com a necessidade de implementar a geração de código de barras, com isso instalamos uma biblioteca de terceiros sem nem parar para nos perguntar como que ela funciona, apenas instalamos e usamos.
Porém, aprofundar no entendimento é algo importante para que possamos saber o que estamos fazendo e como é feito, ajudando, por exemplo, a determinar qual o melhor tipo para o problema que estamos resolvendo.
Para melhor compreender, vamos entender os motivos que deram origem à invenção.
O problema que precisava ser resolvido
Imagine que um operador precisava fazer manualmente:
- Identificar o produto;
- Digitar códigos;
- Registar preços;
- Atualizar estoques.
À medida que a demanda crescia o trabalho também acompanhava e os problemas também:
- Erros de digitação;
- Inventários demorados;
- Filas nos caixas;
- Baixa rastreabilidade;
- Custos operacionais elevados.
A origem do código de barras
Os engenheiros Norman Joseph e Bernard Silver patentearam a primeira versão do código de barras em 1952, eles foram inspirados pelo Código Morse. A ideia surgiu em 1948, quando um executivo do varejo pediu aos pesquisadores que criassem uma solução para capturar dados automaticamente e evitar filas.
A patente original descrevia um código de barras circular. Posteriormente a equipe da IBM, liderada pelo engenheiro George Laurer, desenvolveram o formato retangular que conhecemos atualmente.
💡 Curiosidade
O primeiro produto escaneado comercialmente foi um pacote de chicletes Wrigley’s Juicy Fruit em 26 de junho de 1974. A embalagem original encontra-se preservada no Smithsonian Institution, nos Estados Unidos.
O ecossistema atual
Quando imaginamos o código de barras normalmente focamos apenas nas etiquetas, mas ela é apenas uma parte da solução.
O fluxo real é:
Empresa → Identificador → Código de barras → Leitor → sistema
E nesse momento temos uma dúvida muito interessante.
❓ Quem define esses identificadores?
A resposta nos leva à GS1.
GS1: a organizadora por trás dos código de barras
A GS1 é uma organização global responsável pelos padrões utilizados para identificar os produtos. Atualmente está presente em mais de 100 países e mantém padrões utilizados por varejistas, fabricantes, distribuidores e marketplaces.
Sem essa organização seria impossível garantir que o produto fosse identificado da mesma forma em diferentes países e sistemas.
GS1 Brasil
Aqui no país ela fornece às empresas:
- Prefixos de identificação;
- Padrões de codificação;
- Normas de utilização;
- Suporte para integração com cadeias de suprimento.
Quando uma empresa deseja comercializar produtos utilizando código de barras padronizados, normalmente ela obtém sua identificação por meio da GS1.
O que é um GTIN?
Muitas pessoas acreditam que o código de barras é o identificador do produto, porém não é.
O identificador é o GTIN (Global Trade Item Number). O código de barras é apenas uma representação visual desse identificador.
Por exemplo:
| |
Os tipos atualmente disponíveis são:
- GTIN-8: destinados a produtos muito pequenos que não comportam um código EAN-13;
- GTIN-12: conhecido também como UPC (Universal Product Code), amplamente utilizado nos Estados Unidos e Canadá. Possui 12 dígitos e a mesma função do GTIN-13 para identificação internacional de produtos;
- GTIN-13: também conhecido como EAN, é composto por 13 dígitos e identifica produtos de forma única;
- GTIN-14: utilizado para identificar agrupamentos de produtos, como caixas de embarque, sendo mais comum em operações logísticas do que nos pontos de venda.
As diferenças entre GTIN, EAN, UPC e SKU.
Embora muitas das vezes possam aparecer juntos, cada termo tem seu papel.
- GTIN (Global Trade Item Number): identificador global padronizado;
- EAN (European Article Number): versão europeia do GTIN-13, com 13 dígitos;
- UPC (Universal Product Code): versão americana do GTIN-12, usada em EUA e Canadá;
- SKU (Stock Keeping Unit): código interno criado pela própria empresa, sem validade global.
Os padrões GTIN, EAN e UPC são administrados pela GS1. As empresas recebem uma faixa exclusiva de numeração e geram seus próprios identificadores dentro desse espaço. Enquanto o SKU é gerado e mantido pela própria empresa, em outras palavras tem validade apenas para aquela empresa.
Como emitir o código GTIN pela GS1 Brasil?
Sendo a entidade responsável pela administração dos padrões GS1 no Brasil, os passos a serem seguidos são:
- Cadastrar a empresa: são informados os dados e escolhido o plano (R$) adequado para o porte do negócio;
- Associar-se à GS1: é obrigatório ser sócio para emissão do GTIN e para isso deve-se pagar a adesão que varia de acordo com o perfil da empresa (etapa 01);
- Registrar os produtos no Cadastro Nacional de Produtos: etapa onde é registrado o nome, descrição, dimensões e demais dados;
- Emissão do código GTIN: a cada produto cadastrado, é gerado um número exclusivo;
- Uso do GTIN: o código pode ser aplicado em embalagens, cadastros de marketplaces e documentos fiscais.
⚠️ Observação
Deve-se pagar anuidade para se manter sócio, e esse valor também varia de acordo com o perfil da empresa!
Exemplo prático de um lançamento de um novo produto
Vamos imaginar que uma pequena rede de supermercados está lançando um café de marca própria.
Passo 01: Obter um prefixo GS1
A empresa recebe uma faixa de identificação.
Exemplo:
| |
Passo 02: criar um identificador único para o produto
O sistema interno define:
| |
Passo 03: calcular o dígito verificador
O último dígito será calculado matematicamente (como se fosse um CPF).
| |
Passo 04: gerar o código de barras
É transformado o número em barras e espaços.
Passo 05: impressão na embalagem
O produto segue para distribuição.
Passo 06: chegar ao caixa
O operador realiza a leitura.
Passo 07: o sistema encontra o cadastro
| |
Com o GTIN em mãos, o sistema consulta sua base de dados e recupera informações como descrição, preço, estoque e tributação do produto.
O que é o código de barras?
É a representação visual de dados, transformando números ou caracteres em padrões de:
- Barras;
- Espaços;
- Marcadores de início;
- Marcadores de fim;
- Marcadores de validação.
Seu objetivo é permitir que uma máquina interprete rapidamente uma informação.
Anatomia de um código de barras
Todo código de barras possui 5 componentes básicos, sendo eles:
- Quiet Zone: área em branco antes e depois do código;
- Start Pattern: marca o início da leitura;
- Dados: informações codificadas;
- Check Digit: mecanismo de validação;
- Stop Pattern: marca o final da leitura.

Como um leitor interpreta um código de barras
Sendo a parte que provavelmente seja a menos conhecida, e a resposta é simples. O leitor não lê barras, ele lê a luz.
Barras absorvem luz, ou seja, as barras escuras refletem pouca luz. Enquanto as partes claras refletem mais luz.
Conhecendo essa dinâmica, o sensor mede essa diferença e converte a reflexão em sinais elétricos.
O fluxo é:

💡 Curiosidade
Apesar de enxergarmos números abaixo do código de barras, o leitor não os utiliza. Ele trabalha exclusivamente com o padrão óptico formado por barras e espaços.
Os tipos de leitores
- Scanner laser: muito comum em supermercado por ser barato, rápido e confiável. Não lê QR Codes;
- CCD (Charge-Coupled Device): utiliza uma matriz de sensores, não contém partes móveis, é muito utilizado em ambientes corporativos;
- Imager: funciona como uma câmera, sendo a tecnologia presente na maioria dos smartphones modernos. Consegue ler código de barras, QR code e Data Matrix.

⚠️ Observação
Atualmente leitores CCD e Linear Imager utilizam uma matriz de sensores ópticos para capturar toda a largura do código de barras simultaneamente.
Os 3 principais tipos de código de barras
Existem dezenas de padrões, porém, três se destacam na maioria dos sistemas corporativos.
EAN-13
O padrão dominante do varejo, sendo utilizado em:
- Supermercados;
- Farmácias;
- Lojas de departamentos;
- Marketplaces.
Possui 13 dígitos, por exemplo, 7894900011517.

Como funciona o dígito verificador?
O último dígito é calculado matematicamente e seu objetivo é detectar erros de leitura.
O algoritmo utiliza multiplicações alternadas por 1 e 3, seguidas por uma soma e cálculo complementar para múltiplos de 10.
💡 Curiosidade
O primeiro dígito do EAN-13 não possui barras próprias. Ele é representado indiretamente pelo padrão de codificação utilizado nos seis dígitos seguintes do lado esquerdo do código.
Exemplo:
Coca-Cola lata 350ml (Brasil)
EAN-13: 7894900011517
Sua estrutura
| |
Os 12 primeiros dígitos são utilizados para calcular o último dígito, chamado dígito verificador:
| |
- Multiplicamos os dígitos alternadamente por 1 e 3.
| Dígito | Peso | Resultado |
|---|---|---|
| 7 | 1 | 7 |
| 8 | 3 | 24 |
| 9 | 1 | 9 |
| 4 | 3 | 12 |
| 9 | 1 | 9 |
| 0 | 3 | 0 |
| 0 | 1 | 0 |
| 0 | 3 | 0 |
| 1 | 1 | 1 |
| 1 | 3 | 3 |
| 5 | 1 | 5 |
| 1 | 3 | 3 |
Agora somamos todos os resultados:
| |
- Encontramos o próximo múltiplo de 10
O resultado foi 73, sendo assim o próximo múltiplo de 10 é 80.
- Calculamos a diferença.
| |
Portanto, o dígito verificador é 7 e o código completo fica:
| |
O dígito verificador funciona de forma semelhante ao CPF, para chegar se a sequência de código é válida. Caso, após o cálculo, o resultado não seja idêntico ao dígito apresentado no código de barras, faz com que o sistema rejeite o código, pois pode ter sido lido errado ou impresso errado.
São utilizados três conjuntos de codificação para construir a representação visual do código de barras.
- L (Left Odd): lado esquerdo;
- G (Left Even): lado esquerdo;
- R (Right): lado direito.
Tabela L (Left Odd)
| Dígito | Binário |
|---|---|
| 0 | 0001101 |
| 1 | 0011001 |
| 2 | 0010011 |
| 3 | 0111101 |
| 4 | 0100011 |
| 5 | 0110001 |
| 6 | 0101111 |
| 7 | 0111011 |
| 8 | 0110111 |
| 9 | 0001011 |
Tabela G (Left Even)
| Dígito | Binário |
|---|---|
| 0 | 0100111 |
| 1 | 0110011 |
| 2 | 0011011 |
| 3 | 0100001 |
| 4 | 0011101 |
| 5 | 0111001 |
| 6 | 0000101 |
| 7 | 0010001 |
| 8 | 0001001 |
| 9 | 0010111 |
Tabela R (Right)
| Dígito | Binário |
|---|---|
| 0 | 1110010 |
| 1 | 1100110 |
| 2 | 1101100 |
| 3 | 1000010 |
| 4 | 1011100 |
| 5 | 1001110 |
| 6 | 1010000 |
| 7 | 1000100 |
| 8 | 1001000 |
| 9 | 1110100 |
O que significa cada bit?
Considere o número 7. Na tabela L, sua referência é 0111011. Cada posição representa 1 módulo.
- 0 é módulo branco;
- 1 é módulo preto.
Sendo assim:

Por que cada dígito tem 7 bits?
O EAN-13 foi projetado para que cada símbolo ocupe 7 módulos, por exemplo:
- 0 = 0001101;
- 7 = 0111011;
- 9 = 0001011.
Essa abordagem facilita a sincronização do leitor.
De onde surgiram essas sequências?
Essa é a parte muito interessante. Os engenheiros da IBM e, posteriormente, os comitês de padronização escolheram padrões que obedecem a várias propriedades.
- Cada dígito possui exatamente 2 barras + 2 espaços;
- Cada dígito ocupa exatamente 7 módulos;
- Existe paridade em que o lado esquerdo pode usar L ou G, enquanto o lado direito usa R; isso permite detectar orientação;
- Cada padrão é único.
Exemplo prático:
Coca-Cola lata 350 ml (Brasil) EAN 7894900011517.
Para simplificar o entendimento dos módulos, vamos utilizar a tabela L como exemplo de conversão. Em um EAN-13 real, os dígitos do lado esquerdo utilizam uma combinação das tabelas L e G definida pelo primeiro dígito.
| Número | Bit |
|---|---|
| 7 | 0111011 |
| 8 | 0110111 |
| 9 | 0001011 |
| 4 | 0100011 |
| 9 | 0001011 |
| 0 | 0001101 |
| 0 | 0001101 |
| 0 | 0001101 |
| 1 | 0011001 |
| 1 | 0011001 |
| 5 | 0110001 |
| 1 | 0011001 |
| 7 | 0110001 |
Os padrões START (101), CENTER (01010) e STOP (101) permitem que o leitor identifique onde o código começa, onde está o centro e onde termina a informação codificada.
Code 39
Um dos padrões mais populares para controle patrimonial, sendo utilizados:
- Equipamentos de TI;
- Inventário patrimonial;
- Almoxarifado;
- Indústria.
⚠️ Observação
O nome “Code 39” vem do fato de suportar originalmente 26 letras, 10 números e 3 símbolos.Totalizando 39 caracteres.
Exemplo:

Esse padrão é largamente utilizado, pois, permite o uso de letras e números. Permitindo criar identificadores amigáveis para humanos.
Caso prático: controle de ativos.
Imagine uma empresa com:
- 100 notebooks;
- 60 monitores;
- 20 impressoras;
- 40 celulares.
Cada equipamento recebe um identificador:
| |
O sistema gera um Code 39 e o colaborador pode utilizar um aplicativo em seu smartphone para a leitura.
Diferente do EAN-13, no Code 39 cada caractere é composto por:
- 5 barras;
- 4 espaços;
- 3 elementos largos (wide);
- 6 elementos estreitos (narrow).
💡 Curiosidade
Por isso, que o nome original da simbologia era 3 of 9.
Normalmente a documentação representa:
- n = narrow (estreito);
- w = wide (largo).
Por exemplo, para o caractere A “wnnnnwnnw”, podemos interpretar como:
| |
Tabela dos números
| Caractere | Padrão |
|---|---|
| 0 | nnnwwnwnn |
| 1 | wnnwnnnnw |
| 2 | nnwwnnnnw |
| 3 | wnwwnnnnn |
| 4 | nnnwwnnnw |
| 5 | wnnwwnnnn |
| 6 | nnwwwnnnn |
| 7 | nnnwnnwnw |
| 8 | wnnwnnwnn |
| 9 | nnwwnnwnn |
Tabela das letras
| Letra | Padrão |
|---|---|
| A | wnnnnwnnw |
| B | nnwnnwnnw |
| C | wnwnnwnnn |
| D | nnnnwwnnw |
| E | wnnnwwnnn |
| F | nnwnwwnnn |
| G | nnnnnwwnw |
| H | wnnnnwwnn |
| I | nnwnnwwnn |
| J | nnnnwwwnn |
| K | wnnnnnnww |
| L | nnwnnnnww |
| M | wnwnnnnwn |
| N | nnnnwnnww |
| O | wnnnwnnwn |
| P | nnwnwnnwn |
| Q | nnnnnnwww |
| R | wnnnnnwwn |
| S | nnwnnnwwn |
| T | nnnnwnwwn |
| U | wwnnnnnnw |
| V | nwwnnnnnw |
| W | wwwnnnnnn |
| X | nwnnwnnnw |
| Y | wwnnwnnnn |
| Z | nwwnwnnnn |
Para identificar início e fim é utilizado o caractere especial * e seu padrão é nwnnwnwnn. Por isso, um código NB-00001 na verdade é transmitido “NB-00001”.

💡 Curiosidade
Característica EAN-13 Code 39 Representação Bits (0 e 1) Larguras (narrow/wide) Conteúdo Apenas números Letras e números Início/Fim 101 * Tamanho fixo Sim Variável Check digit Obrigatório Opcional
Code 128
O padrão preferido da logística, sendo utilizado:
- Transportadoras;
- Centros de distribuições;
- Sistemas WMS (Warehouse Management System);
- Etiquetas de expedição.
⚠️ Observação
O Code 128 consegue representar a mesma informação utilizando menos espaço físico que o Code 39, tornando-o ideal para etiquetas pequenas e operações logísticas de alta densidade.
Exemplo:

Sua principal vantagem é a alta densidade de informações, ocupando menos espaços físicos.
Conjunto A, B e C
O Code 128 possui diferentes modos de codificação, permitindo otimizar a representação dos dados. Sendo essa uma das razões pelas quais se tornou tão popular.
Diferente do EAN-13, o Code 128 utiliza um caractere de verificação calculado sobre toda a sequência codificada. Esse mecanismo faz parte da própria especificação.
- Conjunto A: caracteres de controle, números e letras maiúsculas;
- Conjunto B: números, letras maiúsculas e minúsculas;
- Conjunto C: codifica pares de dígitos numéricos, aumentando significativamente a densidade.
💡 Curiosidade
Essa capacidade de alernar entre conjuntos durante a codificação que permite ao Code 128 representar grandes volumes de informação ocupando menos espaços que outros padrões.

Comparando os principais padrões
| Característica | EAN-13 | Code 39 | Code 128 |
|---|---|---|---|
| Numérico | Sim | Sim | Sim |
| Alfanumérico | Não | Sim | Sim |
| Densidade | Média | Baixa | Alta |
| Varejo | Excelente | Ruim | Bom |
| Patrimônio | Ruim | Excelente | Excelente |
| Logística | Boa | Boa | Excelente |
Limitações dos Código de Barras
Apesar da enorme popularidade, eles possuem limitações.
- Necessitam de linha de visão;
- Sofrem desgaste físico;
- Armazenam pouca informação;
- Dependem da qualidade de impressão.
QR Code e RFID são substitutos?
Nem sempre, pois, na prática, eles costumam ser complementares.
- Código de barras: ideal para identificação simples e barata;
- QR Code: ideal quando é necessário armazenar mais informações;
- RFID: ideal para leitura sem contato visual direto.
Como as bibliotecas geram código de barras
Agora sabemos que as bibliotecas não “geram” código de barras, geram representações visuais do código de barras.
Para botarmos a mão na massa, vamos implementar o código para validar e gerar a imagem de um código EAN-13 em Dart.
⚠️ Atenção
O objetivo deste exemplo é demonstrar a lógica de construção do EAN-13. Ele não implementa todos os requisitos de impressão definidos pela GS1, como zonas de silêncio (quiet zones), dimensões mínimas, proporções de barras e texto legível ao ser humano (HRI).
Para a representação visual utilizaremos a biblioteca image.
| |
Código Dart
| |
Utilização
| |
Saída: EAN gerado: 7891234567895
Arquivo: produto.png

O fluxo fica:
![Fluxo que demonstra desde o GTIN à imagem do código de barras no [adrão EAN-13]](/assets/images/codigo-barras/do-gtin-ao-codigo-de-barras.webp)
Para a leitura

Mitos e verdade
❌ MITO
O preço do produto está armazenado no código de barras.
Não. O código de barras normalmente contém apenas um identificador. O preço é recuperado pelo sistema.
❌ MITO
O leitor lê números.
Não. O leitor interpreta padrões de luz refletida.
❌ MITO
QR Code substitui código de barras.
Não necessariamente. Cada tecnologia foi criada para resolver problemas diferentes.
✅ VERDADE
O mesmo GTIN pode ser utilizado em diferentes sistemas.
Sim. Essa é justamente a função da padronização promovida pela GS1.
Considerações finais
É impressionante que algo tão simples do nosso dia a dia tenha um contexto técnico impressionante. Hoje é fácil afirmar que o código de barras é “simples”, porém sua invenção é brilhante.
Gosto de temas como este, que despertam a curiosidade para enxergar além do código. É essa coceirinha no cérebro que nos move como engenheiros a buscar compreender e não apenas usar ferramentas. Pois entender como funciona é fundamental para tomadas de decisões melhores.