共计 1806 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
处理 PDF 文档时,开发者经常遇到以下问题:

- 格式多样性:PDF 可能包含文本、表格、图片等多种元素,统一处理困难
- 文本提取不完整:部分 PDF 使用特殊编码或加密,导致内容提取缺失
- 结构混乱:自动生成的 PDF 常有错误的段落分割和换行符
- 表格数据丢失:跨页表格和复杂布局难以完整保留结构
技术选型对比
主流 PDF 解析库各有特点:
- PyPDF2
- 优点:轻量级,安装简单,支持基础文本提取
-
缺点:无法处理复杂布局,表格支持差
-
pdfplumber
- 优点:保留页面布局信息,支持表格提取
-
缺点:处理大文件内存占用高
-
pdfminer.six
- 优点:解析精度高,支持复杂文档
- 缺点:API 复杂,学习曲线陡峭
核心实现
1. PDF 文本提取
使用 pdfplumber 提取文本和表格:
import pdfplumber
def extract_text(pdf_path):
text = ""
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
text += page.extract_text() + "\n"
# 提取表格
for table in page.extract_tables():
for row in table:
text += "|".join(str(cell) for cell in row) + "\n"
return text
2. 数据清洗
处理常见问题:
- 去除多余空白和特殊字符
- 修复错误的换行符
- 统一编码格式
import re
def clean_text(text):
# 合并错误换行
text = re.sub(r'(?<!\n)\n(?!\n)', ' ', text)
# 去除多余空白
text = ' '.join(text.split())
# 统一编码
return text.encode('utf-8', 'ignore').decode('utf-8')
3. 特征工程
根据模型需求转换文本:
- 对 BERT 等模型:保留完整句子结构
- 对 CNN 模型:构建词向量矩阵
from sklearn.feature_extraction.text import TfidfVectorizer
def vectorize_text(texts):
vectorizer = TfidfVectorizer(max_features=5000)
return vectorizer.fit_transform(texts)
模型适配
BERT 适配示例
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
inputs = tokenizer(cleaned_text, return_tensors="pt", truncation=True, padding=True)
CNN 适配示例
import torch
from torch.nn.utils.rnn import pad_sequence
# 假设已有词向量映射
sequences = [torch.tensor([word2idx[w] for w in text.split()]) for text in texts]
padded = pad_sequence(sequences, batch_first=True)
性能优化
-
多线程处理
from concurrent.futures import ThreadPoolExecutor def batch_process(pdf_paths): with ThreadPoolExecutor() as executor: results = list(executor.map(extract_text, pdf_paths)) -
内存管理
- 使用生成器逐页处理大文件
-
及时释放不再使用的 PDF 对象
-
缓存策略
- 对处理过的 PDF 存储中间结果
- 使用 joblib 缓存特征提取结果
避坑指南
- 编码问题
- 总是明确指定编码格式
-
处理前检查文件魔术头
-
表格处理
- 优先使用 pdfplumber 的表格提取
-
对复杂表格考虑转换为图像 +OCR
-
性能陷阱
- 避免重复解析同一 PDF
- 对大文件设置处理超时
总结与扩展
这套方案已经能处理大多数 PDF 解析场景,但要构建生产级系统还需要考虑:
- 错误处理和重试机制
- 自动化测试不同 PDF 类型
- 监控解析质量指标
建议读者尝试用这份代码基础优化自己的处理流程,并思考如何扩展到 Word、Excel 等其他文档类型。处理非结构化数据的关键是保持流水线的灵活性和可扩展性。
正文完
