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。

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