تحويل عروض PowerPoint إلى HTML في Python عبر Java

نظرة عامة

يمكن لـ Aspose.Slides for Python via Java حفظ عروض PowerPoint كملفات HTML دون الحاجة إلى Microsoft PowerPoint. التحويل الأساسي يتم بعملية تحميل واحدة لـ Presentation واستدعاء save مع SaveFormat. استخدم HtmlOptions عندما تحتاج إلى التحكم في تخطيط التصدير، الخطوط، الصور، الملاحظات، التعليقات، إخراج SVG، أو الموارد المرتبطة.

يركز هذا الدليل على سيناريوهات تصدير HTML العملية:

  • تصدير العرض بالكامل أو شرائح مختارة.
  • إنشاء HTML بتخطيط ثابت، أو تصميم متجاوب، أو مبني على SVG.
  • تضمين ملاحظات المتحدث والتعليقات.
  • التحكم في جودة الصورة وبيانات الصور المقصوصة.
  • تضمين الخطوط أو حفظ ملفات الخطوف بشكل منفصل.
  • اختيار طريقة كتابة وإحالة الموارد الخارجية وملفات الوسائط.

بشكل افتراضي، ينتج تصدير HTML مستند HTML شامل تُدمج فيه معظم الموارد. هذا مريح لمشاركة ملف واحد، لكنه قد يزيد حجم الناتج. للنشر على الويب، فكر في استخدام موارد خارجية، خفض DPI للصور، وتضمين الخطوط فقط عندما لا تكون متوفرة بشكل موثوق في البيئة المستهدفة.

تحويل عرض تقديمي إلى HTML

لتصدير عرض تقديمي إلى HTML، قم بتحميله باستخدام Presentation واحفظه باستخدام SaveFormat.Html.

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    presentation.save("presentation.html", SaveFormat.Html)
finally:
    presentation.dispose()

كل مثال يحمل presentation.pptx من دليل العمل الحالي. قم بتثبيت Aspose.Slides for Python via Java وبيئة تشغيل Java متوافقة قبل تشغيله. يُبدأ الـ JVM مرة واحدة لكل عملية Python.

هذا المثال يكتب ملف HTML واحد. يتم تحرير كائن العرض في كتلة finally، مما يحرر مقابض الملفات وموارد التصيير بعد التصدير.

تهيئة تصدير HTML

HtmlOptions هي الفئة الرئيسية لتكوين تصدير HTML. تشمل الإعدادات الشائعة:

الأقسام التالية تعرض أكثر الخيارات شيوعًا بشكل منفصل بحيث يمكنك دمج فقط ما يحتاجه سير العمل الخاص بك.

تحويل شرائح مختارة إلى HTML

التحميل الزائد Presentation.save الذي يقبل أرقام الشرائح يستخدم مواضع الشرائح بدءًا من 1. الحلقة أدناه تحفظ كل شريحة في ملف HTML منفصل.

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    slide_count = presentation.getSlides().size()
    for slide_index in range(slide_count):
        slide_number = slide_index + 1
        slide_numbers = jpype.JArray(jpype.JInt)([slide_number])
        html_file_name = f"slide-{slide_number}.html"
        presentation.save(html_file_name, slide_numbers, SaveFormat.Html)
finally:
    presentation.dispose()

استخدم هذا النمط عندما يحتاج موقع ويب أو تطبيق إلى صفحة HTML واحدة لكل شريحة. إذا كان يجب أن تكون كل شريحة بنفس التخطيط، أنشئ كائنًا واحدًا من HtmlOptions ومرره إلى كل استدعاء لـ Presentation.save.

إنشاء HTML متجاوب

ResponsiveHtmlController يوفر مخرجات HTML متجاوبة عبر HtmlFormatter. استخدمه عندما يجب أن يتكيف الصفّ المُصدّر بشكل أفضل مع عرض المتصفح.

import jpype
import asposeslides

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

from asposeslides.api import HtmlFormatter, HtmlOptions, Presentation, ResponsiveHtmlController, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    controller = ResponsiveHtmlController()
    formatter = HtmlFormatter.createCustomFormatter(controller)

    html_options = HtmlOptions()
    html_options.setHtmlFormatter(formatter)

    presentation.save("presentation-responsive.html", SaveFormat.Html, html_options)
