问题描述
我正在尝试用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' });