我正在尝试使用win32api
将PDF文档输出到特定的打印机。
win32api.ShellExecute(0, "print", filename, '/d:"%s"' % printername, ".", 0)
filename
是文件的完整路径名,printname
是我通过win32api.EnumPrinters(6)
输出获得的目标打印机的名称。
即使printername
是其他目标的名称,该文件也会被发送到Windows默认打印机(我的期望是通过特定打印机会将指定文件发送到该打印机,而不是默认值)。
关于我做错了什么的暗示?是否有不同的方法将PDF文件一般打印到特定的打印机?除此之外,有没有办法暂时更改我的程序中的默认打印机?
答案 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。