6

我正在尝试使用win32api将 PDF 文档输出到特定打印机。

win32api.ShellExecute(0, "print", filename, '/d:"%s"' % printername, ".", 0)

filename是文件的完整路径名,printname是我通过win32api.EnumPrinters(6).

即使printername是不同目标的名称,文件也会发送到 Windows 默认打印机(我的期望是传递特定打印机会将命名文件发送到该打印机,而不是默认打印机)。

关于我做错了什么的任何提示?是否有不同的方法可以将 PDF 文件通用地打印到特定的打印机?除非其他一切,有没有办法从我的程序中临时更改默认打印机?

4

3 回答 3

4

MikeHunter 的回答是一个不错的起点。

建议的解决方案是调用 Acrobat 或 Acrobat Reader 进行实际打印,而不是通过win32api. 就我的目的而言,这就足够了:

from subprocess import call

acrobat = "C:\Program Files\Adobe\Acrobat 7.0\Acrobat.exe" ## Acrobat reader would also work, apparently
file = "C:\path\to\my\file.pdf"
printer = "Printer Name Goes Here"

call([acrobat, "/T", file, printer])

这会启动 Acrobat,并将给定的文件打印到指定的打印机,即使它不是 Windows 默认设置。以这种方式处理的第一个打印作业需要几秒钟(我假设这是正在启动并缓存在内存中的 Acrobat 服务),后续作业会立即打印。我没有对此进行任何类型的负载测试,但我认为调用不那么简单,所以不要相信它的巨大吞吐量。

于 2012-09-28T14:29:55.617 回答
1

我使用 SumatraPDF 来实现与用户 Inaimathi 发布的类似解决方案(Python 3):

import time
from subprocess import call

start = time.perf_counter()
sumatra = "C:\\Program Files\\SumatraPDF\\SumatraPDF.exe"
file = "C:\\Users\\spiderman\\Desktop\\report.pdf"

call([sumatra, '-print-to-default', '-silent', file])
end = time.perf_counter()
print("PDF printing took %5.9f seconds" % (end - start))

您可以传递给 SumatraPDF 的命令行参数列表在这里

于 2020-10-06T11:11:51.700 回答
0

我正在尝试将任何旧文件打印到特定的打印机,所以这些答案对我没有帮助。但是,我确实找到了完美的解决方案。Windows 有一个名为的规范动词printto,它不会显示在上下文菜单中。它被用作用户将文档拖放到打印机上以启用以这种方式进行打印的一种方式。我们可以使用该功能;第二个参数是打印机的名称。我永远无法让/d:参数与print规范动词一起正常工作,但这个解决方案为我解决了这个问题。我把printername引号括起来,以防里面有空格。

win32api.ShellExecute(0, "printto", filename, f'"{printername}"', ".", 0)
于 2021-03-30T14:54:07.067 回答