如何在Python 3中设置打印机属性后打印Word文档?
Python打印Word文档并自定义打印机属性(纸盒、双面等)
问题背景
- 使用
win32api.ShellExecute可实现Word文档打印,但会打开Word程序且沿用其内置打印属性,无法满足自定义纸盒、双面打印等需求。 - 使用
win32print模块能成功设置打印机属性(代码如下),但仅能打印空白页,无法将Word文档内容发送至打印机。 - 尝试用
win32print.WritePrinter直接读取文档并发送失败,同时对win32print中StartDoc/StartDocPrinter、StartPage/StartPagePrinter等函数的使用逻辑存在困惑。
已实现属性设置的代码
import win32con import win32gui import win32print # pDevMode 常量定义 # 纸盒设置 TRAY_1 = 260 TRAY_2 = 259 # 双面打印设置 SINGLE_SIDE = 1 DUPLEX_OVER = 2 DUPLEX_UP = 3 # 颜色设置 COLOR = 2 MONOCHROME = 1 device_name = win32print.GetDefaultPrinter() handle = win32print.OpenPrinter(device_name) properties = win32print.GetPrinter(handle, 2) devmode = properties['pDevMode'] devmode.DefaultSource = TRAY_1 devmode.Fields |= win32con.DM_DEFAULT_SOURCE win32print.DocumentProperties(None, handle, device_name, devmode, devmode, win32con.DM_IN_BUFFER | win32con.DM_OUT_BUFFER) hdc = win32gui.CreateDC("", device_name, devmode) win32print.StartDoc(hdc, ("Print Document", None, None, 0)) win32print.StartPage(hdc) # 此处无内容输出,仅打印空白页 ... win32print.EndPage(hdc) win32print.EndDoc(hdc)
尝试发送文档内容的代码(执行失败)
with open(document_path, "rb") as file: data = file.read() win32print.WritePrinter(printer_handle, data)
解决方案
核心问题说明
win32print的StartDoc/StartPage系列函数针对GDI绘图打印设计,无法直接解析Word文档二进制内容;WritePrinter仅接受打印机可识别的原始指令(如PCL、PostScript格式),直接写入Word文件自然失效。
最优方案:通过COM接口操作Word打印
使用win32com.client调用Word的COM接口,既能自定义打印属性,又能隐藏Word窗口,同时正确输出文档内容。
代码实现
import win32com.client import win32print # 打印机属性常量 TRAY_1 = 260 TRAY_2 = 259 DUPLEX_OVER = 2 # 双面打印-长边翻转 DUPLEX_UP = 3 # 双面打印-短边翻转 def print_word_with_custom_settings(doc_path): # 获取默认打印机名称 printer_name = win32print.GetDefaultPrinter() # 初始化Word应用(隐藏窗口) word_app = win32com.client.Dispatch("Word.Application") word_app.Visible = False try: # 打开目标文档 doc = word_app.Documents.Open(doc_path) # 绑定目标打印机 target_printer = word_app.Printers(printer_name) # 自定义打印属性 target_printer.DefaultPaperSource = TRAY_1 # 设置纸盒 target_printer.Duplex = DUPLEX_OVER # 设置双面打印 # 切换当前打印机为自定义配置的设备 word_app.ActivePrinter = printer_name # 执行打印(无弹窗、后台完成) doc.PrintOut( Background=False, PrintToFile=False, Copies=1, ShowPrintDialog=False ) print("打印任务已完成") except Exception as e: print(f"打印出错: {str(e)}") finally: # 清理资源 doc.Close(SaveChanges=False) word_app.Quit() # 调用示例 if __name__ == "__main__": document_path = "你的Word文档路径.docx" print_word_with_custom_settings(document_path)
win32print相关函数澄清
StartDoc/EndDoc+StartPage/EndPage:用于GDI绘图场景,比如通过win32gui.TextOut在打印页上绘制文字/图形,适合生成自定义格式的打印内容,而非直接打印现有文档。StartDocPrinter/EndDocPrinter+WritePrinter:用于发送打印机原生指令流,需先将Word文档转换为PS/PCL等打印机支持的格式,复杂度较高。DocumentProperties:用于修改打印机的默认或临时属性,修改后需调用win32print.SetPrinter才能生效(COM接口方案无需此步骤,直接针对当前打印任务设置属性)。
内容的提问来源于stack exchange,提问作者Nikolaos Maragkos
相关产品推荐
相关产品推荐

