Administrar párrafos de texto de PowerPoint en Python

Visión general

Aspose.Slides for Python via .NET representa el texto como una jerarquía de marcos de texto, párrafos y fragmentos:

  • TextFrame representa el contenedor de texto en una forma y proporciona acceso a su colección de párrafos.
  • Paragraph representa un párrafo en un marco de texto y proporciona acceso a sus fragmentos y a la formatación a nivel de párrafo.
  • Portion representa una ejecución de texto dentro de un párrafo. Cada fragmento puede tener su propio texto y formatación a nivel de carácter.

Por lo tanto, un párrafo puede contener texto con diferentes fuentes, colores, tamaños y demás formataciones mediante el uso de varios fragmentos.

Crear y formatear párrafos

Crear párrafos con varios fragmentos

Los pasos siguientes crean un marco de texto con tres párrafos, cada uno con tres fragmentos:

  1. Crear una instancia de la clase Presentation.
  2. Acceder a la diapositiva correspondiente mediante su índice.
  3. Añadir una AutoShape rectangular a la diapositiva.
  4. Acceder al TextFrame de la forma.
  5. Utilizar el párrafo predeterminado y añadir dos objetos Paragraph más al marco de texto.
  6. Añadir suficientes objetos Portion para que cada párrafo contenga tres fragmentos. El párrafo predeterminado ya contiene un fragmento vacío.
  7. Establecer el texto de cada fragmento.
  8. Aplicar formatación a nivel de carácter mediante Portion.portion_format.
  9. Guardar la presentación modificada.

Este ejemplo en Python implementa los pasos:

import aspose.pydrawing as draw
import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 50, 150, 300, 150)
    text_frame = shape.text_frame

    first_paragraph = text_frame.paragraphs[0]
    first_paragraph.portions.add(slides.Portion())
    first_paragraph.portions.add(slides.Portion())

    second_paragraph = slides.Paragraph()
    second_paragraph.portions.add(slides.Portion())
    second_paragraph.portions.add(slides.Portion())
    second_paragraph.portions.add(slides.Portion())
    text_frame.paragraphs.add(second_paragraph)

    third_paragraph = slides.Paragraph()
    third_paragraph.portions.add(slides.Portion())
    third_paragraph.portions.add(slides.Portion())
    third_paragraph.portions.add(slides.Portion())
    text_frame.paragraphs.add(third_paragraph)

    for paragraph_index in range(text_frame.paragraphs.count):
        paragraph = text_frame.paragraphs[paragraph_index]
        for portion_index in range(paragraph.portions.count):
            portion = paragraph.portions[portion_index]
            portion.text = f"Portion {paragraph_index + 1}.{portion_index + 1}"

            if portion_index == 0:
                portion.portion_format.fill_format.fill_type = slides.FillType.SOLID
                portion.portion_format.fill_format.solid_fill_color.color = draw.Color.red
                portion.portion_format.font_bold = slides.NullableBool.TRUE
                portion.portion_format.font_height = 15
            elif portion_index == 1:
                portion.portion_format.fill_format.fill_type = slides.FillType.SOLID
                portion.portion_format.fill_format.solid_fill_color.color = draw.Color.blue
                portion.portion_format.font_italic = slides.NullableBool.TRUE
                portion.portion_format.font_height = 18

    presentation.save("paragraphs_with_portions.pptx", slides.export.SaveFormat.PPTX)

Crear listas con viñetas y numeradas

Crear una lista con viñetas o numerada

Las viñetas y la numeración facilitan la lectura de elementos relacionados. En Aspose.Slides, la configuración de listas se define mediante BulletFormat.

  1. Crear una instancia de la clase Presentation.
  2. Acceder a la diapositiva correspondiente mediante su índice.
  3. Añadir una AutoShape a la diapositiva seleccionada.
  4. Acceder al TextFrame de la forma.
  5. Eliminar el párrafo predeterminado del marco de texto.
  6. Crear un Paragraph para una viñeta de símbolo.
  7. Establecer BulletFormat.type a BulletType.SYMBOL y especificar el carácter de la viñeta.
  8. Definir el texto del párrafo, la sangría, el color de la viñeta y la altura de la viñeta.
  9. Añadir el párrafo al marco de texto.
  10. Crear un segundo párrafo y establecer BulletFormat.type a BulletType.NUMBERED.
  11. Configurar el estilo de la viñeta numerada y añadir el párrafo al marco de texto.
  12. Guardar la presentación.

Este ejemplo en Python crea una viñeta de símbolo y una viñeta numerada:

import aspose.pydrawing as draw
import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 200, 200, 400, 200)
    text_frame = shape.text_frame
    text_frame.paragraphs.clear()

    symbol_paragraph = slides.Paragraph()
    symbol_paragraph.text = "Welcome to Aspose.Slides"
    symbol_paragraph.paragraph_format.bullet.type = slides.BulletType.SYMBOL
    symbol_paragraph.paragraph_format.bullet.char = chr(0x2022)
    symbol_paragraph.paragraph_format.indent = 25
    symbol_paragraph.paragraph_format.bullet.color.color_type = slides.ColorType.RGB
    symbol_paragraph.paragraph_format.bullet.color.color = draw.Color.black
    symbol_paragraph.paragraph_format.bullet.is_bullet_hard_color = slides.NullableBool.TRUE
    symbol_paragraph.paragraph_format.bullet.height = 100
    text_frame.paragraphs.add(symbol_paragraph)

    numbered_paragraph = slides.Paragraph()
    numbered_paragraph.text = "This is a numbered item"
    numbered_paragraph.paragraph_format.bullet.type = slides.BulletType.NUMBERED
    numbered_paragraph.paragraph_format.bullet.numbered_bullet_style = slides.NumberedBulletStyle.BULLET_CIRCLE_NUM_WD_BLACK_PLAIN
    numbered_paragraph.paragraph_format.indent = 25
    numbered_paragraph.paragraph_format.bullet.color.color_type = slides.ColorType.RGB
    numbered_paragraph.paragraph_format.bullet.color.color = draw.Color.black
    numbered_paragraph.paragraph_format.bullet.is_bullet_hard_color = slides.NullableBool.TRUE
    numbered_paragraph.paragraph_format.bullet.height = 100
    text_frame.paragraphs.add(numbered_paragraph)

    presentation.save("bulleted_and_numbered_list.pptx", slides.export.SaveFormat.PPTX)

Usar viñetas de imagen

Las viñetas de imagen permiten utilizar una imagen personalizada en lugar de un símbolo o número.

  1. Crear una instancia de la clase Presentation.
  2. Acceder a la diapositiva correspondiente mediante su índice.
  3. Añadir una AutoShape y acceder a su TextFrame.
  4. Eliminar el párrafo predeterminado del marco de texto.
  5. Cargar la imagen de la viñeta y añadirla a la colección de imágenes de la presentación como un PPImage.
  6. Crear un Paragraph y establecer su texto.
  7. Establecer BulletFormat.type a BulletType.PICTURE.
  8. Asignar la imagen mediante BulletFormat.picture y definir la altura de la viñeta.
  9. Añadir el párrafo al marco de texto.
  10. Guardar la presentación modificada.

Este ejemplo en Python crea una viñeta de imagen:

import aspose.slides as slides

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

    with slides.Images.from_file("bullets.png") as bullet_image:
        presentation_image = presentation.images.add_image(bullet_image)

    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 200, 200, 400, 200)
    text_frame = shape.text_frame
    text_frame.paragraphs.clear()

    paragraph = slides.Paragraph()
    paragraph.text = "Welcome to Aspose.Slides"
    paragraph.paragraph_format.bullet.type = slides.BulletType.PICTURE
    paragraph.paragraph_format.bullet.picture.image = presentation_image
    paragraph.paragraph_format.bullet.height = 100
    text_frame.paragraphs.add(paragraph)

    presentation.save("picture_bullet.pptx", slides.export.SaveFormat.PPTX)
    presentation.save("picture_bullet.ppt", slides.export.SaveFormat.PPT)

Crear una lista multinivel

Establecer ParagraphFormat.depth para situar los párrafos en diferentes niveles de una lista. El nivel superior tiene una profundidad de 0.

  1. Crear una Presentation y acceder a una diapositiva.
  2. Añadir una AutoShape y eliminar el párrafo predeterminado de su marco de texto.
  3. Crear cuatro párrafos y configurar sus símbolos de viñeta.
  4. Establecer sus valores de ParagraphFormat.depth a 0, 1, 2 y 3.
  5. Añadir los párrafos al marco de texto y guardar la presentación.

Este ejemplo en Python crea una lista con viñetas de cuatro niveles:

import aspose.pydrawing as draw
import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 200, 200, 400, 200)
    text_frame = shape.text_frame
    text_frame.paragraphs.clear()

    first_paragraph = slides.Paragraph()
    first_paragraph.text = "Content"
    first_paragraph.paragraph_format.bullet.type = slides.BulletType.SYMBOL
    first_paragraph.paragraph_format.bullet.char = chr(0x2022)
    first_paragraph.paragraph_format.default_portion_format.fill_format.fill_type = slides.FillType.SOLID
    first_paragraph.paragraph_format.default_portion_format.fill_format.solid_fill_color.color = draw.Color.black
    first_paragraph.paragraph_format.depth = 0

    second_paragraph = slides.Paragraph()
    second_paragraph.text = "Second level"
    second_paragraph.paragraph_format.bullet.type = slides.BulletType.SYMBOL
    second_paragraph.paragraph_format.bullet.char = "-"
    second_paragraph.paragraph_format.default_portion_format.fill_format.fill_type = slides.FillType.SOLID
    second_paragraph.paragraph_format.default_portion_format.fill_format.solid_fill_color.color = draw.Color.black
    second_paragraph.paragraph_format.depth = 1

    third_paragraph = slides.Paragraph()
    third_paragraph.text = "Third level"
    third_paragraph.paragraph_format.bullet.type = slides.BulletType.SYMBOL
    third_paragraph.paragraph_format.bullet.char = chr(0x2022)
    third_paragraph.paragraph_format.default_portion_format.fill_format.fill_type = slides.FillType.SOLID
    third_paragraph.paragraph_format.default_portion_format.fill_format.solid_fill_color.color = draw.Color.black
    third_paragraph.paragraph_format.depth = 2

    fourth_paragraph = slides.Paragraph()
    fourth_paragraph.text = "Fourth level"
    fourth_paragraph.paragraph_format.bullet.type = slides.BulletType.SYMBOL
    fourth_paragraph.paragraph_format.bullet.char = "-"
    fourth_paragraph.paragraph_format.default_portion_format.fill_format.fill_type = slides.FillType.SOLID
    fourth_paragraph.paragraph_format.default_portion_format.fill_format.solid_fill_color.color = draw.Color.black
    fourth_paragraph.paragraph_format.depth = 3

    text_frame.paragraphs.add(first_paragraph)
    text_frame.paragraphs.add(second_paragraph)
    text_frame.paragraphs.add(third_paragraph)
    text_frame.paragraphs.add(fourth_paragraph)

    presentation.save("multilevel_list.pptx", slides.export.SaveFormat.PPTX)

Iniciar los elementos numerados de una lista con valores personalizados

Utilizar BulletFormat.numbered_bullet_start_with para establecer el número inicial que se muestra en un párrafo numerado.

  1. Crear una Presentation y añadir una AutoShape a una diapositiva.
  2. Eliminar el párrafo predeterminado del marco de texto de la forma.
  3. Crear tres párrafos numerados.
  4. Establecer BulletFormat.numbered_bullet_start_with a 2, 3 y 7 respectivamente.
  5. Añadir los párrafos al marco de texto y guardar la presentación.

Este ejemplo en Python asigna un número inicial personalizado a cada párrafo:

import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 200, 200, 400, 200)
    text_frame = shape.text_frame
    text_frame.paragraphs.clear()

    first_paragraph = slides.Paragraph()
    first_paragraph.text = "Start at 2"
    first_paragraph.paragraph_format.bullet.type = slides.BulletType.NUMBERED
    first_paragraph.paragraph_format.bullet.numbered_bullet_start_with = 2
    text_frame.paragraphs.add(first_paragraph)

    second_paragraph = slides.Paragraph()
    second_paragraph.text = "Start at 3"
    second_paragraph.paragraph_format.bullet.type = slides.BulletType.NUMBERED
    second_paragraph.paragraph_format.bullet.numbered_bullet_start_with = 3
    text_frame.paragraphs.add(second_paragraph)

    third_paragraph = slides.Paragraph()
    third_paragraph.text = "Start at 7"
    third_paragraph.paragraph_format.bullet.type = slides.BulletType.NUMBERED
    third_paragraph.paragraph_format.bullet.numbered_bullet_start_with = 7
    text_frame.paragraphs.add(third_paragraph)

    presentation.save("custom_numbered_list.pptx", slides.export.SaveFormat.PPTX)

Controlar la disposición del párrafo y sus propiedades finales

Establecer una sangría de primera línea

Utilizar la propiedad ParagraphFormat.indent para controlar la sangría de la primera línea de un párrafo. Esta propiedad sólo desplaza la primera línea respecto al margen izquierdo del párrafo. Un valor positivo desplaza la primera línea a la derecha, mientras que las líneas restantes permanecen alineadas con el cuerpo del párrafo.

Utilice ParagraphFormat.margin_left cuando necesite mover todo el párrafo. Utilice ParagraphFormat.indent cuando solo necesite mover la primera línea.

El ejemplo a continuación crea varios párrafos y aplica diferentes valores de ParagraphFormat.indent para demostrar cómo la sangría de primera línea afecta la disposición del párrafo.

  1. Crear una instancia de la clase Presentation.
  2. Acceder a la diapositiva objetivo.
  3. Añadir una AutoShape rectangular a la diapositiva.
  4. Acceder al TextFrame de la forma y eliminar el párrafo predeterminado.
  5. Crear varios párrafos y establecer diferentes valores de ParagraphFormat.indent para ellos.
  6. Añadir los párrafos al marco de texto.
  7. Guardar la presentación modificada.

Este código muestra cómo establecer una sangría de párrafo:

import aspose.pydrawing as draw
import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 50, 50, 420, 220)
    shape.fill_format.fill_type = slides.FillType.NO_FILL
    shape.line_format.fill_format.fill_type = slides.FillType.SOLID
    shape.line_format.fill_format.solid_fill_color.color = draw.Color.gray

    text_frame = shape.text_frame
    text_frame.text_frame_format.autofit_type = slides.TextAutofitType.SHAPE
    text_frame.paragraphs.clear()

    first_paragraph = slides.Paragraph()
    first_paragraph.text = "No first-line indent. Wrapped lines start at the same position as the first line."
    first_paragraph.paragraph_format.default_portion_format.fill_format.fill_type = slides.FillType.SOLID
    first_paragraph.paragraph_format.default_portion_format.fill_format.solid_fill_color.color = draw.Color.black
    first_paragraph.paragraph_format.margin_left = 20
    first_paragraph.paragraph_format.indent = 0

    second_paragraph = slides.Paragraph()
    second_paragraph.text = "First-line indent of 20 points. The first line moves to the right, while wrapped lines remain aligned to the paragraph body."
    second_paragraph.paragraph_format.default_portion_format.fill_format.fill_type = slides.FillType.SOLID
    second_paragraph.paragraph_format.default_portion_format.fill_format.solid_fill_color.color = draw.Color.black
    second_paragraph.paragraph_format.margin_left = 20
    second_paragraph.paragraph_format.indent = 20

    third_paragraph = slides.Paragraph()
    third_paragraph.text = "First-line indent of 40 points. This paragraph shows a larger first-line offset to make the effect easier to see."
    third_paragraph.paragraph_format.default_portion_format.fill_format.fill_type = slides.FillType.SOLID
    third_paragraph.paragraph_format.default_portion_format.fill_format.solid_fill_color.color = draw.Color.black
    third_paragraph.paragraph_format.margin_left = 20
    third_paragraph.paragraph_format.indent = 40

    text_frame.paragraphs.add(first_paragraph)
    text_frame.paragraphs.add(second_paragraph)
    text_frame.paragraphs.add(third_paragraph)

    presentation.save("paragraph_indent.pptx", slides.export.SaveFormat.PPTX)

El resultado:

El sangrado de primera línea de los párrafos

Establecer una sangría colgante

Una sangría colgante es una disposición en la que la primera línea comienza a la izquierda de las líneas restantes. En Aspose.Slides, se crea este efecto con la propiedad ParagraphFormat.indent. Establezca indent a un valor negativo para mover la primera línea a la izquierda respecto al cuerpo del párrafo.

En la práctica, ParagraphFormat.margin_left define la posición izquierda del cuerpo del párrafo, y ParagraphFormat.indent define la posición de la primera línea respecto a ese margen. Para crear una sangría colgante, establezca un valor positivo de margin_left y un valor negativo de indent.

Esta formatación es útil para bibliografías, referencias, entradas de glosario y otros párrafos donde las líneas envueltas deben alinearse bajo el cuerpo del párrafo y no bajo el primer carácter de la primera línea.

  1. Crear una instancia de la clase Presentation.
  2. Acceder a la diapositiva objetivo.
  3. Añadir una AutoShape rectangular a la diapositiva.
  4. Acceder al TextFrame de la forma y eliminar el párrafo predeterminado.
  5. Crear párrafos y establecer un valor positivo de ParagraphFormat.margin_left para cada uno.
  6. Establecer un valor negativo de ParagraphFormat.indent para crear el efecto de sangría colgante.
  7. Añadir los párrafos al marco de texto.
  8. Guardar la presentación modificada.

Este código muestra cómo establecer una sangría colgante para un párrafo:

import aspose.pydrawing as draw
import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 50, 50, 420, 220)
    shape.fill_format.fill_type = slides.FillType.NO_FILL
    shape.line_format.fill_format.fill_type = slides.FillType.SOLID
    shape.line_format.fill_format.solid_fill_color.color = draw.Color.gray

    text_frame = shape.text_frame
    text_frame.text_frame_format.autofit_type = slides.TextAutofitType.SHAPE
    text_frame.paragraphs.clear()

    first_paragraph = slides.Paragraph()
    first_paragraph.text = "A hanging indent is created by combining a positive left margin with a negative indent. The first line starts to the left, while wrapped lines align with the paragraph body."
    first_paragraph.paragraph_format.default_portion_format.fill_format.fill_type = slides.FillType.SOLID
    first_paragraph.paragraph_format.default_portion_format.fill_format.solid_fill_color.color = draw.Color.black
    first_paragraph.paragraph_format.margin_left = 40
    first_paragraph.paragraph_format.indent = -20

    second_paragraph = slides.Paragraph()
    second_paragraph.text = "This second example uses a deeper hanging indent so the difference between the first line and the wrapped lines is easier to compare."
    second_paragraph.paragraph_format.default_portion_format.fill_format.fill_type = slides.FillType.SOLID
    second_paragraph.paragraph_format.default_portion_format.fill_format.solid_fill_color.color = draw.Color.black
    second_paragraph.paragraph_format.margin_left = 60
    second_paragraph.paragraph_format.indent = -30

    text_frame.paragraphs.add(first_paragraph)
    text_frame.paragraphs.add(second_paragraph)

    presentation.save("hanging_indent.pptx", slides.export.SaveFormat.PPTX)

