Управление разделами слайдов в презентациях с помощью Python

Введение

Разделы организуют последовательные слайды в именованные группы, не изменяя содержимое слайдов. С помощью Aspose.Slides for Python via .NET вы можете создавать, переупорядочивать, переименовывать, просматривать и удалять разделы через свойство Presentation.sections.

РазделыEspecially полезны, когда:

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

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

Создание и управление разделами

Используйте SectionCollection.add_section для создания раздела, указывая его имя и стартовый слайд. Aspose.Slides определяет, какие слайды принадлежат разделу, исходя из текущей структуры разделов презентации.

Тот же SectionCollection также позволяет:

Следующий пример создаёт два раздела, перемещает один из них, удаляет его вместе с слайдами и добавляет пустой раздел:

import aspose.slides as slides

with slides.Presentation() as presentation:
    title_slide = presentation.slides[0]
    presentation.slides.add_empty_slide(presentation.layout_slides[0])
    results_slide = presentation.slides.add_empty_slide(presentation.layout_slides[0])
    presentation.slides.add_empty_slide(presentation.layout_slides[0])

    presentation.sections.add_section("Introduction", title_slide)
    results_section = presentation.sections.add_section("Results", results_slide)

    presentation.sections.reorder_section_with_slides(results_section, 0)
    presentation.sections.remove_section_with_slides(results_section)
    presentation.sections.append_empty_section("Appendix")

После этих операций презентация содержит раздел Introduction со своими слайдами и пустой раздел Appendix. Раздел Results и его слайды были удалены.

Переименование разделов

Чтобы переименовать раздел, задайте его свойство Section.name. Слайды раздела и его позиция остаются без изменений.

Следующий пример создаёт раздел и изменяет его имя:

import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]
    section = presentation.sections.add_section("Overview", slide)
    section.name = "Introduction"

Получение слайдов из разделов

Свойство Presentation.sections возвращает SectionCollection, по которой можно итерироваться. Для каждого Section вызовите Section.get_slides_list_of_section чтобы получить слайды, которые в данный момент принадлежат этому разделу. Метод возвращает SectionSlideCollection, которая предоставляет количество, доступ по индексу и возможность итерации.

Следующий пример создаёт два заполненных раздела и один пустой раздел, затем выводит для каждого раздела его name, identifier, starting slide, количество слайдов и номера слайдов. Он использует доступ по индексу для чтения первого слайда и цикл for для обработки каждого слайда. Для пустого раздела возвращаемая коллекция имеет количество ноль, индекс не используется, и итерация не выполняет шагов.

import aspose.slides as slides

with slides.Presentation() as presentation:
    first_slide = presentation.slides[0]
    presentation.slides.add_empty_slide(presentation.layout_slides[0])
    third_slide = presentation.slides.add_empty_slide(presentation.layout_slides[0])

    presentation.sections.add_section("Introduction", first_slide)
    presentation.sections.add_section("Details", third_slide)
    presentation.sections.append_empty_section("Appendix")

    for section in presentation.sections:
        section_slides = section.get_slides_list_of_section()
        starting_slide = "none" if section.started_from_slide is None else str(section.started_from_slide.slide_number)

        print(f"Section: {section.name}")
        print(f"ID: {section.section_id}")
        print(f"Starting slide: {starting_slide}")
        print(f"Slide count: {section_slides.count}")

        if section_slides.count > 0:
            print(f"First slide via index: {section_slides[0].slide_number}")

        print("Slide numbers:", end="")
        for slide in section_slides:
            print(f" {slide.slide_number}", end="")
        print()

Членство в разделе определяется структурой разделов презентации. Не рассчитывайте диапазон раздела вручную, используя Section.started_from_slide, индексы слайдов и стартовый слайд следующего раздела.

Структурные изменения могут изменить как набор слайдов, возвращаемый для раздела, так и их номера. Это включает переупорядочивание слайдов, клонирование слайда в раздел, перемещение раздела вместе с его слайдами, удаление слайдов и удаление разделов. В следующем примере после каждого такого изменения вызывается Section.get_slides_list_of_section вместо сохранения предположений о прежних границах раздела.

import aspose.slides as slides


def print_section_slides(label, section):
    section_slides = section.get_slides_list_of_section()
    print(f"{label} ({section_slides.count} slides):", end="")
    for slide in section_slides:
        print(f" {slide.slide_number}", end="")
    print()


with slides.Presentation() as presentation:
    first_slide = presentation.slides[0]
    presentation.slides.add_empty_slide(presentation.layout_slides[0])
    third_slide = presentation.slides.add_empty_slide(presentation.layout_slides[0])
    presentation.slides.add_empty_slide(presentation.layout_slides[0])
    first_section = presentation.sections.add_section("First", first_slide)
    second_section = presentation.sections.add_section("Second", third_slide)

    print_section_slides("Initially", first_section)

    slides_before_clone = first_section.get_slides_list_of_section()
    presentation.slides.add_clone(slides_before_clone[0], first_section)
    print_section_slides("After cloning into the section", first_section)

    slides_before_reorder = first_section.get_slides_list_of_section()
    first_section_position = slides_before_reorder[0].slide_number - 1
    presentation.slides.reorder(first_section_position, slides_before_reorder[slides_before_reorder.count - 1])
    print_section_slides("After reordering slides", first_section)

    presentation.sections.reorder_section_with_slides(first_section, 1)
    print_section_slides("After moving the section", first_section)

    slides_before_removal = first_section.get_slides_list_of_section()
    presentation.slides.remove(slides_before_removal[0])
    print_section_slides("After removing a slide", first_section)

    presentation.sections.remove_section_with_slides(second_section)
    for section in presentation.sections:
        print_section_slides("Remaining section", section)

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

Формат PPT (PowerPoint 97–2003) не сохраняет метаданные разделов. Используйте этот рабочий процесс с форматом, поддерживающим разделы, например PPTX; преобразование в PPT удаляет структуру разделов, необходимую для последующей итерации.

Вопросы и ответы

Сохраняются ли разделы при сохранении в формат PPT (PowerPoint 97–2003)?

Нет. Формат PPT не поддерживает метаданные разделов, поэтому группировка разделов теряется при сохранении в .ppt.

Можно ли полностью «скрыть» раздел?

Нет. У раздела нет состояния видимости. Чтобы скрыть его содержимое, установите свойство Slide.hidden для каждого слайда в разделе.

Как найти раздел, содержащий конкретный слайд?

Итерируйтесь по Presentation.sections, вызывайте Section.get_slides_list_of_section для каждого раздела и сравнивайте полученные слайды с целевым слайдом. Для непустого раздела Section.started_from_slide возвращает его первый слайд; для пустого раздела он возвращает None.