PDF Перекрестные ссылки - PullRequest
       25

PDF Перекрестные ссылки

4 голосов
/ 29 декабря 2010

Я занимаюсь разработкой парсера / писателя PDF, но я застрял в создании перекрестных ссылок. Моя программа читает этот файл, а затем удаляет его линеаризацию и распаковывает все объекты в потоках объектов. Наконец, он создает файл PDF и сохраняет его.

Это работает очень хорошо, когда я использую обычные перекрестные ссылки и трейлер, как вы можете видеть в этом файле.

Когда я пытаюсь сгенерировать объект потока перекрестных ссылок (в результате этот файл, Adobe Reader не может его просмотреть.

Кто-нибудь имеет опыт работы с PDF и может помочь мне найти, в чем проблема?

Обратите внимание, что перекрестная ссылка является ЕДИНСТВЕННОЙ разницей между файлом 2 и файлом 3. Первые 34127 байтов совпадают.

Если кому-то нужно содержимое декодированного эталонного потока, скачайте этот файл и откройте его в HEX-редакторе. Я проверял эту справочную таблицу снова и снова, но не смог найти ничего плохого. Но словарь, похоже, тоже в порядке.

Большое спасибо за вашу помощь !!!

Update

Я теперь полностью решил проблему. Вы можете найти новый PDF здесь .

Ответы [ 2 ]

6 голосов
/ 30 декабря 2010

Я вижу две проблемы (не смотря на сами данные потока.

  1. " Размер целое число (обязательно) Число на единицу больше самого высокого номера объекта, используемого в этом разделе или в любом разделе, для которого это должно быть обновление. Оно должно быть эквивалентно размеру Запись в словаре трейлера. "

    Ваш размер должен быть ... 14.

  2. " Index array (Необязательно) Массив, содержащий пару целых чисел для каждого подраздела в этом разделе. Первое целое число должно быть первым номером объекта в подразделе; второе целое число должно быть количество записей в подразделе Массив сортируется в порядке возрастания по номеру объекта. Подразделы не могут перекрываться; номер объекта может иметь не более одной записи в разделе. Значение по умолчанию: [0 Размер]. "

    Ваш индекс, вероятно, должен немного пропустить. У вас нет объектов 2-4 или 7. Индексный массив должен отражать это.

  3. Ваши данные тоже не правы (и я только что научился читать поток внешних ссылок. Да, я.)

<br> 00 00 00<br> 01 00 0a<br> 01 00 47<br> 01 01 01<br> 01 01 70<br> 01 02 fd<br> 01 76 f1<br> 01 84 6b<br> 01 84 a1<br> 01 85 4f

Согласно этим данным, которые из-за вашего «отсутствия индекса» интерпретируются как номера объектов от 0 до 9, имеют следующее смещение:

0 не используется. Хорошо.
1 в 0x0a. Да, конечно, это
2 в 0x47. Нету. Это приземляется около начала потока "1 0". Это, вероятно, не совпадение.
3 в 0x101. Нету. 0x101 все еще находится в потоке "1 0".
4 в 0x170. То же
5 в 0x2fd. То же
6 находится в 0x76f1. Нет, и на этот раз похоронен в потоке этого изображения.

Я думаю, вы поняли идею. Поэтому, даже если у вас был правильный \ Index, все ваши смещения неверны (и полностью отличаются от того, что есть в resultNormal.pdf, даже с учетом путаницы в десятичном и шестнадцатеричном формате).

То, что вы хотите, можно найти в результате: xref: Normal:

xref<br> 0 2<br> 0000000000 65535 f<br> 0000000010 00000 n<br> 5 2<br> 0000003460 00000 n<br> 0000003514 00000 n<br> 8 5<br> 0000003688 00000 n<br> 0000003749 00000 n<br> 0000003935 00000 n<br> 0000004046 00000 n<br> 0000004443 00000 n<br>

Итак, ваш индекс должен быть (если я правильно читаю): \ Index [0 2 5 2 8 5]. И данные:
0 0 0
1 0 a
1 3460 (десятичное число)
1 3514 (то же самое)
1 3688
и т.д.

Интересно, что спецификация PDF говорит, что размер должен быть ОБА, количество записей в этом и всех предыдущих XRef И И номер на единицу больше, чем наивысший номер объекта в использовании.

Я не думаю, что более поздняя часть когда-либо будет применена, но я не удивлюсь, обнаружив, что потоки внешних ссылок более сохраняемы, чем обычные таблицы перекрестных ссылок. Возможно, один и тот же код обрабатывает и то, и другое.


@ mtraut:

Вот что я вижу:

13 0 объектов
<</Size 10/Length 44/Filter /FlateDecode/DecodeParms <</Columns 3/Predictor 12>>/W [1 2 0]/Type /XRef/Root 8 0 R>>
поток
...
endstream
endobj

0 голосов
/ 29 декабря 2010

У "resultstream.pdf" нет действительного потока перекрестных ссылок.

если я открою его в моем приложении просмотра, он попытается прочитать объект «13 0» как перекрестный ссылочный поток, но это простой словарь (потоковые теги и данные отсутствуют).

Aнемного не по теме: на каком языке вы развиваете?По крайней мере, в Java известны три ценных варианта (PDFBox, iText и jPod, где я лично, как один из разработчиков, выбрал jPod, очень чистая реализация :-).Если это не соответствует вашей платформе, может быть, вы хотя бы посмотрите на алгоритмы и структуры данных.

РЕДАКТИРОВАТЬ

Хорошо - если "resultstream.pdf" является рассматриваемым документом, тогда этоэто то, что видит мой редактор (SCITE)

...
13 0 obj
<</Size 0/W [1 2 0]/Type /XRef/Root 8 0 R>>
endobj
startxref
34127
%%EOF

Нет потока.

...