PDF 与 OCR 边界
本节目标
理解 PDF 为什么不等于“带页码的 Word”,能按页选择原生文本抽取、OCR、版面/视觉模型或人工复核,并为每条路径保存足够的版本、位置和质量证据。
PDF 首先描述页面显示
PDF 可以把字符、字体、绘制指令和坐标分散存储。人眼看到的段落不一定对应一个内部文本对象;空格可能只是字形间距,表格可能只是若干线条和坐标文本。pypdf 官方文档明确讨论了阅读顺序、空格、表格、图片文字和内存等困难,也明确说明 pypdf 不是 OCR 软件。
因此“extract_text() 返回非空”只能证明解析器找到了某些文本对象,不能证明:
- 文本完整且顺序正确;
- 隐藏文本层与页面图像一致;
- 表格行列、公式和脚注已恢复;
- 页面没有重复、乱码或错位。
先给页面分类
| 页面类型 | 现象 | 首选路径 | 主要风险 |
|---|---|---|---|
| 数字生成 | 有字体和文本对象 | 原生抽取 + 版面验证 | 乱序、连字符、字体映射 |
| 扫描图像 | 页面主要是位图,几乎无文本 | 渲染 + OCR | 识字、旋转、分栏、噪声 |
| 混合页面 | 图像、文本对象并存 | 分区域或按层处理 | 重复文本、图注遗漏 |
| 隐藏 OCR 层 | 图像上覆盖不可见文字 | 对齐抽查后复用或重做 | 旧 OCR 层错误/错位 |
| 表单/签名/公式密集 | 文本与视觉关系关键 | 专用解析或 VLM + 人工门禁 | 字段配对、符号、签名语义 |
分类最好按页或区域进行,而不是整份文件一刀切。封面可能是扫描图,正文却是数字文本。
决策顺序
- 原生抽取:成本低,保留已有字符信息;先检查文本量、字符质量、顺序和页面覆盖。
- OCR:无可靠文本层且页面有图像文字时使用;记录语言、分辨率、引擎与词/行位置。
- 版面/表格/公式模型:OCR 只识别字符与位置,不自动恢复语义结构。
- VLM:适合图表或复杂视觉理解,但输出可能遗漏、重述或生成;必须保留图像区域和结构化约束。
- 人工复核:关键金额、剂量、合同条款、公式、低置信字段或质量门禁失败时不可省略。
对数字 PDF 全量 OCR 通常浪费资源,还可能把正确的原生字符变成识别错误。OCRmyPDF 的目标之一是为扫描 PDF 添加可搜索文本层;当前 17.8 文档把已有文本层策略统一为 --mode default|force|skip|redo,旧 --force-ocr、--skip-text、--redo-ocr 仍是兼容别名。适配器要记录实际 mode、软件版本和输入页分类,不能只写“已 OCR”;触发条件必须明确。
OCR 适配器契约
OCR 产物至少记录:
- 原 PDF 哈希、页码、渲染区域和页面图像哈希;
- 渲染 DPI、旋转/去倾斜/二值化等预处理;
- 引擎、版本、语言包与配置;
- 词、行或块文本及 bounding boxes;
- 引擎给出的置信信号(若有);
- 处理耗时、警告、失败与人工复核状态。
Tesseract 的语言数据和页面分割配置会影响结果。置信分数是引擎内部信号,不是“该字段为事实的概率”,也不能跨引擎直接比较。
OCR 缓存键应包含源页面版本与 OCR 配置;否则换了语言包或 DPI 仍可能错误复用旧结果。Chunking 参数变化不应触发重新 OCR。
公式、表格和图像不是普通 OCR
0/O、1/l/I、小数点、负号和上下标是高风险混淆;- 数学公式需要二维结构,线性纯文本经常丢分式、根号和上下标;
- OCR 给出单词和坐标,不等于恢复表格表头、合并单元格和跨页关系;
- 图表数值提取需要坐标轴、图例和视觉元素理解;
- 手写、印章、签名的识别与法律含义是不同问题。
高风险字段应定义领域规则,例如金额格式、总和校验、日期范围和表格列一致性,并保留人工确认。
如何评测
按文档类型、语言、扫描质量和布局分层抽样。至少分别测:
- 字符错误率(CER)/词错误率(WER):衡量转写差异,但不直接表示事实风险;
- 关键字段准确率:金额、日期、编号、剂量等逐字段精确比较;
- 阅读顺序:人工判断段落是否可读、脚注是否插错;
- 表格单元格:行列、表头、合并关系和关键数值;
- 可追溯性:任一输出能否回到页码和区域;
- 覆盖率:空页、漏页、未识别区域与重复内容。
平均 CER 很低也可能掩盖一个关键小数点错误。验收阈值要由用途和风险决定,而不是照搬工具宣传数字。
安全、隐私与成本
PDF 和图像可能含个人信息、隐藏层、附件和元数据。使用远程 OCR/VLM 前要确认数据地域、保留策略、权限和供应商契约。日志不应复制全文;缓存应继承源文档权限并有删除策略。
OCR 工具不是恶意 PDF 隔离层
OCRmyPDF 当前文档明确说明它并非为抵御携带恶意内容的 PDF 而设计。文件检测、页数限制和 OCR mode 都不能替代隔离进程、最小权限、恶意内容扫描与人工发布门禁;教学项目只登记这些边界,未运行 PDF/OCR。
OCR/VLM 还受页数、分辨率、GPU/CPU、费用和延迟影响。设置单页像素、总页数、超时和并发上限;超限进入队列或人工处理,不要在交互请求中无限运行。
常见错误与排查
- 文本非空就跳过 OCR:隐藏 OCR 层可能与图像错位,应抽样对齐。
- 所有 PDF 先 OCR:会增加成本并可能降低数字 PDF 质量。
- 只看一页“像是对的”:要覆盖真实布局和关键字段。
- 把 OCR 置信度当正确率:它没有替代 gold label。
- 让 VLM 直接输出最终 Markdown:缺少中间坐标、版本和遗漏检查。
- 声称支持 PDF,但测试只有伪造头部:文件登记测试不等于 PDF 解析测试。
练习
- 为数字、扫描、混合、隐藏 OCR 层四类页面写触发规则、缓存键和回退状态。
- 设计一个 12 页 gold set,覆盖中文、英文、双栏、旋转、低分辨率、公式、表格、印章与关键数字。
- 为“发票总金额”设计字符级、字段级和人工复核三层门禁。
- 写一份外部 OCR 适配器接口:输入不得只含文件路径,输出不得只含全文字符串。
自测
- 我能解释 PDF 文本对象与视觉阅读顺序的差异。
- 我会逐页选择原生抽取、OCR、视觉模型或人工复核。
- 我能为 OCR 结果保存引擎、配置、页面与坐标。
- 我知道 CER、置信分数和关键字段准确率各回答什么问题。
- 我不会把教学项目的格式登记误报成 PDF/OCR 能力验证。
参考资料与下一步
- pypdf: Extract Text from a PDF
- Tesseract User Manual
- OCRmyPDF Introduction
- Docling supported formats and pipelines
来源获取日期:2026-07-22;上述工具行为和安装方式可能随版本变化。下一步:元数据、质量验证与项目。