Python PDF案例:如何高效读取PDF文本内容?完整实战指南
📚 目录导读
- 为什么选择Python读取PDF?
- 必备工具与库:PyPDF2、pdfplumber、pdfminer.six
- 实战案例一:使用PyPDF2提取纯文本
- 实战案例二:使用pdfplumber保留表格与布局
- 实战案例三:处理扫描版PDF(OCR方案)
- 常见问题与性能优化建议
- Q&A:你关心的PDF读取难题
为什么选择Python读取PDF?
PDF(Portable Document Format)作为文档交换的标准格式,广泛用于报告、合同、学术论文等场景,但在数据分析和自动化处理中,PDF的“不可编辑性”成为一大障碍,Python凭借其丰富的第三方库生态,成为解决PDF文本提取的首选语言。

相比手动复制粘贴,Python脚本可实现:
- 批量处理:同时解析数百个PDF文件
- 结构化提取、段落、表格层级
- 跨平台兼容:Windows/Mac/Linux统一运行
必备工具与库:PyPDF2、pdfplumber、pdfminer.six
| 库名称 | 核心优势 | 适用场景 | 安装命令 |
|---|---|---|---|
| PyPDF2 | 轻量、快速,支持提取元数据 | 纯文本PDF,不需要复杂布局 | pip install PyPDF2 |
| pdfplumber | 保留页面坐标与表格结构 | 带表格、多栏布局的PDF | pip install pdfplumber |
| pdfminer.six | 高度定制化,支持中文等复杂字符 | 多语言、非标准编码PDF | pip install pdfminer.six |
选型建议:
- 如果PDF是“文字型”(非扫描),优先尝试
PyPDF2或pdfplumber。 - 若提取结果出现乱码或缺失字符,切换至
pdfminer.six。 - 扫描PDF(图片格式)需配合OCR工具(如
pytesseract)。
实战案例一:使用PyPDF2提取纯文本
基础代码
import PyPDF2
def extract_text_pypdf2(pdf_path):
text = ""
with open(pdf_path, 'rb') as file:
reader = PyPDF2.PdfReader(file)
for page_num in range(len(reader.pages)):
page = reader.pages[page_num]
text += page.extract_text()
return text
print(extract_text_pypdf2("sample.pdf"))
关键点
PdfReader替代了老版本的PdfFileReader,兼容性更好。- 部分PDF因字体编码问题可能返回空字符串,此时可尝试
strict=True参数。
小技巧
# 仅提取前5页,节省时间
for page in reader.pages[:5]:
text += page.extract_text()
实战案例二:使用pdfplumber保留表格与布局
保留段落与坐标
import pdfplumber
with pdfplumber.open("report.pdf") as pdf:
for page in pdf.pages:
# 提取文本并保留换行符
text = page.extract_text(layout=True)
print(text)
# 提取表格(返回为列表字典)
tables = page.extract_tables()
for table in tables:
for row in table:
print(row)
处理多栏PDF
# 通过设定栏宽参数分段提取 width = page.width left_col = page.within_bbox((0, 0, width/2, page.height)) right_col = page.within_bbox((width/2, 0, width, page.height))
应用场景:
学术论文(两栏格式)、财务报表(多列表格)、简历(固定位置字段)。
实战案例三:处理扫描版PDF(OCR方案)
扫描版PDF本质上是图片集合,需先提取图片再执行OCR(光学字符识别)。
三步走方法
- 从PDF提取图片:使用
pypdfium2或pdf2image - 图片预处理:灰度化、二值化、降噪(OpenCV)
- OCR识别:
pytesseract+ Tesseract引擎
完整代码示例
from pdf2image import convert_from_path
import pytesseract
def ocr_pdf(pdf_path):
images = convert_from_path(pdf_path, dpi=300)
full_text = ""
for img in images:
# 预处理:转为灰度
gray = img.convert('L')
text = pytesseract.image_to_string(gray, lang='chi_sim+eng')
full_text += text + "\n"
return full_text
print(ocr_pdf("scanned_doc.pdf"))
注意事项:
- 需安装Tesseract-OCR引擎(Mac:
brew install tesseract,Win: 下载exe) - 中文OCR需下载中文语言包:
chi_sim
常见问题与性能优化建议
问题1:提取内容为空或乱码
- 原因:PDF编码非标准(如CJK字符),或使用了自定义字体。
- 解决:
# pdfminer.six方案 from pdfminer.high_level import extract_text text = extract_text(pdf_path, password='', page_numbers=[0,1])
问题2:处理速度慢
- 优化技巧:
- 只处理需要的页面:
reader.pages[start:end] - 使用
pdfplumber时关闭表格检测:page.extract_text(keep_blank_chars=True) - 对大文件启用流式读取:
PdfReader(pdf_path, strict=False)
- 只处理需要的页面:
问题3:提取结果格式混乱
- 修复方法:
# 合并多余空格与换行 import re clean_text = re.sub(r'\n+', '\n', text) clean_text = re.sub(r' {2,}', ' ', clean_text)
Q&A:你关心的PDF读取难题
Q1:如何从PDF中提取特定关键字所在段落?
A:先提取全文,再用正则定位,示例:
import re
text = extract_text_pypdf2("contract.pdf")
# 查找“甲方”之后的100个字符
match = re.search(r'甲方(.{100})', text, re.DOTALL)
if match:
print(match.group(1))
Q2:PyPDF2和pdfplumber哪个更快?
A:PyPDF2速度通常快20-30%,但准确率较低,若需保留表格结构,选pdfplumber;纯文本首选PyPDF2。
Q3:如何从PDF中提取图片?
A:使用pdfplumber的page.images属性获取坐标,或使用PyPDF2的reader.pages[0].images遍历。
from PyPDF2 import PdfReader
reader = PdfReader("doc.pdf")
for img in reader.pages[0].images:
with open(img.name, 'wb') as f:
f.write(img.data)
Q4:读取加密PDF怎么办?
A:需提供密码:
reader = PdfReader("encrypted.pdf")
if reader.is_encrypted:
reader.decrypt("password")
Q5:如何批量处理文件夹内所有PDF?
A:结合os模块:
import os
for filename in os.listdir("pdf_folder"):
if filename.endswith(".pdf"):
text = extract_text_pypdf2(os.path.join("pdf_folder", filename))
with open(f"output/{filename}.txt", 'w') as f:
f.write(text)
选择最适合你的方案
从轻量的PyPDF2到强大的pdfplumber和OCR方案,Python为PDF文本提取提供了多层次解决方案,建议根据文档类型和提取精度需求选择工具:
- 日常报告:PyPDF2 + 正则清洗
- 学术论文或表格:pdfplumber
- 扫描件/历史档案:OCR组合方案
如果你遇到特定类型的PDF(如表单、带水印、旋转页面),欢迎在评论区留言,我会给出针对性代码示例。
本文首发于技术博客,转载需注明来源。