Java 添加、修改、读取、删除PPT备注

本文介绍如何使用Java程序操作PPT幻灯片中的备注信息,包括添加、修改、读取和删除备注,通过FreeSpire.PresentationforJava实现。

概述

幻灯片中的备注信息是只提供给幻灯片演讲者观看的特定内容,在演讲者放映幻灯片时,备注信息可给演讲者提供讲解思路,起到辅助讲解的作用。本文将通过Java程序来演示如何操作PPT幻灯片中的备注信息,要点包括:

  • 添加备注信息
  • 修改备注信息
  • 读取备注信息
  • 删除备注信息

使用工具

  • Free Spire.Presentation for Java (免费版)

Jar文件获取及导入:

方法1:通过官网下载JAR文件包。下载后,解压文件,并将lib文件夹下的Spire.Presentation.jar文件导入到java程序。参考如下导入效果:

方法2:可通过maven仓库安装导入到maven项目,可参考导入方法


Java 代码示例

【示例1】添加备注信息

import com.spire.presentation.*;

public class AddSpeakNotes {
    public static void main(String[] args) throws Exception{
        //加载PowerPoint文档
        Presentation ppt = new Presentation();
        ppt.loadFromFile("sample.pptx");

        //获取第一张幻灯片
        ISlide slide = ppt.getSlides().get(2);
        //添加备注幻灯片到第一张幻灯片
        NotesSlide notesSlide = slide.addNotesSlide();

        //添加备注标题
        ParagraphEx paragraph = new ParagraphEx();
        String string = "备注:";
        paragraph.setText(string);
        notesSlide.getNotesTextFrame().getParagraphs().append(paragraph);

        //添加第一项备注
        paragraph = new ParagraphEx();
        paragraph.setText("第一项备注;");
        notesSlide.getNotesTextFrame().getParagraphs().append(paragraph);
        notesSlide.getNotesTextFrame().getParagraphs().get(1).setBulletType(TextBulletType.NUMBERED);
        notesSlide.getNotesTextFrame().getParagraphs().get(1).setBulletStyle(NumberedBulletStyle.BULLET_ARABIC_PERIOD);

        //添加第二项备注
        paragraph = new ParagraphEx();
        paragraph.setText("第二项备注;");
        notesSlide.getNotesTextFrame().getParagraphs().append(paragraph);
        notesSlide.getNotesTextFrame().getParagraphs().get(2).setBulletType(TextBulletType.NUMBERED);
        notesSlide.getNotesTextFrame().getParagraphs().get(2).setBulletStyle(NumberedBulletStyle.BULLET_ARABIC_PERIOD);

        //添加第三项备注
        paragraph = new ParagraphEx();
        paragraph.setText("第三项备注;");
        notesSlide.getNotesTextFrame().getParagraphs().append(paragraph);
        notesSlide.getNotesTextFrame().getParagraphs().get(3).setBulletType(TextBulletType.NUMBERED);
        notesSlide.getNotesTextFrame().getParagraphs().get(3).setBulletStyle(NumberedBulletStyle.BULLET_ARABIC_PERIOD);

        //保存文档
        ppt.saveToFile("AddSpeakerNotes.pptx", FileFormat.PPTX_2013);
        ppt.dispose();
    }
}

备注添加效果:

【示例2】修改备注信息

import com.spire.presentation.*;

