Gerenciar Controles ActiveX em Apresentações Usando Python

Introdução

Controles ActiveX são usados em apresentações. Aspose.Slides for Python via Java permite que você adicione e gerencie controles ActiveX, mas eles são um pouco mais difíceis de manipular em comparação com formas normais de apresentação. Aspose.Slides oferece suporte à adição de controles ActiveX Media Player. Observe que os controles ActiveX não são formas; eles não fazem parte da ShapeCollection da apresentação. Eles fazem parte da separada ControlCollection em vez disso. Neste tópico, mostraremos como trabalhar com eles.

Adicionar um Controle ActiveX Media Player a um Slide

Para adicionar um controle ActiveX Media Player, faça o seguinte:

  1. Crie uma instância da classe Presentation e gere uma instância de apresentação vazia.
  2. Acesse o slide de destino em Presentation.
  3. Adicione o controle ActiveX Media Player usando o método addControl exposto por ControlCollection.
  4. Acesse o controle ActiveX Media Player e defina o caminho do vídeo usando suas propriedades.
  5. Salve a apresentação como um arquivo PPTX.

Este código de exemplo, baseado nas etapas acima, mostra como adicionar um controle ActiveX Media Player a um slide:

import jpype
import asposeslides

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

from asposeslides.api import ControlType, Presentation, SaveFormat

# Crie uma apresentação vazia.
presentation = Presentation()
try:
    # Adicione o controle ActiveX Media Player.
    slide = presentation.getSlides().get_Item(0)
    control = slide.getControls().addControl(ControlType.WindowsMediaPlayer, 100, 100, 400, 400)

    # Defina o caminho do vídeo.
    control.getProperties().set_Item("URL", "Wildlife.wmv")

    # Salve a apresentação.
    presentation.save("Output.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Modificar um Controle ActiveX

Para gerenciar um controle ActiveX simples, como uma caixa de texto e um botão de comando simples em um slide, faça o seguinte:

  1. Crie uma instância da classe Presentation e carregue a apresentação que contém controles ActiveX.
  2. Obtenha uma referência ao slide pelo seu índice.
  3. Acesse os controles ActiveX no slide acessando a ControlCollection.
  4. Acesse o controle ActiveX TextBox1 usando o objeto Control.
  5. Altere as propriedades do controle ActiveX TextBox1, que incluem texto, fonte, altura da fonte e posição da moldura.
  6. Acesse o segundo controle ActiveX chamado CommandButton1.
  7. Modifique a legenda do botão, a fonte e a posição.
  8. Desloque a posição das molduras dos controles ActiveX.
  9. Grave a apresentação modificada em um arquivo PPTM.

Este código de exemplo, baseado nas etapas acima, mostra como gerenciar um controle ActiveX simples:

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

# Carregue a apresentação com controles ActiveX.
presentation = Presentation("ActiveX.pptm")
try:
    if presentation.getSlides().size() > 0 and presentation.getSlides().get_Item(0).getControls().size() >= 2:
        # Acesse o primeiro slide.
        slide = presentation.getSlides().get_Item(0)

        # Altere o texto da caixa de texto.
        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)

            # Altere a imagem substituta. O PowerPoint a substitui durante a ativação do ActiveX,
            # portanto ela pode ficar inalterada às vezes.
            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)

        # Altere a legenda do botão.
        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)
            # Altere a imagem substituta.
            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)

        # Mova os controles para baixo em 100 pontos.
        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)

        # Remova os controles.
        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()

Perguntas Frequentes

Aspose.Slides preserva os controles ActiveX ao ler e re‑salvar se eles não puderem ser executados no runtime Python?

Sim. Aspose.Slides trata-os como parte da apresentação e pode ler/modificar suas propriedades e molduras; executar os próprios controles não é necessário para preservá‑los.

Como os controles ActiveX diferem dos objetos OLE em uma apresentação?

Os controles ActiveX são controles interativos gerenciados (botões, caixas de texto, player de mídia), enquanto OLE refere‑se a objetos de aplicativo incorporados (por exemplo, uma planilha Excel). Eles são armazenados e tratados de forma diferente e possuem modelos de propriedades distintos.

Eventos ActiveX e macros VBA funcionam se o arquivo foi modificado pelo Aspose.Slides?

Aspose.Slides preserva a marcação e os metadados existentes; entretanto, eventos e macros são executados apenas dentro do PowerPoint no Windows quando a segurança o permite. A biblioteca não executa VBA.