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

        大家是不是遇到过类似在线阅读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文件了。

最后附上我的效果图


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

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值