Как распознать формат PDF? - PullRequest
       4

Как распознать формат PDF?

8 голосов
/ 16 сентября 2010

Учитывая поток байтов, как я могу определить, содержит ли этот поток документ PDF или что-то еще?

Я использую .NET и C #, но это не имеет значения.

Ответы [ 2 ]

15 голосов
/ 16 сентября 2010

Все зависит от того, насколько хорошо / надежно вы хотите, чтобы обнаружение работало.

Вот мой выбор наиболее важных битов + фрагментов из официального определения длиной 756 страниц, прямо изо рта лошади ( PDF 32000: 1-2008 ):

Основной соответствующий PDF-файл должен состоять из следующих четырех элементов (см. Рисунок 2):

  • однострочный заголовок, идентифицирующий версию спецификации PDF, которой соответствует файл
  • Тело, содержащее объекты, составляющие документ, содержащийся в файле
  • Таблица перекрестных ссылок, содержащая информацию о косвенных объектах в файле
  • Трейлер с указанием местоположения таблицы перекрестных ссылок и некоторых специальных объектов в теле файла
    [....]

Первая строка файла PDF должна быть заголовком, состоящим из 5 символов% PDF–, за которым следует номер версии формы 1.N, где N - это цифра от 0 до 7. Соответствующий читатель должен принимать файлы с любым из следующих заголовков:
% PDF-1,0
% PDF-1,1
% PDF-1,2
% PDF-1,3
% PDF-1,4
% PDF-1,5
% PDF-1.6
% PDF-1,7
[...]

Если файл PDF содержит двоичные данные, как это делают большинство (см. 7.2, «Лексические соглашения»), за строкой заголовка должна немедленно следовать строка комментария, содержащая как минимум четыре двоичных символа, то есть символы с кодами 128 или больше Это обеспечивает правильное поведение приложений передачи файлов, которые проверяют данные в начале файла, чтобы определить, следует ли рассматривать содержимое файла как текст или как двоичный файл.

Прицеп
[....] Последняя строка файла должна содержать только маркер конца файла, %% EOF. Две предыдущие строки должны содержать, по одной на строку и по порядку, ключевое слово startxref и смещение байта в декодированном потоке от начала файла до начала ключевого слова xref в последнем разделе перекрестных ссылок.

Резюме

Две самые важные вещи, которые нужно помнить:

(a) Первая «строка заголовка»

   %PDF-1.X

[где X в 0..7] должен появиться на отдельной строке, за которой следует новая строка. Эта строка должна появляться в первых 4096 байтах, необязательно в самой первой строке. Предыдущие строки могут содержать содержимое не в формате PDF, но команды для работы с принтером (PJL) или комментарии.

(b) Самая следующая строка должна содержать четыре двоичных байта, если PDF-файл содержит двоичные данные.

Просто синтаксический анализ '% PDF-1.' уже укусил много людей ....

4 голосов
/ 16 сентября 2010

Файл PDF начинается со строки ASCII %PDF-1.3 или чего-то подобного, в зависимости от того, какая версия PDF на самом деле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...