在我的机器上,当在 Windows 资源管理器中选择多个 PDF 文档时,右键单击并选择“打印”,Adobe Acrobat Reader 以最小化打开,所有文档都被静默发送到打印机。
我想做和 Windows 一样的事情,但它是怎么做的呢?
我使用ProcessStartInfo与PrintTo动词,因为你可以在前面看到的问题。不幸的是,这一切都不过如此,而且我在打印多个文档时遇到了大问题。我如何知道应用程序(通常是 Adobe Reader)何时完成打印?如果连续启动多个 printTo 进程,一个文档似乎在前一个完成打印之前打开。
我想避免硬编码 Adobe Reader,因为我的一些用户已将其换成 Foxit Reader 或其他。
我不知道您是否可以使用其他 PDF 查看器以这样的方式执行此操作,即这些查看器是 Adobe Reader 的即插即用替代品。您可能需要根据您想要支持的每个程序对其进行调整。在一个人的系统上安装 Reader 并不是那么困难,真的,如果有必要执行一项工作并且大多数计算机都预装了它。
您必须知道的第一件事是,当您通过该动词、代码或资源管理器上下文菜单告诉它打印时,您正在执行以下操作:
""C:\Program Files\Adobe\Reader 10.0\Reader\AcroRd32.exe"" /p /h "%1"
Run Code Online (Sandbox Code Playgroud)
注意参数:/p(告诉它打印)和/h(开始最小化)。
还有另一种选择。Adobe 开发人员常见问题解答 ( http://partners.adobe.com/public/developer/en/acrobat/sdk/pdf/intro_to_sdk/DeveloperFAQ.pdf ) 指出此命令行适用于每个文件:
AcroRd32.exe /t path "printername" "drivername" "portname"
Run Code Online (Sandbox Code Playgroud)
该文档指定这将启动 Adobe Reader 并打印一个必须完全指定其路径的文件,同时取消打印对话框。(从开发人员常见问题中复制粘贴。)
还有一个选项 /n ,它“启动一个单独的 Acrobat 或 Adobe Reader 实例,即使一个当前处于打开状态。” (再次开发人员常见问题解答。)我想,这可用于并行运行多个打印作业。
我在以下位置找到了另一个命令行参考:Adobe Reader Command Line Reference
所以基本上,您可以迭代您的 PDF 列表,并为每个 PDF 列表启动一个新的打印过程,并通过 Process.Start 调用等待它通过 Process.WaitForExit 关闭。这将使您的程序看起来挂起,我讨厌程序在执行操作时挂起,因此您应该在可取消的 BackgroundWorker 中执行此操作,该后台工作器报告进度并仍然使您的 GUI 具有一定的交互性。