阅读文本 / Reading text
本文使用合成样本演示处理方法。代码已通过隔离环境中的示例检查;这不代表对所有真实文件或产品效果的保证。处理重要文件前,请保留原件,并按文中的边界与验收项复核。
这篇先解决哪一个问题
没有文字不能直接判定“文本层正常”,也不能直接判为扫描件。下面分别记录文本、替代字符与页面图像引用,输出待复核状态;图像引用也不证明图片已经覆盖整页或文字可识别。
自包含的合成示例
依赖见导入列表。代码在内存中构造输入;运行记录单独提供,不代表对所有真实文件的保证。
from io import BytesIO
from PIL import Image
import pymupdf
def inspect(page):
text = page.get_text().strip()
images = page.get_images()
if "\ufffd" in text:
state = "review_replacement_characters"
elif text:
state = "text_present_needs_semantic_review"
elif images:
state = "image_without_extracted_text"
else:
state = "empty_text_needs_review"
return {"state": state, "characters": len(text), "image_refs": len(images)}
with pymupdf.open() as doc:
doc.new_page().insert_text((50, 50), "Text sample")
doc.new_page()
picture = BytesIO()
Image.new("RGB", (16, 16), "red").save(picture, format="PNG")
doc.new_page().insert_image(pymupdf.Rect(10, 10, 100, 100), stream=picture.getvalue())
assert inspect(doc[0])["state"] == "text_present_needs_semantic_review"
assert inspect(doc[1])["state"] == "empty_text_needs_review"
assert inspect(doc[2])["state"] == "image_without_extracted_text"
assert inspect(doc[2])["characters"] == 0
PDF 能看不能复制,未必是扫描件
用户在浏览器或阅读器中能正常看到文字,但复制出来却是乱码、空白或无关符号,这通常不是文件损坏,也不是纯粹的扫描件。这种现象的根源在于 PDF 内部的字形(Glyph)到 Unicode 的映射表(ToUnicode CMap)缺失或错误。渲染引擎依靠字形索引绘制视觉内容,而剪贴板和文本提取工具依赖映射表还原语义字符。当两者断裂时,就会出现“视觉正常、机器不可读”的坏文本层。在处理文档翻译或结构化提取前,必须先区分这是映射故障还是真正的图像内容,否则后续的 OCR 或 NLP 流程会在错误的前提上空转。
字形索引与 Unicode 映射的断裂机制
PDF 规范允许字体仅嵌入字形轮廓和宽度信息,而不包含字符编码映射。如果生成 PDF 的软件未正确写入 ToUnicode 表,或者使用了自定义编码且未提供解码规则,提取器就只能拿到原始的字形 ID(CID)。这些 ID 对渲染器有意义,但对文本处理毫无价值。有些工具会尝试用启发式算法猜测映射,结果往往是输出看似合理实则错误的字符,比如把中文标点变成拉丁字母,或者将数字替换为控制符。这种“伪文本”比纯空白更危险,因为它能通过非空检查,却在下游环节引发静默的数据污染。判断此类问题的关键,不是看能否选中文字,而是验证提取出的字符串是否在语义上与视觉内容一致。
PyMuPDF 内存合成诊断与断言验证
上述代码中,
diagnose_text_layer
函数通过
get_text("text")
获取原始文本,并利用
unicodedata.category
过滤控制字符和空白符,计算有效内容占比。同时通过
get_text("blocks")
检测图像块存在性。两个断言分别验证了正常文档的高可打印率(>0.9)和扫描文档的零字符计数,覆盖了核心分支逻辑。注意:此诊断仅基于统计特征,对于加密字体或特殊编码仍需人工复核。
验收决策表与人工审查边界
参考链接与下一步行动
PyMuPDF 文本提取详解:https://pymupdf.readthedocs.io/en/latest/app1.html
PyMuPDF 官方文档首页:https://pymupdf.readthedocs.io/
文本与图像信号的分流
信号
下一步检查
不应作出的结论
有可打印文字
核对语义、顺序与来源
能提取就代表正确
有替代字符
回看编码和字体映射
所有字符都已丢失
有图片但无文本
检查图片是否含文字
一定是整页扫描件
文本与图片都未检出
查看页面绘制内容
一定是空白页
将这份检查清单用于文档翻译
先把页面顺序、来源位置与文本完整性检查清楚,再把同一份脱敏样本交给翻译流程。译后仍要检查标题、正文和图注是否正确对应,不能只看文字是否通顺。
OmniDoc(产品入口)
提供多格式文档翻译入口,官网介绍了 OCR、术语表与双语对照功能。对希望直接从文件开始处理的团队,这是一条值得用实际样本评估的路径。请使用有权上传的脱敏文件,并用本篇的检查项复核结果;这里不声称 OmniDoc 使用了本文的开源库或内部算法,也不以示例代替产品性能测试。
- 1 -
更新于 2026-10-08