Página 1 de 1

gravação de relatório em PDF

Enviado: 09 Out 2019 11:55
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

gravação de relatório em PDF

Enviado: 09 Out 2019 18:32
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.

gravação de relatório em PDF

Enviado: 09 Out 2019 23:52
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 :)) :)) :))

gravação de relatório em PDF

Enviado: 09 Out 2019 23:57
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

gravação de relatório em PDF

Enviado: 10 Out 2019 12:32
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

gravação de relatório em PDF

Enviado: 11 Out 2019 14:57
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