Genera diapositive della presentazione come immagini SVG in PHP

Panoramica

SVG è un formato immagine basato su XML scalabile che funziona bene per la pubblicazione web, i visualizzatori di diapositive, i flussi di lavoro di accessibilità e l’elaborazione automatica post‑processing. Aspose.Slides esporta ogni diapositiva in un file SVG separato e consente di controllare come vengono scritti testo, caratteri, immagini e elementi SVG.

Usa SVGOptions quando l’SVG esportato deve essere compatto, prevedibile su diversi browser o pronto per un utilizzo interattivo.

Esporta una diapositiva come SVG

Crea una Presentation, seleziona una diapositiva e scrivila su uno stream con Slide.writeAsSvg. L’esempio seguente esporta ogni diapositiva di una presentazione in un file SVG separato.

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

Il nome del file usa Slide.getSlideNumber invece dell’indice del ciclo. Puoi anche esportare una forma individuale con Shape.writeAsSvg quando un visualizzatore di diapositive o una pagina web ha bisogno solo di quella forma.

Configura l’output SVG

SVGOptions controlla il rendering SVG. Per i riquadri di testo, SVGOptions.setUseFrameSize include il riquadro di testo nell’area di rendering, e SVGOptions.setUseFrameRotation determina se viene applicata la rotazione del riquadro. Imposta SVGOptions.setDisableFontLigatures su true quando il testo deve essere renderizzato senza legature.

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

Controlla testo e caratteri

Durante l’esportazione di diapositive in SVG, è possibile controllare se il testo rimane come testo o viene convertito in grafica vettoriale, e come i caratteri esterni vengono inclusi o referenziati. Le opzioni seguenti ti aiutano a bilanciare coerenza visiva, selezionabilità del testo e dipendenze dei caratteri nello SVG esportato.

Vectorizza tutto il testo

Imposta SVGOptions.setVectorizeText su true per scrivere tutto il testo della diapositiva come grafica vettoriale. Questo elimina le dipendenze dai caratteri e rende il risultato visivo più coerente tra i browser, ma il testo non è più selezionabile né ricercabile come testo SVG.

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

Scegli come gestire i caratteri esterni

SVGOptions.setExternalFontsHandling utilizza un valore SvgExternalFontsHandling per i caratteri caricati esternamente. Scegli AddLinksToFontFiles per fare riferimento a file di caratteri separati, Embed per includere i dati dei caratteri nello SVG, o Vectorize per rendere solo il testo che utilizza caratteri esterni come grafica. Verifica la licenza dei caratteri prima di incorporarli.

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

Riduci le dimensioni delle immagini incorporate

Usa SVGOptions.setPicturesCompression per ridurre la risoluzione delle immagini incorporate, SVGOptions.setDeletePicturesCroppedAreas per omettere le aree di origine ritagliate e SVGOptions.setJpegQuality per controllare la qualità di codifica JPEG. queste impostazioni riducono la dimensione del file a scapito della fedeltà dell’immagine o dei dati immagine conservati.

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

Controlla la risoluzione di rasterizzazione dei Metafile

SVGOptions.setMetafileRasterizationDpi imposta il limite inferiore di risoluzione per rasterizzare i metafile durante l’esportazione SVG. Usalo per bilanciare dettaglio e dimensione del file quando un’immagine EMF o WMF viene rasterizzata. Non definisce un DPI globale per lo SVG né forza ogni oggetto della diapositiva a diventare un’immagine raster.

Scarica metafile-rasterization.pptx, che contiene un’immagine EMF con linee diagonali molto vicine. L’esempio seguente esporta la sua prima diapositiva a tre risoluzioni di rasterizzazione tramite Slide.writeAsSvg. Tutte le altre impostazioni di esportazione rimangono identiche così che i risultati possano essere confrontati.

$presentation = new Presentation("metafile-rasterization.pptx");

try {
    foreach ([72, 150, 300] as $dpi) {
        $svgOptions = new SVGOptions();
        $svgOptions->setMetafileRasterizationDpi($dpi);
        $svgOptions->setPicturesCompression(PicturesCompression::Dpi330);
        $svgOptions->setJpegQuality(90);

        $outputFileName = sprintf("slide-%d.svg", $dpi);
        $svgStream = new Java("java.io.FileOutputStream", $outputFileName);

        try {
            $presentation->getSlides()->get_Item(0)->writeAsSvg($svgStream, $svgOptions);
        } finally {
            $svgStream->close();
        }
    }
} finally {
    $presentation->dispose();
}

