Python PPTX:从另一个演示文稿添加整个幻灯片

时间:2017-11-30 23:07:13

标签: python powerpoint python-pptx

似乎这个问题在2015年提出并要求,但我找不到任何更新。我正在尝试通过执行以下操作将整张幻灯片(包括其文本和图像)从另一个演示文稿复制到我的工作演示文稿中:

prs = Presentation('CurrentPresentation.pptx')
prs1 = Presentation('OtherPresentation.pptx')
# Wanted_Slide = prs1.slides[0]
New_Slide = prs.slides.add_slide(prs1.slide_layout[0])

但所有这一切都是添加一张完全空白的幻灯片(带有所需幻灯片的背景)和幻灯片布局0,这完全有意义。我知道这不是正确的做法。我尝试了下面的内容,它确实添加了一张幻灯片,但它只是在prs演示文稿中已经存在的重复内容(我想我发现了一种方法,无意中复制了演示文稿中的幻灯片):

def Add_Slide(self):
    xml_slides = prs.slides._sldIdLst
    xml_slides1 = prs1.slides._sldIdLst
    slides = list(xml_slides)
    slides1 = list(xml_slides1)
    xml_slides.append(slides1[0])

以上代码是我在网上找到的幻灯片删除方法的操作。

或者,是否有人建议如何将幻灯片及其所有内容完全复制到工作演示文稿中?

如果没有任何进展,我很抱歉,这篇文章是重新发布的。提前谢谢。

3 个答案:

答案 0 :(得分:1)

库的回购中有一个issue,其中包含一些代码可以执行此操作,但是很粗糙,它不适用于所有情况。

答案 1 :(得分:0)

from pptx.parts.chart import ChartPart
from pptx.parts.embeddedpackage import EmbeddedXlsxPart
from pptx import Presentation
import copy

def _get_blank_slide_layout(pres):
     layout_items_count = [len(layout.placeholders) for layout in pres.slide_layouts]
     min_items = min(layout_items_count)
     blank_layout_id = layout_items_count.index(min_items)
     return pres.slide_layouts[blank_layout_id]
def move_slide(pres1, pres, index):
    """Duplicate the slide with the given index in pres1 and "moves" it into pres.
    Adds slide to the end of the presentation"""
    source = pres1.slides[index]
    blank_slide_layout = _get_blank_slide_layout(pres)
    dest = pres.slides.add_slide(blank_slide_layout)

    for shape in source.shapes:
        newel = copy.deepcopy(shape.element)
        dest.shapes._spTree.insert_element_before(newel, 'p:extLst')

    for key, value in source.part.rels.items():
        # Make sure we don't copy a notesSlide relation as that won't exist
        if "notesSlide" not in value.reltype:
            target = value._target
            # if the relationship was a chart, we need to duplicate the embedded chart part and xlsx
            if "chart" in value.reltype:
                partname = target.package.next_partname(
                    ChartPart.partname_template)
                xlsx_blob = target.chart_workbook.xlsx_part.blob
                target = ChartPart(partname, target.content_type,
                               copy.deepcopy(target._element), package=target.package)

                target.chart_workbook.xlsx_part = EmbeddedXlsxPart.new(
                    xlsx_blob, target.package)

            dest.part.rels.add_relationship(value.reltype, target,value.rId)

此功能是对上面引用位置的github注释的更改。它对我来说效果很好,还没有使用图表或其他工具进行过测试。它与网站上发布的内容略有不同,因为原始答案中提到了一个粗糙的示例,并且在演示文稿中有一个更彻底的答案。想通了我的想法,因为花了我一段时间才把它们放在一起。

答案 2 :(得分:-1)

该解决方案主要用于一个例外。当我打开目标演示文稿并将幻灯片复制到目标演示文稿后,收到以下警告:

PowerPoint无法读取xxx.pptx中的某些内容并将其删除。请检查您的演示文稿,看看其余部分是否正常。

演示文稿的其余部分看上去确实不错,并且在保存并重新打开后,警告消失了。您是否知道做到这一点的方法,以致不会出现此警告,或者是否存在使用Python解决该问题的方法(再次保存/关闭?)。