当前位置:首页>python>《Python 从入门到精通》153|批量处理 Word 与 PDF:文档自动化的常见思路

《Python 从入门到精通》153|批量处理 Word 与 PDF:文档自动化的常见思路

  • 2026-09-07 06:06:15
《Python 从入门到精通》153|批量处理 Word 与 PDF:文档自动化的常见思路

一、文档自动化,真正难的往往不是技术,而是重复

办公自动化里,Excel 很常见,但 Word 和 PDF 也同样高频。

合同是 Word 或 PDF。 通知书是 Word。 报告是 Word。 制度文件是 PDF。 发票、回执、盖章扫描件、归档资料,很多也都是 PDF。

这些文档类工作,最让人疲惫的地方通常不是“不会做”,而是:

内容差不多 格式差不多 每次只改少量字段 文件数量很多 而且还要一份一份打开处理

比如这些真实场景:

批量生成录取通知书 按名单批量生成劳动合同 把一批 Word 报告统一转成 PDF 从 PDF 中提取页数、标题、关键词 批量合并多个 PDF 给一批 PDF 重新命名、分类归档 从 Word 模板里替换客户名、日期、金额 把 Excel 里的数据填进 Word 模板生成正式文档

这些工作,只要量一大,人就会变成复制粘贴机器。 而 Python 在这种“规则明确、内容批量生成、文件反复处理”的场景里,非常有价值。

二、先分清两个问题:你是在处理内容,还是处理文件

批量处理 Word 和 PDF,思路上最好先分成两层。

第一层,文件层面。 你关心的是:

有哪些文件 文件名是什么 放在哪个文件夹 要不要批量改名 要不要移动、复制、归档 要不要合并、拆分

第二层,内容层面。 你关心的是:

文档里的文字是什么 要不要替换变量 要不要批量生成正文 要不要抽取某些字段 要不要新增段落、表格、页眉页脚 要不要从 PDF 里提取文字

很多人一上来就扑到“怎么生成 Word”。 其实更实战的思路是先想清楚:

我要自动化的是文件流转,还是文档内容本身。 这两者常常会同时出现,但技术重点不一样。

三、处理 Word 和 PDF,最常见的几类任务

你以后做文档自动化,基本绕不开下面这些类型。

第一类,批量生成。 用模板生成很多 Word 文档或 PDF 文档。

第二类,批量修改。 对已有文档做统一替换、补充、删除、改名。

第三类,批量提取。 从一批 Word 或 PDF 中提取文字、页数、标题、编号、表格信息。

第四类,批量转换。 Word 转 PDF,PDF 拆分,多个 PDF 合并成一个。

第五类,批量归档。 按照规则重命名、分类、移动、归档。

这五类任务几乎覆盖了大多数办公文档自动化场景。 你以后碰到新需求,往往也能先归到这几类里,再决定用什么库、怎么写。

四、处理 Word,最常见的库是 python-docx

如果你要操作 .docx 文件,最常见的库就是 python-docx。

安装:

python -m pip install python-docx

导入:

from docx import Document

这个库特别适合做这些事:

创建 Word 文档 新增标题、段落、表格 读取已有 Word 内容 替换部分文本 设置基础样式 批量生成统一格式文档

注意一个很现实的点:

它主要处理的是 .docx,不是老式 .doc。 所以如果公司里还保留很多旧版 Word 文件,往往要先转换成 .docx 再处理会更稳。

五、最基础的 Word 生成:从零创建一个文档

看一个最简单例子:

from docx import Documentdoc = Document()doc.add_heading("员工入职通知", level=1)doc.add_paragraph("张三,欢迎加入本公司。")doc.add_paragraph("请于 2025-02-01 到人事部办理入职手续。")doc.save("入职通知.docx")

这段代码做了几件事:

创建一个 Word 文档 加一个一级标题 加两段正文 保存成 docx 文件

这就是最基础的“程序生成 Word”。

如果你平时是手工打开 Word、输入标题、复制模板、改人名、再另存为,那么你已经能感觉到这类脚本的价值了。

六、批量生成 Word,本质上就是模板加变量

绝大多数 Word 自动化生成任务,其实不是“从零自由写作”,而是:

有一套固定模板 里面有几个变量 把变量批量替换进去 生成很多份正式文档

比如员工通知:

姓名 日期 部门 岗位

每个人不一样,但整体结构一样。

你可以先用最简单的拼接方式生成:

from docx import Documentemployees = [    {"姓名": "张三", "部门": "市场部", "入职日期": "2025-02-01"},    {"姓名": "李四", "部门": "运营部", "入职日期": "2025-02-03"},    {"姓名": "王五", "部门": "财务部", "入职日期": "2025-02-05"},]for emp in employees:    doc = Document()    doc.add_heading("员工入职通知", level=1)    doc.add_paragraph(f"{emp['姓名']},欢迎加入本公司。")    doc.add_paragraph(f"你将入职 {emp['部门']},请于 {emp['入职日期']} 到人事部办理手续。")    doc.save(f"{emp['姓名']}_入职通知.docx")

这已经能批量生成三份 Word 文件了。

你会发现,这类自动化的核心根本不是 Word 本身有多难,而是:

把固定内容和变化内容拆开。 固定内容进模板。 变化内容来自数据。 然后让程序批量循环。

七、如果数据来自 Excel,Word 批量生成会更像真实办公

前面的员工数据是手写在代码里的。 现实里,更常见的是从 Excel 读名单,再生成 Word。

比如:

import pandas as pdfrom docx import Documentdf = pd.read_excel("员工名单.xlsx")for _, row in df.iterrows():    doc = Document()    doc.add_heading("员工入职通知", level=1)    doc.add_paragraph(f"{row['姓名']},欢迎加入本公司。")    doc.add_paragraph(f"你将入职 {row['部门']},请于 {row['入职日期']} 到人事部办理手续。")    doc.save(f"{row['姓名']}_入职通知.docx")

这条链路非常典型:

Excel 提供数据 Python 读取数据 Word 负责输出正式文档

很多公司的通知书、证明、回执、报告封面,本质上都能按这个套路自动生成。

八、Word 不只是段落,还经常涉及表格

办公文档里,很多内容不是纯文字,而是表格。

比如日报、月报、清单、明细、签收表、对账单。 这时候就会用到 add_table()。

示例:

from docx import Documentdoc = Document()doc.add_heading("销售汇总表", level=1)table = doc.add_table(rows=1, cols=3)header_cells = table.rows[0].cellsheader_cells[0].text = "商品"header_cells[1].text = "销量"header_cells[2].text = "销售额"data = [    ["苹果", "120", "600"],    ["香蕉", "150", "450"],    ["橙子", "90", "360"]]for item in data:    row_cells = table.add_row().cells    row_cells[0].text = item[0]    row_cells[1].text = item[1]    row_cells[2].text = item[2]doc.save("销售汇总表.docx")

这个例子说明:

程序不只是能写段落,也能生成结构化表格。 这在日报、统计表、结果通知里非常有用。

九、读取 Word 文档内容,也很常见

除了生成文档,有时你还要从已有 Word 文件里提取文字。

最基础的读取方式:

from docx import Documentdoc = Document("通知.docx")for para in doc.paragraphs:    print(para.text)

这会把文档中的段落文字一段一段打印出来。

这适合什么场景。

比如:

检查一批 Word 是否包含某个关键词 提取文档中的固定字段 做简单内容审查 统计某些模板是否填写完整

不过要注意,Word 文档里的结构可能比较复杂。 正文、表格、页眉页脚、文本框不一定都能用同一套简单方式读取全。 所以实际提取时,要先明确自己到底要抓哪部分内容。

十、Word 的内容替换,没有你想得那么无脑

很多人一想到 Word 自动化,第一反应就是:

把模板里的“姓名”替换掉不就行了。

方向没错,但实际中要注意一个坑:

Word 里的文本在底层不一定是整段连续存储的。 有些看起来连续的一句话,内部可能被拆成多个 run。 尤其当一段文字中间改过字体、颜色、加粗、下划线时,更容易被拆。

所以如果你只是做简单场景,先用段落整体替换可以试:

from docx import Documentdoc = Document("模板.docx")for para in doc.paragraphs:if"{姓名}"in para.text:        para.text = para.text.replace("{姓名}", "张三")doc.save("替换后.docx")

这种写法在简单模板里常常够用。 但如果模板格式复杂,直接替换 para.text 可能会导致原有局部样式丢失。 这也是为什么真实项目里,模板设计往往要尽量简化变量所在区域,避免过于花哨。

十一、做 Word 模板,最实用的思路是预留占位符

比如在模板中写:

{姓名}{部门}{日期}{金额}

然后程序批量替换这些占位符。

这类模板思路非常重要,因为它能把“内容设计”和“程序生成”分开。

写模板的人只管把文档排版好。 写脚本的人只管把变量填进去。

一个简单示例:

from docx import Documentdata = {"{姓名}": "张三","{部门}": "市场部","{日期}": "2025-02-01"}doc = Document("通知模板.docx")for para in doc.paragraphs:for old, new in data.items():if old in para.text:            para.text = para.text.replace(old, new)doc.save("张三_通知.docx")

这个模式特别实用。 因为一旦模板设计合理,后面批量生成就会非常顺。

