如何使用pythonpptx在PowerPoint PPTX模板之间映射布局?

2024-09-24 10:28:18 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是我试图学习的方法:

  • 我工作的公司大约有120多个.pptx文件,这些文件都是几年来使用.potx PowerPoint模板手动创建的
  • 一位图形设计师创建了一个时髦的新模板
  • 我的老板分配给我的任务是将所有120多个甲板从过时的模板转换成新的模板

旧模板有十几个自定义布局,名称如下:标题幻灯片、简介幻灯片、通用流程、空白、比较[…]新模板更新了布局,名称相同(大致相同)。在XML数据中,我确信每个布局都有某种<layout_id>。我希望能够使用Python从旧的演示文稿中提取我需要的内容,并使用这些数据生成新的演示文稿,但要使用新的布局

我已经阅读了python pptx GitHub存储库上的所有交互,并观看了使用现有模板创建新演示文稿的过程。尽管经历了一整天的尝试和许多错误,我只是在学习上做得不够,无法控制这个项目。 很明显,我并不期望有完整的细节,但任何朝着正确方向的推动都会令人难以置信地感激


Tags: 文件数据方法名称模板图形公司布局
1条回答
网友
1楼 · 发布于 2024-09-24 10:28:18

好吧,我想在你面前会有几个挑战来让这项工作发挥作用,因此是一个单一问题/单一答案的地方,所以让我们把它缩小到一个第一个问题,我们可以称之为“使用python PPTX在PPTX模板之间映射布局”。也许值得考虑将问题标题改为类似的内容

当然,你可以在下一步和下一步提出更多有针对性的问题,等等

我对第一个问题的理解是:

For each slide in a source presentation, create a slide in a target presentation using the new-version slide layout that corresponds to the source slide layout.

我倾向于认为这可以简化为这样一个函数:

layout_map = {
    "Title Slide": "Title",
    "Intro Slide": "Introduction",
    "Generic Process": "Process",
    ...
}

def corresponding_slide_layout(slide, new_prs):
    legacy_layout_name = slide.slide_layout.name
    new_name = layout_map.get(legacy_layout_name)
    if new_name is None:
        #  - there's a gap in the mapping  -
        return None
    return new_prs.slide_layouts.get_by_name(new_name)

new_prs = Presentation("my-new-template.pptx")
for slide in prs.slides:
    layout = corresponding_slide_layout(slide, new_prs)
    if layout is None:
        layout = new_prs.slide_layouts[5]  #  - or whatever default  -
    new_slide = new_prs.slides.add_slide(layout)
    #  - then pass to other function you write to do the shape copying  -
    copy_slide_contents(slide, new_slide)

一般要点是,通过name将旧样式布局映射到新样式布局,然后使用该映射为每个目标幻灯片选择布局。这应该是相当可靠的,因为可能会添加一个默认值,其中要么没有清晰的映射,要么用户编辑了原始名称或其他内容

相关问题 更多 >