Imprimir dados na porta lpt1 do cliente

Por: Flávio Theruo KaminisseSaturday 12 November 2005 às 11:12 AM

1pxVou falar neste post sobre um problema que tive há algum tempo atrás, que parecia ser quase impossível de se resolver, mas com a ajuda do meu antigo chefe e amigo Rogério A. Barlotti, que me mostrou algumas funções para me ajudar, vi que era possível e consegui.

O problema era a necessidade de se imprimir recibos diretamente na porta lpt1, utilizando o browser, ou seja, não bastaria eu codificar um script PHP para imprimir na porta lpt1, pois esta impressão teria que ser no computador do cliente.

A idéia de escrever este post surgiu de uma dúvida da lista PHP Especialistas uma lista muita boa para discussões de PHP.

A solução: montei um script que grava um arquivo no computador do cliente com as informações que devem ser impressas, outro arquivo .bat que será responsável pelo comando de imprimir o arquivo criado, e depois executo este .bat que foi criado, parece complicado, mas não é não.

Existem alguns inconvenientes.

O primeiro: para este script funcionar corretamente, você tem que diminuir alguns níveis de segurança do navegador, está tudo explicado no exemplo que coloquei aqui.

O segundo: ele foi testado somente no Internet Explorer, por isso não sei se ele funcionaria em outros browsers, principalmente no Firefox.

Apesar destes inconvenientes, acho que valeu a pena escrever este post para divulgar as várias funcionalidades do JavaScript.

Espero que este script seja útil, e se este apresentar alguma falha, alguma necessidade de ajuste, ou mesmo se funcionar no Firefox, fique a vontade para escrever seus comentários.

Download do arquivo de exemplo.

Fontes:

Programming the FileSystemObject

Driving Applications

[update]

O Heliegesio me mandou um código que funciona pra SQL Server 2000, não cheguei a testar. Quem quiser pode baixar o código aqui.

Espero que possa ser útil para mais gente ainda. :-)

[/update]

Artigos relacionados:

Tags: Impressão JavaScript PHP Programação Segurança Tecnologia

22 Comentários para “Imprimir dados na porta lpt1 do cliente”

# 1° Max November 21st, 2005 às 1:24 AM GMT

Não cheguei a testar o script, mas ainda assim, gostaria de fazer uma sugestão:

Ao se fazer estas alterações ditas nas configs de segurança do IE, a máquina do cliente vai ficar vulnerável.
Algo menos arriscado seria adicionar o endereço do servidor na lista de sites confiáveis que me parece já ter como padrão a opção:

Ferramentas -> Opcoes de Internet -> Seguranca ->
Sites Confiáveis -> Nivel Personalizado -> Iniciar e executar scripts de controle ActiveX nao marcados como seguro -> [Avisar]

O que acho ainda mais adequado, pois antes de ser executado será perguntado ao cliente se ele aceita a “execução”, mas até poderia-se mudar de [Avisar] para [Ativar], se a facilidade for tão desejável.

# 2° Japs November 21st, 2005 às 1:30 PM GMT

Max,

Valeu pelas dicas.

Fiz as configurações desta maneira, pois a máquina que estava utilizando este script, não tinha nenhum acesso à Internet, somente à Intranet.

Valeu pela dica, tinha até me esquecido destes detalhes.

Muito Obrigado.

# 3° Heliegesio November 25th, 2005 às 11:19 AM GMT

Cara mas ele vai em formato de texto, como eu faço pra ele ir formatado, com fonte menor e tal..

# 4° Max November 26th, 2005 às 7:53 PM GMT

Heliegesio,
dependendo da impressora existe alguns caracteres especiais para você fazer a formatação.
Quando trabalhei com isto (em delphi), criei estas constantes pra facilitar(era uma LX300):
Draft = #27#120#0;
_12cpi = #27#77;
UnderLineOn = #27#45#1;
UnderLineOff = #27#45#0;
BoldOn = #27#69;
BoldOff = #27#70;
que eu usava assim:
writeln(LPT1,BoldOn + NomeEmpresa + BoldOff);

Ainda tenho uma tabela resumida que montei, se quiser avisa aí, que te mando.

# 5° Sandra May 19th, 2006 às 5:48 PM GMT

preciso de comandos de impressão para usar em delphi. Qaundo envio várias impressões de para a impressora matricial ela imprime a primeira com uma margem e as demais com margem menor. Se vc tiver algo que me ajude te agradeço

Sandra

# 6° Leandro Gregolin May 23rd, 2006 às 5:20 PM GMT

Olá.
Bem simples e funcional o esquema, parabéns pela dica…
Uma dúvida… como enviar os comandos ESC para a impressora? Já q todas as formas q tentei, ele na verdade imprime os comandos como se fosse string, e não os interpreta…
Exatamente da forma como vc mostrou no exemplo, como poderia mandar esses comandos? Eles entrariam no .bat? Como? Desculpe as perguntas, mas na internet já procurei pacas e não encontrei nada sobre isso, somente esses comandos enviados em delphi, c++, clipper e outros…

