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

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

代码在Android API级别19中正常工作。

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

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

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

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

Solutions Collecting From Web of "在Android WebView中使用mozilla pdf.js Android API级别低于19显示PDF文件"

我有同样的问题。 首先,似乎从2013年12月开始使用旧版本的pdf.js,如果不是包含编译后的文件(pdf.js和pdf.worker.js),而是像helloworld例子那样包含所有的js文件。

然后我发现了这个SOpost 。 有人已经为Android( Butelo )提供了一个pdf.js例子。 我已经尝试过了,项目的资产文件夹中的.js文件甚至可以在Android 2.3上运行,但是只能通过http访问。 在这篇文章中还有关于如何使用file:// urls工作的build议。 我发现了另一个解决scheme:

您阅读并转换PDF文件到Java与Base64。 通过这种方式,您可以绕过文件://限制。

 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; } 

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

 PDFJS.getDocument(fromBase64(base64DataFromJava)); 

此方法适用于Android 4.0及更高版本。 由于一些奇怪的原因,它目前不适用于Android 2.3,但是这可能与我的项目中的其他问题有关。 当然,在较旧的设备上,渲染需要一些时间(有时候是半分钟),但反过来也是如此。

我使用Android-pdf.js面临同样的问题在Android 4.x上有空白的屏幕,但页面的数量是正确的,所以JS可以加载文件从SD卡没有任何与base64的操作,它只是渲染问题。

我replace了

  • compatibility.js
  • pdf.js
  • pdf.worker.js

与来自buleto / PDFViewer的文件,它的工作原理。

我也做了一些改变customview.js1所以现在url传递使用loadUrl\evaluateJavascript而不是replacehtml文件中的string。 这个对我有用。 你可以在这里修改: 要点

编辑第1446行的pdf.worker.js

 if (typeof Blob !== 'undefined') { try {return new Blob([data], { type: contentType });} catch(e) {return null;} }