Muitos programadores iniciantes têm dificuldade de entender como funciona a impressão de etiquetas de código de barras em impressoras térmicas. Neste artigo irei explicar de forma simples como desenhar e enviar comandos para a impressora. O Modelo usado neste exemplo é Zebra TLP 2844.

Primeiro passo é instalar o software ZebraDesigner, no cd-rom que acompanha a impressora. Agora é só configurar as medidas da etiqueta. Clique no menu Arquivo depois em na opção Configuração da etiqueta. Informe a largura e a altura da etiqueta, Margens, número de Linhas e número de colunas.

Agora usando as ferramentas de desenho desenho seu modelo de etiqueta, informado o Nome da Empresa, o código de barras, preço e descrição do produto.

Após desenhar a etiqueta o próximo passo é exportar a etiqueta para arquivo texto. Clique no menu Arquivo e escolha a opção imprimir. Depois marque a opção imprimir para arquivo. Informe o número de etiquetas a serem impressas, para facilitar a configuração informe 3 etiquetas. Escolha uma pasta e dê um nome para o arquivo. Pronto!

O próximo passo agora é editar o arquivo texto gerado. Substituindo o texto fixo por variáveis, neste exemplo irei substituir os textos fixos dos campos por [CODBARRAS], [DESCRICAO] e [PRECO].

Exemplo de arquivo texto gerado antes de ser editado:


Q320,019
q831
rN
S4
D7
ZT
JB
OD
R56,0
N
A105,45,2,3,1,1,N,"110,00"
A219,40,2,1,1,1,N,"A Vista R$"
A227,103,2,2,1,1,N,"CALCINHA DE RENDA"
A146,151,2,3,1,1,N,"12563"
A166,277,2,2,1,1,N,"DEVMEDIA"
B57,154,0,2,2,5,72,N,"123456"
A345,45,2,3,1,1,N,"110,00"
A459,40,2,1,1,1,N,"A Vista R$"
A467,103,2,2,1,1,N,"CALCINHA DE RENDA"
A386,151,2,3,1,1,N,"12563"
A406,277,2,2,1,1,N,"DEVMEDIA"
B297,154,0,2,2,5,72,N,"123456"

A585,45,2,3,1,1,N,"110,00"
A699,40,2,1,1,1,N,"A Vista R$"
A707,103,2,2,1,1,N,"CALCINHA DE RENDA"
A626,151,2,3,1,1,N,"12563"
A646,277,2,2,1,1,N,"DEVMEDIA"
B537,154,0,2,2,5,72,N,"123456"
P1

Arquivo depois de Editado:


// Cabeçalho da Etiqueta
Q320,019
q831
rN
S4
D7
ZT
JB
OD
R56,0
N
// Coluna 1
A105,45,2,3,1,1,N,"[PRECO]"
A219,40,2,1,1,1,N,"A Vista R$"
A227,103,2,2,1,1,N,"[DESCRICAO]"
A146,151,2,3,1,1,N,"[CODBARRAS]"
A166,277,2,2,1,1,N,"DEVMEDIA"
B57,154,0,2,2,5,72,N,"[CODBARRAS]"
// Coluna 2
A345,45,2,3,1,1,N,"[PRECO]"
A459,40,2,1,1,1,N,"A Vista R$"
A467,103,2,2,1,1,N,"[DESCRICAO]"
A386,151,2,3,1,1,N,"[CODBARRAS]"
A406,277,2,2,1,1,N,"DEVMEDIA"
B297,154,0,2,2,5,72,N,"[CODBARRAS]"
// Coluna 3
A585,45,2,3,1,1,N,"[PRECO]"
A699,40,2,1,1,1,N,"A Vista R$"
A707,103,2,2,1,1,N,"[DESCRICAO]"
A626,151,2,3,1,1,N,"[CODBARRAS]"
A646,277,2,2,1,1,N,"DEVMEDIA"
B537,154,0,2,2,5,72,N,"[CODBARRAS]"
// Rodapé da Etiqueta
P1

