Comando de impressão de arquivo.

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

Comando de impressão de arquivo.

Mensagem por rbonotto »

Bom dia pessoal, estou migrando clipper->harbour, e estou com uma duvida bem basica sobre imprimir o conteudo de um arquivo.

No clipper usava o comando run type xxx.xxx >prn, mas no harbour não esta funcionando ( nem dando erro, passa batido )
Qual seria o equivalente em harbour ?

- impressora esta na LPT1
- WinXP e Win7

abraços,
mixsistemas@gmail.com
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

Comando de impressão de arquivo.

Mensagem por Imatech »


Win_PrintFileRaw( 'LPT1', c_Arquivo_para_Impressao, 'Impressão: PrintFileRaw' )
M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

Comando de impressão de arquivo.

Mensagem por rbonotto »

Obrigado, funcionou perfeitamente ! :D

Este comando imprimiria em USB ?
mixsistemas@gmail.com
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

Comando de impressão de arquivo.

Mensagem por Imatech »

Sim: Qualquer impressora instalada no Windows

Pegue o nome da impressora usando: Win_PrintDlgDC

Código: Selecionar todos


  LOCAL xPrn := ''
  Win_PrintDlgDC( @xPrn,,, )

  IF !( EMPTY( xPrn ) )
    Win_PrintFileRaw( xPrn, c_Arquivo_para_Impressao, 'Impressão: PrintFileRaw' )
  ENDIF

M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
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á

Comando de impressão de arquivo.

Mensagem por Pablo César »

Ronaldo (Imatech) escreveu:
rbonotto escreveu:Este comando imprimiria em USB ?
Sim: Qualquer impressora instalada no Windows
Correção: Existe uma limitação nessa função, ela apenas imprime em impressoras que dão suporte a impressão RAW MODE (Palavras do nosso colega Leonardo). Nem todas as impressoras, oferecem esta forma de impressão.

Veja em propriedades da impressora se possui ou não o padrão RAW:
Imagem
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.
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

Comando de impressão de arquivo.

Mensagem por Imatech »

Olá meu amigo Pablo !



Para o tipo de impressão desejado todas as impressoras que o usuario já utilizava serão compativeis...

Alem do acrescimo de toda a Linha de impressoras EPSON/HP ( Linguagem Esc/P e/ou PCL ) que estiverem instaladas no windows...




Abç...
M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
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á

Comando de impressão de arquivo.

Mensagem por Pablo César »

Com PrintFileRaw não é garantido a impressão em TODAS as impressoras.

Em alguns modelos de impressoras como: Canon, Samsung, Lexmark, Zebra e outras impressoras especializadas que apenas utilizam drives específicos como para impressão de fotografias, não utilizam o padrão RAW. Daí o Win_PrintFileRaw não funcionará, por isso é recomendado avaliar o retorno da função se retornar -1 é porque a impressora não suporta este padrão para o spooler do WIndows.
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.
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

Comando de impressão de arquivo.

Mensagem por rbonotto »

Os meus clientes usam quase que 100% impressoras das marcas Bematech, Diebold ou Daruma.

Testei em uma Bematech e funcionou perfeitamente, testarei em outros e posto resultado.

Novamente, obrigado !!
mixsistemas@gmail.com
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Comando de impressão de arquivo.

Mensagem por JoséQuintas »

Não tenho como testar, mas se funciona a impressão normal, acredito que possa funcionar algo do tipo:
set console off
set printer on
type arquivo
set printer off
set console on
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
helio
Usuário Nível 3
Usuário Nível 3
Mensagens: 175
Registrado em: 04 Ago 2004 10:36
Localização: São Bento do Una-PE
Contato:

Comando de impressão de arquivo.

Mensagem por helio »

Pessoal onde posso encontrar esta Funcao Win_PrintFileRaw().
Helio Beltrao Jr.
msn: helio@htisistemas.com
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á

Comando de impressão de arquivo.

Mensagem por Pablo César »

