我的知识记录

Python Word批量打印文档:自动送打印机

用Python批量把Word文档发送到默认打印机,Windows调用Word COM,Linux/macOS用LibreOffice命令行,批量打印合同、报表不用手动打开。

场景痛点

月底要打印上百份合同、对账单发给客户,一份份打开Word点打印,点到手抽筋。用Python把整个文件夹的docx直接丢给打印机,后台自动出纸,人去忙别的。Windows上能调Word的COM接口,Linux/macOS用LibreOffice命令行,两套方案都给。

用到的库

# Windows 方案(推荐,排版和手动打印一致)
pip install pywin32

# 跨平台方案(Linux/Mac 或不想装Word)
# 系统需要装 LibreOffice

完整代码

# -*- coding: utf-8 -*-
"""
批量打印 Word 文档
- Windows: 调用 Word COM 接口(需要本机装有 Microsoft Word)
- Linux/Mac: 调用 LibreOffice headless 打印
"""
import sys
import subprocess
from pathlib import Path


def print_on_windows(docx_files, copies=1):
"""通过 Word COM 自动打印,打印完自动关闭"""
import win32com.client as win32
word = win32.Dispatch("Word.Application")
word.Visible = False  # 后台运行,不弹界面

try:
for f in docx_files:
print(f"正在打印:{f.name}")
doc = word.Documents.Open(str(f), ReadOnly=True)
# 打印份数,后台静默打印
doc.PrintOut(
Background=True,
Copies=copies,
)
doc.Close(SaveChanges=False)
finally:
word.Quit()


def print_on_unix(docx_files, copies=1):
"""Linux/Mac 用 LibreOffice 转成 PDF 再送系统打印机,或直接用 lp"""
for f in docx_files:
print(f"正在打印:{f.name}")
# 先转成 PDF 到临时目录,再用 lp 送打印机
# 这种方式不依赖 Word,排版由 LibreOffice 渲染
cmd = [
"libreoffice", "--headless",
"--convert-to", "pdf",
"--outdir", "/tmp/print_tmp",
str(f),
]
subprocess.run(cmd, check=True, capture_output=True)
pdf_path = Path("/tmp/print_tmp") / (f.stem + ".pdf")
# 送 cups 打印
subprocess.run(["lp", f"-n{copies}", str(pdf_path)], check=True)


def batch_print(input_dir, copies=1):
input_dir = Path(input_dir)
docx_files = [f for f in input_dir.glob("*.docx") if not f.name.startswith("~$")]
print(f"共 {len(docx_files)} 个文档待打印,每份 {copies} 份")

if sys.platform.startswith("win"):
print_on_windows(docx_files, copies)
else:
print_on_unix(docx_files, copies)

print("全部发送打印队列完成,请查看打印机出纸。")


if __name__ == "__main__":
batch_print(
input_dir="./word_docs",
copies=1,   # 每份打印几份
)

代码讲解

Windows 方案用 win32com.client.Dispatch("Word.Application") 启动一个后台Word进程,Visible=False 不弹界面。逐个打开文档,doc.PrintOut(Background=True, Copies=copies) 就是静默打印,打完 Close(SaveChanges=False) 不保存。最后 word.Quit() 退出进程,不留残留。

Linux/Mac 没有Word,走LibreOffice:先把docx转成PDF,再用系统的 lp 命令(CUPS打印系统)送打印机。这种方式排版由LibreOffice渲染,和Word可能有细微差异。

脚本根据 sys.platform 自动判断走哪条路,不用手动改。

运行结果

脚本运行后,打印机队列里依次出现每个文档,自动出纸。控制台打印每个文件的打印状态。Word COM方案打印完任务管理器里不会残留WINWORD进程(因为finally里调了Quit)。

注意事项

  • Windows方案必须本机装了Microsoft Word,WPS不能直接用这个COM接口。WPS用户可以把文件另存为PDF后用 Acrobat 命令行或 SumatraPDF -print-to-default 打印。
  • 打印前先在Word里设置好默认打印机、纸张大小、双面打印选项,否则脚本打出来会用系统默认值。
  • PrintOut 还有很多参数:Pages="1-3" 指定页码、PrintToFile=FalseCollate=True 逐份打印,需要可以补。
  • Linux 上 lp 默认走系统默认打印机,想指定打印机用 lp -d 打印机名。先 lpstat -p 看有哪些打印机。
  • 大批量打印前先打一份测试,确认排版和份数对,再全量跑。

Python Word批量打印文档:自动送打印机

标签:

更新时间:2026-09-15 08:56:36

上一篇:Python Word对比两个文档差异:找不同

下一篇:Python Word批量加水印文字:保密字样