Python通过调用win32print模块,可以实现对已安装的打印机进行一系列管理。首先,你需要安装好Python 2.4 - 3.x和 PyWin32包。
然后就可以查看当前电脑上安装了哪些打印机:
import win32print
printers = win32print.EnumPrinters(5)
print printers
这样通过EnumPrinters方法就可以获取,数字大小可以调整,以获取更多或更少的信息。(有关详细信息,请参阅 文档 ,当然,去MSDN看看,会有更全面的信息)。上述代码会得到类似下面的输出内容:
((8388608, 'PDFCreator,PDFCreator,', 'PDFCreator', 'eDoc Printer'),
(8388608, 'Samsung ML-2250 Series PCL 6,Samsung ML-2250 Series PCL 6,', 'Samsung ML-2250 Series PCL 6', ''),
(8388608, 'Microsoft XPS Document Writer,Microsoft XPS Document Writer,', 'Microsoft XPS Document Writer', ''))
如您所见,EnumPrinters调用返回一个嵌套元组。每个元素包含了一台打印机信息,其中有两台虚拟打印机(PDF、XPS),如果是网络打印机,最后一个参数将是UNC路径。有时,我们禁用某台打印机,换用另一台,这就需要一种方法来更改用户的打印机设置,指向它的新路径。有了类似上面收集的信息,就很好办了。例如,如果我上面的代码找到了旧网络打印机(带有UNC路径),我可以执行以下操作来换一台打印机:
import win32print
win32print.DeletePrinterConnection('\\\\oldUNC\path\to\printer')
win32print.AddPrinterConnection('\\\\newUNC\path\to\printer')
安装打印机的另一种方法是使用subprocess模块的命令调用:
import subprocess
subprocess.call(r'rundll32 printui.dll PrintUIEntry /in /q /n \\UNC\path\to\printer')
对于使用多台打印机的用户,通常还需要设置默认打印机,这样用户就不会意外地打印到别处。有两种方法可以解决。
如果知道打印机的名称,则可以使用以下命令:
import win32print
win32print.SetDefaultPrinter('EPSON Stylus C86 Series')
在上面的代码中,我将默认设置为Epson。该名称应与Windows中“打印机和传真”对话框中显示的名称完全相同。
另一种方法也是使用subprocess模块的命令调用:
import subprocess
subprocess.call(r'rundll32 printui.dll PrintUIEntry /y /n \\UNC\path\to\printer')
win32print还支持其他许多其他功能。比如,您可以启动和停止打印作业,在打印作业上设置优先级,获取打印机配置,安排作业,等等。
(本文译自:http://www.blog.pythonlibrary.org/2010/02/14/python-windows-and-printers/)