Código de Barras - Conceitos Básicos e Utilização no VB


Vou deixar bem claro uma coisa antes de iniciar o artigo: devido a complexidade e extensão do assunto nosso objetivo principal será abordar os conceitos básicos e dar um orientação básica para que cada um , na medida de sua necessidade saiba onde procurar as informações. Para aplicações comerciais existem muitas soluções ,e , cada caso é um caso particular.

Para imprimir códigos de barras no Visual Basic e no Crystal Reports usaremos fontes específicas para este propósito , talvez essa não seja a solução para o seu problema , mas que fique bem claro que para uso comercial um componente de terceiros quase sempre é a melhor opção.

Por questão de espaço estarei disponibilizando somente parte das fontes usadas. Todas as fontes e manuais de referência para código de barras estão presente no Super DVD Visual Basic.

Conceitos Básicos

Para  compreender como as informações são codificadas em código de barra é fundamental que  se tenha os seguintes conceitos. Vejamos os principais:

Barra -   Consiste na parte escura do código(normalmente preta), ela absorve a luz e codifica um  em cada modulo de barra .

Espaço -   Consiste na parte clara do código (geralmente o fundo que o código é impresso) , ele reflete a luz e cada modulo é codificado como zero.

Caractere - Cada numero ou letra codificado com barra e espaço. Cada caractere pode ser modificado por tantos “1” ou “0” quantos forem os módulos contidos na sua codificação.

Caractere inicial  final - Indicam ao leitor de código o respectivamente o inicio e o fim do código estes caractere pode ser representado por uma letra ,um numero ou um outro símbolo dependendo do padrão do código em questão.

Separadores - Os separadores serve para indicar as extremidade do código e indicar ao leitor o sentido que o código esta sendo lido. Este separadores serve também para permitir que o código  seja lido nos dois sentidos.

     
   
 

Zonas mudas - Também conhecida como Quites Zones, são nada mais que margens antes do caractere inicial e depois do caractere final formadas por espaços. Elas são extremamente importantes para o reconhecimento do código pôr parte do leitor, e se forem excluídas poderão impossibilitar a interpretação do código de barra, gerando assim, uma leitura nula.

Sinais de enquadramento - Delimitam uma área retangular da qual deve estar contidos todos os elementos de código e somente ele.

Densidade do código de barra - É caracterizada pela relação entre a quantidade de módulos ou caracteres e o espaço ocupado pelos mesmo uma vez impressos.

Modulo - O modulo consiste no elemento mais estreito do código, seja ele uma barra ou espaço. Os separadores, as zonas mudas, os caracteres especiais, ou  seja, todos os elementos que compõem o código de barra são múltiplos do modulo quanto a largura. Isto posto, podemos dizer que o modulo é a unidade mínima e básica componente do código de barra cujo tamanho e definido diretamente pela densidade do código.

Flag - Ele é empregado no sistema EAN no inicio do código para indica o país de origem do produto. Já no UPC ele também situa no inicio do código mas ele indica o tipo de produto.

Dígito verificador -  utilizado para detectar erros durante a varredura, evitando assim a leitura errônea, e também adulterações, ele é constituído pôr um elemento incluído no código que é calculado a parir de um algoritmo que emprega os demais números do código.

 

 Como os dados são codificados em barras

       Pôr uma mera convenção, identificaremos o digito  zero como uma seqüência de cinco barras :barra estreita, barra estreita, barra larga, barra larga e barra estreita, espaçadas por espaços em branco. Assim, o digito 0 codificado ficaria dessa maneira:

 

 

 Os digito de 0 - 9 ficaria :                                     

        

                 

 O número 1998 ficaria :

          

COMO OS CÓDIGOS DE BARRAS SÃO LIDOS

      Para compreender como os códigos de barra são lidos deve-se primeiro entender dois conceitos : leitura e codificação.

Leitura

      Um dispositivo de leitura de código de barra ele transforma os dados codificado em barras em sinais elétricos de duração proporcionais as barras. Vejamos melhor isto observando o funcionamento de uma caneta ótica.

      A caneta ótica e um dispositivo leitor de código de barra que tem em sua ponta um emissor de luz normalmente vermelha e um sensor para receber a reflexão dessa luz (ou não).Assim se a caneta ótica for colocada em uma superfície branca , a luz emitida vai refletir na superfície e o sensor vai captar essa reflexão e gerara um sinal elétrico que corresponde a superfície branca. De maneira oposta , se a caneta for posicionada em cima da superfície escura, normalmente preta, a luz emitida da caneta será absorvida

