PowerShell: Conversione di un file Word in PDF

Talvolta nasce la necessità di convertire file Word in PDF in modo automatizzato specialmente in combinazione con l’utilizzo di applicazioni gestionali. In questo caso se in tali applicazioni non è stata sviluppata una funzionalità per la conversione di file Word in PDF ci si ritrova a dover gestire in modo esterno all’applicazione la conversione in PDF.

Un approccio comune per la risoluzione di questa problematica è utilizzare un tool gratuito per la conversione, ma ciò comporta inevitabilmente alcune considerazioni quali le possibili limitazioni imposte dalla licenza d’utilizzo, la gestione dell’installazione e dell’aggiornamento del tool, la possibilità che tale tool introduca possibili bug durante la generazione del PDF e ovviamente, cosa decisamente più grave, che il tool introduca potenziali problemi di sicurezza. 

Un altro possibile approccio è utilizzare PowerShell per interfacciarsi con Microsoft Word e utilizzare in modo automatizzato la funzionalità per salvare un file Word in PDF.

PowerShell consente in fatti la Creazione di oggetti .NET e COM tramite l’uso del cmdlet New-Object e quindi è possibile creare un’istanza di Microsoft Word tramite il comando:

$Word = New-Object -ComObject Word.Application

Tramite l’istanza di Microsoft Word sarà poi possibile aprire il documento Word in modalità di sola lettura e generare un file PDF o un file PDF/A tramite i seguenti comandi:

$Document = $Word.Documents.Open($InputFile, $False, $True)

$Document.ExportAsFixedFormat($OutputFile, `
                [Microsoft.Office.Interop.Word.WdExportFormat]::wdExportFormatPDF, `
                $False, [Microsoft.Office.Interop.Word.WdExportOptimizeFor]::wdExportOptimizeForPrint, `
                [Microsoft.Office.Interop.Word.WdExportRange]::wdExportAllDocument, 0, 0, `
                [Microsoft.Office.Interop.Word.WdExportItem]::wdExportDocumentContent, `
                $True, $True, `
                [Microsoft.Office.Interop.Word.WdExportCreateBookmarks]::wdExportCreateNoBookmarks, `
                $True, $True, $PDFACompliant)

Per la generazione del file PDF o di un file PDF conforme a PDF/A è necessario utilizzare il metodo Document.ExportAsFixedFormat.

Terminata la conversione è importante chiudere il file tramite il metodo Document.Close e rilasciare il riferimento all’oggetto COM tramite il metodo Marshal.FinalReleaseComObject:

$Document.Close([Microsoft.Office.Interop.Word.WdSaveOptions]::wdDoNotSaveChanges)
[System.Runtime.Interopservices.Marshal]::FinalReleaseComObject($Document) | Out-Null
$Document= $null

Quindi chiudere l’istanza di Microsoft Word tramite il metodo Application.Quit e rilasciare il riferimento all’oggetto COM tramite il metodo Marshal.FinalReleaseComObject:

$Word.Quit()
[System.Runtime.Interopservices.Marshal]::FinalReleaseComObject($Word) | Out-Null
$Word = $null

Dopo aver rilasciato le risorse relative al file Word e all’istanza di Microsoft Word forza un’operazione di Garbage Collection tramite il metodo GC.Collect:

[GC]::Collect()

E infine attendere fino a che i finalizzatori degli oggetti rilasciati siano stati invocati tramite il metodo GC.WaitForPendingFinalizers:

[GC]::WaitForPendingFinalizers()

Per un esempio di questo approccio si veda lo script Convert-WordDocumentToPDF.ps1 che ho reso disponibile al seguente repository su GitHub PowerShell/Convert-WordDocumentToPDF at master · ermannog/PowerShell (github.com).