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