e o sensor não recebera nenhum reflexo, e o sensor ira gerar um sinal elétrico correspondente a cor preta. Se a caneta for passada sobre uma etiqueta de código de barra com velocidade constante , a caneta irá gerar uma seqüência de sinais elétricos conforme a mesma vai passando pelas barras (largas e finas) pretas e espaços em branco.

     Através da luz refletida pelos módulos que compõem  os espaço, ou pela sua ausência na barras, o leitor interpreta o código. A interpretação acontece através do uso de um conversor analógico/ digital que transforma os sinais elétricos  analógico produzido pela luz recebida pôr meio de um sensor fotoelétrico, em um sinal digital (sucessão de 0 e 1 em forma de pulso) e que na ausência da luz refletida gera um outro sinal digital que caracteriza a barra, assim, cada caractere do código é interpretado como um numero binário, onde cada modulo reproduz um digito 0 ( reflexão da luz pelo código, ou seja , espaço no código ), ou um digito 1 (absorção da luz pelo código, ou seja, barra no código). Observe a figura abaixo:  

Decodificação

         Decodificar um código de barra é transformar os sinais elétricos de um dispositivo leitor de código de barra em um caractere correspondente de acordo com o padrão do código utilizado. Assim, no exemplo anterior , a decodificação do código lido se daria da seguinte maneira: o decodificador obtém as informações : barra estreita, barra estreita, barra larga, barra larga e barra estreita, e utilizando-se a tabela de codificação do código 25, pôr exemplo, obtém como caractere lido o digito 0 .

        Após  uma etiqueta ser lida e de codificada, o resultado pode ser transferido para o equipamento de (PDV, microcomputador, etc.) de diversas maneiras tais como : via teclado, via interface RS-232C (serial) ou outra interface especifica tais como placas particulares ou interface joystick, por exemplo.

Códigos de barras mais utilizados no Brasil

A seguir os principais códigos de barras usados no país :

25 Intercalado - Utilizado quando se desejam imprimir apenas dígitos numéricos, é muito utilizado em aplicações comerciais.

39 - Utilizado quando se desejam imprimir caracteres alfa-numéricos;  muito utilizado em aplicações industriais.

39 com dígito de verificação - Utilizado quando se deseja obter mais segurança na leitura dos códigos, pois possui dígito de controle.

EAN-13 - Padrão adotado pela ABAC (EAN Brasil) para codificação de produtos em supermercados, permite a codificação de até 13 dígitos numéricos.

EAN-8 - Versão simplificada do padrão EAN-13, para aplicação em produtos onde a etiqueta no padrão EAN-13 fique muito grande. Este padrão permite a codificação de até 8 dígitos numéricos.

O código de barras usado pelo setor financeiro

Orientação - Ceneaban - Centro Nacional de Estudos da Arrecadação Bancária

O Código de Barras que usado no setor financeiro (Bancos) é do tipo “2 de 5 intercalado”.

“2 de 5” - significa que 5 barras definem 1 caracter, sendo que duas delas são barras largas;

“Intercalado” - significa que os espaços entre as barras também tem significado, de maneira análoga as barras;

Este tipo de código de barras trabalha somente com caracteres numéricos.

 a) O tamanho do campo do Código de Barras é de 46 posições, sendo 44 para conteúdo dos dados mais 2 Bit’s, 1 de Start e outro de Stop. (Favor verificar documentação mais recente)

 b) O Código de Barras deve estar no verso e preferencialmente também no anverso do documento, sendo que no verso deverá estar na parte inferior (centro) e no anverso na parte superior direita, sendo com 12 mm do centro do Código de Barras, até a borda do papel, e com 5 mm, no início antes do start e 5 mm no mínimo, após o stop de espaço em branco.

 c) Para garantir a integridade de leitura do Código de Barras, deverá ser impresso nas partes, superior e inferior do código, um traço horizontal  imediatamente após o campo, com a representação numérica, dentro de boxes, abaixo do código, se impresso na parte superior do documento e com a representação numérica, dentro de boxes, sobre o código, se impresso na parte inferior  do documento. Sugerimos inclusão de mensagem nos documentos de arrecadação para que os clientes evitem amassar, dobrar ou perfurar as contas, para não danificar o código de barras.

 d) Deverá haver uma representação numérica do conteúdo, logo acima do Código de Barras, ela deverá estar distribuída em campos de 11 posições dentro de boxes, acrescido de 1 dígito verificador, módulo-10, a cada grupo (vide página 10), isto permitirá a digitação dos campos, no caso de rejeição pela leitura de Código de Barras.

