Java 实现 PDF 附件的添加与删除:四种实用方法

在很多专业或学术场景中,PDF 文档常常需要附带额外的文件,例如 Excel 表格、PPT 演示或者参考资料。能够在 PDF 中管理附件,有助于文档的组织、共享,也方便接收者快速访问相关内容。

本文将介绍 四种在 Java 中添加和删除 PDF 附件的方法,包括直接附件和注释附件两种类型:

  1. 向 PDF 添加普通附件

  2. 通过注释方式附加文件

  3. 删除普通附件

  4. 删除注释附件


安装所需库

这些示例使用 Spire.PDF for Java,它提供了加载 PDF、添加附件、管理注释以及保存修改等功能。你可以下载 JAR 包并引入项目,也可以通过 Maven 添加依赖:

复制代码
<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.pdf</artifactId>
        <version>12.4.4</version>
    </dependency>
</dependencies>

添加到项目后,就可以在 Java 中对 PDF 附件进行操作。


方法一:添加普通附件

最简单的方式是将文件直接作为 普通附件 附加到 PDF 中,这种附件会显示在 PDF 的附件面板中。例如,将 Excel 文件添加到报告中:

java 复制代码
import com.spire.pdf.PdfDocument;
import com.spire.pdf.attachments.PdfAttachment;

public class AttachFilesToPdf {

    public static void main(String[] args) {
        // 创建 PDF 文档对象
        PdfDocument doc = new PdfDocument();

        // 加载已有 PDF 文件
        doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Sample.pdf");

        // 创建附件对象
        PdfAttachment attachment = new PdfAttachment("C:\\Users\\Administrator\\Desktop\\Data.xlsx");

        // 添加附件到 PDF
        doc.getAttachments().add(attachment);

        // 保存更新后的 PDF
        doc.saveToFile("Attachment.pdf");

        // 关闭文档
        doc.close();
    }
}

说明:普通附件会在附件面板中显示,可直接打开,适用于附加数据文件或参考资料。


方法二:通过注释附加文件

对于需要提示用户的场景,可以通过 注释附件 添加文件,这样可以在页面上显示提示文字,引导用户点击打开附件。例如,在 PDF 中显示 "Here is the report:" 并附加 PPT 文件:

java 复制代码
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.annotations.*;
import com.spire.pdf.graphics.*;
import com.spire.pdf.PdfDocument;

import java.awt.*;
import java.awt.geom.Dimension2D;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.EnumSet;

public class AnnotationAttachment {

    public static void main(String[] args) throws IOException {
        PdfDocument doc = new PdfDocument();
        doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Sample.pdf");

        // 获取第一页
        PdfPageBase page = doc.getPages().get(0);

        // 绘制提示文字
        String label = "请查看附件报告:";
        PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("微软雅黑", Font.PLAIN, 13));
        double x = 35;
        double y = page.getActualSize().getHeight() - 220;
        page.getCanvas().drawString(label, font, PdfBrushes.getRed(), x, y);

        // 将外部文件转换为字节数组
        String filePath = "C:\\Users\\Administrator\\Desktop\\Report.pptx";
        byte[] data = toByteArray(filePath);

        // 根据文字长度计算注释位置
        Dimension2D size = font.measureString(label);
        Rectangle2D bound = new Rectangle2D.Float((float) (x + size.getWidth() + 5), (float) y, 10, 15);

        // 创建附件注释
        PdfAttachmentAnnotation annotation = new PdfAttachmentAnnotation(bound, filePath, data);
        annotation.setColor(new PdfRGBColor(new Color(0, 128, 128)));
        annotation.setFlags(EnumSet.of(PdfAnnotationFlags.Default));
        annotation.setIcon(PdfAttachmentIcon.Graph);
        annotation.setText("点击此处打开附件");

        // 添加注释到页面
        page.getAnnotationsWidget().add(annotation);

