Как добавить фигуры в PowerPoint на Java

Как добавить фигуры в 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.


См. также

 Русский