使用Python的win32print模块打印PDF文档?

5

我正在尝试使用win32print模块打印PDF文档。显然,该模块只能接受PCL或纯文本。这是正确的吗?

如果是这样,是否有可用的模块将PDF文档转换为PCL?

我考虑使用ShellExecute; 然而,这不是一个选项,因为它只允许打印到默认打印机。我需要打印到各种网络上的服务器上的打印机。

谢谢你的帮助, Pete

3个回答

10

我最终使用Ghostscript来完成这个任务。有一个依赖于Ghostscript的命令行工具,叫做gsprint

你甚至不需要安装Acrobat就能以这种方式打印PDF文件,这非常方便。

这里有一个例子:

在命令行上:

gsprint -printer \\server\printer "test.pdf"

来自 Python:

win32api.ShellExecute(0, 'open', 'gsprint.exe', '-printer "\\\\' + self.server + '\\' + self.printer_name + '" ' + file, '.', 0)

请注意,在这些示例中,我已将PATH变量添加到系统路径中,因此在调用可执行文件时不必包含整个路径。

但是,有一个缺点。该代码使用GPL许可证,因此对于商业软件来说并不是很有用。

希望这能帮助到某些人, Pete


2
你可以这样做,或者让Ghostscript输出到打印机支持的任何语言,例如PCL / Postscript。其中的好处是,您可以打开输出文件并插入托盘选择等命令(如果需要)。 - Douglas Anderson
如果您选择使用旧版本的Ghostscript,如7.06 / 7.07,我相信这些版本是根据GNU许可证授权的,因此它可能会解决您的许可问题。 - Douglas Anderson
2
GPL并不一定是一个劣势。 ;) - Georg Schölly
我知道这篇文章很老,但是我该如何使用实际的Ghostscript 9.15调用gsprint.exe呢?我找不到这个名称的exe文件,也不知道如何使用Ghostscript应用程序中的gswin32.exe。 - Alex Lord Mordor
2
您需要安装gsview。gsprint包含在gsview 3.4及更高版本中。安装gsview后,gsprint.exe应该与gsview可执行文件在同一目录中。 - slypete

3

我已经使用了win32api.ShellExecute方法,但需要打印到非默认打印机。我能想到的最好方法是暂时更改默认打印机。所以在打印之前,我会存储当前的默认打印机,然后更改它,在打印后再将其设置回来。类似这样:

tempprinter = "\\\\server01\\printer01"
currentprinter = win32print.GetDefaultPrinter()

win32print.SetDefaultPrinter(tempprinter)
win32api.ShellExecute(0, "print", filename, None,  ".",  0)
win32print.SetDefaultPrinter(currentprinter)

我不会说这很漂亮,但它有效了,并且使我能够保持其他代码不变。

-1

我不确定如何具体让win32print工作,但可能有几个其他的选项。当使用Python创建PDF时,经常会提到Reportlab。如果您已经投入了您的方法,或许可以使用PyXpypsg生成Postscript文件,然后将其传送给win32print。


我已经在使用ReportLab来创建PDF了。现在需要打印出来。 - slypete

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接