【问题标题】:Python's win32api only printing to default printerPython 的 win32api 仅打印到默认打印机
【发布时间】:2012-09-19 13:34:50
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我发现它取决于文件类型... *.html 将提示您选择的打印机,*.pdf 只是默认...我没有任何“解决方法”已经看到实际工作......我们在许多研究人员/农民使用的软件包中使用它......
  • @JoranBeasley - 嗯。您当时知道的任何其他方法,或者就您所知,我是 SOL?
  • SOL 我认为...它会变得更糟,这取决于您的默认 PDF 处理程序(例如 PDFComplete 根本不起作用)...另一种方法是在他们的默认 pdf 查看器中打开它并让他们从那里打印
  • 如果您将其保存为 HTML 而不是 PDF,您可以获得打印机选择窗口...我们花费了大量的工程时间来得出这个结论...
  • @JoranBeasley - 这没有帮助。该程序的重​​点是在没有监督的情况下路由打印作业;首先必须每次都选择打印机,这违背了使用ShellExecute 的目的。

标签: python winapi pdf printing shellexecute


【解决方案1】:

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 服务),后续作业会立即打印。我没有对此进行任何类型的负载测试,但我认为调用不是微不足道的,所以不要相信它的巨大吞吐量。

【讨论】:

    【解决方案2】:

    我使用 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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多