gpt4 book ai didi

pdf.js - PDFJS 和 PDF 编码

转载 作者:行者123 更新时间:2023-12-01 13:43:39 29 4
gpt4 key购买 nike

我们正在实现 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?

最佳答案

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

关于pdf.js - PDFJS 和 PDF 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37673583/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com