DevSecOps

18 set, 2003

PHP: Impressoras

Publicidade

Olá pessoal!

Este artigo tem como finalidade descrever os passos
para utilização dos recursos do PHP para enviar
dados para impressoras (eventualmente, dentro de empresas, é
extremamente necessário).

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

Com a finalidade única e exclusivamente
de enviar os dados de um txt ou sei lá de onde para a tal
da impressora.. eu vendo aquilo fiquei com tanta raiva que quase
parei de escrever coisas em PHP (ainda bem que li o suficiente
para não fazê-lo :))

Pois pelo bosque hehe .. em busca de algo que me
fizesse enxergar que o PHP não precisava de outro aplicativo,
programa, reza, cartão de crédito enfim.. para enviar
coisas para uma impressora.

No caso, claro, isso surgiu de uma necessidade
que eu tive, precisava enviar dados para uma impressora matricial
(pra piorar, em modo condensado).

Daqui pra baixo tudo eu encontrei no PHP.net obviamente.

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, é
necessário adicionar a linha extension=php_printer.dll
no php.ini.

Existe ainda, no php.ini,
a possibilidade de se escolher (setar) uma impressora padrão.
Desta forma, o PHP sai fazendo a busca. Na função
que irei mostrar, se não for setado uma impressora, ele
busca a padrão do .ini. Legal né? Achei super interessante
isso.

Abaixo segue a lista das funções
disponíveis.

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

Indice

printer_abort — deleta
o "spool file printer" (o conteúdo que estava
no spool file).
printer_close — fecha uma conexão
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
printer_draw_elipse — desenha uma
elipse
printer_draw_line — desenha uma
linha
printer_draw_pie — desenha um gráfico
"pie"
printer_draw_rectangle — desenha
um retângulo
printer_draw_roundrect — desenha
outro retângulo, só que com bordas arredondadas
printer_draw_text — "desenha"
um texto
printer_end_doc — fecha um documento
printer_end_page — fecha uma página
ativa
printer_get_option — retorna dados
de configuração da impressora
printer_list — essa é legal —
retorna dados em array das impressoras cadastradas (muito útil)
printer_logical_fontheight — pega
uma largura de fonte específica ou seta (testar)
printer_open — abre uma conexão
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 página
printer_write — e por fim, o principal,
efetivamente esse é o cara, ESCREVE!

Bom, para o Delphi, o PHP tem algumas coisinhas também.
Quando eu descobri isso, resolvi então ir brincar no quintal
com os meus novos brinquedos. Vou dar alguns exemplos que irei
retirar do site PHP.net de como usar estas funções
para:

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

O $melancia é
necessário. Ele retorna um handle que faz com que seja
posteriormente "entendido" pelas outras funções.

Enviando um texto simples:

$handle = printer_open();
// abril conexão com a impressora padrão


printer_write($handle, "X-SQL é um menino legal");
// enviou para a impressora o texto X-SQL é um menino legal"

printer_close($handle); // fechou a conexao com a impressora

Tudo ok, já que a impressora não
faz "if" pra ver se eu sou ou nao legal 🙂

Note que, enviando desta forma, o texto vai enviar
no modo que a impressora estiver setada (fonte etc..). Para alterar,
pode ser setado o tipo de texto que você quer enviar.

exemplo:

printer_set_option($handle,
PRINTER_MODE, "RAW");
// se você abrir a conexão com a sua impressora com
a variável $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.

Se você estiver sentindo dificuldade de enviar
vários dados, ou seja, vários textos com a função
printer_write várias vezes, armazene tudo num arquivo txt,
por exemplo, e use as funções de leitura de arquivo
do PHP para ler o arquivo e colocar o conteúdo dele numa
variável.

$conteudo_legal .= $conteudo_do_arquivo_txt;
e use o $conteudo_legal para ser impresso. Isso deve resolver
seus problemas.

Quem quiser fazer testes, por favor, é 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. No caso seria um esquema assim:

Servidor –
Cliente –

O cliente tem uma impressora e quer imprimir algum
conteúdo, só que não no servidor e sim na
máquina dele. Se alguém conseguir fazer isso por
favor me avise. Ainda nos post comments do PHP.net foi falado
que é possível enviar \seu_servidor_legalimpressora
por caminho, e talvez assim funcione a tal da impressão
via rede.

Qualquer sugestão é muito bem vinda.

Abraços!