从 PDF 或 HTML 在 Python via Java 中导入演示文稿

简介

Aspose.Slides for Python via Java 可以在没有 Microsoft PowerPoint 的情况下将 PDF 页面或 HTML 内容转换为 PowerPoint 幻灯片。 SlideCollection 类提供 addFromPdfaddFromHtml 用于将导入的内容追加到演示文稿。

若需更精细控制 HTML 的放置位置,可使用 SlideCollection.insertFromHtml 在集合索引处插入生成的幻灯片,或在现有幻灯片上填充可用空间。长 HTML 会自动分页到额外的幻灯片,源可以作为字符串或流提供,外部资源可通过带基 URI 的 ExternalResourceResolver 加载。返回的 Slide 数组标识受影响的以及新创建的幻灯片。

从 PDF 导入

要将 PDF 文档转换为 PowerPoint 演示文稿,请将其内容导入幻灯片集合并将结果保存为 PPTX 文件。

pdf-to-powerpoint

  1. 创建一个新的 Presentation 对象。
  2. 使用指向 PDF 文件的路径调用 addFromPdf
  3. 使用 SaveFormat.Pptx 调用 save 将演示文稿写入 PPTX 文件。

以下 Python 示例导入 PDF 文档并将生成的幻灯片保存为 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()

默认的空白幻灯片仍保留在演示文稿中,因为导入会追加幻灯片。若只保留导入的页面,可在导入前使用 SlideCollection.clear 清空幻灯片集合。

addFromPdf 方法返回其添加的幻灯片,这在只需处理导入的幻灯片时非常有用。

从 HTML 导入

Aspose.Slides 还可以从 HTML 文档创建幻灯片。源可以作为 HTML 文本或流提供。以下步骤使用文件流:

  1. 创建一个新的 Presentation 对象。
  2. 打开 HTML 文件进行读取,并将流传递给 addFromHtml
  3. 使用 SaveFormat.Pptx 调用 save 将结果写入 PPTX 文件。

以下 Python 示例导入 HTML 文档并将生成的幻灯片保存为 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()

插入 HTML 内容

当需要将 HTML 生成的幻灯片放置在特定位置而不是追加时,请使用 SlideCollection.insertFromHtml。索引为零基,标识导入开始的位置。

useSlideWithIndexAsStart 参数控制导入器如何使用该位置:

  • False 时,导入器在指定索引处创建新幻灯片并将其后的幻灯片向后移动。
  • True 时,导入器在该索引的现有幻灯片的可用空间中开始放置内容。如果 HTML 内容不适合,Aspose.Slides 会自动分页并在起始幻灯片之后立即插入额外幻灯片。

SlideCollection.insertFromHtml 返回一个 Slide 对象数组。当插入在新幻灯片上开始时,返回的每个项目都是新创建的;当使用现有幻灯片作为起始时,数组包括受影响的幻灯片以及随后任何新产生的溢出幻灯片。您可以检查此数组,而无需根据演示文稿的幻灯片计数计算受影响的范围。

将 HTML 作为新幻灯片插入

以下示例将 HTML 作为字符串提供,并在集合索引 1 处插入生成的幻灯片。传入 False 会保持现有幻灯片不变,只是将它们向后移动以腾出空间。

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()

在现有幻灯片上开始

下一个示例通过流提供 HTML。它保留模板幻灯片上的标题形状,从占用区域下方开始导入,并让长正文继续到新幻灯片。

HTML 还包含相对图像 URL。一个 ExternalResourceResolver 获取该资源,而基 URI 告诉导入器如何解析 images/logo.png。在本例中,该文件预计位于 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()

常见问题

Aspose.Slides 在导入 PDF 时能检测到表格吗?

可以。创建一个 PdfImportOptions 对象,使用 True 调用 setDetectTables,并将该选项传递给 addFromPdf。表格识别的质量取决于源 PDF 的结构和复杂度。