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

5 投票
3 回答
30583 浏览
提问于 2025-04-15 14:31

我正在尝试使用win32print模块打印一个PDF文档。听说这个模块只能接受PCL格式或者原始文本,这是真的吗?

如果是这样的话,有没有什么模块可以把PDF文档转换成PCL格式呢?

我考虑过使用ShellExecute来打印,但这个方法不行,因为它只能打印到默认的打印机。我需要在不同的网络上的服务器上打印到各种打印机。

谢谢你的帮助,
皮特

3 个回答

-1

我不太确定怎么让win32print具体工作,但可能还有其他几种选择。Reportlab常常被提到,用来从Python创建PDF文件。如果你已经在用某种方法了,也许可以试试PyX或者pypsg来生成Postscript文件,然后再把这些文件放到win32print里,这样也许能行。

3

我之前已经在用win32api.ShellExecute这个方法来打印,但我需要打印到一个不是默认的打印机上。经过一番琢磨,我发现最好的办法就是暂时更改默认打印机。在打印之前,我先保存当前的默认打印机,然后把它改成我想用的打印机,打印完后再把默认打印机设置回去。大概是这样的:

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

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

我不敢说这个方法有多好看,但它确实有效,而且让我其他的代码保持不变。

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许可证发布的,所以在商业软件中用起来就不太方便。

希望这对某些人有帮助,
皮特

撰写回答