finally:
    presentation.dispose()

للحصول على تخطيط متجاوب مبني على SVG، استدعِ HtmlOptions.setSvgResponsiveLayout مع True. هذا مفيد عندما يتم تصدير محتوى الشريحة كعلامة SVG قابلة للتوسع.

import jpype
import asposeslides

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

from asposeslides.api import HtmlOptions, Presentation, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    html_options = HtmlOptions()
    html_options.setSvgResponsiveLayout(True)

    presentation.save("presentation-svg-responsive.html", SaveFormat.Html, html_options)
finally:
    presentation.dispose()

تضمين ملاحظات المتحدث والتعليقات

استخدم NotesCommentsLayoutingOptions عبر HtmlOptions.setSlidesLayoutOptions لتضمين ملاحظات المتحدث أو التعليقات. تكون الملاحظات والتعليقات مخفية افتراضيًا ما لم تحدد مواضعها.

لنفترض أن العرض الأصلي يحتوي على ملاحظات المتحدث:

شريحة مع ملاحظات المتحدث في PowerPoint

الكود التالي يصدر محتوى الشريحة مع ملاحظات المتحدث أسفل الشريحة.

import jpype
import asposeslides

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

from asposeslides.api import HtmlOptions, NotesCommentsLayoutingOptions, NotesPositions, Presentation, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    layout_options = NotesCommentsLayoutingOptions()
    layout_options.setNotesPosition(NotesPositions.BottomFull)

    html_options = HtmlOptions()
    html_options.setSlidesLayoutOptions(layout_options)

    presentation.save("presentation-with-notes.html", SaveFormat.Html, html_options)
finally:
    presentation.dispose()

يتضمن HTML المُصدّر منطقة الملاحظات:

مخرجات HTML مع الشريحة وملاحظات المتحدث

لتصدير التعليقات، استدعِ NotesCommentsLayoutingOptions.setCommentsPosition، على سبيل المثال مع CommentsPositions.Right أو CommentsPositions.Bottom. إذا كنت بحاجة فقط إلى التعليقات، احذف استدعاء NotesCommentsLayoutingOptions.setNotesPosition. إذا كنت بحاجة إلى كل من الملاحظات والتعليقات، استدعِ الطريقتين.

التحكم في جودة الصورة والمساحات المقصوصة

يمكن لتصدير HTML ضغط صور الشرائح لتقليل حجم الناتج. مرّر قيمة إلى HtmlOptions.setPicturesCompression من PicturesCompression عندما تحتاج إلى جودة صورة أعلى.

import jpype
import asposeslides

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

from asposeslides.api import HtmlOptions, PicturesCompression, Presentation, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    html_options = HtmlOptions()
    html_options.setPicturesCompression(PicturesCompression.Dpi150)

    presentation.save("presentation-dpi-150.html", SaveFormat.Html, html_options)
finally:
    presentation.dispose()

بشكل افتراضي، قد يتم إزالة المناطق المقصوصة من الصور في المخرجات المُصدَّرة. احتفظ بالبيانات المقصوصة فقط عندما يجب أن يتمكن المستخدمون من استعادة أو فحص تلك الأجزاء المخفية من الصورة. الإبقاء عليها قد يزيد من حجم HTML.

import jpype
import asposeslides

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

from asposeslides.api import HtmlOptions, Presentation, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    html_options = HtmlOptions()
    html_options.setDeletePicturesCroppedAreas(False)

    presentation.save("presentation-with-cropped-areas.html", SaveFormat.Html, html_options)
finally:
    presentation.dispose()

إضافة CSS

للتنسيق البسيط، مرّر سلسلة CSS إلى HtmlFormatter.createDocumentFormatter. هذا يغيّر مستند HTML المحيط بينما تستمر Aspose.Slides في تصيير محتوى الشريحة.

import jpype
import asposeslides

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

from asposeslides.api import HtmlFormatter, HtmlOptions, Presentation, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    css_rules = "body { margin: 0; background: #f7f7f7; } .slide { margin: 24px auto; }"
    formatter = HtmlFormatter.createDocumentFormatter(css_rules, True)

    html_options = HtmlOptions()
    html_options.setHtmlFormatter(formatter)

    presentation.save("presentation-styled.html", SaveFormat.Html, html_options)
