我遇到了同样的问题.首先,似乎从2013年12月开始使用旧版本的pdf.js,如果不包括已编译的文件(pdf.js和pdf.worker.js),您可以单独包含所有js文件,就像在helloworld示例中一样.
然后我发现了这个SO post.有人为Android安排了一个pdf.js示例(Butelo).我试过了,项目的资产文件夹中的.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("
", "").replace("", "");
} 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上不起作用,但这可能与我项目中的其他一些问题有关.当然,在较旧的设备上,渲染需要一些时间(有时是半分钟),但无论如何都是如此.