You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:52:14