Problema na impressao com PDFCREATOR

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

Moderador: Moderadores

locio
Usuário Nível 2
Usuário Nível 2
Mensagens: 98
Registrado em: 27 Out 2006 14:21

Problema na impressao com PDFCREATOR

Mensagem por locio »

Mudei o programa NODOSIMP pelo PDFCREATOR que tem mais possibilidades, mas estou com problema na impressão quando preciso fazer quebra de pagina. Ele parece que não reconhece o comando do oPrinter:NewPage() pois, apos pular a pagina ele perde umas tres linhas do cabeçalho da pagina seguinte.

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

Re: Problema na impressao com PDFCREATOR

Mensagem por sygecom »

Eu tenho usado aqui tranqulamente, post como você esta usando para imprimir com a WIN32PRN
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Re: Problema na impressao com PDFCREATOR

Mensagem por Hasse »

Bom dia colegas.

Também já tive este problema, e para contornar, simplesmente adiciono, antes da primeira linha a ser impressa, algumas linhas em branco:

Código: Selecionar todos

oPrinter:NewLine()
Outra opção seria configurar a margem superior de tal forma a contornar o problema.

Me parece que este problema está liga a algumas impressoras, pois não acontece em todas.

Eu ainda não usei nem testei, mas parace-me que há uma forma de setar os valores SELF das métricas das páginas:

Código: Selecionar todos

    ::PageWidth        := GetDeviceCaps(::hPrinterDC,PHYSICALWIDTH)
    ::PageHeight       := GetDeviceCaps(::hPrinterDC,PHYSICALHEIGHT)
    ::LeftMargin       := GetDeviceCaps(::hPrinterDC,PHYSICALOFFSETX)
    ::RightMargin      := (::PageWidth - ::LeftMargin)+1
    ::PixelsPerInchY   := GetDeviceCaps(::hPrinterDC,LOGPIXELSY)
    ::PixelsPerInchX   := GetDeviceCaps(::hPrinterDC,LOGPIXELSX)
    ::LineHeight       := INT(::PixelsPerInchY / 6)  // Default 6 lines per inch == # of pixels per line
    ::TopMargin        := GetDeviceCaps(::hPrinterDC,PHYSICALOFFSETY)
    ::BottomMargin     := (::PageHeight - ::TopMargin)+1
O Leonardo possivelmente possa ajudar a implementar este recurso.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
locio
Usuário Nível 2
Usuário Nível 2
Mensagens: 98
Registrado em: 27 Out 2006 14:21

Re: Problema na impressao com PDFCREATOR

Mensagem por locio »

Pessoal eu coloquei no programa os comandos abaixo para tentar ver se controlava os tamanhos de pagina e margens, e o sistema me retornou numeros que não entendi.

Ver numeros:

oPrinter:topmargin() = 0
oPrinter:bottommargin() = 7018
oPrinter:lineheight() = 100
oPrinter:pagewidth = 4958
oPrinter:pageheight = 7017

A impressora padrão é a Epson Lx-300

Vocês tem como me explicar?
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Re: Problema na impressao com PDFCREATOR

Mensagem por Hasse »

Boa tarde Locio.

Estes valores são em PIXELS, para a impressora em uso, para a qualidade setada.

Estes valores costumam mudar quando você troca de impressora ou quando você troca de qualidade de impressão.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
locio
Usuário Nível 2
Usuário Nível 2
Mensagens: 98
Registrado em: 27 Out 2006 14:21

Re: Problema na impressao com PDFCREATOR

Mensagem por locio »

Prezado Hasse,

Segue abaixo rotina que utilizo para imprimir. Inicialmente eu crio um arquivo txt eno final eu dou um comando para uma rotina imprime.

Você observe que na rotina eu posso imprimir via printfileraw, isso está legal.

Quando eu coloco para imprimir via pdfcreator tenho problema, inclusive se a pagina não fica completa e eu pulo para outra pagina ele imprime ainda na pagina anterior.

Código: Selecionar todos

FUNCTION Imprime( cPrinter, cArq, tamrel, ver, tampag )
////////////////////////////////////////////////////////////////////////////////
local cTexto, nLinhas, nA, cLinha, nB   // oPrinter := win32prn():New(cPrinter)
LOCAL oPrinter := win32prn():new(getdefaultprinter())

local Prn
local nPrn:=1
local aPrn:= GetPrinters()

oPrinter:Landscape := .F.
oPrinter:FormType  := 9
oprinter:SetPrintQuality(-1) // qualidade da impressão
oPrinter:Copies    := 1

     if tampag = nil
        tampag := 58
     endif

     if cPrinter = "printfileraw"
        Prn:=getdefaultprinter()
        ret:=printfileraw(Prn,cArq)
        @ maxrow()-8,10 say 'retorno printfileraw: ' + str(ret) + '   ' + PRN + '  ' + carq
        return
     endif

 if empty(aPrn)
    mens(cor5,"NÆo encontrou impressoras instaladas....Favor Verificar a Impressora !!!") 
   return NIL
 endif

if   ver

     fAbreJanela("Seleciona Impressora",18,15,25,85)

     do while !empty(nprn)
     //   cls
     //   @ 0,0 say 'Teste de classe Win32Prn(). Escolha a impressora. ESC p/sair'
     //   @ 1,0 to maxrow(), maxcol()
        nPrn := achoice(19,16,24,84,aPrn)
        if  lastkey() = 27
            fFechaJanela()
            return
        endif
        if !empty(nprn)
           oPrinter := win32prn():new(aPrn[nPrn])
           exit
        endif
     enddo

     fFechaJanela()

endif

IF !oPrinter:Create()
   mens(cor5,"Atenção !!! O Sistema encontrou um Problema ao Tentar Executar Create().") 
   return NIL
endif

IF ! oPrinter:StartDoc(cArq)
   mens(cor5,"Atenção !!! O Sistema encontrou um Problema ao Tentar executar StartDoc()") 
   return NIL
endif

oPrinter:SetDefaultFont()
if tamrel > 80
// oPrinter:setfont('Courier New',,17,,,,255)
   oPrinter:setfont(,,17,,,,255)
else
// oPrinter:setfont('Courier New',,11,,,,255)
   oPrinter:setfont(,,11,,,,255)
endif

oPrinter:TextOut( space(tamrel), .T. )
cTexto  := memoread( cArq )
nLinhas := mlcount( cTexto, tamrel, 1, .F. )
nConta  := 0

for nA := 1 to nLinhas
   cLinha := memoline( cTexto, tamrel, nA, 1, .F. )

   IF nCONTA = tampag
      oPrinter:NewPage()
      oPrinter:Newline()
      oPrinter:Newline()
      oPrinter:Newline()
      nConta  := 0
   else
      oPrinter:TextOut( cLinha, .T. )
   endif
   nConta=nConta+1
next
oPrinter:EndDoc()
oPrinter:Destroy()
RETURN NIL

Por favor veja qual é a besteira que eu estou fazendo,

Locio
yugi386
Usuário Nível 2
Usuário Nível 2
Mensagens: 82
Registrado em: 24 Jul 2008 10:36
Localização: Minas Gerais

Re: Problema na impressao com PDFCREATOR

Mensagem por yugi386 »

Você pode tentar com CutePDF ao invés de PDFCREATOR
Instruções estão abaixo:

É simples: vá no site do superdownloads e baixe um programa chamado cutepdf. É uma impressora virtual que imprime em PDF. Se preferir baixe direto do site do fabricante:

http://www.cutepdf.com/download/cutewriter.exe

Vc vai precisar de um outro programa chamado converter.exe que vc encontra em:

http://www.cutepdf.com/download/converter.exe

Agora é simples, instale os dois programas em sua máquina. ambos são FREEWARE. Pronto! Vc tem uma impressora virtual chamada CUTEPDF WRITER e tudo o que mandar pra ela é salvo em um arquivo PDF, obedecendo toda a formatação do relatório original, inclusive com imagens e gráficos.

O seu software só terá que ter a opção de escolher a impressora antes de imprimir o relatório. O resto fica igual, nem uma linha de comando precisa ser alterada. Como a saída gerada é um arquivo PDF a impressora virtual abre uma janela onde vc pode indicar a pasta e o nome do arquivo a ser salvo. A impressão do PDF não atrapalha o seu programa funcionar e a janela é fechada após o arquivo ser gerado.

