iPhone 上的 PDF 搜索

Posted

技术标签:

【中文标题】iPhone 上的 PDF 搜索【英文标题】:PDF search on the iPhone 【发布时间】:2011-05-05 01:35:32 【问题描述】:

在尝试使用 Quartz 从 PDF 读取注释两天后,我设法做到了,posted my code。

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

我尝试了什么:

我尝试使用 CGPDFScannerScan 处理 TJTj 运算符 - 在某些 PDF 上返回正确的文本,而在其他文档上返回的大多是随机字母。 可能与文本编码有关? 有人 pointed out 应该处理文本块(由 BT/ET 运营商标记),但我仍然没有设法这样做。有人设法从任何 PDF 中提取文本吗?

之后,通过将所有文本存储在 NSMutableString 中并使用 rangeOfString (如果有更好的方法请告诉我),搜索应该很容易。

那么如何突出显示结果?我知道有几个运算符可以找到字形大小,所以我可以根据这些值计算得到的矩形,但我已经阅读了几个小时的规范......这是一个臃肿的混乱,我快疯了。有人有实际的解释吗?

更新

用户 Naveen Thunga 发现了 PDFKitten,“一个在 ios 中从 PDF 中提取数据的框架”。我刚刚尝试了演示,它似乎像宣传的那样工作。我将使用更多的 PDF 对其进行测试,并将很快发布结果。作为旁注,代码对我来说似乎非常好——如果你对这些东西的工作原理感兴趣,那就太棒了。

【问题讨论】:

发现这个运算符集合可能有用:efreedom.com/Question/1-3627745/… Hey Brainfeeder,您找到了与突出显示搜索结果有关的任何解决方案吗? @Sarah:不,仍然没有,几天后我开始专注于其他事情...... 好吧..没问题。我上网了很多,但还没有任何办法。感谢任何方式。我发现您的代码在某些方面很有帮助! :) 能否请您重播以下链接***.com/questions/5335799/… 【参考方案1】:

所以现在在 iOS 11 中,我们有了 PDFKit,搜索文本变得轻而易举

if #available(iOS 11.0, *) 
     let pdfDocument = PDFDocument(url: fileUrl)!
     let allText = pdfDocument.string /// Gets all text in pdf separated by /n

     let s: PDFSelection = pdfDocument.findString("Hello", withOptions: [])
     let sWithFormatting = s!.first!.attributedString

【讨论】:

【参考方案2】:

我在objective-c中使用PDF.js创建了utility class

这将允许显示和搜索 PDF 文件。

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

查看实际的 PDF 搜索Link

【讨论】:

【参考方案3】:

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

对于任何给定的页面,您需要使用 CGPDF 扫描仪 API 扫描页面。您需要为影响页面中文本的 PDF 运算符注册回调 - 不仅是 TJ/Tj,还有那些设置字体、影响文本绘制矩阵等的回调。您需要构建一个状态机来更新每个遇到的标签+参数。您需要检查当前字体编码的文本。当您找到要突出显示的文本时,您需要检查您正在更新的当前文本绘图矩阵以确定绘图坐标。阅读 PDF 规范(1.7 版可从 Adob​​e 下载),了解需要注意哪些运算符。

字体编码可能是最困难的部分,因为可以指定几种编码方式,其中一些是字体专有的。大多数情况下,您可以作弊并依靠 ANSI 编码的一个子集——但这会破坏某些具有奇怪字体的 PDF。

本质上,您正在处理页面,就像您要呈现它一样。

【讨论】:

以上是关于iPhone 上的 PDF 搜索的主要内容,如果未能解决你的问题,请参考以下文章

在 iPhone 中从 PDF 中搜索单词

iframe 中的 pdf 仅在 iphone/ipad 上的第一页

Objective C iPhone:打开PDF不再起作用

如何使用我的 iOS 应用程序在我的 iPad/iPhone 中打开 PDF 文件?

iphone:如何进行翻页

如何在 iPhone 应用程序中使用 CGPDFScanner 查找 pdf 文档字体?