حفظ العروض التقديمية في بايثون عبر جافا

نظرة عامة

بعد أن تقوم بإنشاء عرض تقديمي أو فتح عرض موجود، استخدم طريقة Presentation.save لكتابة النتيجة. يمكن لـ Aspose.Slides للـ Python عبر Java حفظ العرض التقديمي إلى ملف أو تدفق في صيغ PowerPoint و OpenDocument و PDF وغيرها. الأقسام التالية تغطي عمليات الحفظ القياسية والخيارات المتاحة لإخراج PPTX.

حفظ العروض التقديمية إلى ملفات

لحفظ عرض تقديمي إلى ملف، مرّر مسار الإخراج وقيمة SaveFormat إلى طريقة Presentation.save. تحدد قيمة التنسيق نوع الملف الذي تنشئه Aspose.Slides.

المثال التالي ينشئ عرضاً تقديمياً ويحفظه كملف PPTX:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation()
try:
    # إضافة أو تعديل محتوى العرض التقديمي هنا.

    presentation.save("Output.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

حفظ العروض التقديمية بصيغتها الأصلية

في تطبيق معالجة دفعات، قد لا يكون تنسيق الإدخال معروفًا مسبقًا. بعد تحميل ملف، اقرأ تنسيقه الأصلي من طريقة Presentation.getSourceFormat. مرّر قيمة SourceFormat الناتجة إلى SlideUtil.toSaveFormat للحصول على قيمة SaveFormat المقابلة، ثم استخدم Presentation.save لكتابة العرض المعدل.

المثال الكامل التالي يعالج كل ملف في دليل الإدخال، يحدّث عنوانه، ويحفظه إلى دليل الإخراج بالتنسيق الذي تم تحميله منه:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SlideUtil
from pathlib import Path

IllegalArgumentException = jpype.JClass("java.lang.IllegalArgumentException")
input_directory = Path("Input")
output_directory = Path("Output")

try:
    output_directory.mkdir(parents=True, exist_ok=True)
except OSError:
    print("Cannot create the output directory.")

if input_directory.is_dir() and output_directory.is_dir():
    for input_file in input_directory.iterdir():
        if input_file.is_file():
            try:
                presentation = Presentation(str(input_file))
                try:
                    save_format = SlideUtil.toSaveFormat(presentation.getSourceFormat())
                    presentation.getDocumentProperties().setTitle("Processed by the batch application")

                    output_file = output_directory / input_file.name
                    presentation.save(str(output_file), save_format)
                finally:
                    presentation.dispose()
            except IllegalArgumentException as exception:
                print(f"Cannot map the source format of '{input_file}': {exception}")
            except Exception as exception:
                print(f"Cannot process '{input_file}': {exception}")

SlideUtil.toSaveFormat يطابق صيغ PPT و PPTX و ODP و PPTM و PPSX و PPSM و POTX و POTM و PPS و POT و OTP و FODP و XML PowerPoint إلى صيغ الحفظ المقابلة لها. يطابق صيغ المصدر للعرض فقط؛ ولا يُقصد به اختيار صيغ التصدير مثل PDF أو HTML أو TIFF أو الصور. تمرير قيمة SourceFormat غير مدعومة أو غير صالحة يؤدي إلى حدوث IllegalArgumentException.

تستخدم ملفات PPT و PPS و POT القديمة نفس الحاوية الثنائية. عندما يتم تحميل مثل هذا العرض من تدفق بدون امتداد ملف، قد يتم التعرف على ملف PPS أو POT على أنه PPT. إذا كان من الضروري الحفاظ على هذه الأنواع الفرعية القديمة، احتفظ باسم الملف الأصلي أو بيانات التنسيق الوصفية بشكل منفصل واستخدمها عند اختيار اسم ملف الإخراج وتنسيقه.

حفظ العروض التقديمية إلى تدفقات

للكتابة إلى عرض تقديمي دون الاعتماد على مسار ملف نهائي، مرّر تدفقًا قابلًا للكتابة وقيمة SaveFormat إلى طريقة Presentation.save. هذا الأسلوب مفيد عندما يجب إرجاع النتيجة من خدمة ويب، أو تخزينها في قاعدة بيانات، أو معالجتها في الذاكرة.

المثال التالي يحفظ عرضًا تقديميًا جديدًا إلى تدفق ملف:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat

FileOutputStream = jpype.JClass("java.io.FileOutputStream")

presentation = Presentation()
try:
    output_stream = FileOutputStream("Output.pptx")
    try:
        presentation.save(output_stream, SaveFormat.Pptx)
    finally:
        output_stream.close()
finally:
    presentation.dispose()

حفظ العروض التقديمية بنوع عرض محدد مسبقًا

يمكنك تحديد طريقة العرض التي يفتح بها PowerPoint العرض المحفوظ في البداية. استخدم طريقة ViewProperties.setLastView مع قيمة ViewType قبل الحفظ.

المثال التالي يكوّن عرض شريحة الرئيس كالعرض الأولي:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, ViewType

presentation = Presentation()
try:
    presentation.getViewProperties().setLastView(ViewType.SlideMasterView)
    presentation.save("SlideMasterView.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

حفظ العروض التقديمية بتنسيق Office Open XML الصارم

لإنشاء ملف PPTX يتوافق مع ملف التعريف الصارم لـ Office Open XML، أنشئ مثيلًا من PptxOptions واستخدم طريقة setConformance معه مع Conformance.Iso29500_2008_Strict. ثم مرّر الخيارات إلى طريقة Presentation.save.

import jpype
import asposeslides

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

from asposeslides.api import Conformance, PptxOptions, Presentation, SaveFormat

options = PptxOptions()
options.setConformance(Conformance.Iso29500_2008_Strict)

presentation = Presentation()
try:
    presentation.save("StrictOfficeOpenXml.pptx", SaveFormat.Pptx, options)
finally:
    presentation.dispose()

حفظ العروض التقديمية بتنسيق Office Open XML في وضع Zip64

يحدّ أرشيف ZIP القياسي الحجم المضغوط وغير المضغوط لكل إدخال، وحجم الأرشيف الكلي، وعدد الإدخالات. نظرًا لأن ملف PPTX هو أرشيف ZIP، قد يتجاوز عرض تقديمي كبير جدًا هذه الحدود. تمديدات ZIP64 ترفع الحدود المطبقة على الحجم وعدد الإدخالات.

استخدم طريقة PptxOptions.setZip64Mode للتحكم فيما إذا كانت Aspose.Slides تكتب امتدادات ZIP64:

  • IfNecessary يستخدم ZIP64 فقط عندما يتجاوز العرض حدود ZIP القياسية. هذا هو الوضع الافتراضي.
  • Never يعرّض امتدادات ZIP64.
  • Always يكتب دائمًا امتدادات ZIP64.

المثال التالي يمكّن دائمًا امتدادات ZIP64 لعرض الإخراج:

import jpype
import asposeslides

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

from asposeslides.api import PptxOptions, Presentation, SaveFormat, Zip64Mode

presentation = Presentation("Sample.pptx")
try:
    options = PptxOptions()
    options.setZip64Mode(Zip64Mode.Always)

    presentation.save("OutputZip64.pptx", SaveFormat.Pptx, options)
finally:
    presentation.dispose()

حفظ العروض التقديمية بتنسيق Office Open XML مع مستويات الضغط

لإخراج PPTX، يمكنك موازنة سرعة الحفظ بحجم الملف باستخدام طريقة PptxOptions.setCompressionLevel. توفر الفئة CompressionLevel القيم التالية:

  • None يخزن البيانات بدون ضغط.
  • Level1 يوفر أسرع ضغط وأكبر حجم مضغوط للخرج.
  • Level2 إلى Level5 يفضّلان تدريجيًا خفض حجم الخرج على سرعة الحفظ.
  • Level6 يوازن بين سرعة الحفظ وحجم الملف. هذا هو المستوى الافتراضي.
  • Level7 و Level8 يفضّلان خفض حجم الخرج أكثر على حساب سرعة الحفظ.
  • Level9 يوفر أقوى ضغط ويتطلب أكبر زمن معالجة.

المثال التالي يحفظ عرضًا تقديميًا بدون ضغط:

import jpype
import asposeslides

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

from asposeslides.api import CompressionLevel, PptxOptions, Presentation, SaveFormat

presentation = Presentation("Sample.pptx")
try:
    options = PptxOptions()
    options.setCompressionLevel(CompressionLevel.None_)

    presentation.save("OutputNoCompression.pptx", SaveFormat.Pptx, options)
finally:
    presentation.dispose()

المثال التالي يستخدم أعلى مستوى للضغط:

import jpype
import asposeslides

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

from asposeslides.api import CompressionLevel, PptxOptions, Presentation, SaveFormat

presentation = Presentation("Sample.pptx")
try:
    options = PptxOptions()
    options.setCompressionLevel(CompressionLevel.Level9)

    presentation.save("OutputMaximumCompression.pptx", SaveFormat.Pptx, options)
finally:
    presentation.dispose()

حفظ العروض التقديمية دون تحديث الصورة المصغرة

عند حفظ عرض تقديمي كـ PPTX، تتحكم طريقة PptxOptions.setRefreshThumbnail في الصورة المصغرة للمستند:

  • True يعيد إنشاء الصورة المصغرة أثناء عملية الحفظ. هذه هي القيمة الافتراضية.
  • False يحافظ على الصورة المصغرة الحالية. إذا لم يكن للعرض مصغرة، فإن Aspose.Slides لا يولد واحدة.

المثال التالي يحفظ عرضًا تقديميًا دون تحديث صورته المصغرة:

import jpype
import asposeslides

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

from asposeslides.api import PptxOptions, Presentation, SaveFormat

presentation = Presentation("Sample.pptx")
try:
    options = PptxOptions()
    options.setRefreshThumbnail(False)

    presentation.save("Output.pptx", SaveFormat.Pptx, options)
finally:
    presentation.dispose()

الإبلاغ عن تقدم الحفظ كنسبة مئوية

لمراقبة عملية الحفظ، سجّل معالج تقدم بلغة Python عبر jpype.JProxy ومرره إلى طريقة SaveOptions.setProgressCallback. ثم تستدعي Aspose.Slides طريقة reporting للمعالج مع قيم التقدم خلال التصدير.

المثال التالي يبلغ عن تقدم تصدير PDF إلى وحدة التحكم:

import jpype
import asposeslides

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

from asposeslides.api import PdfOptions, Presentation, SaveFormat


class ExportProgressHandler:
    def reporting(self, progress_value):
        progress = int(progress_value)
        print(f"{progress}% of the file has been converted.")


handler = ExportProgressHandler()
callback = jpype.JProxy("com.aspose.slides.IProgressCallback", inst=handler)
options = PdfOptions()
options.setProgressCallback(callback)

presentation = Presentation("Sample.pptx")
try:
    presentation.save("Output.pdf", SaveFormat.Pdf, options)
finally:
    presentation.dispose()

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

هل تدعم Aspose.Slides الحفظ المتدرج أو “الحفظ السريع”?

لا. كل عملية حفظ تكتب ملف إخراج كامل بدلاً من تحديث الأجزاء المتغيّرة فقط.

هل يمكن لعدة خيوط حفظ نفس كائن Presentation؟

لا. كائن Presentation ليس آمناً للـ thread. يجب الوصول إلى كل كائن وحفظه من خيط واحد فقط في كل مرة.

ماذا يحدث للروابط التشعبية والملفات المرتبطة خارجيًا عند حفظ عرض تقديمي؟

تظل Hyperlinks داخل العرض. لا تقوم Aspose.Slides بنسخ الملفات المرتبطة خارجيًا، لذا يجب أن يكون للعرض المحفوظ القدرة على الوصول إلى مواقعها.

هل يمكنني حفظ بيانات تعريف المستند مثل المؤلف، العنوان، الشركة، وتاريخ الإنشاء؟

نعم. عيّن document properties المناسبة قبل الحفظ، وستقوم Aspose.Slides بكتابتها إلى ملف الإخراج.