判断 PDF 文本是否可见
Tell if text of PDF is visible or not
我正在使用 pdfminer 库解析一些 PDF 文件。
我需要知道文档是否为扫描文档,扫描仪将扫描图像置于顶部,OCR 提取文本置于背景。
有没有办法识别文本是否可见,因为 OCR 机器会将文本放在页面上供选择。
一般来说,问题是区分两个非常不同但看起来相似的案例。
在一种情况下,扫描文档的图像覆盖了大部分页面,OCR 文本在 后面。
这是图像被截断的 PDF 文本:http://pastebin.com/a3nc9ZrG
在另一种情况下,背景图像覆盖了大部分页面,文本 在其前面。
我很难区分它们。
我没有 PDF 1.7 规范的副本,但我怀疑页面上的对象是按顺序呈现的,也就是说,前面的对象最终被后面的对象覆盖。
因此,您必须遍历布局对象(参见 Performing Layout Analysis)并计算页面上所有内容的位置、它们的尺寸和呈现顺序(可能还有它们的透明度)。
正如 pdfminer 文档中提到的,PDF 是邪恶的。
你的问题有点令人困惑,所以我不确定什么对你最有帮助。但是,您描述了从 OCR "hide" 文本的两种方法。我认为两者都可以检测到,但一个比另一个容易得多。
隐藏文字
隐藏文本是放置在其他内容后面的常规或不可见文本。换句话说,您使用对象的堆叠顺序来隐藏其中的一些对象。检测此类情况的唯一方法是找出页面上所有文本对象的位置(计算它们的边界框并非易事但肯定是可能的),然后找出页面上的任何图像是否重叠该文本并在其前面。一些补充意见:
- 理论上它可能不是隐藏它的图像,但在你的 OCR 情况下我猜它总是图像。
- 虽然图像可能重叠,但它也可能在某种程度上是透明的。在这种情况下,下面的文字可能仍然会发光。在您使用通用 OCR 引擎的情况下,可能不太可能。
隐形文字
PDF 支持不可见文本。更准确地说,PDF支持不同的文本渲染模式;这些渲染模式决定了字符是填充的、轮廓的、填充的+轮廓的还是不可见的(还有其他可能性)。在您发布的 PDF 文件中,您找到了这个片段:
BT
3 Tr
0.00 Tc
/F3 8.5 Tf
1 0 0 1 42.48 762.96 Tm
(Chicken ) Tj
那是一只看不见的鸡!指令“3 Tr”将文本渲染模式设置为“3”,相当于 "invisible" 或 "neither stroked nor filled",正如 PDF 规范非常优雅地表述的那样。
值得一提的是,OCR 引擎可以互换使用这两种技术。将不可见文本置于扫描图像之上实际上是一种很好的做法,因为这意味着大多数 PDF 查看器都允许您 select 文本。如果文本是 "behind" 图片,我在某些时候看过的一些 PDF 查看器不允许文本 selection。
我正在使用 pdfminer 库解析一些 PDF 文件。
我需要知道文档是否为扫描文档,扫描仪将扫描图像置于顶部,OCR 提取文本置于背景。
有没有办法识别文本是否可见,因为 OCR 机器会将文本放在页面上供选择。
一般来说,问题是区分两个非常不同但看起来相似的案例。
在一种情况下,扫描文档的图像覆盖了大部分页面,OCR 文本在 后面。
这是图像被截断的 PDF 文本:http://pastebin.com/a3nc9ZrG
在另一种情况下,背景图像覆盖了大部分页面,文本 在其前面。
我很难区分它们。
我没有 PDF 1.7 规范的副本,但我怀疑页面上的对象是按顺序呈现的,也就是说,前面的对象最终被后面的对象覆盖。
因此,您必须遍历布局对象(参见 Performing Layout Analysis)并计算页面上所有内容的位置、它们的尺寸和呈现顺序(可能还有它们的透明度)。
正如 pdfminer 文档中提到的,PDF 是邪恶的。
你的问题有点令人困惑,所以我不确定什么对你最有帮助。但是,您描述了从 OCR "hide" 文本的两种方法。我认为两者都可以检测到,但一个比另一个容易得多。
隐藏文字
隐藏文本是放置在其他内容后面的常规或不可见文本。换句话说,您使用对象的堆叠顺序来隐藏其中的一些对象。检测此类情况的唯一方法是找出页面上所有文本对象的位置(计算它们的边界框并非易事但肯定是可能的),然后找出页面上的任何图像是否重叠该文本并在其前面。一些补充意见:
- 理论上它可能不是隐藏它的图像,但在你的 OCR 情况下我猜它总是图像。
- 虽然图像可能重叠,但它也可能在某种程度上是透明的。在这种情况下,下面的文字可能仍然会发光。在您使用通用 OCR 引擎的情况下,可能不太可能。
隐形文字
PDF 支持不可见文本。更准确地说,PDF支持不同的文本渲染模式;这些渲染模式决定了字符是填充的、轮廓的、填充的+轮廓的还是不可见的(还有其他可能性)。在您发布的 PDF 文件中,您找到了这个片段:
BT
3 Tr
0.00 Tc
/F3 8.5 Tf
1 0 0 1 42.48 762.96 Tm
(Chicken ) Tj
那是一只看不见的鸡!指令“3 Tr”将文本渲染模式设置为“3”,相当于 "invisible" 或 "neither stroked nor filled",正如 PDF 规范非常优雅地表述的那样。
值得一提的是,OCR 引擎可以互换使用这两种技术。将不可见文本置于扫描图像之上实际上是一种很好的做法,因为这意味着大多数 PDF 查看器都允许您 select 文本。如果文本是 "behind" 图片,我在某些时候看过的一些 PDF 查看器不允许文本 selection。