Поиск и идентификация потоков в PDF с использованием Python

Я около недели пытался автоматизировать извлечение изображений из PDF. К сожалению, ответы, которые я нашел здесь, не помогли. Я видел несколько вариантов одного и того же кода с использованием pypdf2, все с ['/XObject'] в них, что приводит к KeyError,

То, что я ищу, кажется, прячется в потоках, которые я не могу найти в pypdf2 словарь (даже после рекурсивного изучения всей структуры, вызывая .getObject() на каждый косвенный объект, который я могу найти).

С помощью pypdf2 Я написал одну страницу из PDF и открыл ее, используя Notepad++, чтобы найти несколько потоков с /FlateDecode фильтр.

pdfrw был немного более полезным, что позволило мне использовать PdfReader(path).pages[page].Contents.stream чтобы получить поток (без понятия, как получить другие).

С помощью zlib Я распаковал его, и получил что-то, начиная с:

/Part <</MCID 0 >>BDC

(Он также содержит много чисел с плавающей точкой, как положительных, так и отрицательных)

Из того, что я мог найти, BDC имеет отношение к ghostscript.

В этот момент я сдался и решил обратиться за помощью.

Есть ли инструмент Python, чтобы, по крайней мере, извлечь все потоки (и определить FlateDecode тег?)

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

Я ищу что-то, что можно применить к любому PDF, который отображается правильно. Какой-то инструмент для дальнейшего анализа или, по крайней мере, поможет мне разобраться в потоках, или даже справка, которая поможет мне понять, что происходит.

Редактировать: кажется, как заметил Патрик, что я лаю не на том дереве. Я пошел в потоки, так как я не мог найти xObjects при открытии PDF в Notepad++ или при запуске различных скриптов Python, используемых для анализа PDF-файлов. Мне удалось найти то, что я подозреваю, изображения, без xObject теги, но с чем-то вроде потокового тега - хотя информация не сжимается.

1 ответ

Если вы не хотите извлекать встроенные изображения, что не так часто, поток контента не место для поиска изображений. Наиболее распространенным случаем являются потоки типа XObject, подтипа Image, которые обычно находятся в словаре ресурса ->XObject (см. Разделы 7.3.3, 7.8.3 и 8.95 справочника PDF, обозначенного @mkl).

Альтернативно, Image XObjects также можно найти в Form XObjects (форма подтипа, которая указывает, что они имеют свои собственные потоки контента) в своем собственном словаре Resource->XObject, поэтому поиск по Image XObjects может быть рекурсивным.

У Image XObject также может быть softMask, который сам по себе является собственным Image XObject. Формы XObjects также используются в шаблонах листов и, следовательно, могут, по-видимому, содержать Image XObjects (но они также не очень распространены) или использоваться в обычном представлении аннотации (но XObjects Image реже используются в таких аннотациях, за исключением, возможно, 3D или мультимедийные аннотации).

Другие вопросы по тегам