You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:44:58