Imprimir arquivo Texto em USB ou LPT

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Imprimir arquivo Texto em USB ou LPT

Mensagem por sygecom »

Baseado nos exemplos já postado no forum montei um pequeno demonstrativo de como impirmir um arquivo TEXTO em qualquer impressora, o mesmo se identificar que esta mandando imprimir em uma porta LPT, já usa o modo PRINTFILERAW() deixando a impressão mais rapido que o modo grafico de impressão.

Código: Selecionar todos

FUNCTION Main(cARQTXT)
  LOCAL nPrn:=1
  LOCAL aPrn:= GetPrinters()
  SETMODE(25,80)
   CLS

  IF EMPTY(cARQTXT)
     Alert("Obrigatorio informar o arquivo")
     quit
  ENDIF
  
  IF EMPTY(aPrn)
     aOptions := { "SIM", "NAO" }
     nChoice := Alert( "ATENÇÃO !!! Não foi possivel localizar Nenhuma impressora Instalada no Windows, Deseja Instalar uma Agora ?", aOptions, , 5)

     DO CASE
     CASE nChoice == 0
         QUIT
     CASE nChoice == 1
        RunApplet_imp( "AddPrinter" )
     CASE nChoice == 2
        QUIT
     ENDCASE
  ENDIF

  DO WHILE !EMPTY(nPrn)
    CLS
    @ 0,0 SAY 'Programa de teste Classe WIN32PRN(). Escolha uma impressora. ESC' +;
              ' para sair.'
    @ 1,0 TO maxRow(),maxCol()
    nPrn:= ACHOICE(2,1,maxRow()-1,maxCol()-1,aPrn,.T.,,nPrn)

    IF !EMPTY(nPrn)
       PrnTest(aPrn[nPrn], cARQTXT )
    ENDIF
  ENDDO

  @ 22,00 say ""
RETURN(NIL)

*******************************************
Function PrnTest(cPrinterName, cFile, TAM )
*******************************************
LOCAL aPrn := GetPrinters(.t.,.f.)
Local cPrinterPort
Local cMsg := ""

IF TAM=Nil
   TAM="S"
ENDIF

for i=1 to len(aPrn)
   IF aPrn[i,1] = cPrinterName
      cPrinterPort = aPrn[i,2]
      exit
   ENDIF
next

IF cPrinterPort#Nil
   IF LEFT(UPPER(cPrinterPort),3)="LPT"
      nResult := PrintFileRaw( cPrinterName, cFile, "Impressao Pelo Sistema" )
      IF nResult = -1
         cMsg = "Parametros Invalido, Favor Tentar Novamente"
      ELSEIF nResult = -2
         cMsg = "Falha na chamada da Impressora, Favor Verificar a Impressora"
      ELSEIF nResult = -3
         cMsg = "Falha ao Iniciar Impressão, Favor Verificar a Impressora"
      ELSEIF nResult = -4
         cMsg = "Falha ao Iniciar a Primeira Pagina, Favor Verificar a Impressora"
      ELSEIF nResult = -5
         cMsg = "Falha de Memoria da Impressora, Favor Verificar a Impressora"
      ELSEIF nResult = -6
         cMsg = "Não foi Possivel localizar o arquivo de Impressão, Favor Tentar Novamente"
      ENDIF
      IF len(alltrim(cMsg)) > 1
         alert(cMsg)
         Return
      ENDIF
   ELSE
      IF TAM="S"
         IF !EMPTY(cPrinterName)
            Imprime(cFILE,136,cPrinterName)
         ENDIF
      ELSE
         IF !EMPTY(cPrinterName)
            Imprime(cFILE,80,cPrinterName)
         ENDIF
      ENDIF
   ENDIF
ENDIF
RETURN NIL

FUNCTION RunApplet_imp( cApplet ) //CONFIGURA IMPRESSORA NO WINDOWS
ShellExecute("rundll32.exe","open","shell32.dll, SHHelpShortcuts_RunDLL "+cApplet,"2")
RETURN Nil