finally:
    presentation.dispose()

لرأس مستند مخصص، ملف CSS مرتبط، أو علامات مخصصة حول الشرائح والأشكال، استخدم وحدة تحكم تنسيق مخصصة عبر وكيل واجهة JPype ومرّرها إلى HtmlFormatter باستخدام HtmlFormatter.createCustomFormatter.

تضمين الخطوط

إذا كان من المحتمل أن بيئة الهدف لا تتوفر على خطوط العرض المثبتة، قم بتضمين الخطوط في HTML باستخدام EmbedAllFontsHtmlController. يرفع التضمين من دقة العرض البصري لكنه يزيد من حجم الناتج.

import jpype
import asposeslides

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

from asposeslides.api import EmbedAllFontsHtmlController, HtmlFormatter, HtmlOptions, Presentation, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    font_names_to_exclude = jpype.JArray(jpype.JString)(["Arial"])
    font_controller = EmbedAllFontsHtmlController(font_names_to_exclude)
    formatter = HtmlFormatter.createCustomFormatter(font_controller)

    html_options = HtmlOptions()
    html_options.setHtmlFormatter(formatter)

    presentation.save("presentation-embedded-fonts.html", SaveFormat.Html, html_options)
finally:
    presentation.dispose()

استبعد الخطوط فقط عندما تكون واثقًا أن المتصفحات أو الأنظمة المستهدفة توفرها بالفعل. بالنسبة للخطوط العلامة التجارية أو الخطوط غير الشائعة، يكون التضمين عادةً أكثر أمانًا.

حفظ الموارد خارجيًا

HTML المتضمن ذاتيًا سهل النقل، لكن الموارد المشفرة بـ Base64 يمكن أن تجعل الملف كبيرًا. إذا كان تطبيقك يحتاج إلى ملفات صور خارجية، نفّذ وحدة تحكم ربط الموارد عبر وكيل واجهة JPype ومرّرها إلى مُنشئ HtmlOptions.

عند تحويل الموارد إلى خارجية، اختر مسارين بعناية:

  • مسار مخرجات نظام الملفات، حيث يكتب تطبيقك الصور، الخطوط، الصوت أو الفيديو المُنشأة.
  • مسار URL، وهو ما يستخدمه المتصفح من داخل مستند HTML لتحميل تلك الملفات.

تصدير ملفات الوسائط

VideoPlayerHtmlController يصدر ملفات الفيديو والصوت ويكتب HTML يمكن تشغيله في المتصفح. يأخذ مُنشئه:

  • path: الدليل حيث سيتم كتابة ملفات الوسائط المُنشأة.
  • fileName: اسم ملف HTML الجاري إنشاؤه.
  • baseUri: بادئة URI مطلقة تُستخدم في روابط HTML لملفات الوسائط.

المثال التالي يصدر وسائط مدمجة مسبقًا في presentation.pptx. يربط HTML المُنشأ ملفات الوسائط بالاسم فقط، نسبياً إلى مستند HTML، لذا يجب أن يكون path هو الدليل الذي يتلقى أيضًا ملف HTML. يجب أن يكون baseUri URI مطلقًا: للمعاينة المحلية، يمكنك بناء URI من نوع file:/// من دليل الإخراج؛ للتطبيق المنشور، استخدم URL المطلق للدليل المنشور.

import jpype
import asposeslides

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

from asposeslides.api import HtmlFormatter, HtmlOptions, Presentation, SVGOptions, SaveFormat, SlideImageFormat, VideoPlayerHtmlController

from pathlib import Path

output_directory = Path("html-output").resolve()
output_directory.mkdir(parents=True, exist_ok=True)
html_file_name = "presentation.html"
media_base_uri = output_directory.as_uri() + "/"

presentation = Presentation("presentation.pptx")
try:
    controller = VideoPlayerHtmlController(str(output_directory), html_file_name, media_base_uri)
    formatter = HtmlFormatter.createCustomFormatter(controller)
    svg_options = SVGOptions(controller)
    slide_image_format = SlideImageFormat.svg(svg_options)

    html_options = HtmlOptions(controller)
    html_options.setHtmlFormatter(formatter)
    html_options.setSlideImageFormat(slide_image_format)

    html_file_path = output_directory / html_file_name
    presentation.save(str(html_file_path), SaveFormat.Html, html_options)
