Erro ao tentar salvar o documento do Word como PDF no script do PowerShell

5

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?

    
por ChrisF 26.06.2015 / 11:20

1 resposta

1

O problema foi com o caminho para o arquivo pdf.

Eu estava especificando que o script procure na pasta atual passando "." então o nome da saída era:

.\Output\Example.pdf

quando adicionei a linha:

$fullFolder = Resolve-Path -Path $folder

e, em seguida, usou $fullFolder em vez de $folder o SaveAs funcionou conforme o nome do arquivo de saída se tornou:

D:\Documents\User Guides\Output\Example.pdf

Eu encontrei isso tentando SaveAs um documento do Word na mesma pasta que o pdf para ver se estava tendo problemas para acessar a pasta. Isso voltou com o erro:

Exception calling "SaveAs" with "2" argument(s): "This is not a valid file name.
Try one or more of the following:
* Check the path to make sure it was typed correctly.
* Select a file from the list of files and folders."

Isso me levou a verificar o caminho, pois o nome real do arquivo não podia ser inválido, pois era o mesmo que o nome do arquivo de entrada.

    
por 26.06.2015 / 18:07