Helio você pode procurar pela função hb_PrintFileRaw
Tela41.PNG
Também você pode criar sua própria rotina em C, como por exemplo esta aqui:

Código: Selecionar todos

#pragma BEGINDUMP

#undef UNICODE

#include <windows.h>
#include "hbapi.h"
#include "hbvm.h"
#include "hbstack.h"
#include "hbapiitm.h"

#ifndef __XHARBOUR__
   #define ISCHAR( n )           HB_ISCHAR( n )
#endif

#define MAX_FILE_NAME 1024
#define BIG_BUFFER (1024*32)

HB_FUNC ( ENUMPRINTERS )
{
  UCHAR *Result ;
  DWORD x, Flags = PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS ;
  LPSTR Name = NULL ;
  DWORD Level = 5 ;
  PRINTER_INFO_5 *pPrinterEnum, *pFree;
  PRINTER_INFO_4 *pPrinterEnum4, *pFree4;
  DWORD cbBuf  ;
  DWORD BytesNeeded=0 ;
  DWORD NumOfPrinters=0 ;
  OSVERSIONINFO osvi ;  //  altered to check Windows Version
  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  GetVersionEx (&osvi);
  if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
  {
    Level = 4 ;
    EnumPrinters(Flags,Name,Level,(LPBYTE) pPrinterEnum4,0,&BytesNeeded,&NumOfPrinters) ;
    if (BytesNeeded > 0)
    {
      Result = (UCHAR *) hb_xgrab(BytesNeeded) ;
      *Result = '\0' ;
      pFree4 = pPrinterEnum4 = (PRINTER_INFO_4 *)  hb_xgrab(BytesNeeded) ;
      cbBuf = BytesNeeded ;
      if (EnumPrinters(Flags,Name,Level,(LPBYTE) pPrinterEnum4,cbBuf,&BytesNeeded,&NumOfPrinters))
      {
        for (x=0 ; x < NumOfPrinters ; x++, pPrinterEnum4++ )
        {
          strcat(Result,pPrinterEnum4->pPrinterName) ;
          strcat(Result,";") ;
        }
      }
      hb_retc(Result) ;
      hb_xfree(Result) ;
      hb_xfree(pFree4) ;
    }
    else
      hb_retc("") ;
  }
  else
   {
    EnumPrinters(Flags,Name,Level,(LPBYTE) pPrinterEnum,0,&BytesNeeded,&NumOfPrinters) ;
    if (BytesNeeded > 0)
    {
      Result = (UCHAR *) hb_xgrab(BytesNeeded) ;
      *Result = '\0' ;
      pFree = pPrinterEnum = (PRINTER_INFO_5 *)  hb_xgrab(BytesNeeded) ;
      cbBuf = BytesNeeded ;
      if (EnumPrinters(Flags,Name,Level,(LPBYTE) pPrinterEnum,cbBuf,&BytesNeeded,&NumOfPrinters))
      {
        for (x=0 ; x < NumOfPrinters ; x++, pPrinterEnum++ )
        {
          strcat(Result,pPrinterEnum->pPrinterName) ;
          strcat(Result,";") ;
        }
      }
      hb_retc(Result) ;
      hb_xfree(Result) ;
      hb_xfree(pFree) ;
    }
    else
      hb_retc("") ;
  }
}

HB_FUNC( WINDEFAULTPRINTER )
{
  DWORD x, y ;
  UCHAR lpReturnedString[MAX_FILE_NAME] ;
  x = GetProfileString("windows","device","",lpReturnedString,MAX_FILE_NAME-1);
  y = 0 ;
  while ( y < x && lpReturnedString[y] != ',' )
    y++ ;
  hb_retclen(lpReturnedString,y) ;
}

