Декодирование потока перекрестных ссылок - PullRequest
0 голосов
/ 06 октября 2019

Я написал парсер pdf со своим собственным декодером Deflate. Он отлично работает для всех потоков, с которыми я сталкивался до сих пор, но не может декодировать двоичное содержимое потока внешних ссылок. Вот в шестнадцатеричном формате байты, найденные после «stream» и перед «endstream»:

68 DE 62 62 62 60 D8 CB F4 9F 79 F5 1F 20 83 A9 19 48 F0 AB 01 09 86 E900 01 06 00 46 3B 04 C4

После удаления первых двух байтов (заголовок zlib 0x68 0xDE) мой декодер Deflate читает 26 байтов и останавливается, выдав на выходе 34 байта:

0202 00 00 BD 02 FF 03 AB FC 02 00 00 02 83 02 00 00 02 83 02 FF 26 02 83 O2 0F 26 02 83 02 0F 00 97

Вот файл: https://drive.google.com/open?id=1BHB0AAdAVA6EQuE-aPHrCXvdqU8uUWFP

Запись / Filter в словаре потоков имеет значение / FlateDecode, и, насколько я вижу, этот файл не зашифрован. Существует также запись / DecodeParms, установленная в словарь, содержащий / Columns 4 / Predictor 12, но, если я прав, ее необходимо использовать после накачки двоичных данных потока.

Декодер Deflate создает 34 байтана выходе, но даже после применения фильтра PNG Up они не имеют смысла для меня.

Спасибо.

1 Ответ

0 голосов
/ 11 октября 2019

FLATE декодирование этого потока приводит к

02 02 00 00 BD 02 FF 03 AB FC 02 00 00 02 83 02 00 00 0F 26 02 00 00 00 97

Таким образом, ваша заявка Декодер Deflate выдает 34 байта указывает, что вы что-то делаете неправильно, используя ваш декодер Deflate.

Рассматривали ли вы, что потоки в формате PDF FLATE не содержат сжатых данных naked FLATE, а вместо этого находятся в формате сжатых данных ZLIB упаковка сжатые данные FLATE? Если ваш декодер ожидает обнаженные данные, сначала вы должны удалить заголовок ZLIB. Подробности и ссылки см. в этом ответе .

Чтобы завершить декодирование, мы должны разрешить использование предиктора PNG Up:

02 02 00 00 BD         02 00 00 BD
02 FF 03 AB FC         01 03 AB B9
02 00 00 02 83   -->   01 03 AD 3C
02 00 00 0F 26         01 03 BC 62
02 00 00 00 97         01 03 BC F9

С учетом /Index[185 2 188 3] и /W[1 3 0], следовательно:

  • Объект 185 находится в потоке объекта 189
  • Объект 186 начинается со смещением 0x03ABB9
  • Объект 188 начинается со смещением 0x03AD3C
  • Объект 189 начинается со смещением 0x03BC62
  • Объект 190 начинается со смещением 0x03BCF9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...