إدارة OLE في العروض التقديمية باستخدام Java

المقدمة

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

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

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

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

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

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

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

import com.aspose.slides.*;
import java.awt.geom.Dimension2D;
import java.nio.file.Files;
import java.nio.file.Paths;

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

// Prepare data for the OLE object.
byte[] fileData = Files.readAllBytes(Paths.get("book.xlsx"));
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 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 الذي تم إنشاؤه مسبقًا ويحتوي على شكل واحد فقط في الشريحة الأولى. ثم قمنا بتحويل ذلك الكائن إلى 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;
    
    // احصل على بيانات الملف المضمّن.
    byte[] fileData = oleFrame.getEmbeddedData().getEmbeddedFileData();

    // احصل على امتداد الملف المضمّن.
    String fileExtension = oleFrame.getEmbeddedData().getEmbeddedFileExtension();

    // ...
}

الوصول إلى خصائص إطار 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 الذي تم إنشاؤه مسبقًا ويحتوي على شكل واحد في الشريحة الأولى. ثم قمنا بتحويل ذلك الكائن إلى 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 Java يتيح لك تضمين أنواع أخرى من الملفات في الشرائح. على سبيل المثال، يمكنك إدراج ملفات HTML و PDF و ZIP ككائنات. عند النقر المزدوج على الكائن المُدرج، يفتح تلقائيًا في البرنامج المناسب أو يُطلب من المستخدم اختيار برنامج مناسب لفتحه.

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

import com.aspose.slides.*;
import java.nio.file.Files;
import java.nio.file.Paths;

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

byte[] htmlData = Files.readAllBytes(Paths.get("sample.html"));
IOleEmbeddedDataInfo htmlDataInfo = new OleEmbeddedDataInfo(htmlData, "html");
IOleObjectFrame htmlOleFrame = slide.getShapes().addOleObjectFrame(150, 120, 50, 50, htmlDataInfo);
htmlOleFrame.setObjectIcon(true);

byte[] zipData = Files.readAllBytes(Paths.get("sample.zip"));
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 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);

// Change the file type to ZIP.
oleFrame.setEmbeddedData(new OleEmbeddedDataInfo(fileData, "zip"));

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

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

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

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

import com.aspose.slides.*;
import java.nio.file.Files;
import java.nio.file.Paths;

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

// إضافة صورة إلى موارد العرض.
byte[] imageData = Files.readAllBytes(Paths.get("image.png"));
IPPImage oleImage = presentation.getImages().addImage(imageData);

// تعيين عنوان والصورة لمعاينة OLE.
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 يحدث البيانات من الكائن المرتبط ويُعيد رسم المعاينة. لمنع PowerPoint من طلب تحديث بيانات الكائن، استدعِ طريقة setUpdateAutomatic لواجهة IOleObjectFrame مع القيمة false:

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);

oleFrame.setUpdateAutomatic(false);

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

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

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

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

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

import com.aspose.slides.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

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();

        Path filePath = Paths.get("OLE_object_" + index + fileExtension);
        Files.write(filePath, fileData);
    }
}

presentation.dispose();

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

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

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

كيف يمكنني قفل كائن OLE على شريحة بحيث لا يستطيع المستخدمون تحريكه/تعديله في PowerPoint؟
قفل الشكل: Aspose.Slides يقدم قفل على مستوى الشكل. هذا ليس تشفيرًا ولكن يمنع التعديلات والتحريك غير المقصود.

لماذا “يقفز” كائن Excel المرتبط أو يتغيّر حجمه عندما أفتح العرض؟
قد يقوم PowerPoint بتحديث معاينة OLE المرتبط. للحصول على مظهر ثابت، اتبع ممارسات Working Solution for Worksheet Resizing – إما ضبط الإطار ليتناسب مع النطاق، أو تحجيم النطاق إلى إطار ثابت وتعيين صورة بديلة مناسبة.

هل سيتم الحفاظ على المسارات النسبية لكائنات OLE المرتبطة في تنسيق PPTX؟
في PPTX، لا تتوفر معلومات “المسار النسبي” – فقط المسار الكامل. تُوجد المسارات النسبية في تنسيق PPT الأقدم. للانتقال السلس، يفضَّل استخدام مسارات مطلقة موثوقة/URI قابلة للوصول أو دمج الملفات.