จัดการ OLE ในการนำเสนอโดยใช้ JavaScript

บทนำ

ลองพิจารณากราฟที่สร้างใน MS Excel แล้วนำกราฟนั้นใส่ลงในสไลด์ PowerPoint กราฟ Excel นี้ถือเป็นวัตถุ OLE

  • วัตถุ OLE อาจปรากฏเป็นไอคอน ในกรณีนี้เมื่อคุณคลิกสองครั้งที่ไอคอน กราฟจะเปิดในแอปพลิเคชันที่เกี่ยวข้อง (Excel) หรือระบบจะให้คุณเลือกแอปพลิเคชันสำหรับเปิดหรือแก้ไขวัตถุ
  • วัตถุ OLE อาจแสดงเนื้อหาจริง เช่น เนื้อหาของกราฟ ในกรณีนี้กราฟจะทำงานใน PowerPoint อินเทอร์เฟซของกราฟจะโหลดและคุณสามารถแก้ไขข้อมูลของกราฟภายใน PowerPoint ได้

Aspose.Slides for Node.js via Java ช่วยให้คุณแทรกวัตถุ OLE ลงในสไลด์เป็นกรอบวัตถุ OLE (OleObjectFrame)

การเพิ่มกรอบวัตถุ OLE ลงในสไลด์

สมมติว่าคุณได้สร้างกราฟใน Microsoft Excel แล้วต้องการฝังลงในสไลด์เป็นกรอบวัตถุ OLE ด้วย Aspose.Slides for Node.js via Java คุณสามารถทำได้ดังนี้

  1. สร้างอินสแตนซ์ของคลาส Presentation
  2. เรียกอ้างอิงสไลด์ผ่านดัชนีของมัน
  3. อ่านไฟล์ Excel เป็นอาร์เรย์ไบต์
  4. เพิ่ม OleObjectFrame ลงในสไลด์โดยใช้ไบต์อาร์เรย์และข้อมูลอื่น ๆ ของวัตถุ OLE
  5. บันทึกพรีเซนเทชันที่แก้ไขเป็นไฟล์ PPTX

ในตัวอย่างด้านล่าง เราได้เพิ่มกราฟจากไฟล์ Excel ลงในสไลด์เป็นกรอบวัตถุ OLE ด้วย Aspose.Slides for Node.js via Java
Note ว่า constructor ของ OleEmbeddedDataInfo รับส่วนขยายของวัตถุที่สามารถฝังได้เป็นพารามิเตอร์ที่สอง ส่วนขยายนี้ทำให้ PowerPoint สามารถตีความประเภทไฟล์ได้อย่างถูกต้องและเลือกแอปพลิเคชันที่เหมาะสมเพื่อเปิดวัตถุ OLE นี้

var presentation = new asposeSlides.Presentation();
var slideSize = presentation.getSlideSize().getSize();
var slide = presentation.getSlides().get_Item(0);

// เตรียมข้อมูลสำหรับวัตถุ OLE.
var oleStream = fs.readFileSync("book.xlsx");
var fileData = Array.from(oleStream);
var dataInfo = new asposeSlides.OleEmbeddedDataInfo(java.newArray("byte", fileData), "xlsx");

// เพิ่มกรอบวัตถุ OLE ไปยังสไลด์.
slide.getShapes().addOleObjectFrame(0, 0, slideSize.getWidth(), slideSize.getHeight(), dataInfo);

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

การเพิ่มกรอบวัตถุ OLE ที่เชื่อมโยง

Aspose.Slides for Node.js via Java อนุญาตให้คุณเพิ่ม OleObjectFrame โดยไม่ต้องฝังข้อมูล แต่เพียงแค่เชื่อมโยงไปยังไฟล์เท่านั้น

โค้ด JavaScript นี้แสดงวิธีการเพิ่ม OleObjectFrame ที่เชื่อมโยงไฟล์ Excel ไปยังสไลด์:

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

// เพิ่มกรอบวัตถุ OLE พร้อมไฟล์ Excel ที่เชื่อมโยง.
slide.getShapes().addOleObjectFrame(20, 20, 200, 150, "Excel.Sheet.12", "book.xlsx");

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

การเข้าถึงกรอบวัตถุ OLE

หากวัตถุ OLE ถูกฝังไว้ในสไลด์แล้ว คุณสามารถค้นหาหรือเข้าถึงได้ง่าย ๆ ดังนี้

  1. โหลดพรีเซนเทชันที่มีวัตถุ OLE ฝังอยู่โดยสร้างอินสแตนซ์ของคลาส Presentation
  2. เรียกอ้างอิงสไลด์โดยใช้ดัชนีของมัน
  3. เข้าถึง shape ของ OleObjectFrame ในตัวอย่างของเราจะใช้ PPTX ที่สร้างไว้ก่อนหน้านี้ซึ่งมี shape เพียงอันเดียวบนสไลด์แรก
  4. เมื่อเข้าถึงกรอบวัตถุ OLE แล้ว คุณสามารถดำเนินการใด ๆ กับมันได้

ในตัวอย่างด้านล่าง เราเข้าถึงกรอบวัตถุ OLE (วัตถุกราฟ Excel ที่ฝังอยู่ในสไลด์) พร้อมกับข้อมูลไฟล์ของมัน

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

if (java.instanceOf(shape, "com.aspose.slides.OleObjectFrame")) {
    var oleFrame = shape;
    
    // รับข้อมูลไฟล์ที่ฝังไว้.
    var fileData = oleFrame.getEmbeddedData().getEmbeddedFileData();

    // รับส่วนขยายของไฟล์ที่ฝังไว้.
    var fileExtension = oleFrame.getEmbeddedData().getEmbeddedFileExtension();

    // ...
}

การเข้าถึงคุณสมบัติของกรอบวัตถุ OLE ที่เชื่อมโยง

Aspose.Slides อนุญาตให้คุณเข้าถึงคุณสมบัติของกรอบวัตถุ OLE ที่เชื่อมโยง

โค้ด JavaScript นี้แสดงวิธีการตรวจสอบว่าวัตถุ OLE ถูกเชื่อมโยงหรือไม่และรับพาธของไฟล์ที่เชื่อมโยง:

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

if (java.instanceOf(shape, "com.aspose.slides.OleObjectFrame")) {
    var oleFrame = shape;

    // ตรวจสอบว่าวัตถุ OLE ถูกเชื่อมโยงหรือไม่.
    if (oleFrame.isObjectLink()) {
        // พิมพ์พาธเต็มของไฟล์ที่เชื่อมโยง.
        console.log("OLE object frame is linked to:", oleFrame.getLinkPathLong());

        // พิมพ์พาธสัมพัทธ์ของไฟล์ที่เชื่อมโยงหากมี.
        // เฉพาะการนำเสนอ PPT เท่านั้นที่สามารถมีพาธสัมพัทธ์ได้.
        if (oleFrame.getLinkPathRelative() != null && oleFrame.getLinkPathRelative() != "") {
            console.log("OLE object frame relative path:", oleFrame.getLinkPathRelative());
        }
    }
}

presentation.dispose();

การเปลี่ยนแปลงข้อมูลของวัตถุ OLE

หากวัตถุ OLE ถูกฝังไว้ในสไลด์แล้ว คุณสามารถเข้าถึงวัตถุและแก้ไขข้อมูลของมันได้ดังนี้

  1. โหลดพรีเซนเทชันที่มีวัตถุ OLE ฝังอยู่โดยสร้างอินสแตนซ์ของคลาส Presentation
  2. เรียกอ้างอิงสไลด์ผ่านดัชนีของมัน
  3. เข้าถึง shape ของกรอบวัตถุ OLE ในตัวอย่างของเราจะใช้ PPTX ที่สร้างไว้ก่อนหน้านี้ซึ่งมี shape หนึ่งอันบนสไลด์แรก
  4. หลังจากเข้าถึงกรอบวัตถุ OLE แล้ว คุณสามารถดำเนินการใด ๆ กับมันได้
  5. สร้างอ็อบเจกต์ Workbook แล้วเข้าถึงข้อมูล OLE
  6. เข้าถึง Worksheet ที่ต้องการและแก้ไขข้อมูล
  7. บันทึก Workbook ที่อัปเดตเป็นสตรีม
  8. เปลี่ยนข้อมูลวัตถุ OLE จากสตรีม

ในตัวอย่างด้านล่าง เราเข้าถึงกรอบวัตถุ OLE (วัตถุกราฟ Excel ที่ฝังอยู่ในสไลด์) แล้วแก้ไขข้อมูลไฟล์ของมันเพื่ออัปเดตข้อมูลกราฟ

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

if (java.instanceOf(shape, "com.aspose.slides.OleObjectFrame")) {
    var oleFrame = shape;

    var oleStream = java.newInstanceSync("java.io.ByteArrayInputStream", oleFrame.getEmbeddedData().getEmbeddedFileData());

    // อ่านข้อมูลวัตถุ OLE เป็นอ็อบเจกต์ Workbook.
    var workbook = java.newInstanceSync("Workbook", oleStream);

    var newOleStream = java.newInstanceSync("java.io.ByteArrayOutputStream");

    // แก้ไขข้อมูลของ workbook.
    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);

    var fileOptions = java.newInstanceSync("OoxmlSaveOptions", java.getStaticFieldValue("com.aspose.cells.SaveFormat", "XLSX"));
    workbook.save(newOleStream, fileOptions);

    // เปลี่ยนข้อมูลอ็อบเจกต์ของกรอบ OLE.
    var newData = new asposeSlides.OleEmbeddedDataInfo(newOleStream.toByteArray(), oleFrame.getEmbeddedData().getEmbeddedFileExtension());
    oleFrame.setEmbeddedData(newData);

    newOleStream.close();
    oleStream.close();
}

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

การฝังไฟล์ประเภทอื่นในสไลด์

นอกจากกราฟ Excel แล้ว Aspose.Slides for Node.js via Java ยังรองรับการฝังไฟล์ประเภทอื่น ๆ ลงในสไลด์ เช่น คุณสามารถแทรกไฟล์ HTML, PDF และ ZIP เป็นวัตถุ เมื่อผู้ใช้คลิกสองครั้งบนวัตถุที่แทรกไว้ ระบบจะเปิดไฟล์โดยอัตโนมัติในโปรแกรมที่เกี่ยวข้อง หรือจะแจ้งให้ผู้ใช้เลือกโปรแกรมที่เหมาะสมเพื่อเปิดไฟล์

โค้ด JavaScript นี้แสดงวิธีการฝัง HTML และ ZIP ลงในสไลด์:

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

var htmlBuffer = fs.readFileSync("sample.html");
var htmlData = Array.from(htmlBuffer);
var htmlDataInfo = new asposeSlides.OleEmbeddedDataInfo(java.newArray("byte", htmlData), "html");
var htmlOleFrame = slide.getShapes().addOleObjectFrame(150, 120, 50, 50, htmlDataInfo);
htmlOleFrame.setObjectIcon(true);

var zipBuffer = fs.readFileSync("sample.zip");
var zipData = Array.from(zipBuffer);
var zipDataInfo = new asposeSlides.OleEmbeddedDataInfo(java.newArray("byte", zipData), "zip");
var zipOleFrame = slide.getShapes().addOleObjectFrame(150, 220, 50, 50, zipDataInfo);
zipOleFrame.setObjectIcon(true);

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

การกำหนดประเภทไฟล์สำหรับวัตถุที่ฝังไว้

เมื่อต้องทำงานกับพรีเซนเทชัน บางครั้งคุณอาจต้องการแทนที่วัตถุ OLE เก่าโดยวัตถุใหม่ หรือแทนที่วัตถุ OLE ที่ไม่รองรับด้วยวัตถุที่รองรับ Aspose.Slides for Node.js via Java ให้คุณกำหนดประเภทไฟล์สำหรับวัตถุที่ฝังไว้ได้ เพื่อให้คุณสามารถอัปเดตข้อมูลเฟรม OLE หรือส่วนขยายของมัน

โค้ด JavaScript นี้แสดงวิธีการตั้งค่าประเภทไฟล์สำหรับวัตถุ OLE ที่ฝังเป็น zip:

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

var fileExtension = oleFrame.getEmbeddedData().getEmbeddedFileExtension();
var oleFileData = oleFrame.getEmbeddedData().getEmbeddedFileData();

console.log("Current embedded file extension is:", fileExtension);

// เปลี่ยนประเภทไฟล์เป็น ZIP.
var fileData = java.newArray("byte", Array.from(oleFileData));
oleFrame.setEmbeddedData(new asposeSlides.OleEmbeddedDataInfo(fileData, "zip"));

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

การกำหนดรูปไอคอนและชื่อเรื่องสำหรับวัตถุที่ฝังไว้

หลังจากฝังวัตถุ OLE แล้ว ระบบจะเพิ่มภาพตัวอย่างที่เป็นไอคอนโดยอัตโนมัติ ภาพตัวอย่างนี้คือสิ่งที่ผู้ใช้เห็นก่อนจะเข้าถึงหรือเปิดวัตถุ OLE หากคุณต้องการใช้รูปภาพและข้อความเฉพาะเป็นส่วนประกอบของภาพตัวอย่าง คุณสามารถตั้งค่ารูปไอคอนและชื่อเรื่องได้โดยใช้ Aspose.Slides for Node.js via Java

โค้ด JavaScript นี้แสดงวิธีการตั้งค่ารูปไอคอนและชื่อเรื่องสำหรับวัตถุที่ฝังไว้:

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

// เพิ่มรูปภาพไปยังทรัพยากรของพรีเซนเทชัน.
var image = asposeSlides.Images.fromFile("image.png");
var oleImage = presentation.getImages().addImage(image);
image.dispose();

// กำหนดชื่อและรูปภาพสำหรับตัวอย่าง OLE.
oleFrame.setSubstitutePictureTitle("My title");
oleFrame.getSubstitutePictureFormat().getPicture().setImage(oleImage);
oleFrame.setObjectIcon(true);

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

ป้องกันไม่ให้กรอบวัตถุ OLE ถูกปรับขนาดและตำแหน่งอัตโนมัติ

หลังจากที่คุณเพิ่มวัตถุ OLE ที่เชื่อมโยงลงในสไลด์พรีเซนเทชัน เมื่อเปิดพรีเซนเทชันใน PowerPoint อาจแสดงข้อความให้คุณอัปเดตลิงก์ การคลิกปุ่ม “Update Links” อาจทำให้กรอบวัตถุ OLE เปลี่ยนขนาดและตำแหน่ง เนื่องจาก PowerPoint อัปเดตข้อมูลจากวัตถุ OLE ที่เชื่อมโยงและรีเฟรชภาพตัวอย่าง เพื่อป้องกันไม่ให้ PowerPoint ตั้งค่าการอัปเดตข้อมูลอัตโนมัติ ให้ใช้เมธอด setUpdateAutomatic ของคลาส OleObjectFrame โดยกำหนดค่าเป็น false:

oleFrame.setUpdateAutomatic(false);

การสกัดไฟล์ที่ฝังไว้

Aspose.Slides for Node.js via Java ให้คุณสกัดไฟล์ที่ฝังอยู่ในสไลด์เป็นวัตถุ OLE ได้ดังนี้

  1. สร้างอินสแตนซ์ของคลาส Presentation ที่มีวัตถุ OLE ที่ต้องการสกัด
  2. วนลูปผ่าน shape ทั้งหมดในพรีเซนเทชันและเข้าถึง shape ของ OleObjectFrame
  3. เข้าถึงข้อมูลไฟล์ที่ฝังอยู่จากกรอบวัตถุ OLE แล้วบันทึกลงดิสก์

โค้ด JavaScript นี้แสดงวิธีการสกัดไฟล์ที่ฝังอยู่ในสไลด์เป็นวัตถุ OLE:

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

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

    if (java.instanceOf(shape, "com.aspose.slides.OleObjectFrame")) {
        var oleFrame = shape;

        var fileData = oleFrame.getEmbeddedData().getEmbeddedFileData();
        var fileExtension = oleFrame.getEmbeddedData().getEmbeddedFileExtension();

        var filePath = "OLE_object_" + index + fileExtension;
        fs.writeFileSync(filePath, Buffer.from(fileData));
    }
}

presentation.dispose();

FAQ

เนื้อหา OLE จะถูกเรนเดอร์เมื่อส่งออกสไลด์เป็น PDF/รูปภาพหรือไม่?

สิ่งที่มองเห็นบนสไลด์จะถูกเรนเดอร์ — คือไอคอนหรือภาพตัวอย่าง (preview) เนื้อหา OLE แบบ “สด” จะไม่ถูกประมวลผลระหว่างการเรนเดอร์ หากต้องการ ให้ตั้งค่ารูปภาพตัวอย่างของคุณเองเพื่อให้ได้ลักษณะที่ต้องการใน PDF ที่ส่งออก

ทำอย่างไรจึงจะล็อกวัตถุ OLE บนสไลด์เพื่อให้ผู้ใช้ไม่สามารถย้ายหรือแก้ไขมันใน PowerPoint?

ล็อก shape: Aspose.Slides มีการล็อกระดับ shape ซึ่งไม่ใช่การเข้ารหัส แต่ช่วยป้องกันการแก้ไขและการย้ายโดยไม่ได้ตั้งใจ

เส้นทางสัมพัทธ์ของวัตถุ OLE ที่เชื่อมโยงจะถูกเก็บไว้ในรูปแบบ PPTX หรือไม่?

ใน PPTX ข้อมูล “เส้นทางสัมพัทธ์” ไม่ได้มีอยู่ — มีเพียงเส้นทางเต็มเท่านั้น เส้นทางสัมพัทธ์พบได้ในรูปแบบไฟล์ PPT เก่า ๆ สำหรับความพกพา ควรใช้เส้นทางแน่นอนที่เชื่อถือได้หรือ URI ที่เข้าถึงได้ หรือฝังไฟล์ไว้เลย