Clipper On Line • Ver Tópico - gravação de relatório em PDF

gravação de relatório em PDF

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

gravação de relatório em PDF

Mensagempor kakamachado » 09 Out 2019 11:55

Bom dia a todos. Migrei há algum tempo meus sistemas em Clipper para xHarbour/Minigui. Estou no momento necessitando gerar alguns relatórios (tipo extrato dos clientes) em PDF, gravando-os em disco, para posterior envio dos mesmos por email. Pesquisando no forum não encontrei uma solução para esta demanda. Alguém teria alguma solução?
Seria como se usasse uma impressora virtual tipo CUTEPDF mas sem que fosse aberta a janela para indicar o local de gravação, nome do arquivo, etc. Desde já, obrigado
kakamachado
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 28
Data de registro: 07 Mar 2016 18:54
Cidade/Estado: Rio de Janeiro
Curtiu: 0 vez
Mens.Curtidas: 0 vez

gravação de relatório em PDF

Mensagempor JoséQuintas » 09 Out 2019 18:32

Bom....
Fiz o que pude pra isolar do meu aplicativo tempos atrás...

PDFClass

Tá no GitHub.
Pesquisar: PDFClass ou josequintas

Gravar em disco?
Manda direto pelo Harbour.
E como pode gerar quando quiser.... pra que guardar PDF disso.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

gravação de relatório em PDF

Mensagempor Fernando queiroz » 09 Out 2019 23:52

   oPDF := PDFClass()
   IF oPDF == NIL
      hwg_msginfo("Falha da criação do objeto PDF")
      RETURN .F.
   ENDIF
   oPDF:cFileName    := 'C:\TEMP\RELATORIO.PDF'
   IF ! oPDF:PrintOptions(  ); RETURN NIL; ENDIF   

   IF  oPDF:nPrinterType ==  PDFCLASS_LANDSCAPE
   
      oPDF:Begin()
      oPDF:nPageHeight :=  440
      oPDF:AddPage()
      
      nMaxCol := oPDF:MaxCol()
      nMaxRow := oPDF:MaxRow()

      oPDF:DrawBox( 0, 0, 9, 41, Nil, Nil, Nil )                 // box esquerdo
      oPDF:DrawImageSize( 0.5, 0.5, 8, 39, "logotipo.jpg" )             // logotipo

      oPDF:DrawBox( 0, 41, 9, 117, Nil, Nil, Nil )  // box centro
      oPDF:DrawText( 2.0, 42, RTRIM(FLAG->n_xNome), nil, 10, "Helvetica-Bold", Nil, Nil )
      oPDF:DrawText( 3.5, 42, RTRIM(FLAG->n_xLgr) + ', ' + RTRIM(FLAG->n_nro), Nil, 8, "Helvetica", Nil, Nil )
      oPDF:DrawText( 5.0, 42,'BAIRRO - ' + RTRIM(FLAG->n_xBairro), Nil, 8, "Helvetica", Nil, Nil )
      oPDF:DrawText( 6.4, 42, "CEP " +FLAG->n_CEP + ' - ' + RTRIM(FLAG->n_xMun) + ' - ' + FLAG->n_xUF + " - FONE: " +FLAG->n_fone, Nil, 8, "Helvetica", Nil, Nil )
      oPDF:DrawText( 8.0, 42, 'CNPJ-'+RTRIM(FLAG->n_CNPJ) + '   Insc.Est.-' + RTRIM(FLAG->n_IE) , Nil, 10, "Helvetica-Bold", Nil, Nil )

      oPDF:DrawBox( 0, nMaxCol, 9, 41, Nil, Nil, Nil )  // box direito
      oPDF:DrawText( 1.5, 120, "RECIBO Nr.:", Nil, 10, "Helvetica", Nil, Nil )

      oPDF:DrawBox( 3, nMaxCol-3, 6, nMaxCol-31, Nil, Nil, Nil )  // box id pedido
      oPDF:DrawText( 5.5,125, M->NUMDOC , Nil, 18, "Helvetica", Nil, Nil )      
      
      oPDF:DrawBox( 9, 0, 100, nMaxCol, Nil, Nil, Nil )
      
      oPDF:DrawText( 14, 2,'RECIBO DE PAGAMENTO DE VALE' , nil, 16, "Helvetica-Bold", Nil, Nil )
      
      oPDF:DrawBox( 10, (nMaxCol/3)*2, 15, nMaxCol-2, Nil, Nil, Nil )   
      oPDF:DrawText( 14, ((nMaxCol/3)*2)+2,'R$  ' + transform(m->valor,"**,***,***,**9.99"), nil, 16, "Helvetica-Bold", Nil, Nil )
      
      oPDF:DrawText( 18, 2, 'Adiantamos ao Vendedor: ' , Nil, 12, "Helvetica-Bold", Nil, Nil )
      oPDF:DrawText( 20, 2, STRZERO(VENDEDOR->CODVEN,4,0)+"-"+RTRIM(SUBSTR(VENDEDOR->NOMVEN,1,42)) , Nil, 12, "Helvetica", Nil, Nil )
      
      oPDF:DrawText( 22, 2, 'A importância de: R$ ' + transform(m->valor,"**,***,***,**9.99") , Nil, 12, "Helvetica-Bold", Nil, Nil )
      extenso:=ext(M->VALOR,80)
      
      oPDF:DrawText( 24, 2, left(extenso,80) , Nil, 12, "Helvetica", Nil, Nil )
      
      nLinha := 26
      IF ! EMPTY(substr(extenso,81,80))
         oPDF:DrawText( 26, 2, substr(extenso,81,80) , Nil, 12, "Helvetica", Nil, Nil )
         nLinha := 28
         IF ! EMPTY(right(extenso,80))
            oPDF:DrawText( 28, 2, right(extenso,80) , Nil, 12, "Helvetica", Nil, Nil )
            nLinha := 30
         ENDIF
      ENDIF
      oPDF:DrawText( nLinha, 2, "Referente a(o):", Nil, 12, "Helvetica-Bold", Nil, Nil )   
      nLinha += 2
      oPDF:DrawText( nLinha, 2, m->histor, Nil, 12, "Helvetica", Nil, Nil )      
      nLinha += 2
      oPDF:DrawLine( nLinha, 2, 90, nMaxCol-2, 1 )
      
      oPDF:DrawText( 97, 2, RTRIM(FLAG->n_xMun) +', ' + DTOC(DAT_HOJE)+" - "+TIME() , Nil, 12, "Helvetica", Nil, Nil )
      
