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
我有几个 .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