如何检测pdf是文本可搜索还是非文本可搜索?

时间:2013-04-23 09:55:38

标签: vb.net pdf

我有一套pdfs,我想从中处理(VB.NET)只有那些非文本可搜索的,你能告诉我如何去做吗?

2 个答案:

答案 0 :(得分:2)

一般来说,这样做的方法是打开每个页面并翻录内容流,看看是否执行了在页面上放置文本的文本操作符。

让我解释一下这意味着什么 - PDF内容是一种小型RPN语言,其中包含以某种方式标记页面的操作。例如,您可能会看到如下内容:

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

这意味着:

  1. 开始文字区域
  2. 以PDF为单位将文本基线的位置设置为(72,400)
  3. 将字体设置为当前页面的字体资源字典
  4. 中名为F0的资源
  5. 绘制文字“Throatwarbler Mangrove”
  6. 结束文字区域
  7. 所以你可以尝试捷径

    1. 我的页面的资源字典是否包含任何字体?
    2. 在某些情况下,这会失败,因为某些PDF生成工具会将字体放入资源中 字典,不要使用它们(误报)。如果页面内容包含包含文本的Form XObject(假阴性),它也将失败。

      1. 我的网页内容流是否有BT / ET操作符?
      2. 这会让你更接近,但是如果它们中没有内容(误报)或者它们不存在则会失败,但是有一个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来执行此任务我认为如果我坐下来,我可能能够编写该谓词在几天内,但我已经知道大部分的PDF规范。因此,可能需要两周到一个月的时间。所以你的选择。

答案 1 :(得分:0)

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

您可以查看以下链接:

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

您必须在完成后立即阅读生产者属性。这只是一个例子。但我的建议请在此处提供您的代码,以便我们尽力帮助您。祝福你