Spravovat OLE v prezentacích pomocí PHP

Úvod

Zvažte graf vytvořený v MS Excel. Tento graf je poté umístěn do snímku PowerPointu. Tento excelový graf se považuje za OLE objekt.

  • OLE objekt se může zobrazovat jako ikona. V takovém případě, když dvojitě kliknete na ikonu, otevře se graf v příslušné aplikaci (Excel) nebo budete vyzváni k výběru aplikace pro otevření či úpravu objektu.
  • OLE objekt může zobrazovat svůj skutečný obsah, například obsah grafu. V tomto případě se graf aktivuje v PowerPointu, načte se rozhraní grafu a můžete upravovat data grafu přímo v PowerPointu.

Aspose.Slides for PHP via Java vám umožňuje vložit OLE objekty do snímků jako OLE objektové rámečky (OleObjectFrame).

Přidání OLE objektových rámců do snímků

Předpokládejme, že jste již vytvořili graf v Microsoft Excel a chcete jej vložit do snímku jako OLE objektový rámec pomocí Aspose.Slides for PHP via Java, můžete to provést takto:

  1. Vytvořte instanci třídy Presentation.
  2. Získejte odkaz na snímek pomocí jeho indexu.
  3. Přečtěte Excel soubor jako pole bajtů.
  4. Přidejte OleObjectFrame do snímku s polem bajtů a dalšími informacemi o OLE objektu.
  5. Uložte upravenou prezentaci jako soubor PPTX.

V níže uvedeném příkladu jsme přidali graf ze souboru Excel do snímku jako OLE objektový rámec pomocí Aspose.Slides for PHP via Java.
Poznámka: konstruktor OleEmbeddedDataInfo přijímá jako druhý parametr příponu vkládaného objektu. Tato přípona umožňuje PowerPointu správně rozpoznat typ souboru a zvolit správnou aplikaci pro otevření tohoto OLE objektu.

$presentation = new Presentation();
$slideSize = $presentation->getSlideSize()->getSize();
$slide = $presentation->getSlides()->get_Item(0);

// Prepare data for the OLE object.
$fileData = file_get_contents("book.xlsx");
$dataInfo = new OleEmbeddedDataInfo($fileData, "xlsx");

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

$presentation->save("output.pptx", SaveFormat::Pptx);
$presentation->dispose();

Přidání propojených OLE objektových rámců

Aspose.Slides for PHP via Java vám umožňuje přidat OleObjectFrame bez vkládání dat, pouze s odkazem na soubor.

Tento PHP kód ukazuje, jak přidat OleObjectFrame s propojeným Excel souborem do snímku:

$presentation = new Presentation();
$slide = $presentation->getSlides()->get_Item(0);

// Přidat OLE objektový rámec s propojeným souborem Excel.
$slide->getShapes()->addOleObjectFrame(20, 20, 200, 150, "Excel.Sheet.12", "book.xlsx");

$presentation->save("output.pptx", SaveFormat::Pptx);
$presentation->dispose();

Přístup k OLE objektovým rámcům

Pokud je OLE objekt již vložen do snímku, můžete jej snadno najít nebo získat přístup tímto způsobem:

  1. Načtěte prezentaci s vloženým OLE objektem vytvořením instance třídy Presentation.
  2. Získejte odkaz na snímek pomocí jeho indexu.
  3. Získejte tvar OleObjectFrame. V našem příkladu jsme použili dříve vytvořený PPTX, který má na prvním snímku pouze jeden tvar.
  4. Jakmile je OLE objektový rámec získán, můžete s ním provádět libovolné operace.

V níže uvedeném příkladu je přistoupeno k OLE objektovému rámci (excelovému grafu vloženému do snímku) a k jeho souborovým datům.

$presentation = new Presentation("sample.pptx");
$slide = $presentation->getSlides()->get_Item(0);
$shape = $slide->getShapes()->get_Item(0);

if (java_instanceof($shape, new JavaClass("com.aspose.slides.OleObjectFrame"))) {
    $oleFrame = $shape;
    
    // Získat data vloženého souboru.
    $fileData = $oleFrame->getEmbeddedData()->getEmbeddedFileData();

    // Získat příponu vloženého souboru.
    $fileExtension = $oleFrame->getEmbeddedData()->getEmbeddedFileExtension();

    // ...
}

Přístup k vlastnostem propojeného OLE objektového rámce

Aspose.Slides vám umožňuje přistupovat k vlastnostem propojených OLE objektových rámců.

Tento PHP kód ukazuje, jak zkontrolovat, zda je OLE objekt propojen, a poté získat cestu k propojenému souboru:

$presentation = new Presentation("sample.ppt");
$slide = $presentation->getSlides()->get_Item(0);
$shape = $slide->getShapes()->get_Item(0);