Valeu.

# 7° Max May 30th, 2006 às 2:45 PM GMT

Olá Sandra,
Tais comandos de impressam dependem de qual impressora que você está trabalhando (marca, modelo). Citei acima que tinha uma tabela rezumida dos comandos da Epson LX 300, porém hoje não a encontrei :-( , segue então o link para o manual:
http://www.epson.ru/resources/massmedia/%7BB5E6691C-214F-44B9-8953-330D83FD9CFB%7D/PRINTER_MATRIX_LX-300+_brochure.pdf

Dei uma olhada rápida, na seção “Using the command sumary/horizontal motion”:

ASCII Dec. Hex. Description
ESC l n 108 6C Set Left Margin (n = Left margin column)

que em delphi você usaria:
writeln(LPT1, #27#108 + NumDaColuna);

# 8° Marcel June 4th, 2006 às 5:19 PM GMT

Seria muito complicado imprimir 1 boleto dessa forma ???

Valeu!! :)

# 9° Fábio June 13th, 2006 às 9:44 AM GMT

Max
Fiquei muito intereçado nesta tabela de caracteres que você tem, será que vc pode me enviar?

# 10° Max June 16th, 2006 às 12:50 PM GMT

Marcel,
Sim, seria bem trabalhoso desenvolver um boleto desta forma.

Fábio,
como eu disse no comentário à Sandra, perdi esta tabela :-( , já faz mais de 3 anos anos que trabalhei no sistema em que a utilizei.

# 11° Germano July 3rd, 2006 às 3:37 PM GMT

Boa Tarde

Tenho uma aplicação cliente servidor em asp.net e preciso escrever um arquivo no cliente quando ele executa certa operação. Tentai implementar seu script mas não deu resultado, será que vc poderia me ajudar?

Obrigado

Germano

# 12° Ricardo Salomão August 28th, 2006 às 5:11 PM GMT

Solução inteligente pra esse caso….não testei ainda mas tenho certesa que com essa dica vou conseguir fazer o que preciso….

Valeu muito

# 13° Thiago Roberto Gaspar Pinto July 30th, 2007 às 4:43 PM GMT

Ola Japs,
Como você fez para formatar o texto, mudando seu tamanho e etc…?

# 14° Roberto Lopes September 21st, 2007 às 2:04 PM GMT

Preciso saber se existe alguma função que possa ser utilizada pelo cobol para enviar à impressora matricial(Epson) um comando para retirar todos os caracteres (‘~^,ó, á, é …) ou que permita imprimir esses caracteres corretamente.
Obrigado,
Roberto

# 15° Eduardo November 4th, 2007 às 3:33 PM GMT

Qual o conteúdo do arquivo imprime.bat?

# 16° Renan Alves May 21st, 2008 às 9:57 AM GMT

Qual o conteudo do imprime.bat?
preciso mandar comandos ESC/P para a impressora matricial.

# 17° Renan Alves May 23rd, 2008 às 10:36 AM GMT

Tinha perguntado… mas descobri!
o conteúdo do imprime.bat é criado na função javascript…
valeu!

# 18° Mauricio June 17th, 2008 às 12:28 PM GMT

Oi pessoal,

Como eu faço para, utilizando essa function, enviar os comandos ESC/P para a impressora? De todas as maneiras que eu tentei ele imprimiu os comandos como string…(#27, ESC A 1, etc…).

Alguém tem alguma dica?

Valeu!

# 19° Renan Alves August 8th, 2008 às 11:28 AM GMT

você deve transformar esses comandos em byte. Fazendo um cast: variavelByte = (byte) comandoString;

# 20° Wilton August 22nd, 2008 às 7:38 PM GMT

pra isso eu crei um objeto com no javascript :
function ImprImprimir(Linha,Coluna,Texto){
var DifeL = Linha – this.Linha ;
for (i=1;i0){
Texto = Replicate(” “,DifeC)+Texto ;
}
this.Texto = this.Texto + Texto ;
this.Coluna = this.Texto.length ;
}
function ImprFechar(){
if (this.Texto!=”"){
this.objTextFile.WriteLine(this.Texto);
}
this.Linha = 0 ;
this.Coluna = 0 ;
this.Texto = “” ;
this.objTextFile.Close();
}
function ImprAbrir(){
var ForReading = 1, ForWriting = 2, ForAppending = 8;
this.Arquivo = “c:\\”+this.Porta ;
this.objTextFile = this.objFSO.CreateTextFile(this.Arquivo, true);
}
function ImprAbrirLeitura(){
var ForReading = 1, ForWriting = 2, ForAppending = 8;
this.Arquivo = “c:\\”+this.Porta ;
this.objTextFile = this.objFSO.OpenTextFile(this.Arquivo, ForReading);
}
function ImprAjustarLC(Linha,Coluna){
this.Linha = Linha ;
this.Coluna = Coluna ;
}
function ImprEject(){
this.Linha = 0 ;
this.Coluna = 0 ;
this.Texto = this.Texto+String.fromCharCode(12) ;
}
function ImprNCOMP(){
this.Texto = this.Texto+String.fromCharCode(15) ;
}
function ImprCOMPN(){
this.Texto = this.Texto+String.fromCharCode(18) ;
}
function ImprLerTudo(){
return this.objTextFile.ReadAll() ;
}
function Impr(){
this.Linha = 0 ;
this.Coluna = 0 ;
this.Texto = “” ;
this.Porta = “LPT1″ ;
this.Arquivo = “c:\\”+this.Porta ;

this.Imprimir = ImprImprimir ;
this.Fechar = ImprFechar ;
this.Abrir = ImprAbrir ;
this.AjustarLC = ImprAjustarLC ;
this.Eject = ImprEject ;
this.LerTudo = ImprLerTudo ;
this.AbrirLeitura = ImprAbrirLeitura ;

this.NCOMP = ImprNCOMP ;
this.COMPN = ImprCOMPN ;

this.objFSO = new ActiveXObject(“Scripting.FileSystemObject”);

}

ai é so usar assim :

Imp = new Impr();
Imp.Porta = ‘LPT1′ ;
Imp.Abrir();
Imp.Imprimir(1,10,’Isso aki vai imprimir na linha 1 coluna 10′) ;
Imp.Imprimir(1,50,’Isso aki vai imprimir na linha 1 coluna 50′) ;
Imp.Imprimir(10,1,’Isso aki vai imprimir na linha 10 coluna 1′) ;
Imp.Fechar();

# 21° Marco Barreto October 2nd, 2008 às 2:02 PM GMT

Olá,
Desculpe minha igenuidade.
Trabalho com Cobol para Web e tenho minhas telas com HTML e JavaScript.
Tenho dificuldades com os relatórios em matriciais.
Eles são gerados pelo Cobol e por um mostrado nas telas em HTML, que por sua vez utilizam o IE para visualizar.
Imprimo por um “button” sendo gerenciado pelo IE.
Como posso colocar meu relatório no texto desta rotina para imprimir diretamente pela LPT1?

agradeço a ajuda.

# 22° Marco Barreto October 2nd, 2008 às 2:07 PM GMT

Corrigindo o que faltou.

Eles (relatórios) são geraddos pelo Cobol com um “form” mostrados na tela em HTML, utilizando o IE para visualizar e imprimir.

grato
Barreto

Avisos
Os ítens com asterisco ( * ) são campos de preenchimento obrigatório.
Todos os links inseridos nos comentários possuem o atributo rel="nofollow" para impedir com que user agents (como os mecanismos de busca) sigam os links inseridos para desestimular spammers.
Todos devem se identificar através de e-mail válido.
Os e-mails dos usuários não serão divulgados no site.
Comentários:
  • Sigam-me no Twitter

Sobre o Japs

Foto do autor Flávio Theruo Kaminisse O Japs é o site pessoal do Flávio T. Kaminisse, atualmente trabalha com Análise de sistemas na Webroom Soluções Interativas, é formado em Ciência da Computação pela Universidade Federal de Uberlândia, é também especialista em Banco de Dados, tendo concluído sua pós-graduação pela Unitri, gosta de mexer um pouco com Linux, é responsável pela área de TI do Charges.com.br e Webinsider, e ainda arruma um tempinho para escrever sobre tecnologia, javascript, AJAX, desenvolvimento e outros assuntos interessantes por aqui. Leia mais.

Você ainda não tem estes livros na sua biblioteca? Cuidado! Você está ficando desatualizado.

  • Sistemas de Banco de Dados - Ramez E. Elmasri, Shamkant Navathe
  • PHP: a Bíblia - Tim Converse, Joyce Park
  • MySQL: a Bíblia - Steve Suehring
  • Fundamentos do Ajax - Ryan Asleson, Nathaniel T. Schutta
  • Hackers Expostos - Stuart Mcclure, Joel Scambray, George Kurtz
  • PHP 5: Programação Poderosa - Gutmans, Bakken, Rethans
  • Não me faça pensar! - Steve Krug
  • Google Adwords a Arte da Guerra - Ricardo Vaz Monteiro
  • Sandman - Neil Gaiman
  • The Art and Science of Web Design - Jeffrey Veen
  • Ansiedade de Informação 2 - RICHARD SAUL WURMAN
  • Mobile Web Design - Cameron Moll

838 assinantes Assine o feed do Japs

Artigos por e-mail

Receba os últimos artigos do Japs no seu e-mail.


Encontre-me

O Japs recomenda

Blogs amigos:

Alguns sites e blogs que valem a pena ser visitados:

Pessoas que trabalham comigo:

Sites dos colegas de trabalho na Webroom.

Já trabalharam comigo: