A ideia desta forma de impressao surgiu apos ler o artigo Impressora remota via Web do Arnaldo Luiz Estevao (http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=5903) que adaptei para realidade aqui da empresa.
Por Renato Gravino Neto
Na maquina cliente
1- depois do slackware instalado e do cups instalado vamos agora configurar e ativar o cups
editar estes 2 arquivos abaixo para impressora aceitar application/octet-stream
edite o arquivo /etc/cups/mime.convs, encontre a linha abaixo e descomente (retire o # no inicio ) isto vai fazer o CUPS reconhecer comprimidos,expandidos etc... (caracteres binarios)
#application/octet-stream application/vnd.cups-raw 0 -
agora edite o arquivo /etc/cups/mime.types tambem precisamos descomentar a linha abaixo
#application/octet-stream
com as duas linhas descomentadas podemos ativar o Cups
chmod +x /etc/rc.d/rc.cups (tornando executavel)
/etc/rc.d/rc.cups start (iniciando)
agora vamos abrir o navegador e incluir a impressora http://localhost:631
1.Clique em Manage Printers
2.Add printer
(entre com usuario e senha do root)
Name: coloque epson (em minusculo)
Location: coloque /dev/lp0
Description: coloque epson (em minusculo)
3.clique em Continue
em Devices: selecione Parallel Port #1 (epson)
4.clique em Continue
Modelo de drivers Selecione o RAW
Make: RAW
5.clique em Continue
agora selecione o modelo
Model: Raw Queue (en)
6.clique em Continue
Pronto impressora adicionada com sucesso
no arquivo /etc/printcap vc vai achar o nome da impressora la
ai para conferir se esta realmente imprimindo dei o comando abaixo
lpr -P epson /etc/printcap
(vai imprimir o arquivo /etc/printcap)
OK estamos com a impressora configurada agora precisamos de construir o script que vai ler a impressao do servidor
no caso criamos em um diretorio o arquivo abaixo
no meu caso criei um diretorio so para scripts (fugindo um pouco do padrao) mas cada um coloque aonde achar melhor o arquivo abaixo, vou descrever como fiz:
no caso aqui da empresa o servidor esta no ip 192.168.1.203 entao usei este ip
mkdir /srv
cd /srv
vi imprimeserver.sh (ou use seu editor preferido) e insira o texto abaixo
#!/bin/bash
# comentario do RENATO.GRAVINO.NETO
# apos a instalacao normal VERIFICAR o /etc/cups/mime.conv e mime.type
# descomentar o application/octet-stream em ambos
while [ 1 ]
do
### Mude o ip/endereco abaixo para o local que colocou o arquivo imprimeserver.php
wget http://192.168.1.203/impressao/imprimeserver.php?lj=90 -O saida.txt -q
if [ `cat saida.txt |wc -l` -gt 0 ]
then
lpr -P epson saida.txt
sleep 3
fi
sleep 2
done
Neste arquivo acima, mude a url do wget para pegar o endereco do server que vc colocou o imprimeserver
depois mudei a permissao para execucao
chmod +x /srv/imprimecliente.sh
depois iniciei o imprimecliente
/srv/imprimecliente.sh &
(o & e para rodar em segundo plano) entao toda vez que desligar este programa nao vai estar rodando no caso eu coloquei a linha acima no /etc/rc.d/rc.local para sempre estar ativo ao ligar a maquina
Agora criando o arquivo que le as impressoes:
no caso eu criei uma tabela no postgreSQL aqui (pode usar seu DB preferido) esta tabela funciona como o chache do servidor de impressao
CREATE TABLE imprimecache (loja int, DATA timestamp,texto text);
Agora construo o arquivo no servidor para pegar a impressao na tabela e enviar para impressora
"caminho_do_servidor_apache"/impressao/imprimeserver.php
<?php
// pegando o numero da loja
$lj = $_GET['lj'];
// aqui sao lojas chave que nao podem imprimir
if ($lj == 0 or $lj > 9990){
}
// conectando com database
$conectar = "host=seu.endereco.host port=5432 dbname=seuDB user=seuUsuario password=suaSenha";
die("<H1> Falha ao acessar a base de dados</h1>");
// selecionando fila de impressao
$sql = "select codigo,texto from impressaocache where loja=$lj order by data limit 1;";
if (!$resultado){
die("<H1>Não foi possivel efetuar a consulta<h1>");
}
// sem nada na fila ;)
}
// pegando o campo necessario
// aqui que esta o macete, com este header, ele consegue enviar o chr(15), chr(14),chr(18) (etc_
header('Content-type: application/octet-stream');
// imprime o conteudo
// ejeta 1 linha ao terminar a impressao (opcional)
// deleta a impressao da fila
$sql = "delete from impressaocache where codigo = {$campos['codigo']};";
?>
O arquivo acima que e chamado pelo WGET no script ele apenas le a tabela e envia a impressao mais antiga para o wget (no formato application/octet-stream para conseguirmos expandido/comprimido
Qualquer impressao que precisar, e so gravar na tabela imprimecache que saira na maquina cliente
bem agora so falta fazer um programa que grave na tabela imprimecache que o script buscara automaticamente para a loja
<?php
$texto =
"Encontrei um ninho de mafagarfos ".
chr(15).
"com sete mafagarfinhos\r\n".
chr(18);
$texto .= "Quem os Mafagarfaram?\r\n";
$texto .=
chr(14).
"bom mafagarfizador sera \r\n".
chr(18);
// conectando com database
$conectar = "host=seu.endereco.host port=5432 dbname=seuDB user=seuUsuario password=suaSenha";
die("<H1> Falha ao acessar a base de dados</h1>");
// gravando na fila de impressao
$sql = "insert into impressaocache (loja,data,texto) values (90,now(),'$texto');";
if (!$resultado){
die("<H1>Não foi possivel enviar<h1>");
}
?>
Obrigado a Todos