在 Python 中透過 Java 調整簡報投影片的形狀大小

概述

當您變更簡報的投影片尺寸時,可能還需要調整形狀的大小與位置,以符合新的尺寸。本文說明如何手動縮放形狀,以及如何處理投影片、母片與版面的表格。

調整形狀大小

為了保留每個形狀的相對位置與大小,請將其水平座標與寬度乘以新投影片寬度與原始寬度的比例。再將相同的高度比例套用到垂直座標與高度上。

第一個範例會載入投影片中不含表格的簡報,將投影片大小變更為 A4,並儲存結果。它使用SlideSize.setSize 搭配 SlideSizeScaleType.DoNotScale 以便在隨後的迴圈中自行控制縮放。比例值沒有單位;形狀的位置與尺寸以點 (point) 為單位測量。不同的寬度與高度比例可能會扭曲形狀,且變更形狀的尺寸不會同步縮放字型大小。

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()

第二個範例支援表格,並在儲存調整過大小的簡報之前,處理母片、版面以及個別投影片上的形狀。其輔助程式會對每個Table 透過Column.setWidth 縮放欄寬,並以Row.setMinimalHeight 縮放最小列高。之後僅縮放表格的位置,而不會單獨縮放其整體尺寸。

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 來設定自訂的投影片尺寸。支援的尺寸亦取決於簡報的格式以及開啟檔案的應用程式。

如何避免具有固定長寬比的形狀被扭曲?

使用相同的寬高縮放係數。為了將原始版面適配至新投影片尺寸,可同時使用寬度與高度比例中較小的那個作為縮放係數,套用於尺寸與位置。此做法可保留比例,但可能在一側留下未使用的空間。