Impressão de Código de
Barras
Uma abordagem prática Argox PPLB
por Victory Fernandes e Augusto Frederico
Na Internet estão disponíveis diversos componentes para geração e impressão de Código de Barras utilizando o Delphi e impressoras Laser ou Jato de Tinta. Ao trabalharmos com diferentes impressoras, tivemos alguns problemas quanto à resolução, configuração de impressoras, impressão nas margens das etiquetas, impressão de grandes quantidades de etiquetas e etc, o que comprometia a confiabilidade do sistema.
Devido a estes e outros problemas, consideramos que a maneira mais simples, prática e profissional de se imprimir códigos de barras, é utilizando impressoras específicas para impressão de etiquetas e códigos de barras.
Neste artigo fazemos uma abordagem prática para as impressoras Argox, que utilizam linguagem de script PPLB, após este estudo, o leitor estará familiarizado com o conceito geral, e pronto para utilizar qualquer impressora do gênero.
Acessando a impressora
Caso deseje, o usuário da
impressora pode utilizar softwares prontos disponíveis para download que acompanham a impressora ou
são vendidos separadamente. Este não é o tipo de abordagem que desejamos aos nossos clientes. O ideal é que sejamos
capazes de oferecer a funcionalidade de impressão de
código de barras por dentro dos nossos programas, utilizando uma interface com
a qual o usuário já esteja familiarizado. Para isso é necessário conhecer o
formato de comunicação com a impressora.
A impressora em questão não requer nenhum tipo de driver específico para funcionar, bastando que lhe seja passada uma seqüência de comandos ASCII pela porta a qual esta conectada. Sendo assim o acesso pode ser feito até mesmo pelo MS-DOS com um comando do tipo:
COPY “MEU_ARQUIVO.TXT” LPT1 ou COPY “MEU_ARQUIVO.TXT” COM1
Onde “MEU_ARQUIVO.TXT” é um arquivo de texto comum contendo o script em PPLB que se deseja executar e deve ser enviado para a porta paralela (LPT1) ou serial (COM)
Este tipo de abordagem de comunicação facilita, e muito, a implementação, uma vez que a nossa única preocupação será conhecer os comandos, utilizando os métodos padrões do Delphi para o envio das strings.
Conhecendo a Linguagem
Os comandos em PPLB obedecem a uma sintaxe geral do tipo:
· A Comandos
· p1,p2,p3 Parâmetros
· [p1,p2,p3] Parâmetros opcionais
Apesar da impressora disponibilizar uma infinidade de comandos e opções, tais como contadores, criação e armazenamento de formulários em memória, velocidade de impressão dentre outros. Vamos abordar alguns itens principais:
· Configuração da Etiqueta
· Impressão de Textos
· Impressão de Códigos de Barras
De maneira geral a impressora trabalha com um buffer de impressão onde são armazenados os comandos recebidos, é como se a impressora montasse uma imagem virtual da etiqueta a ser impressa, dessa forma, sempre que se deseja imprimir uma etiqueta diferente, é necessário seguir um procedimento geral:
· Antes de tudo, temos que executar a limpeza do buffer de impressão - Comando N.
·
Após fixaremos
as dimensões da etiqueta bem como o seu gap (espaço entre as etiquetas). A altura e o gap, com o
Comando Q. Para a largura, utilizamos
o Comando q.
·
Com o Comando R definimos as coordenadas do ponto
inicial da impressão.
·
Após esse
processo, a impressora estará pronta para receber os comandos relativos a
montagem da nova etiqueta – Comandos A
(Texto) e B (Código de Barras).
·
Uma vez
concluída a montagem da etiqueta, com o Comando P determina-se a quantidade de impressão e
envia a autorização para imprimir.
Veremos agora a análise de cada um dos comandos citados separadamente:
Limpeza de Buffer
Antes de passarmos qualquer novo comando de impressão de etiqueta é necessário limpar o buffer de imagem da impressora através da passagem do Comando N, que não aceita nenhum parâmetro, para evitar que haja sobreposição dos conteúdos a serem impressos.
Dimensões da Etiqueta
Em seguida definiremos as dimensões da etiqueta. O comando Q é encarregado da altura e do espaço entre as etiquetas, gap. Para rolo contínuo o gap possuí valor igual a 0. Com a seguinte sintaxe:
Qp1,p2
p1 comprimento de etiqueta (em pontos*)
p2 gap
A largura é definida pelo comando q, com formato:
Qp1
p1 largura (em pontos*).
Dimensões Máximas permitidas:
|
Modelo 203 dpi |
Modelo 300 dpi |
Largura (X) |
0 a 811 pixels (101mm) |
0 a 1299 pixels (108mm) |
Comprimento(y) |
0 a 8728 pixels (1090mm) |
0 a 8728 pixels (727mm) |
Tabela 01. Dimensões Permitidas.
Caso as dimensões não sejam corretamente fixadas poderão ocorrer erros de impressão, tais como: desposicionamento de impressão, impressão de etiquetas em branco, parada na impressora, dentre outros.
* nos modelos 203 dpi, existem 8 pontos(pixels) em cada milímetro linear,
nos modelos 300 dpi, existem 12 pontos(pixels) em cada milímetro linear.
Definição dos Eixos
Devemos determinar o ponto inicial da impressão, para isso utilizamos o Comando R para a definição dos eixos X e Y respectivamente.Com sintaxe:
Rp1,p2
p1 margem horizontal (X)
p2 margem vertical(Y)
Impressão de Textos
Para impressão de textos formatados na etiqueta, utilizamos o Comando A, cuja sintaxe é mostrada abaixo:
Ap1,p2, p3,p4, p5,p6, p7, “TEXTO”
Onde,
p1 Eixo Y em pontos (Vide tabela 1).
p2 Eixo X em pontos (Vide tabela 1).
p3 Rotação
Valor |
Descrição |
0 |
Sem rotação |
1 |
Rotação de 90º |
2 |
Rotação de 180º |
3 |
Rotação de 270º |
Tabela 02. Rotação valores Permitidos.
p4 Fonte
1,2,3,4,5 Fontes residentes 1 a 5(realiza exemplo para melhores informações).
A até Z Fontes carregadas na memória.
p5 Valor de expansão horizontal do texto (1 a 24).
p6 Valor de expansão vertical do texto (1 a 24).
p7 Forma de impressão : N(normal); R(reverso).
“TEXTO” Informação a ser impressa.
Chamamos a função texto da seguinte forma:
Texto_PPLB(175, //eixo x
20, //eixo y
0, //rotação
3, //tipo fonte
10, //multiplicador horizontal,
10, //multiplicador vertical
false, //imprime reverso
Teste de impressão);
A Listagem 01 mostra o retorno do script PPLB após a chamada feita acima:
N
A175,20,0,3,10,10,N,"Teste de Impressao"
P1
Listagem 01. formatação de um texto:
Os comandos N e P, indicarão o início e o término da formatação. P também indica a quantidade de cópias.
Impressão de Código de Barras
Para impressão de códigos de barras nos mais diversos formatos, utilizamos o Comando B, cuja sintaxe é mostrada abaixo:
Bp1,p2, p3,p4, p5,p6, p7,p8, “VALOR”
Onde,
· p1 Eixo_Y (ver tabela 1)
· p2 Eixo_X (ver tabela 1)
· p3 Rotação
Valor |
Descrição |
1 |
Sem rotação |
2 |
Rotação de 90º |
3 |
Rotação de 180º |
4 |
Rotação de 270º |
Tabela 03. Rotação valores permitidos
p4 Tipo do Código de Barras
Valor |
Tipo de Código de Barras |
Dígitos |
0 |
Código 128 UCC |
Variável |
1 |
Código 128(A,B,C automático) |
Variável |
1E |
UCC/EAN |
Variável |
2 |
Intercalado 2 de 5 (ITF,125,Interleaved 2 de 5, intercalado 25 ) |
Variável |
2C |
Intercalado 2 de 5 com dígito verificador MOD10 |
Variável |
2D |
Intercalado 2 de 5 com dígito verificador humano legível |
Variável |
2G |
German Postcode |
Variável |
2M |
Matrix 2 de 5 (Matriz 25) |
Variável |
2U |
UPC intercalado 2 de 5 |
Variável |
3 |
Código 39 (código 3 de 9) |
Variável |
3C |
Código 39 com digito verificador |
Variável |
9 |
Código 93 |
Variável |
E30 |
EAN-13(EAN/JAN-13) |
Fixo |
E32 |
EAN-13 2 dígitos adicionais |
Fixo |
E35 |
EAN-13 5 dígitos adicionais |
Fixo |
E80 |
EAN-8 (EAN-JAN-8) |
Fixo |
E82 |
EAN-8 2 dígitos adicionais |
Fixo |
E85 |
EAN-8 5 dígitos adicionais |
Fixo |
K |
Codabar |
Variável |
P |
Postnet |
Fixo |
UA0 |
UPC-A |
Fixo |
UA2 |
UPC-A 2 dígitos adicionais |
Fixo |
UA5 |
UPC-A 5 dígitos adicionais |
Fixo |
UE0 |
UPC-E |
Fixo |
UE2 |
UPC-E 2 dígitos adicionais |
Fixo |
UE5 |
UPC-E 5 dígitos a adicionais |
Fixo |
Tabela 04. Tipo de Código de Barras
· p5 Espessura da barra fina(ver tabela 5).
· p6 Espessura da barra larga(ver tabela 5).
·
Tipo |
Razão |
Barra Fina x Grossa |
Código de Barra |
B2 |
1:2 a 1:3 |
Fina<Grossa |
Código 39, Codabar, Intercalado 25, Matriz 25, Postnet e German Postcode |
B3 |
2:3:4 |
Fina=Grossa 2 x Fina 3 x Fina 4 x Fina |
Código 93, código 128, EAN-8, EAN-13, UPC-A, UPC-E, UCC/EAN e Código 128 UCC |
Tabela 05. Tabela de valores de Barras
· p7 Altura do código de barras (definido pelo usuário)
· p8 Forma de impressão : N(normal); R(reverso).
· “VALOR” Informação a ser impressa em código de barras
Codigo_Barra_PPLB(20, //eixo x
20, //eixo y
0, //rotação
E80, //tipo código Barra
3, //barra fina
3, //barra larga
41, //altura barra
true, //mostra valor
0123459); //valor Código
A Listagem 02 mostra o retorno do script PPLB após a chamada feita acima:
N
B20,20,0,E80,3,3,41,B,”0123459”
P1
Listagem 02. Exemplifica a formatação de um Código de Barras:
Os comandos N e P, indicarão o início e o término da formatação. P também indica a quantidade de cópias.
Comandos Finais da Etiqueta
Após passarmos todos
dados para a etiqueta determinamos a quantidade de etiqueta a ser impressa e
comando de impressão através do Comando P,
com sintaxe:
P p1 [,p2]
p1
determina a quantidade de cópias, 1 até 65.535.
p2 quantidade de cópias de cada etiqueta, 1 até
65.535.
O Programa Exemplo
Veja na Figura 01 a tela do aplicativo demonstrativo criado:
Figura 01.Tela principal do exemplo de utilização de Impressora de Código de Barras
Este programa exemplifica a impressão de códigos de barras. Nele podemos:
· Configurar todos os parâmetros de formatação dos comandos Q, q, R, A, B, P.
· Adicionar e excluir produtos para impressão.
· Visualizar a codificação em PPLB gerada para impressão das etiquetas.
· Salvar um arquivo de script PPLB para impressão futura.
· Abrir um arquivo de script PPLB para impressão.
· Imprimir códigos de barras em qualquer impressora paralela compatível com PPLB.
Nele foram implementadas as chamadas às funções de impressão de texto e código de barras, descritas anteriomente, como mostrado:
Function Comando_N: String;
Function Comando_Q(p1,
p2: string): String;
Function Comando_q(p1:
string): String;
Function Comando_R(p1,
p2: string): String;
Function Comando_A(p1,
p2, p3, p4,P5,p6,p7,texto:string): String;
Function Comando_B(p1,p2,p3,p4,P5,p6,p7,p8,valor:
String): String;
Function Comando_P(p1,p2:
string): String;
O programa faz sucessivas chamadas a estas funções, de acordo com a quantidade de produtos contida no componente TListview e a quantidade de etiquetas por produto definida pelo usuário, para gerar o script em PPLB que é enviado para o componente TMemo.
Uma vez o script em PPLB pronto, utilizamos uma função de escrita na porta da impressora para enviar os comandos contidos no componente TMemo para a impressora instalada na porta paralela, como mostrado:
procedure DirectPrint(s: String);
var
PTBlock : TPassThroughData;
begin
PTBlock.nLen := Length(s);
StrPCopy(@PTBlock.Data, s);
Escape(printer.handle, PASSTHROUGH, 0, @PTBlock,
nil);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
//impressao do codigo de barras
if memo1.Lines.Count > 0 then
begin
Printer.BeginDoc;
DirectPrint(memo1.Lines.Text);
Printer.EndDoc;
end;
end;
A PPLB_Unit
As chamadas dos comandos da impressora demonstradas durante o artigo foram feitas utilizando a PPLB_Unit.pas, uma Unit desenvolvida em Delphi de acordo com o manual de referência da linguagem PPLB para geração de script utilizado nas impressoras de código de barras Argox.
As vantagens de utilizar a PPLB_Unit incluem:
· Completa abstração da camada de geração do script, sendo necessário apenas fazer chamadas às funções da Unit para os comandos desejados.
· Velocidade na implementação da comunicação com a impressora
· Geração de etiquetas com texto e código de barras de forma muito simples
· Facilidade na geração de código PPLB
Maiores informações sobre a PPLB_Unit podem ser obtidas no
site do produto em http://www.igara.com.br/produto.php?cod_produto=84
Conclusão
Agora que você está
familiarizado com as principais opções das impressoras, fica muito mais fácil
partir para implementações mais elaboradas, que utilizem outros recursos não
abordados neste artigo, como opções de contadores, temporizadores,
impressão de imagens e logomarcas, impressão de formulários etc...
Maiores informações
sobre impressoras de códigos de barras, bem como download de manuais podem ser
encontradas no site do fabricante em http://www.argox.com.
Maiores informações sobre a PPLB_Unit podem ser obtidas no
site do produto em http://www.igara.com.br/produto.php?cod_produto=84
Victory Fernandes é desenvolvedor sócio da TKS Software - Soluções de Automação Comercial e Softwares Dedicados. Pode ser contactado em victory@igara.com.br, ou através dos sites www.victory.hpg.com.br - www.enge.cjb.net – www.igara.com.br.
Augusto Frederico é estudante de Engenharia Mecatrônica e desenvolvedor da TKS Software - Soluções de Automação e Softwares Dedicados. Pode ser contactado em fredygbi@yahoo.com.br