跳到主要内容
LeedyBox
支持我们

从 PDF 提取文本:文本层与 OCR

有些 PDF 能直接交出文本,有些只包含页面的图片,需要 OCR 才能读取。本指南介绍 PDF 如何存储文本,提取的文本为什么会出现乱码或顺序错乱,OCR 如何读取扫描页面以及哪些因素影响准确度,并说明在使用结果之前应检查什么。

两种 PDF 页面

PDF 页面承载文本的方式有两种。从文字处理软件、浏览器或设计软件导出的 PDF 大多带有文本层:每个字符都以字体中的编码保存,并放在页面上的某个位置。扫描或拍摄的页面则不同,它是整页的一张图片,对软件来说,上面的文字只是像素。

页面类型生成方式提取结果
文本 PDF从应用导出或打印为 PDF存储的字符,通常完全一致
扫描 PDF扫描仪、手机摄像头或传真在 OCR 读取图片之前什么都没有
可搜索的扫描件扫描后另外添加了 OCR 文本层当时的 OCR 结果及其中的错误
转曲的文字在设计软件中把文字转换成了图形没有字符,只能用 OCR 读取

通常在 PDF 阅读器中就能判断属于哪一种。如果能选中单个词,或用搜索框找到它,这一页就有文本层;如果拖动时整页被当作一个整体选中,或者搜索不到任何内容,这一页就是图片。一个文件中也可能两者混合,例如正文是录入的、附录是扫描的报告。

文本层提取的原理

PDF 并不存储段落。它存储的是带有字体和位置的字符片段,往往一次一个词或几个字,顺序由生成文件的程序决定。提取工具读取这些片段,再根据位置重新拼出行。

LeedyBox 的 PDF 转文本工具使用 Firefox 的 PDF 引擎 PDF.js 读取这些片段。当垂直位置的变化超过 5 磅(约 1.8 毫米)时开始新的一行,否则用空格把片段连接起来。结果中每一页都以 --- 第 1 页 --- 这样的标记开头。大多数单栏文档的结果都便于阅读,但有一些副作用:

  • 如果一个词因字距调整等原因被存成多个片段,结果中这个词的中间可能出现空格;中文或日文句子中,字与字之间也可能出现空格。
  • 分栏、侧边栏和图注按存储顺序输出,这个顺序可能与阅读顺序不同。
  • 上标、脚注编号等高于或低于正文行的文字可能单独成为一行。
  • 页眉、页脚和页码也包含在每一页的文本中。

提取的文本为什么会乱码

在 PDF 内部,文本以字体的字形编码而不是 Unicode 字符的形式存储。要把编码还原成文字,文件中需要有对应表。制作规范的 PDF 会为每种字体附带 ToUnicode 表,使用标准编码的字体即使没有这张表也能解码。问题出现在字体以使用自有编号的子集形式嵌入、又没有对应表的时候:这些编码离开文件就没有意义,因此页面看起来正常,提取出来却是错误的文字、符号或空方框。

中文、日文和韩文字体常常不带自己的表,而是使用 Adobe-GB1、Adobe-Japan1 等预定义的字符映射(CMap)。LeedyBox 工具会随 PDF.js 一起加载这些 CMap,因此许多在简单提取工具中出现乱码的东亚文档都能正确读取。其他常见原因包括:把 fi 等两个字母存成一个字形的连字;用图形绘制字母、常常缺少对应表的 Type 3 字体;以及为了防止复制而故意打乱编码的 PDF。

只要页面有文本层,工具就会使用它,即使内容是乱码,也不会对这一页运行 OCR。如果想用 OCR 读取这样的页面,可以先用 PDF 转 JPG 把它转换成图片,再用图片转文字(OCR)读取。

LeedyBox 工具何时使用 OCR

工具逐页判断。如果某一页的文本层少于 15 个字符,就把这一页按正常尺寸的两倍、约 144 ppi 绘制成图片,再由 Tesseract.js 按“OCR 语言”中选择的语言加英语进行识别。因此,在录入页和扫描页混合的文档中,录入页会被准确读取,只有扫描页会经过 OCR。

