Структура PDF без дерева страниц - PullRequest
0 голосов
/ 30 октября 2018

Добрый день! У меня есть 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 объектов), я ничего не нахожу. Пожалуйста, помогите мне, как это может быть и когда я могу взять количество страниц (только решение в формате PDF. Не Imagick и другое) Спасибо

1 Ответ

0 голосов
/ 30 октября 2018

Вы не можете найти этот объект, поскольку он хранится в сжатом потоке вместе с рядом других объектов.

Как всегда, вы должны начать с чтения таблицы перекрестных ссылок xref. Вы найдете, что это также сжато; см. 7.5.8 Потоки перекрестных ссылок в ISO PDF 32000-1: 2008:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...