Android PDF比较好的框架一览

  1. PDFBox
    开源java库,可以创建、转换、操作pdf文档。
    a、可提取pdf中Unicode文本
    b、可拆分多个文件,并可以将它们作为一个文件合并
    c、可保存图片(PNG/JPEG)
    d、可支持表单
    e、可以创建图文类型的pdf
    f、可打印
    g、支持电子签名
    不足:不支持中文,需要额外的导入ttf字体包,字体包过大
    导入ttf字体包时容易报这个错:pdfbox No glyph for U+590D in font SimSun-ExtB
    demo下载地址:https://github.com/TomRoush/PdfBox-Android
  2. IText
    a、PDFBox里面的特性iText都有
    b、 iText7有很多插件
    c、可加密
    不足:开源协议太过于苛刻 ,用于商业用途,就需要向iText公司申请授权费;
    中文有乱码。
    demo下载地址:https://github.com/xuwennengcan/MyPdf
  3. android-pdfview
    优点: 基于谷歌的一款开源PDF浏览框架VuDroid封装 ,支持缩略图、缩放、pdf加载和滑动监听
    不足:15年停止维护
    demo下载地址:https://github.com/JoanZapata/android-pdfview
  4. mupdf
    mupdf是一款轻量级的pdf浏览框架 ,支持android-pdfview的功能
    是文本的pdf文档还支持搜索,标注等功能。当之无愧的强大。
    不足:编译出来的so库比较大

Android WebView 获取网页内容

在 Android WebView 里面获取对应网页内容目前有两种实现方法:

一、evaluateJavascript 内容回调

较为高版本的系统里面可以使用 evaluateJavascript 来直接调用网页里面的 js 方法来达到此目的,好处是调用 js 代码之后,结果立即返回,且不需要写额外的控制逻辑

String js = "javascript:XXXX.XXX.getText();";
evaluateJavascript(js, new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String value) {
    }
});

坏处是目前通过此接口返回的内容会做 java 字符串之间的转译,尤其是遇到需要转译的字符会自动添加例如\ 反斜杠之类,其中对于 < 左尖括号会进行unicode 成\u003C,对于这种特殊情况目前没有找到很好的解释,先放着看后面有没有好的解决方法

“\u003Cp>考虑\u003Cspan style=\”color: rgb(197, 197, 48);\”>急急急看看看看\u003C/span>\u003C/p>”

因此首先需要对返回结果进行非字符串化,把 string 内容的双引号给去掉,然后得把转成 unicode 值转回去成 < 因此使用了正则表达式去转,并且还需要把转译字符的反斜杠移除出去,否则在 ios 加载的时候会出现异常,android webview 本身加载倒是没什么问题

以上种种操作既麻烦还需要额外处理,也基本调查过 javascript 内部处理这个问题,都没有什么效果,后面抱着侥幸心里尝试了一下 webview 中的另外一种方法 ,使用 javascript 直接调用 android 方法

二、addJavascriptInterface 调用安卓方法

此方法的 api level 比 evaluateJavascript 要低一些,使用起来稍微复杂一些,首先需要先通过 addJavascriptInterface 先注册含有 @JavascriptInterface 的方法,然后通过 loadUrl 方法调用对应 js

addJavascriptInterface(new XXXJSInterface(context), “XXXX”);
loadUrl(“javascript:window.XXXX.showHTML” +
“(”+document.getElementById(‘XXX’).innerHTML+”);”);

@JavascriptInterface
public void showHTML(String html) {
if (valueCallback != null) {
valueCallback.onReceiveValue(html);
}
valueCallback = null;
}

最终的返回的 html 是原生的内容,不需要做相关的转译之类的。

总结:evaluateJavascript 适合内容结构简单,最好是不牵涉到复杂网络标签的,例如返回一些简单的状态位,或者不需要返回任何内容的 js。addJavascriptInterface 可以返回内容比较复杂,尤其是输出网页本身。