وارد کردن ارائه‌ها از PDF یا HTML در Python از طریق Java

مقدمه

Aspose.Slides for Python via Java می‌تواند صفحات PDF یا محتوای HTML را بدون نیاز به Microsoft PowerPoint به اسلایدهای PowerPoint تبدیل کند. کلاس SlideCollection متدهای addFromPdf و addFromHtml را برای افزودن محتوای وارد شده به یک ارائه فراهم می‌کند.

برای کنترل بیشتر روی قرارگیری HTML، متد SlideCollection.insertFromHtml می‌تواند اسلایدهای تولید شده را در یک ایندکس از مجموعه درج کند یا فضای موجود در یک اسلاید فعلی را پر کند. HTML طولانی به‌صورت خودکار بر روی اسلایدهای اضافی صفحه‌بندی می‌شود، منبع می‌تواند به‌صورت رشته یا جریان ارائه شود و منابع خارجی می‌توانند از طریق ExternalResourceResolver با یک URI پایه بارگذاری شوند. آرایهٔ Slide برگردانده شده اسلایدهای تحت تاثیر و اسلایدهای جدید ایجاد شده را شناسایی می‌کند.

وارد کردن از PDF

برای تبدیل یک سند PDF به ارائهٔ PowerPoint، محتوای آن را به مجموعه اسلایدها وارد کرده و نتیجه را به‌صورت فایل PPTX ذخیره کنید.

pdf-to-powerpoint

  1. یک شیء جدید از کلاس Presentation ایجاد کنید.
  2. با مسیر فایل PDF، متد addFromPdf را فراخوانی کنید.
  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

هنگامی که اسلایدهای تولید شده توسط HTML باید در موقعیت خاصی قرار گیرند نه اینکه به انتها اضافه شوند، از SlideCollection.insertFromHtml استفاده کنید. ایندکس بصورت صفر‑مبنا است و موقعیتی را که وارد کردن از آن آغاز می‌شود مشخص می‌کند.

آرگومان useSlideWithIndexAsStart نحوهٔ استفادهٔ واردکننده از آن موقعیت را کنترل می‌کند:

  • وقتی مقدار آن False باشد، واردکننده اسلایدهای جدیدی در ایندکس مشخص شده ایجاد می‌کند و اسلایدهای بعدی را جابجا می‌کند.
  • وقتی مقدار آن True باشد، واردکننده شروع به پر کردن محتوا در فضای موجود بر روی اسلاید فعلی در همان ایندکس می‌کند. اگر HTML جا نیفتد، Aspose.Slides به‌صورت خودکار آن را صفحه‌بندی کرده و اسلایدهای اضافی را بلافاصله پس از اسلاید شروع درج می‌کند.

متد SlideCollection.insertFromHtml آرایه‌ای از اشیاء Slide برمی‌گرداند. وقتی درج بر روی اسلایدهای جدید آغاز می‌شود، هر مورد برگردانده‌شده اسلایدی جدید است. وقتی یک اسلاید موجود به‌عنوان شروع استفاده می‌شود، آرایه شامل آن اسلاید تحت تأثیر و سپس هر اسلاید اضافهٔ overflow است. می‌توانید این آرایه را بررسی کنید به جای محاسبهٔ محدودهٔ تحت تأثیر بر پایهٔ تعداد اسلایدهای ارائه.

درج 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 منبع بستگی دارد.