Я добавил все это вместе в PyPDFTK здесь .
Мой собственный вклад - обработка /Indexed
файлов как таковых:
for obj in xObject:
if xObject[obj]['/Subtype'] == '/Image':
size = (xObject[obj]['/Width'], xObject[obj]['/Height'])
color_space = xObject[obj]['/ColorSpace']
if isinstance(color_space, pdf.generic.ArrayObject) and color_space[0] == '/Indexed':
color_space, base, hival, lookup = [v.getObject() for v in color_space] # pg 262
mode = img_modes[color_space]
if xObject[obj]['/Filter'] == '/FlateDecode':
data = xObject[obj].getData()
img = Image.frombytes(mode, size, data)
if color_space == '/Indexed':
img.putpalette(lookup.getData())
img = img.convert('RGB')
img.save("{}{:04}.png".format(filename_prefix, i))
Обратите внимание, что когда найдены /Indexed
файлы, вы не можете просто сравнить /ColorSpace
со строкой, потому что она выглядит как ArrayObject
. Итак, мы должны проверить массив и получить индексированную палитру (lookup
в коде) и установить его в объекте PIL Image, в противном случае он остается неинициализированным (ноль), и все изображение отображается черным.
Моим первым инстинктом было сохранение их в формате GIF (что является индексированным форматом), но мои тесты показали, что PNG были меньше и выглядели одинаково.
Я нашел эти типы изображений при печати в PDF на Foxit Reader PDF Printer.