Python-pptx:复制幻灯片

时间:2018-06-14 22:10:41

标签: python python-pptx

如何复制幻灯片?

我创建了一个模板幻灯片,我需要复制它并分别编辑每个副本的形状。

或者我如何将模板幻灯片添加到presentation.slide_layouts?

6 个答案:

答案 0 :(得分:1)

这是我在GitHub上找到的,对我有用。我确实为我的项目做了几件事。您将需要导入六个并复制。我正在使用pptx-6.10

def duplicate_slide(pres,index):
        template = pres.slides[index]
        try:
            blank_slide_layout = pres.slide_layouts[12]
        except:
            blank_slide_layout = pres.slide_layouts[len(pres.slide_layouts)]

        copied_slide = pres.slides.add_slide(blank_slide_layout)

        for shp in template.shapes:
            el = shp.element
            newel = copy.deepcopy(el)
            copied_slide.shapes._spTree.insert_element_before(newel, 'p:extLst')

        for _, value in six.iteritems(template.part.rels):
            # Make sure we don't copy a notesSlide relation as that won't exist
            if "notesSlide" not in value.reltype:
                copied_slide.part.rels.add_relationship(value.reltype,
                                                value._target,
                                                value.rId)

        return copied_slide

然后,您可以通过传入演示文稿和模板的幻灯片索引来创建副本:

copied_slide = duplicate_slide(pres, 4)

我仍在编辑复制幻灯片中的形状,一旦在项目中继续前进,我就可以更新

答案 1 :(得分:1)

我想展示我的解决方法来复制幻灯片。我使用模板ppt并填充它。我知道在填充幻灯片之前,模板的哪些幻灯片需要复制以及需要多长时间复制一次。然后,我要做的就是复制幻灯片并用复制的幻灯片保存新的ppt。保存后,我可以使用复制的幻灯片打开ppt,然后使用pptx填充幻灯片。

import win32com.client
ppt_instance = win32com.client.Dispatch('PowerPoint.Application')
#open the powerpoint presentation headless in background
read_only = True
has_title = False
window    = False
prs = ppt_instance.Presentations.open('path/ppt.pptx',read_only,has_title,window)

nr_slide = 1
insert_index = 1
prs.Slides(nr_slide).Copy()
prs.Slides.Paste(Index=insert_index)

prs.SaveAs('path/new_ppt.pptx')
prs.Close()

#kills ppt_instance
ppt_instance.Quit()
del ppt_instance

在这种情况下,将复制演示文稿的第一张幻灯片,并将其插入到同一演示文稿的第一张幻灯片之后。

希望这对您有所帮助!

答案 2 :(得分:1)

我使用的是n00by0815's answer,在我不得不复制图像之前,它一直很好用。 Here是我处理图像的适应版本。此代码创建图像的本地副本,然后将其添加到幻灯片。我敢肯定有一种更干净的方法,但这行得通。

答案 3 :(得分:0)

由于我还为@d_bergeron共享的代码找到了另一个用例,所以我只想在这里共享它。 就我而言,我想将一张幻灯片从另一个演示文稿复制到我用python-pptx生成的幻灯片:

作为参数,我传入使用python-pptx创建的Presentation()对象(prs = Presenation())。

from pptx import Presentation
import copy

def copy_slide_from_external_prs(prs):

    # copy from external presentation all objects into the existing presentation
    external_pres = Presentation("PATH/TO/PRES/TO/IMPORT/from.pptx")

    # specify the slide you want to copy the contents from
    ext_slide = external_pres.slides[0]

    # 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 = prs.slides.add_slide(slide_layout)

    # 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 ext_slide.shapes:
        el = shp.element
        newel = copy.deepcopy(el)
        curr_slide.shapes._spTree.insert_element_before(newel, 'p:extLst')

    return prs

我主要是在这里发布它,因为我正在寻找一种将外部幻灯片复制到演示文稿中并最终进入此线程的方法。

答案 4 :(得分:0)

很抱歉,我被转移到另一个项目。我能够使用多个模板幻灯片并复制它们来完成我的ppt项目。在构建演示文稿的最后,我删除了模板。要获取形状,您需要遍历slide.shapes并找到您要寻找的形状的名称。一旦退回该图形,就可以根据需要编辑形状。我添加了add_text函数的一个版本,用于填充shape.text_frame。

def find_shape_by_name(shapes,name):
        for shape in shapes:
            if shape.name == name:
                return shape
        return None

def add_text(shape,text,alignment=None):

    if alignment:
        shape.vertical_anchor = alignment

    tf = shape.text_frame
    tf.clear()
    run = tf.paragraphs[0].add_run()
    run.text = text if text else ''

要找到形状“ slide_title”

slide_title = find_shape_by_name(slide.shapes,'slide_title')

向形状添加文本

add_text(slide_title,'TEST SLIDE')

如果需要其他帮助,请告诉我

答案 5 :(得分:0)

这是将每个幻灯片复制到整个演示文稿的单个PPTX幻灯片上的另一种方法,然后您可以使用LibreOffice将每个单独的Powerpoint转换为图像:

def get_slide_count(prs):
""" Get the number of slides in PPTX presentation """
    slidecount = 0
    for slide in prs.slides:
        slidecount += 1
    return slidecount


def delete_slide(prs, slide):
    """ Delete a slide out of a powerpoint presentation"""
    id_dict = { slide.id: [i, slide.rId] for i,slide in enumerate(prs.slides._sldIdLst) }
    slide_id = slide.slide_id
    prs.part.drop_rel(id_dict[slide_id][1])
    del prs.slides._sldIdLst[id_dict[slide_id][0]]


def get_single_slide_pres(prs, slidetokeep):
    for idx, slide in enumerate(prs.slides):
        if idx < slidetokeep:
            delete_slide(prs, slide)
        elif (idx > slidetokeep):
            delete_slide(prs, slide)
    prs.save(str(slidetokeep + 1) + ".pptx")


pptxfilepath = "test.pptx"
prs = Presentation(pptxfilepath)
slidecount = get_slide_count(prs)
for i in range(slidecount):
    prs_backup = Presentation(pptxfilepath)
    get_single_slide_pres(prs_backup, i)
    prs_backup = None