Cómo agregar formas a PowerPoint en Java

Cómo agregar formas a PowerPoint en Java

Aspose.Slides FOSS for Java admite la incorporación de AutoShapes, Tables, Connectors y PictureFrames a las diapositivas de la presentación. Todos los tipos de forma se añaden a través de la colección slide.getShapes().

Guía paso a paso

Paso 1: Añadir la dependencia de Maven

<dependency>
  <groupId>org.aspose.slides.foss</groupId>
  <artifactId>aspose-slides-foss</artifactId>
  <version>1.0.0</version>
</dependency>

Paso 2: Crear una presentación

Siempre use try-with-resources para gestionar los recursos.

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);
}

Paso 3: Agregar una AutoShape

slide.getShapes().addAutoShape(shapeType, x, y, width, height) coloca una forma en la posición y tamaño dados (todos en puntos). Utilice las constantes ShapeType para seleccionar la forma.

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);
}

Paso 4: Añadir una tabla

slide.getShapes().addTable(x, y, colWidths, rowHeights) crea una tabla en la posición especificada. Los anchos de columna y las alturas de fila son matrices de valores en puntos.

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);
}

Paso 5: Añadir un conector

Los conectores enlazan visualmente dos formas. Crea primero las formas, luego agrega un conector y establece sus puntos de conexión de inicio y fin.

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);
}

Los índices de los sitios de conexión se numeran del 0 al 3 para un rectángulo: top=0, left=1, bottom=2, right=3.


Paso 6: Añadir un marco de foto

Incruste una imagen y agréguela a la diapositiva como un PictureFrame. Lea los bytes de la imagen primero, añádalos a la colección de imágenes de la presentación y luego cree el marco.

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);
}

Problemas comunes y soluciones

La forma aparece fuera del área visible de la diapositiva

Las diapositivas son de 720 × 540 puntos por defecto. Los valores de x o y fuera de esos límites colocan la forma fuera de la diapositiva. Mantenga x < 720 y y < 540, y asegúrese de x + width <= 720 y y + height <= 540.

NullPointerException al leer el texto de la forma

addAutoShape() devuelve el objeto shape directamente. Si ves null, verifica que no estés descartando el valor de retorno. También verifica que getTextFrame() no sea nulo antes de leer el texto.

El texto de la celda de la tabla está vacío después de la asignación

El método correcto es .getTextFrame().setText(value). Acceda a las celdas como table.getRows().get(rowIndex).get(colIndex).getTextFrame().setText("value").


Preguntas frecuentes

¿Cuántas formas puedo añadir a una diapositiva?

No hay un límite impuesto por la biblioteca. Los límites prácticos dependen del tamaño del archivo y de la capacidad de renderizado de su visor PPTX de destino.

¿Puedo cambiar la posición de una forma después de agregarla?

Sí. El objeto shape devuelto por addAutoShape() tiene propiedades de posición y tamaño a través de getShapeFrame().

¿Se admiten los gráficos?

No. Los gráficos, SmartArt y los objetos OLE no están implementados en esta edición y generan UnsupportedOperationException.


Ver también

 Español