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

Visão geral

Ao mudar o tamanho do slide de uma apresentação, pode ser necessário redimensionar e reposicionar suas formas para se ajustarem às novas dimensões. Este artigo mostra como dimensionar formas manualmente e como lidar com tabelas em slides, mestres e layouts.

Redimensionar formas

Para preservar a posição e o tamanho relativos de cada forma, multiplique suas coordenadas horizontais e a largura pela proporção da nova largura do slide em relação à largura original. Aplique a proporção de altura correspondente às coordenadas verticais e à altura.

O primeiro exemplo carrega uma apresentação cujos slides não contêm tabelas, altera o tamanho do slide para A4 e salva o resultado. Ele usa SlideSize.setSize com SlideSizeScaleType.DoNotScale para que o loop subsequente controle a escala. As proporções são adimensionais; as posições e dimensões das formas são medidas em pontos. Proporções diferentes de largura e altura podem distorcer as formas, e alterar as dimensões de uma forma não escala o tamanho das fontes.

import jpype
import asposeslides

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

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

presentation = Presentation("sample.pptx")
try:
    # Calcular fatores de escala horizontais e verticais independentes.
    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()

O segundo exemplo oferece suporte a tabelas e processa formas em mestres e layouts, bem como em slides individuais, antes de salvar a apresentação redimensionada. Seu utilitário trata cada Table dimensionando a largura das colunas com Column.setWidth e as alturas mínimas das linhas com Row.setMinimalHeight. Em seguida, escala a posição da tabela sem dimensionar separadamente suas dimensões gerais.

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):
            # As dimensões da tabela são controladas pelas larguras das colunas e alturas das linhas.
            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:
    # Calcular fatores de escala horizontais e verticais independentes.
    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()

    # Redimensionar formas definidas em mestres e layouts, bem como em slides individuais.
    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()

Perguntas frequentes

Por que as formas ficam distorcidas ou cortadas após redimensionar um slide?
Se você mudar o tamanho do slide sem dimensionar as formas, elas mantêm suas posições e dimensões originais e podem ficar além do slide. Dimensionar largura e altura por razões diferentes também pode distorcer as formas.

O código fornecido funciona para todos os tipos de forma?
O primeiro exemplo altera os limites das formas diretamente e destina‑se a slides sem tabelas. O segundo exemplo trata as tabelas separadamente. Verifique o layout resultante, especialmente texto e tabelas, pois esses exemplos não dimensionam tamanhos de fonte e o conteúdo da tabela pode limitar as alturas das linhas.

Como redimensionar tabelas ao redimensionar um slide?
Dimensione a largura das colunas pela proporção de largura e as alturas mínimas das linhas pela proporção de altura, depois dimensione a posição da tabela, como mostrado no segundo exemplo.

Esse redimensionamento funciona para slides mestre e slides de layout?
Sim. O segundo exemplo itera através de Presentation.getMasters e dos MasterSlide.getLayoutSlides de cada mestre e aplica a mesma lógica de redimensionamento às suas formas.

Posso alterar a orientação de um slide (retrato/paisagem) junto com o redimensionamento?
Sim. Chame SlideSize.setOrientation após mudar o tamanho do slide e antes de ler as dimensões alvo, para que os fatores de escala reflitam a orientação final.

Existe um limite para o tamanho de slide que eu posso definir?
Você pode especificar dimensões de slide personalizadas com SlideSize.setSize. As dimensões suportadas também dependem do formato da apresentação e do aplicativo usado para abrir o arquivo.

Como evitar que formas com proporção fixa fiquem distorcidas?
Use o mesmo fator de escala para largura e altura. Para encaixar o layout original nas novas dimensões do slide, use a menor das razões de largura e altura para ambas as dimensões e posições. Isso preserva as proporções, mas pode deixar espaço não usado ao longo de uma borda.