Извлеките все изображения в файл DOCX, используя python - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть файл DOCX, который содержит 6-7 изображений. Мне нужно автоматизировать извлечение изображений из этого файла do c. Есть ли win32com MS Word API для того же? Или какая-нибудь библиотека, которая может точно извлечь все изображения из нее?

Это то, что я пробовал, но проблема, во-первых, в том, что она не дает мне все изображения, во-вторых, она дает мне много ложных положительных изображений, например пустое изображение, очень маленькие изображения, линии и т. д. c ... Это также использует слово MS, чтобы сделать то же самое.

from pathlib import Path
from win32com.client import Dispatch

xls = Dispatch("Excel.Application")
doc = Dispatch("Word.Application")


def export_images(fp, prefix="img_", suffix="png"):
    """ export all of images(inlineShapes) in the word file.
    :param fp: path of word file.
    :param prefix: prefix of exported images.
    :param suffix: suffix of exported images.
    """

    fp = Path(fp)
    word = doc.Documents.Open(str(fp.resolve()))
    sh = xls.Workbooks.Add()
    for idx, s in enumerate(word.inlineShapes, 1):
        s.Range.CopyAsPicture()
        d = sh.ActiveSheet.ChartObjects().add(0, 0, s.width, s.height)
        d.Chart.Paste()
        d.Chart.Export(fp.parent / ("%s_%s.%s" % (prefix, idx, suffix))
    sh.Close(False)
    word.Close(False)
export_images(r"C:\Users\HPO2KOR\Desktop\Work\venv\us2017010202.docx")

Вы можете скачать файл DOCX здесь https://drive.google.com/open?id=1xdw2MieI1n3ulXlkr_iJSKb3cbozdvWq

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

Вы можете распаковать все изображения из docx, предварительно отфильтровав их по размеру:

import zipfile

archive = zipfile.ZipFile('file.docx')
for file in archive.filelist:
    if file.filename.startswith('word/media/') and file.file_size > 300000:
        archive.extract(file)

В вашем примере 5 найдено изображений:

enter image description here

0 голосов
/ 13 февраля 2020

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

import docx2txt
text = docx2txt.process("docx_file", r"directory where you want to store the images")

Обратите внимание, что она также дает весь текст, найденный в файле, в текстовой переменной.

0 голосов
/ 13 февраля 2020

В вашем перечислении l oop вам, вероятно, следует проверить, что тип фигуры является рисунком:

for idx, s in enumerate(word.inlineShapes, 1):
    if s.Type != 3: # wdInlineShapePicture
        continue
    # ...
...