一、文档自动化,真正难的往往不是技术,而是重复
办公自动化里,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 数据源、文件命名规则、归档目录一起构成完整流程。 文档自动化真正的关键,不只是会用库,而是先把模板、字段、命名和流程规则设计清楚。