4

我在一个由 PHP 脚本调用的批处理文件中有以下代码shell_exec()

"C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe" 
/t "D:\xampp\htdocs\instrument\app\webroot\Repair Tickets\%1.pdf"
\\hnurenfp01\Accounts_FS-1128MFP

参数 %1 是作为参数从 PHP 脚本发送到批处理文件的文件名。

观察到的行为:

  • PHP页面成功调用具有正确参数的批处理文件
  • AcroRd32.exe 的两个实例在服务器上静默启动
  • PDF 文件打印到网络打印机
  • AcroRd32.exe 实例不结束/关闭
  • 批处理文件继续运行(直到手动结束 AcroRd32.exe 进程)
  • PHP 脚本一直在执行,因此阻止客户端机器做任何进一步的事情

预期行为:

  • PHP页面成功调用具有正确参数的批处理文件
  • AcroRd32.exe 的两个实例在服务器上静默启动
  • PDF 文件打印到网络打印机
  • AcroRd32.exe 实例结束/关闭
  • 批处理脚本完成(这反过来应该释放 PHP 脚本)
  • PHP 脚本继续并最终结束以允许最终用户继续他们的工作

失败的解决方案:

  • 在批处理文件中使用 TASKKILL 在打印后结束 AcroRd32.exe 进程,但 AcroRd32.exe 保持打开状态,即使使用 /F(强制)标志也是如此。当我手动结束 AcroRd32.exe 进程时,批处理文件继续执行,然后执行 TASKKILL 行,这当然会返回“找不到进程”错误,因为它不再存在。所以看起来控件在打印后没有返回到批处理文件,它仍然保留在 AcroRd32.exe 中。

有没有人知道如何在 PDF 打印后关闭 Adob​​e Reader?

4

1 回答 1

3

我在http://www.robvanderwoude.com/commandlineswitches.php#Acrobat找到了以下引用

静默打印 PDF 文件:

AcroRd32.exe /N /T PdfFile PrinterName [ PrinterDriver [ PrinterPort ] ]
最后一个命令将打开一个新的 Adob​​e Reader 窗口,打印 PDF 文件,然后终止其窗口,除非该窗口恰好是剩下的唯一 Adob​​e Reader 窗口:至少一个 Adob​​e Reader 窗口将保持打开状态。

最后一句话是个坏消息。

您可以通过 START 命令调用带有 /N 和 /T 选项的 AcroRD32.exe,然后您的批处理文件可以在打印作业执行时立即继续。如果您不介意阅读器的一个实例保持打开状态,那么您就完成了。

如果您必须关闭阅读器,那么您的批次将不得不杀死它。但我不确定您的批处理文件如何判断打印作业何时完成。您可以使用 TIMEOUT 引入任意延迟,但这听起来很冒险。

我对打开的“AcroRd32.exe 的两个实例”有点困惑。如果这是程序的工作方式,那么听起来 /N 开关将关闭 2 个实例中的 1 个。您的批处理可以通过 START 启动打印作业,延迟几秒钟以使打印作业进程有时间启动,然后使用 TASKLIST|FINDSTR 来监控循环中的 AcroRd32.exe 进程的数量。当计数从 2 变为 1 时,打印作业应该已完成,您可以终止剩余的进程。理论上无论如何:)

祝你好运。

于 2012-05-03T12:10:33.367 回答