我遇到了同样的问题。起初,使用2013年12月的较旧版本pdf.js似乎可以解决问题,如果不包括编译后的文件(pdf.js和pdf.worker.js),而是像helloworld示例中那样单独包含所有js文件。
然后我发现了这个
SO post。有人为Android准备了一个pdf.js示例(
Butelo)。我尝试了一下,项目的asset文件夹中的.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将像处理URL一样处理UInt8数组。因此,您可以使用:
PDFJS.getDocument(fromBase64(base64DataFromJava));
这种方法在Android 4.0及以上版本中肯定有效。但由于某些奇怪的原因,它目前在我的Android 2.3设备上无法正常工作,但这可能与我的项目中的其他问题有关。当然,在旧设备上,渲染需要一些时间(有时需要半分钟),但这在任何情况下都是如此。