如何在Java应用中使用PDFBox移除PDF中的嵌入文件?
使用PDFBox移除PDF中所有嵌入文件的解决方案
核心原理
PDF中的嵌入文件主要存储在两个位置:
- 文档级的**名称字典(Names Dictionary)**的
EmbeddedFiles条目下,对应全局嵌入的文件 - 页面中的文件附件注释(FileAttachment Annotation),对应和页面绑定的附件
要完全移除所有嵌入文件,需要同时处理这两个位置。
代码实现(基于PDFBox 2.x)
以下是完整的可运行代码,包含文档级嵌入文件移除和页面附件注释清理:
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageTree; import org.apache.pdfbox.pdmodel.common.PDNameTreeNode; import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationFileAttachment; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class RemoveEmbeddedFiles { public static void main(String[] args) { try (PDDocument document = PDDocument.load(new File("input.pdf"))) { // 1. 移除文档级全局嵌入文件 removeDocumentLevelEmbeddedFiles(document); // 2. 移除所有页面中的文件附件注释 removePageAttachmentAnnotations(document); // 保存处理后的PDF document.save(new File("output.pdf")); } catch (IOException e) { e.printStackTrace(); } } private static void removeDocumentLevelEmbeddedFiles(PDDocument document) { // 获取文档目录的名称字典,移除EmbeddedFiles条目 if (document.getDocumentCatalog().getNames() != null) { document.getDocumentCatalog().getNames().setEmbeddedFiles(null); } } private static void removePageAttachmentAnnotations(PDDocument document) { PDPageTree pages = document.getPages(); for (PDPage page : pages) { List<PDAnnotation> annotations = page.getAnnotations(); if (annotations == null || annotations.isEmpty()) { continue; } // 过滤掉所有文件附件类型的注释 List<PDAnnotation> filteredAnnotations = new ArrayList<>(); for (PDAnnotation annotation : annotations) { if (!(annotation instanceof PDAnnotationFileAttachment)) { filteredAnnotations.add(annotation); } } // 更新页面的注释列表 page.setAnnotations(filteredAnnotations); } } }
关键说明
- 文档级处理:通过
PDNamesDictionary.setEmbeddedFiles(null)直接移除全局嵌入文件的名称树,清除所有文档级别嵌入的文件。 - 页面注释处理:遍历每个页面的注释,筛选保留非文件附件类型的注释,替换原列表后彻底移除页面上的附件标记及关联文件。
- 资源管理:使用try-with-resources语法自动关闭
PDDocument,避免资源泄漏。 - 版本兼容:代码基于PDFBox 2.0+版本,确保项目依赖最新稳定版的PDFBox。
依赖配置(Maven示例)
如果使用Maven,需在pom.xml中添加PDFBox依赖:
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.32</version> <!-- 替换为最新稳定版 --> </dependency>
内容的提问来源于stack exchange,提问作者digitalfootmark
相关产品推荐
相关产品推荐

