更新评论:我尝试使用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()
}
}发布于 2020-02-27 16:12:12
你会明白这一点,因为$PJ是$null。NextJob什么也不回。
为了防止这种情况,WaitForJob(int)返回一个bool,如果一个任务到达$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()方法。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块都将被运行。
https://stackoverflow.com/questions/60437107
复制相似问题