Página 1 de 1

Como imprimir cabeçalhos e rodapés com win32prn???

Enviado: 28 Fev 2008 23:26
por ERASMO ANDRIOLI
Olá amigos....


Gostaria que postassem aqui no forum, exemplos simples e praticos de como imprimir cabeçalhos e rodapes pela classe Win32prn.

Percebi que ela ignora os comandos de comprimir e salto de pagina gerados pelo CLipper, parece que ela controla os fins de folha.

Obrigado.

Erasmo

Enviado: 29 Fev 2008 16:05
por ERASMO ANDRIOLI
:(

Não acredito que até agora ninguem respondeu a questão minha...

Enviado: 29 Fev 2008 16:29
por Luciano Bonfim
amigo, vai em busca e digita : win32prn

vc vai vai um monte de posts que resolverá seu problema

obrigado

Enviado: 29 Fev 2008 16:40
por Hasse
Erasmo:

A Classe Win32prn() obedece ao comando EJECT do Clipper, porém você não informou em qual impressora imprime e em que papel.

A Classe tem uma penca de vantagens, mas também algumas desvantagens. Nem tudo na vida é perfeito.

A Classe Win32prn possui um outro tipo de controle específico para páginas A4 e todos os outros tamanhos padrão.

Seja mais específico com a colocação do teu problema, e certamente alguém vai te auxiliar. Me ofereço também, se tiveres um pouco de calma, pois somente nos finais de tarde e nos finais de semana que tenho tempo para abrir o Fórum e os e-mails.

COMPLEMENTAÇÃO DA AJUDA...

Enviado: 29 Fev 2008 17:52
por ERASMO ANDRIOLI
OK!!! Vocês venceram.... lá vai a pergunta objetiva:

Esse é parte do prog que imprime o relatorio em arquivo e ao final ele chama uma função IMPRIME para imprimir pela classe win:

Código: Selecionar todos

************************
PROCEDURE EXT_IMP
************************

WIN(12,13,17,64,"AGUARDE!!! IMPRIMINDO...","GR+/N","N+/W")
FRAME(14,14,16,63)

arq_x ="C:\TEMP\"+LEFT(TIME(),2)+RIGHT(LEFT(TIME(),5),2)+RIGHT(TIME(),2)+"SI"+".PRN"
SET DEVICE TO PRINTER
SET PRINTER TO EXTRA.PRN // &arq_x

SELE 3
USE BNKLCTO SHARED ALIAS BANLAN
SET INDEX TO BNKLCTO
SET ORDER TO 4
DBGOTOP()

SALDO_ANT=0
LOCATE FOR CONTALCTO=COD_BCO .AND. DTMVLCTO < DTINIC

DO WHILE .T.
   SUM VALORLCTO TO SALDO_A WHILE CONTALCTO=COD_BCO .AND. DTMVLCTO < DTINIC
   SALDO_ANT=SALDO_ANT+SALDO_A
   CONTINUE
   IF FOUND()
      LOOP
   ENDIF
   EXIT
ENDDO

TDTEMLCTO=DTEMLCTO
TDTMVLCTO=DTMVLCTO
TVALORLCTO=VALORLCTO
TNUMLCTO=NUMLCTO
THISTLCTO=HISTLCTO
THISTLCTO1=HISTLCTO1
TTPDOCLCTO=TPDOCLCTO
TTIPO=TIPO
TCONTALCTO=CONTALCTO

DBSEEK(COD_BCO)

P=1
PAGINA=1

control= 0
termom:= 53  / RECCOUNT()
porce := 100 / RECCOUNT()

DO WHILE .NOT. EOF()

   SET DEVICE TO SCREEN
   control++
   @15,15+(control*termom) SAY "±" COLOR("BG+/W")
   SET DEVICE TO PRINTER

   TCONTALCTO = CONTALCTO
   TDTMVLCTO  = DTMVLCTO
   TDTEMLCTO  = DTEMLCTO
   TVALORLCTO = VALORLCTO
   TNUMLCTO   = NUMLCTO
   THISTLCTO  = HISTLCTO
   THISTLCTO1 = HISTLCTO1
   TTPDOCLCTO = TPDOCLCTO
   TTIPO      = TIPO

   IF PROW() = 0
      @PROW(),0    SAY &m_i               && Condensado ON Printer Select...
      @PROW(),00   SAY REPLICATE("=",130)
      @PROW()+1,00 SAY "BANK"

      vtab = (130-LEN(RTRIM(empresa)))/2
      * Centraliza o texto do aviso na tela
      @prow(),vtab SAY empresa

      @PROW(),120  SAY DATE()
      @PROW()+1,00 SAY "Versao 1.0"
      @PROW(),45   SAY sistema
      @PROW(),45   SAY sistema
      @PROW(),122  SAY TIME()
      @PROW()+1,00 SAY REPL("=",130)
      @PROW()+1,52 SAY "EXTRATO DE CONTA BANCARIA"
      @PROW()+1,00 SAY REPL("-",130)
      @PROW()+1,00 SAY "Conta:"
      @PROW(),07   say STRZERO(COD_BCO,2,0)
      @PROW(),10   SAY "-"
      @PROW(),12   SAY TDESCRICAO
      @PROW(),60   SAY "No.da Conta:"
      @PROW(),75   SAY TCONTA
      @PROW(),94   SAY "Banco: "+STUFF(PADL(TBANCO,4,"0"),4,0,"-")
      @PROW()+1,00 say "Periodo do Extrato:"
      @PROW(),20   say DTINIC
      @PROW(),31   SAY "a"
      @PROW(),33   SAY DTFINI
      @PROW()+2,00 say "Data"
      @PROW(),12   say "Lcto"
      @PROW(),17   say "Historico"
      @PROW(),66   say "Data Emissao"
      @PROW(),84   say "Valor em R$"
      @PROW(),96   say "D/C"
      @PROW(),100  say "Tp"
      @PROW(),118  say "Saldo em R$"
   ENDIF

   IF P=1
      @PROW()+1,17     SAY "S A L D O   A N T E R I O R"
      @PROW(),107      SAY SALDO_ANT PICT("999,999,999,999,999.99")
      P=P+1
      * Cria variavel de nome S_INI sendo igual ao saldo anterior
      S_INI=SALDO_ANT
   ENDIF

   IF CONTALCTO = COD_BCO .AND. DTMVLCTO < DTINIC
      DBSKIP()
      LOOP
   ENDIF

   IF CONTALCTO = COD_BCO .AND. DTMVLCTO > DTFINI
      DBSKIP()
      LOOP
   ENDIF

   IF CONTALCTO <> COD_BCO
      DBSKIP()
      LOOP
   ENDIF

   @PROW()+1,00 SAY TDTMVLCTO
   @PROW(),12   SAY STRZERO(TNUMLCTO,4,0)
   @PROW(),17   SAY THISTLCTO

   IF THISTLCTO1 <> ""
      @PROW()+1,17 SAY THISTLCTO1
   ENDIF

   @PROW(),68   SAY TDTEMLCTO

   * M ostrar Valor em Positivo caso seja Negativo...
   @PROW(),81 SAY abs(TVALORLCTO) PICT "999,999,999.99"

   @PROW(),97   SAY TTIPO
   @PROW(),100  SAY STRZERO(TTPDOCLCTO,2,0)

   S_INI=S_INI+TVALORLCTO
   @PROW(),107  SAY S_INI PICT("999,999,999,999,999.99")

   DBSKIP()

   IF PROW() = 56 .OR. PROW() > 56
      @PROW()+1,0 SAY REPL("=",130)
      @PROW()+1,0 SAY eu+mfone
      @prow(),121 SAY "Pag.: "+ STRZERO(PAGINA,3,0)
      @prow()+1,0 SAY repl("=",130)
      PAGINA++
      eject
   ENDIF
ENDDO

@PROW()+1,17 SAY "S A L D O   A T U A L"
@PROW(),107  SAY S_INI PICT("999,999,999,999,999.99")

DO WHILE PROW() < 56
   @PROW()+1,0 SAY ""
ENDDO

@PROW()+1,0 SAY REPL("=",130)
@PROW()+1,0 SAY eu+mfone
@prow(),121 SAY "Pag.: "+ STRZERO(PAGINA,3,0)
@prow()+1,0 SAY repl("=",130)

EJECT
SET DEVICE TO SCREEN
SET PRINTER TO
IMPRIME(,,"C")
RETURN
// Agora vai postado a rotina da IMPRIME...

Código: Selecionar todos

*********************************************
FUNC Imprime( cArq,cPrinter,tam ) 
*********************************************
aPrn := GETDEFAULTPRINTER() // vai pegar a impressora padrao...
tamrel:=tam
IF .NOT. FILE("EXTRA.PRN")
   RETURN 
ELSE 
   cFILE := "BK"+ ALLTRIM( STR( RANDOM(9999) ))+".PRN" 
   COPY FILE EXTRA.PRN TO (cFILE)
   DELETE FILE EXTRA.PRN 
ENDIF 

If Empty(aPrn) 
   alert("Nao ha'Impressora Instalada!!!") 
else 
   IMPRES(cFILE,aPrn,tamrel) 
EndIf 
DELETE FILE TEXTO.DBF 
RETURN

*----------------------------- // ImpressÆo Xharbour cont...
FUNC IMPRES( cArq,cPrinter,tam ) 
*-----------------------------
local cTexto, nLinhas, cLinha
local oPrinter := win32prn():New(cPrinter) 
oPrinter:Landscape := .F. 
oPrinter:FormType  := 9 
oprinter:SetPrintQuality(-1) 
oPrinter:Copies    := 1 

IF FILE("logo.bmp")  // se tiver o arquivo logo.bmp dentro da mesma pasta 
   aTamlog := 9      // ele vai imprimir o logo primeiro 
else 
   aTamlog := 0 
endif 

DELETE FILE TEXTO.DBF 
vARQ:={}
aadd( vARQ, {"LINHA","C",200,0} ) 
DBcreate("TEXTO.DBF", vARQ) 

SELE 40 
USE TEXTO ALIAS TELA EXCL 
SELE TELA 
append from (cArq) sdf 

IF !oPrinter:Create() 
   return NIL 
ELSE 
   IF .not. oPrinter:StartDoc("BANK") 
      return NIL 
   endif 

   PrintBitMap( oPrinter ) 
   FOR TT=1 TO aTamlog 
      oPrinter:newline() 
   NEXT 

   if tam = "C"
      oPrinter:SetFont("Courier New",11,{3,-50})  // Comprimida
      MSGBOX1("IMPRIMINDO COMPRIMIDO...")
   else
      oPrinter:SetFont("Courier New",,11,,,,255)  // Normal
      MSGBOX1("IMPRIMINDO NORMAL...")
   endif
   oPrinter:Bold(0) 
   SELE TELA 
   dbgotop() 
   Do while !eof() 
      cLinha := Tela->Linha 
      oPrinter:newline() 
      oPrinter:SetFont("Courier New",11,{3,-50}) 
      oPrinter:TextOut(cLinha) 
      oPrinter:Bold(0) 
      dbskip() 
      if !eof() 
         if (oPrinter:MaxRow() - 2) <= oPrinter:Prow() 
            oPrinter:NewPage()   // novo pagina 
            PrintBitMap( oPrinter )  // imprimindo o logotipo de novo 
            FOR TT=1 TO aTamlog 
               oPrinter:newline() 
            NEXT 
         endif 
      endif 
   enddo 
   oPrinter:EndDoc() 
   oPrinter:Destroy() 
ENDIF 
SELE TELA 
USE
RETURN NIL

FUNC PrintBitMap( oPrn )  //função para imprimir imagem do logotipo 
LOCAL oBMP 
oBMP:= Win32BMP():new() 
oBmp:loadFile( "logo.bmp" ) 
oBmp:Draw( oPrn,  { 200,200,500,500 } ) 
oBMP:Destroy() 
RETURN 

FUNC Random( nLimite )  // função para criar um arquivo temporario
  static nGuarda:= 1 
  local I 
  local nResult 
  if ValType( nLimite ) # [N] 
    nLimite:= 100 
  endif 
  I:= Seconds() 
  while nLimite > I 
    I:= I * 100 +Seconds() 
  enddo 
  nGuarda:= (nGuarda +I) / (nResult:= nGuarda * I % nLimite +1) 
  nResult:= Int( nResult ) 
return nResult 
// è isso ai pessoal.... eu percebi que o Harbour está ignorando o
// comando eject e controle de fim e inicio de folha...
// Será que o controle da função IMPRIME deve ser compativel
// com a quantidade de linhas do arquivo .prn???
// Estou testando na HP Laser Jet 1018

Aguardo retorno, principalmente do MALIGNO...

Abraços

ERASMO

Enviado: 29 Fev 2008 17:59
por ERASMO ANDRIOLI
Caramba.... o prog ficou todo desEndentado... :))
Nota de Moderação:
por Pablo César: Isso porque esqueceu de utilizar as tags CODE

