Importar presentaciones desde PDF o HTML en Python mediante Java

Introducción

Aspose.Slides para Python a través de Java puede convertir páginas PDF o contenido HTML en diapositivas de PowerPoint sin Microsoft PowerPoint. La clase SlideCollection proporciona addFromPdf y addFromHtml para añadir contenido importado a una presentación.

Para un mayor control sobre la ubicación del HTML, SlideCollection.insertFromHtml puede insertar diapositivas generadas en un índice de la colección o comenzar a rellenar el espacio disponible en una diapositiva existente. El HTML largo se pagina automáticamente en diapositivas adicionales, la fuente puede proporcionarse como una cadena o flujo, y los recursos externos pueden cargarse mediante ExternalResourceResolver con un URI base. La matriz de Slide devuelta identifica las diapositivas afectadas y las recién creadas.

Importar desde PDF

Para convertir un documento PDF a una presentación PowerPoint, importe su contenido en la colección de diapositivas y guarde el resultado como un archivo PPTX.

pdf-to-powerpoint

  1. Cree un nuevo objeto Presentation .
  2. Llame a addFromPdf con la ruta al archivo PDF.
  3. Llame a save con SaveFormat.Pptx para escribir la presentación en un archivo PPTX.

El siguiente ejemplo en Python importa un documento PDF y guarda las diapositivas generadas como una presentación PowerPoint:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation()
try:
    presentation.getSlides().addFromPdf("document.pdf")
    presentation.save("presentation.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

La diapositiva en blanco predeterminada permanece en la presentación porque la importación añade diapositivas. Para conservar solo las páginas importadas, vacíe la colección de diapositivas con SlideCollection.clear antes de importar.

El método addFromPdf devuelve las diapositivas que añade, lo que es útil cuando necesita procesar solo las diapositivas importadas.

Importar desde HTML

Aspose.Slides también puede crear diapositivas a partir de un documento HTML. La fuente puede proporcionarse como texto HTML o como un flujo. Los pasos siguientes utilizan un flujo de archivo:

  1. Cree un nuevo objeto Presentation .
  2. Abra el archivo HTML para lectura y pase el flujo a addFromHtml.
  3. Llame a save con SaveFormat.Pptx para escribir el resultado en un archivo PPTX.

El siguiente ejemplo en Python importa un documento HTML y guarda las diapositivas generadas como una presentación PowerPoint:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat
from java.io import FileInputStream

presentation = Presentation()
try:
    html_stream = FileInputStream("page.html")
    try:
        presentation.getSlides().addFromHtml(html_stream)
    finally:
        html_stream.close()
    presentation.save("presentation.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Insertar contenido HTML

Utilice SlideCollection.insertFromHtml cuando las diapositivas generadas a partir de HTML deban colocarse en una posición específica en lugar de añadirse al final. El índice comienza en cero e identifica la posición donde comienza la importación.

El argumento useSlideWithIndexAsStart controla cómo el importador utiliza esa posición:

  • Cuando es False, el importador crea nuevas diapositivas en el índice especificado y desplaza las diapositivas que siguen.
  • Cuando es True, el importador comienza a colocar el contenido en el espacio disponible de la diapositiva existente en ese índice. Si el HTML no cabe, Aspose.Slides lo pagina automáticamente e inserta diapositivas adicionales inmediatamente después de la diapositiva inicial.

[SlideCollection.insertFromHtml](https://reference.aspose.com/slides/python-java/aspose.slides/slidecollection/#insertFromHtml) devuelve una matriz de objetos Slide . Cuando la inserción comienza en diapositivas nuevas, cada elemento devuelto es recién creado. Cuando se utiliza una diapositiva existente como inicio, la matriz incluye esa diapositiva afectada seguida de cualquier diapositiva nueva de desbordamiento. Puede inspeccionar esta matriz en lugar de calcular el rango afectado a partir del recuento de diapositivas de la presentación.

Insertar HTML como nuevas diapositivas

El siguiente ejemplo proporciona HTML como una cadena e inserta las diapositivas generadas en el índice 1 de la colección. Pasar False deja las diapositivas existentes sin cambios, salvo por desplazarlas para crear espacio.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation()
try:
    layout_slide = presentation.getLayoutSlides().get_Item(0)
    presentation.getSlides().addEmptySlide(layout_slide)
    presentation.getSlides().addEmptySlide(layout_slide)

    insert_index = 1
    html = "<html><body><h1>Quarterly update</h1><p>This content is inserted before the slide that was at index 1.</p></body></html>"
    inserted_slides = presentation.getSlides().insertFromHtml(insert_index, html, False)

    for slide in inserted_slides:
        print("Inserted slide index:", presentation.getSlides().indexOf(slide))

    presentation.save("presentation-with-inserted-html.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Comenzar en una diapositiva existente

El siguiente ejemplo proporciona el HTML a través de un flujo. Mantiene una forma de encabezado en la diapositiva de plantilla existente, comienza la importación debajo del área ocupada y permite que el cuerpo extenso continúe en nuevas diapositivas.

El HTML también contiene una URL de imagen relativa. Un ExternalResourceResolver obtiene el recurso, mientras que el URI base indica al importador cómo resolver images/logo.png. En este ejemplo, se espera que ese archivo esté en html-assets/images/logo.png.

from pathlib import Path

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import ExternalResourceResolver, Presentation, SaveFormat, ShapeType
from java.io import ByteArrayInputStream

presentation = Presentation()
try:
    template_slide = presentation.getSlides().get_Item(0)
    header = template_slide.getShapes().addAutoShape(ShapeType.Rectangle, 20, 20, 680, 60)
    header.getTextFrame().setText("Product roadmap")

    html_parts = ["<html><body><img src='images/logo.png' width='120' height='60'><h2>Roadmap details</h2>"]
    for item_index in range(1, 61):
        html_parts.append(f"<p style='font-size:24pt'>Roadmap item {item_index}: detailed implementation notes.</p>")
    html_parts.append("</body></html>")

    html = "".join(html_parts)
    html_data = html.encode("utf-8")
    resolver = ExternalResourceResolver()
    base_directory = Path("html-assets").resolve()
    base_uri = base_directory.as_uri() + "/"

    html_stream = ByteArrayInputStream(html_data)
    try:
        affected_slides = presentation.getSlides().insertFromHtml(0, html_stream, resolver, base_uri, True)
        for slide in affected_slides:
            print("Affected slide index:", presentation.getSlides().indexOf(slide))
    finally:
        html_stream.close()

    presentation.save("presentation-with-html-overflow.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Preguntas frecuentes

¿Puede Aspose.Slides detectar tablas al importar un PDF?

Sí. Cree un objeto PdfImportOptions , llame a setDetectTables con True y pase las opciones a addFromPdf. La calidad del reconocimiento de tablas depende de la estructura y complejidad del PDF de origen.