Импорт презентаций из PDF или HTML в Python через Java
Введение
Aspose.Slides for Python via Java может преобразовывать страницы PDF или содержимое HTML в слайды PowerPoint без Microsoft PowerPoint. Класс SlideCollection предоставляет addFromPdf и addFromHtml для добавления импортированного содержимого в презентацию.
Для более точного контроля размещения HTML метод SlideCollection.insertFromHtml может вставлять сгенерированные слайды в указанный индекс коллекции или начинать заполнять доступное пространство на существующем слайде. Длинный HTML автоматически разбивается на дополнительные слайды, источник может быть передан как строка или поток, а внешние ресурсы могут загружаться через ExternalResourceResolver с базовым URI. Возвращаемый массив Slide идентифицирует затронутые и новосозданные слайды.
Импорт из PDF
Для преобразования PDF‑документа в презентацию PowerPoint импортируйте его содержимое в коллекцию слайдов и сохраните результат в файл PPTX.

- Создайте новый объект Presentation.
- Вызовите addFromPdf с путем к PDF‑файлу.
- Вызовите 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 возвращает добавленные слайды, что удобно, когда нужно обрабатывать только импортированные слайды.
Tip
Попробуйте бесплатное веб‑приложение PDF to PowerPoint, чтобы увидеть этот процесс конвертации в действии.Импорт из HTML
Aspose.Slides также может создавать слайды из HTML‑документа. Источник может быть предоставлен как HTML‑текст или поток. Ниже приведены шаги с использованием файлового потока:
- Создайте новый объект Presentation.
- Откройте HTML‑файл для чтения и передайте поток в addFromHtml.
- Вызовите 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()
Warning
Неограниченный внешнй резолвер ресурсов может читать локальные или сетевые ресурсы, указанные в HTML. Для недоверенного ввода проверяйте и очищайте URL‑адреса ресурсов в соответствии со списком разрешённых схем, каталогов и хостов перед импортом HTML.Часто задаваемые вопросы
Может ли Aspose.Slides обнаруживать таблицы при импорте PDF?
Да. Создайте объект PdfImportOptions, вызовите setDetectTables со значением True и передайте параметры в addFromPdf. Качество распознавания таблиц зависит от структуры и сложности исходного PDF.