Если вы используете только регулярные выражения, легко создать файл PDF, который ваша программа не сможет обработать.Словари и списки PDF могут содержать другие объекты.Regex не может обрабатывать рекурсивные структуры, по крайней мере, модуль Python re.
PDF-файл - это дерево объектов и потоков:
- Словари:
<<
(имя значения)* >>
- Списки:
[
(значение) * ]
- Имена:
/
(обычный символ) * - Строки:
(
(char) * )
- Шестнадцатеричные строки:
<
(hexchar) * >
- Числа: (
-
)?((цифра) + | (цифра) + .
(цифра) * | .
(цифра) +) - Логические значения:
true
|false
- Ссылки: (цифра) + (пробел) + (цифра) + (пробел) +
R
Пробел и комментарии игнорируются в большинстве мест.Комментарии начинаются с %
и продолжаются до конца строки.
Косвенные объекты указываются как:
1 0 obj
(any object)
endobj
На этот объект можно ссылаться как 1 0 R
.К косвенным словарям также может быть присоединен поток:
1 0 obj
<<
/Length 22
>>
stream
(22 bytes of raw data)
endstream
endobj
Файл PDF выглядит примерно так:
%PDF-1.4
%ÿÿÿÿ
1 0 obj
<< /Author (MizardX) >>
endobj
2 0 obj
<<
/Type /Catalog
% more required keys
>>
endobj
%lots of more indirect objects, one after another
trailer
<<
/Info 1 0 R
/Root 2 0 R
% ... more required keys
>>
xref
0 3
0000000000 65535 f
0000000015 00000 n
0000000054 00000 n
startxref
225
%%EOF
Корнем дерева объектов является объект trailer
.На каждый объект ссылаются прямо или косвенно из этого словаря.
В потоках скрыто намного больше сложностей, но это не влияет на структуру файла.
С полной спецификацией можно ознакомиться по адресу Сайт Adobe .