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

Обзор

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

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

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

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

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

В Aspose.Slides мастер‑слайд представлен классом MasterSlide. Все мастера‑слайды в презентации доступны через коллекцию Presentation.getMasters, которая представлена классом MasterSlideCollection.

Доступ к мастерам слайдов

В PowerPoint вы можете открыть представление Мастера‑слайда через View > Slide Master.

Команда Slide Master на вкладке View в PowerPoint

В Aspose.Slides используйте коллекцию Presentation.getMasters для доступа к мастерам‑слайдов:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation

presentation = Presentation("presentation.pptx")
try:
    first_master_slide = presentation.getMasters().get_Item(0)
    master_slide_count = presentation.getMasters().size()
    first_master_layout_slide_count = first_master_slide.getLayoutSlides().size()

    print(f"Master slides: {master_slide_count}")
    print(f"Layouts in the first master: {first_master_layout_slide_count}")
finally:
    presentation.dispose()

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

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation

presentation = Presentation("presentation.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    layout_slide = slide.getLayoutSlide()
    master_slide = layout_slide.getMasterSlide()
    master_slide_name = master_slide.getName()

    print(master_slide_name)
finally:
    presentation.dispose()

Что содержит мастер‑слайд

Мастер‑слайд – это объект, похожий на слайд. Он наследуется от BaseSlide, поэтому предоставляет многие из тех же свойств, что и обычные и шаблонные слайды. Специфические для мастера члены перечислены на странице API MasterSlide.

Часто используемые члены мастера‑слайда включают:

Member Purpose
getBackground Задает фон уровня мастера.
getShapes Содержит фигуры, размещённые на мастере, такие как логотипы, рамки изображений и общий текст.
getLayoutSlides Хранит шаблонные слайды, принадлежащие мастеру.
getThemeManager Предоставляет доступ к API темы мастера.
getHeaderFooterManager Управляет колонтитулами, датами и номерами слайдов для мастера и его дочерних шаблонов.
getDependingSlides Возвращает обычные слайды, зависящие от мастера через их шаблоны.

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

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

Следующий пример добавляет логотип к первому мастеру‑слайду:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Images, Presentation, SaveFormat, ShapeType

presentation = Presentation("presentation.pptx")
try:
    master_slide = presentation.getMasters().get_Item(0)
    logo = Images.fromFile("logo.png")
    try:
        logo_image = presentation.getImages().addImage(logo)
        master_slide.getShapes().addPictureFrame(ShapeType.Rectangle, 20, 20, 80, 80, logo_image)
    finally:
        logo.dispose()

    presentation.save("presentation-with-logo.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Подробнее о рамках изображений см. в статье Picture Frame.

Управление видимостью графики мастера

Используйте BaseSlide.setShowMasterShapes, чтобы скрыть унаследованную графику мастера, такую как логотипы или декоративные фигуры, без их удаления из мастера. Передайте False в Slide.setShowMasterShapes на слайде, где нужно скрыть графику, и оставьте True на слайдах, где её следует показать.

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

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import FillType, Presentation, SaveFormat, ShapeType, SlideLayoutType

Color = jpype.JClass("java.awt.Color")

presentation = Presentation()
try:
    master_slide = presentation.getMasters().get_Item(0)
    layout_slide = master_slide.getLayoutSlides().getByType(SlideLayoutType.Blank)
    layout_slide.setShowMasterShapes(True)

    slide_height = jpype.JFloat(presentation.getSlideSize().getSize().getHeight())
    band = master_slide.getShapes().addAutoShape(ShapeType.Rectangle, 0, 0, 60, slide_height)
    band_color = Color(70, 130, 180)
    band.getFillFormat().setFillType(FillType.Solid)
    band.getFillFormat().getSolidFillColor().setColor(band_color)
    band.getLineFormat().getFillFormat().setFillType(FillType.NoFill)

    visible_slide = presentation.getSlides().get_Item(0)
    visible_slide.setLayoutSlide(layout_slide)
    visible_slide.getShapes().clear()

    hidden_slide = presentation.getSlides().addEmptySlide(layout_slide)

    visible_slide.setShowMasterShapes(True)
    hidden_slide.setShowMasterShapes(False)

    presentation.save("master-graphics.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

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

Выбор области применения настройки

Обычный слайд использует свой мастер через Slide.getLayoutSlide и LayoutSlide.getMasterSlide. Установка свойства на отдельном слайде влияет только на этот слайд. Передача False в LayoutSlide.setShowMasterShapes скрывает графику мастера для всех слайдов, использующих данный общий шаблон, даже если их собственная настройка True. Чтобы скрыть графику только на одном слайде, измените свойство слайда и оставьте общий шаблон неизменным.

Настройка не поддерживается как контроль видимости непосредственно на мастере‑слайде. На мастере getShowMasterShapes всегда возвращает False, а передача True в setShowMasterShapes вызывает исключение. Применяйте её к обычному слайду или к шаблону.

Отличие графики от фона

Operation Effect
Hide master graphics Управляет видимостью унаследованных фигур мастера без их удаления или изменения собственных фигур слайда.
Change the slide background fill Меняет цвет, градиент или изображение фона. Графика мастера — отдельные фигуры, которые могут оставаться видимыми поверх этого фона. См. Presentation Background.
Delete a shape from the master Удаляет общую исходную фигуру, поэтому она больше недоступна ни одному слайду, использующему этот мастер.

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

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

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

Команда Insert Placeholder в представлении Мастера‑слайда PowerPoint

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

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat, SlideLayoutType

presentation = Presentation("presentation.pptx")
try:
    master_slide = presentation.getMasters().get_Item(0)
    blank_layout_slide = master_slide.getLayoutSlides().getByType(SlideLayoutType.Blank)

    if blank_layout_slide is None:
        blank_layout_slide = master_slide.getLayoutSlides().add(SlideLayoutType.Blank, "Blank")

    blank_layout_slide.getPlaceholderManager().addTextPlaceholder(60, 120, 600, 80)

    presentation.getSlides().addEmptySlide(blank_layout_slide)
    presentation.save("presentation-with-placeholder.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Вы также можете форматировать уже существующие фигуры‑заполнители на мастере‑слайде. Следующий пример находит заполнитель заголовка и применяет линейный градиент заливки:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import AutoShape, FillType, GradientShape, PlaceholderType, Presentation, SaveFormat

Color = jpype.JClass("java.awt.Color")

presentation = Presentation("presentation.pptx")
try:
    master_slide = presentation.getMasters().get_Item(0)
    title_placeholder = None

    for shape in master_slide.getShapes():
        if isinstance(shape, AutoShape):
            if shape.getPlaceholder() is not None and shape.getPlaceholder().getType() == PlaceholderType.Title:
                title_placeholder = shape
                break

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

        title_placeholder.getFillFormat().setFillType(FillType.Gradient)
        title_placeholder.getFillFormat().getGradientFormat().setGradientShape(GradientShape.Linear)
        title_placeholder.getFillFormat().getGradientFormat().getGradientStops().add(jpype.JFloat(0.0), red_gradient_color)
        title_placeholder.getFillFormat().getGradientFormat().getGradientStops().add(jpype.JFloat(1.0), purple_gradient_color)

    presentation.save("presentation-title-style.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

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

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

Изменение фона мастера‑слайда

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

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import BackgroundType, FillType, Presentation, SaveFormat

Color = jpype.JClass("java.awt.Color")

presentation = Presentation("presentation.pptx")
try:
    master_slide = presentation.getMasters().get_Item(0)
    master_background_color = Color.GREEN

    master_slide.getBackground().setType(BackgroundType.OwnBackground)
    master_slide.getBackground().getFillFormat().setFillType(FillType.Solid)
    master_slide.getBackground().getFillFormat().getSolidFillColor().setColor(master_background_color)

    presentation.save("presentation-master-background.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

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

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

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

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

source_presentation = Presentation("source.pptx")
destination_presentation = Presentation("destination.pptx")
try:
    source_master_slide = source_presentation.getMasters().get_Item(0)
    cloned_master_slide = destination_presentation.getMasters().addClone(source_master_slide)

    destination_presentation.save("destination-with-master.pptx", SaveFormat.Pptx)
finally:
    source_presentation.dispose()
    destination_presentation.dispose()

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

Добавление нескольких мастеров‑слайдов

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

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

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

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import BackgroundType, FillType, Presentation, SaveFormat, SlideLayoutType

Color = jpype.JClass("java.awt.Color")

presentation = Presentation("presentation.pptx")
try:
    default_master_slide = presentation.getMasters().get_Item(0)
    section_master_slide = presentation.getMasters().addClone(default_master_slide)
    section_master_background_color = Color.LIGHT_GRAY

    section_master_slide.getBackground().setType(BackgroundType.OwnBackground)
    section_master_slide.getBackground().getFillFormat().setFillType(FillType.Solid)
    section_master_slide.getBackground().getFillFormat().getSolidFillColor().setColor(section_master_background_color)

    source_blank_layout = default_master_slide.getLayoutSlides().getByType(SlideLayoutType.Blank)
    if source_blank_layout is None:
        source_blank_layout = default_master_slide.getLayoutSlides().get_Item(0)

    section_blank_layout = section_master_slide.getLayoutSlides().addClone(source_blank_layout)

    presentation.getSlides().addEmptySlide(section_blank_layout)
    presentation.save("presentation-with-multiple-masters.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Сравнение мастеров‑слайдов

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

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation

first_presentation = Presentation("first.pptx")
second_presentation = Presentation("second.pptx")
try:
    first_presentation_master_count = first_presentation.getMasters().size()
    second_presentation_master_count = second_presentation.getMasters().size()

    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.getMasters().get_Item(first_master_index)
            second_master_slide = second_presentation.getMasters().get_Item(second_master_index)
            are_master_slides_equal = first_master_slide.equals(second_master_slide)

            if are_master_slides_equal:
                print(f"first.pptx master #{first_master_index} equals second.pptx master #{second_master_index}")
finally:
    first_presentation.dispose()
    second_presentation.dispose()

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

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

Используйте метод setLastView у класса ViewProperties для управления тем представлением, которое PowerPoint открывает первым. Следующий пример открывает презентацию в режиме Мастера‑слайда:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat, ViewType

presentation = Presentation("presentation.pptx")
try:
    presentation.getViewProperties().setLastView(ViewType.SlideMasterView)
    presentation.save("presentation-master-view.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

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

Удаление неиспользуемых мастеров‑слайдов

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

Используйте removeUnused для удаления неиспользуемых мастеров из коллекции Presentation.getMasters:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    presentation.getMasters().removeUnused(True)
    presentation.save("presentation-clean.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Также можно воспользоваться методом low‑code Compress.removeUnusedMasterSlides:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Compress, Presentation, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    Compress.removeUnusedMasterSlides(presentation)
    presentation.save("presentation-clean.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

FAQ

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

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

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

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

Стоит ли добавлять заполнители в мастер‑слайд или в шаблонный слайд?

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

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

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