Android 上 PDF 的读取 与 生成 , 一个小功能点,操作的也是File对象,这里涉及到IO操作,所以读写权限自行处理,我们先来看下读取PDF的几种方式:
读取
读取的话,搜了一圈的资料,大概是如下几种
- 1.PdfRenderer加载,最原始的方式
- 2.Pdf.js ,WebView加载
- 3.第三方PDF库加载,如PDFView等
我们来介绍一下,首先是PdfRenderer,这种方式会把PDF分割成若干的图片,我们来看示例代码:
![87cb6114b538170326bf843570c25620.png](https://i-blog.csdnimg.cn/blog_migrate/6640a93d8faee5c365ba5abd934a464a.jpeg)
这段代码很好理解,首先创建一个PDF路径的File文件,然后通过ParcelFileDescriptor.open
这个文件后得到ParcelFileDescriptor对象就可以用来传入PdfRenderer中初始化了,我们可以通过PdfRenderer的openPage去拿到各页面然后创建Bitmap。所以最后显示的效果如图:
![2c51c3b2093963440a641d5cfa73bda3.png](https://i-blog.csdnimg.cn/blog_migrate/9bc4cfdc1fca9e6a22adbd3ec1c413c0.jpeg)
好了我们再来看下PDF.js是怎么读取的
http://mozilla.github.io/pdf.js/getting_started/
首先通过此链接下载最新的pdf.js代码全部拷贝到assets目录下:
![c9102d1727f877bc08b5b0877801d6ad.png](https://i-blog.csdnimg.cn/blog_migrate/001b67a302da79ec63398730b1d9d86d.jpeg)
可以看到我们的目录如下:
![ccf310f8c7ee70e350477faf667eb84c.png](https://i-blog.csdnimg.cn/blog_migrate/9e2155c2fb0d8df8874c82507013ab47.jpeg)
然后通过
mWebView.loadUrl("file:///android_asset/pdfjs/web/viewer.html?file=" + url);
的方式来读取,此方式我没有测试过
接着来看下我们的第三方库如何去使用,这里要再次说明下,很多人不喜欢用这些库是因为这些库会使我们的安装包体积变大,我们先来看第一个库:AndroidPdfViewer
https://github.com/barteksc/AndroidPdfViewer
毕竟是框架,使用起来比较简单:
![63f3ee01819aab43b57fc4c352b481fc.png](https://i-blog.csdnimg.cn/blog_migrate/5abdc89f2d1227957ad1dabe5c971ff5.jpeg)
直接加File之后调用Load即可,我们再来看下PDFView
https://github.com/JoanZapata/android-pdfview
引入之后用法和AndroidPdfViewer是一样的,其他的就不介绍的,抛砖引玉就好
生成
生成PDF会有些麻烦,这里介绍两种方式,一种Android原生,一种第三方库的方式,先来看android原生的方式:
![6876478d3e3a1ee61c2e308404e9e1c2.png](https://i-blog.csdnimg.cn/blog_migrate/a99b3cdd550ae5b4a482f27577adaf0b.jpeg)
这种原生的方式可操作性强,但是比较麻烦,我们来看代码,这里我初始化了一个PdfDocument后通过PageInfo.Builder创建页面信息,然后调用startPage开始撰写,我直接将当前页的canvas给到了pdf,接着调用finishPage来结束这一页的撰写,你也可以继续创建int来填充页数,然后我writeTo一个output中,到此,PDF就生成成功了。
至于第三方的库,这里说一下弊端:
- IText 中文有乱码,部分错误
- pdfbox 不支持中文
- mupdf 算是比较中肯吧 就是写入太麻烦了
大致就是如此,且行且珍惜,相关代码可以在源码中阅读。
对Android感兴趣的可以关注我的公众号【刘桂林】