JavaScript库可解码PDF流

问题描述

我正在寻找一个JavaScript库来解码PDF流。有没有可以轻松做到这一点的JS库?

比方说,我知道将用于流的过滤器将是 FlateDecode 。即使那样,我也无法解码流。

例如,我有一个包含此流对象的PDF:

10596 0 obj
<</DecodeParms<</Columns 4/Predictor 12>>/Filter/FlateDecode/ID[<32A0A015231B6F4FB0DF3eB2E49EB691F><427BD1F9CB544B4B9916DDF475C70A50>]/Index[2334 1 2396 2 10594 3]/Info 2397 0 R/Length 33/Prev 1849582/Root 10480 0 R/Size 10597/Type/XRef/W[1 3 0]>>stream
hÞbb”ñÉfb``ð??Ó¯ Æ ®"ˆP??0=??Œ
endstream
endobject

我试图使用pako库对流进行解码。但是,出现以下错误 ERROR不正确的标头检查

我还看到在此流对象中使用了预测函数。是否有任何包含预测功能的平面解码库,还是我必须单独应用?

编辑:正如 @Mark Adler 所建议的那样,我不小心将换行符包含在我尝试解码的字节中。现在,我更正了一个不同的错误无效的距离太远了

EDIT2:

这是代码的相关部分:

const dict = pdfStr.slice(pdf.startXRef); // pdfStr contains the value of the whole PDF,pdf.startXRef holds the position of the the xref stream object
            const xrefStreamStart = this.getSubstringIndex(dict,'stream',1) + 'stream'.length + 2;
            const xrefStreamEnd = this.getSubstringIndex(dict,'endstream',1) - 1;
            const xrefStream = dict.slice(xrefStreamStart,xrefStreamEnd);
            console.log(this.strHex(xrefStream)); // logs the following value: 68de62621df1c966626060f00112d3af0009c60d20ae22c650020830003d0603520d
            const inflatedXrefStream = pako.inflate(xrefStream,{ to: 'string' });

EDIT3:这是解析pdf时使用Uint8Array而不是字符串的更新代码

const dict = pdfStr.slice(pdf.startXRef);
//pdf.stream.bytes holds the value of PDF as Uint8Array
        const pdfStreamDict = pdf.stream.bytes.slice(pdf.startXRef);
        const xrefStreamStart = this.getSubstringIndex(dict,1) + 'stream'.length + 2;
        const xrefStreamEnd = this.getSubstringIndex(dict,1) - 2;
        const xrefStream = pdfStreamDict.slice(xrefStreamStart,xrefStreamEnd);
        console.log(this.buf2hex(xrefStream));
        const inflatedXrefStream = pako.inflate(xrefStream);

我终于设法使用这种方法解决了问题,但是当我在另一个PDF上尝试相同的代码时,我再次收到错误不正确的标头检查。这是从该pdf解析的流的十六进制值: 9c636264e06760626038092498968258464082b10e44dc07117a4042e11a8815c2c0c4786b1948090323360200145f06

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)