Управление шаблонами слайдов презентации в Python

Обзор

Шаблон слайда определяет общие параметры дизайна для группы слайдов. Он может содержать общие фигуры, логотипы, фоны, стили текста, параметры темы и параметры нижних колонтитулов. В PowerPoint редактирование шаблона слайда — обычный способ поддерживать презентацию в едином стиле без повторения одинакового форматирования на каждом слайде.

Aspose.Slides for Python via .NET поддерживает ту же модель. Презентация может содержать один или несколько шаблонов слайдов, и каждый шаблон слайда может содержать несколько макетных слайдов. Обычные слайды обычно не ссылаются напрямую на шаблон слайда. Вместо этого обычный слайд использует макетный слайд, который принадлежит шаблону слайда.

Иерархия выглядит так:

  1. Шаблон слайда — определяет общий дизайн и тему.
  2. Макетный слайд — определяет конкретное расположение заполнителей и форматирование уровня макета.
  3. Обычный слайд — содержит фактическое содержимое презентации и использует один макетный слайд.

Иерархия шаблонов слайдов, макетных слайдов и обычных слайдов

В Aspose.Slides шаблон слайда представлен классом MasterSlide. Все шаблоны слайдов в презентации доступны через коллекцию Presentation.masters.

Доступ к шаблонам слайдов

В PowerPoint вы можете открыть представление Шаблона слайда через Вид > Шаблон слайда.

Кнопка Шаблон слайда на вкладке Вид в PowerPoint

В Aspose.Slides используйте коллекцию masters для доступа к шаблонам слайдов:

import aspose.slides as slides

with slides.Presentation("presentation.pptx") as presentation:
    first_master_slide = presentation.masters[0]
    master_slide_count = len(presentation.masters)
    first_master_layout_slide_count = len(first_master_slide.layout_slides)

    print("Master slides: " + str(master_slide_count))
    print("Layouts in the first master: " + str(first_master_layout_slide_count))

Вы также можете получить шаблон слайда, используемый обычным слайдом, через его макет:

import aspose.slides as slides

with slides.Presentation("presentation.pptx") as presentation:
    slide = presentation.slides[0]
    layout_slide = slide.layout_slide
    master_slide = layout_slide.master_slide
    master_slide_name = master_slide.name

    print(master_slide_name)

Что содержит шаблон слайда

Шаблон слайда — объект, похожий на слайд. Он наследует общие свойства слайда от класса BaseSlide, поэтому предоставляет многие те же свойства, что и обычные и макетные слайды. Члены, специфичные для шаблона, перечислены на странице API MasterSlide.

Часто используемые члены шаблона слайда:

Член Назначение
background Устанавливает фон на уровне шаблона.
shapes Содержит фигуры, размещённые в шаблоне, такие как логотипы, рамки изображений и общий текст.
layout_slides Содержит макетные слайды, принадлежащие шаблону.
theme_manager Предоставляет доступ к API темы шаблона.
header_footer_manager Управляет верхними и нижними колонтитулами, датой и номерами слайдов для шаблона и его дочерних макетов.
get_depending_slides Возвращает обычные слайды, зависящие от шаблона через их макеты.

Добавление изображения в шаблон слайда

Когда вы добавляете изображение в шаблон слайда, оно появляется на слайдах, использующих макеты из этого шаблона. Это полезно для логотипов, водяных знаков, декоративных полос и других повторяющихся визуальных элементов.

Ниже приведён пример, который добавляет логотип на первый шаблон слайда:

import aspose.slides as slides

with slides.Presentation("presentation.pptx") as presentation:
    master_slide = presentation.masters[0]

    with open("logo.png", "rb") as logo_stream:
        logo_bytes = logo_stream.read()

    logo_image = presentation.images.add_image(logo_bytes)

    master_slide.shapes.add_picture_frame(
        slides.ShapeType.RECTANGLE,
        20,
        20,
        80,
        80,
        logo_image)

    presentation.save("presentation-with-logo.pptx", slides.export.SaveFormat.PPTX)

Дополнительную информацию о кадрах изображений см. в статье Picture Frame.

Работа с заполнителями

Заполнители обычно определяются в макетных слайдах. Шаблон слайда обеспечивает общий стиль и тему, которые эти макеты наследуют, а каждый макет решает, какие заполнители доступны и где они расположены.

В PowerPoint команды заполнителей доступны в представлении Шаблон слайда.

Команда Вставить заполнитель в представлении Шаблон слайда PowerPoint