*****************************************
Function Imprime( cArq, tamrel ,cPrinter)
*****************************************
local cTexto, nLinhas, nA, cLinha, oBMP
#ifdef __XHARBOUR__
 local oPrinter := win32prn():New(cPrinter)
#else
 local oPrinter := win_prn():New(cPrinter)
#endif
cText := memoread( cArq )
oPrinter:Landscape:= .F.
oPrinter:FormType:= 9
oprinter:SetPrintQuality(-1) // qualidade da impressão
oPrinter:Copies:= 1

IF !oPrinter:Create()
   alert("ATENÇÃO !!! Não foi possivel Iniciar a Impressão, Favor Verificar se a Impressora esta Ligada.")
   return NIL
else
   IF !oPrinter:StartDoc("Impressao Pelo Sistema SAGI")
      alert("ATENÇÃO !!! Não foi possivel Iniciar a Impressão, Favor Verificar a Impressora")
      Return NIL
   endif

   FOR TT=1 TO 2
      oPrinter:newline()
   NEXT

   IF TAMREL=80
      oPrinter:setfont('Courier New',,12,,,,255) // Normal
      nLines2 := 85
   ELSE
      oPrinter:SetFont("Courier New",13,{3,-50},0,.F.,.F.) // Comprimida
      nLines2 := 150
   ENDIF
   oPrinter:Bold(0) // Normal

   nLines := mlcount( cText, nLines2 )
   for nA := 1 to nLines
      cLine := memoline( cText, nLines2, nA, 1, .F. )

      IF Left(AllTrim( cLine ), 1 ) == Chr( 15 ) .or. Left( AllTrim(cLine), 1 ) == Chr( 18 )
         loop
      ENDIF

      If Left(AllTrim(cLine),1)==Chr(12) //SALTO DA PAGINA
         oPrinter:NewPage()
         FOR TT=1 TO 2
            oPrinter:newline()
         NEXT
      endif

      oPrinter:TextOut( cLine, .T. )
      oPrinter:Bold(0) // Normal

      if (oPrinter:MaxRow()-2 ) <= oPrinter:Prow()
         oPrinter:NewPage()
         FOR TT=1 TO 2
            oPrinter:newline()
         NEXT
      endif
   next

   oPrinter:EndDoc()
   oPrinter:Destroy()
ENDIF
RETURN NIL

#pragma BEGINDUMP
#include "windows.h"
#include "hbapi.h"

/*
 * ShellExecute( cFile, cOperation, cParams, cDir, nFlag )
 */
HB_FUNC( SHELLEXECUTE )
{
   hb_retnl( (LONG) ShellExecute( GetActiveWindow(),
              ISNIL(2) ? NULL : (LPCSTR) hb_parc(2),
              (LPCSTR) hb_parc(1),
              ISNIL(3) ? NULL : (LPCSTR) hb_parc(3),
              ISNIL(4) ? "C:\\" : (LPCSTR) hb_parc(4),
              ISNIL(5) ? 1 : hb_parni(5) ) ) ;
}
#pragma ENDDUMP
Nota: Pode ser compilado tanto com Harbour como com xHarbour. Se poder de preferencia pelo Harbour que esta evoluindo muito rapido !
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Imprimir arquivo Texto em USB ou LPT

Mensagem por Pablo César »

Antes de mais nada, gostaria de parabenizar ao colega pela iniciativa e disposição de uma compilação de idéias com a finalidade de alternar os dois modos de impressão seja pelo WIN32PRN e PRINTFILERAW. Que certamente valem muito para o apredizado em Harbour.

Só gostaria de acrescentar que a primeira instancia a lógica utilizada para diferenciar os modos e que baseia-se na porta de saída, isto é, quando for LPT utilize o PRINTFILERAW caso contrário o WIN32PRN, o que não estaria totalmente correto. Pois tem impressoras que funcionam em LPT1 e apenas imprimem em modo gráfico, acho que as LEXMARK, STYLUS que utilizam-se do driver do Windows para poder imprimir. Daí logo penso, para resover isto:

