首页 > 解决方案 > 没有页面树的pdf结构

问题描述

再会!我有这个根节点的pdf文件:

2 0 obj
<<
/Type /Catalog
/Pages 4 0 R
/Metadata 5 0 R
/Outlines 6 0 R
/PageMode /UseOutlines
/OpenAction [7 0 R /XYZ null null 1]
/PageLabels 8 0 R
/PageLayout /OneColumn
>> 
endobj

但是,当我搜索页面节点(4 0 obj)时,我什么也没找到。请帮帮我,怎么可能,我什么时候可以取页数(只有pdf格式的解决方案。不是imagick等)谢谢

标签: pdf

解决方案


您找不到该对象,因为它与许多其他对象一起存储在压缩流中。

与往常一样,您应该从阅读交叉引用表开始xref。你会发现这也被压缩了;请参阅ISO PDF 32000-1:2008 中的 7.5.8 交叉引用流:

7.5.8.1 概述
从 PDF 1.5 开始,交叉引用信息可以存储在交叉引用流中而不是交叉引用表中。

startxref指向字典

6628 0 obj
<<
/W [1 4 1]
/Info 1 0 R
/Root 2 0 R
/Size 6629
/Type /XRef
/Filter /FlateDecode
/Length 3996
/DecodeParms <<
/Columns 6
/Predictor 12
>>
>>
stream
... (compressed data) ..
endstream

并解压这个节目

index entry 0: 0 0 255
index entry 1: 2 3 0
index entry 2: 1 15 0
index entry 3: 1 3981 0
index entry 4: 2 3 1
index entry 5: 1 197 0
index entry 6: 2 3 2
index entry 7: 2 3 3
index entry 8: 2 3 4
index entry 9: 2 3 5
.. etc. ..

条目中的第一个数字是其状态:0“未使用”,f在常规外部参照表1中等于,n在常规表中等于,2表示对象在另一个流中被压缩。有关完整含义,请参见 ISO 参考。

从这里,您可以看到/Root对象 #2 中的条目位于偏移量 15(十进制)处,而您的/Pages#4 位于位置 #1 的压缩流中。事实上,解压缩这显示了预期的

4 0 obj @ 3     % "Pages"
<<
  /Type     /Pages
  /Count    364
  /Kids     [ 
    9 0 R 10 0 R ]
>>
endobj

推荐阅读