Уменьшить размер картинок в документе Word. Не получается "достучаться" до картинки

Имеется много документов Word (.docx), каждый из которых содержит много картинок большого размера. Пытаюсь уменьшить размер всех картинок во всех документах и привести их к размеру 1427 х 1070. Вычитал, что с docx можно работать как с zip, т.к. похожая структура. Вот код:

import zipfile
from PIL import Image

doc_link = r"I:\Мой диск\документ.docx" #пример файла

custom_size = (1427, 1070)

with zipfile.ZipFile(doc_link) as zf:
    for name in zf.infolist():
        if name.filename.startswith('word/media/') and name.file_size > 50000: 
            image_to_resize = Image.open(name.filename) #в этой строке проблема,
            # не могу достучаться до картинки модулем PIL.Image
            image_to_resize = image_to_resize.resize(custom_size, Image.ANTIALIAS)
            image_to_resize.save(name.filename) #и сохранить не получается

проблема в том, что не получется подцепить картинку модулем PIL, т.к. Image.open() предполагает в качестве аргумента путь к картинке.

Пробовал варианты:

image_to_resize = Image.open(f'{doc_link}\\{name.filename}')

путь так же не находит.


Ответы (1 шт):

Автор решения: eri

Нужно распаковать картинку во временную папку и потом открывать её на обработку.

Или в память в file-like

image_to_resize = Image.open(zf.open(name.filename))

С сохранением

b = io.BytesIO()
image_to_resize.save(b)
b.seek(0)
zf.write(b, name.filename)
→ Ссылка