Impressão remota usando impressora matricial

Publicado por Renato Gravino Neto em 30/04/2007

[ Hits: 13.178 ]

 


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

Sites para todas as linguagens

Como hospedar projetos no SourceForge.net

Servidor interno no PHP 5.4 para testes

Mini-CMS em português

Configurando date.timezone do PHP no Fedora 9

  

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