Python 到 remove/copy .PPT 幻灯片

Python to remove/copy .PPT slides

我有几个 .ppt(MS PowerPoint 幻灯片)文件要处理。他们每个人都包含几十张我想删除的幻灯片。

例如,对于文件 a.ppt,我需要删除幻灯片 [2, 6, 12, 25] 等

库 python-pptx 没有直接“删除”功能,所以我想也许将所需的幻灯片复制到新文件中是一个可能的解决方案。

但是我找不到示例,我不确定如何继续。

旧解决方案于 2016 年 5 月 29 日在 2:23

回答

我用的是键盘模拟工具(不是真正的编程语言,但也需要脚本)。

它能识别我要删除的PPT幻灯片,并选择多个,我可以一次性删除。

希望对有类似需求的人有所帮助。

Michael Berk 于 2020 年 3 月提出的更新解决方案

这是 5 张幻灯片的 PPTX 的可行示例,仅保留第 3 和第 5 张幻灯片。

from pptx import Presentation

def dropSlides(slidesToKeep, prs):
    indexesToRemove = [x for x in range(1, len(prs.slides._sldIdLst)+1) if x not in slidesToKeep]

    for i, slide in enumerate(prs.slides):
        id_dict = {slide.id: [i, slide.rId] for i, slide in enumerate(prs.slides._sldIdLst)}

        if i+1 in indexesToRemove:
            slide_id = slide.slide_id

            prs.part.drop_rel(id_dict[slide_id][1])
            del prs.slides._sldIdLst[id_dict[slide_id][0]]

    return prs

newPrs = dropSlides([3,5], Presentation("C:\Slides 1-5.pptx"))

newPrs.save('c:\Slides_only_3rd_and_5th_kept.pptx')

这是一个功能子集.pptx 演示文稿(不确定.ppt 文件是否有差异)。 Source

def dropSlides(self, slidesToKeep, prs):
    """Return a new presentation that has the correct slide subset.

    Param:
        - slidesToKeep: index of slides to keep from csv (int list)
        - prs: presentation (pptx.presentation)

    Return:
        - presentation with new slide subset

    """

    # get slides to delete
    indexesToRemove = [x for x in range(1, len(prs.slides._sldIdLst)+1) if x not in slidesToKeep]

    # subset report
    for i, slide in enumerate(prs.slides):
        # create slide dict
        id_dict = {slide.id: [i, slide.rId] for i, slide in enumerate(prs.slides._sldIdLst)}

        # iterate thorugh indexes
        if i+1 in indexesToRemove:
            # get slide id
            slide_id = slide.slide_id

            # remove slide
            prs.part.drop_rel(id_dict[slide_id][1])
            del prs.slides._sldIdLst[id_dict[slide_id][0]]

    return prs