简介
最近项目需要在线浏览PDF文档,即不是像微信,QQ那样点击了下载下来,然后跳转到其它应用打开。
肯定最快想到的方案就是用浏览器打开,但是发现,在IOS上面是可以正常打开的,可能是IOS本身就支持,在Android手机上却不行,百度一番,得到的结果是Android自带的WebView不支持。那么接下来就是寻找解决之法了,PDF的加载解决方案之旅就开始了。
PDF加载开源库
地址外链
这个解决方案是什么意思呢?有点抽象,看一下这个库就知道了。pdf.js。
文档中提到使用方法:
Modern browsers:https://mozilla.github.io/pdf.js/web/viewer.html
Older browsers:https://mozilla.github.io/pdf.js/es5/web/viewer.html
比如用Older browsers这个外链地址:https://mozilla.github.io/pdf.js/es5/web/viewer.html?file=pdf地址,然后用浏览器加载。
如果不清楚,可以安装这么些,如果你是个想知道答案的人,可以问一下做web的朋友。
经尝试这种的确可以加载PDF文件,而且很省事。但是同时也存在很多问题。
PDF加载不出来
经尝试:
使用https://mozilla.github.io/pdf.js/web/viewer.html作为外链地址,基本上手机加载不出来。
使用https://mozilla.github.io/pdf.js/es5/web/viewer.html可以加载。-
外链地址不能访问
用了几个Android8.0及一下的手机测试了一波,都可以加载,正以为解决了问题时,测试说,我这边怎么加载不出来,我说,我这边完全没有问题啊。经调试,发现Android10手机,上面的外链地址都不能访问。Android9没有试。试着努力解决,无果,放弃。
性能问题
首先这个地址可以访问,但是访问速度呢,不敢说;加上用WebView加载PDF文件本来就存在性能问题,所以即便能加载,其实也不是很好的方案。
使用PDF.js
这个需要使用到上面说的开源库,你说外链访问不行,那把库集成到自己服务器或者集成到Android工程中,也可以下载到手机里,加载本地文件或者网络文件,不就可以了,这个方法的确可以解决,但是当时没时间弄,我也就随便找了一个解决方案,后面会说。这个方案可以用于手机加载网页使用。
-
遇到的问题
用手机或者浏览器加载时报错:
在viewer.js为了安全,对域名进行了判断:
所以可以把这个函数(validateFileURL(file))的调用注释掉。
接下来就可以加载pdf
比如:file:///path/viewer.html?file=path/guanxin_paitent_test.pdf
使用AndroidPDF
这个库支持加载网络PDF文件,集成后apk大概增加1M多,但是效果嘛,不太好。
使用AndroidPdfViewer
这个库也是基于 PdfiumAndroid开始的,算是效果最好的库了。但是apk提交增加也很明显,配置ndk支持某种平台后,apk大概增加3.5M多。但是AndroidPdfViewer不能直接加载网络PDF文件,也不提供进度提示 。所以自己封装了一个用于加载网络PDF文档,支持使用默认,自定义进度条的库。PDF-load。具体实现查看开源库中的LibPdf模块。
使用:
<com.pds.pdf.core.ExtPDFView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pdfView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
private void displayFromUrl(String url) {
pdfFileName = FileUtils.getFileNameByUrl(url);
pdfView.fromUrl(url)
.defaultPage(pageNumber)
.onPageChange(this)
.enableAnnotationRendering(true)
.onLoad(this)
.scrollHandle(new DefaultScrollHandle(this))
.spacing(10)
.onPageError(this);
pdfView.enableCache(true)
.useDefaultProgressView().go();
效果如下:
直接加载Asset,本地文件,参考AndroidPdfViewer
-
使用默认进度条
LibPdf支持进度显示,LibPdf提供了默认的进度View,即在顶部显示类似加载网页一样的进度条,调用useDefaultProgressView方法即可。
添加自定义进度View,支持3哥方向,分别是加在PDF视图的顶部,底部和叠在PDF视图的上面,等PDF加载完成隐藏。
-
自定义进度条
LibPdf支持自定义进度条,调用addCustomProgress方法加入自己的进度View。
使用 腾讯X5浏览器
使用腾讯X5引擎加载PDF,doc等文件。如果项目中使用了腾讯X5引擎,那么可以直接使用pdf-x5库浏览PDF,apk体积基本没有什么增加,如果项目中没有 使用X5引擎,要用pdf-x5加载PDF,那么需要先集成X5引擎,开源库中的web库提供的简单的X5集成。
该库一共支持几十中文件加载,只需要传入不同文件地址就可以了,下面是我测试的效果:
使用tbs加载:
- pptx加载效果
使用QbSdk加载:
QbSdk加载支持的文件格式更多,具体参考腾讯X5官网
调用之后,优先调起 QQ 浏览器打开文件。如果没有安装 QQ 浏览器,在 X5 内核下调起简版 QB 打开文件。如果使用的系统内核,则调起文件阅读器弹框。
使用方法请参考PDF-load
SVG
大概思路就是把PDF文件转成SVG,但是SVG需要大量的计算量,而且我目前是通过其它网站进行的PDF转SVG
PDF转其它格式文件
比如转图片等,这个自己研究。