PowerPoint 中的演讲者备注可以用来记录讲解要点、补充说明、提醒事项、参考信息或演示提示。这些内容不会直接显示在幻灯片上,但演讲者可以在演示过程中查看。
如果演示文稿是由程序自动生成或维护的,备注内容往往也需要同步处理。例如,培训系统在根据模板生成课件时,可以同时写入讲师备注;文档处理系统则可能需要批量提取已有 PPT 中的备注,用于审核、归档或内容迁移。
本文将介绍如何使用 Java 为 PowerPoint 幻灯片添加演讲者备注、读取已有备注、删除不再需要的备注,以及批量处理多张幻灯片中的备注内容。
本文示例使用 Spire.Presentation for Java。如果使用 Maven,可以在项目的 pom.xml 中添加对应依赖:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.presentation</artifactId>
<version>11.7.2</version>
</dependency>
</dependencies>如果项目没有使用 Maven,也可以下载安装包,然后手动将所需 JAR 文件添加到项目依赖中。
在 PowerPoint 中,演讲者备注与具体幻灯片关联。每张幻灯片都可以有自己独立的备注内容,但这些文字不会出现在正常的幻灯片放映画面中。
使用 Spire.Presentation for Java 时,可以先获取指定幻灯片,为其创建备注页,然后将一段或多段文字添加到备注文本框中。
下面的示例为第一张幻灯片添加多条演讲者备注:
import com.spire.presentation.*;
public class AddSpeakerNotes {
public static void main(String[] args) throws Exception {
// 加载 PowerPoint 演示文稿
Presentation presentation = new Presentation();
presentation.loadFromFile("示例演示文稿.pptx");
// 获取第一张幻灯片
ISlide slide = presentation.getSlides().get(0);
// 为当前幻灯片创建备注页
NotesSlide notesSlide = slide.addNotesSlide();
// 添加第一段备注
ParagraphEx paragraph = new ParagraphEx();
paragraph.setText("重点说明:");
notesSlide.getNotesTextFrame().getParagraphs().append(paragraph);
// 添加第二段备注
paragraph = new ParagraphEx();
paragraph.setText(
"说明本季度增长主要来自企业客户。"
);
notesSlide.getNotesTextFrame().getParagraphs().append(paragraph);
// 添加第三段备注
paragraph = new ParagraphEx();
paragraph.setText(
"切换到下一张幻灯片前,简单介绍各区域的数据分布。"
);
notesSlide.getNotesTextFrame().getParagraphs().append(paragraph);
// 保存结果
presentation.saveToFile(
"添加演讲者备注后的演示文稿.pptx",
FileFormat.PPTX_2013
);
presentation.dispose();
}
}其中最关键的一步是为当前幻灯片创建备注页:
NotesSlide notesSlide = slide.addNotesSlide();获得备注页后,就可以通过它的文本框添加备注内容:
ParagraphEx paragraph = new ParagraphEx();
paragraph.setText("重点说明:");
notesSlide.getNotesTextFrame()
.getParagraphs()
.append(paragraph);如果备注中包含多个不同的讲解要点,建议分别保存为多个段落,而不是全部写在一大段文字中。
这样不仅在 PowerPoint 中查看时更清楚,后续如果需要修改或删除其中某一条备注,也更容易处理。
这种方式尤其适合自动生成的演示文稿。例如,报表系统可以把图表和关键数据写入幻灯片,同时把图表背后的解释、数据口径或演讲提示写入对应的备注区域。
备注并不一定都是由当前程序创建的。
有时我们需要处理用户上传的 PPT,例如批量读取已有演示文稿中的讲稿、提取培训课件中的讲师说明,或者将备注内容导出到其他系统。
读取某张幻灯片的备注时,可以先获取其 NotesSlide 对象:
NotesSlide notesSlide = slide.getNotesSlide();然后通过备注文本框读取其中的文字。
下面的示例遍历整个演示文稿,并输出每张幻灯片中的备注:
import com.spire.presentation.*;
public class ReadSpeakerNotes {
public static void main(String[] args) throws Exception {
// 加载 PowerPoint 演示文稿
Presentation presentation = new Presentation();
presentation.loadFromFile("添加演讲者备注后的演示文稿.pptx");
// 遍历所有幻灯片
for (int i = 0; i < presentation.getSlides().getCount(); i++) {
ISlide slide = presentation.getSlides().get(i);
NotesSlide notesSlide = slide.getNotesSlide();
// 部分幻灯片可能没有备注页
if (notesSlide != null) {
String notes = notesSlide
.getNotesTextFrame()
.getText();
System.out.println(
"第 " + (i + 1) + " 张幻灯片:\n" + notes
);
}
}
presentation.dispose();
}
}这里有一个细节很重要:
if (notesSlide != null) {
// 读取备注
}并不是每一张幻灯片都一定包含演讲者备注。
因此,在处理来源不确定的 PowerPoint 文件时,最好先判断 getNotesSlide() 是否返回 null,再继续读取备注内容。
例如,一个演示文稿只有第 1 张和第 3 张幻灯片包含备注,输出可能类似:
第 1 张幻灯片:
重点说明:
说明本季度增长主要来自企业客户。
切换到下一张幻灯片前,简单介绍各区域的数据分布。
第 3 张幻灯片:
提醒听众:当前数据仍为初步统计结果。提取出来的备注可以继续写入 TXT、数据库或其他文档,也可以交给后续程序进行搜索、审核或内容分析。
对于需要管理大量演示文稿的系统来说,这种方式可以避免逐个打开 PPT 手动查看备注。
有些情况下,在对外发送演示文稿之前,需要先清理其中的演讲者备注。
例如,一份内部使用的 PPT 中可能包含这样的提示:
提醒:这一组数据目前还没有最终确认。这些内容在内部会议中很有用,但如果演示文稿需要发送给客户、合作伙伴或其他外部人员,就可能不适合继续保留在文件中。
如果需要删除某张幻灯片中的全部备注,可以直接清空备注文本框中的段落集合:
notesSlide.getNotesTextFrame()
.getParagraphs()
.clear();下面的示例会遍历整个演示文稿,并清除所有幻灯片中的备注文字:
import com.spire.presentation.*;
public class RemoveSpeakerNotes {
public static void main(String[] args) throws Exception {
// 加载演示文稿
Presentation presentation = new Presentation();
presentation.loadFromFile("添加演讲者备注后的演示文稿.pptx");
// 遍历所有幻灯片
for (int i = 0; i < presentation.getSlides().getCount(); i++) {
ISlide slide = presentation.getSlides().get(i);
NotesSlide notesSlide = slide.getNotesSlide();
if (notesSlide != null) {
// 删除全部备注段落
notesSlide.getNotesTextFrame()
.getParagraphs()
.clear();
}
}
// 保存清理后的演示文稿
presentation.saveToFile(
"删除演讲者备注后的演示文稿.pptx",
FileFormat.PPTX_2013
);
presentation.dispose();
}
}如果不想删除全部备注,只需要移除其中某一个段落,可以使用 removeAt():
notesSlide.getNotesTextFrame()
.getParagraphs()
.removeAt(1);这里的段落索引从 0 开始,因此 removeAt(1) 删除的是第二个备注段落。
如果一张幻灯片中保存了多个不同用途的讲解信息,这种方式可以只删除指定内容,而保留其他备注。
在自动生成演示文稿时,演讲者备注通常和幻灯片上的正文内容来自同一份业务数据。
例如,可以提前准备每张幻灯片对应的讲解提示:
String[] speakerNotes = {
"先介绍项目当前的整体进展。",
"说明项目进度发生变化的主要原因。",
"向听众重点介绍当前的三个主要风险。"
};然后遍历幻灯片,为每张幻灯片添加对应的备注:
for (int i = 0;
i < presentation.getSlides().getCount()
&& i < speakerNotes.length;
i++) {
ISlide slide = presentation.getSlides().get(i);
NotesSlide notesSlide = slide.getNotesSlide();
if (notesSlide == null) {
notesSlide = slide.addNotesSlide();
}
ParagraphEx paragraph = new ParagraphEx();
paragraph.setText(speakerNotes[i]);
notesSlide.getNotesTextFrame()
.getParagraphs()
.append(paragraph);
}这里没有直接调用 addNotesSlide(),而是先判断当前幻灯片是否已经存在备注页:
if (notesSlide == null) {
notesSlide = slide.addNotesSlide();
}这样处理已有 PowerPoint 文件会更稳妥,因为某些幻灯片可能已经包含备注,而另一些没有。
在实际项目中,备注内容当然不一定来自数组,也可以来自 JSON、数据库、Excel、接口返回数据,或者和幻灯片内容共用同一套模板数据。
例如,一个培训系统可以为每个章节保存以下几类数据:
幻灯片标题
幻灯片正文
讲师备注生成课件时,把标题和正文放到幻灯片中,同时将“讲师备注”写入对应的演讲者备注区域。
这样最终生成的课件既可以直接用于展示,也能为授课人员提供完整的讲解提示。
演讲者备注和 PowerPoint 批注都会保存一些不会直接成为幻灯片主体内容的信息,但两者的用途并不一样。
演讲者备注主要是给演讲者本人使用的,例如:
而批注主要用于演示文稿编辑和审核阶段,更适合记录类似这样的反馈:
把这张图表替换成最新版本。或者:
请确认第三季度收入数据是否准确。简单来说,如果这段内容描述的是演讲时需要说什么或注意什么,通常适合放在演讲者备注中。
如果内容描述的是文件还需要修改什么,一般更适合使用批注。
把两类信息区分开,对于程序自动处理 PowerPoint 也更方便。例如,可以只提取演讲稿,而不会把审核人员留下的修改意见一起混入结果中。
处理其他用户创建的 PowerPoint 文件时,有几个细节值得注意。
首先,并不是所有幻灯片都有备注页。因此,在读取或修改备注之前,最好检查:
slide.getNotesSlide()是否返回 null。
其次,一张幻灯片的备注可能包含多个段落。如果直接调用:
clear()会清除全部备注。如果只需要删除其中一部分内容,应使用 removeAt() 针对指定段落进行处理。
另外,演讲者备注虽然不会显示在正常的幻灯片放映画面上,但它们仍然保存在 PowerPoint 文件中。
因此,如果演示文稿准备发送给客户或其他外部人员,最好在发送之前检查备注内容,避免把内部提示、尚未确认的信息或只供演讲者参考的内容一起发送出去。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。