HB_FUNC( PRINTFILERAW )
{
  UCHAR  printBuffer[BIG_BUFFER], *cPrinterName, *cFileName, *cDocName ;
  HANDLE  hPrinter, hFile ;
  DOC_INFO_1 DocInfo ;
  DWORD nRead, nWritten, rVal = -1 ;
  if (ISCHAR(1) && ISCHAR(2))
  {
    cPrinterName= (UCHAR*)hb_parc(1) ;
    cFileName= (UCHAR*)hb_parc(2) ;
    if ( OpenPrinter(cPrinterName, &hPrinter, NULL) != 0 )
    {
      DocInfo.pDocName = (UCHAR*)hb_parc(3) ;
      DocInfo.pOutputFile = NULL ;
      DocInfo.pDatatype = "RAW" ;
      if ( StartDocPrinter(hPrinter,1,(char *) &DocInfo) != 0 )
      {
        if ( StartPagePrinter(hPrinter) != 0 )
        {
          hFile = CreateFile(cFileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)   ;
          if (hFile != INVALID_HANDLE_VALUE )
           {
            while (ReadFile(hFile, printBuffer, BIG_BUFFER, &nRead, NULL) && (nRead > 0))
            {
              if (printBuffer[nRead-1] == 26 )
                nRead-- ; // Skip the EOF() character
              WritePrinter(hPrinter, printBuffer, nRead, &nWritten) ;
            }
            rVal = 1 ;
            CloseHandle(hFile) ;
          }
          else
            rVal= -6 ;
          EndPagePrinter(hPrinter) ;  // 28/11/2001 10:16
        }
        else
          rVal = -4 ;
        EndDocPrinter(hPrinter);
      }
      else
        rVal= -3 ;
      ClosePrinter(hPrinter) ;
    }
    else
      rVal= -2 ;
  }
  hb_retnl(rVal) ;
}

#pragma ENDUMP
E utilizar em Harbour com este exemplo:

Código: Selecionar todos

FUNCTION WinPrintRaw(cPrinter,cFileName,cDocumentName)
//////////////////////////////
  LOCAL nPrn:= -1, cMess:= "WinPrintRaw(): "

  IF !EMPTY(cFilename)
    IF (nPrn := PrintFileRaw(cPrinter,cFileName,cDocumentName)) < 0
      DO CASE
      CASE nPrn = -1
        Alert(cMess+"Incorrect parameters passed to function")
      CASE nPrn = -2
        Alert(cMess+"WINAPI OpenPrinter() call failed")
      CASE nPrn = -3
        Alert(cMess+"WINAPI StartDocPrinter() call failed")
      CASE nPrn = -4
        Alert(cMess+"WINAPI StartPagePrinter() call failed")
      CASE nPrn = -5
        Alert(cMess+"WINAPI malloc() of memory failed")
      CASE nPrn = -6
        Alert(cMess+"WINAPI CreateFile() call failed - File "+cFileName+" no found??")
      ENDCASE
    ENDIF
  ENDIF

RETURN(nPrn)

//////////////////////////////
STATIC FUNCTION PrintMessage(cPrinter)
//////////////////////////////
  SET CONS OFF
  SET ALTE TO (TESTFILE)
  SET ALTE ON
  ? ' PRNTEST.PRG'
  ?
  ? '  Copyright:'
  ? '   Rees Software & Systems Ltd 2003'
  ? '   Nelson, New Zealand'
  ?
  ? ' Contents :'
  ? '    Sample printing to file'
  ? '    This is donated to the public domain and is free software.'
  ?
  ? 'An alternative to "SET PRINTER TO" for printing under Windows'
  ? '-------------------------------------------------------------'
  ?
  ? 'Print to a temporary file (we use WINAPI GetTempFileName()) first. Then use'
  ? 'WinPrintRaw() to send the file to the windows spooler.'
  ?
  ? 'Obviously to make use of this you need to know what type of printer you are'
  ? 'printing to and you must also include the appropriate "Escape codes" in the'
  ? 'file - as we used to do in Clipper. The trick we use to determine what type'
  ? 'of printer is installed is to add special characters to the Windows printer'
  ? 'name.'
  ?
  ? '(E)= Epson compatible DOT matrix e.g. Panasonic KXP3200 Series (E)'
  ? '(6)= PCL 6 compatible'
  ? '(D)= Deskjet'
  ? ''
  ? 'etc....'
  ?
  ? 'Then to determine the correct "Escape codes" do the following in your code:'
  ?
  ? 'BEGIN CASE'
  ? "CASE '(6)'$cPrinter"
  ? "   s_prnReset = CHR(27)+'E'+........"
  ? '   s_underOn  = CHR(27)+"&d1D"'
  ? '   s_UnderOff = CHR(27)+"&d@"'
  ? "   s_compress = CHR(27)+ '(s1b16.66h6T'"
  ? '  file://etc....'
  ? "CASE '(E)'$cPrinter"
  ? '  file://etc......'
  ? 'ENDCASE'
  ?
  ? 'This is the exact same approach we used in Clipper - except that printing'
  ? 'is to the Windows printer not a LPT port. The only caveat is that not all'
  ? 'printers support RAW mode. These are Windows GDI only printers.'
  ?
  ? 'We have been using this approach for the last 4 years with Xbase++ with no'
  ? 'problems.'
  ?
  ? FORMFEED
  SET ALTE OFF
  SET ALTE TO
  SET CONS ON
  WinPrintRaw(cPrinter, TESTFILE, "Test Print Job")
