Função para converter imagens em PDF via AdvPL

Olá pessoal…

Hoje vou mostrar como converter (transformar) imagens para arquivos com extensão pdf em AdvPL, ideal para geração de relatórios TMSPrinter, que geram imagens em jpg.


Primeiramente instale e configure o ImageMagick (leia Como converter imagens para .pdf utilizando o Prompt de Comando) no servidor que está instalado o Protheus.

Agora quando for imprimir um relatório em TMSPrinter, utilize o método SaveAllAsJpeg, e chame a rotina para gerar os pdfs:

	//Salvando todas as páginas em JPEG
	oPrintPvt:SaveAllAsJpeg("\x_tst\relatorio_tst", 1250, 2000, 200)
	
	//Agora chama a função de transformação de JPEG em PDF
	u_zTransPDF("\x_tst\", "relatorio_tst*.jpg")

A rotina zTransPDF, recebe até 3 parâmetros, o primeiro o diretório é o diretório que contém os arquivos a serem convertidos (o diretório tem que ser dentro da Protheus Data), o segundo parâmetro é o filtro do nome dos arquivos (por exemplo, *.jpg), e o terceiro é opcional que define se será excluído as imagens após converter.

Abaixo um print do relatório original pelo Protheus.

Relatório no Protheus pelo TMSPrinter

Relatório no Protheus pelo TMSPrinter

Abaixo um print do relatório já convertido dentro de uma pasta dentro da Protheus Data.

Relatório convertido para PDF

Relatório convertido para PDF

Abaixo o código fonte completo (ressalto que, se você instalou o ImageMagick em outro diretório, altere a variável cDirMagic):

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zTransPDF
Função que converte imagens para pdf (como as geradas pelo TMSPrinter)
@type function
@author Atilio
@since 11/09/2016
@version 1.0
@param cDirect, character, Diretório das imagens (dentro da Protheus_Data)
@param cArqs, character, Arquivos com a extensão desejada (por exemplo, jpg)
@param lExcImg, lógico, Define se irá excluir as imagens após transformar em pdf
@example
	u_zTransPDF("\_diretorio\", "arquivos*.jpg")
	
	//ou
	
	//Salvando todas as páginas em JPEG
	oPrintPvt:SaveAllAsJpeg("\x_tst\relatorio_tst", 1250, 2000, 200)
	
	//Agora chama a função de transformação de JPEG em PDF
	u_zTransPDF("\x_tst\", "relatorio_tst*.jpg")
/*/

User Function zTransPDF(cDirect, cArqs, lExcImg)
	Local aArea     := GetArea()
	Local cDirMagic := "C:\Program Files\ImageMagick-7.0.2-Q16\"
	Local cComando  := ""
	Local cDirSrv   := Alltrim(GetSrvProfString("RootPath",""))
	Local aDados    := {}
	Local nAtual    := 0
	Default cDirect := ""
	Default cArqs   := ""
	Default lExcImg := .T.
	
	//Se tiver diretório e arquivos
	If !Empty(cDirect) .And. !Empty(cArqs)
		cDirect := Lower(cDirect)
		cArqs   := Lower(cArqs)
		
		//Definindo o comando para converter a imagem
		cComando := "mogrify -format pdf "+cDirSrv+cDirect+cArqs
		
		//Executando o comando no servidor
		WaitRunSrv(cDirMagic+cComando, .T., cDirMagic)
		
		//Se tiver que excluir as imagens
		If lExcImg
			aDados := Directory(cDirect+cArqs)
			
			//Percorre todos os arquivos de imagem
			For nAtual := 1 To Len(aDados)
				FErase(cDirect+aDados[nAtual][1])
			Next
		EndIf
	EndIf
	
	RestArea(aArea)
Return

Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. Jorge Orlando disse:

    Obrigado!

    Com o imagemagick eu tinha desenvolvido um script em bash para alterar algumas imagens e transformar em pdf, é incrível o que é possível fazer com ele.
    Agora que vi seu guia, coloquei o que fazia em bash no advpl.

Deixe uma resposta para Dan_AtilioCancelar resposta

Terminal de Informação