我有一套pdfs,我想从中处理(VB.NET)只有那些非文本可搜索的,你能告诉我如何去做吗?
答案 0 :(得分:2)
一般来说,这样做的方法是打开每个页面并翻录内容流,看看是否执行了在页面上放置文本的文本操作符。
让我解释一下这意味着什么 - PDF内容是一种小型RPN语言,其中包含以某种方式标记页面的操作。例如,您可能会看到如下内容:
BT 72 400 Td /F0 12 Tf (Throatwarbler Mangrove) Tj ET
这意味着:
所以你可以尝试捷径
在某些情况下,这会失败,因为某些PDF生成工具会将字体放入资源中 字典,不要使用它们(误报)。如果页面内容包含包含文本的Form XObject(假阴性),它也将失败。
这会让你更接近,但是如果它们中没有内容(误报)或者它们不存在则会失败,但是有一个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
您必须在完成后立即阅读生产者属性。这只是一个例子。但我的建议请在此处提供您的代码,以便我们尽力帮助您。祝福你