1

У меня есть файл PDF, который мой читатель (Затура) не открыл. У меня есть другой читатель (mupdf), который открывает его. Я считаю, что Zathura зависит от определения магического значения файла (первые несколько байтов), потому что он может открывать другие форматы, кроме PDF.

При проверке я заметил, что это обнаружено как Java serialisation data, version 5 .

$ file document.pdf
document.pdf: Java serialization data, version 5

Проверка первых нескольких байтов:

00000000: aced 0005 7572 0002 5b42 acf3 17f8 0608 ....ur..[B......
00000010: 54e0 0200 0078 7000 0389 9525 5044 462d T....xp....%PDF-

Обычно PDF начинается с %PDF с байта 0.

Если я уберу первые 27 байтов, я могу открыть файл:

$ dd if=~/Downloads/file.pdf skip=27 bs=1 of=/tmp/file.pdf

Дальнейшая проверка показывает, что файл был сгенерирован Apache FOP версии 1.1. Я не могу найти какой-либо вариант этого формата для PDF, несмотря на довольно много Google.

Это правильный формат для PDF?


обновить , немного углубившись в заголовок, он выглядит как сериализованный массив Java, в котором «массив» содержит данные файла PDF. Я посмотрел спецификацию протокола сериализации и, в частности, описание грамматики, из которого я мог бы декодировать 27-байтовый заголовок как:

  • AC ED = STREAM_MAGIC идентифицирует содержимое файла как протокол сериализации.

  • 00 05 = STREAM_VERSION Версия сериализации.

  • 75 = TC_ARRAY
  • 72 = TC_CLASSDESC
  • 00 02 = длина имени класса.
  • 5b 42 = имя класса ur
  • AC F3 17 F8 06 08 54 E0 = SerialVersionUID , серийный идентификатор версии класса.
  • 02 = флаг SC_SERIALIZABLE - объект поддерживает сериализацию.
  • 00 00 = Количество полей в этом классе (ноль!)
  • 78 = TC_ENDBLOCKDATA .
  • 70 = TC_NULL (у объекта нет родительского класса).
  • 00 03 89 95 = длина "массива" = 231829 = размер данных в байтах

Извлеченный PDF действительно имеет длину 231829 байт.

$ dd if=document.pdf skip=27 bs=1 | wc -c
231829 bytes 

Это указывает на то, что файл не поврежден и действительно является сериализованным массивом Java, который содержит документ PDF. Но будет ли это считаться действительным PDF?

1 ответ1

1

Ссылка имеет это сказать:

3.4.1 File Header

The first line of a PDF file is a header identifying the version of the PDF
specification to which the file conforms. For a file conforming to PDF 1.7, 
the header should be

    %PDF−1.7

Моя интерпретация этой строки такова, что, строго говоря, файл, который у вас есть, не является допустимым файлом PDF. Первая строка заканчивается правильным значением, но она содержит дополнительный "мусор" перед ним.

Это говорит о том, что наиболее вероятно, до реализации читателя PDF, как искать магию %PDF-x.x , и я предполагаю, что большинство читателей, пока они не достигают первого 0D 0A который в вашем случае оказывается сразу после PDF-маркер.

Если бы данные сериализации содержали значение 0D 0A , то я предполагаю, что mupdf также не сможет его прочитать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .