إدارة OLE في العروض التقديمية على Android

المقدمة

اعتبر مخططًا تم إنشاؤه في MS Excel. ثم يُوضع هذا المخطط داخل شريحة PowerPoint. يُعتبر هذا المخطط من Excel كائن OLE.

  • قد يظهر كائن OLE كأيقونة. في هذه الحالة، عند النقر المزدوج على الأيقونة، يُفتح المخطط في التطبيق المرتبط به (Excel)، أو يُطلب منك اختيار تطبيق لفتح أو تعديل الكائن.
  • قد يعرض كائن OLE محتوياته الفعلية، مثل محتويات مخطط. في هذه الحالة، يُفعَّل المخطط في PowerPoint، تُحمَّل واجهة المخطط، ويمكنك تعديل بيانات المخطط داخل PowerPoint.

Aspose.Slides for Android via Java يتيح لك إدراج كائنات OLE في الشرائح كإطارات كائن OLE (OleObjectFrame).

إضافة إطارات كائن OLE إلى الشرائح

بافتراض أنك قد أنشأت مخططًا في Microsoft Excel وتريد تضمينه في شريحة كإطار كائن OLE باستخدام Aspose.Slides for Android via Java، يمكنك فعل ذلك بهذه الطريقة:

  1. إنشاء كائن من فئة Presentation.
  2. الحصول على مرجع الشريحة عبر فهرستها.
  3. قراءة ملف Excel كمصفوفة بايت.
  4. إضافة OleObjectFrame إلى الشريحة محتويًا مصفوفة البايت ومعلومات أخرى حول كائن OLE.
  5. كتابة العرض المُعدل كملف PPTX.

في المثال أدناه، أضفنا مخططًا من ملف Excel إلى شريحة كإطار كائن OLE باستخدام Aspose.Slides for Android via Java.
ملاحظة أن مُنشئ OleEmbeddedDataInfo يستقبل امتداد كائن يمكن تضمينه كمعامل ثانٍ. يتيح هذا الامتداد لبرنامج PowerPoint تفسير نوع الملف بشكل صحيح واختيار التطبيق المناسب لفتح هذا الكائن OLE.

import com.aspose.slides.*;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.awt.geom.Dimension2D;

Presentation presentation = new Presentation();
Dimension2D slideSize = presentation.getSlideSize().getSize();
ISlide slide = presentation.getSlides().get_Item(0);

// إعداد البيانات لكائن OLE.
File file = new File("book.xlsx");
byte fileData[] = new byte[(int) file.length()];
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
DataInputStream dis = new DataInputStream(bis);
dis.readFully(fileData);

IOleEmbeddedDataInfo dataInfo = new OleEmbeddedDataInfo(fileData, "xlsx");

// Add the OLE object frame to the slide.
slide.getShapes().addOleObjectFrame(0, 0, (float) slideSize.getWidth(), (float) slideSize.getHeight(), dataInfo);

presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();

إضافة إطارات OLE المرتبطة

Aspose.Slides for Android via Java يتيح لك إضافة OleObjectFrame دون تضمين البيانات وإنما فقط عبر ارتباط بالملف.

يعرض هذا الكود Java كيفية إضافة OleObjectFrame بملف Excel مرتبط إلى شريحة:

import com.aspose.slides.*;

Presentation presentation = new Presentation();
ISlide slide = presentation.getSlides().get_Item(0);

// إضافة إطار كائن OLE مع ملف Excel مرتبط.
slide.getShapes().addOleObjectFrame(20, 20, 200, 150, "Excel.Sheet.12", "book.xlsx");

presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();

الوصول إلى إطارات OLE

إذا كان كائن OLE مُضمَّنًا مسبقًا في شريحة، يمكنك بسهولة العثور عليه أو الوصول إليه بهذه الطريقة:

  1. تحميل عرض يحتوي على كائن OLE المُضمّن عبر إنشاء نسخة من فئة Presentation.
  2. الحصول على مرجع الشريحة باستخدام فهرستها.
  3. الوصول إلى شكل OleObjectFrame. في مثالنا، استخدمنا PPTX الذي تم إنشاؤه مسبقًا ويحتوي على شكل واحد فقط في الشريحة الأولى. ثم cast ذلك الكائن كـ IOleObjectFrame. كان هذا هو إطار كائن OLE المطلوب الوصول إليه.
  4. بمجرد الوصول إلى إطار كائن OLE، يمكنك تنفيذ أي عملية عليه.

في المثال أدناه يتم الوصول إلى إطار كائن OLE (كائن مخطط Excel مضمّن في شريحة) وبيانات ملفه.

import com.aspose.slides.*;

Presentation presentation = new Presentation("sample.pptx");
ISlide slide = presentation.getSlides().get_Item(0);
IShape shape = slide.getShapes().get_Item(0);

if (shape instanceof IOleObjectFrame) {
    IOleObjectFrame oleFrame = (IOleObjectFrame) shape;
    
    // احصل على بيانات الملف المضمن.
    // احصل على امتداد الملف المضمن.
    // ...
}

الوصول إلى خصائص إطار OLE المرتبط

Aspose.Slides يتيح لك الوصول إلى خصائص إطار OLE المرتبط.

يعرض هذا الكود Java كيفية التحقق مما إذا كان كائن OLE مرتبطًا ثم الحصول على مسار الملف المرتبط:

import com.aspose.slides.*;

Presentation presentation = new Presentation("sample.ppt");
ISlide slide = presentation.getSlides().get_Item(0);
IShape shape = slide.getShapes().get_Item(0);

if (shape instanceof IOleObjectFrame) {
    IOleObjectFrame oleFrame = (IOleObjectFrame) shape;

    // تحقق مما إذا كان كائن OLE مرتبطًا.
    if (oleFrame.isObjectLink()) {
        // اطبع المسار الكامل للملف المرتبط.
        System.out.println("OLE object frame is linked to: " + oleFrame.getLinkPathLong());

        // اطبع المسار النسبي للملف المرتبط إذا كان موجودًا.
        // يمكن فقط لعروض PPT أن تحتوي على المسار النسبي.
        if (oleFrame.getLinkPathRelative() != null && !oleFrame.getLinkPathRelative().isEmpty()) {
            System.out.println("OLE object frame relative path: " + oleFrame.getLinkPathRelative());
        }
    }
}

presentation.dispose();

تغيير بيانات كائن OLE

إذا كان كائن OLE مُضمَّنًا مسبقًا في شريحة، يمكنك بسهولة الوصول إلى ذلك الكائن وتعديل بياناته بهذه الطريقة:

  1. تحميل عرض يحتوي على كائن OLE المُضمّن عبر إنشاء نسخة من فئة Presentation.
  2. الحصول على مرجع الشريحة عبر فهرستها.
  3. الوصول إلى شكل إطار كائن OLE. في مثالنا، استخدمنا PPTX الذي تم إنشاؤه مسبقًا ويحتوي على شكل واحد في الشريحة الأولى. ثم cast ذلك الكائن كـ IOleObjectFrame. كان هذا هو إطار كائن OLE المطلوب الوصول إليه.
  4. بمجرد الوصول إلى إطار كائن OLE، يمكنك تنفيذ أي عملية عليه.
  5. إنشاء كائن Workbook والوصول إلى بيانات OLE.
  6. الوصول إلى الـ Worksheet المطلوب وتعديل البيانات.
  7. حفظ الـ Workbook المحدث في تدفق.
  8. تغيير بيانات كائن OLE من التدفق.

في المثال أدناه يتم الوصول إلى إطار كائن OLE (كائن مخطط Excel مضمّن في شريحة) وتعديل بيانات ملفه لتحديث بيانات المخطط.

import com.aspose.slides.*;
import com.aspose.cells.Workbook;
import com.aspose.cells.OoxmlSaveOptions;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

Presentation presentation = new Presentation("sample.pptx");
ISlide slide = presentation.getSlides().get_Item(0);
IShape shape = slide.getShapes().get_Item(0);

if (shape instanceof IOleObjectFrame) {
    IOleObjectFrame oleFrame = (IOleObjectFrame) shape;

    ByteArrayInputStream oleStream = new ByteArrayInputStream(oleFrame.getEmbeddedData().getEmbeddedFileData());

    // قراءة بيانات كائن OLE ككائن Workbook.
    Workbook workbook = new Workbook(oleStream);

    ByteArrayOutputStream newOleStream = new ByteArrayOutputStream();

    // تعديل بيانات المصنف.
    workbook.getWorksheets().get(0).getCells().get(0, 4).putValue("E");
    workbook.getWorksheets().get(0).getCells().get(1, 4).putValue(12);
    workbook.getWorksheets().get(0).getCells().get(2, 4).putValue(14);
    workbook.getWorksheets().get(0).getCells().get(3, 4).putValue(15);

    OoxmlSaveOptions fileOptions = new OoxmlSaveOptions(com.aspose.cells.SaveFormat.XLSX);
    workbook.save(newOleStream, fileOptions);

    // تغيير بيانات كائن إطار OLE.
    IOleEmbeddedDataInfo newData = new OleEmbeddedDataInfo(newOleStream.toByteArray(), oleFrame.getEmbeddedData().getEmbeddedFileExtension());
    oleFrame.setEmbeddedData(newData);
}

presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();

تضمين أنواع ملفات أخرى في الشرائح

إلى جانب مخططات Excel، يتيح لك Aspose.Slides for Android via Java تضمين أنواع أخرى من الملفات في الشرائح. على سبيل المثال، يمكنك إدراج ملفات HTML وPDF وZIP ككائنات. عند النقر المزدوج على الكائن المُدرج، يفتح تلقائيًا في البرنامج ذي الصلة، أو يُطلب من المستخدم اختيار برنامج مناسب لفتحه.

يعرض هذا الكود Java كيفية تضمين HTML وZIP في شريحة:

import com.aspose.slides.*;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;

Presentation presentation = new Presentation();
ISlide slide = presentation.getSlides().get_Item(0);

File fileHtml = new File("sample.html");
byte htmlData[] = new byte[(int) fileHtml.length()];
BufferedInputStream bisHtml = new BufferedInputStream(new FileInputStream(fileHtml));
DataInputStream disHtml = new DataInputStream(bisHtml);
disHtml.readFully(htmlData);
IOleEmbeddedDataInfo htmlDataInfo = new OleEmbeddedDataInfo(htmlData, "html");
IOleObjectFrame htmlOleFrame = slide.getShapes().addOleObjectFrame(150, 120, 50, 50, htmlDataInfo);
htmlOleFrame.setObjectIcon(true);

File fileZip = new File("sample.zip");
byte zipData[] = new byte[(int) fileZip.length()];
BufferedInputStream bisZip = new BufferedInputStream(new FileInputStream(fileZip));
DataInputStream disZip = new DataInputStream(bisZip);
disZip.readFully(zipData);
IOleEmbeddedDataInfo zipDataInfo = new OleEmbeddedDataInfo(zipData, "zip");
IOleObjectFrame zipOleFrame = slide.getShapes().addOleObjectFrame(150, 220, 50, 50, zipDataInfo);
zipOleFrame.setObjectIcon(true);

presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();

تحديد أنواع الملفات للكائنات المضمنة

عند العمل مع العروض، قد تحتاج إلى استبدال كائنات OLE القديمة بأخرى جديدة أو استبدال كائن OLE غير المدعوم بآخر مدعوم. يتيح لك Aspose.Slides for Android via Java تحديد نوع الملف لكائن مضمّن، مما يتيح لك تحديث بيانات إطار OLE أو امتداده.

يعرض هذا الكود Java كيفية تحديد نوع الملف لكائن OLE مضمّن إلى zip:

import com.aspose.slides.*;

Presentation presentation = new Presentation("sample.pptx");
ISlide slide = presentation.getSlides().get_Item(0);
IOleObjectFrame oleFrame = (IOleObjectFrame) slide.getShapes().get_Item(0);

String fileExtension = oleFrame.getEmbeddedData().getEmbeddedFileExtension();
byte[] fileData = oleFrame.getEmbeddedData().getEmbeddedFileData();

System.out.println("Current embedded file extension is: " + fileExtension);

// تغيير نوع الملف إلى ZIP.
oleFrame.setEmbeddedData(new OleEmbeddedDataInfo(fileData, "zip"));

presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();

تعيين صور الأيقونات والعناوين للكائنات المضمنة

بعد تضمين كائن OLE، تُضاف معاينة مكوّنة من صورة أيقونة تلقائيًا. هذه المعاينة هي ما يراه المستخدمون قبل الوصول إلى كائن OLE أو فتحه. إذا أردت استخدام صورة ونص محددين كعناصر في المعاينة، يمكنك تعيين صورة الأيقونة والعنوان باستخدام Aspose.Slides for Android via Java.

يعرض هذا الكود Java كيفية تعيين صورة الأيقونة والعنوان لكائن مضمّن:

import com.aspose.slides.*;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;

Presentation presentation = new Presentation("sample.pptx");
ISlide slide = presentation.getSlides().get_Item(0);
IOleObjectFrame oleFrame = (IOleObjectFrame) slide.getShapes().get_Item(0);

// إضافة صورة إلى موارد العرض التقديمي.
File file = new File("image.png");
byte imageData[] = new byte[(int) file.length()];
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
DataInputStream dis = new DataInputStream(bis);
dis.readFully(imageData);
IPPImage oleImage = presentation.getImages().addImage(imageData);

// Set a title and the image for the OLE preview.
oleFrame.setSubstitutePictureTitle("My title");
oleFrame.getSubstitutePictureFormat().getPicture().setImage(oleImage);
oleFrame.setObjectIcon(true);

presentation.save("output.pptx", SaveFormat.Pptx);
presentation.dispose();

منع تغيير حجم وإعادة تموضع إطار كائن OLE

بعد أن تضيف كائن OLE مرتبط إلى شريحة عرض، عند فتح العرض في PowerPoint قد ترى رسالة تطلب منك تحديث الروابط. النقر على زر “Update Links” قد يغيّر حجم وموضع إطار كائن OLE لأن PowerPoint يُحدّث البيانات من كائن OLE المرتبط ويُحدّث معاينة الكائن. لمنع PowerPoint من طلب تحديث بيانات الكائن، استدعِ طريقة setUpdateAutomatic لواجهة IOleObjectFrame مع القيمة false:

import com.aspose.slides.*;

Presentation presentation = new Presentation("sample.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IOleObjectFrame oleFrame = (IOleObjectFrame) slide.getShapes().get_Item(0);

    oleFrame.setUpdateAutomatic(false);

    presentation.save("output.pptx", SaveFormat.Pptx);
} finally {
    if (presentation != null) presentation.dispose();
}

استخراج الملفات المضمنة

Aspose.Slides for Android via Java يتيح لك استخراج الملفات المضمنة في الشرائح ككائنات OLE بهذه الطريقة:

  1. إنشاء نسخة من فئة Presentation التي تحتوي على كائنات OLE التي تنوي استخراجها.
  2. التجول عبر جميع الأشكال في العرض والوصول إلى أشكال OLEObjectFrame.
  3. الوصول إلى بيانات الملفات المضمنة من إطارات OLE وكتابتها إلى القرص.

يعرض هذا الكود Java كيفية استخراج الملفات المضمنة في شريحة ككائنات OLE:

import com.aspose.slides.*;
import java.io.File;
import java.io.FileOutputStream;

Presentation presentation = new Presentation("sample.pptx");
ISlide slide = presentation.getSlides().get_Item(0);

for (int index = 0; index < slide.getShapes().size(); index++) {
    IShape shape = slide.getShapes().get_Item(index);

    if (shape instanceof IOleObjectFrame) {
        IOleObjectFrame oleFrame = (IOleObjectFrame) shape;

        byte[] fileData = oleFrame.getEmbeddedData().getEmbeddedFileData();
        String fileExtension = oleFrame.getEmbeddedData().getEmbeddedFileExtension();

        FileOutputStream fos = new FileOutputStream(new File("OLE_object_" + index + fileExtension));
        fos.write(fileData);
        fos.close();
    }
}

presentation.dispose();

الأسئلة الشائعة

هل يتم عرض محتوى OLE عند تصدير الشرائح إلى PDF/صور؟

ما هو مرئي على الشريحة يُعرض—الأيقونة/الصورة البديلة (المعاينة). محتوى OLE “الحي” لا يُنفّذ أثناء العرض. إذا لزم الأمر، عين صورة معاينة خاصة لضمان المظهر المتوقع في PDF المُصدَّر.

للحفاظ أيضاً على الملف المضمن كمرفق PDF، استدعِ setIncludeOleData مع true. هذا الخيار مُعطَّل افتراضيًا. للحصول على مثال وتعليمات للتحقق من المرفق، راجع حفظ ملفات OLE المضمنة كمرفقات PDF.

كيف يمكنني قفل كائن OLE على شريحة بحيث لا يتمكن المستخدمون من تحريكه/تحريره في PowerPoint؟

قفل الشكل: Aspose.Slides يقدم أقفال على مستوى الشكل. هذا ليس تشفيرًا، لكنه يمنع بشكل فعال التعديلات والحركة العرضية.

لماذا “يقفز” كائن Excel المرتبط أو يتغيّر حجمه عندما أفتح العرض؟

قد يقوم PowerPoint بتحديث معاينة OLE المرتبط. للحصول على مظهر ثابت، اتبع ممارسات الحل العملي لإعادة تحجيم ورقة العمل—إما أن تتناسب الإطار مع النطاق، أو تقوّم النطاق إلى إطار ثابت وتعيّن صورة بديلة مناسبة.

هل سيتم الحفاظ على المسارات النسبية لكائنات OLE المرتبطة في تنسيق PPTX؟

في PPTX، لا تتوفر معلومات “المسار النسبي”—فقط المسار الكامل. تُوجد المسارات النسبية في تنسيق PPT الأقدم. من أجل القابلية للنقل، يفضَّل استخدام مسارات مطلقة موثوقة/عناوين URI قابلة للوصول أو التضمين.