使用 Java 的 Python 调整演示文稿幻灯片上的形状大小

概述

当您更改演示文稿的幻灯片大小时,可能还需要调整形状的大小并重新定位,以适应新的尺寸。本文介绍了如何手动缩放形状以及如何处理幻灯片、母版和布局中的表格。

调整形状大小

为了保留每个形状的相对位置和大小,需要将其水平坐标和宽度乘以新幻灯片宽度与原始宽度的比例。将相应的高度比例应用于其垂直坐标和高度。

第一个示例加载一个幻灯片中不包含表格的演示文稿,将幻灯片大小更改为 A4,并保存结果。它使用SlideSize.setSize与SlideSizeScaleType.DoNotScale以便后续循环控制缩放。比例是无单位的;形状的位置和尺寸以点为单位。不同的宽度和高度比例会导致形状失真,并且更改形状的尺寸不会缩放其字体大小。

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, SlideSizeType, SlideSizeScaleType

presentation = Presentation("sample.pptx")
try:
    # 计算独立的水平和垂直缩放因子。
    original_size = presentation.getSlideSize().getSize()
    presentation.getSlideSize().setSize(SlideSizeType.A4Paper, SlideSizeScaleType.DoNotScale)
    target_size = presentation.getSlideSize().getSize()
    width_ratio = target_size.getWidth() / original_size.getWidth()
    height_ratio = target_size.getHeight() / original_size.getHeight()

    for slide in presentation.getSlides():
        for shape in slide.getShapes():
            shape.setWidth(shape.getWidth() * width_ratio)
            shape.setHeight(shape.getHeight() * height_ratio)
            shape.setX(shape.getX() * width_ratio)
            shape.setY(shape.getY() * height_ratio)

    presentation.save("output.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

第二个示例支持表格,并在保存已调整大小的演示文稿之前处理母版、布局以及单个幻灯片上的形状。它的辅助方法通过使用Column.setWidth缩放列宽以及使用Row.setMinimalHeight设置最小行高来处理每个Table。随后,它在不单独缩放整体尺寸的情况下缩放表格的位置。

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, SlideSizeType, SlideSizeScaleType, Table


def resize_shapes(shapes, width_ratio, height_ratio):
    for shape in shapes:
        if isinstance(shape, Table):
            # 表格尺寸由列宽和行高控制。
            for column in shape.getColumns():
                column.setWidth(column.getWidth() * width_ratio)

            for row in shape.getRows():
                row.setMinimalHeight(row.getMinimalHeight() * height_ratio)
        else:
            shape.setWidth(shape.getWidth() * width_ratio)
            shape.setHeight(shape.getHeight() * height_ratio)

        shape.setX(shape.getX() * width_ratio)
        shape.setY(shape.getY() * height_ratio)


presentation = Presentation("sample.pptx")
try:
    # 计算独立的水平和垂直缩放因子。
    original_size = presentation.getSlideSize().getSize()
    presentation.getSlideSize().setSize(SlideSizeType.A4Paper, SlideSizeScaleType.DoNotScale)
    target_size = presentation.getSlideSize().getSize()
    width_ratio = target_size.getWidth() / original_size.getWidth()
    height_ratio = target_size.getHeight() / original_size.getHeight()

    # 调整在母版和布局以及单个幻灯片上定义的形状大小。
    for master in presentation.getMasters():
        resize_shapes(master.getShapes(), width_ratio, height_ratio)

        for layout_slide in master.getLayoutSlides():
            resize_shapes(layout_slide.getShapes(), width_ratio, height_ratio)

    for slide in presentation.getSlides():
        resize_shapes(slide.getShapes(), width_ratio, height_ratio)

    presentation.save("output.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

常见问题

调整幻灯片大小后,形状为何会失真或被截断?

如果在更改幻灯片大小时未对形状进行缩放,它们会保持原始位置和尺寸,可能超出幻灯片范围。使用不同的宽度和高度比例进行缩放也会导致形状失真。

提供的代码是否适用于所有形状类型?

第一个示例直接更改形状边界,适用于没有表格的幻灯片。第二个示例单独处理表格。请检查生成的布局,尤其是文本和表格,因为这些示例不会缩放字体大小,且表格内容可能限制行高。

在调整幻灯片大小时如何调整表格?

按宽度比例缩放列宽,按高度比例缩放最小行高,然后如第二个示例所示缩放表格的位置。

此调整大小操作是否适用于母版幻灯片和布局幻灯片?

是的。第二个示例遍历Presentation.getMasters以及每个母版的MasterSlide.getLayoutSlides,并对它们的形状应用相同的调大小逻辑。

我可以在调整大小的同时更改幻灯片的方向(纵向/横向)吗?

可以。在更改幻灯片大小后、读取目标尺寸前调用SlideSize.setOrientation,以便缩放因子反映最终的方向。

我可以设置的幻灯片尺寸是否有上限?

可以使用SlideSize.setSize指定自定义幻灯片尺寸。支持的尺寸还取决于演示文稿格式以及打开文件的应用程序。

如何防止具有固定宽高比的形状被拉伸变形?

对宽度和高度使用相同的缩放因子。若要在新幻灯片尺寸内保持原始布局,可对两者均使用宽度比和高度比中较小的那个进行缩放。这样可以保留比例,但可能在某一边留下未使用的空间。