//      oPDF:DrawBox( 97, (nMaxCol/3)*2, 97, nMaxCol-2, Nil, Nil, Nil )
      oPDF:DrawLine( 97, (nMaxCol/3)*2, 97,  nMaxCol-2, 1 )
      oPDF:DrawText( 98, (nMaxCol/3)*2, "Assinatura:", Nil, 8, "Helvetica", Nil, Nil )   
      
      oPDF:End(  )


pequeno relatório usando a PDFClass do Quintas
agora gerar PDF ta mamão com açúcar :)) :)) :))
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Fernando queiroz
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 737
Data de registro: 12 Nov 2014 23:41
Cidade/Estado: Porto Alegre/RS
Curtiu: 12 vezes
Mens.Curtidas: 58 vezes

gravação de relatório em PDF

Mensagempor Fernando queiroz » 09 Out 2019 23:57

********************************************************
STATIC FUNCTION OKENVIAEMAIL( me_eMAIL )
********************************************************
      if me_eMAIL == ""
         hwg_MsgInfo("O RECIBO NAO PODE SER ENVIADO POR FALTA DE UM E-MAIL  "+ HB_EOL())
         RETURN NIL
      endif
      
      me_eMAIL   := LOWER(me_eMAIL)
      
      lSucesso    := .F.

      cFrom        := "seuemail@gmail.com"
      cPassword   := "suasenha"
      cTo         := me_eMAIL
      cHost       := "google"

      cSubject := "SGC - RECIBO DE PAGAMENTO"
      cBody    := "Enviado por: " + HB_EOL() +;
                          FLAG->n_xFant+ HB_EOL() +;
                          FLAG->n_xNome + HB_EOL() + HB_EOL() +;
               "para: " + HB_EOL() + ;
                          RTRIM(PAGAR->NRAZ_SOC) + HB_EOL() +;
                          "DOCUMENTO: " + RTRIM(PAGAR->NUMDOC) + HB_EOL() +;
                          "VALOR  R$: " +  LTRIM(STR(PAGAR->VALOR,14,2)) + HB_EOL()+ HB_EOL() +;
               "Obs: E-mail enviado automaticamente por SGC-SISTEMA DE GESTAO DE COMERCIO, nao responda."
      
      aFilesAttch := {cArquivoPDF := "PDFPAGAR\" + PAGAR->UFORNEC + ltrim(SUBSTR(PAGAR->NUMDOC,1,14) + "_" + SUBSTR(PAGAR->NUMDOC,16,2)) + ".PDF"}
      
      lSucesso := Email_Envia( cFrom, cPassword, cTo, cHost, aFilesAttch, cBody, cSubject )
      IF ! lSucesso
         hwg_MsgInfo("E-MAIL NAO FOI ENVIADO"+ HB_EOL() )
      ELSE
         hwg_MsgInfo("E-MAIL FOI ENVIADO COM SUCESSO"+ HB_EOL() )
      ENDIF
            

RETURN NIL


estou usando assim para enviar os recibos para o fornecedor
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Fernando queiroz
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 737
Data de registro: 12 Nov 2014 23:41
Cidade/Estado: Porto Alegre/RS
Curtiu: 12 vezes
Mens.Curtidas: 58 vezes

gravação de relatório em PDF

Mensagempor kakamachado » 10 Out 2019 12:32

Bom dia a todos. Ao Fernando, Quintas e Hazael, obrigado pelas respostas, vou pesquisar e testar as alternativas apresentadas. Mas pelo que entendi, ou usando a classe PDFClass ou a HaruPDF, terei que reescrever as rotinas de emissão, já que uso a Hbprint, que me permite usar os comandos de impressão como se fosse o clipper. Coloquei abaixo trecho de um programa de emissão de um relatório para vocês verem como faço.
Atualmente quando quero gerar o relatório em PDF, seleciono a impressora virtual CUTEPDF Writer e salvo o relatório em uma pasta qualquer, o que me permite consulta-lo a qualquer momento ou enviar por email. O problema é que ao clicar no botão de IMPRIMIR da aplicação, é aberta uma janela onde são exibidos o nome do relatório (que será o nome do arquivo PDF), a pasta de gravação e o formato do arquivo, campos estes que podem ser alterados neste momento e então tenho que clicar no botão SALVAR desta janela para que o arquivo PDF seja gravado.
Se eu conseguisse direcionar a impressão para uma impressora virtual como a CUTEPDF, sem que esta janela fosse aberta, já que o nome do arquivo e a pasta de gravação já estão definidos, seria a solução ideal, pois não teria que alterar nem uma linha do meu sistema.
Alguém sabe como fazer isto? Obrigado

*-------------------------------------------------*
* OBTEM DADOS DA TELA CONFORME O RELATORIO PEDIDO *
*-------------------------------------------------*
PROCEDURE P242_EXEC (lpreview)

WORIENTA := "P"   // PORTRAIT
WPAPEL   := "A4"  // A4
WPAGINA  := 0

INIT PRINTSYS
SET THUMBNAILS ON

IF  form_P242.combo_printer.ItemCount=0 .OR. ;
    form_P242.combo_printer.Value<=0 .OR. ;
    form_P242.combo_printer.Value>form_P242.combo_printer.ItemCount
    MSGSTOP("Não existem impressoras instaladas","Erro")
    release printsys
    RETURN nil
ENDIF

IF  lpreview
    SELECT PRINTER form_P242.combo_printer.Item(form_P242.combo_printer.Value) PREVIEW
ELSE
    SELECT PRINTER form_P242.combo_printer.Item(form_P242.combo_printer.Value)
ENDIF

RDEFFONT()           // define as fontes disponiveis

select font "F10T"   // Times 10
select pen "p0"
Set Page orientation DMORIENT_PORTRAIT papersize DMPAPER_LETTER

START DOC NAME "Emissão de Listagens de Empresas"

DO  P242_IMP_FUNC_RUBRICAS

END DOC

set page orientation DMORIENT_PORTRAIT papersize DMPAPER_A4 font "F12T"

RELEASE PRINTSYS

RETURN

*-------------------------------------*
* IMPRESSAO DO FUNCIONARIO vs RUBRICA *
*-------------------------------------*
PROCEDURE P242_IMP_FUNC_RUBRICAS

IF  WPAGINA = 0
    DO  P242_CABECALHOS_DIVERSOS
ELSE
    IF  WLINHA > 260
        END PAGE
        DO  P242_CABECALHOS_DIVERSOS
    ENDIF
ENDIF

select font "F07C"
WLINHA = WLINHA + 4
@ WLINHA,012 SAY TRANSFORM(WFU_MAT, "@R 9999-999-9") + " " + WFU_NOME TO PRINT
@ WLINHA,078 SAY WFU_ST_ATIV                       TO PRINT
SET TEXT ALIGN RIGHT
@ WLINHA,097 SAY TRANSFORM(WFU_DA_ADM , "@R 99/99/9999")   TO PRINT
SET TEXT ALIGN LEFT
@ WLINHA,102 SAY SUBSTR(WDE_CAR,1,15)              TO PRINT
SET TEXT ALIGN RIGHT
@ WLINHA,135 SAY TRANSFORM(WFU_CO_SIN,"@R 99-9")   TO PRINT
SET TEXT ALIGN LEFT
IF  WOP_RUBR = "1"
    SELECT 09
    DO  WHILE (TR_MAT + TR_CODIGO) = (WFU_MAT + WCOD_RUBR) .AND. .NOT. EOF()
        SET TEXT ALIGN RIGHT
        @ WLINHA,141 SAY TRANSFORM(TR_TIPO, "@! X")         TO PRINT
        @ WLINHA,153 SAY TRANSFORM(TR_QTD , "999.99")       TO PRINT
        @ WLINHA,167 SAY TRANSFORM(TR_PER , "999.99")       TO PRINT
        @ WLINHA,182 SAY TRANSFORM(TR_REF , "@R 99/9999")   TO PRINT
        @ WLINHA,198 SAY TRANSFORM(TR_VAL , "999999999.99") TO PRINT
        SET TEXT ALIGN LEFT

        && VERIFICA SE TEM OUTRAS TRANSACOES COM O MESMO CODIGO
        SKIP
        WLINHA = WLINHA + 4
        LOOP
    ENDDO
ENDIF

RETURN
kakamachado
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 28
Data de registro: 07 Mar 2016 18:54
Cidade/Estado: Rio de Janeiro
Curtiu: 0 vez
Mens.Curtidas: 0 vez

gravação de relatório em PDF

Mensagempor rubens » 11 Out 2019 14:57

Boa tarde..

Dá uma olhada aqui kakamachado
http://www.pctoledo.com.br/forum/viewtopic.php?f=4&t=18184&p=114739&hilit=lpt1+usb#p114739
Não é tão sofisticado quanto a PDFclass do Quintas...
Com essas rotinas quando você escolhe a impressora é ajustado automaticamente para a impressão direto na impressora (caso a impressora seja matricial) ou gerado um pdf e exibe o pdf na tela para imprimir em qualquer impressora, laser ou jato de tinta.
Não precisa mudar ou criar novos relatórios. É usado o mesmo arquivo txt tanto para matricial quanto para laser/jato de tinta.

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar de usuário

rubens
Colaborador

Colaborador
 
Mensagens: 1518
Data de registro: 16 Ago 2003 09:05
Cidade/Estado: Nova Xavantina - MT
Curtiu: 77 vezes
Mens.Curtidas: 104 vezes




Retornar para MiniGui

Quem está online

Usuários vendo este fórum: BlazeBolt12 e 6 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro