Prezentációs diák renderelése SVG képekként PHP-ben

Áttekintés

Az SVG egy skálázható XML-alapú képfájlformátum, amely jól működik webes közzétételhez, diavetítőkhöz, akadálymentesítési munkafolyamatokhoz és automatikus utófeldolgozáshoz. Az Aspose.Slides minden diát külön SVG-fájlba exportál, és lehetővé teszi a szöveg, betűkészletek, képek és SVG-elemek írásának vezérlését.

Használja a SVGOptions akkor, amikor az exportált SVG-nek kompaktnak, böngészők között kiszámíthatónak vagy interaktív használatra készen kell lennie.

Dia exportálása SVG-ként

Hozzon létre egy Presentation, válasszon ki egy diát, és írja ki egy streambe a Slide.writeAsSvg segítségével. Az alábbi példa a prezentáció minden diáját külön SVG-fájlként exportálja.

$presentation = new Presentation("presentation.pptx");
try {
    $slideCount = java_values($presentation->getSlides()->size());

    for ($slideIndex = 0; $slideIndex < $slideCount; $slideIndex++) {
        $slide = $presentation->getSlides()->get_Item($slideIndex);
        $slideNumber = java_values($slide->getSlideNumber());
        $outputFileName = sprintf("slide-%d.svg", $slideNumber);

        $svgStream = new Java("java.io.FileOutputStream", $outputFileName);
        $slide->writeAsSvg($svgStream);
        $svgStream->close();
    }
} finally {
    $presentation->dispose();
}

A fájlnév a Slide.getSlideNumber értékét használja a ciklusindex helyett. Egyetlen alakzatot is exportálhat a Shape.writeAsSvg segítségével, ha egy diavetítőnek vagy weboldalnak csak az adott alakzatra van szüksége.

SVG kimenet beállítása

A SVGOptions szabályozza az SVG renderelését. Szövegkeretek esetén a SVGOptions.setUseFrameSize a szövegkeretet belefoglalja a renderelési területbe, a SVGOptions.setUseFrameRotation pedig meghatározza, hogy a keret forgatása alkalmazásra kerül-e. Állítsa a SVGOptions.setDisableFontLigatures értékét true-ra, amikor a szöveget ligatúrák nélkül kell megjeleníteni.

$presentation = new Presentation("presentation.pptx");
$svgStream = null;
try {
    $svgOptions = new SVGOptions();
    $svgOptions->setDisableFontLigatures(true);
    $svgOptions->setUseFrameSize(true);
    $svgOptions->setUseFrameRotation(false);

    $slide = $presentation->getSlides()->get_Item(0);
    $svgStream = new Java("java.io.FileOutputStream", "slide-with-custom-options.svg");
    $slide->writeAsSvg($svgStream, $svgOptions);
} finally {
    $svgStream->close();
    $presentation->dispose();
}

Szöveg és betűkészletek vezérlése

Minden szöveg vektorizálása

A SVGOptions.setVectorizeText értékét true-ra állítva a dián lévő összes szöveget vektoros grafikaként írja ki. Ez megszünteti a betűkészlet-függőséget, és a vizuális eredményt egységesebbé teszi a böngészők között, de a szöveg már nem választható vagy kereshető SVG-szövegként.

$presentation = new Presentation("presentation.pptx");
$svgStream = null;
try {
    $svgOptions = new SVGOptions();
    $svgOptions->setVectorizeText(true);

    $slide = $presentation->getSlides()->get_Item(0);
    $svgStream = new Java("java.io.FileOutputStream", "slide-with-vectorized-text.svg");
    $slide->writeAsSvg($svgStream, $svgOptions);
} finally {
    $svgStream->close();
    $presentation->dispose();
}

Válassza ki, hogyan kezelje a külső betűkészleteket

A SVGOptions.setExternalFontsHandling egy SvgExternalFontsHandling értéket használ a külsőleg betöltött betűkészletekhez. Válassza a AddLinksToFontFiles-t, ha külön fájlokra szeretne hivatkozni, az Embed-et, ha a betűkészlet adatot beágyazza az SVG-be, vagy a Vectorize-t, ha csak a külső betűkészleteket használó szöveget grafikaként jeleníti meg. Ellenőrizze a betűkészlet licencelését, mielőtt beágyazná a betűket.

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

    $linkedFontsOptions = new SVGOptions();
    $linkedFontsOptions->setExternalFontsHandling(SvgExternalFontsHandling::AddLinksToFontFiles);
    $linkedFontsStream = new Java("java.io.FileOutputStream", "slide-with-font-links.svg");
    try {
        $slide->writeAsSvg($linkedFontsStream, $linkedFontsOptions);
    } finally {
        $linkedFontsStream->close();
    }

    $embeddedFontsOptions = new SVGOptions();
    $embeddedFontsOptions->setExternalFontsHandling(SvgExternalFontsHandling::Embed);
    $embeddedFontsStream = new Java("java.io.FileOutputStream", "slide-with-embedded-fonts.svg");
    try {
        $slide->writeAsSvg($embeddedFontsStream, $embeddedFontsOptions);
    } finally {
        $embeddedFontsStream->close();
    }

    $vectorizedExternalFontsOptions = new SVGOptions();
    $vectorizedExternalFontsOptions->setExternalFontsHandling(SvgExternalFontsHandling::Vectorize);
    $vectorizedExternalFontsStream = new Java("java.io.FileOutputStream", "slide-with-vectorized-external-fonts.svg");
    try {
        $slide->writeAsSvg($vectorizedExternalFontsStream, $vectorizedExternalFontsOptions);
    } finally {
        $vectorizedExternalFontsStream->close();
    }
} finally {
    $presentation->dispose();
}