1. O próprio usuário definiria se a impressora é capaz de imprimir em modo texto, ora seja através de testes de impressão e obter a confirmação que alguns comandos foram aceitos para impressão PRINTFILERAW. Daí guardaria a informação de tal impressora é apta para imprimir em modo texto. Ou então não realizar teste algum e na hora de imprimir disponibilizar em forma de menu a opção de imprimir em modo texto ou modo gráfico, em tal impressora ou selecionar impressora. Claro que dependendo da impressora nem todas irão imprimir corretamente quando selecionado em modo texto. Mas daí o problema seria do usuário e não mais do programador.

2. Ou obter o modo de emulação ou melhor dito Modo do dispositivo da impressora seja através de alguma biblioteca externa que possa ler a BIOS da impressora. Esta idéia, inclusive mais alguém teve a mesma idéia em: http://www.bigresource.com/VB-How-to-se ... o0rDZ.html neste tema também fala-se da estrutura do DEVMODE em http://www.verypdf.com/pdfprint/devmode.htm que baseia-se em algumas fundamentações do MSDN em http://msdn.microsoft.com/en-us/library ... S.85).aspx

Quanto ao seu exemplo Leonardo, na rotina onde é testado IF EMPTY(aPrn), a opção que seria para chamar o RunApplet_imp( "AddPrinter" ) está invertido (deveria ser no nChoice == 1 e não no zero). Os alerts ficam escondidos (muito abaixo da tela) quando em modo janelado.

Mas a inciativa do Leonardo em disponiblizar um exemplo me animou um pouco mais para desenvolver em Harbour. Agradeço sua contribuição, valeu !
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Imprimir arquivo Texto em USB ou LPT

Mensagem por sygecom »

Buenas Pablo,

Olha até hoje não peguei nenhuma impressora que tenha porta LPT e que não imprima em modo RAW, mas se você esta dizendo eu acredito, nesse caso quando retornar erro em tentar imprimir em modo RAW, seria ideal reenviar em modo Grafico.

Sobre o erro no codigo, vou alterar o topico para deixar o exemplo correto. Obrigado pela observação.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Imprimir arquivo Texto em USB ou LPT

Mensagem por Pablo César »

Olha até hoje não peguei nenhuma impressora que tenha porta LPT e que não imprima em modo RAW
Não fiz testes nessas impressoras que mencionei com PRINTFILERAW do ?Harbour mas mesmo que isso seja possível os comandos ESC (comandos de formatação) que pudera ser utilizados nem todos funcionam, portanto ficaria comprometido o uso em modo texto. Mas ainda acho que o usuário pode decidir na hora como quer imprimir (modo texto ou gráfico) em tal ou tal impressora. Mas demais seu exemplo me ajudou muito a formar esse conceito. E fica aqui registrado a minha sugestão.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
wagner aragao
Usuário Nível 2
Usuário Nível 2
Mensagens: 58
Registrado em: 30 Jan 2008 02:06
Localização: PORTO VELHO-RONDÔNIA

Re: Imprimir arquivo Texto em USB ou LPT

Mensagem por wagner aragao »

Olá,

No caso acima, pode dar problema na hora de imprimir gerando um arquivo TXT pois se o relatório gerado for muito grande a função de leitura do arquivo TXT (memoread) não vai conseguir ler o arquivo, ai para contornar o problema gravo um arquivo TXT sem me preocupar com o tamanho mais na hora de ler, dou um append from ARQ.TXT sdf para dentro de um DBF e imprimo as linhas do DBF.
t+
xHarbour 1.2.3 Simplex / xDev 0.70 / LetoDB 2.15b37 / HWGUI 2.17 / xDesigner (LF Basso)
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Imprimir arquivo Texto em USB ou LPT

Mensagem por Pablo César »

Não tenho experiência em XH mas pelo que eu sei não existe limitação como no Clipper de 64K. Ao menos isto é mencionado em: viewtopic.php?f=4&t=4830&p=19715#p19715

