You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:20:22