使用 Java 管理演示文稿中的文本框

幻灯片上的文本通常存在于文本框或形状中。因此,要在幻灯片上添加文本,您必须先添加一个文本框,然后在文本框中放入一些文本。Aspose.Slides for Java 提供了 IAutoShape 接口,允许您添加包含文本的形状。

在幻灯片上创建文本框

要在幻灯片上创建文本框,请按照以下步骤操作:

  1. 创建 Presentation 类的实例。
  2. 获取新创建的演示文稿中第一张幻灯片的引用。
  3. 在幻灯片的指定位置添加一个 IAutoShape 对象,使用 ShapeType 设置为 Rectangle,并获取新添加的 IAutoShape 对象的引用。
  4. IAutoShape 对象添加一个 TextFrame 属性,用于包含文本。在下面的示例中,我们添加了以下文本:Aspose TextBox
  5. 最后,通过 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 提供了 ColumnCountColumnSpacing 属性(来自 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();
}

向文本框添加超链接

您可以在文本框中插入链接。单击文本框时,用户将打开该链接。

要添加包含链接的文本框,请按照以下步骤操作:

  1. 创建 Presentation 类的实例。
  2. 获取新创建的演示文稿中第一张幻灯片的引用。
  3. 在幻灯片的指定位置添加一个 AutoShape 对象,并将 ShapeType 设置为 Rectangle,获取新添加的 AutoShape 对象的引用。
  4. AutoShape 对象添加一个 TextFrame,其默认文本为 Aspose TextBox
  5. 实例化 IHyperlinkManager 类。
  6. IHyperlinkManager 对象分配给与 TextFrame 中所需部分关联的 HyperlinkClick 属性。
  7. 最后,通过 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)。