De todas formas, é válida sua observação. Claro que a exibição em blocos mesmo através de importação para DBF é segura. Também eu faço isso.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Imprimir arquivo Texto em USB ou LPT

Mensagem por sygecom »

Já imprimi relatorios em TXT com mais de 15MB e nunca tive problemas com memoread.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
wfr123
Usuário Nível 1
Usuário Nível 1
Mensagens: 20
Registrado em: 23 Nov 2009 10:56
Localização: goiania-GO

Re: Imprimir arquivo Texto em USB ou LPT

Mensagem por wfr123 »

Ola, para todos, gostaria de tirar uma duvida.
Meu sistema era em clipper e imprimia na usb utilizando o nodosimp, agora como migrei para o xharbour quero tirar o maximo possivel de programas externos do meu sistema.
A minha estrutura é totalmente voltada para ger um arquivo em txt e mandar par ao nodosimp imprimir, agora no xharbour temos varias outras funções como a prinfileraw(), mas já tentei de varias maneiras seguindo os exemplos do forum para imprimir mas parece que não gera o relatorio ou seja ele ativa a impressora mas não vai nenhum texto: ex: printfileraw(cprinter,"arquivo.txt","arquivo de texto").
Gostaria de saber se a função imprime apenas quando tem a impressora em lpt1 conforme deixa a entender na sua mensagem ou pode imprimir em qualquer uma ?

Desde já obrigado.
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Imprimir arquivo Texto em USB ou LPT

Mensagem por gvc »

Essa função manda texto para a impressora.
O NODOSIMP manda a imagem gráfica.
Se a sua impressora não tem a tabela de caracteres residente, não vai funcionar isso.
Se vc que escapar de programas externos terá que mudar seus relatórios para usar o WIN32PRN, que é usado pelo NODOSIMP.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
wfr123
Usuário Nível 1
Usuário Nível 1
Mensagens: 20
Registrado em: 23 Nov 2009 10:56
Localização: goiania-GO

Re: Imprimir arquivo Texto em USB ou LPT

Mensagem por wfr123 »

Olha, a impressora é uma deskjet m1005 da hp, mas creio não ser este o problema, estive vendo outros topicos e respostas e encontrei uma do leonardo, onde ele afirme ter tido este problema e depois nunca mais deu, mas assim, não utilizar a win32prn porque teria que ler linha por linha e quero mandar todo o arquivo para a impressora.

Leonardo lembra deste problema, como encontrou a solução?
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Re: Imprimir arquivo Texto em USB ou LPT

Mensagem por lugab »

Pra mim ta ótimo, Sygecon...

Parabéns pelo compartilhamento dos benefícios de um custo que foi só seu...

Gabriel
lugab
wfr123
Usuário Nível 1
Usuário Nível 1
Mensagens: 20
Registrado em: 23 Nov 2009 10:56
Localização: goiania-GO

Re: Imprimir arquivo Texto em USB ou LPT

Mensagem por wfr123 »

Certo, amigo então de uma força ai, poste o codigo para a gente testar.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Imprimir arquivo Texto em USB ou LPT

Mensagem por sygecom »

Olá wfr123,
O Codigo fonte está bem acima nos primeiros post:
viewtopic.php?f=43&t=9472&p=53675&hilit=PrintFileRaw#p53675
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Imprimir arquivo Texto em USB ou LPT

Mensagem por Nascimento »

Amigo sygecom procurando achei esse codigo justamente o que eu precisava mais nao estou conseguindo compilar pois da erro na funçao shellexecute()
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Imprimir arquivo Texto em USB ou LPT

Mensagem por Nascimento »

nao expliquei bem , tentei compilar usando harbour 3.2

a rotina que preciso é

1º verifica as impressoras instaladas

se achar so uma ou usb ou lpt1 ela imprime na que achar
se achar 2 impressoras instaladas ai o programa pergunta em qual deseja imprimir

a sao arquivos.prn
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Responder