阅读文本 / Reading text
本文使用合成样本演示处理方法。代码已通过隔离环境中的示例检查;这不代表对所有真实文件或产品效果的保证。处理重要文件前,请保留原件,并按文中的边界与验收项复核。
这篇先解决哪一个问题
短文本或空文本只是进一步检查的信号,不能直接等同于扫描件。下面逐页记录是否提取到文字;空白页、图像页、编码异常页需要不同后续判断。pypdf 文本提取不是 OCR。
自包含的合成示例
依赖见导入列表。代码在内存中构造输入;运行记录单独提供,不代表对所有真实文件的保证。
from io import BytesIO
import pymupdf
from pypdf import PdfReader
with pymupdf.open() as doc:
page = doc.new_page()
page.insert_text((50, 50), "Hi")
doc.new_page()
raw = doc.tobytes()
reader = PdfReader(BytesIO(raw))
records = []
for index, page in enumerate(reader.pages):
text = page.extract_text() or ""
records.append({"page": index + 1, "text": text,
"status": "text_present" if text.strip() else "review_empty_text"})
assert len(records) == 2
assert records[0]["status"] == "text_present"
assert records[0]["text"].strip() == "Hi"
assert records[1]["status"] == "review_empty_text"
当你使用
pypdf
的
extract_text()
处理一份视觉上清晰可见文字的 PDF,却只得到空白字符串或零星乱码时,第一反应往往是检查参数配置:是否遗漏了
extraction_mode="layout"
?是否需要指定旋转角度?但在绝大多数工程实践中,这并非参数调优能解决的问题,而是工具选型错位。pypdf 本质上是 PDF 内容流(Content Stream)解析器,它读取的是文件中嵌入的文本对象指令;如果 PDF 本质是一张图片(扫描件),无论怎么调整提取模式,都无法凭空读出并不存在的字符编码。
文本解析与图像识别的技术分野
理解这一问题的核心在于认清 PDF 格式的设计初衷。PDF 是为了精确打印和视觉呈现而生,并非为了结构化数据存储。数字原生 PDF 包含字体资源、编码映射表和绝对定位的文本绘制指令,pypdf 通过解析这些底层指令还原文字。这种机制的优势在于确定性:它不会混淆形近字(如
0
和
O
),能完美保留特殊符号与连字,且不受图像噪声干扰。
相反,扫描版 PDF 仅是图像的容器。视觉上可见的文字在文件结构中只是像素点阵,不存在可被
extract_text()
读取的文本对象。即便某些扫描文档经过 OCR 软件处理并嵌入了隐藏文本层(即“双层 PDF”),pypdf 也只能提取该层内容。若原始 OCR 质量差、文本层缺失、编码损坏或与图像严重不对齐,提取结果就会残缺甚至完全为空。此时继续调试 pypdf 参数毫无意义,必须切换到光学字符识别(OCR)流程。判断依据不应靠肉眼观察页面是否有字,而应通过程序化手段检测文本层的实际存在性与有效性。
合成示例:构建可验证的检测基线
为演示如何程序化区分上述情况,我们需要构造一套标准化的合成输入进行测试。请注意,以下代码仅为逻辑演示,需在自行锁定依赖的环境中运行,并非对特定生产文件的实测报告。读者应按以下方法准备测试数据:
正常数字 PDF
:使用 Word 或 LaTeX 导出包含文本 "Invoice #2024-001" 的文档。
纯扫描 PDF
:将任意纸质文档扫描为 JPEG 后,使用工具将其封装为单页 PDF,确保不含任何文本层。
边界情况样本
:创建一个包含隐藏文本层但内容为空字符串或全空白符的“伪 OCR”PDF,模拟识别失败的双层文档。
文本层可用性检测代码实现
以下 Python 示例展示了如何在内存中构建稳健的检测逻辑。代码依赖
pypdf>=3.0.0
,请在独立虚拟环境中安装对应版本。此脚本不包含真实文件路径,读者需自备前述合成测试文件替换占位路径。
验收决策与人工审查边界表
代码演示仅解决了“有无文本层”的二元判断,端到端效果还需考虑更多现实因素。下表列出常见观察现象及对应处理决定,明确自动化流程的适用范围与人工介入点:
特别强调:当文档同时包含可选中文本层和图像层时,不能简单信任文本层完整性。某些扫描仪生成的“双层 PDF”文本层仅覆盖部分内容,或坐标系统与图像严重错位。此类情况必须纳入人工审查队列,或通过视觉比对算法二次验证。代码能分流,但不能保证语义正确。
参考资料与下一步行动
pypdf 官方文本提取文档:
Extract Text from a PDF
pypdf 关于 OCR 与文本提取区别的说明:同上文档 "OCR vs. Text Extraction" 章节
具体异常的处理决定
观察
应做什么
不应推断
短文本
仍保留文本
不因少于阈值强制 OCR
空文本
检查页图和内容类型
不直接判为扫描件
解析失败
记录异常阶段
不伪装成空白页
将这份检查清单用于文档翻译
文件拆合、加密或附件处理属于交付准备,翻译不能替代这些检查。保留原件和处理清单,再评估译稿的页序、链接与内容完整性。
OmniDoc(产品入口)
提供多格式文档翻译入口,官网介绍了 OCR、术语表与双语对照功能。对希望直接从文件开始处理的团队,这是一条值得用实际样本评估的路径。请使用有权上传的脱敏文件,并用本篇的检查项复核结果;这里不声称 OmniDoc 使用了本文的开源库或内部算法,也不以示例代替产品性能测试。
- 1 -
更新于 2026-10-09