Python的win32api只打印到默认打印机

时间:2012-09-27 17:28:02

标签: python winapi pdf printing shellexecute

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

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

filename是文件的完整路径名,printname是我通过win32api.EnumPrinters(6)输出获得的目标打印机的名称。

即使printername是其他目标的名称,该文件也会被发送到Windows默认打印机(我的期望是通过特定打印机会将指定文件发送到该打印机,而不是默认值)。

关于我做错了什么的暗示?是否有不同的方法将PDF文件一般打印到特定的打印机?除此之外,有没有办法暂时更改我的程序中的默认打印机?

3 个答案:

答案 0 :(得分:3)

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服务正在启动并缓存在内存中),后续作业立即打印。我没有对此进行任何类型的负载测试,但我认为这个调用不是那么简单,所以不要相信它的大量吞吐量。

答案 1 :(得分:1)

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

win32api.ShellExecute(0, "printto", filename, f'"{printername}"', ".", 0)

答案 2 :(得分:0)

我使用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的命令行参数列表为here