Zmiana rozmiaru kształtów na slajdach prezentacji w Pythonie via Java

Przegląd

Jednym z najczęściej zadawanych pytań klientów Aspose.Slides for Python via Java jest to, jak zmienić rozmiar kształtów, aby przy zmianie rozmiaru slajdu dane nie były obcinane. Ten krótki artykuł techniczny pokazuje, jak to zrobić.

Zmiana rozmiaru kształtów

Aby zapobiec nieprawidłowemu rozmieszczeniu kształtów przy zmianie rozmiaru slajdu, zaktualizuj pozycję i wymiary każdego kształtu tak, aby pasowały do nowego układu slajdu.

import jpype
import asposeslides

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

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

# Wczytaj plik prezentacji.
presentation = Presentation("sample.ppt")
try:
    # Pobierz oryginalny rozmiar slajdu.
    current_height = presentation.getSlideSize().getSize().getHeight()
    current_width = presentation.getSlideSize().getSize().getWidth()

    # Zmień rozmiar slajdu bez skalowania istniejących kształtów.
    presentation.getSlideSize().setSize(SlideSizeType.A4Paper, SlideSizeScaleType.DoNotScale)

    # Pobierz nowy rozmiar slajdu.
    new_height = presentation.getSlideSize().getSize().getHeight()
    new_width = presentation.getSlideSize().getSize().getWidth()

    height_ratio = new_height / current_height
    width_ratio = new_width / current_width

    # Zmień rozmiar i pozycję kształtów na każdym slajdzie.
    for slide in presentation.getSlides():
        for shape in slide.getShapes():

            # Skaluj rozmiar kształtu.
            shape.setHeight(shape.getHeight() * height_ratio)
            shape.setWidth(shape.getWidth() * width_ratio)

            # Skaluj pozycję kształtu.
            shape.setY(shape.getY() * height_ratio)
            shape.setX(shape.getX() * width_ratio)

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

Powyższy kod zmienia tylko kształty na slajdach. Slajdy master i slajdy układu mają własne kształty, więc skaluj je również, gdy chcesz, aby cała prezentacja dostosowała się do nowego rozmiaru slajdu:

import jpype
import asposeslides

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

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

presentation = Presentation("sample.pptx")
try:
    # Pobierz oryginalny rozmiar slajdu.
    current_height = presentation.getSlideSize().getSize().getHeight()
    current_width = presentation.getSlideSize().getSize().getWidth()

    # Zmień rozmiar slajdu bez skalowania istniejących kształtów.
    presentation.getSlideSize().setSize(SlideSizeType.A4Paper, SlideSizeScaleType.DoNotScale)
    # presentation.getSlideSize().setOrientation(SlideOrientation.Portrait)

    # Pobierz nowy rozmiar slajdu.
    new_height = presentation.getSlideSize().getSize().getHeight()
    new_width = presentation.getSlideSize().getSize().getWidth()

    height_ratio = new_height / current_height
    width_ratio = new_width / current_width

    for master in presentation.getMasters():
        for shape in master.getShapes():
            # Skaluj rozmiar kształtu.
            shape.setHeight(shape.getHeight() * height_ratio)
            shape.setWidth(shape.getWidth() * width_ratio)

            # Skaluj pozycję kształtu.
            shape.setY(shape.getY() * height_ratio)
            shape.setX(shape.getX() * width_ratio)

        for layout_slide in master.getLayoutSlides():
            for shape in layout_slide.getShapes():
                # Skaluj rozmiar kształtu.
                shape.setHeight(shape.getHeight() * height_ratio)
                shape.setWidth(shape.getWidth() * width_ratio)

                # Skaluj pozycję kształtu.
                shape.setY(shape.getY() * height_ratio)
                shape.setX(shape.getX() * width_ratio)

    for slide in presentation.getSlides():
        for shape in slide.getShapes():
            # Skaluj rozmiar kształtu.
            shape.setHeight(shape.getHeight() * height_ratio)
            shape.setWidth(shape.getWidth() * width_ratio)

            # Skaluj pozycję kształtu.
            shape.setY(shape.getY() * height_ratio)
            shape.setX(shape.getX() * width_ratio)

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

Najczęściej zadawane pytania

Dlaczego kształty są zniekształcone lub obcięte po zmianie rozmiaru slajdu?

Podczas zmiany rozmiaru slajdu kształty zachowują pierwotną pozycję i rozmiar, chyba że skalowanie zostanie wyraźnie zmienione. Może to skutkować przycięciem treści lub nieprawidłowym rozmieszczeniem kształtów.

Czy podany kod działa dla wszystkich typów kształtów?

Tak. Ustawianie wysokości i szerokości działa zarówno dla pól tekstowych, obrazów, wykresów, jak i tabel.

Jak zmienić rozmiar tabel przy zmianie rozmiaru slajdu?

Skaluj samą tabelę, dokładnie tak jak każdy inny kształt. Jej wiersze i kolumny skalują się proporcjonalnie, więc nie skaluj ich ponownie później.

Czy to skalowanie działa dla slajdów master i slajdów układu?

Tak, ale powinieneś również przejść przez Presentation.getMasters i Presentation.getLayoutSlides i zastosować tę samą logikę skalowania do ich kształtów, aby zapewnić spójność w całej prezentacji.

Czy mogę zmienić orientację slajdu (pionowo/poziomo) wraz ze skalowaniem?

Tak. Możesz użyć SlideSize.setOrientation, aby zmienić orientację. Upewnij się, że logikę skalowania dostosujesz odpowiednio, aby zachować układ.

Czy istnieje limit rozmiaru slajdu, który mogę ustawić?

Aspose.Slides obsługuje rozmiary niestandardowe, ale bardzo duże rozmiary mogą wpływać na wydajność lub kompatybilność z niektórymi wersjami PowerPointa.

Jak zapobiec zniekształceniu kształtów o stałym stosunku proporcji?

Możesz sprawdzić metodę getAspectRatioLocked blokady kształtu przed skalowaniem. Jeśli jest zablokowany, dostosuj szerokość lub wysokość proporcjonalnie, zamiast skalować je osobno.