Разбор PDF-файла с помощью регулярных выражений в Python - PullRequest
4 голосов
/ 12 октября 2010

Я пытаюсь проанализировать некоторые элементы объекта из PDF-файла, используя модуль Python.Моя цель - проанализировать каждый объект PDF с помощью регулярного выражения.Пример объекта PDF выглядит следующим образом:

1 0 obj
<<
    /Type /Catalog
    /Pages 2 0 R
>>
endobj
2 0 obj
<<
    /Type /Pages
    /Kids [ 3 0 R ]
    /Count 1
>>
endobj
...

Когда я использую "\d+\s\d+\sobj[\s,\S]*endobj", он не работает (он продолжает анализ до последнего найденного endobj).Как я могу изменить регулярное выражение, чтобы анализировать каждый объект отдельно (другими словами, часть от 1 0 obj до endobj)?

Ответы [ 4 ]

8 голосов
/ 12 октября 2010

Если вы используете только регулярные выражения, легко создать файл 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 .

2 голосов
/ 12 октября 2010

Знак вопроса после повторной части должен занимать минимальное количество символов.Также запятая не нужна, потому что \S уже учитывает это.

\d+\s\d+\sobj[\s\S]*?endobj
2 голосов
/ 12 октября 2010

Не совсем ответ на ваш точный вопрос, но вы, возможно, захотите взглянуть на существующие библиотеки синтаксического анализа pdf в python, например: pdfminer или pyPdf . (даже если вы их не используете, вы можете посмотреть, как они это делают)

2 голосов
/ 12 октября 2010

Вам необходимо использовать *? в качестве нежадной версии - см. документацию здесь .

Кроме того, обратите внимание, что формат PDF очень сложен - особенно когда он начинает содержать двоичные потоки внутри него - но если вы знаете, что PDF-файлы, которые вы просматриваете, просты, то это должно сработать.

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