在尝试使用Quartz从PDF中读取注释两天后,我设法完成了posted my code。
现在我想对另一个常见问题做同样的事情:用Quartz搜索PDF文档。与以前相同的情况,这个问题已被多次询问,几乎没有实际答案。所以我首先需要一些指针,因为我自己还没有实现。
我尝试了什么:
我尝试使用CGPDFScannerScan
处理TJ
和Tj
运算符 - 在某些PDF上返回正确的文本,而在其他文档上则返回大多数随机字母。 可能与文字编码有关吗?
有人pointed out应该处理文本块(由BT / ET运算符标记),但我仍然没有设法这样做。有人设法从任何PDF中提取文本吗?
之后,通过将所有文字存储在NSMutableString
并使用rangeOfString
(如果有更好的方式请告诉我),搜索应该很容易。
但是如何突出显示结果?我知道有一些运算符可以找到字形大小,所以我可以根据这些值来计算得到的矩形,但我已经读了几个小时的规格......这是一个臃肿的混乱,我疯了。有实际解释的人吗?
用户Naveen Thunga发现PDFKitten,“用于从iOS中的PDF中提取数据的框架”。我只是尝试了演示,它似乎像宣传的那样工作。我将用更多的PDF测试它,并很快发布结果。作为旁注,代码对我来说似乎非常好 - 如果你对这些东西的运作方式感兴趣,那就太棒了。
答案 0 :(得分:4)
这不是一个简单的实现问题,但它很简单。
对于任何给定页面,您需要使用CGPDF扫描仪API扫描页面。您需要注册影响页面中文本的PDF操作符的回调 - 不仅仅是TJ / Tj,还有那些设置字体,影响文本绘图矩阵等的操作。您需要构建一个状态机,用每个遇到的标记进行更新+参数。您需要检查当前字体编码的文本记帐。当您找到要突出显示的文本时,您需要检查当前正在更新的文本绘图矩阵以确定绘图坐标。阅读PDF规范(可从Adobe下载1.7版)以了解您需要注意的操作符。
字体编码可能是最困难的部分,因为可以指定一些编码方式,其中一些是字体专有的。大多数情况下,你可以作弊并依赖ANSI编码的一个子集 - 但这会破坏某些具有奇怪字体的PDF。
基本上,您正在处理页面,就像您要渲染它一样。
答案 1 :(得分:3)
这将允许显示以及搜索PDF文件。
实用工具类允许使用Highlight all search result
和'区分大小写'选项。
看看PDF搜索行动 Link
答案 2 :(得分: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
}