我的知识记录

Python Word批量转PDF:一键把docx转成PDF

用Python批量把整个文件夹的Word文档转成PDF,基于LibreOffice headless命令行,跨Windows、Mac、Linux,无需手动另存为,适合合同、标书、报告批量归档。

场景痛点

每次领导说"把这几十个Word都转成PDF发出去",你只能一个个打开Word,点另存为,选PDF,再等加载。几十个文件点到手酸,还容易漏转、版本转错。批量转换是办公自动化里最常见的需求之一,用Python几行命令就能把整个文件夹的docx一次性转成PDF。

用到的库

pip install python-docx
# 转换引擎用系统自带的 LibreOffice(免费),命令行调用即可
# Windows 安装:https://www.libreoffice.org/
# Mac 安装:brew install --cask libreoffice
# Ubuntu 安装:sudo apt install libreoffice

如果你在Windows上装了正版Microsoft Word,也可以用 pip install docx2pdf,底层调Word COM接口,排版还原度最高。

完整代码

# -*- coding: utf-8 -*-
"""
批量把文件夹里的 .docx 转成 .pdf
依赖 LibreOffice headless 引擎(跨平台)
"""
import os
import subprocess
import glob
from pathlib import Path


def find_libreoffice():
"""自动寻找 LibreOffice 可执行文件路径"""
candidates = [
"libreoffice", "soffice",                      # Linux / Mac 命令
r"C:\Program Files\LibreOffice\program\soffice.exe",   # Windows 常见路径
r"C:\Program Files (x86)\LibreOffice\program\soffice.exe",
]
for path in candidates:
try:
# 测试能否调起
subprocess.run([path, "--version"],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
check=True)
return path
except Exception:
continue
return None


def batch_word_to_pdf(input_dir, output_dir):
# 找 LibreOffice
soffice = find_libreoffice()
if not soffice:
raise RuntimeError("未找到 LibreOffice,请先安装:https://www.libreoffice.org/")

input_dir = Path(input_dir)
output_dir = Path(output_dir)
output_dir.mkdir(parents=True, exist_ok=True)

# 找出所有 docx(排除临时文件 ~$ 开头)
docx_files = [f for f in input_dir.glob("*.docx") if not f.name.startswith("~$")]
print(f"共发现 {len(docx_files)} 个 Word 文档")

# 用一条命令批量转换,比逐个调用快很多
cmd = [
soffice, "--headless", "--convert-to", "pdf",
"--outdir", str(output_dir),
] + [str(f) for f in docx_files]

print("开始转换,命令:", " ".join(cmd))
result = subprocess.run(cmd, capture_output=True, text=True)
print(result.stdout)
if result.returncode != 0:
print("转换出错:", result.stderr)

# 统计结果
pdf_files = list(output_dir.glob("*.pdf"))
print(f"转换完成,共生成 {len(pdf_files)} 个 PDF:")
for p in pdf_files:
print("  -", p.name)


if __name__ == "__main__":
batch_word_to_pdf(
input_dir="./word_docs",      # 放 Word 文档的文件夹
output_dir="./pdf_output",    # 输出 PDF 的文件夹
)

代码讲解

find_libreoffice() 先在系统里探测 LibreOffice 的位置,Windows 常见路径写死在候选列表里,Linux/Mac 直接用 PATH 里的 libreoffice 命令。

核心是 --headless --convert-to pdf 这组参数:--headless 表示不弹界面后台运行,--convert-to pdf 指定输出格式,--outdir 指定输出目录。把所有 docx 路径一次性拼在命令后面,LibreOffice 会自己批量处理,比逐个启动进程快好几倍。

过滤 ~$ 开头的文件是关键,因为 Word 打开文档时会生成临时锁文件,不排除会把临时文件也转一遍。

运行结果

运行后 pdf_output 文件夹里会出现和源 docx 同名的 .pdf 文件。打开对照源文档,排版、字体、分页基本一致。控制台会打印转换成功的文件数量和文件名列表,方便核对。

注意事项

  • LibreOffice 对 Word 高级特性(如复杂宏、特定域代码、某些艺术字)还原度不如原生 Word,重要文件转换后要抽查一两个。
  • 中文字体在 Linux 服务器上可能缺失,导致 PDF 里中文变成方块,需要先安装中文字体(如 fonts-noto-cjk)。
  • 批量转换时不要同时手动打开正在转换的文档,否则文件被占用会失败。
  • Windows 用户如果追求和Word 100%一致,把代码换成 from docx2pdf import convert; convert( input_dir, output_dir ) 即可,需要本机装有 Microsoft Word。

Python Word批量转PDF:一键把docx转成PDF

标签:

更新时间:2026-09-14 21:42:27

上一篇:Python Word批量转纯文本txt:提取正文

下一篇:Python Word模板渲染数据批量生成报告