十二、处理 PDF,和处理 Word 的思路不太一样

Word 更像“可编辑文档”。 PDF 更像“定稿文档”。

也就是说:

Word 更适合生成、修改、填模板 PDF 更适合阅读、归档、拆分、合并、提取

这决定了你处理 PDF 时,常见需求通常和 Word 不同。

最常见的 PDF 任务有:

读取页数 合并多个 PDF 拆分 PDF 提取文字 按页保存 批量重命名 分类归档

如果你想改 PDF 内容本身,那通常比 Word 麻烦得多。 因为 PDF 从设计目标上,就不是为“方便修改”而生的。

十三、处理 PDF 最常见的基础库之一:PyPDF2

安装:

python -m pip install PyPDF2

导入:

from PyPDF2 import PdfReader, PdfWriter

它很适合做这些基础动作:

读 PDF 看页数 按页拆分 合并 PDF 提取部分文本

先看最简单的读取页数:

from PyPDF2 import PdfReaderreader = PdfReader("合同.pdf")print("页数:", len(reader.pages))

这类操作在文档归档、检查完整性时很实用。

十四、提取 PDF 文字,要先接受一个现实:不是所有 PDF 都能顺利提

很多人一听“提取 PDF 文字”,以为像读 txt 一样简单。 现实里要分情况。

如果 PDF 本质上是文本型 PDF,也就是里面真有文字层,通常能提得比较顺。 如果 PDF 本质上是扫描图片型 PDF,那直接提取往往拿不到真正文本,得走 OCR 路线。

先看普通文本型 PDF 提取:

from PyPDF2 import PdfReaderreader = PdfReader("报告.pdf")for page in reader.pages:    text = page.extract_text()    print(text)

这能处理一部分常见 PDF。 但如果遇到提取结果换行乱、表格散、中文粘连、顺序奇怪,也别太意外。 PDF 文字提取,本来就比 Word 难搞。

所以你以后做 PDF 提取时,先问自己一句:

这个 PDF 是文字型,还是扫描型。 这个判断特别重要。

十五、合并多个 PDF,是高频中的高频

比如你有多个 PDF:

封面.pdf 正文.pdf 附件.pdf

想合成一个文件。 这时可以这样做:

from PyPDF2 import PdfMergermerger = PdfMerger()merger.append("封面.pdf")merger.append("正文.pdf")merger.append("附件.pdf")merger.write("完整报告.pdf")merger.close()

如果你要批量把一个文件夹里的 PDF 合并:

from PyPDF2 import PdfMergerfrom pathlib import Pathfolder = Path("报告文件")merger = PdfMerger()for file in sorted(folder.glob("*.pdf")):    merger.append(str(file))merger.write("合并结果.pdf")merger.close()

这类脚本在报告归档、合同合订、资料打包时特别常见。

十六、拆分 PDF,也非常常用

有时不是合并,而是要拆。

比如一个 50 页 PDF,要拆成单页文件,或者提取其中几页。 这时可以用 PdfWriter。

提取前两页:

from PyPDF2 import PdfReader, PdfWriterreader = PdfReader("大文件.pdf")writer = PdfWriter()for i in range(2):    writer.add_page(reader.pages[i])with open("前两页.pdf", "wb") as f:    writer.write(f)

如果想把每一页拆成一个单独文件:

from PyPDF2 import PdfReader, PdfWriterreader = PdfReader("大文件.pdf")for i, page in enumerate(reader.pages, start=1):    writer = PdfWriter()    writer.add_page(page)with open(f"第{i}页.pdf", "wb") as f:        writer.write(f)

这种操作在合同拆页、扫描件分页、资料拆分时很实用。

十七、批量重命名和归档 PDF,往往比“修改内容”更实用

很多办公室里的 PDF 自动化,根本不需要动文档内容。 更常见的是:

按规则重命名 按客户名归档 按日期分类 按页数筛出异常文件

这种情况下,文件系统操作往往比 PDF 内容处理更重要。

比如把所有 PDF 统一改名:

from pathlib import Pathfolder = Path("发票")for index, file in enumerate(folder.glob("*.pdf"), start=1):    new_name = f"发票_{index}.pdf"    file.rename(folder / new_name)

按文件名中的日期归档:

from pathlib import Pathimport shutilfolder = Path("合同")target = Path("归档")target.mkdir(exist_ok=True)for file in folder.glob("*.pdf"):    year = file.name[:4]    year_folder = target / year    year_folder.mkdir(exist_ok=True)    shutil.copy(file, year_folder / file.name)

你会发现,很多 PDF 自动化真正值钱的地方,不是“操作 PDF 内部结构”,而是围绕 PDF 做批量文件流转。

