У меня есть файл 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?