Cómo agregar formas a PowerPoint en Python

Cómo agregar formas a PowerPoint en Python

Aspose.Slides FOSS for Python admite agregar 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.shapes.

Guía paso a paso

Paso 1: Instalar el paquete

pip install aspose-slides-foss

Verifique la instalación:

import aspose.slides_foss as slides
print("Ready")

Paso 2: Crear una presentación

Siempre utilice Presentation como gestor de contexto.

import aspose.slides_foss as slides
from aspose.slides_foss.export import SaveFormat

with slides.Presentation() as prs:
    slide = prs.slides[0]
    # ... add shapes ...
    prs.save("output.pptx", SaveFormat.PPTX)

Paso 3: Agregar una AutoShape

slide.shapes.add_auto_shape(shape_type, x, y, width, height) coloca una forma en la posición y tamaño dados (todos en puntos). Utiliza las constantes ShapeType para seleccionar la forma.

import aspose.slides_foss as slides
from aspose.slides_foss import ShapeType
from aspose.slides_foss.export import SaveFormat

with slides.Presentation() as prs:
    slide = prs.slides[0]

    # Rectangle
    rect = slide.shapes.add_auto_shape(ShapeType.RECTANGLE, 50, 50, 300, 100)
    rect.add_text_frame("Rectangle shape")

    # Ellipse
    ellipse = slide.shapes.add_auto_shape(ShapeType.ELLIPSE, 400, 50, 200, 100)
    ellipse.add_text_frame("Ellipse shape")

    prs.save("autoshapes.pptx", SaveFormat.PPTX)

Paso 4: Agregar una tabla

slide.shapes.add_table(x, y, col_widths, row_heights) crea una tabla en la posición especificada. Los anchos de columna y las alturas de fila son listas de valores en puntos.

import aspose.slides_foss as slides
from aspose.slides_foss.export import SaveFormat

with slides.Presentation() as prs:
    slide = prs.slides[0]

    col_widths = [150.0, 150.0, 150.0]
    row_heights = [40.0, 40.0, 40.0]
    table = slide.shapes.add_table(50, 200, col_widths, row_heights)

    # Set header row text
    headers = ["Product", "Units", "Revenue"]
    for col, text in enumerate(headers):
        table.rows[0][col].text_frame.text = text

    # Set data rows
    rows = [
        ["Widget A", "120", "$2,400"],
        ["Widget B", "85", "$1,700"],
    ]
    for row_idx, row_data in enumerate(rows):
        for col, text in enumerate(row_data):
            table.rows[row_idx + 1][col].text_frame.text = text

    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 aspose.slides_foss as slides
from aspose.slides_foss import ShapeType
from aspose.slides_foss.export import SaveFormat

with slides.Presentation() as prs:
    slide = prs.slides[0]

    box1 = slide.shapes.add_auto_shape(ShapeType.RECTANGLE, 50, 100, 150, 60)
    box1.add_text_frame("Start")

    box2 = slide.shapes.add_auto_shape(ShapeType.RECTANGLE, 350, 100, 150, 60)
    box2.add_text_frame("End")

    conn = slide.shapes.add_connector(ShapeType.BENT_CONNECTOR3, 0, 0, 10, 10)
    conn.start_shape_connected_to = box1
    conn.start_shape_connection_site_index = 3  # right side of box1
    conn.end_shape_connected_to = box2
    conn.end_shape_connection_site_index = 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: superior=0, izquierda=1, inferior=2, derecha=3.


Paso 6: Añadir un marco de foto

Inserte una imagen y añádala 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, luego cree el marco.

import aspose.slides_foss as slides
from aspose.slides_foss import ShapeType
from aspose.slides_foss.export import SaveFormat

with slides.Presentation() as prs:
    with open("logo.png", "rb") as f:
        image_data = f.read()

    image = prs.images.add_image(image_data)

    slide = prs.slides[0]
    slide.shapes.add_picture_frame(
        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.

AttributeError: 'NoneType' object has no attribute 'text_frame'

add_auto_shape() devuelve el objeto shape directamente. Si ves None, verifica que no estés descartando el valor de retorno.

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

La propiedad correcta es .text_frame.text (no .text directamente en la celda). Acceda a las celdas como table.rows[row_index][col_index].text_frame.text = "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 add_auto_shape() tiene las propiedades x, y, width y height que puedes establecer:

shape.x = 100
shape.y = 200
shape.width = 400
shape.height = 80

¿Puedo establecer el color del contorno (borde) de la forma?

Sí, a través de shape.line_format:

from aspose.slides_foss.drawing import Color
shape.line_format.fill_format.solid_fill_color.color = Color.from_argb(255, 200, 0, 0)

¿Se admiten los gráficos?

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


Ver también

 Español