因印章或页码而只有几个字符的扫描页仍被视为空页,会进行 OCR。反过来,已经带有 15 个字符以上文本层的扫描件不会进行 OCR,所以扫描仪添加的质量较差的 OCR 层也会原样输出。OCR 引擎和语言数据会在第一次运行 OCR 时从 leedybox.com 下载,因此第一张扫描页耗时更长。PDF 在浏览器中读取,不会被上传。

OCR 如何把像素变成文字

OCR 分几个阶段进行。引擎先把图片转换成黑白,再找出文本块、行和词,这一步称为页面分割。接着,按语言或文字系统训练的神经网络逐行读取,并参考该语言的词表,选出最可能的字符序列。结果是推测而不是复制:0 和 O、1 和 l 和 I、rn 和 m 等形状相近的字符可能被混淆,语言数据中没有的词也更容易读错。

语言设置比任何其他选项都重要。用拉丁字母训练的模型无法读取泰文或日文,未选择的语言写成的文字通常会变成错误的字符。LeedyBox 工具中除“仅英语”以外的每个选项都会把所选语言与英语组合起来,这对包含英文产品名的中文合同这类双语文档很有帮助。

影响 OCR 准确度的因素

因素影响改善方法
分辨率小字会丢失区分字符所需的细节以 300 DPI 以上扫描,小字更高
倾斜和弯曲倾斜的行和弯曲的书页会干扰行检测平整端正地扫描,从正上方拍摄
对比度和噪点灰色背景、污渍、透印和 JPEG 压缩痕迹看起来像笔画白底深色文字的干净扫描
字体装饰字体、过细或过粗的字体更容易识别错仔细检查结果
手写Tesseract 是用印刷文字训练的效果通常不好,建议手动录入
竖排文字竖排的中文或日文常被识别错仔细检查或重新录入

由于工具以约 144 ppi 绘制页面,脚注或合同中的小字即使扫描质量不错也可能难以识别。遇到这样的页面,可以用 PDF 转 JPG 生成分辨率更高的图片,再用图片转文字(OCR)以两倍尺寸重新识别小字,或先提高对比度再识别。

表格、分栏和版式

结果是纯文本。表格会失去网格结构,分栏页面可能逐栏输出,也可能跨栏逐行输出,文本框和图注会出现在文件或 OCR 引擎确定的阅读顺序中的某个位置。识别文字和重建版式是两个不同的问题,本工具只解决前者。对于含数字的表格,请把每个数值与原件核对,或在电子表格中重新录入;对于长文档,提取文本后请在编辑器中重新整理标题和段落。

检查和整理结果

  • 把几个数字、姓名和日期与原件对照;数字中的 OCR 错误很容易被忽略。
  • 查找常见的混淆:0 和 O、1 和 l 和 I、5 和 S、rn 和 m,以及缺失的重音或声调符号。
  • 把行末用连字符断开的单词和段落中间断开的行重新连起来。
  • 如果需要连续的文本,删除页面标记、页眉和页码。
  • 用“复制文本”或“保存为 .TXT”保留结果;保存的文件是 UTF-8 纯文本。

常见问题

为什么有些页面的结果是空的?

这一页没有文本层,OCR 也没有找到能识别的文字:扫描件可能是空白的、太淡或太小,也可能是手写。可以重新扫描得更清晰,或用 PDF 转 JPG 转换该页,再使用图片转文字的对比度和放大选项。

能读取有密码保护的 PDF 吗?

打开时要求输入密码的 PDF 无法读取,工具会显示错误。如果你有权限,请先在 PDF 阅读器中输入密码打开,并保存一份未加密的副本。

能生成可搜索的 PDF 吗?

不能。结果是可以复制或保存为 .txt 文件的纯文本,PDF 本身不会被修改。生成可搜索 PDF 的软件会在每个扫描页上叠加一层不可见的 OCR 文本层。

为什么长文档的 OCR 很慢?

工具在下载 OCR 引擎和语言数据后,会把扫描页逐页绘制成图片并在浏览器中识别。在较慢的设备上,一页可能需要几秒甚至更久。带文本层的页面不需要识别,因此快得多。