Palavra:   

Revista PHP / PHP

Bruno Lustosa

Bruno Lustosa tem 29 anos, e programa desde os 8. Conhece diversas linguagens de programação, entre elas PHP, sendo certificado pela Zend(ZCE - Zend Certified Engineer). Trabalha com redes e desenvolvimento a 9 anos, e atualmente, coordena a área de desenvolvimento da HóspedeVIP, uma central de reserva de hotéis pela Internet.

Imprimindo em formulários contínuos

Neste artigo, pretendo mostrar como imprimir qualquer tipo de conteúdo em impressoras que usam formulário contínuo. Seja nota fiscal, etiqueta, ou qualquer outra coisa, muitas vezes precisamos desenvolver uma aplicação que faça isso. O grande problema de imprimir nesse tipo de papel é saber onde a "folha" termina e começa a próxima.

A solução que eu usei pra resolver um problema de impressão de notas fiscais foi usar uma classe do PEAR chamada File_PDF, que como o próprio nome já deixa claro, serve para gerar arquivos PDF.

Como todos sabemos, o formato PDF é ideal para situações em que precisamos ter certeza de que ele sempre será impresso da mesma forma, independente da máquina onde é aberto. O problema em usar outros formatos (DOC do Word, por exemplo), é que as informações necessárias para a impressão não ficam no arquivo. Detalhes como as fontes usadas, os tamanhos, acabam dependendo de configurações de cada máquina.

Voltando ao problema, eu tinha um formulário de 10 páginas para testes, com um tamanho não muito usual, e os campos da nota fiscal que eu precisaria preencher.

Pra resolver o problema do posicionamento, não tem outro jeito, tem que medir com régua mesmo. A idéia é anotar as posições X e Y de cada campo, usando milímetros pra evitar números fracionários. O tamanho do papel tambem se mede com régua, não tem muito mistério.

Tendo o tamanho do papel e o posicionamento de cada campo, o grande truque é gerar um PDF dinamicamente, com "páginas" do tamanho da nossa nota fiscal, e depois posicionar os textos dentro dessa página.

No fim do script, teremos um PDF já todo pronto pra ser mandado para a impressora, tudo já formatado com o tamanho e posição corretas.

Segue o código, por partes.

PHP
  1. require_once 'File/PDF.php';
  2.  
  3. $pdf = File_PDF::factory(Array('orientation' => 'P',
  4. 'unit' => 'mm',
  5. 'format' => Array(206,165)
  6. ));
  7. $pdf->setFont('Courier','',10);
www.revistaphp.com.br

Até aqui, sem muitos mistérios. Incluí o arquivo da classe File_PDF, e instanciei um objeto em $pdf. A orientação do documento é P (de Portrait, ou "em pé"), a unidade que eu vou usar será milímetros, e o formato da minha folha é de 206 mm de altura por 165 mm de largura. Depois disso, eu escolho a fonte Courier 10 para o documento inteiro.

PHP
  1. foreach ($venda as $item) {
  2.  
  3. $pdf->addPage('P');
  4. $pdf->text(171,44,$item['nome_cliente']);
  5. $pdf->text(171,49,'Prest. Serv.');
  6. $pdf->text(171,57,$item['data']);
  7. ...
  8.  
  9. }
www.revistaphp.com.br

Agora, eu percorro um vetor ($venda) já criado com as informações que eu precisarei colocar na nota fiscal. Para cada entrada desse vetor, eu crio uma nova página com a mesma orientação (em pé). A partir daí, é só posicionar cada texto. Em 171 x 44, coloco o nome do cliente, em 171 x 49, a natureza da operação, em 171 x 57, a data da venda, e por aí vai.

PHP
  1. header("Content-type: application/pdf");
  2. $pdf->output('notas.pdf',false);
www.revistaphp.com.br

Para terminar, dou a saída do documento. Marco o tipo da saída para "application/pdf", e mando o objeto soltar o documento para o navegador com o nome de "notas.pdf". O segundo parâmetro é se a saída é inline ou como um arquivo para download. Passamos false para que seja como download.

Se tudo deu certo, o seu navegador vai perguntar se você quer abrir ou salvar o PDF. Se abrir em algum programa como o Adobe Reader, basta imprimir diretamente do programa, e bingo. Resolvida a questão.

Opções de Interação

Comentários

PDF em Matricial
Por: Jorge, 09/07/2010   08:45:56
Caro Bruno e Pessoal!

Criar Notas Fiscais em PDF é tranquilo, mas como o PDF é tratado como imagem nas impressoras matriciais, pode ocorrer problemas de qualidade na impressão.
O melhor é então gerar arquivos txt.
Mas minha dúvida é como alterar tamanhos de fontes no txt.

Tipo: Número da Nota em tamanho 14 e o resto da notas em tamanho 10.

Abraços.
Re: problema...
Por: Bruno, 28/05/2007   14:11:24
Fabiano,
Esse arquivo faz parte do pacote File_PDF do PEAR. O pacote pode ser baixado diretamente do site do PEAR. O endereço para download do pacote é o seguinte:
http://pear.php.net/package/File_PDF/download
Porém, uma vez tendo a base do PEAR instalada, a instlação dos pacotes fica bem facilitada usando o próprio utilitário de instalação que vem com a base.
No site do PEAR tem uma parte de documentação só sobre a instalação:
http://pear.php.net/manual/en/installation.php
problema...
Por: fabiano, 28/05/2007   13:40:43
Boa tarde...
nao consegui achar o arquivo PDF.php que vc cita no require. Pode me ajudar? e se eu comento essa linha ele nao acha a classe File_PHP Obrigado desde já.
Eu achei show
Por: Carlos, 16/05/2007   11:30:11
Como falei antes gostei bastante, vou aproveitar e colocar nome e sobre nome aparecendo nos comentários para evitar parecer as mesmas pessoas !

Abs
p/ Carlos
Por: André, 14/05/2007   13:42:00
uso PEAR no windows, pode-se usar normalmente...
Re: Só para LINUX
Por: Bruno, 08/05/2007   16:25:15
Não entendi seu comentário. O PEAR é um repositório de classes feitas em PHP, e em sua maioria são independentes de sistema operacional.
Muito provavelmente o máximo que é necessário alterar pra fazer os exemplos funcionar no Windows é o require() da classe, já que a nomenclatura dos diretórios no Windows é diferente, mas tirando isso, é tudo multi-plataforma.
[]s
Só para LINUX
Por: Carlos, 08/05/2007   16:19:19
Olá Bruno,parabéns pelos seus artigos, mas seria interessante sempre lembrar que as dicas de PEAR sugeridas por vc só estão disponíveis para quem usa LINUX. Sei que existe uma certa aversão ao WINDOWS por parte da comunidade de desenvolvedores, principalmente PHP, PITON entre outras tantas. Mas não custa lembrar que muitas delas existem por causa da MICROSOFT. Bem de qualquer forma, ou não uso LINUX, então seus exemplos me excluem.

abrasços!
Gostei bastante
Por: Carlos, 07/05/2007   10:12:06
E ai Bruno, como falei com vc, gostei bastante do artigo, vejo muita gente querendo saber sobre isso, pois impressão vindo da Web é sempre complicado.
Abs