Os dígitos verificadores não estarão representados no Código de Barras.

 e)  Identificação da Empresa/Órgão

As posições 16 à 19 do Código de Barras, são destinadas a identificação da Empresa/Órgão, sendo que, através desta informação, o banco identificará a quem repassar as informações e o crédito.

O órgão responsável pela distribuição e controle desta numeração, será a Febraban (relação de Empresas/Órgãos já cadastradas).

 f) Data  de Vencimento

No caso de ser utilizada a data de vencimento (AAAAMMDD), incluir nas 8 primeiras posições do campo livre.

Gerando código de barras no VB

Finalmente chegamos a parte mais interessante , a parte prática. Vamos gerar no Visual Basic códigos de  barras. Como exemplo iremos gerar o código de barras 39 ( 3 por 9) . Neste tipo de código de barras podemos codificar caracteres alfanuméricos. Ele suporta codificar 26 letras maiúsculas , 10 dígitos e 7 caracteres especiais. 

Cada caráter é comporto por 5 barras e 4 espaços sendo que cada barra ou espaço pode ser largo ou estreito e 3 dos nove elementos são sempre largos.

Para gerar o código vamos usar fontes True Type , você deve baixar as fontes no fim deste artigo e descompactá-la no diretório \windows\fonts . Feito isto a coisa é muito fácil de fazer. Basta usa a fonte C39HrP36DlTt com o objeto Printer. No nosso exemplo vamos permitir somente a visualização para mostrar o código gerado. Vamos ao projeto:

Private Sub Command1_Click() ' codigo do evento click do botão de comando

    PrintRoutine pic_codbar

End Sub

Private Sub PrintRoutine(objPrint As Object)  ' rotina que gera e visualiza o codigo de barras

  objPrint.Cls
  objPrint.FontName = Text1.Text   ' nome da fonte usada
  objPrint.FontSize = 36                ' tamanho da fonte usada
  objPrint.CurrentX = 1.3               ' posiciona 
  objPrint.CurrentY = 0.3
  objPrint.Print Text2.Text             ' imprime no picturebox  codigo gerado
  Command1.Enabled = False

End Sub

Private Sub Text2_Change()  ' habilita o botão de comando
    Command1.Enabled = True
End Sub

Gostou ??? Calma tem mais...

Veremos outro projeto interessante onde o código é gerado via código. Vamos lá:

Private Sub cmdExit_Click()  ' codigo do botão Sair
   End
End Sub


Private Sub cmdPrint_Click()  'codigo do botão imprimir

Printer.PaintPicture Picture1, 5000, 5000
Printer.EndDoc

End Sub

Private Sub Form_Activate()  ' código do evento activate do formulário
  optSize(1) = 1
End Sub


Private Sub optSize_Click(Index As Integer)  ' codigo dos botões de opções
Picture1.ScaleMode = 3

Select Case Index
  Case 0
      Picture1.Height = Picture1.Height * (1.4 * 40 / Picture1.ScaleHeight)
      Picture1.FontSize = 8
  Case 1
      Picture1.Height = Picture1.Height * (2.4 * 40 / Picture1.ScaleHeight)
      Picture1.FontSize = 10
  Case 2
      Picture1.Height = Picture1.Height * (3 * 40 / Picture1.ScaleHeight)
      Picture1.FontSize = 14
End Select


Call Text1_Change

End Sub

Private Sub Text1_Change()  'codigo do evento change da caixa de texto 

Call DrawBarcode(Text1, Picture1)

  MinWidth = 2 * Text1.Left + Text1.Width
  pw = 2 * Picture1.Left + Picture1.Width
  fw = MinWidth
  If pw > fw Then fw = pw
  Form1.Width = fw

End Sub

Sub DrawBarcode(ByVal bc_string As String, obj As Control)

Dim xpos!, y1!, y2!, dw%, th!, tw, new_string$

