原生安卓使用webview在线阅读pdf文档——解决方案

时间:2021-08-02 22:36:44
        大家是不是遇到过类似在线阅读pdf的坑人需求?当然也有更坑的,那咱们今天来解决掉这个在线阅读pdf的坑,相信大家也看过各种帖子,各种办法,什么pdfview,什么**的第三方pdf查看框架,或许你会觉得好用,但我觉得不好用,包太大是其一,其二是支持在线阅读的我还没见过,好多都是下载到本地再打开阅读,那几百兆的pdf用户每次打开都下载还不得疯了,即便是缓存到本地那你加载还不得很长时间,我这钟方法就不同了,引用的文件一共才3.9M,加载更是快,两百多兆的文件一两秒就出来。好了不装b了,直接上代码:

        布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.viewonlinepdf.MainActivity" >


<WebView
android:id="@+id/pdf_show_webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</RelativeLayout>

        java核心代码

public class MainActivity extends FragmentActivity
{

private WebView pdfShowWebView;

private String docPath = "https://d11.baidupcs.com/file/ba53f41293af845addc44dc468923a9f?bkt=p3-1400ba53f41293af845addc44dc468923a9fb024210a00000f68e76c&xcode=b7b9ef9c9234679f8736717a18ba0f4712944d12b5f6eb9765d75071b4dbd0f7&fid=2334672476-250528-7836772807729&time=1499055076&sign=FDTAXGERLBHS-DCb740ccc5511e5e8fedcff06b081203-SBXLZNcKJUACUMLGJ9rXQwBN0NI%3D&to=d11&size=258533228&sta_dx=258533228&sta_cs=8726&sta_ft=pdf&sta_ct=7&sta_mt=7&fm2=MH,Yangquan,Netizen-anywhere,,jiangsu,ct&newver=1&newfm=1&secfm=1&flow_ver=3&pkey=1400ba53f41293af845addc44dc468923a9fb024210a00000f68e76c&sl=71565390&expires=8h&rt=pr&r=343614804&mlogid=4256064688440471098&vuk=2334672476&vbdid=3466206402&fin=JavaScript%E5%85%A5%E9%97%A8%E7%BB%8F%E5%85%B8%EF%BC%88%E7%AC%AC%E4%B8%89%E7%89%88%EF%BC%89.pdf&fn=JavaScript%E5%85%A5%E9%97%A8%E7%BB%8F%E5%85%B8%EF%BC%88%E7%AC%AC%E4%B8%89%E7%89%88%EF%BC%89.pdf&rtype=1&iv=0&dp-logid=4256064688440471098&dp-callid=0.1.1&hps=1&csl=155&csign=bpdsh7Zgm7NBO%2B%2FRyN7Pd9BBLTs%3D&so=0&ut=6&uter=4&serv=0&by=themis";

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pdfShowWebView = (WebView) findViewById(R.id.pdf_show_webview);
pdfShowWebView.setWebViewClient(new WebViewClient()
{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
// 返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器
view.loadUrl(url);
return true;
}
});
WebSettings settings = pdfShowWebView.getSettings();
settings.setSavePassword(false);
settings.setJavaScriptEnabled(true);
settings.setAllowFileAccessFromFileURLs(true);
settings.setAllowUniversalAccessFromFileURLs(true);
settings.setBuiltInZoomControls(true);
pdfShowWebView.setWebChromeClient(new WebChromeClient());
if (!"".equals(docPath))
{
byte[] bytes = null;
try
{// 获取以字符编码为utf-8的字符
bytes = docPath.getBytes("UTF-8");
}
catch (UnsupportedEncodingException e1)
{
e1.printStackTrace();
}
if (bytes != null)
{
docPath = new BASE64Encoder().encode(bytes);// BASE64转码
}
}
pdfShowWebView
.loadUrl("file:///android_asset/pdfjs/web/viewer.html?file="
+ docPath);
}

        别的没什么好说的,都是最基本的配置,咱们重点关注下上面代码中if判断这一块,

if (!"".equals(docPath))
{
byte[] bytes = null;
try
{// 获取以字符编码为utf-8的字符
bytes = docPath.getBytes("UTF-8");
}
catch (UnsupportedEncodingException e1)
{
e1.printStackTrace();
}
if (bytes != null)
{
docPath = new BASE64Encoder().encode(bytes);// BASE64转码
}
}


       为什么要这么写呢?是的,我原来也想直接把这个路径给拼到loadUrl中本地引用的路径后面,但是本地引用里面将这个参数解密了,而且其他地方也有加解密,所以没办法,只能这里用base64加密下,然后在本地引用的viewer.js中再去解密。

       这个功能坑比较多,一般pdf显示不出来大多都是下列原因:

1、base64文件中的字典不匹配(建议用我项目中的BASE64Encoder.java)。

2、你的链接或许有问题,确保你的链接在浏览器上可以直接下载的。

3、asset文件夹中的文件一个都不能少。

      如果想要查看PDF页面更好看的样式的话,那你就动手改下viewer.html文件了。

最后附上我的效果图

原生安卓使用webview在线阅读pdf文档——解决方案


原生安卓使用webview在线阅读pdf文档——解决方案

源码链接附上,请点击查看