El resultado:

La sangría colgante de los párrafos

Establecer propiedades de ejecución al final del párrafo

La propiedad Paragraph.end_paragraph_portion_format controla la formatación del signo de fin de párrafo. El siguiente ejemplo asigna un tamaño de fuente y una fuente latina al signo de fin del segundo párrafo:

  1. Cargar una Presentation y acceder a una diapositiva.
  2. Añadir una AutoShape y eliminar su párrafo predeterminado.
  3. Crear dos párrafos y añadir fragmentos de texto a cada uno.
  4. Crear un PortionFormat para el signo de fin del segundo párrafo.
  5. Establecer PortionFormat.font_height y PortionFormat.latin_font.
  6. Asignar el formato a Paragraph.end_paragraph_portion_format y guardar la presentación.
import aspose.slides as slides

with slides.Presentation("Test.pptx") as presentation:
    slide = presentation.slides[0]
    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 10, 10, 200, 250)
    text_frame = shape.text_frame
    text_frame.paragraphs.clear()

    first_paragraph = slides.Paragraph()
    first_paragraph.portions.add(slides.Portion("Sample text"))

    second_paragraph = slides.Paragraph()
    second_paragraph.portions.add(slides.Portion("Sample text 2"))

    end_paragraph_format = slides.PortionFormat()
    end_paragraph_format.font_height = 48
    end_paragraph_format.latin_font = slides.FontData("Times New Roman")
    second_paragraph.end_paragraph_portion_format = end_paragraph_format

    text_frame.paragraphs.add(first_paragraph)
    text_frame.paragraphs.add(second_paragraph)

    presentation.save("end_paragraph_format.pptx", slides.export.SaveFormat.PPTX)

Contar líneas renderizadas

Para las reglas de párrafo que afectan el ajuste automático y la puntuación al final de línea, consulte Controlar la ruptura de línea y Controlar la puntuación colgante.

Utilice Paragraph.get_lines_count para contar las líneas que ocupa un párrafo después del diseño del texto, incluido el ajuste automático. Esto es útil al comprobar la longitud y disposición del texto en plantillas de presentaciones.

Un párrafo es un elemento de TextFrame.paragraphs, y puede ocupar varias líneas renderizadas. Un salto de línea explícito dentro de un párrafo fuerza una nueva línea sin crear otro párrafo. El ajuste automático genera líneas según el ancho disponible sin insertar saltos de línea explícitos en el texto. Por lo tanto, contar párrafos o caracteres de salto de línea no proporciona el recuento de líneas renderizadas.

El ejemplo siguiente crea una forma de texto, cuenta sus líneas, reduce el ancho de la forma y luego sustituye el texto por una cadena más corta. El ajuste está habilitado y el autofit desactivado para que el ancho de la forma controle el ajuste sin reducir automáticamente el texto ni el tamaño de la forma. Las dimensiones de la forma están en puntos. Finalmente, el ejemplo añade otro párrafo y suma los recuentos de líneas en todo el marco de texto.

import aspose.slides as slides

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

    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 50, 50, 400, 200)
    text_frame = shape.text_frame
    text_frame.text_frame_format.wrap_text = slides.NullableBool.TRUE
    text_frame.text_frame_format.autofit_type = slides.TextAutofitType.NONE

    paragraph = text_frame.paragraphs[0]
    paragraph.paragraph_format.default_portion_format.font_height = 20
    paragraph.text = "This text demonstrates how automatic wrapping changes the number of rendered lines."
    print(f"Original width: {paragraph.get_lines_count()}")

    shape.width = 150
    print(f"Narrower shape: {paragraph.get_lines_count()}")

    paragraph.text = "Short text."
    print(f"Shorter text: {paragraph.get_lines_count()}")

    second_paragraph = slides.Paragraph()
    second_paragraph.text = "Another paragraph."
    second_paragraph.paragraph_format.default_portion_format.font_height = 20
    text_frame.paragraphs.add(second_paragraph)

    total_line_count = 0
    for current_paragraph in text_frame.paragraphs:
        total_line_count += current_paragraph.get_lines_count()
    print(f"Total lines in the text frame: {total_line_count}")