'define os padroes do codigo
Dim bc(90) As String
bc(1) = "1 1221"
bc(2) = "1 1221"
bc(48) = "11 221" 'digitos
bc(49) = "21 112"
bc(50) = "12 112"
bc(51) = "22 111"
bc(52) = "11 212"
bc(53) = "21 211"
bc(54) = "12 211"
bc(55) = "11 122"
bc(56) = "21 121"
bc(57) = "12 121"
'letras maiusculas
bc(65) = "211 12" 'A
bc(66) = "121 12" 'B
bc(67) = "221 11" 'C
bc(68) = "112 12" 'D
bc(69) = "212 11" 'E
bc(70) = "122 11" 'F
bc(71) = "111 22" 'G
bc(72) = "211 21" 'H
bc(73) = "121 21" 'I
bc(74) = "112 21" 'J
bc(75) = "2111 2" 'K
bc(76) = "1211 2" 'L
bc(77) = "2211 1" 'M
bc(78) = "1121 2" 'N
bc(79) = "2121 1" 'O
bc(80) = "1221 1" 'P
bc(81) = "1112 2" 'Q
bc(82) = "2112 1" 'R
bc(83) = "1212 1" 'S
bc(84) = "1122 1" 'T
bc(85) = "2 1112" 'U
bc(86) = "1 2112" 'V
bc(87) = "2 2111" 'W
bc(88) = "1 1212" 'X
bc(89) = "2 1211" 'Y
bc(90) = "1 2211" 'Z
'Misc
bc(32) = "1 2121" 'espaco
bc(35) = "" '#
bc(36) = "1 1 1 11" '$
bc(37) = "11 1 1 1" '%
bc(43) = "1 11 1 1" '+
bc(45) = "1 1122" '-
bc(47) = "1 1 11 1" '/
bc(46) = "2 1121" '.
bc(64) = "" '@
bc(65) = "1 1221" '*



bc_string = UCase(bc_string)


'dimensoes
 obj.ScaleMode = 3 'pixels
 obj.Cls
 obj.Picture = Nothing
 dw = CInt(obj.ScaleHeight / 40) 'espaco entre as barras
If dw < 1 Then dw = 1
  'Debug.Print dw
  th = obj.TextHeight(bc_string)    'altura do texto
  tw = obj.TextWidth(bc_string)    ' largura do texto
  new_string = Chr$(1) & bc_string & Chr$(2) 

y1 = obj.ScaleTop
y2 = obj.ScaleTop + obj.ScaleHeight - 1.5 * th
obj.Width = 1.1 * Len(new_string) * (15 * dw) * obj.Width / obj.ScaleWidth


'desenha cada caractere na string do codigo de barras
xpos = obj.ScaleLeft
For n = 1 To Len(new_string)
c = Asc(Mid$(new_string, n, 1))
If c > 90 Then c = 0
bc_pattern$ = bc(c)

'desenha cada barra
For i = 1 To Len(bc_pattern$)
 Select Case Mid$(bc_pattern$, i, 1)
 Case " "
 'espaco
 obj.Line (xpos, y1)-(xpos + 1 * dw, y2), &HFFFFFF, BF
 xpos = xpos + dw

Case "1"
  'espaco
  obj.Line (xpos, y1)-(xpos + 1 * dw, y2), &HFFFFFF, BF
  xpos = xpos + dw
  ' linha
  obj.Line (xpos, y1)-(xpos + 1 * dw, y2), &H0&, BF
  xpos = xpos + dw

Case "2"
  'espaco
  obj.Line (xpos, y1)-(xpos + 1 * dw, y2), &HFFFFFF, BF
  xpos = xpos + dw
  'linha larga
  obj.Line (xpos, y1)-(xpos + 2 * dw, y2), &H0&, BF
  xpos = xpos + 2 * dw
End Select
Next
Next

'1 mais espaco
obj.Line (xpos, y1)-(xpos + 1 * dw, y2), &HFFFFFF, BF
xpos = xpos + dw

'tamanho final e texto
obj.Width = (xpos + dw) * obj.Width / obj.ScaleWidth
obj.CurrentX = (obj.ScaleWidth - tw) / 2
obj.CurrentY = y2 + 0.25 * th
obj.Print bc_string

'copia para o clipboard
obj.Picture = obj.Image
Clipboard.Clear
Clipboard.SetData obj.Image, 2

End Sub

 

Veja também como gerar código de barras a partir da linha digitável sem componente algum: Gerar Código de Barras Sem componentes(a partir da Linha digitável)

Curiosidades :

Se tiver tempo e paciência dê uma espiada nos links abaixo :

http://www.milk.com/barcode/   - calcula o digito de controle de código de barras

http://www.marcadabesta.hpg.com.br/codigo_de_barra.htm - a marca da besta - 666 e o código de barras.

http://www.eanbrasil.org.br/d02_tecn/barcode_pg2.html - padrão EAN - 13

 Gostou ???? tem mais... Aguarde... (Os códigos completos estão no Super DVD VB) 

Referências:


José Carlos Macoratti