PDFJS和PDF编码

时间:2016-06-07 07:53:57

标签: pdf.js

我们正在实施PDFJS以在网站上呈现pdf文件。

当尝试将PDF文档/查看器作为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 pdf,不使用上面的代码呈现。

file content in notepad

test2.pdf helloworld pdf,使用上面的代码进行渲染。

enter image description here

该行为不依赖于浏览器。版本是b15f335。

是否存在查看器的代码或默认配置,以便查看器无法呈现test.pdf?

1 个答案:

答案 0 :(得分:3)

我不认为您的字符串转换例程rawStringToBuffer()可以满足您的需求。您正在将文件作为文本读取,将UTF-8转换为UTF-16。但是rawStringToBuffer()只取每个UTF-16字符的低位字节并丢弃高位字节,这不是逆变换。这适用于7位ASCII数据,但不适用于其他字符。将字符串转换为UTF-8的最佳方法是使用TextEncoder API(并非所有浏览器都支持,但可以使用polyfill)。

但是,不需要将数据从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);
}