Enviado: 29 Fev 2008 20:23
por Luciano Bonfim
amigo ele nao esta ignorando, vc tem que varrer seu txt e substituir os caracteres do EJECT pelo correspondente do win32prn

Código: Selecionar todos


valbuf = 11000
arq=FOPEN(cArq,0)
do while .t.
   buffer=SPACE(valbuf)
   FSEEK(arq,atu,0)
   bytes=FREAD(arq,@buffer,valbuf)
   pos=AT(CHR(12),buffer)
   if bytes=0 .OR. pos=0
      exit
   endif
   bloco=substr(buffer,1,pos)
   linhaImpressao=""
   for x=1 to len(bloco)
      ch=substr(bloco,x,1)
      do case
      case ch = FIM_LINHA
         oPrinter:TextOut( strtran(linhaImpressao,chr(13),""), .t. )
         linhaImpressao=""
         barra:Step()
      case ch = FIM_PAGINA
         oPrinter:TextOut( strtran(linhaImpressao,chr(13),""), .t. )
         oPrinter:NewPage()
         //PrintBitMap( oPrinter )
         linhaImpressao=""
         barra:Step()
      otherwise
         linhaImpressao+=ch
      endcase
   next
   atu=atu+pos
enddo
oPrinter:EndDoc()
oPrinter:Destroy()




