PDF 解析

PDF 能看不能复制,未必是扫描件

没有文字不能直接判定“文本层正常”,也不能直接判为扫描件。下面分别记录文本、替代字符与页面图像引用,输出待复核状态;图像引用也不证明图片已经覆盖整页或文字可识别。

阅读文本 / 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