android - 使用 mozilla pdf.js Android API 级别低于 19 在 Android WebView 中显示 PDF 文件

标签 android pdf webview

我正在使用 mozilla pdf.js在 Android WebView 中显示 PDF 文件。

代码在 Android API Level 19 中运行良好。

Uri path = Uri.parse(Environment.getExternalStorageDirectory().toString() + "/test.pdf");
webView.loadUrl("file:///android_asset/pdfviewer/index.html?file=" + path); 

但它不适用于 Android API 级别 16 及以下

设备上显示白色空白屏幕。

有什么办法可以解决这个问题吗?

最佳答案

我遇到了同样的问题。首先,似乎使用 2013 年 12 月以来的旧版本 pdf.js 是可行的,如果不是包含编译文件(pdf.js 和 pdf.worker.js),而是像 helloworld 示例中那样分别包含所有 js 文件.

然后我发现了这个 SO post 。有人为 Android ( Butelo ) 整理了一个 pdf.js 示例。我试过了,项目 Assets 文件夹中的 .js 文件甚至可以在 Android 2.3 上运行,但前提是通过 http 访问。在帖子中还有关于如何让它与 file://urls 一起工作的建议。我找到了另一个解决方案:

您使用 Java 读取 PDF 文件并将其转换为 Base64。通过这种方式,您可以绕过 file://限制。

ByteArrayOutputStream ous = null;
InputStream ios = null;
String imageData = null;
try {
    byte[] buffer = new byte[4096];
    ous = new ByteArrayOutputStream();
    ios = new FileInputStream(pdfFile);
    int read = 0;
    while ( (read = ios.read(buffer)) != -1 ) {
        ous.write(buffer, 0, read);
    }                                  
    imageData = Base64.encodeToString(ous.toByteArray(), Base64.DEFAULT).replace("\n", "").replace("\r", "");                                       
} catch (Exception e) {
    e.printStackTrace();
}           

然后您通过某种方式将 imageData 传递给它来加载 WebView。使用 JavaScript,您需要将 Base64 转换为 UInt8 数组。也许您可以直接在 Java 中执行此操作并避免 Base64 绕行,但我没有弄清楚如何也不确定您如何将该数组放入您的 WebView。

function fromBase64(dataURI) {           
    var raw = window.atob(dataURI);
    var rawLength = raw.length;
    var array = new Uint8Array(new ArrayBuffer(rawLength));

    for(i = 0; i < rawLength; i++) {
         array[i] = raw.charCodeAt(i);
    }
    return array;
}

pdf.js 将采用 UInt8 数组,就像它是一个 URL 一样。所以你可以使用:

PDFJS.getDocument(fromBase64(base64DataFromJava));

此方法在Android 4.0及以上版本肯定有效。由于某些奇怪的原因,它目前不适用于我的 Android 2.3,但这可能与我项目中的其他一些问题有关。当然,在旧设备上,渲染需要一些时间(有时半分钟),但无论如何都会如此。

关于android - 使用 mozilla pdf.js Android API 级别低于 19 在 Android WebView 中显示 PDF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25278813/

相关文章:

powershell - 使用 Powershell 和 iTextSharp 旋转 PDF

Python 分节阅读 pdf

android - WebView 未加载 URL

android - Fab in Coordinator layout with bottom padding

android - java.lang.BootstrapMethodError:初始化Retrofit时,调用站点#4 Bootstrap 方法发生异常

java - 共享首选项 - 它们存在多久以及用户可以编辑它们吗?

安卓 WebView : On click of webview new activity should open

android - 应用层 onPause

java - 文件无法下载

android - Kotlin - 为 WebView 全局定义变量