如何检测pdf是文本搜索还是非文本搜索?
我认为这个选项可能是您的考虑因素,虽然我还没有测试代码,但我认为可以通过阅读您想要继续的每个PDF文件的属性来完成。
您可以检查此链接:
http://www.codeguru.com/columns/vb/manipulating-pdf-files-with-itextsharp-and-vb.net-2012.htm
你必须阅读你继续后立即生产者性能。这仅仅是一个例子。但我的建议请在这里包括你的代码,所以我们可以尝试帮助你。祝福你
它巨大,但有帮助,我会通过它。谢谢。 – Trupti 2013-04-25 05:31:46
一般来说,做到这一点的方法是打开每个页面并翻录内容流,看看是否有任何文本操作符在页面上放置文本。
让我解释一下这是什么意思 - PDF内容是一种小RPN语言,它包含以某种方式标记页面的操作。例如,你可能会看到这样的事情:
BT 72 400 Td /F0 12 Tf (Throatwarbler Mangrove) Tj ET
这意味着:
- 开始文本区域
- 在PDF单位 设置文本基线的位置(72,400)
- 设置字体为从当前页面的字体资源字典
- 名为F0资源绘制文本“Throatwarbler红树林”
- 结束文本区域
所以,你可以尝试走捷径
- 没有我的网页资源字典包含任何字体?
这在某些情况下会失败,因为某些PDF生成工具会将字体放入资源 字典中,并且不要使用它们(误报)。如果页面内容包含一个包含文本的Form XObject(false negative),它也会失败。
- 我的网页的内容流有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规范。所以它可能会让你更像两个星期到一个月。所以你的选择。
你有什么试过?如果你已经展示了一些研究/代码或更好的结果,人们更可能提供帮助。 – jordanhill123 2013-04-23 09:58:05
有些人说关于检查PDF文件的字体名称属性,但对于可搜索和非可文本搜索来说似乎是相同的。 – Trupti 2013-04-23 10:16:57