Eu tenho o seguinte script do PowerShell para converter uma pasta de arquivos docx em pdf:
param (
[string]$folder = '.'
)
Add-type -AssemblyName Microsoft.Office.Interop.Word
$word_app = New-Object -ComObject Word.Application
$word_app.visible = $false
Get-ChildItem -Path "$folder\Output" -Filter *.pdf | ForEach-Object {
remove-item $_.FullName
}
Get-ChildItem -Path "$folder\Input" -Filter *.docx | ForEach-Object {
$document = $word_app.Documents.Open($_.FullName)
# Remove spaces in the name as we're uploading this to the web
$filename = $_.BaseName -replace ' ',''
$pdf_filename = "$($folder)\Output\$($filename).pdf"
$document.SaveAs([ref] $pdf_filename, [ref] 17)
$document.Close()
}
$word_app.Quit()
Isso funcionou bem no Windows 7 (64 bits) com o Office 2010 (32 bits).
Desde então, tenho uma nova máquina com o Windows 8.1 (64 bits) e o Office 2013 (32 bits) instalados. Agora, quando tento executar o script, recebo erros na linha SaveAs
. O primeiro erro foi que ele disse que o modificador [ref]
nos argumentos não era necessário. Então eu mudei essa linha para:
$document.SaveAs($pdf_filename, 17)
No entanto, isso agora é um erro com o seguinte:
Exception calling "SaveAs" with "2" argument(s): "Command failed"
At D:\Documents\User Guides\ConvertToPDF.ps1:31 char:5
+ $document.SaveAs($pdf_filename, 17)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation
Não há outra indicação do que está errado. A pasta de saída existe e é gravável. Eu adicionei código para percorrer a estrutura de erro e a exceção interna é:
Message: Command Failed
ErrorCode: 800A1066 (-2146824090)
O que parece indicar algum tipo de falha de COM.
Eu também tentei
$document.ExportAsFixedFormat($pdf_filename, 17)
mas isso me dá
Exception calling "ExportAsFixedFormat" with "2" argument(s): "The directory name is not valid."
At D:\Documents\User Guides\ConvertToPDF.ps1:33 char:5
+ $document.ExportAsFixedFormat($pdf_filename, 17)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation
Apesar do fato de o nome do diretório ser válido.
Eu pesquisei on-line, mas todas as páginas que encontrei indicaram que isso é tudo que preciso fazer.
A única outra coisa que acabei de pensar é que posso estar usando uma versão superior do PowerShell do que antes - embora eu realmente não veja como isso afetaria as coisas.
O que estou perdendo?