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).
1 commento su “PowerShell: Conversione di un file Word in PDF”