在 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 指定自定义幻灯片尺寸。支持的尺寸还取决于演示文稿的格式以及打开文件的应用程序。

如何防止具有固定宽高比的形状失真?

对宽度和高度使用相同的缩放比例。为了在新幻灯片尺寸内保留原始布局,请对宽度和高度以及位置均使用宽高比例中较小的那个。这可以保持比例,但可能在某一边留下未使用的空间。