【问题标题】:PDFJS and PDF encodingPDFJS 和 PDF 编码
【发布时间】:2016-06-25 02:33:32
【问题描述】:

我们正在实施 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.pdfhelloworld pdf,上面的代码没有渲染。

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

该行为不依赖于浏览器。构建是 b15f335。

查看器的代码或默认配置是否存在某些问题,导致查看器无法呈现 test.pdf?

【问题讨论】:

标签: pdf.js


【解决方案1】:

我不认为您的字符串转换例程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);
}

【讨论】:

猜你喜欢
  • 2016-10-18
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
  • 2020-03-28
  • 2020-02-15
  • 2019-03-10
  • 2018-04-13
  • 1970-01-01
相关资源
最近更新 更多