以前给乐视金融做项目的时候遇到了加载pdf文档的问题,不过还是解决了,而且用了三种方式。只要思想不抛锚,问题总比办法少。
前两种是基于WebView的,利于google的逆向解析,前提是先要去访问Google,在国内不怎么好用,但是在做项目的时候确实是测试成功了,具体如下:
/**
* webView加载pdf方法一
* @param webView
* @param url
*/
public static void webViewLoadPDF_1(WebView webView, String url){
webViewSettings(webView);
//设置Web视图
webView.loadUrl("http://docs.google.com/gview?embedded=true&url="+url);
}
/**
* webView加载pdf方法二
* @param webView
* @param url
*/
public static void webViewLoadPDF_2(WebView webView, String url){
String data = "<iframe src='http://docs.google.com/gview?embedded=true&url="+url+"'"+" width='100%' height='100%' style='border: none;'></iframe>";
webView.loadData(data, "text/html", "UTF-8");
}
@SuppressLint({"JavascriptInterface", "SetJavaScriptEnabled"})
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private static void webViewSettings(WebView webView) {
WebSettings webSettings = webView.getSettings();
//支持自动加载图片
if(Build.VERSION.SDK_INT >= 19) {
// 对系统API在19以上的版本作了兼容。因为4.4以上系统在onPageFinished时再恢复图片加载时,如果存在多张图片引用的是相同的src时,会只有一个image标签得到加载,因而对于这样的系统我们就先直接加载。
webSettings.setLoadsImagesAutomatically(true);
} else {
webSettings.setLoadsImagesAutomatically(false);
}
//设置WebView属性,能够执行Javascript脚本
webSettings.setJavaScriptEnabled(true);
//设置可以访问文件
webSettings.setAllowFileAccess(true);
//设置支持缩放
webSettings.setBuiltInZoomControls(true);
//设置缓存模式
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
webSettings.setDomStorageEnabled(true);
//设置默认编码
webSettings.setDefaultTextEncodingName("utf-8");
//将图片调整到适合webview的大小
webSettings.setUseWideViewPort(false);
//支持内容重新布局
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
//设置可以访问文件
webSettings.setAllowFileAccess(true);
//支持通过JS打开新窗口
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
//缩放至屏幕的大小
webSettings.setLoadWithOverviewMode(true);
webView.setWebViewClient(new MyWebViewClient(webSettings));
}
//Web视图
private static class MyWebViewClient extends WebViewClient {
private WebSettings webSettings;
public MyWebViewClient(WebSettings webSettings) {
this.webSettings=webSettings;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return false;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
if(!webSettings.getLoadsImagesAutomatically()) {
webSettings.setLoadsImagesAutomatically(true);
}
super.onPageFinished(view, url);
}
}
具体用法就是
mWebView = (WebView) findViewById(R.id.webView);
// HTMLUtils.webViewLoadPDF_1(mWebView,Pdf_Url);
HTMLUtils.webViewLoadPDF_2(mWebView,Pdf_Url);
方式三
基于android-pdfview类库,提供一个快速读取显示Android PDF文件的组件——PDFView,该组件支持手势、动画和缩放。并且基于Google的VuDroid类库解码PDF文件。可以通过手势滑动PDF文件、对PDF文件进行放大缩小操作。
用法很简单,在布局中
<com.joanzapata.pdfview.PDFView
android:id="@+id/pdfview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
在Java文件中
pdfView.fromAsset(pdfName)
.pages(0, 2, 1, 3, 3, 3)
.defaultPage(1)
.showMinimap(false)
.enableSwipe(true)
.onDraw(onDrawListener)
.onLoad(onLoadCompleteListener)
.onPageChange(onPageChangeListener)
.load();
具体实例代码可以看:https://github.com/JoanZapata/android-pdfview
总结
应该还有其他的加载解析方式吧,等待你的探索,我只是把工作中用到的东西做个笔记而已,如果有其他方式可以给我留言,共同学习。