Hoje vamos responder a dúvida, se tem alguma forma de diminuir o tamanho de um arquivo PDF usando AdvPL.
Hoje, a dúvida foi feita pelo grande Caique, onde ele disse que na base dele, existem vários jobs que geram PDFs automaticamente.
Porém alguns relatórios acabam ficando muito grande, e se existe alguma forma de diminuir o tamanho desses arquivos.
Pensando nisso, fizemos esse tutorial, de como acionar o GhostScript via AdvPL para diminuir o tamanho de um arquivo PDF.
E abaixo o código fonte desenvolvido para exemplificar:
//Bibliotecas
#Include "TOTVS.ch"
/*/{Protheus.doc} User Function zVid0018
Exemplo acionando zPDFSize para diminuir arquivo
@type Function
@author Atilio
@since 07/03/2022
/*/
User Function zVid0018()
Local aArea := FWGetArea()
u_zPDFSize(;
"C:\Spool\teste2.pdf",; //Arquivo original
"C:\Spool\teste2_menor.pdf"; //Arquivo novo
)
FWRestArea(aArea)
Return
E abaixo o código fonte da função que aciona o GhostScript (zPDFSize):
//Bibliotecas
#Include "TOTVS.ch"
/*/{Protheus.doc} User Function zPDFSize
Função que diminui o tamanho de um pdf para enviar por e-Mail
@type Function
@author Atilio
@since 19/07/2021
@version version
@param cOrigFile, Caractere, Arquivo de origem junto com o caminho da pasta
@param cDestFile, Caractere, Arquivo de destino junto com o caminho da pasta
@example
u_zPDFSize(;
"C:\Spool\teste2.pdf",;
"C:\Spool\teste2_menor.pdf";
)
@obs É necessário ter instalado o GhostScript
Link para Download: https://ghostscript.com/releases/gsdnld.html
Não é indicado usar esse comando direto no servidor (via WaitRunSrv),
pois pode causar travamentos no AppServer (ficar aguardando terminar o script)
/*/
User Function zPDFSize(cOrigFile, cDestFile)
Local aArea := FWGetArea()
Local cComando := ""
Local cDir := GetTempPath()
Local cNomBat := "diminui_pdf.bat"
//Somente se existir o arquivo no local de origem
If File(cOrigFile)
//Monta o comando que será executado no GhostScript
cComando := '"C:\Program Files\gs\gs9.55.0\bin\gswin64.exe" -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile="' + cDestFile + '" "' + cOrigFile + '"'
//Gravando em um .bat o comando
MemoWrite(cDir + cNomBat, cComando)
//Executando o comando através do .bat
ShellExecute("OPEN", cDir + cNomBat, "", cDir, 0 )
EndIf
FWRestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Daniel, o Ghostscript funciona muito bem. Eu já o uso em uma rotina que envia pdf por e-mail a mais de 3 anos e consegui fazer isso usando a técnica que explicou como fazer chamada de um comando em post anterior.
Opa, obrigado pelo comentário e feedback Jorge.
Sim, o Ghostscript é uma mão na roda.
Um grande abraço.