Gerenciar caixas de texto em apresentações no .NET

Introdução

Os textos nos slides geralmente existem em caixas de texto ou formas. Portanto, para adicionar texto a um slide, você deve primeiro adicionar uma caixa de texto e, em seguida, colocar algum texto dentro da caixa de texto.

Para permitir que você adicione uma forma que possa conter texto, o Aspose.Slides for .NET fornece a interface IAutoShape.

Criar uma Caixa de Texto em um Slide

  1. Crie uma instância da classe Presentation.
  2. Obtenha a referência do primeiro slide por meio de seu índice.
  3. Adicione um objeto IAutoShape com ShapeType definido como Rectangle em uma posição especificada no slide e obtenha a referência para o objeto IAutoShape recém-adicionado.
  4. Adicione a propriedade TextFrame ao objeto IAutoShape que conterá um texto. No exemplo abaixo, adicionamos este texto: Aspose TextBox
  5. Finalmente, grave o arquivo PPTX através do objeto Presentation.

Este código C# —uma implementação das etapas acima—mostra como adicionar texto a um slide:

 // Instancia PresentationEx
 using (Presentation pres = new Presentation())
 {
 
     // Obtém o primeiro slide da apresentação
     ISlide sld = pres.Slides[0];
 
     // Adiciona um AutoShape com o tipo definido como Rectangle
     IAutoShape ashp = sld.Shapes.AddAutoShape(ShapeType.Rectangle, 150, 75, 150, 50);
 
     // Adiciona TextFrame ao Rectangle
     ashp.AddTextFrame(" ");
 
     // Acessa o quadro de texto
     ITextFrame txtFrame = ashp.TextFrame;
 
     // Cria o objeto Paragraph para o quadro de texto
     IParagraph para = txtFrame.Paragraphs[0];
 
     // Cria um objeto Portion para o parágrafo
     IPortion portion = para.Portions[0];
 
     // Define o texto
     portion.Text = "Aspose TextBox";
 
     // Salva a apresentação no disco
     pres.Save("TextBox_out.pptx", Aspose.Slides.Export.SaveFormat.Pptx);
 }

Verificar uma Forma de Caixa de Texto

O Aspose.Slides fornece a propriedade IsTextBox da interface IAutoShape, permitindo que você examine formas e identifique caixas de texto.

Text box and shape

Este código C# mostra como verificar se uma forma foi criada como caixa de texto:

using (Presentation presentation = new Presentation("sample.pptx"))
{
    Aspose.Slides.LowCode.ForEach.Shape(presentation, (shape, slide, index) =>
    {
        if (shape is IAutoShape autoShape)
        {
            Console.WriteLine(autoShape.IsTextBox ? "shape is a text box" : "shape is not a text box");
        }
    });
}

Observe que se você simplesmente adicionar uma forma automática usando o método AddAutoShape da interface IShapeCollection, a propriedade IsTextBox da forma automática retornará false. No entanto, depois de adicionar texto à forma automática usando o método AddTextFrame ou a propriedade Text, a propriedade IsTextBox retornará true.

using (Presentation presentation = new Presentation())
{
    ISlide slide = presentation.Slides[0];

    IAutoShape shape1 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 10, 100, 40);
    // shape1.IsTextBox é falso
    shape1.AddTextFrame("shape 1");
    // shape1.IsTextBox é verdadeiro

    IAutoShape shape2 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 110, 100, 40);
    // shape2.IsTextBox é falso
    shape2.TextFrame.Text = "shape 2";
    // shape2.IsTextBox é verdadeiro

    IAutoShape shape3 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 210, 100, 40);
    // shape3.IsTextBox é falso
    shape3.AddTextFrame("");
    // shape3.IsTextBox é falso

    IAutoShape shape4 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 310, 100, 40);
    // shape4.IsTextBox é falso
    shape4.TextFrame.Text = "";
    // shape4.IsTextBox é falso
}

