最近公司的App里需要实现PDF文件的预览展示。要知道,Android系统天生是不支持阅读PDF的,而PDF在某种意义上说已经是事实上的标准格式了,为此我们又要比iOS同事额外多做一些工作了,但也没办法,只能先做一些调研了。一般来说在Android里想要看PDF,有这么几种办法:
- 直接调起手机里其他支持阅读PDF文件的APP(如第三方的一些阅读软件)。
- 使用Google Docs或其他网站进行在线跳转后使用WebView加载。
- 使用一些开源的PDF库(上层Java,底层用C/C++实现的),直接在原生的自定义View里浏览。
- 使用Mozilia开源的PDF.js,然后在WebView里浏览。
下面依次对这几种方法进行简单的介绍,看看哪种方式最合适。
调起第三方应用
好处就是我们几乎不需要做啥工作,直接调起就行。但问题在于,必须把PDF文件下载到本地,而且还会跳出自己的App。下载PDF这倒不是什么大问题,但是跳到别的应用里的话,也许你的领导会直接跟你说:你也从咱们公司跳出去吧!哈哈,所以这是一种基本上不会被公司接受的方案,不采用!
Google Docs或其他网站在线跳转,再使用WebView加载
虽然我们要批评Google没有为我们在Android里提供对PDF的原生支持,但Google也表示委屈:虽然原生不支持PDF,但我还是给你们提供了Google Docs嘛,你们加个跳转,不就能在WebView里看PDF了?
使用起来也是非常的简单,都不用注册账号,直接把PDF文件的地址,进行一下改动:
String url = https://docs.google.com/viewer?url=http://domain/pdf_file.pdf;
其实就是在Google Docs提供的地址后面添加上你的PDF文件地址,然后在WebView里进行loadUrl即可。不过呢,由于一些“众所周知”的原因,Google的服务器咱们是访问不了的——即使你作为一个开发人员可以访问,但你也不可能要求App的普通用户去访问啊,所以在国内面对普通用户的时候,使用Google Docs是不可取的。
而PDF.js的作者,Mozilla组织也提供了类似的跳转服务,但由于其网址是github.io,国内的普通用户访问同样无法保证。
国内还有一些网站提供了类似的服务,而且因为这些网站都在大陆,访问起来倒是没有障碍,不过大部分网站会对免费用户进行一定的限制,比如限制PDF文件大小不能超过2M或5M,并且还会给PDF添加水印,想要取消限制自然是要交费的。如果你可以接受的话,倒也不失为一种方案。
此类方案要求提供一个PDF网络地址,所以想要看手机本地的PDF文件就行不通了。当然,也有网站会提供上传本地PDF的功能然后进行阅读,但这样会对手机的流量消耗很大,一般来说推荐度不高。
开源的PDF Native库
这些库本质上都是C/C++写的,所谓的Java层自然是为了方便大家的使用,反正这也算是Android的一个特色了,即底层C/C++实现高性能的功能,上层用Java调用。这里随便举2个开源的例子吧:
这类库的共同点是都提供了自己实现的PDFView通过调用底层.so库来阅读PDF。这些库使用的时候都是使用自定义View而不需要使用WebView,性能和体验都不错,也可以实现相当程度的定制化(需要你有一定的二次开发能力),而且预览在线PDF和本地PDF都可以。唯一的不足在于,so库体积不小,引入后导致apk包体积增加(即使只适配armeabi-v7a,也要增加个5M以上),是否采用需要斟酌。如果不是很在意大小的话,可以说是一种比较完美的解决方案了。
如果你的时间相对充裕,非常推荐你选择一两个开源库进行深入了解,不仅能完成工作任务,也是对自身能力的一种提升。
Mozilla开源的PDF.js
PDF.js是Mozilla开源的一套专门为HTML5实现的在线观看PDF的js框架,所以对用户端的唯一要求就是支持HTML5。对于Android设备来说,4.0以上的WebView基本上都可以顺利的运行——如果你的App最低版本低于4.0,那我简直无话可说……
而实际上使用PDF.js来展示PDF也有2种方案:一是App端直接集成这套js框架,好处是既可以看在线的PDF文件,也能看下载到手机本地的PDF,缺点在于增加了apk的体积(大约2-3M);二是让服务器后端集成js框架,App端直接打开经过PDF.js翻译的pdf地址,好处是App端处理简单,且不必增加apk大小,但这就对后端也有一定的要求了。ps:实际上国内很多提供在线看PDF功能的网站,使用的就是这个js框架。
总体来说,Android上看PDF基本上就这些方案了,最终如何选择,还是要根据需求和个人兴趣来决定,最强大的肯定是使用开源Native库喽。
评论