Android使用js方案实现在线浏览pdf文档

本文介绍了在Android项目中实现在线浏览PDF文档的方法,通过webview结合Mozilla的pdf.js库,避免了第三方库体积大的问题。详细步骤包括下载pdf.js并放入assets目录,配置WebView展示PDF,以及针对Android 4.3以下系统的兼容性处理。文章还提及了手势缩放的实现和相关问题解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于公司在项目中新增一个开发票的功能,而从第三方返回的数据(文档所在服务器地址,即一个url)来看,既有图片格式,也有PDF格式,因此需要在项目中实现查看PDF文档的功能。

从目前的实现方案来看,分别有以下几种:

一、先将远程服务器的pdf文档下载到本地,然后在本地中进行操作,但是考虑到这样做体验不大好,因此排除了;

二、使用第三方库的实现:https://github.com/barteksc/AndroidPdfViewer,但是使用该库,一下子项目会增大16MB左右,至于原因,文档中有解释,感兴趣的童鞋可以去看看;

三、使用webview的方式配合JS实现,目前网上成熟的方案Mozilla(火狐)的pdf.js,这种方式也可以浏览本地pdf文档。因此,这篇文章讲的就是怎么把这种方案集成到android项目中。

1、到Mozilla pdf.js的官网下载最新的稳定版本

这里写图片描述
2、解压下载后的压缩文件,将解压后的文件夹整份粘贴到项目中的asset文件夹下(记得解压后改成一个合法的名称)

这里写图片描述

3、在所要展示pdf文档的页面对web进行代码配置

WebSettings settings = pdfViewerWeb.getSettings();

settings.setSavePassword(false);

settings.setJavaScriptEnabled(true);

settings.setAllowFileAccessFromFileURLs(true);

settings.setAllowUniversalAccessFromFileURLs(true);

settings.setBuiltInZoomControls(true);

pdfViewerWeb.setWebViewClient(new WebViewClient() {

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

view.loadUrl(url);

return true;

}

});

pdfViewerWeb.setWebChromeClient(new WebChromeClient());

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//api >= 19

pdfViewerWeb.loadUrl("file:///android_asset/pdfjs/web/viewer.html?file=" + docPath);

} else {

if (!TextUtils.isEmpty(docPath)) {

byte[] bytes = null;

try {// 获取以字符编码为utf-8的字符

bytes = docPath.getBytes("UTF-8");

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

if (bytes != null) {

docPath = new BASE64Encoder().encode(bytes);// BASE64转码

}

}

pdfViewerWeb.loadUrl("file:///android_asset/pdfjs_compatibility/web/viewer.html?file=" + docPath);

}

其中,pdfViewWeb是webview对象,docPath则是远程服务器上的pdf文档地址。

需要对上段代码说明的是,我在手机上试验了下,最新版本的pdf.js在android4.3以上显示都是正常的,在4.3的系统上(android4.3以下的系统我没测试)则无法正常显示,因此我做了兼容,android4.3及以下的系统都是用pdf.js v1.4.20的版本,添加过程也和最新版本(v1.9.426)一样,进一步说明的是,这样做以后,打出来的apk大小也增大了4MB多左右。

资源下载地址

2019-09-11更新
支持手势缩放
在官方的github的issue里找到这个解决方案,但是发现他还是存在一个问题,就是缩放到一定比例后,就不能在进行任何手势操作了,包括上下滑动,后来谷歌了下,发现是部分android设备上touchend没有执行的问题,优快云上也找到了解决方案

最后贴上我修改后的js代码

function enablePinchZoom(pdfViewer) {
   
   
        let startX = 0, startY = 0;
        let initialPinchDistance = 0;
        let pinchScale = 1;
        
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值