2013-04-23 89 views
-1

我有一套pdf,从中我想处理(VB.NET)只有那些非文本搜索,你能告诉我该怎么做呢?如何检测pdf是文本搜索还是非文本搜索?

+2

你有什么试过?如果你已经展示了一些研究/代码或更好的结果,人们更可能提供帮助。 – jordanhill123 2013-04-23 09:58:05

+0

有些人说关于检查PDF文件的字体名称属性,但对于可搜索和非可文本搜索来说似乎是相同的。 – Trupti 2013-04-23 10:16:57

回答

0

我认为这个选项可能是您的考虑因素,虽然我还没有测试代码,但我认为可以通过阅读您想要继续的每个PDF文件的属性来完成。

您可以检查此链接:

http://www.codeguru.com/columns/vb/manipulating-pdf-files-with-itextsharp-and-vb.net-2012.htm 

你必须阅读你继续后立即生产者性能。这仅仅是一个例子。但我的建议请在这里包括你的代码,所以我们可以尝试帮助你。祝福你

+0

它巨大,但有帮助,我会通过它。谢谢。 – Trupti 2013-04-25 05:31:46

2

一般来说,做到这一点的方法是打开每个页面并翻录内容流,看看是否有任何文本操作符在页面上放置文本。

让我解释一下这是什么意思 - PDF内容是一种小RPN语言,它包含以某种方式标记页面的操作。例如,你可能会看到这样的事情:

BT 72 400 Td /F0 12 Tf (Throatwarbler Mangrove) Tj ET 

这意味着:

  1. 开始文本区域
  2. 在PDF单位
  3. 设置文本基线的位置(72,400)
  4. 设置字体为从当前页面的字体资源字典
  5. 名为F0资源绘制文本“Throatwarbler红树林”
  6. 结束文本区域

所以,你可以尝试走捷径

  1. 没有我的网页资源字典包含任何字体?

这在某些情况下会失败,因为某些PDF生成工具会将字体放入资源 字典中,并且不要使用它们(误报)。如果页面内容包含一个包含文本的Form XObject(false negative),它也会失败。

  1. 我的网页的内容流有BT/ET opertors吗?

这会让你更接近,但如果它们中没有内容(误报)或者它们不存在,但会有一个包含文本的Form XObject(false negative),将会失败。

所以真的,要做的是执行整个页面的内容流,包括递归遍历所有的XObject以寻找文本操作符。

现在,您可以使用我的Atalasoft软件(免责声明,我为Atalasoft工作并编写了大多数PDF处理代码,我也在使用Acrobat 1-4版本)来采取另一种方法。不要问,这个页面是否包含任何文本,你可以问“这个页面是否只包含一个图像?“

bool allPagesImages = true; 
using (Document doc = new Document(inputStream)) 
{ 
    foreach (Page p in doc.Pages) 
    { 
     if (!p.SingleImageOnly) 
     { 
      allPagesImages = false; 
      break; 
     } 
    } 
} 

这将留下allPagesImages有一个相当不错的迹象表明,每个页面的所有图像,如果你正在寻找OCR这是不可搜索的文件,可能是你真正想要的。

不利的一面是,这将是一个单一的谓词非常高的价格,但它也让你PDF光栅化和能力,直接提取图像的文件。

现在,我毫不怀疑,一个固体工程师可以通过PDF规范工作,并编写一些代码来扩展iTextPdfSharp来完成这项任务我认为,如果我坐在d拥有它,我可能能够在几天内编写该谓词,但我已经了解了大多数PDF规范。所以它可能会让你更像两个星期到一个月。所以你的选择。