Как сопоставить макеты между шаблонами PowerPoint PPTX с python -pptx? - PullRequest
1 голос
/ 14 февраля 2020

Вот что я пытаюсь научиться делать:

  • Компания, в которой я работаю, имеет ок. 120 + .pptx файлов, которые были созданы вручную в течение нескольких лет с использованием шаблона .potx PowerPoint
  • Графический дизайнер создал потрясающий новый шаблон
  • Мой босс поручил мне преобразовать все 120+ колоды из устаревшего шаблона в новый

В старом шаблоне было около десятка пользовательских макетов с такими именами, как: Слайд заголовка, Вводный слайд, Generi c Process, Blank, Сравнение [...] Новый шаблон имеет обновленные макеты с такими же именами (примерно). В данных XML я уверен, что для каждого макета есть какой-то <layout_id>. Я надеялся, что смогу работать с Python, чтобы извлечь то, что мне нужно, из старых презентаций и генерировать новые презентации с этими данными, но с новыми макетами.

Я прочитал все взаимодействия в репозитории python -pptx GitHub и посмотрел это видео на YouTube о создании новых презентаций с использованием существующего шаблона. Несмотря на полный день испытаний и много ошибок, я просто недостаточно продвинулся в своем обучении, чтобы контролировать этот проект. Очевидно, я не ожидаю подробностей, но любой толчок в правильном направлении был бы невероятно оценен.

1 Ответ

0 голосов
/ 14 февраля 2020

Что ж, я ожидаю, что перед вами стоит несколько проблем, чтобы получить эту работу, и SO - это место с одним вопросом / одним ответом, поэтому давайте сузим это до первого вопроса, который мы можем назвать «Отображение макетов между шаблонами PPTX с python -pptx». Возможно, стоит подумать об изменении названия вопроса на что-то в этом роде.

Конечно, вы можете задать более сфокусированные вопросы на следующем и следующем шаге, например, c.

Мой Первая проблема заключается в следующем:

Для каждого слайда в презентации source создайте слайд в презентации target , используя слайд новой версии. макет, который соответствует макету исходного слайда.

Я склонен думать, что это сводится к такой функции:

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 , а затем используйте это отображение, чтобы выбрать макет для каждого целевого слайда. Это должно быть довольно надежно с возможным добавлением значения по умолчанию, когда либо нет четкого отображения, либо, возможно, пользователь отредактировал оригинальное имя или что-то в этом роде.

...