Gerenciar Caixas de Texto em Apresentações Usando Java
Introdução
No Aspose.Slides for Java, o texto dos slides é armazenado em quadros de texto que pertencem a formas. A interface IAutoShape representa a forma mais comum que contém texto e expõe seu texto através do método IAutoShape.getTextFrame.
Nota
Toda forma automática implementa IShape, mas nem toda forma é uma forma automática ou suporta um quadro de texto. Ao processar uma apresentação existente, verifique se uma forma implementa IAutoShape antes de acessar seu texto.Criar uma Caixa de Texto em um Slide
Para criar uma caixa de texto, adicione uma forma automática a um slide, adicione texto ao seu quadro de texto e salve a apresentação. O exemplo a seguir cria uma caixa de texto retangular:
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape textBox = slide.getShapes().addAutoShape(ShapeType.Rectangle, 150, 75, 300, 50);
textBox.addTextFrame("Aspose TextBox");
presentation.save("TextBox.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
As coordenadas e dimensões passadas para IShapeCollection.addAutoShape são medidas em pontos. IAutoShape.addTextFrame inicializa o quadro de texto com o texto fornecido.
Verificar se uma Forma é Caixa de Texto
Use o método IAutoShape.isTextBox para determinar se uma forma automática é tratada como caixa de texto. Isso é útil quando uma apresentação contém formas automáticas que contêm texto e formas automáticas puramente gráficas.

O exemplo a seguir inspeciona cada forma automática em uma apresentação:
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape textBox = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 120, 40);
textBox.addTextFrame("Text box");
slide.getShapes().addAutoShape(ShapeType.Ellipse, 150, 10, 40, 40);
for (ISlide currentSlide : presentation.getSlides()) {
for (IShape shape : currentSlide.getShapes()) {
if (shape instanceof IAutoShape) {
IAutoShape autoShape = (IAutoShape) shape;
System.out.println(autoShape.isTextBox() ? "The shape is a text box." : "The shape is not a text box.");
}
}
}
} finally {
presentation.dispose();
}
Uma forma automática recém‑adicionada não é considerada uma caixa de texto até que contenha texto não vazio. Você pode fornecer esse texto por meio de IAutoShape.addTextFrame ou ITextFrame.setText. Adicionar ou atribuir uma string vazia faz com que IAutoShape.isTextBox retorne false:
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape1 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 100, 40);
shape1.addTextFrame("Shape 1");
System.out.println(shape1.isTextBox());
IAutoShape shape2 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 70, 100, 40);
shape2.getTextFrame().setText("Shape 2");
System.out.println(shape2.isTextBox());
IAutoShape shape3 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 130, 100, 40);
shape3.addTextFrame("");
System.out.println(shape3.isTextBox());
IAutoShape shape4 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 190, 100, 40);
shape4.getTextFrame().setText("");
System.out.println(shape4.isTextBox());
} finally {
presentation.dispose();
}
As duas primeiras chamadas imprimem true; as duas últimas imprimem false.
Encontrar a Forma que Possui um Quadro de Texto
Código genérico de processamento de texto pode receber um ITextFrame sem saber qual objeto da apresentação o contém. Use o método somente‑leitura ITextFrame.getParentShape para navegar de volta ao seu IShape proprietário.
Para um quadro de texto pertencente a uma forma automática ou outra forma que contenha texto, ITextFrame.getParentShape retorna o proprietário e ITextFrame.getParentCell retorna null. Verifique o valor retornado antes de acessá‑lo. Para identificar proprietários de forma e de célula de tabela, incluindo formas associadas a nós de SmartArt, consulte Search and Replace Text.
Adicionar Colunas a uma Caixa de Texto
O método ITextFrameFormat.setColumnCount divide o quadro de texto em colunas, enquanto ITextFrameFormat.setColumnSpacing define o espaçamento entre colunas em pontos. Ambas as configurações pertencem a ITextFrameFormat e podem ser alteradas através do quadro de texto de uma caixa de texto existente. O texto se ajusta entre colunas dentro da mesma forma; não continua em outra forma.
O exemplo a seguir cria uma caixa de texto de três colunas com 10 pontos entre as colunas, salva a apresentação e lê as configurações armazenadas do arquivo de saída:
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape textBox = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 200);
textBox.addTextFrame("This text is distributed automatically across all columns in the text box.");
ITextFrameFormat textFrameFormat = textBox.getTextFrame().getTextFrameFormat();
textFrameFormat.setColumnCount(3);
textFrameFormat.setColumnSpacing(10);
presentation.save("TextBoxColumns.pptx", SaveFormat.Pptx);
Presentation savedPresentation = new Presentation("TextBoxColumns.pptx");
try {
IAutoShape savedTextBox = (IAutoShape) savedPresentation.getSlides().get_Item(0).getShapes().get_Item(0);
ITextFrameFormat savedFormat = savedTextBox.getTextFrame().getTextFrameFormat();
System.out.println("Columns: " + savedFormat.getColumnCount() + "; spacing: " + savedFormat.getColumnSpacing() + " points");
} finally {
savedPresentation.dispose();
}
} finally {
presentation.dispose();
}
Extrair Texto de Colunas Individuais
Use ITextFrame.splitTextByColumns para obter o texto atribuído a cada coluna visual em um quadro de texto existente. O método devolve uma string para cada coluna, na ordem de leitura baseada em colunas. Um quadro de texto de coluna única produz um array com um elemento, e uma coluna vazia é representada por uma string vazia. As strings contêm apenas texto simples; a formatação ao nível de porções não é preservada.
Isso é útil quando você precisa:
- Extrair texto preservando sua ordem de leitura baseada em colunas.
- Indexar ou comparar o conteúdo de slides com múltiplas colunas.
- Exportar cada coluna para um arquivo separado, campo de banco de dados ou outro destino.
- Inspecionar como o texto é redistribuído após alterar a contagem de colunas com ITextFrameFormat.setColumnCount, o espaçamento com ITextFrameFormat.setColumnSpacing, a fonte ou o tamanho do quadro de texto.
O método relata o texto distribuído dentro do ITextFrame atual; ele não faz o fluxo automático de texto entre formas ou caixas de texto separadas. A distribuição por colunas pode depender das fontes disponíveis e de outras configurações de layout de texto, portanto, assegure‑se de que as fontes necessárias estejam disponíveis quando resultados consistentes forem importantes.
O exemplo a seguir carrega uma apresentação, encontra a primeira forma automática de múltiplas colunas com um quadro de texto, lê sua contagem de colunas configurada e grava o texto de cada coluna em um arquivo separado. Formas que não fornecem um quadro de texto são ignoradas.
import com.aspose.slides.*;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
Presentation presentation = new Presentation("MultiColumnText.pptx");
try {
IAutoShape textBox = null;
for (IShape shape : presentation.getSlides().get_Item(0).getShapes()) {
if (shape instanceof IAutoShape) {
IAutoShape autoShape = (IAutoShape) shape;
if (autoShape.getTextFrame() != null) {
int columnCount = autoShape.getTextFrame().getTextFrameFormat().getColumnCount();
if (columnCount > 1) {
textBox = autoShape;
break;
}
}
}
}
if (textBox == null) {
System.out.println("No multi-column text frame was found.");
} else {
ITextFrame textFrame = textBox.getTextFrame();
int configuredColumnCount = textFrame.getTextFrameFormat().getColumnCount();
String[] columnTexts = textFrame.splitTextByColumns();
System.out.println("Configured columns: " + configuredColumnCount);
for (int columnIndex = 0; columnIndex < columnTexts.length; columnIndex++) {
int columnNumber = columnIndex + 1;
String columnText = columnTexts[columnIndex];
System.out.println("Column " + columnNumber + ": " + columnText);
Path outputPath = Paths.get("Column-" + columnNumber + ".txt");
byte[] textBytes = columnText.getBytes(StandardCharsets.UTF_8);
try {
Files.write(outputPath, textBytes);
} catch (IOException exception) {
System.out.println("Could not write column " + columnNumber + ": " + exception.getMessage());
}
}
}
} finally {
presentation.dispose();
}
Atualizar Texto
Para atualizar texto em toda a apresentação, itere pelos slides e formas, selecione as formas automáticas e edite suas porções de texto. Trabalhar ao nível de porção permite alterar tanto o texto quanto a formatação de caracteres.
O exemplo a seguir substitui todas as ocorrências de years por months no texto de formas automáticas e torna cada porção afetada em negrito:
import com.aspose.slides.*;
Presentation presentation = new Presentation("Text.pptx");
try {
for (ISlide slide : presentation.getSlides()) {
for (IShape shape : slide.getShapes()) {
if (!(shape instanceof IAutoShape)) {
continue;
}
IAutoShape autoShape = (IAutoShape) shape;
ITextFrame textFrame = autoShape.getTextFrame();
if (textFrame == null) {
continue;
}
for (IParagraph paragraph : textFrame.getParagraphs()) {
for (IPortion portion : paragraph.getPortions()) {
String text = portion.getText();
if (text != null && text.contains("years")) {
portion.setText(text.replace("years", "months"));
portion.getPortionFormat().setFontBold(NullableBool.True);
}
}
}
}
}
presentation.save("TextChanged.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Essa travessia atualiza texto apenas em formas automáticas. Texto armazenado em tabelas, gráficos, SmartArt ou formas agrupadas requer a travessia das coleções próprias desses objetos.
Adicionar uma Caixa de Texto com um Hyperlink
Um hyperlink pode ser atribuído a uma porção específica de texto, de modo que somente esse texto funcione como link clicável. Use IHyperlinkManager.setExternalHyperlinkClick para associar a porção a uma URL externa.
O exemplo a seguir cria texto com hyperlink e o salva em uma apresentação:
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape textBox = slide.getShapes().addAutoShape(ShapeType.Rectangle, 150, 150, 200, 50);
textBox.addTextFrame("Aspose.Slides");
IPortion textPortion = textBox.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0);
textPortion.getPortionFormat().getHyperlinkManager().setExternalHyperlinkClick("https://www.aspose.com/");
presentation.save("Hyperlink.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Perguntas Frequentes
Qual é a diferença entre uma caixa de texto e um espaço reservado de texto em um slide mestre ou de layout?
Um placeholder pode herdar sua posição e formatação de um master slide ou layout slide. Uma caixa de texto normal é uma forma independente no slide onde foi criada e não adquire o comportamento de placeholder quando o layout muda.
Como posso substituir texto sem alterar texto em gráficos, tabelas ou SmartArt?
Limite a travessia às formas que implementam IAutoShape, como mostrado no exemplo de Atualizar Texto. Gráficos, tabelas e SmartArt armazenam texto em seus próprios modelos de objeto, de modo que não são modificados por esse loop.