PDFCreator для преобразования PDF в TXT в PowerShell - PullRequest
1 голос
/ 27 февраля 2020

Обновленный комментарий: я пытаюсь использовать PDFCreator для преобразования pdf-файлов в txt-файлы через PowerShell, но он все еще не работает.

Любая помощь приветствуется!

$PDFCreator = New-Object -ComObject PDFCreator.JobQueue
$PDF = 'C:\Users\userName\Downloads\SampleACORD.pdf'
$TXT = 'C:\Users\userName\Downloads\SampleACORD.txt'

try {
$PDFCreator.initialize()


  if($PDFCreator.WaitForJob(5)){
  $PJ = $PDFCreator.NextJob
  }

  if($PJ){
  $PJ.PrintFile($PDF)
  $PJ.ConvertTo($TXT)
  }
} catch {
    $_
    Break
}   
finally {
  if($PDFCreator){
    $PDFCreator.ReleaseCom()
  }
}

1 Ответ

0 голосов
/ 27 февраля 2020

Вы получаете это, потому что $PJ - это $null. NextJob ничего не возвращает.

Чтобы защититься от этого, WaitForJob(int) возвращает логическое значение, $true, если работа пришла, и $false, если нет, поэтому вы должны знать, когда WaitForJob завершится есть ли работа для получения или нет:

if( $PDFCreator.WaitForJob(5) ){
  $PJ = $PDFCreator.NextJob

  $PJ.allowDefaultPrinterSwitch('C:\Users\userName\Downloads\SampleACORD.txt', $true)
  $PJ.ConvertTo($TXT)
} else {
  # Handle the no jobs case here
}

Вы также можете сделать нулевую проверку против $PJ, прежде чем пытаться позвонить $PJ.allowDefaultPrinterSwitch:

if( $PJ ){
  $PJ.allowDefaultPrinterSwitch('C:\Users\userName\Downloads\SampleACORD.txt', $true)
  $PJ.ConvertTo($TXT)
}

Вот некоторые дополнительная информация об API PDFCreator.JobQueue, которая может оказаться вам полезной.


Для решения вашей проблемы в комментариях, где файл не создается, это Страница документации объясняет логический ход процесса конвертации:

  1. Вызовите метод Initialize() с вашим COM-объектом.
  2. Вызов WaitForJob(timeOut), если вы ожидаете, что одно задание на печать попадет в очередь. Параметр timeOut указывает максимальное время, в течение которого очередь ожидает поступления задания на печать.
  3. Теперь вы можете получить следующее задание в очереди, вызвав свойство NextJob.
  4. Запустите преобразование в задании печати с помощью ConvertTo(path). Параметр path включает полный путь к папке, в которой должен быть сохранен преобразованный файл, и его полное имя.
  5. Свойство IsFinished сообщает о состоянии преобразования. Если задание на печать выполнено, IsFinished возвращает значение true.
  6. Если вы хотите узнать, было ли задание выполнено успешно, рассмотрите свойство IsSuccessful. Он возвращает true, если задание было успешно преобразовано, иначе false.

В вашем случае я не уверен, насколько важен профиль, но похоже, что ваш код не ждет для завершения. Следующий код будет ожидать завершения задания преобразования до sh (и при необходимости проверить его на успешность):

# Wait for completion
while( -Not $PJ.IsFinished ){
  Start-Sleep -Seconds 5
}

# Check for success
if( $PJ.IsSuccessful ){
  # success case
} else {
  # failure case
}

Не имеет значения, но рекомендуется использовать код в try/finally и поместите ваш COM-релиз в этот блок. Таким образом, ваше COM-соединение закрывается чисто даже в случае завершающей ошибки:

$PDFCreator = New-Object -ComObject PDFCreator.JobQueue

try {

  # Handle PDF creator calls

} finally {
  if( $PDFCreator ){
    $PDFCreator.ReleaseCom()
  }
}

Блок finally гарантированно будет выполнен перед возвратом в родительскую область, поэтому, если код завершится успешно или не удастся, finally блок будет запущен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...