Копировать слайд с изображениями python pptx - PullRequest
0 голосов
/ 12 июля 2020

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

Это отлично работает для текста и текстовых полей, однако тестовое изображение не может быть отображено в новой PowerPoint (показано на изображении ниже) :

введите описание изображения здесь

Код

def copy_slide_from_external_prs(self, src, idx, newPrs):

    # specify the slide you want to copy the contents from
    src_slide = src.slides[idx]

    # Define the layout you want to use from your generated pptx
    slide_layout = newPrs.slide_layouts[2]

    # create now slide, to copy contents to
    curr_slide = newPrs.slides.add_slide(slide_layout)


    # remove placeholders
    for p in [s.element for s in curr_slide.shapes if 'Text Placeholder' in s.name or 'Title' in s.name]:
        p.getparent().remove(p)

    # now copy contents from external slide, but do not copy slide properties
    # e.g. slide layouts, etc., because these would produce errors, as diplicate
    # entries might be generated
    for shp in src_slide.shapes:
        el = shp.element
        newel = copy.deepcopy(el)

        curr_slide.shapes._spTree.insert_element_before(newel, 'p:extLst')
    
    return newPrs

Я пробовал много разных решений и пытался создать новое изображение, используя свойство image.blob исходного изображения. Однако тогда изображение не имеет элемента. Нужно ли мне преобразовать большой двоичный объект в PNG, сохранить его, а затем создать новое изображение, используя сохраненный PNG?

Должен быть лучший способ сделать это. Опять же, я просто хочу сменить тему.

Заранее спасибо!

1 Ответ

0 голосов
/ 15 июля 2020

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

Теперь эта функция copy_slide работает для изображений:

def copy_slide_from_external_prs(src, idx, newPrs):

    # specify the slide you want to copy the contents from
    src_slide = src.slides[idx]

    # Define the layout you want to use from your generated pptx
    SLD_LAYOUT = 5
    slide_layout = prs.slide_layouts[SLD_LAYOUT]

    # create now slide, to copy contents to
    curr_slide = newPrs.slides.add_slide(slide_layout)

    # create images dict
    imgDict = {}

    # now copy contents from external slide, but do not copy slide properties
    # e.g. slide layouts, etc., because these would produce errors, as diplicate
    # entries might be generated
    for shp in src_slide.shapes:
        if 'Picture' in shp.name:
            # save image
            with open(shp.name+'.jpg', 'wb') as f:
                f.write(shp.image.blob)

            # add image to dict
            imgDict[shp.name+'.jpg'] = [shp.left, shp.top, shp.width, shp.height]
        else:
            # create copy of elem
            el = shp.element
            newel = copy.deepcopy(el)

            # add elem to shape tree
            curr_slide.shapes._spTree.insert_element_before(newel, 'p:extLst')

    # add pictures
    for k, v in imgDict.items():
        curr_slide.shapes.add_picture(k, v[0], v[1], v[2], v[3])
        os.remove(k)
...