Чтобы добавить новые заполнители с помощью Aspose.Slides, работайте с макетным слайдом, принадлежащим шаблону:

import aspose.slides as slides

with slides.Presentation("presentation.pptx") as presentation:
    master_slide = presentation.masters[0]
    blank_layout_slide = master_slide.layout_slides.get_by_type(slides.SlideLayoutType.BLANK)

    if blank_layout_slide is None:
        blank_layout_slide = presentation.layout_slides.add(
            master_slide,
            slides.SlideLayoutType.BLANK,
            "Blank")

    blank_layout_slide.placeholder_manager.add_text_placeholder(60, 120, 600, 80)

    presentation.slides.add_empty_slide(blank_layout_slide)
    presentation.save("presentation-with-placeholder.pptx", slides.export.SaveFormat.PPTX)

Можно также форматировать фигуры заполнителей, уже существующие в шаблоне слайда. Ниже пример, который находит заполнитель заголовка и применяет линейную градиентную заливку:

import aspose.pydrawing as draw
import aspose.slides as slides


def find_placeholder(master_slide, placeholder_type):
    for shape in master_slide.shapes:
        if isinstance(shape, slides.AutoShape) and shape.placeholder is not None:
            if shape.placeholder.type == placeholder_type:
                return shape

    return None


with slides.Presentation("presentation.pptx") as presentation:
    master_slide = presentation.masters[0]
    title_placeholder = find_placeholder(master_slide, slides.PlaceholderType.TITLE)

    if title_placeholder is not None:
        red_gradient_color = draw.Color.from_argb(255, 0, 0)
        purple_gradient_color = draw.Color.from_argb(128, 0, 128)

        title_placeholder.fill_format.fill_type = slides.FillType.GRADIENT
        title_placeholder.fill_format.gradient_format.gradient_shape = slides.GradientShape.LINEAR
        title_placeholder.fill_format.gradient_format.gradient_stops.add(0, red_gradient_color)
        title_placeholder.fill_format.gradient_format.gradient_stops.add(255, purple_gradient_color)

    presentation.save("presentation-title-style.pptx", slides.export.SaveFormat.PPTX)

Отформатированный заполнитель заголовка, унаследованный обычными слайдами

Для получения дополнительных вариантов форматирования заполнителей и текста см. статьи Set Prompt Text in Placeholder и Text Formatting.

Изменение фона шаблона слайда

Фон шаблона наследуется макетами и слайдами, которые не переопределяют его. Ниже пример, который задаёт сплошной цвет фона для первого шаблона слайда:

import aspose.pydrawing as draw
import aspose.slides as slides

with slides.Presentation("presentation.pptx") as presentation:
    master_slide = presentation.masters[0]

    master_slide.background.type = slides.BackgroundType.OWN_BACKGROUND
    master_slide.background.fill_format.fill_type = slides.FillType.SOLID
    master_slide.background.fill_format.solid_fill_color.color = draw.Color.forest_green

    presentation.save("presentation-master-background.pptx", slides.export.SaveFormat.PPTX)

См. также темы Presentation Background и Presentation Theme.

Клонирование шаблона слайда в другую презентацию

Используйте метод add_clone класса MasterSlideCollection для копирования шаблона слайда в другую презентацию. Скопированный шаблон затем может использоваться макетами и слайдами в целевой презентации.

import aspose.slides as slides

with slides.Presentation("source.pptx") as source_presentation:
    with slides.Presentation("destination.pptx") as destination_presentation:
        source_master_slide = source_presentation.masters[0]
        cloned_master_slide = destination_presentation.masters.add_clone(source_master_slide)

        destination_presentation.save("destination-with-master.pptx", slides.export.SaveFormat.PPTX)

Если необходимо клонировать обычные слайды вместе с их шаблоном, см. статью Clone Slides.

Добавление нескольких шаблонов слайдов

Презентация может содержать несколько шаблонов слайдов. Это полезно, когда разные разделы требуют различного брендинга, структуры страниц или настроек темы.

Команды PowerPoint для вставки и управления шаблонами слайдов

Ниже пример, который клонирует шаблон по умолчанию, задаёт клону другой фон, получает пустой макет под этим клонированным шаблоном и добавляет новый слайд на основе этого макета:

import aspose.pydrawing as draw
import aspose.slides as slides