十八、Word 转 PDF,通常是办公自动化里很现实的需求

很多正式文件最终要发 PDF。 原因很简单:

格式不容易乱 别人打开更方便 更适合归档和打印

所以现实里经常出现这种需求:

先批量生成 Word 再统一转成 PDF

但这里要说一个很现实的点:

纯 Python 直接“高质量、稳定地跨平台把 Word 转 PDF”,并不是所有环境下都同样简单。 很多时候会依赖本机安装的 Office、系统环境,或者借助其他工具链。

在 Windows 办公环境里,常见思路之一是调用本机 Word 程序完成转换。 如果环境允许,这类方案很实用。 但它依赖办公软件环境,不像读写文本那样完全纯脚本化。

所以你要建立一个现实预期:

Word 生成很适合 Python PDF 拆并提取很适合 Python Word 转 PDF 能做,但常常和本机办公环境强相关

这类需求做项目时,通常要先确认部署环境。

十九、一个典型实战链路:Excel 名单 + Word 模板 + PDF 归档

这是很多办公室里非常有代表性的自动化套路。

第一步,从 Excel 读取名单和字段 第二步,把数据填进 Word 模板 第三步,生成一批 Word 文件 第四步,必要时转成 PDF 第五步,按部门、日期或姓名归档

这个链路为什么重要。

因为它说明,文档自动化几乎从来不是单点操作。 它常常是:

Excel 提供数据 Word 提供模板 PDF 提供交付格式 文件夹提供归档结构

而 Python 的强项,恰恰在于它能把这些环节串起来。

二十、做文档自动化时,最该先想清楚的是模板和规则

很多人一上来就问:

这个库怎么调 那个对象怎么改

其实文档自动化里,真正决定项目成败的,经常不是代码细节,而是前期规则设计。

比如你要先想清楚:

模板是否统一 占位符怎么写 变量来源在哪 输出文件名规则是什么 文件存放目录规则是什么 是否要保留原文件 是否需要失败重试 是否需要日志记录 是否要给人二次检查

这些问题如果前面不理顺,后面代码会越写越乱。 所以做文档自动化,最好先把“人工作业流程”翻译成“规则流程图”,再写代码。

二十一、文档自动化里,最容易踩的几个坑

1. 把 Word 模板做得过于复杂

变量拆在很多格式片段里,替换时很容易出问题。 模板越规整,程序越稳定。

2. 指望 PDF 像 Word 一样好改

PDF 更适合提取、合并、拆分、归档,不适合做复杂正文修改。

3. 文件名规则混乱

批量生成后,如果命名规则不统一,后续归档和查找会很痛苦。

4. 一上来直接覆盖原文件

脚本没跑稳之前,最好输出到新目录,别直接动原件。

5. 提取 PDF 文字时没先判断是不是扫描件

扫描型 PDF 往往提不出真正文字,要走 OCR。

6. 只关注代码,不关注模板设计

很多问题不是代码不会,而是模板设计不适合自动化。

二十二、什么时候优先选 Word,什么时候优先选 PDF

如果你是要生成、填写、修改、编辑内容,优先想到 Word。 如果你是要交付、归档、拆分、合并、提取页数,优先想到 PDF。

再说直白一点:

要“写”,多半先选 Word。 要“发”和“存”,多半最后是 PDF。

这也是很多自动化流程会同时碰到二者的原因。

二十三、这一章最该记住的不是几个库名,而是一套文档自动化思路

先判断是处理内容还是处理文件。 再判断对象是 Word 还是 PDF。 如果是 Word,优先想模板、变量、批量生成。 如果是 PDF,优先想提取、合并、拆分、归档。 如果数据来自 Excel,就把 Excel 当数据源。 如果最终要交付,就把 PDF 当结果格式。 如果需求复杂,就把流程拆开,一步一步串起来。

这套思路一旦建立起来,你以后面对文档自动化任务,就不会只剩“手工点一遍”这一条路。

二十四、本章要点整理

批量处理 Word 与 PDF,核心目标通常是生成、修改、提取、转换和归档。 处理 Word 最常用的库之一是 python-docx,适合创建文档、添加段落、表格、读取文本和做简单模板替换。 处理 PDF 常用 PyPDF2 等工具,适合读取页数、提取文字、合并 PDF、拆分 PDF。 Word 更适合可编辑内容的生成与修改,PDF 更适合定稿、交付、归档和拆并处理。 真实文档自动化往往不是单点任务,而是和 Excel 数据源、文件命名规则、归档目录一起构成完整流程。 文档自动化真正的关键,不只是会用库,而是先把模板、字段、命名和流程规则设计清楚。

最新文章

随机文章