powershell - 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()
}
}
解决方案
你得到那个是因为$PJ
is $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)
}
PDFCreator.JobQueue
以下是有关API的更多信息,您可能会发现这些信息很有用。
为了解决您在评论中未生成文件的问题,文档的此页面解释了转换过程应如何工作的逻辑流程:
Initialize()
使用您的 COM 对象调用该方法。WaitForJob(timeOut)
如果您正在等待一项打印作业进入队列,请致电。该参数timeOut
指定队列等待打印作业到达的最长时间。- 现在您可以通过调用属性来获得队列中的下一个作业
NextJob
。- 使用方法设置作业的配置文件
SetProfileByGuid(guid)
。guid 参数用于分配适当的转换配置文件。- 使用 开始打印作业的转换
ConvertTo(path)
。path 参数包括应保存转换文件的位置的完整路径及其全名。- 该属性
IsFinished
通知转换状态。如果打印作业完成,则IsFinished
返回 true。- 如果您想知道工作是否成功完成,请考虑属性
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
块都会运行。
推荐阅读
- android - Firebase Test Lab for Instrumentation Lab on Flutter - “上传的测试 APK 不包含清单文件中指定的测试运行器类。”
- java - Android 应用内更新实现的位置
- css - 每行的 CSS 网格控件项目数
- jmeter - 如何在 jmeter 和 burp 之间设置代理。因为我想从 jmeter 发送 burp 目标部分中的所有 apies
- reactjs - React Signalr 访问状态变量
- regex - 使用 htacesss 重写 URL 和重定向基本 url
- android - 我可以在android自定义枚举属性中使用代码中的枚举吗?
- python-3.x - 使用 split() 消除元素之间的空间
- reactjs - 在反应中访问事件处理程序内部的 JSON 属性时,我得到未定义
- c# - WPF 在 `ItemsControl` 内的控件中定义 DataContext