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.