--------------------------------------------------------------------

Bem, naturalmente como vc gera um txt é preciso ver qual é o caracter que permite a mudança de página. Você deve incluí-lo no final de cada página para a impressora virtual entender o momento da mudança.

É isto aí, espero ter ajudado.
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Re: Problema na impressao com PDFCREATOR

Mensagem por Hasse »

Boa noite colegas.

Realmente o CutePDF é uma outra opção, que eu uso somente quando estou tratando com textos que contenham caracteres especiais. Para o feijão com arroz do dia a dia, ainda prefiro o PDFCreator que possui mais recursos.

O problema do colega Locio é de programação, ou melhor, de tempo para se adaptar e entender o funcionamento da Classe Win32prn().

Fiz algumas alterações, e comentei do porquê... Testei e está funcionando. Veja.

Código: Selecionar todos

Function MAIN()

   Imprime( "PDFCreator", "Teste.txt", 80, .f., 58 )

RETURN(.T.)
*
*
FUNCTION Imprime( cPrinter, cArq, tamrel, ver, tampag )
////////////////////////////////////////////////////////////////////////////////
local cTexto, nLinhas, nA, cLinha, nB   // oPrinter := win32prn():New(cPrinter)
*--------------------------------------
LOCAL oPrinter:= WIN32PRN():New(cPrinter), aFonts, x, nColFixed, nColTTF, ;
                    nColCharSet, aForms
// Abre o objeto oPrinter.  As variáveis que não estiverem declaradas são 
// automaticamente assumidas como default pela Win32prn().
*--------------------------------------
// LOCAL oPrinter := win32prn():new(getdefaultprinter())
// lembre-se que oPrinter é o objeto do documento da classe Win32prn() e você 
// não pode usar esta variável para arquivar o namo da impressora.  
// Alterei para cPrt e comentei pois usei só o PDFCreator.

// LOCAL cPrt := win32prn():new(getdefaultprinter())
*--------------------------------------
local Prn
// local nPrn:=1              // não usada.
local aPrn:= GetPrinters()

oPrinter:Landscape := .F.
oPrinter:FormType  := 9
oprinter:SetPrintQuality(-1) // qualidade da impressão
oPrinter:Copies    := 1

     if tampag = nil
        tampag := 58
     endif

     if cPrinter = "printfileraw"
        Prn:=getdefaultprinter()
        ret:=printfileraw(Prn,cArq)
        @ maxrow()-8,10 say 'retorno printfileraw: ' + str(ret) + '   ' + PRN + '  ' + carq
        return
     endif

if empty(aPrn)
    mens("NÆo encontrou impressoras instaladas....Favor Verificar a Impressora !!!") 
   return NIL
endif


IF ! oPrinter:Create()
   mens(cor5,"Atenção !!! O Sistema encontrou um Problema ao Tentar Executar Create().") 
   return NIL
endif
*--------------------------------------
// Abaixo a variável cArq deve conter o nome do arquivo que deve ser gravado, e não o
// nome do arquivo texto que se deseja imprimir.  Portanto vamos dar o nome de "Teste_11".
// O sufixo "pdf" será assumnido como default.

IF ! oPrinter:StartDoc( "Teste_11" )
   mens("Atenção !!! O Sistema encontrou um Problema ao Tentar executar StartDoc()") 
   return NIL
endif

oPrinter:SetDefaultFont()
if tamrel > 80
// oPrinter:setfont('Courier New',,17,,,,255)
   oPrinter:setfont(,,17,,,,255)
else
// oPrinter:setfont('Courier New',,11,,,,255)
   oPrinter:setfont(,,11,,,,255)
endif

// oPrinter:TextOut( space(tamrel), .T. )
// Não entendi a finalidade da linha acima.  Ela só vai imprimir em branco.

cTexto  := memoread( cArq )

// nLinhas := mlcount( cTexto, tamrel, 1, .F. )
nLinhas := mlcount( cTexto, tamrel, 1, .F. )
//nConta  := 0    // não é mais necessária.

