comtypes是Windows下调用Word最可靠的方案,因其直接启动本地Word进程、原生渲染、完美保留复杂格式且不依赖外部工具链;pypandoc跨平台但易受Pandoc/LaTeX环境限制,格式保真度低。
Windows 上用 comtypes 调用 Word 应用本身最可靠;跨平台或批量处理优先选 pypandoc,但依赖 Pandoc 和 LaTeX 环境,容易卡在安装环节。
为什么 comtypes 是 Windows 下的首选方案
它直接启动本地 Microsoft Word 进程,走的是 Office 原生渲染路径,能完美保留页眉页脚、目录、图表编号、OLE 对象等复杂格式。不依赖外部工具链,只要机器装了 Word(2010 及以上),代码跑起来就几乎不会出排版问题。
常见错误现象:comtypes.client.GetActiveObject("Word.Application") 报错 COMError: (-2147221021, '操作无法使用', ...) —— 本质是没启动 Word 实例或权限被拦截。
- 必须用管理员权限运行 Python 脚本(尤其 Win10/11 UAC 严格时)
- 确保 Word 没处于“安全模式”或被组策略禁用 COM 自动化
- 关闭所有手动打开的 Word 窗口,避免实例冲突
- 转换后务必调用
doc.Close()和word.Quit(),否则后台进程残留导致下次调用失败
from comtypes.client import CreateObject
word = CreateObject("Word.Application")
word.Visible = False
doc = word.Documents.Open(r"C:\report.docx")
doc.SaveAs(r"C:\report.pdf", FileFormat=17) # 17 = wdFormatPDF
doc.Close()
word.Quit()
pypandoc 的实际可用性边界在哪
pypandoc 本质是 Pandoc 的 Python 封装,靠解析 DOCX XML + Markdown 中间层再转 PDF。优点是跨平台、无 Office 依赖;缺点是:目录不更新、题注错位、公式变图片糊、页边距偏移——尤其当原文档用了 Word 样式集或自定义多级列表时。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
使用场景:内部简报、纯文字报告、CI/CD 流水线中对格式要求不严的批量导出。
- 必须提前安装 Pandoc:
choco install pandoc(Win)或brew install pandoc(Mac) - 若要输出真 PDF(非 HTML 中转),还得装 LaTeX 引擎(如 TinyTeX 或 MiKTeX),否则会静默 fallback 到 HTML 输出
-
pypandoc.convert_file("in.docx", "pdf", outputfile="out.pdf")默认不带 TOC,加extra_args=["--toc", "--toc-depth=3"] - 中文支持需额外指定字体:
extra_args=["-V", "mainfont=SimSun"](LaTeX 模式下才生效)
两个库都避不开的共性坑
DOCX 文件本身质量决定输出上限。哪怕用 Word 打开看着正常,XML 结构损坏、样式引用断裂、嵌入对象损坏,都会让任一转换器中途崩溃或生成空白 PDF。
- 先用 Word 手动另存为新 DOCX 文件,强制修复潜在结构问题
- 检查文档是否含加密、受保护视图或数字签名——
comtypes会直接拒绝打开,pypandoc解析时抛UnicodeDecodeError - 路径含中文或空格时,
comtypes需用原始字符串r"C:\测试\文件.docx",pypandoc则建议用os.path.abspath()规范化 - 不要指望自动处理 Word 宏(.docm)、模板(.dotx)或密码保护文档——两者均不支持
真正麻烦的从来不是调哪个函数,而是文档里那个没命名的文本框、那个嵌套三层的表格、或者某段被手动敲空格对齐的“目录”。转换前花两分钟人工检查源 DOCX,比调试一小时环境配置更省时间。