Změna velikosti tvarů na snímcích prezentace v Pythonu přes Java
Přehled
Jednou z nejčastějších otázek zákazníků Aspose.Slides pro Python via Java je, jak změnit velikost tvarů tak, aby při změně velikosti snímku nedošlo k oříznutí dat. Tento krátký technický článek ukazuje, jak to provést.
Změna velikosti tvarů
Cílem je zabránit tomu, aby se tvary během změny velikosti snímku posunuly. Aktualizujte polohu a rozměry každého tvaru, aby odpovídaly novému rozvržení snímku.
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat, SlideSizeType, SlideSizeScaleType, SlideOrientation
# Načíst soubor prezentace.
presentation = Presentation("sample.ppt")
try:
# Získat původní velikost snímku.
current_height = presentation.getSlideSize().getSize().getHeight()
current_width = presentation.getSlideSize().getSize().getWidth()
# Změnit velikost snímku bez škálování existujících tvarů.
presentation.getSlideSize().setSize(SlideSizeType.A4Paper, SlideSizeScaleType.DoNotScale)
# Získat novou velikost snímku.
new_height = presentation.getSlideSize().getSize().getHeight()
new_width = presentation.getSlideSize().getSize().getWidth()
height_ratio = new_height / current_height
width_ratio = new_width / current_width
# Změnit velikost a pozici tvarů na každém snímku.
for slide in presentation.getSlides():
for shape in slide.getShapes():
# Škálovat velikost tvaru.
shape.setHeight(shape.getHeight() * height_ratio)
shape.setWidth(shape.getWidth() * width_ratio)
# Škálovat pozici tvaru.
shape.setY(shape.getY() * height_ratio)
shape.setX(shape.getX() * width_ratio)
presentation.save("output.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Poznámka
Tabulky nevyžadují žádné zvláštní úpravy: nastavení šířky a výšky tabulky přepočítá její sloupce a řádky proporcionalně, takže další změna výšky řádků a šířky sloupců by aplikovala poměr podruhé.Kód výše mění pouze tvary na snímcích. Předložní snímky a rozložení snímků mají své vlastní tvary, takže je také upravte, pokud chcete, aby celá prezentace odpovídala nové velikosti snímku:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpway.startJVM()
from asposeslides.api import Presentation, SaveFormat, SlideSizeType, SlideSizeScaleType, SlideOrientation
presentation = Presentation("sample.pptx")
try:
# Získat původní velikost snímku.
current_height = presentation.getSlideSize().getSize().getHeight()
current_width = presentation.getSlideSize().getSize().getWidth()
# Změnit velikost snímku bez škálování existujících tvarů.
presentation.getSlideSize().setSize(SlideSizeType.A4Paper, SlideSizeScaleType.DoNotScale)
# presentation.getSlideSize().setOrientation(SlideOrientation.Portrait)
# Získat novou velikost snímku.
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():
# Škálovat velikost tvaru.
shape.setHeight(shape.getHeight() * height_ratio)
shape.setWidth(shape.getWidth() * width_ratio)
# Škálovat pozici tvaru.
shape.setY(shape.getY() * height_ratio)
shape.setX(shape.getX() * width_ratio)
for layout_slide in master.getLayoutSlides():
for shape in layout_slide.getShapes():
# Škálovat velikost tvaru.
shape.setHeight(shape.getHeight() * height_ratio)
shape.setWidth(shape.getWidth() * width_ratio)
# Škálovat pozici tvaru.
shape.setY(shape.getY() * height_ratio)
shape.setX(shape.getX() * width_ratio)
for slide in presentation.getSlides():
for shape in slide.getShapes():
# Škálovat velikost tvaru.
shape.setHeight(shape.getHeight() * height_ratio)
shape.setWidth(shape.getWidth() * width_ratio)
# Škálovat pozici tvaru.
shape.setY(shape.getY() * height_ratio)
shape.setX(shape.getX() * width_ratio)
presentation.save("output.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Často kladené otázky
Proč jsou tvary po změně velikosti snímku deformované nebo oříznuté?
Při změně velikosti snímku si tvary zachovávají původní polohu a velikost, pokud není měřítko explicitně změněno. To může vést k oříznutí obsahu nebo k nesprávnému zarovnání tvarů.
Funguje poskytnutý kód pro všechny typy tvarů?
Ano. Nastavení výšky a šířky funguje stejně pro textová pole, obrázky, grafy i tabulky.
Jak změním velikost tabulek při změně velikosti snímku?
Změňte velikost samotného tvaru tabulky, stejně jako u jakéhokoli jiného tvaru. Její řádky a sloupce se přizpůsobí proporcionalně, takže je pak neškálujte znovu.
Bude tato změna velikosti fungovat i pro předložní snímky a rozložení?
Ano, ale měli byste také projít Presentation.getMasters a Presentation.getLayoutSlides a aplikovat stejnou logiku škálování na jejich tvary, aby byla zajištěna konzistence v celé prezentaci.
Mohu při změně velikosti také změnit orientaci snímku (na výšku/na šířku)?
Ano. K změně orientace můžete použít SlideSize.setOrientation. Ujistěte se, že odpovídajícím způsobem nastavíte logiku škálování, aby byl zachován rozvrh.
Existuje limit velikosti snímku, kterou mohu nastavit?
Aspose.Slides podporuje vlastní velikosti, ale velmi velké rozměry mohou ovlivnit výkon nebo kompatibilitu s některými verzemi PowerPointu.
Jak mohu zabránit deformaci tvarů se zachovaným poměrem stran?
Můžete před škálováním zkontrolovat metodu getAspectRatioLocked uzamčení tvaru. Pokud je uzamčený, upravte šířku nebo výšku proporcionalně místo samostatného škálování.