Como gerar um PDF de um Word via AdvPL

No artigo de hoje vamos demonstrar em como imprimir / criar um arquivo PDF através de um arquivo do Word via AdvPL.

A lógica para fazer esse procedimento é a seguinte:

  • Deixe o arquivo do Word em alguma pasta local que o usuário tenha acesso (no nosso exemplo vai ser C:\TOTVS\modelo.docx)
  • Defina o nome e o caminho do arquivo pdf (no nosso caso vai ser C:\spool\teste.pdf)
  • Acione a integração com o Word através das funções OLE_*
  • Abra o arquivo e acione a impressão através do SaveAsFile

 

Abaixo o código funcionando conforme lógica explicada acima:

//Bibliotecas
#Include "TOTVS.ch"
#Include "MSOle.ch"

/*/{Protheus.doc} User Function zDocPdf
Exemplo de geração de PDF a partir de um documento do Word
@type  Function
@author Atilio
@since 07/10/2022
/*/

User Function zDocPdf()
    Local aArea      := FWGetArea()
    Local nHandWord  := 0
    Local cPastaOrig := "C:\TOTVS\"
    Local cArquiOrig := "modelo.docx"
    Local cPastaDest := "C:\spool\"
    Local cArquiDest := "teste.pdf"

    //Inicializa a integração com Microsoft Office, para permitir execução de macros internas
    BeginMsOle()

    //Cria o ponteiro na memória com o Word (somente se houver instalado o word na máquina)
    nHandWord := OLE_CreateLink()
	If nHandWord != "-1"
	
		//Abre o arquivo de Origem
		OLE_SetPropertie(nHandWord, .F.)
		OLE_SetProperty(nHandWord, oleWdVisible, .F.)
		OLE_OpenFile(nHandWord, cPastaOrig + cArquiOrig)

		//Gera o PDF do documento
		OLE_SetProperty(nHandWord,'208',.F.)
		OLE_SaveAsFile( nHandWord, cPastaDest + cArquiDest, , , .F., 17 )

		//Fecha o arquivo, aguarda 1 segundo para a geração do pdf e encerra o ponteiro em memória
		OLE_CloseFile(nHandWord)
		Sleep(1000)
		OLE_CloseLink(nHandWord)
		
	EndIf

    //Encerra a integração com Microsoft Office
    EndMsOle()

    FWRestArea(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.

Deixe uma resposta

Terminal de Informação