如何解决在 PDF 中写入流式交叉引用:检测到文件已损坏? 不正确的 startxref 偏移缺少预测字节预测仅适用于偏移量
我正在使用 Typescript 在我的 PDF 文件的末尾编写一个流式交叉引用表,正如我的 previous post 中的答案所建议的
这是我在没有流的情况下编写的 XREF 表:
xref
0 1
0000000000 65535 f
21 2
0000084670 00000 n
0000085209 00000 n
73 6
0000085585 00000 n
0000086335 00000 n
0000150988 00000 n
0000151086 00000 n
0000151528 00000 n
0000151707 00000 n
trailer
<<
/Size 79
/Root 21 0 R
/Info 19 0 R
/Prev 116
>>
startxref
152861
%%EOF
这是流媒体版本:
79 0 obj
<<
/Type /XRef /Filter /FlateDecode
/Root 21 0 R
/Info 19 0 R
/Index [0 1 21 2 73 7 ] /W[1 3 0] /DecodeParms<</Columns 4/Predictor 12>> /Prev 116 /Length 45 /Size 80>>
stream
(...data..)
endstream
endobj
startxref
152870
%%EOF
至于流的内容,这里是字节数组形式。它是使用 Poko.deflate() 以默认压缩级别压缩的:
120,156,99,98,2,38,70,175,125,76,140,12,210,64,130,177,196,122,7,36,254,244,9,16,16,140,130,44,6,140
我已经颠倒了我发现的过程here
安排的充气版本如下:
02 00 00 00 00
02 01 01 4a be // = 84670 -> object 21 is at byte position 84670
02 01 00 02 1b // = 539 -> object 22 is at byte position 85209
02 01 00 01 78 // = 376 -> object 73 is at byte position 85585
02 01 00 02 ee // etc
02 01 00 fc 8d
02 01 00 00 62
02 01 00 01 ba
02 01 00 00 b3
02 01 00 04 82
但是,当我尝试打开生成的文件时,我得到的只是:
我错过了什么?这个过程最奇怪的地方是每行前导的“02”(在参考文章 here 中找到)。但是,即使没有它,似乎也会出现同样的问题。我错过了什么?
解决方法
可以轻松识别 3 个问题。
不正确的 startxref 偏移
您的 startxref 指向流字典的开头,但它应该指向包含流的间接对象的对象编号。
缺少预测字节
您声称安排的充气版本是
02 00 00 00 00
02 01 01 4a be // = 84670 -> object 21 is at byte position 84670
02 01 00 02 1b // = 539 -> object 22 is at byte position 85209
02 01 00 01 78 // = 376 -> object 73 is at byte position 85585
02 01 00 02 ee // etc
...
但是夸大你的信息流会带来
00 00 00 00
01 01 4a be
01 00 02 1b
01 00 01 78
01 00 02 ee
...
即你忘了添加预测字节。
预测仅适用于偏移量
您修复了上述两个错误并共享了该文件。查看该文件,另一个错误变得清晰:您只将预测应用于交叉引用条目的偏移部分,而不应用于指示条目类型的初始字节!
你的膨胀流现在如下
02,01,4a,be,02,00,1b,78,ee,fc,8d,62,bc,b3,04,82
因此,解决预测结果
01,4c,d9,03,4d,51,4f,3f,05,4b,cc,06,2e,07,ea,08,9d,09,50,1f
这包含很多不正确的类型字节。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。