前言:IOS中对PDF文件的操作,其实是有很多方式的,包括最新苹果IOS11推出的PDFKit框架,就是为PDF相关需求量身打造,前段时间遇到了一个对PDF文件进行预览以及对PDF文件文字的搜索的需求,因此查阅了很多资料,这里就记录一下,如有不正确的地方,欢迎指出,大家共勉。
一 PDF文件的加载方式
1.通过WebView/WKWebView进行加载
2.QLPreviewController
QL支持加载word,pdf,本地音视频等文件并且支持多文件,可左右滑动切换,并且支持系统自带的分享功能,但是QL不支持在线浏览。
3.UIDocumentInteractionController
不支持多文件预览,可分享
4.CGContexDrawPDFPage
用CGContexDrawPDFPage和UIPageViewController实现翻页浏览,但是这种方法只能支持本地PDF文件的浏览,效果很炫酷
关于这个绘制PDF文件的这种方法可以参考LazyPDFKit框架
其中包含:
PDF annotation
Free hand draw tool
Insert text
Highlight text
Draw line
Draw boxes and circle
Undo, Redo and Clear
Change Color, Size and Opacity
Thumbanail View
Bookmark
Email PDF
等功能
5.IOS11新出的PDFKit框架
iOS 11 后苹果在iOS平台开放了PDFKit SDK,可以使用这个框架显示和操作 pdf 文件,此项目应用PDFKit实现显示pdf、显示缩略图、展开大纲和搜索文字的功能。
其中:
PDFView:用来展示
pdfPDFThumbnailView: 用来展示一排缩略图
PDFDocument: 代表一个pdf文件
PDFPage: pdf中的页PDFOutline: pdf的大纲目录
PDFSelection: pdf中的一段选择的文字,比如搜索的文字
PDFAnnotation: pdf注解
PDFAction: pdf跳转,比如说目录到页的跳转
PDFDestination: pdf 跳转目标,跳转页中使用
PDFBorder: 可选的注释边界
功能很强大,但是该框架还是存在部分缺陷的,请往下慢慢阅读。
目前了解的加载方式就这些,不包括一些没涉及到的方案和方法,如果你知道可以提出来,共同探讨
关于PDFKit框架讲解请看
二 搜索功能
关于PDF文件中问自己的搜索功能,目前了解到的有以下几种方式:
1.IOS11推出的PDFKit 框架是支持文字搜索的
PDFDocument代表一个pdf文件,这个类里面包含所有的文档的数据信息。包括pdf文件的页数、缩略图、大纲等数据信息,所有其他的类的都是围绕着这个核心来获取数据的。
在获取到文件之后根据PDFDocument的代理方法来获取到一个包含PDFSelection的数组而搜索到的文字就包含在PDFSelection对象中。
调用搜索方法的时候,建议要用异步操作,之后再刷新主线程的tableView,因为在PDF数据量不大的时候,是看不出卡顿现象的,但是如果PDF文件内容非常多,比如400,500页的时候,这个卡顿现象就非常明显了。
虽然异步操作可以使UI流畅,但是却无法解决搜索时间过长的问题,这样体验是非常不好的。
为了解决这个问题,曾尝试将PDFDocument中的PDFPage转换成data,然后分化data数据,分成几个数组,再开线程的,分别去搜索每个数组中的字段,但是这个方法依然无法解决延迟的问题。如果知道其他的方法优化,可以提出来一起共同学习...
2.PDF.JS
pdf.js开源库是通过调用js在线预览PDF文件,预览时将PDF文件转为HTML标签,而且集成方便。
有关PDF.JS的集成请看
而通过UIWebView加载PDF文件,同时在搜索的时候调用JS的方法对PDF进行文字搜索,这是目前发现的最便捷的PDF搜索方式,该方式在文件内容很多的情况下也表现的非常良好。
至于PDFSearch的原理,将在后面的文章中进行分析和阐释。
参考文献: