尝试从pdf解压缩外部参照流-收到“错误不正确的标头检查”

问题描述

我正在尝试用JavaScript解析PDF中的外部参照流。我成功地隔离了流本身(我通过在调试模式下将其与PDF中的 steram 。和 endstream 标签间的值进行比较来检查它是否还可以。

但是,当我尝试使用pako lib对其进行充气时,出现错误消息:错误的标头检查错误

压缩方法 FlateDecode ,可以从字典中看到。

这是有问题的代码

const dict = pdfStr.slice(pdf.startXRef);
            const xrefStreamStart = this.getSubstringIndex(dict,'stream',1) + 'stream'.length + 2;
            const xrefStreamEnd = this.getSubstringIndex(dict,'endstream',1) + 1;
            const xrefStream = dict.slice(xrefStreamStart,xrefStreamEnd);
            const inflatedXrefStream = pako.inflate(this.str2ab(xrefStream),{ to: 'string' });


pdfStr is the whole PDF read as a string,while *pdf.startXRef* holds the value of the position of the xref stream object.

如果有人想看一下,这里是完整的PDF:https://easyupload.io/lzf9he

编辑:正如 mcernak 所建议的那样,我在流中包含/ r和/ n时遇到了问题。但是,现在我更正了代码,却遇到了另一个错误无效距离太远了

解决方法

流内容位于stream\r\n\r\nendstream之间。

您需要在开头和结尾都考虑到这两个附加字符(\r\n),以读取正确的数据:

const dict = pdfStr.slice(pdf.startXRef);
const xrefStreamStart = this.getSubstringIndex(dict,'stream',1) + 'stream'.length + 2;
const xrefStreamEnd = this.getSubstringIndex(dict,'endstream',1) - 2;
const xrefStream = dict.slice(xrefStreamStart,xrefStreamEnd);
const inflatedXrefStream = pako.inflate(this.str2ab(xrefStream),{ to: 'string' });