Redimensionar formas em slides de apresentação em Python via Java

Visão geral

Uma das perguntas mais comuns dos clientes do Aspose.Slides para Python via Java é como redimensionar formas de modo que, ao mudar o tamanho do slide, os dados não sejam cortados. Este breve artigo técnico mostra como fazer isso.

Redimensionar formas

Para evitar que as formas fiquem desalinhadas quando o tamanho do slide mudar, atualize a posição e as dimensões de cada forma para que se ajustem ao novo layout do slide.

import jpype
import asposeslides

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

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

# Carregar o arquivo de apresentação.
presentation = Presentation("sample.ppt")
try:
    # Obter o tamanho original do slide.
    current_height = presentation.getSlideSize().getSize().getHeight()
    current_width = presentation.getSlideSize().getSize().getWidth()

    # Alterar o tamanho do slide sem escalar as formas existentes.
    presentation.getSlideSize().setSize(SlideSizeType.A4Paper, SlideSizeScaleType.DoNotScale)

    # Obter o novo tamanho do slide.
    new_height = presentation.getSlideSize().getSize().getHeight()
    new_width = presentation.getSlideSize().getSize().getWidth()

    height_ratio = new_height / current_height
    width_ratio = new_width / current_width

    # Redimensionar e reposicionar formas em cada slide.
    for slide in presentation.getSlides():
        for shape in slide.getShapes():

            # Escalar o tamanho da forma.
            shape.setHeight(shape.getHeight() * height_ratio)
            shape.setWidth(shape.getWidth() * width_ratio)

            # Escalar a posição da forma.
            shape.setY(shape.getY() * height_ratio)
            shape.setX(shape.getX() * width_ratio)

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

O código acima altera apenas as formas nos slides. Slides mestres e slides de layout mantêm suas próprias formas, portanto redimensione‑as também quando desejar que toda a apresentação siga o novo tamanho do slide:

import jpype
import asposeslides

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

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

presentation = Presentation("sample.pptx")
try:
    # Obter o tamanho original do slide.
    current_height = presentation.getSlideSize().getSize().getHeight()
    current_width = presentation.getSlideSize().getSize().getWidth()

    # Alterar o tamanho do slide sem escalar as formas existentes.
    presentation.getSlideSize().setSize(SlideSizeType.A4Paper, SlideSizeScaleType.DoNotScale)
    # presentation.getSlideSize().setOrientation(SlideOrientation.Portrait)

    # Obter o novo tamanho do slide.
    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():
            # Escalar o tamanho da forma.
            shape.setHeight(shape.getHeight() * height_ratio)
            shape.setWidth(shape.getWidth() * width_ratio)

            # Escalar a posição da forma.
            shape.setY(shape.getY() * height_ratio)
            shape.setX(shape.getX() * width_ratio)

        for layout_slide in master.getLayoutSlides():
            for shape in layout_slide.getShapes():
                # Escalar o tamanho da forma.
                shape.setHeight(shape.getHeight() * height_ratio)
                shape.setWidth(shape.getWidth() * width_ratio)

                # Escalar a posição da forma.
                shape.setY(shape.getY() * height_ratio)
                shape.setX(shape.getX() * width_ratio)

    for slide in presentation.getSlides():
        for shape in slide.getShapes():
            # Escalar o tamanho da forma.
            shape.setHeight(shape.getHeight() * height_ratio)
            shape.setWidth(shape.getWidth() * width_ratio)

            # Escalar a posição da forma.
            shape.setY(shape.getY() * height_ratio)
            shape.setX(shape.getX() * width_ratio)

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

Perguntas frequentes

Por que as formas ficam distorcidas ou cortadas após redimensionar um slide?

Ao redimensionar um slide, as formas mantêm sua posição e tamanho originais, a menos que a escala seja alterada explicitamente. Isso pode fazer com que o conteúdo seja recortado ou que as formas fiquem desalinhadas.

O código fornecido funciona para todos os tipos de forma?

Sim. Definir a altura e a largura funciona para caixas de texto, imagens, gráficos e tabelas igualmente.

Como redimensionar tabelas ao redimensionar um slide?

Redimensione a própria forma da tabela, exatamente como qualquer outra forma. Suas linhas e colunas são ajustadas proporcionalmente, portanto não as redimensione novamente depois.

Esse redimensionamento funciona para slides mestres e slides de layout?

Sim, mas você também deve percorrer Presentation.getMasters e Presentation.getLayoutSlides e aplicar a mesma lógica de escala às suas formas para garantir consistência em toda a apresentação.

Posso mudar a orientação de um slide (retrato/paisagem) junto com o redimensionamento?

Sim. Você pode usar SlideSize.setOrientation para mudar a orientação. Certifique‑se de ajustar a lógica de escala adequadamente para preservar o layout.

Existe um limite para o tamanho do slide que eu posso definir?

Aspose.Slides suporta tamanhos personalizados, mas tamanhos muito grandes podem afetar o desempenho ou a compatibilidade com algumas versões do PowerPoint.

Como impedir que formas com proporção fixa fiquem distorcidas?

Você pode verificar o método getAspectRatioLocked da trava da forma antes de escalar. Se estiver travada, ajuste a largura ou a altura proporcionalmente em vez de escalá‑las individualmente.