Con este texto y estas dimensiones, estrechar la forma aumenta el número de líneas, mientras que sustituir el texto por la cadena corta lo reduce. Los recuentos exactos pueden variar según la disponibilidad de fuentes y sustituciones, el tamaño de fuente, los márgenes, la sangría, el ajuste y la configuración de autofit. Use las fuentes y la configuración de disposición previstas para el entorno de destino al comprobar una plantilla.

El número de líneas por sí solo no determina si el texto se desborda del contenedor. La altura disponible, la altura de línea, el espaciado entre párrafos y líneas, y el comportamiento de autofit también influyen; incluso una única línea puede superar el ancho disponible cuando el ajuste está desactivado.

Importar y exportar contenido de párrafos

Importar texto HTML en párrafos

Utilice ParagraphCollection.add_from_html para convertir marcado HTML en párrafos y fragmentos dentro de un marco de texto.

  1. Crear una instancia de la clase Presentation.
  2. Acceder a una diapositiva y añadir una AutoShape.
  3. Acceder al TextFrame de la forma y eliminar su párrafo predeterminado.
  4. Leer el archivo HTML fuente.
  5. Pasar la cadena HTML a ParagraphCollection.add_from_html.
  6. Guardar la presentación modificada.

Este ejemplo en Python importa HTML a un marco de texto:

import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]
    shape_width = presentation.slide_size.size.width - 20
    shape_height = presentation.slide_size.size.height - 20
    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 10, 10, shape_width, shape_height)
    shape.fill_format.fill_type = slides.FillType.NO_FILL
    shape.text_frame.paragraphs.clear()

    with open("file.html", "r", encoding="utf-8") as html_stream:
        html = html_stream.read()

    shape.text_frame.paragraphs.add_from_html(html)
    presentation.save("html_text.pptx", slides.export.SaveFormat.PPTX)

Exportar texto de párrafo a HTML

Utilice ParagraphCollection.export_to_html para exportar un rango seleccionado de párrafos como HTML.

  1. Crear una instancia de la clase Presentation y cargar la presentación deseada.
  2. Acceder a la diapositiva y localizar la AutoShape que contiene el texto.
  3. Acceder al TextFrame de la forma.
  4. Llamar a ParagraphCollection.export_to_html indicando el índice del párrafo inicial y el número de párrafos a exportar.
  5. Escribir la cadena HTML devuelta en un archivo.

Este ejemplo en Python exporta todos los párrafos del primer cuadro de texto:

import aspose.slides as slides

with slides.Presentation("ExportingHTMLText.pptx") as presentation:
    shape = presentation.slides[0].shapes[0]

    if isinstance(shape, slides.AutoShape) and shape.text_frame is not None:
        paragraphs = shape.text_frame.paragraphs
        html = paragraphs.export_to_html(0, paragraphs.count, None)
        with open("paragraphs.html", "w", encoding="utf-8") as html_stream:
            html_stream.write(html)
    else:
        print("The first shape is not a text shape.")

Renderizar un párrafo como imagen

Paragraph proporciona el método get_image para renderizar directamente un párrafo individual. El método devuelve un IImage que puede guardarse en un archivo o flujo con IImage.save. No es necesario renderizar la forma contenedora ni recortar manualmente un mapa de bits.

El método get_image puede devolver None si el párrafo no se encuentra en su colección padre, no tiene límites de renderizado válidos o no puede renderizarse. Compruebe el resultado antes de guardarlo y utilice la imagen devuelta como gestor de contexto para liberar sus recursos.

Renderizar un párrafo a escala predeterminada

Supongamos que disponemos de un archivo de presentación llamado sample.pptx con una diapositiva, donde la primera forma es un cuadro de texto que contiene tres párrafos.

El cuadro de texto con tres párrafos

El siguiente ejemplo renderiza el segundo párrafo en una forma de texto normal a escala predeterminada y guarda la imagen devuelta en formato PNG:

import aspose.slides as slides

with slides.Presentation("sample.pptx") as presentation:
    shape = presentation.slides[0].shapes[0]

    if isinstance(shape, slides.AutoShape) and shape.text_frame is not None and shape.text_frame.paragraphs.count > 1:
        paragraph = shape.text_frame.paragraphs[1]
        paragraph_image = paragraph.get_image()

        if paragraph_image is not None:
            with paragraph_image:
                paragraph_image.save("paragraph.png", slides.ImageFormat.PNG)
        else:
            print("The paragraph could not be rendered.")
    else:
        print("The expected text shape or paragraph was not found.")

El resultado:

La imagen del párrafo

Renderizar un párrafo en una celda de tabla con escalado

Passe factores de escala horizontal y vertical a get_image para controlar el tamaño del párrafo renderizado. El siguiente ejemplo crea una tabla, renderiza el párrafo en su primera celda al doble de su ancho y altura predeterminados, y guarda el resultado como una imagen PNG:

import aspose.slides as slides

scale_x = 2
scale_y = 2

with slides.Presentation() as presentation:
    slide = presentation.slides[0]
    table = slide.shapes.add_table(50, 50, [300], [80])
    paragraph = table.rows[0][0].text_frame.paragraphs[0]
    paragraph.text = "Text in a table cell"

    paragraph_image = paragraph.get_image(scale_x, scale_y)
    if paragraph_image is not None:
        with paragraph_image:
            paragraph_image.save("table_paragraph.png", slides.ImageFormat.PNG)
    else:
        print("The paragraph could not be rendered.")

Un factor de escala de 1 mantiene ese eje en su tamaño de píxel predeterminado. Por ejemplo, 2 para ambos factores produce una imagen cuya anchura y altura son aproximadamente el doble de las dimensiones predeterminadas, lo que genera cuatro veces más píxeles. Factores mayores suelen producir texto más nítido para ampliaciones o salidas de alta resolución, pero también aumentan el uso de memoria y el tamaño del archivo. Factores menores que 1 generan imágenes más pequeñas con menos detalle. Use factores iguales para conservar la proporción del párrafo; factores horizontales y verticales diferentes estiran la salida de forma independiente.

Renderizar una forma completa con Shape.get_image sigue siendo útil cuando la salida debe incluir el relleno, borde u otro contexto visual de la forma. Para una imagen únicamente del párrafo, use Paragraph.get_image.

Preguntas frecuentes

¿Puedo desactivar completamente el ajuste de líneas dentro de un marco de texto?

Sí. Establezca TextFrameFormat.wrap_text para desactivar el ajuste y que las líneas no se rompan en los bordes del marco de texto.

¿Cómo puedo obtener los límites exactos en la diapositiva de un párrafo específico?

Utilice Paragraph.get_rect para obtener el rectángulo delimitador del párrafo. Portion.get_rect proporciona los límites de un fragmento individual.

¿Dónde se controla la alineación del párrafo (izquierda, derecha, centrado o justificado)?

ParagraphFormat.alignment es una configuración a nivel de párrafo y se aplica a todo el párrafo independientemente de la formatación de fragmentos individuales.

¿Puedo establecer el idioma de revisión para una parte del párrafo?

Sí. Establezca PortionFormat.language_id para fragmentos individuales, de modo que un párrafo pueda contener texto en varios idiomas.