public class ModifySpeakerNotes {
    public static void main(String[] args) throws Exception{
        //加载测试文档
        Presentation ppt = new Presentation();
        ppt.loadFromFile("AddSpeakerNotes.pptx
");

        //获取指定幻灯片
        ISlide slide = ppt.getSlides().get(2);

        //修改指定备注信息
        slide.getNotesSlide().getNotesTextFrame().getParagraphs().get(1).setText("新修改的备注信息");
        slide.getNotesSlide().getNotesTextFrame().getParagraphs().get(2).setAlignment(TextAlignmentType.CENTER);
        slide.getNotesSlide().getNotesTextFrame().getParagraphs().get(2).setBulletStyle(NumberedBulletStyle.BULLET_ROMAN_UC_PAREN_RIGHT);

        //保存文档
        ppt.saveToFile("modifySpeakerNotes.pptx",FileFormat.PPTX_2013);
        ppt.dispose();
    }
}

备注修改效果:

【示例3】读取备注信息

import com.spire.presentation.*;

import java.io.FileWriter;

public class ExtractSpeakerNotes {
    public static void main(String[] args) throws Exception{
        //加载测试文档
        Presentation ppt = new Presentation();
        ppt.loadFromFile("AddSpeakerNotes.pptx");

        //获取指定幻灯片
        ISlide slide = ppt.getSlides().get(2);

        //获取幻灯片中的备注内容
        StringBuilder builder = new StringBuilder();
        String notes = slide.getNotesSlide().getNotesTextFrame().getText();
        builder.append(notes);

        //保存到文本文档
        FileWriter writer = new FileWriter("ExtractSpeakerNotes.txt");
        writer.write(builder.toString());
        writer.flush();
        writer.close();
    }
}

备注信息读取结果:

【示例4】删除备注信息

import com.spire.presentation.*;

public class DeleteSpeakerNotes {
    public static void main(String[] args)  throws Exception{
        //加载测试文档
        Presentation ppt = new Presentation();
        ppt.loadFromFile("test.pptx");

        //获取指定幻灯片
        ISlide slide = ppt.getSlides().get(2);

        //删除备注信息
        slide.getNotesSlide().getNotesTextFrame().getParagraphs().get(0).getTextRanges().clear();//删除指定段落中的备注信息
        //slide.getNotesSlide().getNotesTextFrame().getParagraphs().clear();//删除所有备注信息

        //保存文档
        ppt.saveToFile("deleteSpeakerNotes.pptx",FileFormat.PPTX_2013);
        ppt.dispose();
    }
}

备注信息删除效果:

(本文完)

转载请注明出处!

 

<think>我们正在处理的是 PowerPoint 文件(.pptx),其中可能包含嵌入的附件(如Excel文件)。根据用户的问题,我们需要定位PPT中的附件。在Apache POI中,PPTX文件由XSLFSlideShow类处理,而嵌入的对象(如附件)通常作为OLE对象或对象数据存储。 关键点: 1.PPTX中,附件通常作为“嵌入对象”存在,POI中对应的类是`XSLFObjectData`(代表嵌入的二进制数据)。 2. 我们需要遍历幻灯片中的形状,检查每个形状是否是对象形状(`XSLFObjectShape`),然后获取其嵌入数据。 步骤: 1. 打开PPTX文件,获取所有幻灯片。 2. 遍历每张幻灯片上的所有形状。 3. 判断形状是否为`XSLFObjectShape`(表示一个嵌入对象)。 4. 通过`XSLFObjectShape`获取其关联的`XSLFObjectData`,进而可以获取到嵌入的附件数据。 注意:嵌入的对象可能包括各种类型(如Excel、Word等),我们可以通过对象的数据类型或文件扩展名来识别。 示例代码框架: ```java import org.apache.poi.xslf.usermodel.*; public class PPTXAttachmentExtractor { public static void main(String[] args) throws Exception { XMLSlideShow ppt = new XMLSlideShow(new FileInputStream("input.pptx")); // 遍历所有幻灯片 for (XSLFSlide slide : ppt.getSlides()) { // 遍历幻灯片上的所有形状 for (XSLFShape shape : slide.getShapes()) { // 检查形状是否是对象形状(嵌入对象) if (shape instanceof XSLFObjectShape) { XSLFObjectShape objShape = (XSLFObjectShape) shape; // 获取对象数据 XSLFObjectData objData = objShape.getObjectData(); // 获取嵌入对象的数据流(即附件的内容) InputStream data = objData.getData(); // 获取嵌入对象的文件类型(通常可以从对象数据的ContentType或建议的文件名中推断) // 例如,对象数据通常包含一个文件名,可以通过以下方式获取: String fileName = objShape.getObjectName(); // 注意:这个方法可能返回对象名称,但不一定是文件名 // 或者通过关系获取文件名(有时文件名存储在关系信息中) // 另一种方式:检查对象数据的Content Type(需要访问底层关系) // 可以通过objData.getContentType()获取,但注意这个方法可能返回null或需要特殊处理 // 如果嵌入的是Excel文件,ContentType可能是"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" // 然后我们可以根据这个信息将数据保存为文件 // 示例:保存附件 // 这里假设我们已知附件类型,或者通过文件名/ContentType判断 // 如果fileName不为空且有扩展名,则可以使用,否则需要根据ContentType设置扩展名 if (fileName == null || fileName.isEmpty()) { fileName = "attachment_" + System.currentTimeMillis(); // 生成一个临时文件名 // 根据ContentType设置扩展名 String contentType = objData.getContentType(); if (contentType != null) { if (contentType.equals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) { fileName += ".xlsx"; } else if (contentType.equals("application/vnd.openxmlformats-officedocument.wordprocessingml.document")) { fileName += ".docx"; } // 其他类型类似 } } // 将数据流保存到文件 FileOutputStream out = new FileOutputStream(fileName); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = data.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } out.close(); data.close(); } } } ppt.close(); } } ``` 注意: - 由于PPTX文件结构复杂,嵌入的对象可能出现在幻灯片以外的位置(如母版、注释等),但一般情况下,附件都在幻灯片上。 - 获取文件名:`XSLFObjectShape`的`getObjectName()`方法返回的是对象的名称(在PPT中设置的对象名称),不一定是原始文件名。原始文件名可能存储在对象数据的关系中,但POI的API没有直接提供获取原始文件名的方法。因此,可能需要根据内容类型设置扩展名。 - 如果PPT中包含多个附件,需要确保保存的文件名不重复。 其他获取文件名的方法:我们可以尝试从对象数据的底层关系中获取文件名。但POI的API对此支持有限,可能需要深入OLE对象的结构。 替代方案:如果附件是作为OLE对象嵌入的,那么它可能会有一个显示图标和文件名。我们可以尝试获取对象形状的替代文本(如果有的话),但替代文本中可能包含文件名。 另外,引用[4]中提到生成PPT并插入Excel附件,其中可能包含一些关于如何插入附件的线索,从而反过来帮助我们定位附件。但用户的问题是定位(读取)附件。 如果上述方法无法获取文件名,可以考虑使用一个默认的文件名(如attachment_1.xlsx)并提示用户自行检查。 相关问题: 1. 如何判断嵌入的附件是哪种类型的文件? 2.PPTX中,除了对象形状,还有其他方式嵌入附件吗? 3. 如何获取嵌入附件的原始文件名? 参考文献: [引用4]中提到使用POI生成PPT并插入Excel附件,这证明了POI确实可以处理嵌入对象。 因此,使用上述代码框架,我们可以定位并提取PPT中的附件。 注意:在运行代码前,确保POI依赖版本一致,避免出现版本冲突导致的类转换异常(如ClassCastException),如用户之前的问题所述。 依赖建议(在pom.xml中): ```xml <dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.3</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency> </dependencies> ``` 如果遇到类转换问题,请检查依赖树,排除旧版本POI。 </think>### 使用 Java POI 定位 PPT 中附件的方法 在 Java POI 中定位 PowerPoint(.pptx)文件的附件,需要通过 `XSLFObjectShape` 和 `XSLFObjectData` 类处理嵌入的 OLE 对象。以下是完整解决方案: #### 1. **依赖要求(关键)** 确保使用**统一版本**的 POI 依赖(推荐 5.2.3+): ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.3</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>5.2.3</version> <!-- 包含 XSLF 处理模块 --> </dependency> ``` #### 2. **定位附件的核心代码** ```java import org.apache.poi.xslf.usermodel.*; import org.apache.poi.openxml4j.opc.PackagePart; import java.io.InputStream; import java.util.List; public class PPTAttachmentLocator { public static void main(String[] args) throws Exception { try (XMLSlideShow ppt = new XMLSlideShow(new FileInputStream("presentation.pptx"))) { // 1. 遍历所有幻灯片 for (XSLFSlide slide : ppt.getSlides()) { // 2. 遍历幻灯片中的所有形状 for (XSLFShape shape : slide.getShapes()) { // 3. 检查是否为嵌入对象(OLE) if (shape instanceof XSLFObjectShape) { XSLFObjectShape objShape = (XSLFObjectShape) shape; // 4. 获取对象数据 PackagePart part = objShape.getPackagePart(); XSLFObjectData objData = objShape.getObjectData(); // 5. 验证是否为附件 String contentType = part.getContentType(); if (contentType.contains("oleObject") || contentType.contains("xlsx") || contentType.contains("docx")) { // 6. 提取附件信息 System.out.println("找到附件: " + objShape.getObjectName()); System.out.println("内容类型: " + contentType); System.out.println("位置: 幻灯片#" + slide.getSlideNumber()); // 7. 获取附件内容流 try (InputStream dataStream = objData.getData()) { // 此处可保存附件或处理内容 // Files.copy(dataStream, Paths.get("附件.xlsx")); } } } } } } } } ``` #### 3. **关键操作说明** 1. **对象类型验证**: - 使用 `instanceof XSLFObjectShape` 过滤嵌入对象 - 通过 `getContentType()` 识别附件类型: - Excel: `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` - Word: `application/vnd.openxmlformats-officedocument.wordprocessingml.document` - 通用 OLE: `application/vnd.openxmlformats-officedocument.oleObject` 2. **附件内容提取**: - `objData.getData()` 返回附件的二进制流 - 可直接保存为文件或使用 POI 进一步解析 3. **位置信息获取**: - `slide.getSlideNumber()` 定位附件所在幻灯片 - `objShape.getObjectName()` 获取对象名称(可能含原始文件名) #### 4. **常见问题处理** - **类转换异常**:确保所有 POI 组件版本严格一致[^1][^4] - **找不到附件**: ```java // 检查隐藏对象(如备注页) for (XSLFNotes notes : ppt.getNotes()) { for (XSLFShape shape : notes.getShapes()) { // 相同检测逻辑 } } ``` - **文件名丢失**:PPT 嵌入时可能丢失原始文件名,需通过内容类型判断 #### 5. **应用场景示例** 将 PPT 中的 Excel 附件另存为独立文件: ```java if (contentType.contains("spreadsheetml.sheet")) { String fileName = "slide_" + slide.getSlideNumber() + "_attachment.xlsx"; Files.copy(objData.getData(), Paths.get(fileName)); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值