判断PDF文本是否可见

时间:2015-08-03 14:42:48

标签: python pdf pdfminer

我正在使用pdfminer库解析一些PDF文件。

我需要知道文档是否是扫描文档,扫描机器将扫描图像放在顶部,OCR提取的文本放在后台。

有没有办法确定文本是否可见,因为OCR机器会将其放在页面上供选择。

一般来说,问题在于区分两种截然不同但外观相似的案例。

在一个案例中,扫描文档的图像覆盖了大部分页面,OCR文本后面。

这里的PDF是文本,图片被截断:http://pastebin.com/a3nc9ZrG

在另一种情况下,背景图片覆盖了大部分页面,文字在前面

告诉他们分开对我来说很难。

2 个答案:

答案 0 :(得分:2)

你的问题有点令人困惑,所以我不确定什么对你有帮助。但是,您描述了两种从OCR“隐藏”文本的方法。我认为两者都是可以检测的,但一个比另一个容易得多。

隐藏文字
隐藏文本是放在其他内容后面的常规或不可见文本。换句话说,您使用对象的堆叠顺序来隐藏其中的一些。你可以检测到这种情况的唯一方法是找出页面上所有文本对象的位置(计算它们的边界框不是微不足道但当然可能),然后确定页面上的任何图像是否重叠那个文本就在它面前。一些额外的评论:

  • 理论上它可能不是隐藏它的图像,但在你的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”,它等于“不可见”或“既不抚摸也不填充”,因为PDF规范非常优雅地说明了它。

值得一提的是,这两种技术可以被OCR引擎互换使用。将不可见文本放在扫描图像的顶部实际上是很好的做法,因为这意味着大多数PDF查看器都允许您选择文本。如果文本位于图像“后面”,我在某些时候查看的某些PDF查看器不允许选择文本。

答案 1 :(得分:1)

我没有PDF 1.7规范的副本,但我怀疑页面上的对象是按顺序呈现的,也就是说,前面的对象最终会被后续对象覆盖。

因此,您必须遍历布局对象(请参阅Performing Layout Analysis)并计算页面上所有内容的位置,尺寸和渲染顺序(以及可能的透明度)。

正如pdfminer文档所提到的,PDF是邪恶的。