Как извлечь ВСЕ ИЗОБРАЖЕНИЯ и текст из всех слайдов файла pptx, используя python? - PullRequest
0 голосов
/ 15 марта 2020

Я могу читать изображения из файла pptx, но не все изображения. Я не могу извлечь изображения, представленные на слайде, с заголовком или другим текстом. Вот мой код, и, пожалуйста, помогите мне.

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE_TYPE
import glob
import os
import codecs
from PIL import Image
import pytesseract
pytesseract.pytesseract.tesseract_cmd = '/usr/local/Cellar/tesseract/4.1.1/bin/tesseract'
from pytesseract import image_to_string

n=0
def write_image(shape):
    global n
    image = shape.image
    # get image 
    image_bytes = image.blob
    # assinging file name, e.g. 'image.jpg'
    image_filename = fname[:-5]+'{:03d}.{}'.format(n, image.ext)
    n += 1
    print(image_filename)
    os.chdir("directory_path/readpptx/images")
    with open(image_filename, 'wb') as f:
        f.write(image_bytes)
    os.chdir("directory_path/readpptx")    


def visitor(shape):
    if shape.shape_type == MSO_SHAPE_TYPE.PICTURE:
            write_image(shape)

def iter_picture_shapes(prs1):
    for slide in prs1.slides:
        for shape in slide.shapes:
                visitor(shape)


file = open("directory_path/MyFile.txt","a+")
for each_file in glob.glob("directory_path/*.pptx"):
    fname = os.path.basename(each_file)
    file.write("-------------------"+fname+"----------------------\n")
    prs = Presentation(each_file)
    print("---------------"+fname+"-------------------")
    for slide in prs.slides:
        for shape in slide.shapes:
            if hasattr(shape, "text"):
                print(shape.text)
                file.write(shape.text+"\n")
    iter_picture_shapes(prs)

file.close()

Выше код способен извлекать изображения из слайдов pptx, которые не имеют текста или заголовка, но не может извлекать изображения в слайдах с текстом или заголовком.

1 Ответ

0 голосов
/ 16 марта 2020

Попробуйте также перебирать мастера слайдов и макеты слайдов. Если есть «фоновые» изображения, вот где они будут. Тот же механизм for shape in slide.shapes: работает с мастер-слайдами и макетами слайдов; они являются вариантом объекта polymorphi c Slide с той же семантикой доступа к форме.

Не думаю, что ваша проблема строго связана с наличием заголовка или текста на слайде. Возможно, эти конкретные слайды используют макет, который включает в себя некоторые фоновые изображения. Если вы открываете слайд и нажимаете на изображение, оно не выделяется (задайте для него ограничивающую рамку), которое указывает на то, что это фоновое изображение и находится на макете слайда или, возможно, на мастер-слайде. Вот как обычно внедряются логотипы, чтобы они отображались на каждом слайде.

Вы также можете рассмотреть возможность итерации по слайду «Примечания» для каждого слайда, если он есть, если там есть текст и / или изображения, которые вы заинтересованы в этом. Редко можно найти изображения в примечаниях к слайду, но PowerPoint поддерживает это.

Другой подход заключается в обходе базового пакета .pptx (в виде Zip-архива) и извлечении изображений таким образом.

...