Изменение размеров фигур на слайдах презентации в Python

Обзор

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

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

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

Первый пример загружает презентацию, слайды которой не содержат таблиц, изменяет размер слайда на A4 и сохраняет результат. Он использует SlideSize.set_size с SlideSizeScaleType.DO_NOT_SCALE — так что последующий цикл управляет масштабированием. Коэффициенты безразмерные; позиции и размеры фигур измеряются в пунктах. Разные коэффициенты ширины и высоты могут исказить фигуры, а изменение размеров фигуры не масштабирует размер её шрифта.

import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    # Вычислить независимые горизонтальные и вертикальные коэффициенты масштабирования.
    original_size = presentation.slide_size.size
    presentation.slide_size.set_size(slides.SlideSizeType.A4_PAPER, slides.SlideSizeScaleType.DO_NOT_SCALE)
    target_size = presentation.slide_size.size
    width_ratio = target_size.width / original_size.width
    height_ratio = target_size.height / original_size.height

    for slide in presentation.slides:
        for shape in slide.shapes:
            shape.width *= width_ratio
            shape.height *= height_ratio
            shape.x *= width_ratio
            shape.y *= height_ratio

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

Во втором примере поддерживаются таблицы, и он обрабатывает фигуры на мастер‑слайдах и макетах, а также отдельные слайды, перед сохранением изменённой презентации. Его вспомогательная функция обрабатывает каждую Table путем масштабирования Column.width и Row.minimal_height. Затем она масштабирует позицию таблицы без отдельного масштабирования её общих размеров.

import aspose.slides as slides


def resize_shapes(shapes, width_ratio, height_ratio):
    for shape in shapes:
        if isinstance(shape, slides.Table):
            # Размеры таблицы контролируются ширинами столбцов и высотой строк.
            for column in shape.columns:
                column.width *= width_ratio

            for row in shape.rows:
                row.minimal_height *= height_ratio
        else:
            shape.width *= width_ratio
            shape.height *= height_ratio

        shape.x *= width_ratio
        shape.y *= height_ratio


with slides.Presentation("sample.pptx") as presentation:
    # Вычислить независимые горизонтальные и вертикальные коэффициенты масштабирования.
    original_size = presentation.slide_size.size
    presentation.slide_size.set_size(slides.SlideSizeType.A4_PAPER, slides.SlideSizeScaleType.DO_NOT_SCALE)
    target_size = presentation.slide_size.size
    width_ratio = target_size.width / original_size.width
    height_ratio = target_size.height / original_size.height

    # Изменить размер фигур, определённых на мастерах и макетах, а также на отдельных слайдах.
    for master in presentation.masters:
        resize_shapes(master.shapes, width_ratio, height_ratio)

        for layout_slide in master.layout_slides:
            resize_shapes(layout_slide.shapes, width_ratio, height_ratio)

    for slide in presentation.slides:
        resize_shapes(slide.shapes, width_ratio, height_ratio)

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

Часто задаваемые вопросы

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

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

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

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

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

Масштабируйте ширины столбцов по коэффициенту ширины и минимальные высоты строк по коэффициенту высоты, затем масштабируйте позицию таблицы, как показано во втором примере.

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

Да. Во втором примере происходит перебор Presentation.masters и MasterSlide.layout_slides каждого мастера, и к их фигурам применяется та же логика изменения размера.

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

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

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

Вы можете задать пользовательские размеры слайда с помощью SlideSize.set_size. Поддерживаемые размеры также зависят от формата презентации и приложения, используемого для открытия файла.

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

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