Hantera ActiveX-kontroller i presentationer med Python

Introduction

ActiveX-kontroller används i presentationer. Aspose.Slides för Python via Java låter dig lägga till och hantera ActiveX-kontroller, men de är lite svårare att hantera jämfört med vanliga presentationsformer. Aspose.Slides stödjer att lägga till Media Player ActiveX-kontroller. Observera att ActiveX-kontroller inte är former; de är inte en del av presentationens ShapeCollection. De är en del av den separata ControlCollection istället. I detta avsnitt visar vi hur du arbetar med dem.

Add a Media Player ActiveX Control to a Slide

  1. Skapa en instans av klassen [Presentation] och skapa ett tomt presentationsobjekt.
  2. Hämta målbilden i [Presentation].
  3. Lägg till Media Player ActiveX-kontrollen med metoden [addControl] som exponeras av [ControlCollection].
  4. Hämta Media Player ActiveX-kontrollen och ange videovägen via dess egenskaper.
  5. Spara presentationen som en PPTX-fil.
import jpype
import asposeslides

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

from asposeslides.api import ControlType, Presentation, SaveFormat

# Skapa en tom presentation.
presentation = Presentation()
try:
    # Lägg till Media Player ActiveX-kontrollen.
    slide = presentation.getSlides().get_Item(0)
    control = slide.getControls().addControl(ControlType.WindowsMediaPlayer, 100, 100, 400, 400)

    # Ange videovägen.
    control.getProperties().set_Item("URL", "Wildlife.wmv")

    # Spara presentationen.
    presentation.save("Output.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Modify an ActiveX Control

  1. Skapa en instans av klassen [Presentation] och ladda presentationen som innehåller ActiveX-kontroller.
  2. Hämta en bildreferens via dess index.
  3. Kom åt ActiveX-kontrollerna på bilden genom att nå [ControlCollection].
  4. Hämta TextBox1 ActiveX-kontrollen med hjälp av objektet [Control].
  5. Ändra egenskaperna för TextBox1 ActiveX-kontrollen, inklusive text, teckensnitt, teckensnittshöjd och ramposition.
  6. Hämta den andra ActiveX-kontrollen som heter CommandButton1.
  7. Ändra knappens rubrik, teckensnitt och position.
  8. Justera positionen för ActiveX-kontrollerna ramar.
  9. Skriv den ändrade presentationen till en PPTM-fil.
import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, ShapeFrame
from java.awt import Font, SystemColor
from java.awt.image import BufferedImage
from java.io import ByteArrayOutputStream
from javax.imageio import ImageIO

# Läs in presentationen med ActiveX-kontroller.
presentation = Presentation("ActiveX.pptm")
try:
    if presentation.getSlides().size() > 0 and presentation.getSlides().get_Item(0).getControls().size() >= 2:
        # Hämta den första bilden.
        slide = presentation.getSlides().get_Item(0)

        # Ändra textrutans text.
        control = slide.getControls().get_Item(0)

        if str(control.getName()).lower() == "textbox1" and control.getProperties() is not None:
            new_text = "Changed text"
            control.getProperties().set_Item("Value", new_text)

            # Ändra ersättningsbilden. PowerPoint ersätter den under ActiveX-aktivering,
            # så den ibland kan lämnas oförändrad.
            image = BufferedImage(int(control.getFrame().getWidth()), int(control.getFrame().getHeight()), BufferedImage.TYPE_INT_ARGB)

            graphics = image.getGraphics()
            graphics.setColor(SystemColor.window)
            graphics.fillRect(0, 0, image.getWidth(), image.getHeight())

            font = Font(control.getProperties().get_Item("FontName"), Font.PLAIN, 16)
            graphics.setColor(SystemColor.windowText)
            graphics.setFont(font)
            graphics.drawString(new_text, 10, 20)

            graphics.setColor(SystemColor.controlShadow)
            graphics.drawLine(0, image.getHeight() - 1, 0, 0)
            graphics.drawLine(0, 0, image.getWidth() - 1, 0)

            graphics.setColor(SystemColor.controlDkShadow)
            graphics.drawLine(1, image.getHeight() - 2, 1, 1)
            graphics.drawLine(1, 1, image.getWidth() - 2, 1)

            graphics.setColor(SystemColor.controlHighlight)
            graphics.drawLine(1, image.getHeight() - 1, image.getWidth() - 1, image.getHeight() - 1)
            graphics.drawLine(image.getWidth() - 1, image.getHeight() - 1, image.getWidth() - 1, 1)

            graphics.setColor(SystemColor.controlLtHighlight)
            graphics.drawLine(0, image.getHeight(), image.getWidth(), image.getHeight())
            graphics.drawLine(image.getWidth(), image.getHeight(), image.getWidth(), 0)

            graphics.dispose()

            image_stream = ByteArrayOutputStream()
            ImageIO.write(image, "PNG", image_stream)

            image_bytes = image_stream.toByteArray()
            substitute_image = presentation.getImages().addImage(image_bytes)
            control.getSubstitutePictureFormat().getPicture().setImage(substitute_image)

        # Ändra knappens rubrik.
        control = presentation.getSlides().get_Item(0).getControls().get_Item(1)

        if str(control.getName()).lower() == "commandbutton1" and control.getProperties() is not None:
            new_caption = "Show MessageBox"
            control.getProperties().set_Item("Caption", new_caption)
            # Ändra ersättningsbilden.
            image = BufferedImage(int(control.getFrame().getWidth()), int(control.getFrame().getHeight()), BufferedImage.TYPE_INT_ARGB)
            graphics = image.getGraphics()
            graphics.setColor(SystemColor.control)
            graphics.fillRect(0, 0, image.getWidth(), image.getHeight())

            font = Font(control.getProperties().get_Item("FontName"), Font.PLAIN, 16)
            graphics.setColor(SystemColor.windowText)
            graphics.setFont(font)
            metrics = graphics.getFontMetrics(font)
            graphics.drawString(new_caption, (image.getWidth() - metrics.stringWidth(new_caption)) // 2, 20)

            graphics.setColor(SystemColor.controlLtHighlight)
            graphics.drawLine(0, image.getHeight() - 1, 0, 0)
            graphics.drawLine(0, 0, image.getWidth() - 1, 0)

            graphics.setColor(SystemColor.controlHighlight)
            graphics.drawLine(1, image.getHeight() - 2, 1, 1)
            graphics.drawLine(1, 1, image.getWidth() - 2, 1)

            graphics.setColor(SystemColor.controlShadow)
            graphics.drawLine(1, image.getHeight() - 1, image.getWidth() - 1, image.getHeight() - 1)
            graphics.drawLine(image.getWidth() - 1, image.getHeight() - 1, image.getWidth() - 1, 1)

            graphics.setColor(SystemColor.controlDkShadow)
            graphics.drawLine(0, image.getHeight(), image.getWidth(), image.getHeight())
            graphics.drawLine(image.getWidth(), image.getHeight(), image.getWidth(), 0)

            graphics.dispose()

            image_stream = ByteArrayOutputStream()
            ImageIO.write(image, "PNG", image_stream)

            image_bytes = image_stream.toByteArray()
            substitute_image = presentation.getImages().addImage(image_bytes)
            control.getSubstitutePictureFormat().getPicture().setImage(substitute_image)

        # Flytta kontrollerna neråt med 100 punkter.
        for control in slide.getControls():
            frame = control.getFrame()
            new_frame = ShapeFrame(frame.getX(), frame.getY() + 100, frame.getWidth(), frame.getHeight(), frame.getFlipH(), frame.getFlipV(), frame.getRotation())
            control.setFrame(new_frame)
        presentation.save("withActiveX-edited_python.pptm", SaveFormat.Pptm)

        # Ta bort kontrollerna.
        presentation.getSlides().get_Item(0).getControls().clear()
        presentation.save("withActiveX-cleared_python.pptm", SaveFormat.Pptm)
    else:
        print("The first slide must contain the TextBox1 and CommandButton1 ActiveX controls.")
finally:
    presentation.dispose()

FAQ

Does Aspose.Slides preserve ActiveX controls when reading and re-saving if they cannot be executed in the Python runtime?

Ja. Aspose.Slides betraktar dem som en del av presentationen och kan läsa/ändra deras egenskaper och ramar; att köra kontrollerna själva krävs inte för att bevara dem.

How do ActiveX controls differ from OLE objects in a presentation?

ActiveX-kontroller är interaktiva hanterade kontroller (knappar, textrutor, mediaplayer), medan OLE avser inbäddade programobjekt (t.ex. ett Excel‑kalkylblad). De lagras och behandlas på olika sätt och har olika egenskapsmodeller.

Do ActiveX events and VBA macros work if the file has been modified by Aspose.Slides?

Aspose.Slides bevarar befintlig markup och metadata; dock körs händelser och makron endast i PowerPoint på Windows när säkerheten tillåter det. Biblioteket kör inte VBA.