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.
Abaixo um print do relatório já convertido dentro de uma pasta dentro da Protheus Data.
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.


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.
Grande Jorge.
Obrigado pelo comentário jovem.
Um grande abraço.