这是Document Layout Analysis(文档版面分析),对于pdf扫描件,识别并剔除页眉、页脚与页码。
由于扫描件不存在文本层,无法通过PDF元数据获取,需要结合OCR+版面分析+跨页统计来实现
整体流程:
1 | 扫描PDF |
为什么
在构建RAG向量时,纯OCR会导致以下错误:
- 页码会污染向量
- 页眉、页脚会降低召回质量
例如,不进行清洗,会得到如下文本:
1 | 版权所有XX公司 |
正确的应该是:
1 | Transformer由Google提出…… |
难点
单纯的OCR识别可能存在:
- OCR识别有误
- 页眉内容可能变化
- 页码每页不同
- 页脚可能带日期、水印
因此不能简单依赖固定文本匹配。
实现方案
OCR + 坐标聚类 + 跨页重复检测
OCR提取文字坐标
推荐:
工具|效果
|–|–|
PaddleOCR|中文最好
Tesseract OCR|免费
MinerU|PDF解析优秀
PP-StructureV3|版面分析
得到文本块:
1 | [ |
坐标聚类(位置归一)
设置页面高度:
1 | H = page_height |
计算:
1 | top_ratio = y1 / H |
例如:
1 | 0~0.08 页眉区域 |
转换:
1 | for block in blocks: |
跨页统计识别页眉
假设当前文档有100页
统计:
1 | XX公司内部资料 95次 |
满足:
1 | 出现频率 > 70% |
判定:
1 | header |
示例:
1 | Counter() |
判断:
1 | count / total_pages > 0.7 |
识别页码
页码特点:
- 位置固定:
- 底部中间
- 底部左侧
- 底部右侧
- 顶部右侧
- 数字规律
得到页码候选:
1 | [1,2,3,5,6] |
进行检查
1 | 页码差≈1 |
即可确认。
识别页脚
页脚特点:
- 位置接近底部
- 出现频率高
- 文本相似
例如:
1 | Confidential |
统计:
1 | 版权所有 XX公司 100次 |
则判定其为页脚。
模糊匹配(解决OCR错误)
OCR识别出来的页眉页脚可能有误或者存在差异,使用rapidfuzz进行模糊匹配
例如:
1 | from rapidfuzz import fuzz |
若:
1 | similarity > 90 |
则视为同一页眉。
最后更新: 2026年09月10日 11:10