Zmienianie rozmiaru kształtów na slajdach prezentacji w Javie
Omówienie
Kiedy zmieniasz rozmiar slajdu prezentacji, możesz również potrzebować zmienić rozmiar i pozycję jego kształtów, aby pasowały do nowych wymiarów. Ten artykuł pokazuje, jak ręcznie skalować kształty oraz jak obsługiwać tabele na slajdach, szablonach i układach.
Zmiana rozmiaru kształtów
Aby zachować względną pozycję i rozmiar każdego kształtu, pomnóż jego współrzędne poziome i szerokość przez stosunek nowej szerokości slajdu do pierwotnej szerokości. Zastosuj odpowiedni współczynnik wysokości do jego współrzędnych pionowych i wysokości.
Pierwszy przykład wczytuje prezentację, której slajdy nie zawierają tabel, zmienia rozmiar slajdu na A4 i zapisuje wynik. Używa SlideSize.setSize z SlideSizeScaleType.DoNotScale, aby kolejna pętla kontrolowała skalowanie. Współczynniki są bez jednostek; pozycje i wymiary kształtów mierzone są w punktach. Różne współczynniki szerokości i wysokości mogą zniekształcać kształty, a zmiana wymiarów kształtu nie skaluje rozmiarów czcionek.
import com.aspose.slides.*;
import java.awt.geom.Dimension2D;
Presentation presentation = new Presentation("sample.pptx");
try {
// Oblicz niezależne współczynniki skali poziomej i pionowej.
Dimension2D originalSize = presentation.getSlideSize().getSize();
presentation.getSlideSize().setSize(SlideSizeType.A4Paper, SlideSizeScaleType.DoNotScale);
Dimension2D targetSize = presentation.getSlideSize().getSize();
float widthRatio = (float) (targetSize.getWidth() / originalSize.getWidth());
float heightRatio = (float) (targetSize.getHeight() / originalSize.getHeight());
for (ISlide slide : presentation.getSlides()) {
for (IShape shape : slide.getShapes()) {
shape.setWidth(shape.getWidth() * widthRatio);
shape.setHeight(shape.getHeight() * heightRatio);
shape.setX(shape.getX() * widthRatio);
shape.setY(shape.getY() * heightRatio);
}
}
presentation.save("output.pptx", SaveFormat.Pptx);
}
finally {
presentation.dispose();
}
Note
Tabele wymagają osobnego traktowania: skaluj ich szerokości kolumn i wysokości wierszy zamiast przypisywać ogólną szerokość i wysokość tabeli. Wysokości wierszy mogą pozostać większe niż żądane, jeśli zawartość komórek wymaga więcej miejsca.Drugi przykład obsługuje tabele i przetwarza kształty na szablonach i układach, a także na pojedynczych slajdach przed zapisaniem przeskalowanej prezentacji. Jego pomocnik obsługuje każdy ITable poprzez skalowanie szerokości kolumn za pomocą IColumn.setWidth oraz minimalnych wysokości wierszy za pomocą IRow.setMinimalHeight. Następnie skaluje pozycję tabeli bez oddzielnego skalowania jej ogólnych wymiarów.
import com.aspose.slides.*;
import java.awt.geom.Dimension2D;
class ShapeResizer {
void resizeShapes(IShapeCollection shapes, float widthRatio, float heightRatio) {
for (IShape shape : shapes) {
if (shape instanceof ITable) {
ITable table = (ITable) shape;
// Wymiary tabeli są kontrolowane przez szerokości kolumn i wysokości wierszy.
for (IColumn column : table.getColumns()) {
column.setWidth(column.getWidth() * widthRatio);
}
for (IRow row : table.getRows()) {
row.setMinimalHeight(row.getMinimalHeight() * heightRatio);
}
}
else {
shape.setWidth(shape.getWidth() * widthRatio);
shape.setHeight(shape.getHeight() * heightRatio);
}
shape.setX(shape.getX() * widthRatio);
shape.setY(shape.getY() * heightRatio);
}
}
}
Presentation presentation = new Presentation("sample.pptx");
try {
// Oblicz niezależne współczynniki skali poziomej i pionowej.
Dimension2D originalSize = presentation.getSlideSize().getSize();
presentation.getSlideSize().setSize(SlideSizeType.A4Paper, SlideSizeScaleType.DoNotScale);
Dimension2D targetSize = presentation.getSlideSize().getSize();
float widthRatio = (float) (targetSize.getWidth() / originalSize.getWidth());
float heightRatio = (float) (targetSize.getHeight() / originalSize.getHeight());
ShapeResizer resizer = new ShapeResizer();
// Zmieniaj rozmiar kształtów zdefiniowanych na szablonach i układach oraz na pojedynczych slajdach.
for (IMasterSlide master : presentation.getMasters()) {
resizer.resizeShapes(master.getShapes(), widthRatio, heightRatio);
for (ILayoutSlide layoutSlide : master.getLayoutSlides()) {
resizer.resizeShapes(layoutSlide.getShapes(), widthRatio, heightRatio);
}
}
for (ISlide slide : presentation.getSlides()) {
resizer.resizeShapes(slide.getShapes(), widthRatio, heightRatio);
}
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?
Jeśli zmienisz rozmiar slajdu bez skalowania kształtów, zachowują one pierwotne pozycje i wymiary, co może spowodować wyjście poza obszar slajdu. Skalowanie szerokości i wysokości różnymi współczynnikami może również zniekształcać kształty.
Czy dostarczony kod działa dla wszystkich typów kształtów?
Pierwszy przykład zmienia bezpośrednio granice kształtów i jest przeznaczony dla slajdów bez tabel. Drugi przykład obsługuje tabele osobno. Sprawdź wynikowy układ, szczególnie tekst i tabele, ponieważ te przykłady nie skalują rozmiarów czcionek, a zawartość tabel może ograniczać wysokość wierszy.
Jak zmienić rozmiar tabel przy zmianie rozmiaru slajdu?
Skaluj szerokości kolumn według współczynnika szerokości i minimalne wysokości wierszy według współczynnika wysokości, a następnie skaluj pozycję tabeli, jak pokazano w drugim przykładzie.
Czy to skalowanie działa dla slajdów głównych i układów slajdów?
Tak. Drugi przykład iteruje przez Presentation.getMasters oraz po każdych slajdach głównych IMasterSlide.getLayoutSlides i stosuje tę samą logikę zmiany rozmiaru do ich kształtów.
Czy mogę zmienić orientację slajdu (pionowa/pozioma) wraz ze zmianą rozmiaru?
Tak. Wywołaj SlideSize.setOrientation po zmianie rozmiaru slajdu i przed odczytaniem docelowych wymiarów, aby współczynniki skali odzwierciedlały ostateczną orientację.
Czy istnieje limit rozmiaru slajdu, który mogę ustawić?
Możesz określić niestandardowe wymiary slajdu za pomocą SlideSize.setSize. Obsługiwane wymiary zależą również od formatu prezentacji oraz aplikacji używanej do otwarcia pliku.
Jak mogę zapobiec zniekształceniu kształtów o stałym stosunku proporcji?
Użyj tego samego współczynnika skali dla szerokości i wysokości. Aby dopasować oryginalny układ do nowych wymiarów slajdu, użyj mniejszego z współczynników szerokości i wysokości zarówno dla wymiarów, jak i pozycji. To zachowuje proporcje, ale może pozostawić niewykorzystaną przestrzeń wzdłuż jednej krawędzi.