for nA := 1 to nLinhas
   cLinha := memoline( cTexto, tamrel, nA, 1, .F. )

//   IF nCONTA = tampag
   IF oPrinter:prow() >= tampag        // eu prefiro assim. Usar os recurso da Classe.
      oPrinter:NewPage()
      oPrinter:Newline()
      oPrinter:Newline()
      oPrinter:Newline()
//      nConta  := 0
      oPrinter:TextOut( cLinha, .T. )     // faltou esta linha.
   else
      oPrinter:TextOut( cLinha, .T. )
   endif
//   nConta=nConta+1
next
oPrinter:EndDoc()
oPrinter:Destroy()
RETURN NIL
Espero que tenha ficado claro. Boa sorte.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Problema na impressao com PDFCREATOR

Mensagem por sygecom »

Fiz um pequeno ajuste no seu codigo, veja se resolve.

Código: Selecionar todos

    FUNCTION Imprime( cPrinter, cArq, tamrel, ver, tampag )
    ////////////////////////////////////////////////////////////////////////////////
    local cTexto, nLinhas, nA, cLinha, nB   // oPrinter := win32prn():New(cPrinter)
    LOCAL oPrinter := win32prn():new(getdefaultprinter())

    local Prn
    local nPrn:=1
    local aPrn:= GetPrinters()

    oPrinter:Landscape := .F.
    oPrinter:FormType  := 9
    oprinter:SetPrintQuality(-1) // qualidade da impressão
    oPrinter:Copies    := 1

         if tampag = nil
            tampag := 58
         endif

         if cPrinter = "printfileraw"
            Prn:=getdefaultprinter()
            ret:=printfileraw(Prn,cArq)
            @ maxrow()-8,10 say 'retorno printfileraw: ' + str(ret) + '   ' + PRN + '  ' + carq
            return
         endif

    if empty(aPrn)
        mens(cor5,"NÆo encontrou impressoras instaladas....Favor Verificar a Impressora !!!")
       return NIL
    endif

    if   ver

         fAbreJanela("Seleciona Impressora",18,15,25,85)

         do while !empty(nprn)
         //   cls
         //   @ 0,0 say 'Teste de classe Win32Prn(). Escolha a impressora. ESC p/sair'
         //   @ 1,0 to maxrow(), maxcol()
            nPrn := achoice(19,16,24,84,aPrn)
            if  lastkey() = 27
                fFechaJanela()
                return
            endif
            if !empty(nprn)
               oPrinter := win32prn():new(aPrn[nPrn])
               exit
            endif
         enddo

         fFechaJanela()

    endif

    IF !oPrinter:Create()
       mens(cor5,"Atenção !!! O Sistema encontrou um Problema ao Tentar Executar Create().")
       return NIL
    endif

    IF ! oPrinter:StartDoc(cArq)
       mens(cor5,"Atenção !!! O Sistema encontrou um Problema ao Tentar executar StartDoc()")
       return NIL
    endif

    oPrinter:SetDefaultFont()
    if tamrel > 80
    // oPrinter:setfont('Courier New',,17,,,,255)
       oPrinter:setfont(,,17,,,,255)
    else
    // oPrinter:setfont('Courier New',,11,,,,255)
       oPrinter:setfont(,,11,,,,255)
    endif

    oPrinter:TextOut( space(tamrel), .T. )
    cTexto  := memoread( cArq )
    nLinhas := mlcount( cTexto, tamrel, 1, .F. )
    nConta  := 0

    for nA := 1 to nLinhas
       cLinha := memoline( cTexto, tamrel, nA, 1, .F. )

       if (oPrinter:MaxRow()-2 ) <= oPrinter:Prow()
         oPrinter:NewPage()
         FOR TT=1 TO 2
            oPrinter:newline()
         NEXT
          nConta  := 0
      endif
      IF nCONTA = tampag
          oPrinter:NewPage()
          oPrinter:Newline()
          oPrinter:Newline()
          oPrinter:Newline()
          nConta  := 0
       else
          oPrinter:TextOut( cLinha, .T. )
       endif
       nConta=nConta+1
    next
    oPrinter:EndDoc()
    oPrinter:Destroy()
    RETURN NIL

Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder