我们正在实施PDFJS在一个网站上呈现pdf文件。
当尝试将PDFdocument/Viewer初始化为arrayBuffer时,我们会得到各种各样的错误,并且文件不会呈现。当从url (DEFAULT_URL变量)在查看器中打开相同的文件时,该文件呈现良好。
然而,有一些文件确实呈现为流。比较记事本中的这些文件显示它们有不同的编码/字符。
这段代码用于在查看器中打开文件:
function rawStringToBuffer( str ) {
var idx, len = str.length, arr = new Array( len );
for ( idx = 0 ; idx < len ; ++idx ) {
arr[ idx ] = str.charCodeAt(idx) & 0xFF;
}
return new Uint8Array( arr ).buffer;
}
function readSingleFile(e) {
var file = e.target.files[0];
if (!file) {
return;
}
var reader = new FileReader();
reader.onload = function(e) {
var contents = e.target.result;
var uint8array = rawStringToBuffer(contents);
pdfjsframe.contentWindow.PDFViewerApplication.open(uint8array,0);
};
reader.readAsText(file);
}test.pdf helloworld,它不是用上面的代码呈现的。

test2.pdf helloworld,它与上面的代码一起呈现。

这种行为与浏览器无关。构建是b15f335。
查看器的代码或默认配置是否会导致test.pdf不能由查看器呈现?
发布于 2016-06-22 19:21:09
我不认为您的字符串转换例程rawStringToBuffer()可以满足您的需要。您正在以文本形式读取文件,它将UTF-8转换为UTF-16。但是rawStringToBuffer()只接受每个UTF-16字符的低阶字节,并丢弃高阶字节,而不是逆变换。这将适用于7位ASCII数据,但不适用于其他字符.将字符串转换为UTF-8的最佳方法是使用TextEncoder API (不是所有浏览器都支持,但可以使用多填充)。
然而,转换数据从UTF-8和返回是不必要的。只需使用FileReader.readAsArrayBuffer()而不是readAsText()直接生成ArrayBuffer。
下面是一个(未经测试的)替换函数:
function readSingleFile(e) {
var file = e.target.files[0];
if (!file) {
return;
}
var reader = new FileReader();
reader.onload = function(e) {
var contents = e.target.result;
pdfjsframe.contentWindow.PDFViewerApplication.open(contents, 0);
};
reader.readAsArrayBuffer(file);
}https://stackoverflow.com/questions/37673583
复制相似问题