ARTICLE · 1084551
Python办公——PDF 文字提取与关键词统计
📄 pdf_extract_text —— PDF 文字提取与关键词统计
把 PDF 报告/合同/课件里的文字「抠出来」存成 txt,并统计关键词出现次数。做资料归档、合规检查、内容检索都很好用。
适用人群
• 财务 / 运营:从一堆报表 PDF 里提取文字、统计「营收/成本」出现次数。 • 老师 / 科研:把课件 PDF 转成可搜索文本,统计重点词频。 • 法务 / 行政:合同批量提取,检查关键条款命中情况。 • 自媒体:把参考资料 PDF 转文字,二次创作。
功能简介
1. 读取 testdata/docs/下所有 PDF。2. 用 PyPDF2 提取每篇全文,写到 output/<原名>.txt。3. 读取 testdata/keywords.txt(每行一个关键词)。4. 统计每个关键词在全部文档中的出现次数(英文不区分大小写)。 5. 输出汇总报告 output/keywords_report.txt(总次数 + 每篇明细)。
依赖:PyPDF2(第三方库,pip install PyPDF2 或 pip install pypdf)。


环境准备
pip install PyPDF2# 或等价的新版分叉:pip install pypdfpython --version # 建议 3.8+本机已验证环境:Python 3.14 + PyPDF2 3.0.1。
使用方法
# 1) 生成测试素材(2 个中文 PDF + keywords.txt,用 fpdf2 现画)python make_testdata.py# 2) 提取文字 + 统计关键词python pdf_extract_text.py# 3) 自定义目录与关键词文件python pdf_extract_text.py \ --input ./我的PDF \ --keywords ./我的关键词.txt \ --output ./结果参数说明:
--input | ./testdata/docs | |
--output | ./output | |
--keywords | ./testdata/keywords.txt |
核心代码讲解
from PyPDF2 import PdfReader# 1. 逐页提取文字reader = PdfReader(pdf_path)text = "\n".join(page.extract_text() or""for page in reader.pages)# 2. 落盘为 txtwithopen(out_txt, "w", encoding="utf-8") as f: f.write(text)# 3. 关键词计数(英文统一小写,中文不受影响)lower = text.lower()count = lower.count(kw.lower())关键点:PyPDF2 的 extract_text() 对文本型 PDF(如本脚本用 fpdf2 生成的)提取效果好;扫描件(图片 PDF)需先用 OCR(如 pytesseract)识别,这是进阶方向。
测试素材说明
python make_testdata.py 用 fpdf2 现画 2 个中文 PDF:
• testdata/docs/doc1_办公自动化.pdf:讲文件重命名、文件夹整理、自动发邮件。• testdata/docs/doc2_报表自动化.pdf:讲报表与邮件自动化、PDF 提取。• testdata/keywords.txt:Python / 自动化 / 报表 / 邮件 / 办公
运行后 output/ 含:
• doc1_办公自动化.txt、doc2_报表自动化.txt(提取出的纯文本)• keywords_report.txt(统计报告,示例结果:自动化 8 次、报表 8 次、邮件 4 次…)
注意:测试 PDF 由 fpdf2 生成并内嵌黑体字体,因此可被 PyPDF2 正确提取中文;你自己的 PDF 只要是「文本型」即可,扫描图片型需另接 OCR。
常见问题
Q1:提取出来是空文件 / 乱码?多为「扫描件 PDF」(内容是图片)。需用 OCR:pip install pytesseract + 安装 Tesseract,对每页先转图再识别。文本型 PDF 一般无此问题。
Q2:关键词没统计到中文?代码对中文按原样匹配,只要 PDF 文字能被提取到就能统计。空结果通常是 Q1 导致文字没提取出来。
Q3:想统计「词频」而非「子串次数」?count() 是子串匹配(如「报表」会命中「报表」)。严格分词需接 jieba 分词后再计数,进阶练习。
Q4:PyPDF2 和 pypdf 选哪个?二者 API 兼容,本脚本用的是 PyPDF2;若装的是 pypdf,把 from PyPDF2 改成 from pypdf 即可。
Q5:大 PDF 很慢?PyPDF2 逐页提取,文档很大时可只处理前 N 页或加进度提示(可在循环里 print_step)。
打包成 exe
把 PDF 提取工具发给同事,用 PyInstaller 打包。
1. 安装
pip install pyinstaller PyPDF22. 本脚本打包命令
依赖 PyPDF2(纯 Python),资源走相对路径,无需 --add-data:
cd pdf_extract_textpyinstaller -F -w ^ --name pdf_extract_text ^ --icon myicon.ico ^ pdf_extract_text.py一行版:
pyinstaller -F -w --name pdf_extract_text pdf_extract_text.py
产物:dist/pdf_extract_text.exe。
3. 资源路径的坑
-F 后程序解压到临时目录,但本脚本用 ./testdata、./output 这种相对当前工作目录路径——exe 要和 testdata 同目录、在该目录打开命令行运行即可。
若要 exe 自带 testdata(含示例 PDF 与关键词),加 --add-data:
pyinstaller -F -w --name pdf_extract_text ^ --add-data "testdata;testdata" ^ pdf_extract_text.py代码里加「兼容路径」函数(按需):
import sys, osdefresource_path(rel): base = getattr(sys, "_MEIPASS", os.path.abspath("."))return os.path.join(base, rel)4. 加图标
准备 myicon.ico,加 --icon myicon.ico;没有则删掉该行。
5. 瘦身
• PyPDF2 是纯 Python,打包约 8~12 MB,已很小。 • 无需 UPX、无需 exclude-module。
6. 常见坑汇总
-w | -w | |
小结
pdf_extract_text 把「PDF → 文本 → 关键词统计」串成一条流水线,是知识管理的基础件。配合 file_organizer 先按类型归档、batch_rename 再统一编号,就能搭起一套完整的文档自动化工作流。
进阶:OCR 识别扫描件、jieba 中文分词词频、提取后自动生成词云。