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.