Beágyazott képek méretének csökkentése

Használja a SVGOptions.setPicturesCompression a beágyazott képek felbontásának csökkentéséhez, a SVGOptions.setDeletePicturesCroppedAreas a levágott forrásterületek kihagyásához, és a SVGOptions.setJpegQuality a JPEG kódolás minőségének szabályozásához. Ezek a beállítások csökkentik a fájlméretet a kép pontosságának vagy a megmaradt képadatok árán.

$presentation = new Presentation("presentation.pptx");
$svgStream = null;
try {
    $svgOptions = new SVGOptions();
    $svgOptions->setPicturesCompression(PicturesCompression::Dpi150);
    $svgOptions->setDeletePicturesCroppedAreas(true);
    $svgOptions->setJpegQuality(80);

    $slide = $presentation->getSlides()->get_Item(0);
    $svgStream = new Java("java.io.FileOutputStream", "compressed-slide.svg");
    $slide->writeAsSvg($svgStream, $svgOptions);
} finally {
    $svgStream->close();
    $presentation->dispose();
}

Stabil azonosítók hozzárendelése alakzatokhoz és szöveghez

Adjon meg egy formázási visszahívást a SVGOptions.setShapeFormattingController segítségével, hogy minden SVG alakzathoz beállítsa a SvgShape.setId értékét. A visszahívás a szöveg tspan elemekhez is beállíthatja a SvgTSpan.setId értékeket.

A PhpJavaBridge nem tud PHP visszahívást meghívni a writeAsSvg-ből, amikor stream módban fut. Helyezze a formázási logikát egy kis Java segédosztályba, fordítsa le, és adja hozzá a kapott JAR fájlt a bridge osztályútvonalához. A segéd a Shape.getOfficeInteropShapeId használhatja, amely stabil az alakzat életciklusa alatt, valamint egy újrahasználható számlálót a szövegszakaszaihoz. Tekintse meg a Java implementation of StableSvgIdController segédkódot.

$presentation = new Presentation("presentation.pptx");
$svgStream = null;
try {
    $shapeFormattingController = new Java("com.example.slides.StableSvgIdController");

    $svgOptions = new SVGOptions();
    $svgOptions->setShapeFormattingController($shapeFormattingController);

    $slide = $presentation->getSlides()->get_Item(0);
    $svgStream = new Java("java.io.FileOutputStream", "slide-with-stable-ids.svg");
    $slide->writeAsSvg($svgStream, $svgOptions);
} finally {
    $svgStream->close();
    $presentation->dispose();
}

SVG eseménykezelők hozzáadása

Egy formázási visszahívásban hívja meg a SvgShape.setEventHandler egy SvgEvent értékkel, hogy JavaScript eseménykezelőt adjon hozzá egy exportált alakzathoz. A visszahívást a SVGOptions.setShapeFormattingController segítségével rendelheti hozzá, és definiálja a JavaScript függvényt az eredményt hostoló oldalon vagy SVG-dokumentumban.

Az stabil azonosítókhoz hasonlóan a visszahívást Java segédben kell megvalósítani, amikor a PhpJavaBridge stream módot használ. A Java implementation of SvgEventController egy ActionButton nevű alakzathoz rendel egy azonosítót és egy OnClick kezelőt. Fordítsa le ezt a segédet, adja hozzá a bridge osztályútvonalához com.example.slides.SvgEventController néven, és használja PHP-ból a következőképpen:

$presentation = new Presentation("presentation.pptx");
$svgStream = null;
try {
    $shapeFormattingController = new Java("com.example.slides.SvgEventController");

    $svgOptions = new SVGOptions();
    $svgOptions->setShapeFormattingController($shapeFormattingController);

    $slide = $presentation->getSlides()->get_Item(0);
    $svgStream = new Java("java.io.FileOutputStream", "interactive-slide.svg");
    $slide->writeAsSvg($svgStream, $svgOptions);
} finally {
    $svgStream->close();
    $presentation->dispose();
}

A hostoldal definiálhatja a kezelő által hivatkozott JavaScript függvényt. Azonosítók és eseménykezelők hozzárendelése lehetővé teszi a diavetítőket, a hozzáférhetőségi fejlesztéseket és egyéb interaktív SVG munkafolyamatokat.

GYIK

Mikor kell a SVGOptions.setVectorizeText helyett a SvgExternalFontsHandling.Vectorize használni?

Használja a SVGOptions.setVectorizeText akkor, amikor minden szövegnek függetlennek kell lennie a betűkészletektől. Használja a SvgExternalFontsHandling.Vectorize akkor, amikor csak a külső betűkészleteket használó szöveget kell grafikává alakítani.

Mi a legjobb módja egy SVG kisebbé tételének?

Kezdje a beágyazott képek tömörítésével, a levágott képrészek törlésével, és a hivatkozott betűkészlet-fájlok kiválasztásával, ha a célkörnyezet képes azokat kiszolgálni. Tesztelje az eredményt, mivel az alacsonyabb képfelbontás, a gyengébb JPEG minőség és a vektorizált szöveg mind különböző minőség‑ és méret‑kompromisszumokkal jár.

Módosíthatom-e az exportált SVG elemeket az export után?

Igen. Rendezzen azonosítókat egy formázási visszahíváson keresztül, majd válassza ki a megfelelő SVG elemeket az utófeldolgozó eszközében vagy a böngésző szkriptjében.