Windows系统下如何将docx文档打印至指定非默认打印机?
无需切换默认打印机的指定打印方案
方法1:给ShellExecute添加打印机参数(最简单改造)
你的原有代码依赖切换默认打印机,其实ShellExecute的打印命令支持通过/d:参数直接指定目标打印机,完全不需要修改默认设备。
改造后的代码示例:
import win32api import win32print # 枚举打印机并获取目标打印机名称 printers = win32print.EnumPrinters(2) zebra_printer = None brother_printer = None for printer in printers: if printer[2] == "ZDesigner GX430t": zebra_printer = printer[2] elif printer[2] == "Brother MFC-9340CDW Printer": brother_printer = printer[2] # 直接指定打印机打印,无需切换默认 if zebra_printer: # /d: 参数后跟打印机名称,注意引号包裹含空格的名称 win32api.ShellExecute(0, "print", filename, f'/d:"{zebra_printer}"', ".", 0) # 如果需要打印到另一台打印机,同样直接指定 if brother_printer: win32api.ShellExecute(0, "print", another_filename, f'/d:"{brother_printer}"', ".", 0)
方法2:使用win32print底层API直接打印(更可控)
如果需要更精细的打印控制(比如监控打印状态、自定义打印设置),可以直接调用win32print的底层API,通过打印机句柄完成打印:
import win32print import win32api def print_to_specific_printer(printer_name, file_path): # 获取打印机句柄 hprinter = win32print.OpenPrinter(printer_name) try: # 初始化打印作业 job_info = win32print.StartDocPrinter(hprinter, 1, ("Test Print", None, "RAW")) win32print.StartPagePrinter(hprinter) # 读取文件内容并发送到打印机(这里以文本文件为例,若为其他格式需对应处理) with open(file_path, "rb") as f: content = f.read() win32print.WritePrinter(hprinter, content) win32print.EndPagePrinter(hprinter) win32print.EndDocPrinter(hprinter) finally: win32print.ClosePrinter(hprinter) # 调用示例 print_to_specific_printer("ZDesigner GX430t", filename)
注意:这种方法针对不同类型的文档(如PDF、Office文件)需要额外处理,比如将文档转换为打印机支持的格式(如RAW或EMF),否则可能无法正确打印。
方法3:使用subprocess调用系统print命令
也可以通过subprocess直接调用Windows系统的print命令,同样支持指定打印机:
import subprocess def print_with_subprocess(printer_name, file_path): # 构造命令,/d指定打印机 cmd = ['print', f'/d:"{printer_name}"', file_path] subprocess.run(cmd, shell=True, check=True) # 调用示例 print_with_subprocess("ZDesigner GX430t", filename)
内容的提问来源于stack exchange,提问作者Matt Slaughter
相关产品推荐
相关产品推荐

