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()
Note
As tabelas requerem tratamento separado: dimensione a largura das colunas e a altura das linhas em vez de atribuir a largura e a altura gerais da tabela. As alturas das linhas podem permanecer maiores que o solicitado se o conteúdo da célula exigir mais espaço.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.