Enviado: 29 Fev 2008 22:21
por Hasse
Olá Erasmo.

Não entendí porque você mistura impressão Clipper com impressão via Classe Win32prn().

Você acaba confundindo todo o sistema. A contagem de linhas fica embaralhada.

Ou você imprime a página toda via Clipper ou via Win32prn().

Transponha tudo para Win32prn() e verás perfeito funcionamento.

RESPOSTA...

Enviado: 29 Fev 2008 23:13
por ERASMO ANDRIOLI
Pois é...

o problema é que não quero mudar todos os meus fontes de relatórios, são muitos, hoje eles geram arquivos .prn que eu mando imprimir pelo DOSPRINT.

Como estou mudando para XHarbour, quero apenas implementar uma função que leia o arquivo pronto e mande imprimir. Lembro-lhes que esses arquivos tem cabeçalhos e rodapés formatados com saltos de paginas pelo EJECT.

Nas rotinas com impressora matricial vou usar o PRINTFILERAW para evitar dor de cabeças... é isso...

Más até o momento não achei nada fácil para usar na impressão desses documentos prontos (os arquivos .prn).

Queria que alguem colocasse um exemplo bem simples mesmo, para ler um arquivo .prn, e imprimir via classe win32prn.

O negócio tem que bate e vale.... sem xurumelas...
-:]

Saudações

Enviado: 29 Fev 2008 23:34
por Luciano Bonfim
Caro Erasmo,

meu sistema tem exatamente 230 relatórios diferentes, todos feitos em clipper quando mudei para xharbour nao precisei mudar absolutamente nada neles, bastava imprimi-los para TXT (set printer to arquivo.txt) e depois abrir esse txt via funçäo de baixo nível e pegando linha a linha e mandando imprimir via win32prn, conforme funcao que eu te mandei ai em cima...

ta funcionando perfeitamente...

boa sote