Impressão remota via WEB
Para quem tem um aplicativo rodando em um servidor Apache, escrito em CGI/perl ou PHP, e deseja imprimir em uma impressora matricial remota de nota fiscal por exemplo, a solução que desenvolvi pode ser usada tanto em Linux quanto em Windows e é totalmente livre.
Servidor de impressão
Faça isso no servidor web.
É importante considerar que a máquina cliente não precisa manter nenhuma porta aberta, enquanto que o servidor mantém escutando a porta 80, que normalmente já esta aberta e sendo ouvida pelo Apache. O sistema é capaz de atravessar firewalls e roteadores sem necessidade de estabelecer uma conexão ponto a ponto, assim eu posso colocar o servidor de impressão remota em qualquer máquina de uma sub-rede local atrás de um roteador de ADSL ou em IP fixo doméstico por exemplo.
Slackware 11.0:
1. Criando os diretórios necessários:
# mkdir /var/spool/webpserver
# chown nobody.nobody /var/spool/webpserver
Agora crie o arquivo webpserver.cgi no diretório /var/www/cgi-bin:
# vim /var/www/cgi-bin/webpserver.cgi
É importante considerar que a máquina cliente não precisa manter nenhuma porta aberta, enquanto que o servidor mantém escutando a porta 80, que normalmente já esta aberta e sendo ouvida pelo Apache. O sistema é capaz de atravessar firewalls e roteadores sem necessidade de estabelecer uma conexão ponto a ponto, assim eu posso colocar o servidor de impressão remota em qualquer máquina de uma sub-rede local atrás de um roteador de ADSL ou em IP fixo doméstico por exemplo.
Slackware 11.0:
1. Criando os diretórios necessários:
# mkdir /var/spool/webpserver
# chown nobody.nobody /var/spool/webpserver
Agora crie o arquivo webpserver.cgi no diretório /var/www/cgi-bin:
# vim /var/www/cgi-bin/webpserver.cgi
#!/usr/bin/perl
use CGI qw/:standard/;
print header;
$fila=param('fila');
$nfiles = 0 ;
$t0 = time ;
while ( ( $nfiles == 0 ) and (time - $t0 < 30) and time >= $t0 ) {
@files = </var/spoll/webpserver/$fila/*> ;
$nfiles = $#files + 1 ;
sleep 1 ;
}
while (</var/spoll/webpserver/$fila/*>){
$file = $_;
$txt=`cat $file`;
print $txt ;
system("rm $file") ;
}
use CGI qw/:standard/;
print header;
$fila=param('fila');
$nfiles = 0 ;
$t0 = time ;
while ( ( $nfiles == 0 ) and (time - $t0 < 30) and time >= $t0 ) {
@files = </var/spoll/webpserver/$fila/*> ;
$nfiles = $#files + 1 ;
sleep 1 ;
}
while (</var/spoll/webpserver/$fila/*>){
$file = $_;
$txt=`cat $file`;
print $txt ;
system("rm $file") ;
}
No nosso exemplo vamos usar uma fila chamada notafiscal:
# mkdir /var/spool/webpserver/notafiscal
# chown nobody.nobody /var/spool/webpserver/notafiscal
Para imprimir um arquivo basta copiar para dentro da fila. Ex.:
# cp /etc/meuarquivo /var/spool/webpserver/notafiscal
Isso pode ser feito de dentro do PHP ou do script CGI gerando o arquivo com o conteúdo a ser impresso e depois copiando para o diretório da fila correspondente.
OBS: Como existe tanto o Apache como Perl para Windows, este esquema pode ser aplicado tanto em um servidor baseado em Linux como em Windows, entretanto não tenho nenhuma máquina servidora com Windows, não tenho como calcular as alterações necessárias no script webpserver.cgi, que provavelmente deverá ser somente a substituição da barra / pela barra \ com a inclusão de C: na frente.
# mkdir /var/spool/webpserver/notafiscal
# chown nobody.nobody /var/spool/webpserver/notafiscal
Para imprimir um arquivo basta copiar para dentro da fila. Ex.:
# cp /etc/meuarquivo /var/spool/webpserver/notafiscal
Isso pode ser feito de dentro do PHP ou do script CGI gerando o arquivo com o conteúdo a ser impresso e depois copiando para o diretório da fila correspondente.
OBS: Como existe tanto o Apache como Perl para Windows, este esquema pode ser aplicado tanto em um servidor baseado em Linux como em Windows, entretanto não tenho nenhuma máquina servidora com Windows, não tenho como calcular as alterações necessárias no script webpserver.cgi, que provavelmente deverá ser somente a substituição da barra / pela barra \ com a inclusão de C: na frente.
Interessante o script.
Vou dar a minha pequena contribuição:
A penúltima linha do script Perl não roda no windows
system("rm $file") ;
Pois faz uma chamada a um comando de sistema para remover o arquivo, sendo que no windows não existe o comando 'rm', no mesmo o comando seria 'del'.
Essa foi a linha que vi de imediato, além das que você já citou.
Abraços,
Poleto