Gérer OLE dans les présentations avec Java

Introduction

Imaginez un graphique créé dans MS Excel. Le graphique est ensuite placé dans une diapositive PowerPoint. Ce graphique Excel est considéré comme un objet OLE.

  • Un objet OLE peut apparaître sous forme d’icône. Dans ce cas, lorsque vous double-cliquez sur l’icône, le graphique s’ouvre dans son application associée (Excel), ou il vous est demandé de sélectionner une application pour ouvrir ou modifier l’objet.
  • Un objet OLE peut afficher son contenu réel, comme le contenu d’un graphique. Dans ce cas, le graphique est activé dans PowerPoint, l’interface du graphique se charge, et vous pouvez modifier les données du graphique directement dans PowerPoint.

Aspose.Slides for Java permet d’insérer des objets OLE dans les diapositives sous forme de cadres d’objet OLE (OleObjectFrame).

Add OLE Object Frames to Slides

En supposant que vous avez déjà créé un graphique dans Microsoft Excel et que vous souhaitez l’intégrer dans une diapositive sous forme de cadre d’objet OLE à l’aide d’Aspose.Slides for Java, vous pouvez procéder ainsi :

  1. Créez une instance de la classe Presentation .
  2. Obtenez la référence d’une diapositive via son indice.
  3. Lisez le fichier Excel sous forme de tableau d’octets.
  4. Ajoutez le OleObjectFrame à la diapositive en fournissant le tableau d’octets et les autres informations concernant l’objet OLE.
  5. Enregistrez la présentation modifiée sous forme de fichier PPTX.

Dans l’exemple ci‑dessous, nous avons ajouté un graphique provenant d’un fichier Excel à une diapositive sous forme de cadre d’objet OLE à l’aide d’Aspose.Slides for Java. Note que le constructeur OleEmbeddedDataInfo accepte une extension d’objet incorporable comme second paramètre. Cette extension permet à PowerPoint d’interpréter correctement le type de fichier et de choisir l’application appropriée pour ouvrir cet objet 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);

// Préparer les données pour l'objet OLE.
byte[] fileData = Files.readAllBytes(Paths.get("book.xlsx"));
IOleEmbeddedDataInfo dataInfo = new OleEmbeddedDataInfo(fileData, "xlsx");

// Ajouter le cadre d'objet OLE à la diapositive.
slide.getShapes().addOleObjectFrame(0, 0, (float)slideSize.getWidth(), (float)slideSize.getHeight(), dataInfo);

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

Add Linked OLE Object Frames

Aspose.Slides for Java vous permet d’ajouter un OleObjectFrame sans incorporer les données, mais uniquement avec un lien vers le fichier.

Ce code Java vous montre comment ajouter un OleObjectFrame avec un fichier Excel lié à une diapositive :

import com.aspose.slides.*;

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

// Ajouter un cadre d'objet OLE avec un fichier Excel lié.
slide.getShapes().addOleObjectFrame(20, 20, 200, 150, "Excel.Sheet.12", "book.xlsx");

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

Access OLE Object Frames

Si un objet OLE est déjà incorporé dans une diapositive, vous pouvez le trouver ou y accéder facilement de cette manière :

  1. Chargez une présentation contenant l’objet OLE incorporé en créant une instance de la classe Presentation .
  2. Obtenez la référence de la diapositive en utilisant son indice.
  3. Accédez à la forme OleObjectFrame. Dans notre exemple, nous avons utilisé le PPTX créé précédemment qui ne comporte qu’une forme sur la première diapositive. Nous avons ensuite casté cet objet en tant que IOleObjectFrame. Il s’agissait du cadre d’objet OLE souhaité à accéder.
  4. Une fois le cadre d’objet OLE accédé, vous pouvez effectuer toute opération dessus.

Dans l’exemple ci‑dessous, un cadre d’objet OLE (un objet graphique Excel incorporé dans une diapositive) et ses données de fichier sont accessibles.

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;
    
    // Obtenir les données du fichier incorporé.
    byte[] fileData = oleFrame.getEmbeddedData().getEmbeddedFileData();

    // Obtenir l'extension du fichier incorporé.
    String fileExtension = oleFrame.getEmbeddedData().getEmbeddedFileExtension();

    // ...
}

Access Linked OLE Object Frame Properties

Aspose.Slides vous permet d’accéder aux propriétés du cadre d’objet OLE lié.

Ce code Java vous montre comment vérifier si un objet OLE est lié, puis obtenir le chemin du fichier lié :

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;

    // Vérifier si l'objet OLE est lié.
    if (oleFrame.isObjectLink()) {
        // Afficher le chemin complet du fichier lié.
        System.out.println("OLE object frame is linked to: " + oleFrame.getLinkPathLong());

        // Afficher le chemin relatif du fichier lié s'il est présent.
        // Seules les présentations PPT peuvent contenir le chemin relatif.
        if (oleFrame.getLinkPathRelative() != null && !oleFrame.getLinkPathRelative().isEmpty()) {
            System.out.println("OLE object frame relative path: " + oleFrame.getLinkPathRelative());
        }
    }
}

presentation.dispose();

Change OLE Object Data

  1. Chargez une présentation contenant l’objet OLE incorporé en créant une instance de la classe Presentation .
  2. Obtenez la référence de la diapositive via son indice.
  3. Accédez à la forme du cadre d’objet OLE. Dans notre exemple, nous avons utilisé le PPTX créé précédemment qui possède une seule forme sur la première diapositive. Nous avons ensuite casté cet objet en tant que IOleObjectFrame. Il s’agissait du cadre d’objet OLE souhaité à accéder.
  4. Une fois le cadre d’objet OLE accédé, vous pouvez effectuer toute opération dessus.
  5. Créez un objet Workbook et accédez aux données OLE.
  6. Accédez à la Worksheet souhaitée et modifiez les données.
  7. Enregistrez le Workbook mis à jour dans un flux.
  8. Modifiez les données de l’objet OLE à partir du flux.

Dans l’exemple ci‑dessus, un cadre d’objet OLE (un objet graphique Excel incorporé dans une diapositive) est accédé, et ses données de fichier sont modifiées afin de mettre à jour les données du graphique.

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

    // Lire les données de l'objet OLE sous forme d'objet Workbook.
    Workbook workbook = new Workbook(oleStream);

    ByteArrayOutputStream newOleStream = new ByteArrayOutputStream();

    // Modifier les données du classeur.
    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);

    // Changer les données de l'objet du cadre OLE.
    IOleEmbeddedDataInfo newData = new OleEmbeddedDataInfo(newOleStream.toByteArray(), oleFrame.getEmbeddedData().getEmbeddedFileExtension());
    oleFrame.setEmbeddedData(newData);
}

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

Embed Other File Types in Slides

Outre les graphiques Excel, Aspose.Slides for Java vous permet d’incorporer d’autres types de fichiers dans les diapositives. Par exemple, vous pouvez insérer des fichiers HTML, PDF et ZIP en tant qu’objets. Lorsqu’un utilisateur double-clique sur l’objet inséré, il s’ouvre automatiquement dans le programme correspondant, ou il est invité à choisir un programme approprié pour l’ouvrir.

Ce code Java vous montre comment incorporer HTML et ZIP dans une diapositive :

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

Set File Types for Embedded Objects

Lors du travail avec des présentations, il peut être nécessaire de remplacer d’anciens objets OLE par de nouveaux ou de remplacer un objet OLE non pris en charge par un objet pris en charge. Aspose.Slides for Java vous permet de définir le type de fichier d’un objet incorporé, ce qui vous permet de mettre à jour les données du cadre OLE ou son extension.

Ce code Java vous montre comment définir le type de fichier d’un objet OLE incorporé sur 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();

Set Icon Images and Titles for Embedded Objects

Après avoir incorporé un objet OLE, un aperçu composé d’une image d’icône est ajouté automatiquement. Cet aperçu est ce que les utilisateurs voient avant d’accéder ou d’ouvrir l’objet OLE. Si vous souhaitez utiliser une image et un texte spécifiques comme éléments de l’aperçu, vous pouvez définir l’image d’icône et le titre à l’aide d’Aspose.Slides for Java.

Ce code Java vous montre comment définir l’image d’icône et le titre d’un objet incorporé :

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

// Ajouter une image aux ressources de la présentation.
byte[] imageData = Files.readAllBytes(Paths.get("image.png"));
IPPImage oleImage = presentation.getImages().addImage(imageData);

// Définir un titre et l'image pour l'aperçu OLE.
oleFrame.setSubstitutePictureTitle("My title");
oleFrame.getSubstitutePictureFormat().getPicture().setImage(oleImage);
oleFrame.setObjectIcon(true);

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

Prevent an OLE Object Frame from Being Resized and Repositioned

Après avoir ajouté un objet OLE lié à une diapositive de présentation, lorsque vous ouvrez la présentation dans PowerPoint, un message vous demandant de mettre à jour les liens peut s’afficher. Cliquer sur le bouton « Update Links » peut modifier la taille et la position du cadre d’objet OLE, car PowerPoint met à jour les données de l’objet OLE lié et rafraîchit l’aperçu de l’objet. Pour empêcher PowerPoint de demander la mise à jour des données de l’objet, appelez la méthode setUpdateAutomatic de l’interface IOleObjectFrame avec 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();

Extract Embedded Files

Aspose.Slides for Java vous permet d’extraire les fichiers incorporés dans les diapositives sous forme d’objets OLE de la manière suivante :

  1. Créez une instance de la classe Presentation contenant les objets OLE que vous souhaitez extraire.
  2. Parcourez toutes les formes de la présentation et accédez aux formes OLEObjectFrame.
  3. Accédez aux données des fichiers incorporés à partir des cadres d’objet OLE et écrivez‑les sur le disque.

Ce code Java vous montre comment extraire les fichiers incorporés dans une diapositive sous forme d’objets 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();

FAQ

Le contenu OLE sera‑t‑il rendu lors de l’exportation des diapositives en PDF/images ?

Ce qui est visible sur la diapositive est rendu — l’icône/l’image de substitution (aperçu). Le contenu OLE « en direct » n’est pas exécuté pendant le rendu. Si nécessaire, définissez votre propre image d’aperçu pour garantir l’apparence attendue dans le PDF exporté.
Pour également conserver le fichier incorporé en tant que pièce jointe PDF, appelez setIncludeOleData avec true. Cette option est désactivée par défaut. Pour un exemple et des instructions pour vérifier la pièce jointe, consultez Preserve Embedded OLE Files as PDF Attachments.

Comment puis‑je verrouiller un objet OLE sur une diapositive afin que les utilisateurs ne puissent pas le déplacer/modifier dans PowerPoint ?

Verrouillez la forme : Aspose.Slides fournit shape-level locks. Ce n’est pas du chiffrement, mais cela empêche effectivement les modifications et déplacements accidentels.

Pourquoi un objet Excel lié « saute »‑t‑il ou change‑t‑il de taille lorsque j’ouvre la présentation ?

PowerPoint peut actualiser l’aperçu de l’OLE lié. Pour une apparence stable, suivez les bonnes pratiques du Working Solution for Worksheet Resizing : ajustez le cadre à la plage, ou redimensionnez la plage à un cadre fixe et définissez une image de substitution appropriée.

Les chemins relatifs pour les objets OLE liés seront‑ils conservés dans le format PPTX ?

Dans le format PPTX, les informations de « chemin relatif » ne sont pas disponibles—seul le chemin complet l’est. Les chemins relatifs existent dans l’ancien format PPT. Pour la portabilité, privilégiez des chemins absolus fiables/URI accessibles ou l’incorporation.