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:
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.
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.
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.
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:
Inicie um novo projeto no VB e no formulário padrão insira os seguintes controles: duas caixas texto e duas etiquetas (labels) , um botão de comando e um controle Picturebox. Disponha os controles conforme o layout a seguir:
Agora insira o seguinte código ao formulário:
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 |
Gostou ??? Calma tem mais...
Veremos outro projeto interessante onde o código é gerado via código. Vamos lá:
Inicie um novo projeto no VB e no formulário padrão insira os seguintes controles: um textbox , um picturebox , três botões de opção , e dois botões de comando. Desenhe os controles no formulário como na figura abaixo:
Agora insira o seguinte código no formulário
Private Sub cmdExit_Click()
' codigo do botão Sair End End Sub
Private Sub Form_Activate() '
código do evento activate do formulário
Private Sub Text1_Change() 'codigo
do evento change da caixa de texto |
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: