使用 Java 管理演示文稿中的文本框
幻灯片上的文本通常存在于文本框或形状中。因此,要在幻灯片上添加文本,您必须先添加一个文本框,然后在文本框中放入一些文本。Aspose.Slides for Java 提供了 IAutoShape 接口,允许您添加包含文本的形状。
Info
Aspose.Slides 还提供了 IShape 接口,允许您向幻灯片添加形状。然而,并非所有通过IShape 接口添加的形状都可以容纳文本。但通过 IAutoShape 接口添加的形状可以包含文本。
Note
因此,在处理需要添加文本的形状时,您可能需要检查并确认它是通过IAutoShape 接口强制转换的。只有这样,您才能使用属于 IAutoShape 的属性 TextFrame。请参阅本页的 Update Text 部分。
在幻灯片上创建文本框
要在幻灯片上创建文本框,请按照以下步骤操作:
- 创建 Presentation 类的实例。
- 获取新创建的演示文稿中第一张幻灯片的引用。
- 在幻灯片的指定位置添加一个 IAutoShape 对象,使用
ShapeType设置为Rectangle,并获取新添加的IAutoShape对象的引用。 - 向
IAutoShape对象添加一个TextFrame属性,用于包含文本。在下面的示例中,我们添加了以下文本:Aspose TextBox - 最后,通过
Presentation对象写入 PPTX 文件。
以下 Java 代码——上述步骤的实现——展示了如何向幻灯片添加文本:
// 实例化 Presentation
Presentation pres = new Presentation();
try {
// 获取演示文稿中的第一张幻灯片
ISlide sld = pres.getSlides().get_Item(0);
// 添加 AutoShape,类型设置为 Rectangle
IAutoShape ashp = sld.getShapes().addAutoShape(ShapeType.Rectangle, 150, 75, 150, 50);
// 向 Rectangle 添加 TextFrame
ashp.addTextFrame(" ");
// 访问文本框
ITextFrame txtFrame = ashp.getTextFrame();
// 为文本框创建 Paragraph 对象
IParagraph para = txtFrame.getParagraphs().get_Item(0);
// 为段落创建 Portion 对象
IPortion portion = para.getPortions().get_Item(0);
// 设置文本
portion.setText("Aspose TextBox");
// 将演示文稿保存到磁盘
pres.save("TextBox_out.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
检查文本框形状
Aspose.Slides 提供了来自 IAutoShape 接口的 isTextBox 方法,允许您检查形状并识别文本框。

以下 Java 代码展示了如何检查形状是否被创建为文本框:
Presentation presentation = new Presentation("sample.pptx");
try {
ForEach.shape(presentation, (shape, slide, index) -> {
if (shape instanceof IAutoShape) {
IAutoShape autoShape = (IAutoShape) shape;
System.out.println(autoShape.isTextBox() ? "shape is a text box" : "shape is not a text box");
}
});
} finally {
presentation.dispose();
}
请注意,如果仅使用 IShapeCollection 接口的 addAutoShape 方法添加自动形状,则该自动形状的 isTextBox 方法将返回 false。但是,在使用 addTextFrame 方法或 setText 方法向自动形状添加文本后,isTextBox 属性将返回 true。
Presentation presentation = new Presentation();
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape1 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 100, 40);
// shape1.isTextBox() 返回 false
shape1.addTextFrame("shape 1");
// shape1.isTextBox() 返回 true
IAutoShape shape2 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 110, 100, 40);
// shape2.isTextBox() 返回 false
shape2.getTextFrame().setText("shape 2");
// shape2.isTextBox() 返回 true
IAutoShape shape3 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 210, 100, 40);
// shape3.isTextBox() 返回 false
shape3.addTextFrame("");
// shape3.isTextBox() 返回 false
IAutoShape shape4 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 310, 100, 40);
// shape4.isTextBox() 返回 false
shape4.getTextFrame().setText("");
// shape4.isTextBox() 返回 false
向文本框添加列
Aspose.Slides 提供了 ColumnCount 和 ColumnSpacing 属性(来自 ITextFrameFormat 接口和 TextFrameFormat 类),允许您向文本框添加列。您可以指定文本框的列数并设置列之间的点距。
以下 Java 代码演示了上述操作:
Presentation pres = new Presentation();
try {
// 获取演示文稿中的第一张幻灯片
ISlide slide = pres.getSlides().get_Item(0);
// 添加类型为 Rectangle 的 AutoShape
IAutoShape aShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 300);
// 向矩形添加 TextFrame
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!");
// 获取 TextFrame 的文本格式
ITextFrameFormat format = aShape.getTextFrame().getTextFrameFormat();
// 指定 TextFrame 中的列数
format.setColumnCount(3);
// 指定列之间的间距
format.setColumnSpacing(10);
// 保存演示文稿
pres.save("ColumnCount.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
向文本帧添加列
Aspose.Slides for Java 提供了 ColumnCount 属性(来自 ITextFrameFormat 接口),允许您在文本帧中添加列。通过此属性,您可以指定文本帧中所需的列数。
以下 Java 代码展示了如何在文本帧中添加列:
String outPptxFileName = "ColumnsTest.pptx";
Presentation pres = new Presentation();
try {
IAutoShape shape1 = pres.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 300);
TextFrameFormat format = (TextFrameFormat)shape1.getTextFrame().getTextFrameFormat();
format.setColumnCount(2);
shape1.getTextFrame().setText("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);
Presentation test = new Presentation(outPptxFileName);
try {
IAutoShape autoShape = ((AutoShape)test.getSlides().get_Item(0).getShapes().get_Item(0));
Assert.assertTrue(2 == autoShape.getTextFrame().getTextFrameFormat().getColumnCount());
Assert.assertTrue(Double.NaN == autoShape.getTextFrame().getTextFrameFormat().getColumnSpacing());
} finally {
if (test != null) test.dispose();
}
format.setColumnSpacing(20);
pres.save(outPptxFileName, SaveFormat.Pptx);
Presentation test1 = new Presentation(outPptxFileName);
try {
IAutoShape autoShape = ((AutoShape)test1.getSlides().get_Item(0).getShapes().get_Item(0));
Assert.assertTrue(2 == autoShape.getTextFrame().getTextFrameFormat().getColumnCount());
Assert.assertTrue(20 == autoShape.getTextFrame().getTextFrameFormat().getColumnSpacing());
} finally {
if (test1 != null) test1.dispose();
}
format.setColumnCount(3);
format.setColumnSpacing(15);
pres.save(outPptxFileName, SaveFormat.Pptx);
Presentation test2 = new Presentation(outPptxFileName);
try {
IAutoShape autoShape = ((AutoShape)test2.getSlides().get_Item(0).getShapes().get_Item(0));
Assert.assertTrue(3 == autoShape.getTextFrame().getTextFrameFormat().getColumnCount());
Assert.assertTrue(15 == autoShape.getTextFrame().getTextFrameFormat().getColumnSpacing());
} finally {
if (test2 != null) test2.dispose();
}
} finally {
if (pres != null) pres.dispose();
}
更新文本
Aspose.Slides 允许您更改或更新文本框中的文本或演示文稿中所有文本。
以下 Java 代码演示了更新或更改演示文稿中所有文本的操作:
Presentation pres = new Presentation("text.pptx");
try {
for (ISlide slide : pres.getSlides())
{
for (IShape shape : slide.getShapes())
{
if (shape instanceof IAutoShape) //检查形状是否支持文本框 (IAutoShape)。
{
IAutoShape autoShape = (IAutoShape)shape;
for (IParagraph paragraph : autoShape.getTextFrame().getParagraphs()) //遍历文本框中的段落
{
for (IPortion portion : paragraph.getPortions()) //遍历段落中的每个文本片段
{
portion.setText(portion.getText().replace("years", "months")); //更改文本
portion.getPortionFormat().setFontBold(NullableBool.True); //更改格式
}
}
}
}
}
//保存修改后的演示文稿
pres.save("text-changed.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
向文本框添加超链接
您可以在文本框中插入链接。单击文本框时,用户将打开该链接。
要添加包含链接的文本框,请按照以下步骤操作:
- 创建
Presentation类的实例。 - 获取新创建的演示文稿中第一张幻灯片的引用。
- 在幻灯片的指定位置添加一个
AutoShape对象,并将ShapeType设置为Rectangle,获取新添加的 AutoShape 对象的引用。 - 向
AutoShape对象添加一个TextFrame,其默认文本为 Aspose TextBox。 - 实例化
IHyperlinkManager类。 - 将
IHyperlinkManager对象分配给与TextFrame中所需部分关联的 HyperlinkClick 属性。 - 最后,通过
Presentation对象写入 PPTX 文件。
以下 Java 代码——上述步骤的实现——展示了如何向幻灯片添加带超链接的文本框:
// 实例化一个表示 PPTX 的 Presentation 类
Presentation pres = new Presentation();
try {
// 获取演示文稿中的第一张幻灯片
ISlide slide = pres.getSlides().get_Item(0);
// 添加一个类型为 Rectangle 的 AutoShape 对象
IShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 150, 150, 150, 50);
// 将形状强制转换为 AutoShape
IAutoShape pptxAutoShape = (IAutoShape)shape;
// 访问与 AutoShape 关联的 ITextFrame 属性
pptxAutoShape.addTextFrame("");
ITextFrame textFrame = pptxAutoShape.getTextFrame();
// 向框中添加一些文本
textFrame.getParagraphs().get_Item(0).getPortions().get_Item(0).setText("Aspose.Slides");
// 为文本片段设置超链接
IHyperlinkManager hyperlinkManager = textFrame.getParagraphs().get_Item(0).getPortions().get_Item(0).
getPortionFormat().getHyperlinkManager();
hyperlinkManager.setExternalHyperlinkClick("http://www.aspose.com");
// 保存 PPTX 演示文稿
pres.save("hLink_out.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
常见问题
在使用母版幻灯片时,文本框和文本占位符有什么区别?
占位符(placeholder)继承自 master 的样式/位置,并且可以在 layouts 上被覆盖,而普通文本框是在特定幻灯片上的独立对象,切换布局时不会改变。
如何在整篇演示文稿中批量替换文本而不影响图表、表格和 SmartArt 中的文本?
将遍历限制在具有文本框的自动形状 (auto‑shapes),并通过分别遍历其集合或跳过这些对象类型,排除嵌入对象(charts, tables, SmartArt)。