相关文章推荐
阳刚的荔枝  ·  java break outside ...·  2 年前    · 

Python删除/复制.PPT幻灯片

0 人关注

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

例如,对于文件 a.ppt ,我需要删除幻灯片【2、6、12、25】等。

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

然而,我找不到一个例子,不知道该如何进行。

python
powerpoint
Mark K
Mark K
发布于 2016-05-22
2 个回答
Michael Berk
Michael Berk
发布于 2016-05-29
已采纳
0 人赞同

这里有一个对.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
    
布雷克,谢谢你!能否请你举个使用的例子?我使用了 "dropSlides("C:\\sample.pptx", [2,3,5], "C:\\sample (new).pptx")但似乎这不是办法。
当然。 self.dropSlides([1,2,3], Presentation("C:\\sample.pptx")) 。这里, self 不是一个参数,而是对类的引用。另外, prs 需要是Presentation类型的,而不是路径。
谢谢!但它给了我 "NameError: name 'self' is not defined "...
你需要从Python-pptx中导入演示文稿-----。 source
谢谢你的答复。有人可能马上就需要一个可行的解决方案,他们没有多余的时间来等待补救措施。 总之,非常感谢您对这个问题的关注。
Mark K
Mark K
发布于 2016-05-29
0 人赞同

老办法 已于 16 年 5 月 29 日回答 2:23

我用来实现它的方法是通过一个键盘模拟工具(不是真正的编程语言,但也需要脚本)。

它能识别我想删除的PPT幻灯片,并对其进行多重选择,因此我可以一次性删除它们。

希望它能帮助有类似需求的人。

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