Render Presentatie Dia's als SVG-afbeeldingen in Python via Java

Overview

SVG is een schaalbaar, op XML gebaseerd afbeeldingsformaat dat goed werkt voor webpublicatie, slide‑viewers, toegankelijkheidsprocessen en geautomatiseerde nabewerking. Aspose.Slides exporteert elke dia naar een apart SVG‑bestand en stelt u in staat hoe tekst, lettertypen, afbeeldingen en SVG‑elementen worden geschreven.

Gebruik SVGOptions wanneer de geëxporteerde SVG compact moet zijn, voorspelbaar over browsers, of klaar voor interactief gebruik.

Export a Slide as SVG

Maak een Presentation, selecteer een dia, en schrijf deze naar een stream met Slide.writeAsSvg. De voorbeelden vereisen een bestaand presentation.pptx‑bestand. Elk voorbeeld start de JVM indien nodig en sluit zijn output‑streams. Het onderstaande voorbeeld exporteert elke dia in een presentatie naar een apart SVG‑bestand.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation
from java.io import FileOutputStream

presentation = Presentation("presentation.pptx")
try:
    for slide in presentation.getSlides():
        output_file_name = f"slide-{slide.getSlideNumber()}.svg"
        svg_stream = FileOutputStream(output_file_name)
        try:
            slide.writeAsSvg(svg_stream)
        finally:
            svg_stream.close()
finally:
    presentation.dispose()

De bestandsnaam gebruikt Slide.getSlideNumber in plaats van de lus‑index. U kunt ook een afzonderlijke vorm exporteren met Shape.writeAsSvg wanneer een slide‑viewer of webpagina alleen die vorm nodig heeft.

Configure SVG Output

SVGOptions regelt de SVG‑rendering. Voor tekstframes zorgt SVGOptions.setUseFrameSize ervoor dat het tekstframe in het rendergebied wordt opgenomen, en SVGOptions.setUseFrameRotation bepaalt of de rotatie van het frame wordt toegepast. Stel SVGOptions.setDisableFontLigatures in op True wanneer tekst moet worden gerenderd zonder ligaturen.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SVGOptions
from java.io import FileOutputStream

presentation = Presentation("presentation.pptx")
try:
    svg_options = SVGOptions()
    svg_options.setDisableFontLigatures(True)
    svg_options.setUseFrameSize(True)
    svg_options.setUseFrameRotation(False)

    slide = presentation.getSlides().get_Item(0)
    svg_stream = FileOutputStream("slide-with-custom-options.svg")
    try:
        slide.writeAsSvg(svg_stream, svg_options)
    finally:
        svg_stream.close()
finally:
    presentation.dispose()

Control Text and Fonts

Vectorize All Text

Stel SVGOptions.setVectorizeText in op True om alle dia‑tekst als vectorafbeeldingen te schrijven. Dit elimineert afhankelijkheden van lettertypen en maakt het visuele resultaat consistenter over browsers, maar de tekst is niet langer selecteerbaar of doorzoekbaar als SVG‑tekst.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SVGOptions
from java.io import FileOutputStream

presentation = Presentation("presentation.pptx")
try:
    svg_options = SVGOptions()
    svg_options.setVectorizeText(True)

    slide = presentation.getSlides().get_Item(0)
    svg_stream = FileOutputStream("slide-with-vectorized-text.svg")
    try:
        slide.writeAsSvg(svg_stream, svg_options)
    finally:
        svg_stream.close()
finally:
    presentation.dispose()

Choose How External Fonts Are Handled

SVGOptions.setExternalFontsHandling gebruikt een SvgExternalFontsHandling‑waarde voor lettertypen die extern worden geladen. Kies AddLinksToFontFiles om naar afzonderlijke lettertypebestanden te verwijzen, Embed om lettertype‑data in de SVG op te nemen, of Vectorize om alleen tekst die externe lettertypen gebruikt als grafieken te renderen. Controleer de licentie van het lettertype voordat u lettertypen insluit.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SVGOptions, SvgExternalFontsHandling
from java.io import FileOutputStream

presentation = Presentation("presentation.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    font_modes = [
        ("slide-with-font-links.svg", SvgExternalFontsHandling.AddLinksToFontFiles),
        ("slide-with-embedded-fonts.svg", SvgExternalFontsHandling.Embed),
        ("slide-with-vectorized-external-fonts.svg", SvgExternalFontsHandling.Vectorize),
    ]
    for output_file_name, font_mode in font_modes:
        svg_options = SVGOptions()
        svg_options.setExternalFontsHandling(font_mode)
        svg_stream = FileOutputStream(output_file_name)
        try:
            slide.writeAsSvg(svg_stream, svg_options)
        finally:
            svg_stream.close()
finally:
    presentation.dispose()

Reduce Embedded Image Size

Gebruik SVGOptions.setPicturesCompression om de resolutie van ingesloten afbeeldingen te verlagen, SVGOptions.setDeletePicturesCroppedAreas om bijgesneden bron‑gebieden weg te laten, en SVGOptions.setJpegQuality om de JPEG‑coderingskwaliteit te regelen. Deze instellingen verkleinen de bestandsgrootte ten koste van beeld‑fidelity of behouden afbeeldingsdata.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import PicturesCompression, Presentation, SVGOptions
from java.io import FileOutputStream

