在iPhone上进行PDFsearch

两天后,试图从PDF阅读使用Quartz的注释,我设法做到了,并张贴我的代码 。

现在我想为另一个常见问题做同样的事情:用QuartzsearchPDF文档。 和以前一样的情况,这个问题已经被问了很多次,几乎没有实际的答案。 所以我首先需要一些指针,因为我自己还没有实现。

我试过的:

我尝试使用CGPDFScannerScan处理TJTj操作符 – 在某些PDF上返回正确的文本,而在其他文档中,它返回的主要是随机字母。 也许它与文本编码有关? 有人指出 ,文本块(由BT / ET运营商标记)应该被处理,但我仍然没有设法这样做。 任何人都设法从任何PDF中提取文本?

之后,通过将所有文本存储在NSMutableString并使用rangeOfString (如果有更好的方法请让我知道),search应该很容易。

但是如何突出结果呢? 我知道有几个操作符可以find字形的大小,所以我可以根据这些值来计算结果矩形,但是我一直在阅读规范几个小时…这是一个臃肿的混乱,我疯了。 任何人有一个实际的解释?

更新

用户Naveen Thunga发现PDFKitten是“从iOS中提取PDF数据的框架”。 我只是试图演示,它似乎工作广告。 我会用更多的PDFtesting它,并且会很快发布结果。 作为一个侧面说明,代码似乎对我来说非常好 – 如果你对这个东西是如何工作感兴趣的话,那真是太棒了。

这不是一个简单的问题来实现,但它很简单。

对于任何给定的页面,您需要使用CGPDF扫描程序API扫描页面。 您需要为影响页面中文本的PDF操作符注册callback – 不仅仅是TJ / Tj,还包括那些设置字体,影响文本绘制matrix等的callback函数。您需要构build一个状态机,用每个遇到的标记更新+参数。 您需要检查当前字体编码的文本会计。 当您find想要突出显示的文本时,您需要检查当前正在更新的文本绘图matrix以确定绘图坐标。 阅读PDF规范(版本1.7可从Adobe下载),以了解您需要关注哪些运营商。

字体编码也许是最困难的部分,因为有一些方法可以指定编码方式,其中一些是字体专有的。 大多数情况下,你可以作弊并回退ANSI编码的一个子集 – 但是这将会破坏某些具有奇怪字体的PDF。

基本上,你正在处理的页面,就像你要呈现它。

我使用PDF.js在objective-c中创build了实用程序类

这将允许显示以及searchPDF文件。

实用程序类允许search使用Highlight all search result和“区分大小写”选项。

看看PDFsearch在行动链接