Comprimir um arquivo PDF via AdvPL | Ti Responde 018

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.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

2 Responses

  1. 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.

Deixe uma resposta