Python 高效实现 Word 转 PDF:彻底告别 Office 依赖(2026 年实用方案)
在服务器、Docker、Linux 无头环境、自动化脚本、批量处理等场景下,依赖 Microsoft Office(COM / win32com)的方式已经越来越不可接受。主要痛点:需要 Windows + Office 安装、许可问题、稳定性差、速度慢、难以容器化。
下面列出当前(2026 年)最主流、最实用的纯 Python 或轻量依赖的 Word → PDF 转换方案,按保真度 × 易用性 × 部署友好度排序。
推荐方案对比表(2026 年视角)
| 排名 | 方案 | 保真度(格式/表格/图片/字体) | 依赖安装难度 | 是否需要外部程序 | 批量/服务器友好 | 开源/免费 | 推荐场景 |
|---|---|---|---|---|---|---|---|
| 1 | LibreOffice headless (lowriter / soffice) | ★★★★★(几乎完美) | 中(需安装 LibreOffice) | 是(外部进程) | ★★★★★ | 完全免费 | 生产环境首选、最高保真 |
| 2 | Aspose.Words for Python | ★★★★★(非常接近原生) | 低(pip install) | 否 | ★★★★☆ | 付费(有免费试用/限制版) | 需要极高保真 + 商业项目 |
| 3 | Spire.Doc for Python | ★★★★☆~★★★★★ | 低(pip) | 否 | ★★★★☆ | 免费版有限制(页数/水印) | 中小型项目、预算有限 |
| 4 | Apryse SDK (原 PDFTron) | ★★★★☆~★★★★★ | 中(pip + 可能 license) | 否 | ★★★★★ | 商用付费 | 企业级、需支持更多 Office 格式 |
| 5 | docx2pdf + LibreOffice | ★★★★★ | 低(pip) | 是 | ★★★★☆ | 免费 | 快速上手、跨平台脚本 |
| 6 | unoconv / pandoc | ★★★★☆ | 中 | 是 | ★★★☆☆ | 免费 | 老项目过渡、已装 LibreOffice |
| 7 | python-docx → 中间格式 → PDF | ★★☆☆☆~★★★☆☆ | 低 | 否/部分是 | ★★★☆☆ | 免费 | 只需简单文本,不在意复杂排版 |
方案 1:LibreOffice headless(目前性价比最高、生产最稳)
优点:保真度最高(几乎与 Word 导出 PDF 一致),完全免费,开源,支持复杂表格、图表、页眉页脚、字体嵌入。
安装(Linux / Docker 推荐):
# Ubuntu/Debian
sudo apt update
sudo apt install libreoffice libreoffice-writer libreoffice-pdfimport -y
# 或 Docker(最干净)
docker run -it --rm -v $(pwd):/docs jbarlow83/unoconv
Python 调用方式(推荐 subprocess):
import subprocess
import os
from pathlib import Path
def word_to_pdf(input_path: str, output_path: str = None) -> str:
input_path = Path(input_path).resolve()
if not input_path.exists():
raise FileNotFoundError(f"文件不存在: {input_path}")
if not output_path:
output_path = input_path.with_suffix(".pdf")
else:
output_path = Path(output_path).resolve()
# lowriter / soffice --headless --convert-to pdf
cmd = [
"lowriter", # 或 "soffice"
"--headless",
"--convert-to", "pdf",
"--outdir", str(input_path.parent),
str(input_path)
]
try:
subprocess.run(cmd, check=True, capture_output=True, text=True)
generated_pdf = input_path.with_suffix(".pdf")
if generated_pdf.exists():
if generated_pdf != output_path:
generated_pdf.rename(output_path)
return str(output_path)
else:
raise RuntimeError("PDF 文件未生成")
except subprocess.CalledProcessError as e:
raise RuntimeError(f"转换失败: {e.stderr}")
# 使用示例
try:
pdf_file = word_to_pdf("report.docx")
print(f"转换成功: {pdf_file}")
except Exception as e:
print(f"转换失败: {e}")
Docker 一行搞定批量(推荐生产):
docker run --rm -v $(pwd)/docs:/docs jbarlow83/unoconv -f pdf /docs/*.docx
方案 2:Aspose.Words for Python via .NET(纯 Python、高保真)
# pip install aspose-words
import aspose.words as aw
doc = aw.Document("input.docx")
doc.save("output.pdf")
优点:无需外部程序,API 强大,支持高级设置(压缩、图像质量、PDF/A 等)。
缺点:商业授权(有免费试用,但正式环境通常需付费)。
方案 3:docx2pdf 库(简单封装 LibreOffice)
pip install docx2pdf
from docx2pdf import convert
convert("input.docx", "output.pdf")
# 或批量
convert("folder_with_docx/")
内部还是调用 LibreOffice,但封装得更友好。
快速选择指南(2026 年)
- 追求最高保真 + 免费 + 可容器化 → LibreOffice + subprocess / docx2pdf
- 不想装任何外部软件 → Aspose.Words 或 Spire.Doc(接受商业许可成本)
- 只处理简单文档(纯文字+基本表格) → python-docx 提取内容 → ReportLab / fpdf 生成 PDF
- 已经在用 LibreOffice 生态 → unoconv 或 lowriter 命令
你现在的场景是单文件转换、批量处理、还是 Web 服务接口?
是 Linux 服务器 / Docker 部署,还是 Windows / macOS 开发环境?
有没有对 PDF/A、数字签名、水印等特殊需求?告诉我,我可以给你更针对性的代码或 Dockerfile 示例~