        // 保存文档
        doc.saveToFile("Attachments.pdf");
        doc.close();
    }

    // 将文件转换为字节数组
    public static byte[] toByteArray(String filePath) throws IOException {
        File file = new File(filePath);
        long fileSize = file.length();
        if (fileSize > Integer.MAX_VALUE) {
            System.out.println("文件过大...");
            return null;
        }
        FileInputStream fi = new FileInputStream(file);
        byte[] buffer = new byte[(int) fileSize];
        int offset = 0;
        int numRead;
        while (offset < buffer.length
                && (numRead = fi.read(buffer, offset, buffer.length - offset)) >= 0) {
            offset += numRead;
        }
        if (offset != buffer.length) {
            throw new IOException("无法完整读取文件 " + file.getName());
        }
        fi.close();
        return buffer;
    }
}

说明:注释附件可以在页面上提供可点击提示,更适合需要交互提示的文档,例如报告或展示材料。


方法三:删除普通附件

如果 PDF 中的附件已经不再需要,可以通过附件集合删除:

java 复制代码
import com.spire.pdf.PdfDocument;
import com.spire.pdf.attachments.PdfAttachmentCollection;

public class RemoveAttachments {

    public static void main(String[] args) {
        PdfDocument doc = new PdfDocument();
        doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Attachments.pdf");

        // 获取普通附件集合(不包含注释附件)
        PdfAttachmentCollection attachments = doc.getAttachments();

        // 删除所有附件
        attachments.clear();

        // 或者删除指定附件
        // attachments.removeAt(0);

        // 保存更新后的 PDF
        doc.saveToFile("output/DeleteAttachments.pdf");
        doc.close();
    }
}

说明:只会删除普通附件,不影响注释附件。


方法四:删除注释附件

如果 PDF 中的附件是通过 注释方式添加 的,需要遍历页面注释并删除:

java 复制代码
import com.spire.pdf.PdfDocument;
import com.spire.pdf.annotations.PdfAnnotation;
import com.spire.pdf.annotations.PdfAnnotationCollection;
import com.spire.pdf.annotations.PdfAttachmentAnnotationWidget;

public class RemoveAnnotationAttachments {

    public static void main(String[] args) {
        PdfDocument doc = new PdfDocument();
        doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Attachments.pdf");

        // 遍历每一页
        for (int i = 0; i < doc.getPages().getCount(); i++) {
            PdfAnnotationCollection annotationCollection = doc.getPages().get(i).getAnnotationsWidget();

            // 遍历注释并删除附件注释
            for (Object annotation : annotationCollection) {
                if (annotation instanceof PdfAttachmentAnnotationWidget) {
                    annotationCollection.remove((PdfAnnotation) annotation);
                }
            }
        }

        // 保存文档
        doc.saveToFile("output/DeleteAnnotationAttachments.pdf");
        doc.close();
    }
}

说明:该方法只会删除注释附件,普通附件不会受到影响。


总结

通过这四种方法,我们可以灵活地在 PDF 中管理附件:

  1. 普通附件 -- 直接嵌入文件,可在附件面板查看。

  2. 注释附件 -- 在页面上提供可点击提示,更直观。

  3. 删除普通附件 -- 清理不再需要的附件。

  4. 删除注释附件 -- 清理通过注释方式添加的附件。

相关推荐
小小尚@1 小时前
AI 加持!Adobe Acrobat DC 2026 解锁 PDF 高效办公新体验
人工智能·pdf
phltxy1 小时前
Redis 持久化机制
java·redis·git
竹之月1 小时前
【Auto CAD 2020】单张打印输出PDF图纸A0、A1尺寸,黑白颜色
经验分享·pdf·auto cad2020
Gerardisite1 小时前
企业微信客户管理系统实战:标签、分层与自动化流程搭建
java·python·机器人·自动化·企业微信
ch.ju1 小时前
Java程序设计(第3版)第三章——数组的定义方式
java·开发语言
Chloeis Syntax1 小时前
JavaEE学习日记(2)---文件操作和IO
java·笔记·学习·java-ee
无风听海1 小时前
OAuth 2.0 response_type完全指南
java·开发语言·oauth
Cyan_RA91 小时前
SpringMVC 数据格式化处理 详解
java·开发语言·spring·mvc·ssm·springmvc·数据格式化
SunnyDays10111 小时前
Java 实现 PDF 中文文本查找与高亮的四种方法
java·pdf·查找文字