android项目中在webview中打开pdf。
关于android打开pdf文件方法有多种,下面的文章有详细说明:
Android 实现 PDF 文件阅读功能调研
Android 使用PDF.js浏览pdf的方法示例
android:加载PDF几种方法汇总对比
总结一下:
1、WebView 中调用 GoogleDocs
这个方案要!!!
2、调起第三方支持 PDF 阅读的应用
建议使用这种方法,扩展性兼容性强,可以扩展为支持其他的文件格式。但是如果用户手机没有安装PDF的应用,就比较尴尬了。
3、集成第三方 PDF SDK,在 Native 页面中阅读
第三方包很大,APK体积会增大20M左右,不介意APK体积的可以采用。
4、将 PDF 文件转换成 HTML 或者图片等格式文件
这种方案是比较low,但是能解决部分问题
5、集成第三方JS:pdf.js
这种方案有两种方式集成:服务端和客户端,因为准备在android端实现所以介绍客户端集成的方案。
客户端集成也有两种方式,
①将pdf.js和相关的文件全部下载下来并拷贝的工程中的assets目录。pdf.js和相关文件体积也比较大(5M左右),同样会增加APK体积,但是这种方式更快,全部都是本地资源,不需要每次都联网加载pdf.js文件。
②就是使用CDN的方式。在asset目录想编写html文件和js文件,加载网络中的pdf.js的相关资源。但是相对第一中方法比较慢,如果而且文件过大,会报错。具体实现参考文章 Android中显示PDF的问题解决(安卓端使用pdf.js CDN模式)
我使用的是集成第三方的pdf.js,并且把所有资源下载到本地。
核心方法
1、pdf.js资源到android项目的asset目录 下载地址 http://mozilla.github.io/pdf.js/getting_started/#download
2、使用webview加载viewer.html界面
mWebView.loadUrl(file:///android_asset/pdf/web/viewer.html?file=PDFURl)
(其中PDFURL为pdf文件路径,可以是网络路径也可以是本地文件)
超级简单!!
但是实际操作中遇到很多的问题
1、webView 打失败,报错 unexpected server response (0) while retrieving PDF
webview的权限设置有问题,需要设置:
webSettings.setJavaScriptEnabled(true);//支持js
webSettings.setAllowFileAccess(true);;//否允许访问文件,默认允许访问
webSettings.setAllowFileAccessFromFileURLs(true);//一个文件被允许访问其他文件中的内容
webSettings.setAllowUniversalAccessFromFileURLs(true);//可以是否访问任何原始起点内容
2、打开失败, file origin does not match viewer's
处理方法:需要在web/viewer.js(1793行)中注释的代码如下:
// if (origin !== viewerOrigin && protocol !== 'blob:') {
// throw new Error('file origin does not match viewer\'s');
// }
3、低版本android手机(5.0)打开失败,
检查之后发现是低版本android浏览器不支持es6语法。
最简单的处理方法,下载es5版本的pdf.js。但是这个版本比es6版本大,有11M
在网上有文章提到 4.4及以下版本,有兼容问题,需要使用低版本的pdf.js。我们项目不支持4.4及以下版本,所有没有测试。处理方法是判断android系统版本, 4.4及以下版本使用低版本的pdf.js(文章使用的1.4版本的),高版本系统,使用当前最新的pdf.js。
4、屏蔽下载按钮
实现使用中发现,工具栏用些功能在android手机上是不能使用的,比如下载、打印。
解决方案:隐藏工具栏中的按钮,web/viewer.html找到 id="secondaryDownload",在button标签添加 style="display:none"。
注意,在文件中还有id="download"的按钮,隐藏该按钮并没有使界面中下载按钮消失
android 4.4 报错,
使用低版本的psdjs
pdfjs-1.9.426下载地址 https://pan.baidu.com/s/1wW6P-fdHpiEHD_zME0pIXQ
这个亲测可用。
但是相关的功能比新版的要少一些