首页 > 解决方案 > PDFCreator 在 PowerShell 中将 pdf 转换为 txt

问题描述

更新评论:我正在尝试使用 PDFCreator 通过 PowerShell 将 pdf 文件转换为 txt 文件,但它似乎仍然无法正常工作。

任何帮助表示赞赏!

$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()
  }
}

标签: powershellpdfcom

解决方案


你得到那个是因为$PJis $nullNextJob不返回任何东西。

为了防止这种情况,如果有工作到达,如果没有,则WaitForJob(int)返回一个布尔值,所以你应该知道完成后是否有工作要获得:$true$falseWaitForJob

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)
}

PDFCreator.JobQueue以下是有关API的更多信息,您可能会发现这些信息很有用。


为了解决您在评论中未生成文件的问题,文档的此页面解释了转换过程应如何工作的逻辑流程:

  1. Initialize()使用您的 COM 对象调用该方法。
  2. WaitForJob(timeOut)如果您正在等待一项打印作业进入队列,请致电。该参数timeOut指定队列等待打印作业到达的最长时间。
  3. 现在您可以通过调用属性来获得队列中的下一个作业NextJob
  4. 使用方法设置作业的配置文件SetProfileByGuid(guid)。guid 参数用于分配适当的转换配置文件。
  5. 使用 开始打印作业的转换ConvertTo(path)。path 参数包括应保存转换文件的位置的完整路径及其全名。
  6. 该属性IsFinished通知转换状态。如果打印作业完成,则IsFinished返回 true。
  7. 如果您想知道工作是否成功完成,请考虑属性IsSuccessful。如果作业转换成功,则返回 true,否则返回 false。

在您的情况下,我不确定配置文件的重要性,但看起来您的代码无法等待完成。以下代码将等待转换作业完成(如果需要,请检查是否成功):

# 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块都会运行。


推荐阅读