finally:
    presentation.dispose()

استخدم أدلة إخراج فريدة لكل مهمة تصدير، خاصة في تطبيقات الخادم. يمكن أن تتسبب مسارات الإخراج المشتركة في الكتابة فوق ملفات التحويلات المختلفة.

الأداء وإدارة الموارد

تحويل HTML عملية تصيير، لذا يعتمد زمن المعالجة واستهلاك الذاكرة على عدد الشرائح، دقة الصور، الخطوط، التأثيرات، المخططات، والوسائط المدمجة. القيم الأعلى لـ DPI التي تُمرَّر إلى HtmlOptions.setPicturesCompression، الخطوط المضمَّنة، إخراج SVG، والحفاظ على مناطق الصور المقصوصة يمكن أن تحسن الدقة لكنها عادةً ما ترفع حجم الناتج.

للتحويل على دفعات:

  • حرّر كل كائن Presentation فورًا.
  • استخدم أدلة إخراج منفصلة للمهام المختلفة.
  • تجنّب تضمين الخطوط الشائعة ما لم تتطلب الدقة ذلك.
  • خفّض DPI الصورة عندما يكون HTML مخصصًا للمعاينة أو للصور المصغرة.
  • احتفظ بالعرض الأصلي، HTML المُنشأ، والموارد الخارجية معًا حتى تصبح مسارات النشر نهائية.

الأسئلة المتكررة

هل تُحافظ الروابط التشعبية في مخرجات HTML؟

نعم. تُصدَّر روابط العرض إلى HTML وتظل قابلة للنقر عندما يكون عنوان URL الهدف صالحًا.

هل يمكنني تحويل العروض إلى HTML بشكل متوازي؟

نعم، لكن لا تشارك كائن Presentation واحد عبر الخيوط. عالج ملفات مختلفة باستخدام مثيلات عرض منفصلة، وتدفقات منفصلة، وأدلة إخراج منفصلة. راجع دليل multithreading guidance للمزيد من التفاصيل.

هل كائن العرض آمن للاستخدام عبر الخيوط؟

لا. يجب تحميل وتعديل وحفظ وتحرير كائن Presentation على خيط واحد فقط. للعمل المتوازي، أنشئ نسخة مستقلة لكل خيط أو عملية.

لماذا حجم ملف HTML المُولد كبير؟

التصدير الافتراضي يمكن أن يدمج الموارد مباشرةً في HTML. الخطوط المدمجة، الصور بدقة DPI عالية، الوسائط، محتوى SVG، والحفاظ على مناطق الصور المقصوصة كلها تزيد من الحجم. استخدم موارد خارجية، استبعد الخطوط الشائعة من التضمين، ومرّر قيمة DPI أقل إلى HtmlOptions.setPicturesCompression عندما يكون حجم الناتج الأصغر أهم من أعلى دقة.

لماذا قد تختلف قيم حجم الخط في HTML عن قيم PowerPoint؟

قد يستخدم الصف المُصدَّر أنظمة إحداثيات SVG وتحويلات مقياس. قيمة CSS أو SVG لحجم الخط وحدها لا تصف الحجم النهائي المعروض. قارن الشريحة المصورة عند مستوى التكبير المقصود، وتحقق من توفر الخط إذا ظهر النص مختلفًا.

كيف ينبغي اختيار baseUri لتصدير الوسائط؟

اختر baseUri من منظور المتصفح ومرره كـ URI مطلق. للمعاينة المحلية، يمكنك اشتقاقه من دليل الإخراج باستخدام output_directory.as_uri() + "/". للنشر، استخدم URL المطلق للدليل المنشور. لا يلزم أن يكون path في نظام الملفات وbaseUri في المتصفح نفس السلسلة، لكنهما يجب أن يصفا نفس الموقع، ويجب أن يكون ذلك الموقع هو الدليل الذي يحتوي على ملف HTML المُولَّد لأن روابط الوسائط تُكتب نسبةً إليه.

هل يمكنني تضمين الشرائح المخفية؟

نعم. استدعِ HtmlOptions.setShowHiddenSlides مع True عندما يجب تصدير الشرائح المخفية.