【问题标题】:Python-pptx: copy slidePython-pptx:复制幻灯片
【发布时间】:2018-06-14 22:10:41
【问题描述】:

如何复制幻灯片?

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

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

【问题讨论】:

    标签: python python-pptx


    【解决方案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)
    

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

    【讨论】:

    • 是的,抱歉耽搁了。我在下面发布了另一个答案
    【解决方案2】:

    我想介绍我的解决方法来复制幻灯片。我使用模板 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
    

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

    希望这对你们中的一些人有所帮助!

    【讨论】:

    • 这是一个非常有趣的方法,感谢您将其添加到此线程。我一直在寻找一种使用 python-pptx 复制幻灯片的好方法,但是这样可以更好地完成工作。
    • 非常聪明优雅的解决方案!它就像一个魅力
    【解决方案3】:

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

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

    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】:

      我使用的是n00by0815's answer,它工作得很好,直到我不得不复制图像。 Here 是我处理图像的改编版本。此代码创建图像的本地副本,然后将其添加到幻灯片中。我确信有一种更清洁的方法,但这很有效。

      【讨论】:

        【解决方案5】:

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

        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')
        

        如果您需要任何其他帮助,请告诉我。

        【讨论】:

          【解决方案6】:

          这是将每张幻灯片复制到整个演示文稿的单个 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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-02-24
            • 1970-01-01
            • 1970-01-01
            • 2022-09-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多