Rid*_*ari 7 pdf android webview
我在Android WebView中使用mozilla pdf.js来显示PDF文件.
代码在Android API Level 19中运行良好.
Uri path = Uri.parse(Environment.getExternalStorageDirectory().toString() + "/test.pdf");
webView.loadUrl("file:///android_asset/pdfviewer/index.html?file=" + path);
Run Code Online (Sandbox Code Playgroud)
但它不适用于Android API 16级及以下版本.
设备上显示白色空白屏幕.
有什么方法可以解决这个问题吗?
小智 4
我也遇到过同样的问题。首先,如果不包含已编译的文件(pdf.js 和 pdf.worker.js),而是像 helloworld 示例中那样单独包含所有 js 文件,那么使用 2013 年 12 月的旧版本 pdf.js 似乎是可行的。
然后我发现了这个SO帖子。有人整理了一个适用于 Android 的 pdf.js 示例(Butelo)。我已经尝试过,项目的 asset 文件夹中的 .js 文件甚至可以在 Android 2.3 上运行,但前提是通过 http 访问。帖子中还提供了有关如何使其与 file:// url 一起使用的建议。我找到了另一个解决方案:
您可以使用 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();
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过某种方式将 传递给 WebView 来加载它imageData
。使用 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;
}
Run Code Online (Sandbox Code Playgroud)
pdf.js 将采用 UInt8 数组,就像它是 URL 一样。所以你可以使用:
PDFJS.getDocument(fromBase64(base64DataFromJava));
Run Code Online (Sandbox Code Playgroud)
此方法在Android 4.0以上版本肯定有效。由于某些奇怪的原因,它目前不适用于我的 Android 2.3,但这可能与我的项目中的其他一些问题有关。当然,在较旧的设备上,渲染将需要一些时间(有时是半分钟),但无论如何都会如此。
归档时间: |
|
查看次数: |
12949 次 |
最近记录: |