gravação de relatório em PDF

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

kakamachado
Usuário Nível 1
Usuário Nível 1
Mensagens: 30
Registrado em: 07 Mar 2016 18:54
Localização: Rio de Janeiro

gravação de relatório em PDF

Mensagem por kakamachado »

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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

gravação de relatório em PDF

Mensagem por JoséQuintas »

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 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/
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

gravação de relatório em PDF

Mensagem por Fernando queiroz »

Código: Selecionar todos

	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: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

gravação de relatório em PDF

Mensagem por Fernando queiroz »

Código: Selecionar todos

********************************************************
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
kakamachado
Usuário Nível 1
Usuário Nível 1
Mensagens: 30
Registrado em: 07 Mar 2016 18:54
Localização: Rio de Janeiro

gravação de relatório em PDF

Mensagem por kakamachado »

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

Código: Selecionar todos

*-------------------------------------------------*
* 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
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

gravação de relatório em PDF

Mensagem por rubens »

Boa tarde..

Dá uma olhada aqui kakamachado
https://pctoledo.org/forum/viewto ... sb#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ê ???"
Responder