if (java_instanceof($shape, new JavaClass("com.aspose.slides.OleObjectFrame"))) {
    $oleFrame = $shape;

    // Zkontrolovat, zda je OLE objekt propojen.
    if (java_values($oleFrame->isObjectLink()) != 0) {
        // Vytisknout úplnou cestu k propojenému souboru.
        echo "OLE object frame is linked to: " . $oleFrame->getLinkPathLong() . PHP_EOL;

        // Vytisknout relativní cestu k propojenému souboru, pokud existuje.
        // Pouze prezentace PPT mohou obsahovat relativní cestu.
        $relativePath = java_values($oleFrame->getLinkPathRelative());
        if (!is_null($relativePath) && $relativePath !== "") {
            echo "OLE object frame relative path: " . $oleFrame->getLinkPathRelative() . PHP_EOL;
        }
    }
}

$presentation->dispose();

Změna dat OLE objektu

Pokud je OLE objekt již vložen do snímku, můžete jej snadno získat a upravit jeho data tímto způsobem:

  1. Načtěte prezentaci s vloženým OLE objektem vytvořením instance třídy Presentation.
  2. Získejte odkaz na snímek pomocí jeho indexu.
  3. Získejte tvar OleObjectFrame. V našem příkladu jsme použili dříve vytvořený PPTX, který má na prvním snímku jeden tvar.
  4. Jakmile je OLE objektový rámec získán, můžete s ním provádět libovolné operace.
  5. Vytvořte objekt Workbook a získejte přístup k OLE datům.
  6. Získejte požadovaný Worksheet a upravte data.
  7. Uložte aktualizovaný Workbook do proudu.
  8. Změňte data OLE objektu z proudu.

V níže uvedeném příkladu je přistoupeno k OLE objektovému rámci (excelovému grafu vloženému do snímku) a jeho souborová data jsou upravena tak, aby aktualizovala data grafu.

$presentation = new Presentation("sample.pptx");
$slide = $presentation->getSlides()->get_Item(0);
$shape = $slide->getShapes()->get_Item(0);

if (java_instanceof($shape, new JavaClass("com.aspose.slides.OleObjectFrame"))) {
    $oleFrame = $shape;

    $oleStream = new ByteArrayInputStream($oleFrame->getEmbeddedData()->getEmbeddedFileData());

    // Načíst data OLE objektu jako objekt Workbook.
    $workbook = new Workbook($oleStream);

    $newOleStream = new Java("java.io.ByteArrayOutputStream");

    // Upravit data sešitu.
    $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);

    $fileOptions = new OoxmlSaveOptions(SaveFormat::XLSX);
    $workbook->save($newOleStream, $fileOptions);

    // Změnit data objektu OLE rámce.
    $newData = new OleEmbeddedDataInfo($newOleStream->toByteArray(), $oleFrame->getEmbeddedData()->getEmbeddedFileExtension());
    $oleFrame->setEmbeddedData($newData);

    $newOleStream->close();
    $oleStream->close();
}

$presentation->save("output.pptx", SaveFormat::Pptx);
$presentation->dispose();

Vkládání dalších typů souborů do snímků

Kromě excelových grafů vám Aspose.Slides for PHP via Java umožňuje vložit do snímků i další typy souborů. Například můžete vložit HTML, PDF a ZIP soubory jako objekty. Když uživatel dvojitě klikne na vložený objekt, otevře se automaticky v příslušném programu nebo je uživatel vyzván k výběru vhodného programu pro jeho otevření.

Tento PHP kód ukazuje, jak vložit HTML a ZIP do snímku:

$presentation = new Presentation("sample.pptx");
$slide = $presentation->getSlides()->get_Item(0);

$htmlData = file_get_contents("sample.html");
$htmlDataInfo = new OleEmbeddedDataInfo($htmlData, "html");
$htmlOleFrame = $slide->getShapes()->addOleObjectFrame(150, 120, 50, 50, $htmlDataInfo);
$htmlOleFrame->setObjectIcon(true);

$zipData = file_get_contents("sample.zip");
$zipDataInfo = new OleEmbeddedDataInfo($zipData, "zip");
$zipOleFrame = $slide->getShapes()->addOleObjectFrame(150, 220, 50, 50, $zipDataInfo);
$zipOleFrame->setObjectIcon(true);

$presentation->save("output.pptx", SaveFormat::Pptx);
$presentation->dispose();

Nastavení typů souborů pro vložené objekty

Při práci s prezentacemi může nastat potřeba nahradit staré OLE objekty novými nebo nahradit nepodporovaný OLE objekt podporovaným. Aspose.Slides for PHP via Java vám umožňuje nastavit typ souboru pro vložený objekt, což vám umožní aktualizovat data OLE rámce nebo jeho příponu.

Tento PHP kód ukazuje, jak nastavit typ souboru pro vložený OLE objekt na zip:

