إدارة OLE في العروض التقديمية باستخدام Java
تخيل مخططًا تم إنشاؤه في MS Excel. ثم يتم وضع هذا المخطط داخل شريحة PowerPoint. يُعتبر هذا المخطط في Excel كائن OLE.
- قد يظهر كائن OLE كأيقونة. في هذه الحالة، عند النقر المزدوج على الأيقونة، يفتح المخطط في التطبيق المرتبط به (Excel)، أو يُطلب منك اختيار تطبيق لفتح أو تحرير الكائن.
- قد يعرض كائن OLE محتواه الفعلي، مثل محتويات المخطط. في هذه الحالة، يتم تنشيط المخطط في PowerPoint، يُحمَّل واجهة المخطط، وتتمكن من تعديل بيانات المخطط داخل PowerPoint.
Aspose.Slides for Java يتيح لك إدراج كائنات OLE في الشرائح كإطارات كائن OLE (OleObjectFrame).
إضافة إطارات كائن OLE إلى الشرائح
افترض أنك قد أنشأت مخططًا في Microsoft Excel وتريد دمجه في شريحة كإطار كائن OLE باستخدام Aspose.Slides for Java، يمكنك فعل ذلك بهذه الطريقة:
- إنشاء مثيل من فئة Presentation .
- الحصول على مرجع الشريحة عبر فهرستها.
- قراءة ملف Excel كمصفوفة بايت.
- إضافة الـOleObjectFrame إلى الشريحة مع مصفوفة البايت والمعلومات الأخرى حول كائن OLE.
- حفظ العرض المعدل كملف PPTX.
في المثال أدناه، أضفنا مخططًا من ملف Excel إلى شريحة كإطار كائن OLE باستخدام Aspose.Slides for Java.
ملاحظة أن مُنشئ الـOleEmbeddedDataInfo يأخذ امتداد الكائن القابل للإدراج كمعامل ثانٍ. يتيح هذا الامتداد لـPowerPoint تفسير نوع الملف بشكل صحيح واختيار التطبيق المناسب لفتح كائن OLE هذا.
Presentation presentation = new Presentation();
Dimension2D slideSize = presentation.getSlideSize().getSize();
ISlide slide = presentation.getSlides().get_Item(0);
// إعداد البيانات لكائن OLE.
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 مرتبط إلى شريحة:
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 قد تم إدراجه بالفعل في شريحة، يمكنك العثور عليه أو الوصول إليه بسهولة بهذه الطريقة:
- تحميل عرض يحتوي على كائن OLE المدمج بإنشاء مثيل من فئة Presentation .
- الحصول على مرجع الشريحة باستخدام فهرستها.
- الوصول إلى شكل OleObjectFrame.
في مثالنا، استخدمنا ملف PPTX الذي أنشأناه مسبقًا والذي يحتوي على شكل واحد فقط في الشريحة الأولى. ثم حوّلنا ذلك الكائن إلى IOleObjectFrame. كان هذا هو إطار كائن OLE المطلوب الوصول إليه. - بمجرد الوصول إلى إطار كائن OLE، يمكنك إجراء أي عملية عليه.
في المثال أدناه، يتم الوصول إلى إطار كائن OLE (كائن مخطط Excel مدمج في شريحة) وبيانات ملفه.
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 مرتبطًا ثم الحصول على مسار الملف المرتبط:
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 قد تم إدراجه بالفعل في شريحة، يمكنك بسهولة الوصول إلى ذلك الكائن وتعديل بياناته بهذه الطريقة:
- تحميل عرض يحتوي على كائن OLE المدمج بإنشاء مثيل من فئة Presentation .
- الحصول على مرجع الشريحة عبر فهرستها.
- الوصول إلى شكل إطار كائن OLE.
في مثالنا، استخدمنا ملف PPTX الذي أنشأناه مسبقًا والذي يحتوي على شكل واحد في الشريحة الأولى. ثم حوّلنا ذلك الكائن إلى IOleObjectFrame. كان هذا هو إطار كائن OLE المطلوب الوصول إليه. - بمجرد الوصول إلى إطار كائن OLE، يمكنك إجراء أي عملية عليه.
- إنشاء كائن
Workbookوالوصول إلى بيانات OLE. - الوصول إلى الـ
Worksheetالمطلوب وتعديل البيانات. - حفظ الـ
Workbookالمحدث في تدفق. - تغيير بيانات كائن OLE من التدفق.
في المثال أدناه، تم الوصول إلى إطار كائن OLE (كائن مخطط Excel مدمج في شريحة) وتم تعديل بيانات ملفه لتحديث بيانات المخطط.
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 في شريحة:
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:
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 Java.
هذا الكود Java يوضح لك كيفية تعيين صورة الأيقونة والعنوان لكائن مدمج:
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);
// 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 لأنه يتم تحديث البيانات من كائن OLE المرتبط وتحديث معاينة الكائن. لمنع PowerPoint من طلب تحديث بيانات الكائن، قم بتعيين طريقة setUpdateAutomatic للواجهة IOleObjectFrame إلى false:
oleFrame.setUpdateAutomatic(false);
استخراج الملفات المدمجة
Aspose.Slides for Java يتيح لك استخراج الملفات المدمجة في الشرائح ككائنات OLE بهذه الطريقة:
- إنشاء مثيل من فئة Presentation التي تحتوي على كائنات OLE التي تريد استخراجها.
- المرور على جميع الأشكال في العرض والوصول إلى أشكال OLEObjectFrame.
- استخراج بيانات الملفات المدمجة من إطارات OLE وكتابتها إلى القرص.
هذا الكود Java يوضح لك كيفية استخراج الملفات المدمجة في شريحة ككائنات OLE:
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 المصدَّر.
كيف يمكنني قفل كائن OLE على الشريحة بحيث لا يتمكن المستخدمون من تحريكه/تحريره في PowerPoint؟
قفل الشكل: Aspose.Slides يوفر قفل على مستوى الشكل. هذا ليس تشفيرًا، لكنه يمنع التعديلات والحركات غير المقصودة.
لماذا “ينقلب” كائن Excel المرتبط أو يتغير حجمه عند فتح العرض؟
قد يقوم PowerPoint بتحديث معاينة OLE المرتبط. للحصول على مظهر ثابت، اتبع ممارسات الحل العملي لإعادة تحجيم ورقة العمل – إما ضبط الإطار على النطاق، أو تحجيم النطاق إلى إطار ثابت وتعيين صورة بديلة مناسبة.
هل يتم الحفاظ على المسارات النسبية لكائنات OLE المرتبطة في تنسيق PPTX؟
في PPTX لا تتوفر معلومات “المسار النسبي” — فقط المسار الكامل. تُوجد المسارات النسبية في تنسيق PPT الأقدم. لتحقيق قابلية النقل، يُفضَّل استخدام مسارات مطلقة موثوقة/عناوين URI قابلة للوصول أو الإدراج.