Impressão remota usando impressora matricial

Publicado por Renato Gravino Neto em 30/04/2007

[ Hits: 13.311 ]

 


Impressão remota usando impressora matricial



Esta dica tem como objetivo ensinar a configurar a impressora matricial remota via web, é um complemento do artigo "Impressora remota via Web" citado mais abaixo, desta forma, o usuário consegue imprimir caracteres comprimidos e expandidos.

A idéia desta forma de impressão surgiu após ler o artigo Impressora remota via Web do Arnaldo Luiz Estevão que adaptei para realidade aqui da empresa. A idéia é do Arnaldo, apenas adaptei.

Na máquina cliente


Depois do Slackware instalado e do CUPS instalado vamos agora configurar e ativar o CUPS.

Edite os arquivos /etc/cups/mime.convs e /etc/ups/mime.types para a impressora aceitar application/octet-stream:

Em /etc/cups/mime.convs, encontre a linha abaixo e descomente (retire o # do início). Isto vai fazer o CUPS reconhecer comprimidos, expandidos etc (caracteres binários).

#application/octet-stream application/vnd.cups-raw 0 -

Agora edite o arquivo /etc/cups/mime.types. Nele, também precisaremos descomentar a linha abaixo:

#application/octet-stream

Com as duas linhas descomentadas podemos ativar o CUPS:

# chmod +x /etc/rc.d/rc.cups (tornando executável)
# /etc/rc.d/rc.cups start (iniciando)

Agora vamos abrir o navegador e incluir a impressora.

http://localhost:631
  • Clique em Manage Printers;
  • Add printer (entre com usuario e senha do root);
    • Name: coloque epson (em minúsculo);
    • Location: coloque /dev/lp0;
    • Description: coloque epson (em minúsculo);

  • Clique em Continue;
    • Devices: selecione Parallel Port #1 (epson);
    • Clique em Continue;
    • Modelo de drivers: selecione o RAW;
    • Make: RAW;

  • Clique em Continue. Agora selecione o modelo;
    • Model: Raw Queue (en);

  • Clique em Continue.

Pronto, impressora adicionada com sucesso. No arquivo /etc/printcap você vai achar o nome da impressora.

Depois, para conferir se está realmente imprimindo, dê o comando abaixo:

$ lpr -P epson /etc/printcap (vai imprimir o arquivo /etc/printcap)

Ok, estamos com a impressora configurada, agora precisamos construir o script que fará a leitura da impressão do servidor. Neste caso, criaremos em um diretório o arquivo abaixo. No meu caso criei um diretório só para scripts (fugindo um pouco do padrão) mas cada um coloque onde achar melhor o arquivo abaixo, vou descrever como fiz:

No caso aqui da empresa o servidor está no IP 192.168.1.203, então usei ele.

# 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
  
    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

No arquivo acima, mude a URL do wget para pegar o endereço do servidor que você colocou o imprimeserver.

Depois mude a permissão para execução:

# chmod +x /srv/imprimecliente.sh

Em seguida inicie o cliente:

# /srv/imprimecliente.sh & (o & e para rodar em segundo plano)

Toda vez que desligar este programa não estará rodando. No meu caso, coloquei a linha acima no /etc/rc.d/rc.local para sempre estar ativo ao ligar a máquina.

Agora criando o arquivo fará a leitura das impressões. No meu caso, criei uma tabela no PostgreSQL (pode usar seu DB preferido). Esta tabela funciona como o cache do servidor de impressão.

> CREATE TABLE imprimecache (loja int, data timestamp, texto text);

Agora construa o arquivo no servidor para pegar a impressão 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){
                exit;
        }
        // conectando com database
        $conectar = "host=seu.endereco.host port=5432 dbname=seuDB user=seuUsuario password=suaSenha";
        $conn = pg_connect($conectar) or
                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;";
        $resultado = pg_query($conn,$sql);
        
        if (!$resultado){
                pg_close($conn);
                die("<H1>Não foi possivel efetuar a consulta<h1>");
        }
        // sem nada na fila ;)
        if(pg_num_rows($resultado)==0){
                pg_free_result($resultado);
                pg_close($conn);
                exit;
        }
        // pegando o campo necessario
        $campos = pg_fetch_array($resultado,0);

        // 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
        print $campos['texto'];
        // ejeta 1 linha ao terminar a impressao (opcional)
        print "\r\n";
        
        pg_free_result($resultado);
        // deleta a impressao da fila
        $sql = "delete from impressaocache where codigo = {$campos['codigo']};";
        $resultado = pg_query($conn,$sql);

        pg_free_result($resultado);
        pg_close($conn);
        
?>

O arquivo acima que é chamado pelo wget no script apenas faz a leitura da tabela e envia a impressão mais antiga para o wget (no formato application/octet-stream para conseguirmos expandido/comprimido). Qualquer impressão que precisar, é só gravar na tabela imprimecache que sairá na máquina cliente.

Bem, agora só falta fazer um programa que grave na tabela imprimecache que o script buscará 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";
        $conn = pg_connect($conectar) or
                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');";
        $resultado = pg_query($conn,$sql);
        
        if (!$resultado){
                pg_close($conn);
                die("<H1>Não foi possivel enviar<h1>");
        }
        pg_free_result($resultado);
        pg_close($conn);
?>

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Encontrando dias em um intervalo de datas em PHP

Site com bons recursos para Joomla

Três novos módulos para Joomla 1.5

Bug do PHP

Quebra de linha no PHP

  

Comentários
[1] Comentário enviado por leoberbert em 01/05/2007 - 00:41h

Fala ai Renatim.. excelente dica e espero q essa possa ser o começo de tantas outras que vc tem a mostrar aki na comunidade abração!!!!

[2] Comentário enviado por nocturnu em 09/05/2007 - 14:30h

Grande Renato!!! Otima dica
voce conseguiu expressar com simplicidade e clareza!!!
muito bom!!!



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts