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 中。
Python 环境工具专业版功能概述Python 环境工具专业版是一项面向实际任务的技能。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。核心要点使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。执行完成后建议检查结果是否符合预期,并保留必要记录。使用与执行同时注意输入完整性、执行条件和输出可用性。从功能定位来看,该技能
- 命令结构固定:
soffice --headless --convert-to pdf --outdir - 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 在无人值守时稳定完成排版——字体、宏、域字段、页眉页脚这些细节,往往要试两三轮才能对齐业务要求。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










