Как добавить фигуры в PowerPoint на Java
Aspose.Slides FOSS for Java поддерживает добавление AutoShapes, Tables, Connectors и PictureFrames в слайды презентации. Все типы фигур добавляются через коллекцию slide.getShapes().
Пошаговое руководство
Шаг 1: Добавьте Maven Dependency
<dependency>
<groupId>org.aspose.slides.foss</groupId>
<artifactId>aspose-slides-foss</artifactId>
<version>1.0.0</version>
</dependency>Шаг 2: Создать презентацию
Всегда используйте try-with-resources для управления ресурсами.
import org.aspose.slides.foss.Presentation;
import org.aspose.slides.foss.ISlide;
import org.aspose.slides.foss.IAutoShape;
import org.aspose.slides.foss.IConnector;
import org.aspose.slides.foss.ITable;
import org.aspose.slides.foss.IPPImage;
import org.aspose.slides.foss.ILayoutSlide;
import org.aspose.slides.foss.ShapeType;
import org.aspose.slides.foss.export.SaveFormat;
try (Presentation prs = new Presentation()) {
ISlide slide = prs.getSlides().get(0);
// ... add shapes ...
prs.save("output.pptx", SaveFormat.PPTX);
}Шаг 3: Добавить AutoShape
slide.getShapes().addAutoShape(shapeType, x, y, width, height) размещает форму в заданной позиции и размере (все в пунктах). Используйте константы ShapeType для выбора формы.
import org.aspose.slides.foss.Presentation;
import org.aspose.slides.foss.ISlide;
import org.aspose.slides.foss.IAutoShape;
import org.aspose.slides.foss.IConnector;
import org.aspose.slides.foss.ITable;
import org.aspose.slides.foss.IPPImage;
import org.aspose.slides.foss.ILayoutSlide;
import org.aspose.slides.foss.ShapeType;
import org.aspose.slides.foss.export.SaveFormat;
try (Presentation prs = new Presentation()) {
ISlide slide = prs.getSlides().get(0);
// Rectangle
IAutoShape rect = slide.getShapes().addAutoShape(
ShapeType.RECTANGLE, 50, 50, 300, 100
);
rect.addTextFrame("Rectangle shape");
// Ellipse
IAutoShape ellipse = slide.getShapes().addAutoShape(
ShapeType.ELLIPSE, 400, 50, 200, 100
);
ellipse.addTextFrame("Ellipse shape");
prs.save("autoshapes.pptx", SaveFormat.PPTX);
}Шаг 4: Добавить таблицу
slide.getShapes().addTable(x, y, colWidths, rowHeights) создает таблицу в указанной позиции. Ширины столбцов и высоты строк представляют собой массивы значений в пунктах.
import org.aspose.slides.foss.Presentation;
import org.aspose.slides.foss.ISlide;
import org.aspose.slides.foss.IAutoShape;
import org.aspose.slides.foss.IConnector;
import org.aspose.slides.foss.ITable;
import org.aspose.slides.foss.IPPImage;
import org.aspose.slides.foss.ILayoutSlide;
import org.aspose.slides.foss.ShapeType;
import org.aspose.slides.foss.export.SaveFormat;
try (Presentation prs = new Presentation()) {
ISlide slide = prs.getSlides().get(0);
double[] colWidths = {150.0, 150.0, 150.0};
double[] rowHeights = {40.0, 40.0, 40.0};
ITable table = slide.getShapes().addTable(50, 200, colWidths, rowHeights);
// Set header row text
String[] headers = {"Product", "Units", "Revenue"};
for (int col = 0; col < headers.length; col++) {
table.getRows().get(0).get(col).getTextFrame().setText(headers[col]);
}
// Set data rows
String[][] rows = {
{"Widget A", "120", "$2,400"},
{"Widget B", "85", "$1,700"},
};
for (int row = 0; row < rows.length; row++) {
for (int col = 0; col < rows[row].length; col++) {
table.getRows().get(row + 1).get(col)
.getTextFrame().setText(rows[row][col]);
}
}
prs.save("table.pptx", SaveFormat.PPTX);
}Шаг 5: Добавить соединитель
Коннекторы визуально связывают две фигуры. Сначала создайте фигуры, затем добавьте коннектор и задайте его начальные и конечные точки соединения.
import org.aspose.slides.foss.Presentation;
import org.aspose.slides.foss.ISlide;
import org.aspose.slides.foss.IAutoShape;
import org.aspose.slides.foss.IConnector;
import org.aspose.slides.foss.ITable;
import org.aspose.slides.foss.IPPImage;
import org.aspose.slides.foss.ILayoutSlide;
import org.aspose.slides.foss.ShapeType;
import org.aspose.slides.foss.export.SaveFormat;
try (Presentation prs = new Presentation()) {
ISlide slide = prs.getSlides().get(0);
IAutoShape box1 = slide.getShapes().addAutoShape(
ShapeType.RECTANGLE, 50, 100, 150, 60
);
box1.addTextFrame("Start");
IAutoShape box2 = slide.getShapes().addAutoShape(
ShapeType.RECTANGLE, 350, 100, 150, 60
);
box2.addTextFrame("End");
IConnector conn = slide.getShapes().addConnector(
ShapeType.BENT_CONNECTOR3, 0, 0, 10, 10
);
conn.setStartShapeConnectedTo(box1);
conn.setStartShapeConnectionSiteIndex(3); // right side of box1
conn.setEndShapeConnectedTo(box2);
conn.setEndShapeConnectionSiteIndex(1); // left side of box2
prs.save("connector.pptx", SaveFormat.PPTX);
}Индексы точек подключения нумеруются от 0 до 3 для прямоугольника: верх = 0, левый = 1, низ = 2, правый = 3.
Шаг 6: Добавить рамку для изображения
Вставьте изображение и добавьте его на слайд в виде PictureFrame. Сначала прочитайте байты изображения, добавьте их в коллекцию изображений презентации, затем создайте кадр.
import org.aspose.slides.foss.Presentation;
import org.aspose.slides.foss.ISlide;
import org.aspose.slides.foss.IAutoShape;
import org.aspose.slides.foss.IConnector;
import org.aspose.slides.foss.ITable;
import org.aspose.slides.foss.IPPImage;
import org.aspose.slides.foss.ILayoutSlide;
import org.aspose.slides.foss.ShapeType;
import org.aspose.slides.foss.export.SaveFormat;
import java.nio.file.Files;
import java.nio.file.Paths;
try (Presentation prs = new Presentation()) {
byte[] imageData = Files.readAllBytes(Paths.get("logo.png"));
IPPImage image = prs.getImages().addImage(imageData);
ISlide slide = prs.getSlides().get(0);
slide.getShapes().addPictureFrame(
ShapeType.RECTANGLE, // bounding shape type
50, 50, // x, y in points
200, 150, // width, height in points
image
);
prs.save("with-image.pptx", SaveFormat.PPTX);
}Распространённые проблемы и решения
Фигура находится за пределами видимой области слайда
Слайды по умолчанию имеют размер 720 × 540 пунктов. Значения x или y за пределами этих границ размещают объект за пределами слайда. Сохраните x < 720 и y < 540, и обеспечьте x + width <= 720 и y + height <= 540.
NullPointerException при чтении текста формы
addAutoShape() возвращает объект формы напрямую. Если вы видите null, проверьте, что вы не отбрасываете возвращаемое значение. Также убедитесь, что getTextFrame() не равен null перед чтением текста.
Текст ячейки таблицы пуст после присваивания
Правильный метод — .getTextFrame().setText(value). Доступ к ячейкам — table.getRows().get(rowIndex).get(colIndex).getTextFrame().setText("value").
Часто задаваемые вопросы
Сколько фигур я могу добавить на слайд?
Нет ограничений, накладываемых библиотекой. Практические ограничения зависят от размера файла и возможностей рендеринга вашего целевого просмотрщика PPTX.
Могу ли я изменить позицию фигуры после её добавления?
Да. Объект формы, возвращаемый addAutoShape(), имеет свойства позиции и размера через getShapeFrame().
Поддерживаются ли диаграммы?
Нет. Диаграммы, SmartArt и OLE‑объекты не реализованы в этом издании и вызывают UnsupportedOperationException.