Nel risultato, l’EMF è diventato un PNG incorporato in ciascun SVG. Le misurazioni seguenti sono per la presentazione fornita; non costituiscono una formula generale per convertire DPI in dimensioni pixel.

Risoluzione di rasterizzazione del metafile DPI Dimensioni PNG incorporato Dimensione file SVG (byte)
72 1196 × 596 170,221
150 2492 × 1242 423,149
300 4983 × 2483 1,027,169

Il confronto sotto mostra la stessa area della rasterizzazione incorporata alla stessa dimensione di visualizzazione ingrandita. Le linee diagonali mostrano una pixelatura visibile a 72 DPI e bordi più lisci a risoluzioni più alte, mentre il file SVG cresce. Aumentare il valore non migliora necessariamente ogni dettaglio né cambia ogni immagine esportata.

Dettaglio ingrandito della linea diagonale a 72, 150 e 300 DPI

SVGOptions.setPicturesCompression controlla la riduzione della risoluzione delle immagini e può mascherare l’effetto della modifica della risoluzione di rasterizzazione del metafile. SVGOptions.setJpegQuality controlla la qualità di codifica JPEG, non la risoluzione di rasterizzazione del metafile.

Assegna ID stabili a forme e testo

Fornisci una callback di formattazione a SVGOptions.setShapeFormattingController per impostare SvgShape.setId per ogni forma SVG. La callback può anche impostare i valori SvgTSpan.setId sugli elementi tspan di testo.

PhpJavaBridge non può invocare una callback PHP da writeAsSvg quando funziona in modalità stream. Inserisci la logica di formattazione in una piccola classe di supporto Java, compilala e aggiungi il file JAR risultante al classpath del bridge. Il supporto può usare Shape.getOfficeInteropShapeId, che è stabile per tutta la vita della forma, e un contatore ripetibile per i suoi span di testo. Consulta l’implementazione Java di StableSvgIdController per il codice di supporto.

Dopo aver aggiunto la classe compilata com.example.slides.StableSvgIdController al classpath del bridge, istanziala da PHP e assegnala a SVGOptions:

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

Aggiungi gestori di eventi SVG

In una callback di formattazione, chiama SvgShape.setEventHandler con un valore SvgEvent per aggiungere un gestore di eventi JavaScript a una forma esportata. Assegna la callback con SVGOptions.setShapeFormattingController e definisci la funzione JavaScript nella pagina o nel documento SVG che ospita il risultato.

Come per gli ID stabili, implementa la callback in un helper Java quando PhpJavaBridge usa la modalità stream. L’implementazione Java di SvgEventController assegna un ID e un gestore OnClick a una forma chiamata ActionButton. Compila quell’aiuto, aggiungilo al classpath del bridge come com.example.slides.SvgEventController e usalo da PHP come segue:

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

La pagina host può definire la funzione JavaScript a cui fa riferimento il gestore. L’assegnazione di ID e gestori di eventi consente visualizzatori di diapositive, miglioramenti di accessibilità e altri flussi di lavoro SVG interattivi.

FAQ

Quando dovrei usare SVGOptions.setVectorizeText invece di SvgExternalFontsHandling.Vectorize?

Usa SVGOptions.setVectorizeText quando tutto il testo deve essere indipendente dai caratteri. Usa SvgExternalFontsHandling.Vectorize quando solo il testo che utilizza caratteri esterni dovrebbe essere convertito in grafica.

Qual è il modo migliore per rendere un SVG più piccolo?

Inizia comprimendo le immagini incorporate, eliminando le aree ritagliate e scegliendo file di caratteri collegati quando l’ambiente di destinazione può servirli. Testa il risultato perché una risoluzione immagine inferiore, una qualità JPEG più bassa e il testo vectorizzato hanno ciascuno compromessi diversi tra qualità e dimensione.

Posso modificare gli elementi SVG esportati dopo l’esportazione?

Sì. Assegna ID tramite una callback di formattazione, quindi seleziona gli elementi SVG corrispondenti nel tuo strumento di post‑processing o nello script del browser.