Изменение размера фигур в презентациях с Python

Обзор

Один из самых распространённых вопросов от клиентов Aspose.Slides for Python — как изменить размер фигур так, чтобы при изменении размера слайда данные не обрезались. Эта короткая техническая статья показывает, как это сделать.

Изменение размера фигур

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

import aspose.slides as slides

# Загрузить файл презентации.
with slides.Presentation("sample.pptx") as presentation:
    # Получить исходный размер слайда.
    current_height = presentation.slide_size.size.height
    current_width = presentation.slide_size.size.width

    # Изменить размер слайда без масштабирования существующих фигур.
    presentation.slide_size.set_size(slides.SlideSizeType.A4_PAPER, slides.SlideSizeScaleType.DO_NOT_SCALE)

    # Получить новый размер слайда.
    new_height = presentation.slide_size.size.height
    new_width = presentation.slide_size.size.width

    height_ratio = new_height / current_height
    width_ratio = new_width / current_width

    # Изменить размер и переместить фигуры на каждом слайде.
    for slide in presentation.slides:
        for shape in slide.shapes:
            # Масштабировать размер фигуры.
            shape.height = shape.height * height_ratio
            shape.width = shape.width * width_ratio

            # Масштабировать позицию фигуры.
            shape.y = shape.y * height_ratio
            shape.x = shape.x * width_ratio

    presentation.save("output.pptx", slides.export.SaveFormat.PPTX)

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

import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    # Получить исходный размер слайда.
    current_height = presentation.slide_size.size.height
    current_width = presentation.slide_size.size.width

    # Изменить размер слайда без масштабирования существующих фигур.
    presentation.slide_size.set_size(slides.SlideSizeType.A4_PAPER, slides.SlideSizeScaleType.DO_NOT_SCALE)

    # Получить новый размер слайда.
    new_height = presentation.slide_size.size.height
    new_width = presentation.slide_size.size.width

    height_ratio = new_height / current_height
    width_ratio = new_width / current_width

    for master in presentation.masters:
        for shape in master.shapes:
            # Масштабировать размер фигуры.
            shape.height = shape.height * height_ratio
            shape.width = shape.width * width_ratio

            # Масштабировать позицию фигуры.
            shape.y = shape.y * height_ratio
            shape.x = shape.x * width_ratio

        for layout_slide in master.layout_slides:
            for shape in layout_slide.shapes:
                # Масштабировать размер фигуры.
                shape.height = shape.height * height_ratio
                shape.width = shape.width * width_ratio

                # Масштабировать позицию фигуры.
                shape.y = shape.y * height_ratio
                shape.x = shape.x * width_ratio

    for slide in presentation.slides:
        for shape in slide.shapes:
            # Масштабировать размер фигуры.
            shape.height = shape.height * height_ratio
            shape.width = shape.width * width_ratio

            # Масштабировать позицию фигуры.
            shape.y = shape.y * height_ratio
            shape.x = shape.x * width_ratio

            if type(shape) is slides.Table:
                for row in shape.rows:
                    row.minimal_height = row.minimal_height * height_ratio
                for column in shape.columns:
                    column.width = column.width * width_ratio

    presentation.save("output.pptx", slides.export.SaveFormat.PPTX)

ЧаВо

Почему фигуры выглядят искажёнными или обрезанными после изменения размера слайда?

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

Работает ли предоставленный код для всех типов фигур?

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

Как изменить размер таблиц при изменении размера слайда?

Необходимо пройтись по всем строкам и столбцам таблицы и пропорционально изменить их высоту и ширину, как показано во втором примере кода.

Будет ли это изменение размера работать для шаблонных слайдов и слайдов макета?

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

Можно ли изменить ориентацию слайда (портрет/ландшафт) вместе с изменением размера?

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

Есть ли ограничение на размер слайда, который можно установить?

Aspose.Slides поддерживает пользовательские размеры, но очень большие размеры могут влиять на производительность или совместимость с некоторыми версиями PowerPoint.

Как предотвратить искажение фигур с фиксированным соотношением сторон?

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