presentation = Presentation("presentation.pptx")
try:
    svg_options = SVGOptions()
    svg_options.setPicturesCompression(PicturesCompression.Dpi150)
    svg_options.setDeletePicturesCroppedAreas(True)
    svg_options.setJpegQuality(80)

    slide = presentation.getSlides().get_Item(0)
    svg_stream = FileOutputStream("compressed-slide.svg")
    try:
        slide.writeAsSvg(svg_stream, svg_options)
    finally:
        svg_stream.close()
finally:
    presentation.dispose()

Assign Stable IDs to Shapes and Text

Gebruik een Python‑formatteercontroller die via jpype.JProxy is geregistreerd om SvgShape.setId‑waarden toe te wijzen aan vormen en SvgTSpan.setId‑waarden aan tekst‑tspan‑elementen. Ken de proxy toe met SVGOptions.setShapeFormattingController.

De volgende controller maakt gebruik van Shape.getOfficeInteropShapeId, die stabiel is gedurende de levensduur van de vorm, en een herhaalbare teller voor de tekstdelen. Dit maakt de gegenereerde ID’s geschikt voor nabewerking van een ongewijzigde presentatie.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SVGOptions
from java.io import FileOutputStream

class StableSvgIdController:
    def __init__(self):
        self.current_shape_id = ""
        self.text_span_index = 0

    def formatShape(self, svg_shape, shape):
        self.current_shape_id = f"shape-{shape.getOfficeInteropShapeId()}"
        self.text_span_index = 0
        svg_shape.setId(self.current_shape_id)

    def formatText(self, svg_tspan, portion, text_frame):
        svg_tspan.setId(f"{self.current_shape_id}-text-{self.text_span_index}")
        self.text_span_index += 1


presentation = Presentation("presentation.pptx")
try:
    controller = StableSvgIdController()
    proxy = jpype.JProxy("com.aspose.slides.ISvgShapeAndTextFormattingController", inst=controller)
    svg_options = SVGOptions()
    svg_options.setShapeFormattingController(proxy)

    slide = presentation.getSlides().get_Item(0)
    svg_stream = FileOutputStream("slide-with-stable-ids.svg")
    try:
        slide.writeAsSvg(svg_stream, svg_options)
    finally:
        svg_stream.close()
finally:
    presentation.dispose()

Add SVG Event Handlers

In een Python‑formatteercontroller, roep SvgShape.setEventHandler aan met een SvgEvent‑waarde om een JavaScript‑event‑handler toe te voegen aan een geëxporteerde vorm. Registreer de controller via jpype.JProxy en ken deze toe met SVGOptions.setShapeFormattingController. Definieer de JavaScript‑functie in de pagina of het SVG‑document dat het resultaat host.

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SVGOptions, SvgEvent
from java.io import FileOutputStream

class SvgEventController:
    def formatShape(self, svg_shape, shape):
        if shape.getName() == "ActionButton":
            svg_shape.setId("action-button")
            svg_shape.setEventHandler(SvgEvent.OnClick, "handleShapeClick(event)")


presentation = Presentation("presentation.pptx")
try:
    controller = SvgEventController()
    proxy = jpype.JProxy("com.aspose.slides.ISvgShapeFormattingController", inst=controller)
    svg_options = SVGOptions()
    svg_options.setShapeFormattingController(proxy)

    slide = presentation.getSlides().get_Item(0)
    svg_stream = FileOutputStream("interactive-slide.svg")
    try:
        slide.writeAsSvg(svg_stream, svg_options)
    finally:
        svg_stream.close()
finally:
    presentation.dispose()

De host‑pagina kan de JavaScript‑functie definiëren waar de handler naar verwijst. Het toewijzen van ID’s en event‑handlers maakt slide‑viewers, toegankelijkheidsverbeteringen en andere interactieve SVG‑processen mogelijk.

FAQ

When should I use SVGOptions.setVectorizeText instead of SvgExternalFontsHandling.Vectorize?

Gebruik [SVGOptions.setVectorizeText] wanneer alle tekst onafhankelijk van lettertypen moet zijn. Gebruik [SvgExternalFontsHandling.Vectorize] wanneer alleen tekst die externe lettertypen gebruikt moet worden omgezet naar grafieken.

What is the best way to make an SVG smaller?

Begin met het comprimeren van ingesloten afbeeldingen, het verwijderen van bijgesneden afbeeldingsgebieden, en kies gekoppelde lettertypebestanden wanneer de doelomgeving ze kan serveren. Test het resultaat omdat een lagere afbeeldingresolutie, lagere JPEG‑kwaliteit en gevectoriseerde tekst elk verschillende kwaliteit‑ en grootte‑afwegingen hebben.

Can I modify exported SVG elements after export?

Ja. Wijs ID’s toe via een formatteercontroller, en selecteer vervolgens de overeenkomstige SVG‑elementen in uw nabewerkings‑tool of browserscript.