python-docx无法直接转PDF,必须依赖外部工具:Windows下用win32com调用Word(保真度最高),跨平台用LibreOffice headless命令行。

用 python-docx 读取 Docx 文件行不通
python-docx 只能读写 .docx 的 XML 结构,它不渲染、不排版,更不支持导出 PDF。试图用 Document 对象直接保存为 PDF 会报错或生成空文件。真正需要的是一个能“打开并打印为 PDF”的底层能力——这必须依赖外部程序或系统级渲染引擎。
推荐方案:使用 win32com.client 调用 Word 应用(Windows)
这是目前最稳定、格式保真度最高的方式,本质是让 Python 自动操作本地已安装的 Microsoft Word。需确保系统装有 Word(2016 及以上),且未启用“保护模式”阻止 COM 自动化。
-
win32com.client.Dispatch("Word.Application")启动 Word 实例(建议加Visible=False避免弹窗) - 用
app.Documents.Open()打开 docx 文件,注意路径必须是绝对路径,且反斜杠需转义或用原始字符串(如r"C:\contracts\1.docx") - 调用
doc.SaveAs(FileName=pdf_path, FileFormat=17),其中17是 PDF 格式常量(wdFormatPDF = 17) - 务必调用
doc.Close()和app.Quit(),否则 Word 进程残留,后续脚本可能卡死
示例关键片段:
from win32com.client import Dispatch
app = Dispatch("Word.Application")
app.Visible = False
doc = app.Documents.Open(r"C:\in\contract.docx")
doc.SaveAs(r"C:\out\contract.pdf", FileFormat=17)
doc.Close()
app.Quit()
跨平台替代方案:LibreOffice headless 模式
Linux/macOS 或无 Word 的 Windows 环境下,可用 LibreOffice 的命令行接口。它不依赖 GUI,但需提前安装 LibreOffice 并确认 soffice 在 PATH 中。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
- 命令结构固定:
soffice --headless --convert-to pdf --outdir <output_dir><input.docx></input.docx></output_dir> - Python 中用
subprocess.run()调用,注意捕获stderr判断是否转换失败(例如文档损坏或字体缺失) - 输出 PDF 名称由 LibreOffice 自动推导(去掉扩展名 + .pdf),不能自定义前缀;若需重命名,得额外用
os.rename() - 首次运行可能较慢——LibreOffice 启动服务有冷启动延迟,批量处理时建议单次传入多个文件,而非循环多次调用
常见报错和绕过方法
报错 pywintypes.com_error: (-2147352567, '发生意外。', ...) 多数因 Word 正在前台打开某个文档,或后台残留进程锁住了 COM 接口。此时仅重启 Word 或杀掉所有 WINWORD.EXE 进程即可。
- 中文路径乱码:统一用绝对路径 +
os.path.abspath(),避免相对路径中含中文导致Open()失败 - 字体缺失导致 PDF 排版错乱:在 Word 中手动打开该 docx → “文件 → 选项 → 保存 → 勾选‘将字体嵌入文件’”,再批量处理
- 权限错误(尤其在服务器环境):Windows Server 默认禁用交互式桌面服务,COM 组件不可用,此时只能切 LibreOffice 方案
自动化合同转换真正难的不是代码,而是让 Word 或 LibreOffice 在无人值守时稳定完成排版——字体、宏、域字段、页眉页脚这些细节,往往要试两三轮才能对齐业务要求。


















