Импорт презентаций из PDF или HTML в Python через Java

Введение

Aspose.Slides для Python через Java может преобразовывать страницы PDF или HTML‑контент в слайды PowerPoint без Microsoft PowerPoint. Класс SlideCollection предоставляет методы addFromPdf и addFromHtml для добавления импортированного содержимого в презентацию.

Для более точного контроля размещения HTML можно использовать SlideCollection.insertFromHtml, который вставляет сгенерированные слайды в указанный индекс коллекции или начинает заполнять доступное пространство на существующем слайде. Длинный HTML автоматически разбивается на дополнительные слайды, источник может быть передан как строка или поток, а внешние ресурсы могут загружаться через ExternalResourceResolver с базовым URI. Возвращаемый массив объектов Slide указывает затронутые и вновь созданные слайды.

Импорт из PDF

Чтобы преобразовать PDF‑документ в презентацию PowerPoint, импортируйте его содержимое в коллекцию слайдов и сохраните результат в файл PPTX.

pdf-to-powerpoint

  1. Создайте новый объект Presentation.
  2. Вызовите addFromPdf, указав путь к PDF‑файлу.
  3. Вызовите save с параметром SaveFormat.Pptx, чтобы записать презентацию в файл 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. Вызовите save с параметром SaveFormat.Pptx, чтобы записать результат в файл 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‑контента

Используйте SlideCollection.insertFromHtml, когда слайды, сгенерированные из HTML, должны быть помещены в определённое место вместо добавления в конец. Индекс начинается с нуля и определяет позицию, с которой начинается импорт.

Параметр 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, вызовите setDetectTables со значением True и передайте параметры в addFromPdf. Качество распознавания таблиц зависит от структуры и сложности исходного PDF.