with slides.Presentation("presentation.pptx") as presentation:
    default_master_slide = presentation.masters[0]
    section_master_slide = presentation.masters.add_clone(default_master_slide)

    section_master_slide.background.type = slides.BackgroundType.OWN_BACKGROUND
    section_master_slide.background.fill_format.fill_type = slides.FillType.SOLID
    section_master_slide.background.fill_format.solid_fill_color.color = draw.Color.light_steel_blue

    section_blank_layout = section_master_slide.layout_slides.get_by_type(slides.SlideLayoutType.BLANK)

    if section_blank_layout is None:
        section_blank_layout = presentation.layout_slides.add(
            section_master_slide,
            slides.SlideLayoutType.BLANK,
            "Section Blank")

    presentation.slides.add_empty_slide(section_blank_layout)
    presentation.save("presentation-with-multiple-masters.pptx", slides.export.SaveFormat.PPTX)

Сравнение шаблонов слайдов

Шаблоны слайдов можно сравнивать с помощью метода equals, унаследованного от класса BaseSlide. Сравнение проверяет структуру и статическое содержимое, такое как фигуры, текст, форматирование, анимацию и другие настройки слайда. Оно не сравнивает уникальные идентификаторы, например ID слайдов, или динамические значения заполнителей, такие как текущая дата.

import aspose.slides as slides

with slides.Presentation("first.pptx") as first_presentation:
    with slides.Presentation("second.pptx") as second_presentation:
        first_presentation_master_count = len(first_presentation.masters)
        second_presentation_master_count = len(second_presentation.masters)

        for first_master_index in range(first_presentation_master_count):
            for second_master_index in range(second_presentation_master_count):
                first_master_slide = first_presentation.masters[first_master_index]
                second_master_slide = second_presentation.masters[second_master_index]
                are_master_slides_equal = first_master_slide.equals(second_master_slide)

                if are_master_slides_equal:
                    print(
                        "first.pptx master #{} equals second.pptx master #{}".format(
                            first_master_index,
                            second_master_index))

Подробности см. в статье Compare Presentation Slides.

Установка представления Шаблон слайда как представления по умолчанию

Используйте свойство last_view объекта ViewProperties презентации, чтобы задать представление, которое PowerPoint открывает первым. Ниже пример, открывающий презентацию в представлении Шаблон слайда:

import aspose.slides as slides

with slides.Presentation("presentation.pptx") as presentation:
    presentation.view_properties.last_view = slides.ViewType.SLIDE_MASTER_VIEW
    presentation.save("presentation-master-view.pptx", slides.export.SaveFormat.PPTX)

Для дополнительных параметров представления см. статью Save Presentation.

Удаление неиспользуемых шаблонов слайдов

В презентациях иногда встречаются шаблоны слайдов, которые больше не используются ни одним обычным слайдом. Удаление неиспользуемых шаблонов может уменьшить размер файла и упростить поддержку шаблонов.

Вызовите remove_unused для удаления неиспользуемых шаблонов из коллекции masters:

import aspose.slides as slides

with slides.Presentation("presentation.pptx") as presentation:
    presentation.masters.remove_unused(True)
    presentation.save("presentation-clean.pptx", slides.export.SaveFormat.PPTX)

Можно также воспользоваться методом низкоуровневого кода remove_unused_master_slides класса Compress:

import aspose.slides as slides

with slides.Presentation("presentation.pptx") as presentation:
    slides.lowcode.Compress.remove_unused_master_slides(presentation)
    presentation.save("presentation-clean.pptx", slides.export.SaveFormat.PPTX)

FAQ

В чём разница между шаблоном слайда и макетным слайдом?

Шаблон слайда определяет общие параметры дизайна, такие как тема, фон, общие фигуры и стили текста. Макетный слайд принадлежит шаблону и задаёт конкретное расположение заполнителей. Обычный слайд использует макетный слайд, поэтому наследует как от макета, так и от шаблона.

Может ли одна презентация содержать несколько шаблонов слайдов?

Да. Презентация может содержать несколько шаблонов слайдов. Используйте несколько шаблонов, когда разные разделы требуют разных визуальных систем или брендинга.

Куда следует добавлять заполнители: в шаблон слайда или в макетный слайд?

В большинстве случаев заполнители добавляют в макетные слайды. Общие визуальные элементы и общее форматирование помещайте в шаблон слайда, а заполнители контента — в макеты, которые будут использовать обычные слайды.

Можно ли удалить шаблон слайда, который всё ещё используется?

Нет. Шаблон слайда, имеющий зависимые слайды, нельзя безопасно удалить напрямую. Сначала переместите эти слайды в макеты другого шаблона или используйте метод очистки неиспользуемых шаблонов, который удаляет только те шаблоны, которые действительно не задействованы.