Adicionar Colunas a uma Caixa de Texto

O Aspose.Slides fornece as propriedades ColumnCount e ColumnSpacing (da interface ITextFrameFormat e da classe TextFrameFormat) para permitir que você adicione colunas a caixas de texto. Você define o número de colunas em uma caixa de texto e, em seguida, especifica o espaçamento em pontos entre as colunas.

Este código em C# demonstra a operação descrita:

using (Presentation presentation = new Presentation())
{
	// Obtém o primeiro slide da apresentação
	ISlide slide = presentation.Slides[0];

	// Adiciona um AutoShape com tipo definido como Rectangle
	IAutoShape aShape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 300, 300);

	// Adiciona TextFrame ao Rectangle
	aShape.AddTextFrame("All these columns are limited to be within a single text container -- " +
	"you can add or delete text and the new or remaining text automatically adjusts " +
	"itself to flow within the container. You cannot have text flow from one container " +
	"to other though -- we told you PowerPoint's column options for text are limited!");

	// Obtém o formato de texto do TextFrame
	ITextFrameFormat format = aShape.TextFrame.TextFrameFormat;

	// Define o número de colunas no TextFrame
	format.ColumnCount = 3;

	// Define o espaçamento entre as colunas
	format.ColumnSpacing = 10;

	// Salva a apresentação
	presentation.Save("ColumnCount.pptx", SaveFormat.Pptx);
}

Adicionar Colunas a um Quadro de Texto

O Aspose.Slides for .NET fornece a propriedade ColumnCount (da interface ITextFrameFormat) que permite adicionar colunas em quadros de texto. Por meio dessa propriedade, você pode especificar o número desejado de colunas em um quadro de texto.

Este código C# mostra como adicionar uma coluna dentro de um quadro de texto:

string outPptxFileName = "ColumnsTest.pptx";
using (Presentation pres = new Presentation())
{
    IAutoShape shape1 = pres.Slides[0].Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 300, 300);
    TextFrameFormat format = (TextFrameFormat)shape1.TextFrame.TextFrameFormat;

    format.ColumnCount = 2;
    shape1.TextFrame.Text = "All these columns are forced to stay within a single text container -- " +
                                "you can add or delete text - and the new or remaining text automatically adjusts " +
                                "itself to stay within the container. You cannot have text spill over from one container " +
                                "to other, though -- because PowerPoint's column options for text are limited!";
    pres.Save(outPptxFileName, SaveFormat.Pptx);

    using (Presentation test = new Presentation(outPptxFileName))
    {
        Debug.Assert(2 == ((AutoShape)test.Slides[0].Shapes[0]).TextFrame.TextFrameFormat.ColumnCount);
        Debug.Assert(double.NaN == ((AutoShape)test.Slides[0].Shapes[0]).TextFrame.TextFrameFormat.ColumnSpacing);
    }

    format.ColumnSpacing = 20;
    pres.Save(outPptxFileName, SaveFormat.Pptx);

    using (Presentation test = new Presentation(outPptxFileName))
    {
        Debug.Assert(2 == ((AutoShape)test.Slides[0].Shapes[0]).TextFrame.TextFrameFormat.ColumnCount);
        Debug.Assert(20 == ((AutoShape)test.Slides[0].Shapes[0]).TextFrame.TextFrameFormat.ColumnSpacing);
    }

    format.ColumnCount = 3;
    format.ColumnSpacing = 15;
    pres.Save(outPptxFileName, SaveFormat.Pptx);

    using (Presentation test = new Presentation(outPptxFileName))
    {
        Debug.Assert(3 == ((AutoShape)test.Slides[0].Shapes[0]).TextFrame.TextFrameFormat.ColumnCount);
        Debug.Assert(15 == ((AutoShape)test.Slides[0].Shapes[0]).TextFrame.TextFrameFormat.ColumnSpacing);
    }
}

