您的位置:首页 > 移动开发

集成PDF.js,然后再在WebView上加载实现查看pdf文件

2018-02-01 20:04 239 查看
一、背景:

公司项目有个查看电子发票的功能,发票是pdf文件的,于是开始找方案,有个第三方库,效果不错,兼容性也好,github地址:https://github.com/barteksc/AndroidPdfViewer,但嵌入到项目里app一下增加了15M左右,实在有点难以接受,于是就尝试用js方式实现,经实践可行,包增加4M左右。

二、实现:

public class WebViewActivity extends AppCompatActivity {
WebView pdfViewerWeb;
private String downloadUrl="http://119.23.25.170:8088/api/invoice/18770055726-1516342350283.pdf";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web);
pdfViewerWeb=findViewById(R.id.webview);

WebSettings settings = pdfViewerWeb.getSettings();
settings.setSavePassword(false);
settings.setJavaScriptEnabled(true);
settings.setAllowFileAccessFromFileURLs(true);
settings.setAllowUniversalAccessFromFileURLs(true);

settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
settings.setBuiltInZoomControls(true);
settings.setDisplayZoomControls(false);
pdfViewerWeb.addJavascriptInterface(new AndroidtoJs(), "android");//AndroidtoJS类对象映射到js的test对象
pdfViewerWeb.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;

}

});
pdfViewerWeb.setWebChromeClient(new WebChromeClient());

new Thread(new Runnable() {
@Override
public void run() {
final String download = download();
runOnUiThread(new Runnable() {
@Override
public void run() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//api >= 19

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

}
}
});
}
}).start();
}
public class AndroidtoJs extends Object {

// 定义JS需要调用的方法
// 被JS调用的方法必须加入@JavascriptInterface注解
@JavascriptInterface
public void back() {
WebViewActivity.this.finish();
}
}
//下载具体操作
private String download() {
try {
URL url = new URL(downloadUrl);
//打开连接
URLConnection conn = url.openConnection();
//打开输入流
InputStream is = conn.getInputStream();
//获得长度
int contentLength = conn.getContentLength();
//创建文件夹 MyDownLoad,在存储卡下
String dirName = Environment.getExternalStorageDirectory() + "/MyDownLoad/";
File file = new File(dirName);
//不存在创建
if (!file.exists()) {
file.mkdir();
}
//下载后的文件名
final String fileName = dirName + "invoice.pdf";
File file1 = new File(fileName);
if (file1.exists()) {
file1.delete();
}
//创建字节流
byte[] bs = new byte[1024];
int len;
OutputStream os = new FileOutputStream(fileName);
//写数据
while ((len = is.read(bs)) != -1) {
os.write(bs, 0, len);
}
//完成后关闭流
os.close();
is.close();
return fileName;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
3.demo地址:pdfdemo
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: