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:
- Crear una instancia de la clase Presentation.
- Acceder a la diapositiva correspondiente mediante su índice.
- Añadir una AutoShape rectangular a la diapositiva.
- Acceder al TextFrame de la forma.
- Utilizar el párrafo predeterminado y añadir dos objetos Paragraph más al marco de texto.
- Añadir suficientes objetos Portion para que cada párrafo contenga tres fragmentos. El párrafo predeterminado ya contiene un fragmento vacío.
- Establecer el texto de cada fragmento.
- Aplicar formatación a nivel de carácter mediante Portion.portion_format.
- 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.
- Crear una instancia de la clase Presentation.
- Acceder a la diapositiva correspondiente mediante su índice.
- Añadir una AutoShape a la diapositiva seleccionada.
- Acceder al TextFrame de la forma.
- Eliminar el párrafo predeterminado del marco de texto.
- Crear un Paragraph para una viñeta de símbolo.
- Establecer BulletFormat.type a BulletType.SYMBOL y especificar el carácter de la viñeta.
- Definir el texto del párrafo, la sangría, el color de la viñeta y la altura de la viñeta.
- Añadir el párrafo al marco de texto.
- Crear un segundo párrafo y establecer BulletFormat.type a BulletType.NUMBERED.
- Configurar el estilo de la viñeta numerada y añadir el párrafo al marco de texto.
- 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.
- Crear una instancia de la clase Presentation.
- Acceder a la diapositiva correspondiente mediante su índice.
- Añadir una AutoShape y acceder a su TextFrame.
- Eliminar el párrafo predeterminado del marco de texto.
- Cargar la imagen de la viñeta y añadirla a la colección de imágenes de la presentación como un PPImage.
- Crear un Paragraph y establecer su texto.
- Establecer BulletFormat.type a BulletType.PICTURE.
- Asignar la imagen mediante BulletFormat.picture y definir la altura de la viñeta.
- Añadir el párrafo al marco de texto.
- 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.
- Crear una Presentation y acceder a una diapositiva.
- Añadir una AutoShape y eliminar el párrafo predeterminado de su marco de texto.
- Crear cuatro párrafos y configurar sus símbolos de viñeta.
- Establecer sus valores de ParagraphFormat.depth a
0,1,2y3. - 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.
- Crear una Presentation y añadir una AutoShape a una diapositiva.
- Eliminar el párrafo predeterminado del marco de texto de la forma.
- Crear tres párrafos numerados.
- Establecer BulletFormat.numbered_bullet_start_with a
2,3y7respectivamente. - 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.
- Crear una instancia de la clase Presentation.
- Acceder a la diapositiva objetivo.
- Añadir una AutoShape rectangular a la diapositiva.
- Acceder al TextFrame de la forma y eliminar el párrafo predeterminado.
- Crear varios párrafos y establecer diferentes valores de ParagraphFormat.indent para ellos.
- Añadir los párrafos al marco de texto.
- 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:

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.
- Crear una instancia de la clase Presentation.
- Acceder a la diapositiva objetivo.
- Añadir una AutoShape rectangular a la diapositiva.
- Acceder al TextFrame de la forma y eliminar el párrafo predeterminado.
- Crear párrafos y establecer un valor positivo de ParagraphFormat.margin_left para cada uno.
- Establecer un valor negativo de ParagraphFormat.indent para crear el efecto de sangría colgante.
- Añadir los párrafos al marco de texto.
- 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:

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:
- Cargar una Presentation y acceder a una diapositiva.
- Añadir una AutoShape y eliminar su párrafo predeterminado.
- Crear dos párrafos y añadir fragmentos de texto a cada uno.
- Crear un PortionFormat para el signo de fin del segundo párrafo.
- Establecer PortionFormat.font_height y PortionFormat.latin_font.
- 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.
- Crear una instancia de la clase Presentation.
- Acceder a una diapositiva y añadir una AutoShape.
- Acceder al TextFrame de la forma y eliminar su párrafo predeterminado.
- Leer el archivo HTML fuente.
- Pasar la cadena HTML a ParagraphCollection.add_from_html.
- 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.
- Crear una instancia de la clase Presentation y cargar la presentación deseada.
- Acceder a la diapositiva y localizar la AutoShape que contiene el texto.
- Acceder al TextFrame de la forma.
- Llamar a ParagraphCollection.export_to_html indicando el índice del párrafo inicial y el número de párrafos a exportar.
- 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 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:

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.