RETURN(.T.)

//////////////////////////////
FUNCTION WinGetPrinters()
//////////////////////////////
  LOCAL aPrn := {}, nStart := 1, cPrinters, nStop, nPos, cPrn
  cPrinters := EnumPrinters()+';'
  nStop := LEN(cPrinters)+1
  DO WHILE nStart < nStop
    nPos := AT(';', cPrinters, nStart)
    IF !EMPTY(cPrn := SUBSTR(cPrinters, nStart, nPos-nStart))
      AADD(aPrn, cPrn)
    ENDIF
    nStart := nPos+1
  ENDDO
RETURN(aPrn)
Código obtido do C:\MiniGUI\SAMPLES\Advanced\PrintRAW\PRINTRAW.PRG
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
helio
Usuário Nível 3
Usuário Nível 3
Mensagens: 175
Registrado em: 04 Ago 2004 10:36
Localização: São Bento do Una-PE
Contato:

Comando de impressão de arquivo.

Mensagem por helio »

Pablo,
Utilizo ainda o XHARBOUR 0.977 com SQLRDD e nao consegui achar estar funcao voce podia me ajudar ou nao tem neste XHARBOUR que utilizo.
Helio Beltrao Jr.
msn: helio@htisistemas.com
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á

Comando de impressão de arquivo.

Mensagem por Pablo César »

xHarbour ? Não é muito a minha praia... e ainda essa versão... mas já experimentou utilizando PrintFileRaw() ?
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
helio
Usuário Nível 3
Usuário Nível 3
Mensagens: 175
Registrado em: 04 Ago 2004 10:36
Localização: São Bento do Una-PE
Contato:

Comando de impressão de arquivo.

Mensagem por helio »

Pablo,

Esta funcao WinPrintRaw(cPrinter,cFileName,cDocumentName) os parametros exemplo: cPrinter = 'LPT2', cFileName = ARquivo a ser impresso, cDocumentName = ?
Helio Beltrao Jr.
msn: helio@htisistemas.com
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

Comando de impressão de arquivo.

Mensagem por Imatech »

Olá Helio !


Não precisa anexar coisas que já existam no seu compilador ( PrintFileRaw é originario do xharbour, no Harbour a função foi renomeada para Win_PrintFileRaw )


Com xHarbour ira usar a função: PrintFileRaw()


cPrinter := 'LPT2' // porta ou nome da impressora no gerenciador de impressoras do windows
cFileName := ARquivo a ser impresso // nome do arquivo a ser impresso
cDocumentName := 'Meu relatorio usando PrintFileRaw' // Titulo qualquer a ser exibido pelo gerenciador de impressão


PrintFileRaw( 'LPT2', '\temp\teste_impressao.txt', 'Meu relatorio usando PrintFileRaw' )
M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
Responder