【问题标题】:Batch file that opens adobe reader to print PDF doesn't end/close打开 adobe reader 以打印 PDF 的批处理文件不会结束/关闭
【发布时间】:2023-07-30 17:37:01
【问题描述】:

我在一个由 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?

【问题讨论】:

    标签: php batch-file shell-exec


    【解决方案1】:

    我在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 时,打印作业应该已完成,您可以终止剩余的进程。理论上无论如何:)

    祝你好运。

    【讨论】:

    • 好主意,它确实有效。认为它没有但只是不要在shell_exec() 和批处理文件中使用START。我只在批处理文件中使用过。谢谢。 :)
    • 看来我庆祝有点为时过早......它仍在锁定我的 PHP 脚本。我会玩弄它,如果我能正常工作,请告诉你。
    • 使用 Adob​​e Reader 无法正常工作。尝试使用 LPD 服务等的 LPR 命令 - 对我来说是灾难性的!哈哈。最后使用 Fox It PDF Reader 和类似的命令:START "Print Document" "C:\Program Files (x86)\Foxit Software\Foxit Reader\Foxit Reader.exe" /t "D:\xampp\htdocs\instrument\app\webroot\Docs\%1.pdf" "\\<machine_name>\<printer_name>"
    • 打印完成后 Fox It PDF Reader 关闭了吗?
    • @Impulss 抱歉回复晚了,打印后确实关闭了 foxit 实例。