Observando o arquivo gerado a primeira coluna representa a posição X do campo a ser impresso, variando 240 entre uma etiqueta e outra no exemplo assima comeca com A105 e a próximo A345. Agora entendendo a lógica, fica fácil montar um algorítimo para impressão.

Agora segue abaixo um exemplo de como gerar o arquivo e enviar para impressora:


Var
  vetq;
  s,c,c1:String;
  pi,pf,i:integer;
  f:textfile;
begin
  vetq := TStringList.create;
  vetq.clear;

  // Cabeçalho da Etiqueta
  vetq.Add('Q320,019');
  vetq.Add('q831');
  vetq.Add('rN');
  vetq.Add('S4');
  vetq.Add('D7');
  vetq.Add('ZT');
  vetq.Add('JB');
  vetq.Add('OD');
  vetq.Add('R56,0');
  vetq.Add('N');

  // Coluna 1
  vetq.Add('A105,45,2,3,1,1,N,"[PRECO]"');
  vetq.Add('A219,40,2,1,1,1,N,"A Vista R$"');
  vetq.Add('A227,103,2,2,1,1,N,"[DESCRICAO]"');
  vetq.Add('A146,151,2,3,1,1,N,"[CODBARRAS]"');
  vetq.Add('A166,277,2,2,1,1,N,"DEVMEDIA"');
  vetq.Add('B57,154,0,2,2,5,72,N,"[CODBARRAS]"');

  // Coluna 2
  vetq.Add('A345,45,2,3,1,1,N,"[PRECO]"');
  vetq.Add('A459,40,2,1,1,1,N,"A Vista R$"');
  vetq.Add('A467,103,2,2,1,1,N,"[DESCRICAO]"');
  vetq.Add('A386,151,2,3,1,1,N,"[CODBARRAS]"');
  vetq.Add('A406,277,2,2,1,1,N,"DEVMEDIA"');
  vetq.Add('B297,154,0,2,2,5,72,N,"[CODBARRAS]"');

  // Coluna 3
  vetq.Add('A585,45,2,3,1,1,N,"[PRECO]"');
  vetq.Add('A699,40,2,1,1,1,N,"A Vista R$"');
  vetq.Add('A707,103,2,2,1,1,N,"[DESCRICAO]"');
  vetq.Add('A626,151,2,3,1,1,N,"[CODBARRAS]"');
  vetq.Add('A646,277,2,2,1,1,N,"DEVMEDIA"');
  vetq.Add('B537,154,0,2,2,5,72,N,"[CODBARRAS]"');
  // Rodapé da Etiqueta
  vetq.Add('P1');

  // substitui as variáveis delimitadas por [] pelo conteúdo do campo
  for i:=0 to vetq.count - 1 do 
  begin
      s := etq.strings[i];
      pi := pos('[', s);
      pf := pos(']', s);
      while pi > 0 do
      begin
         c := copy(s, pi + 1, pf - pi - 1);
         c1 := sqlProdutos.FieldByName(c).AsString;
         s  := StringReplace(s, '[' + c + ']', c1, [rfReplaceAll]);
         pi := pos('[', s);
         pf := pos(']', s);
      end;
      vetq.strings[i] := s; 
  end;

  // gera arquivo texto com o conteúdo que será enviado para a impressora
  vetq.SaveToFile('c:\etiqueta.txt');

   // criar um arquivo .bat para enviar o arquivo texto gerado para a impressora atraves da porta LPT1
   // usando o comando type do DOS
   if not FileExists('C:\PRINTLBL.BAT') then 
   begin
      AssignFile(F, 'C:\PRINTLBL.BAT');
      try
          Rewrite(F);
          Writeln(F, 'TYPE C:\ETIQUETA.TXT > LPT1');
       finally
          CloseFile(F);
       end
    end;
   
   ShellExecute(0, 'Open', PChar('C:\PRINTLBL.BAT'), nil, nil, Ord(SW_HIDE));

   // Para usar USB tem que compartilhar a impressora e enviar o arquivo para o compartilhamento
   // Ex: Type c:\etiqueta.txt > \\computador\impressora
end;