Desenvolvimento - PHP

Formas de impressão via PHP

Esta semana vamos falar um pouco sobre formas de impressão via PHP. Uma alternativa pouco conhecida que pode lhe ajudar a resolver o problema de impressão na sua empresa.

por Marcelo Pereira Fonseca da Silva



Esta semana vamos falar um pouco sobre formas de impressão via PHP. Uma alternativa pouco conhecida que pode lhe ajudar a resolver o problema de impressão na sua empresa.

Surgiu há algum tempo uma dúvida que encontrei em alguns fóruns sobre como enviar dados para a impressora diretamente do PHP, e a solução proposta foi a de criação de um front-end (programa) que não seria feito em PHP, mas sim em Delphi por exemplo.

Esse programa teria a finalidade única de enviar os dados de um arquivo específico que seria usado pelo script PHP para a tal da impressora. Eu fiquei impressionado que não existiam outras opções e comecei a procurar por uma solução melhor.

Eu encontrei a seguinte parte do manual no PHP.net:

LXXXIV. Printer functions

O primeiro aviso: Essas funções estão disponíveis somente no Windows 9.x, ME, NT4 e 2000. (alguém queira por favor me explicar porque isso não é feito pra linux também)

Para habilitar as funções relacionadas à esse módulo do PHP é necessário adicionar a linha abaixo no seu arquivo php.ini:

extension=php_printer.dll

Existe ainda no php.ini a possibilidade de se escolher uma impressora padrão, dai o PHP com toda a sua inteligência, sai fazendo busca. Na função que irei falar logo mais se não for setado uma impressora ele busca a padrão configurada no arquivo php.ini.

Legal, não? Achei super interessante isso.

Vamos continuar..

Abaixo segue a lista das funções disponíveis nesse módulo de impressão do PHP.

NOTA: o spool file é um tipo de arquivo temporário que armazena os dados que são enviados para a impressora.

printer_abort -- Deleta o "spool file printer" o conteudo que estava no spool file.
printer_close -- Fecha uma conexao com a impressora que esteja aberta
printer_create_brush -- cria um novo "pincel"
printer_create_dc -- Cria um novo contexto de dispositivo
printer_create_font -- cria uma nova fonte
printer_create_pen -- cria um novo "marcador"
printer_delete_brush -- deleta o tal do "pincel" o brush..
printer_delete_dc -- deleta o contexto de dispositivo
printer_delete_font -- deleta uma fonte
printer_delete_pen -- deleta um marcador
printer_draw_bmp -- desenha um bmp
printer_draw_chord -- desenha um acorde.. n
printer_draw_elipse -- desenha uma elipse (bolinhas ? :P)
printer_draw_line -- desenha uma linha
printer_draw_pie -- desenha um pie (dicionario: pastelao)
printer_draw_rectangle -- desenha um retangulo
printer_draw_roundrect -- desenha outro retangulo só que com bordas arredondadas
printer_draw_text -- "desenha" um texto
printer_end_doc -- fecha um documento
printer_end_page -- fecha uma pagina ativa
printer_get_option -- retorna dados de configuracao da impressora
printer_list -- essa é legal.. retorna dados em array das impressoras cadastradas (muito útil)
printer_logical_fontheight -- pega uma largura de fonte especifica ou seta
printer_open -- abre uma conexao com a impressora.
printer_select_brush -- seleciona um brush
printer_select_font -- seleciona uma fonte
printer_select_pen -- seleciona um "marcador"
printer_set_option -- seta opções para configuração da impressora
printer_start_doc -- inicia um novo documento.
printer_start_page -- inicia uma nova pagina
printer_write -- e por fim.. o principal.. efetivamente escreve!

Vou dar alguns exemplos que irei retirar do site PHP.net de como usar estas funções:

<?php
$handle = printer_open("lx300"); // abre conexao com a impressora setada no caso
$handle = printer_open(); // tentaria abrir conexao com a impressora padrao no php.ini
?>

Onde $handle é necessário, pois ele é um recurso que é usado pelas outras funções para identificar a impressora.

Exemplo de enviar um texto simples para a impressora:

<?php
$handle = printer_open(); // abril conexao com a impressora padrao
printer_write($handle, "X-SQL é um menino legal"); // enviou para a impressora o texto
printer_close($handle); // fechou a conexao com a impressora
?>

Note que enviando o texto dessa forma a impressora irá imprimir no modo que ela estiver configurada com relação à fonte, margens e etc. Para trocar isso você pode usar as outras funções para configurar esses outros detalhes.

Outro exemplo:

<?php
printer_set_option($handle, PRINTER_MODE, "RAW");
// se você abrir a conexao com a sua impressora com
// a variavel $abacaxi troque o $handle por $abacaxi

// PRINTER_MODE é uma opção (constante) da função printer_set_option
// e RAW faz imprimir no tal modo condensado.
?>

Você pode obviamente criar um arquivo texto único com o conteúdo que deseja imprimir e depois passar o conteúdo desse arquivo para a função printer_write().

Quem quiser fazer testes por favor enviem comentários das suas experiências, pois é extremamente interessante para a comunidade este tipo de informação pois não há muita documentação sobre o assunto em português.

Se possível, façam testes em rede (desenvolvi um sistema de impressão) com as funções acima citadas, porém não obtive sucesso ao tentar imprimir em rede.

Ainda nos post comments do PHP.net foi falado que é possível enviar \\seu_servidor_legal\impressora por caminho, e talvez assim funcione a tal da impressão via rede.

Qualquer sugestão é muito bem-vinda. Espero que alguém que tenha algum conhecimento avançado sobre as funções acima escreva ou ainda dê continuidade neste artigo, para implementar novas idéias e exemplos.

Abraços,

Marcelo Pereira

Marcelo Pereira Fonseca da Silva

Marcelo Pereira Fonseca da Silva - Presta consultoria em desenvolvimento de aplicações em PHP e atua como desenvolvedor web em uma empresa especializada, é também um dos membros de tradução do manual do PHP e participa ativamente de melhorias para a linguagem. Trabalho também com GNU/Linux entre outras tecnologias.