解析PDF压缩交叉引用(xref)数据的困惑求助
解析PDF压缩交叉引用(XREF)数据的问题
我目前在手动解析PDF文件的二进制数据,已经能处理多数对象,包括用zlib解压FlateDecoded格式的流数据,但在解析压缩的交叉引用(XREF)数据时,无法理解解压后的二进制内容。
测试文件为dplyr.pdf:
- 压缩的XREF对象起始位置为343543,采用
/Filter /FlateDecode,流长度5906字节 - 解压流后得到的前100字节为:
b'\x00\x00\x00\x00\xff\x02\x00\x00\x02\x00\x01\x00\x00\x0f\x00\x02\x00\x01\x98\x0c\x02\x00\t;\x10\x02\x00\x00\x02\x01\x02\x00\x00\x02\x02\x02\x00\x01\x98-\x02\x00\t;\x0f\x02\x00\x00\x02\x03\x02\x00\x00\x02\x04\x02\x00\x01\x98>\x02\x00\t;\x0e\x02\x00\x00\x02\x05\x02\x00\x00\x02\x06\x02\x00\x01\x98V\x02\x00\t;\r\x02\x00\x00\x02\x07\x02\x00\x00\x02\x08\x02\x00\x01\x98[' - 解压后总长度为12625字节
使用mutool工具清理PDF后,得到了可参考的明文XREF数据:
xref 0 2525 0000000002 00256 f 0000000016 00000 n 0000000203 00001 f 0000000069 00000 n 0000000134 00000 n 0000000215 00000 n 0000000262 00000 n 0000000321 00000 n
复现代码
import zlib file = "pdf/dplyr.pdf" with open(file, "rb") as f: data = f.read() xref_text = data[slice(343543, 349686)] stream = xref_text[slice(220, 6127)] stream = zlib.decompress(stream) stream[:100]
备注
执行命令 mutool clean -d dplyr.pdf dplyr_clean.pdf 生成清理后的PDF,在37521行附近可找到上述明文XREF数据。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