Atualizar Texto

O Aspose.Slides permite que você altere ou atualize o texto contido em uma caixa de texto ou todos os textos contidos em uma apresentação.

Este código C# demonstra uma operação em que todos os textos de uma apresentação são atualizados ou alterados:

using(Presentation pres = new Presentation("text.pptx"))
{
   foreach (ISlide slide in pres.Slides)
   {
       foreach (IShape shape in slide.Shapes)
       {
           if (shape is IAutoShape autoShape) //Verifica se a forma suporta quadro de texto (IAutoShape). 
           {
              foreach (IParagraph paragraph in autoShape.TextFrame.Paragraphs) //Itera pelos parágrafos no quadro de texto
               {
                   foreach (IPortion portion in paragraph.Portions) //Itera por cada porção no parágrafo
                   {
                       portion.Text = portion.Text.Replace("years", "months"); //Altera o texto
                       portion.PortionFormat.FontBold = NullableBool.True; //Altera a formatação
                   }
               }
           }
       }
   }
  
   //Salva a apresentação modificada
   pres.Save("text-changed.pptx", SaveFormat.Pptx);
}

Você pode inserir um link dentro de uma caixa de texto. Quando a caixa de texto é clicada, os usuários são dirigidos a abrir o link.

  1. Crie uma instância da classe Presentation.
  2. Obtenha a referência do primeiro slide por meio de seu índice.
  3. Adicione um objeto AutoShape com ShapeType definido como Rectangle em uma posição especificada no slide e obtenha a referência do objeto AutoShape recém-adicionado.
  4. Adicione um TextFrame ao objeto AutoShape que contém Aspose TextBox como texto padrão.
  5. Instancie a classe IHyperlinkManager.
  6. Atribua o objeto IHyperlinkManager à propriedade HyperlinkClick associada à porção desejada do TextFrame.
  7. Finalmente, grave o arquivo PPTX através do objeto Presentation.

Este código C# —uma implementação das etapas acima—mostra como adicionar uma caixa de texto com um hyperlink a um slide:

// Instancia uma classe Presentation que representa um PPTX
Presentation pptxPresentation = new Presentation();

// Obtém o primeiro slide da apresentação
ISlide slide = pptxPresentation.Slides[0];

// Adiciona um objeto AutoShape com tipo definido como Rectangle
IShape pptxShape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 150, 150, 150, 50);

// Converte a forma para AutoShape
IAutoShape pptxAutoShape = (IAutoShape)pptxShape;

// Acessa a propriedade ITextFrame associada ao AutoShape
pptxAutoShape.AddTextFrame("");

ITextFrame ITextFrame = pptxAutoShape.TextFrame;

// Adiciona algum texto ao quadro
ITextFrame.Paragraphs[0].Portions[0].Text = "Aspose.Slides";

// Define o hyperlink para o texto da porção
IHyperlinkManager HypMan = ITextFrame.Paragraphs[0].Portions[0].PortionFormat.HyperlinkManager;
HypMan.SetExternalHyperlinkClick("http://www.aspose.com");

// Salva a apresentação PPTX
pptxPresentation.Save("hLinkPPTX_out.pptx", Aspose.Slides.Export.SaveFormat.Pptx);

FAQ

Qual é a diferença entre uma caixa de texto e um placeholder de texto ao trabalhar com slides mestres?

Um placeholder herda estilo/posição do master e pode ser sobrescrito nos layouts, enquanto uma caixa de texto regular é um objeto independente em um slide específico e não muda quando você troca de layout.

Como posso realizar uma substituição em massa de texto em toda a apresentação sem alterar o texto dentro de gráficos, tabelas e SmartArt?

Limite sua iteração a auto-shapes que possuem quadros de texto e exclua objetos incorporados (gráficos, tabelas, SmartArt) percorrendo suas coleções separadamente ou ignorando esses tipos de objeto.