$presentation = new Presentation("sample.pptx");
$slide = $presentation->getSlides()->get_Item(0);
$oleFrame = $slide->getShapes()->get_Item(0);

$fileExtension = $oleFrame->getEmbeddedData()->getEmbeddedFileExtension();
$fileData = $oleFrame->getEmbeddedData()->getEmbeddedFileData();

echo "Current embedded file extension is: " . $fileExtension . PHP_EOL;

// Změnit typ souboru na ZIP.
$oleFrame->setEmbeddedData(new OleEmbeddedDataInfo($fileData, "zip"));

$presentation->save("output.pptx", SaveFormat::Pptx);
$presentation->dispose();

Nastavení ikonových obrázků a titulků pro vložené objekty

Po vložení OLE objektu se automaticky přidá náhled sestávající z ikony. Tento náhled vidí uživatelé, než otevřou nebo získají přístup k OLE objektu. Pokud chcete použít konkrétní obrázek a text jako součásti náhledu, můžete nastavit ikonu a titulek pomocí Aspose.Slides for PHP via Java.

Tento PHP kód ukazuje, jak nastavit ikonu a titulek pro vložený objekt:

$presentation = new Presentation("sample.pptx");
$slide = $presentation->getSlides()->get_Item(0);
$oleFrame = $slide->getShapes()->get_Item(0);

// Přidat obrázek do zdrojů prezentace.
$imageData = file_get_contents("image.png");
$oleImage = $presentation->getImages()->addImage($imageData);

$oleFrame->setSubstitutePictureTitle("My title");
$oleFrame->getSubstitutePictureFormat()->getPicture()->setImage($oleImage);
$oleFrame->setObjectIcon(true);

$presentation->save("output.pptx", SaveFormat::Pptx);
$presentation->dispose();

Zabránit změně velikosti a pozice OLE objektového rámce

Po přidání propojeného OLE objektu do snímku prezentace se při otevření v PowerPointu může zobrazit zpráva s výzvou k aktualizaci odkazů. Kliknutí na tlačítko „Update Links“ může změnit velikost a pozici OLE objektového rámce, protože PowerPoint aktualizuje data z propojeného OLE objektu a obnovuje náhled. Aby PowerPoint nevyzýval k aktualizaci dat objektu, nastavte metodu setUpdateAutomatic třídy OleObjectFrame na false:

$oleFrame->setUpdateAutomatic(false);

Extrahování vložených souborů

Aspose.Slides for PHP via Java vám umožňuje extrahovat soubory vložené do snímků jako OLE objekty tímto způsobem:

  1. Vytvořte instanci třídy Presentation obsahující OLE objekty, které chcete extrahovat.
  2. Projděte všechny tvary v prezentaci a získejte tvary typu OLEObjectFrame.
  3. Získejte data vložených souborů z OLE objektových rámců a zapište je na disk.

Tento PHP kód ukazuje, jak extrahovat soubory vložené do snímku jako OLE objekty:

$presentation = new Presentation("sample.pptx");
$slide = $presentation->getSlides()->get_Item(0);

$shapeCount = java_values($slide->getShapes()->size());
for ($index = 0; $index < $shapeCount; $index++) {
    $shape = $slide->getShapes()->get_Item($index);

    if (java_instanceof($shape, new JavaClass("com.aspose.slides.OleObjectFrame"))) {
        $oleFrame = $shape;

        $fileData = $oleFrame->getEmbeddedData()->getEmbeddedFileData();
        $fileExtension = $oleFrame->getEmbeddedData()->getEmbeddedFileExtension();

        $filePath = "OLE_object_" . $index . $fileExtension;
        file_put_contents($filePath, $fileData);
    }
}

$presentation->dispose();

FAQ

Bude OLE obsah renderován při exportu snímků do PDF/obrázků?

Co je na snímku viditelné, je renderováno — ikona/náhradní obrázek (náhled). „Živý“ OLE obsah se během renderování nespouští. V případě potřeby nastavte vlastní obrázek náhledu, aby se v exportovaném PDF zobrazoval očekávaný vzhled.

Jak mohu uzamknout OLE objekt na snímku, aby jej uživatelé nemohli v PowerPointu přesouvat/upravovat?

Uzamkněte tvar: Aspose.Slides poskytuje zamykání na úrovni tvaru. Není to šifrování, ale efektivně zabraňuje neúmyslným úpravám a přesunům.

Zůstanou relativní cesty pro propojené OLE objekty zachovány ve formátu PPTX?

V PPTX nejsou informace o „relativní cestě“ k dispozici — existuje jen úplná cesta. Relativní cesty jsou k dispozici jen ve starším formátu PPT. Pro přenositelnost upřednostňujte spolehlivé absolutní cesty/přístupné URI nebo vložení.