Java 读取、修改和清空 PDF 文档属性(元数据)

PDF 文件除了正文内容,还可以保存一些文档属性,例如标题、作者、主题、关键词以及创建时间。这些信息通常不会直接显示在 PDF 页面上,但可以在 PDF 阅读器的文档属性中查看。

例如,整理一批项目报告时,可能需要检查文件的作者和标题是否正确,或者在对外发送 PDF 前清理不需要保留的文档属性。

本文将介绍如何使用 Java 读取、修改和清空 PDF 中的常见文档属性。

一、添加 Maven 依赖

首先,在 Java 项目的 ​​pom.xml​​ 文件中添加以下 Maven 仓库和依赖:

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.pdf</artifactId>
        <version>12.10.3</version>
    </dependency>
</dependencies>

下面以一个名为 ​​report.pdf​​ 的文件为例。三个代码示例均使用该文件作为输入,可以分别运行。

二、读取 PDF 文档属性

如果需要查看 PDF 的标题、作者、关键词等信息,可以使用 ​​PdfDocument.getDocumentInformation()​​ 方法。

该方法返回一个 ​​PdfDocumentInformation​​ 对象,通过它可以获取 PDF 中保存的常见文档属性。

完整代码如下:

csharp 复制代码
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfDocumentInformation;

public class ReadPDFProperties {

    public static void main(String[] args) {

        // 创建 PDF 文档对象
        PdfDocument pdf = new PdfDocument();

        try {
            // 加载 PDF 文件
            pdf.loadFromFile("report.pdf");

            // 获取文档属性
            PdfDocumentInformation info =
                    pdf.getDocumentInformation();

            // 读取并输出属性信息
            System.out.println("标题:" + info.getTitle());
            System.out.println("作者:" + info.getAuthor());
            System.out.println("主题:" + info.getSubject());
            System.out.println("关键词:" + info.getKeywords());

            System.out.println("创建程序:" + info.getCreator());
            System.out.println("PDF 生成程序:" + info.getProducer());

            System.out.println("创建时间:" + info.getCreationDate());
            System.out.println("修改时间:" + info.getModificationDate());

        } finally {
            // 释放文档资源
            pdf.close();
        }
    }
}

运行后,程序会将 PDF 的文档属性输出到控制台。

其中,几个容易混淆的属性需要区分:

  • ​Title​:文档标题,不一定与 PDF 文件名相同。
  • ​Author​:文档作者。
  • ​Subject​:文档主题或内容描述。
  • ​Keywords​:用于描述或分类文档的关键词。
  • ​Creator​:创建原始文档的应用程序。
  • ​Producer​:生成 PDF 文件的软件或组件。

例如,一份报告可能最初由 Microsoft Word 创建,再通过其他软件转换为 PDF。此时,​​Creator​​ 和 ​​Producer​​ 记录的可能是不同的信息。

另外,并不是所有 PDF 都包含完整的文档属性。如果某个字段没有设置,读取结果可能为空或 ​​null​​,具体取决于文件内容。

三、修改 PDF 文档属性

如果 PDF 的标题、作者或其他信息不正确,可以直接修改,而不需要重新生成正文内容。

例如,一份项目报告原来的标题是"项目报告初稿",正式发布时可以将其修改为"2026 年第三季度项目报告",同时更新作者、主题和关键词。

通过 ​​PdfDocumentInformation​​ 对象提供的 ​​setTitle()​​、​​setAuthor()​​ 等方法,就可以完成这些操作。

完整代码如下:

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

import java.util.Date;

public class UpdatePDFProperties {

    public static void main(String[] args) {

        // 创建 PDF 文档对象
        PdfDocument pdf = new PdfDocument();

        try {
            // 加载 PDF 文件
            pdf.loadFromFile("report.pdf");

            // 获取文档属性
            PdfDocumentInformation info =
                    pdf.getDocumentInformation();

            // 修改文档标题
            info.setTitle("2026 年第三季度项目报告");

            // 修改作者
            info.setAuthor("项目管理部");

            // 修改主题
            info.setSubject("第三季度项目进度与风险分析");

            // 修改关键词
            info.setKeywords("项目报告, 进度, 风险分析");

            // 更新修改时间
            info.setModificationDate(new Date());

            // 保存修改后的 PDF
            pdf.saveToFile("report-updated.pdf");

            System.out.println("PDF 文档属性已更新");

        } finally {
            // 释放文档资源
            pdf.close();
        }
    }
}

运行后,会生成 ​​report-updated.pdf​​。

这里主要使用了以下方法:

方法 作用
​​setTitle()​​ 设置文档标题
​​setAuthor()​​ 设置作者
​​setSubject()​​ 设置主题
​​setKeywords()​​ 设置关键词
​​setModificationDate()​​ 设置修改时间

示例通过 ​​new Date()​​ 将修改时间设置为程序运行时的当前时间。

需要注意,修改 PDF 文档属性并不会修改 PDF 页面中实际显示的文字。

例如,将 ​​Title​​ 设置为"2026 年第三季度项目报告",不会自动更改 PDF 首页的标题。

文档属性与页面内容是两个不同的部分。如果需要同步修改页面上的文字,还需要另外处理 PDF 正文。

四、清空 PDF 中的常见文档属性

有时 PDF 文件需要发送给外部人员,但其中的作者、创建程序或其他文档属性已经不再适合保留。

对于这些常见的文本属性,可以将相应字段设置为空字符串。

例如,下面的代码清空 PDF 的标题、作者、主题、关键词和创建程序信息。

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

public class ClearPDFProperties {

    public static void main(String[] args) {

        // 创建 PDF 文档对象
        PdfDocument pdf = new PdfDocument();

        try {
            // 加载 PDF 文件
            pdf.loadFromFile("report.pdf");

            // 获取文档属性
            PdfDocumentInformation info =
                    pdf.getDocumentInformation();

            // 清空常见文本属性
            info.setTitle("");
            info.setAuthor("");
            info.setSubject("");
            info.setKeywords("");
            info.setCreator("");

            // 保存处理后的 PDF
            pdf.saveToFile("report-cleared-properties.pdf");

            System.out.println("指定的 PDF 文档属性已清空");

        } finally {
            // 释放文档资源
            pdf.close();
        }
    }
}

运行后,程序会生成 ​​report-cleared-properties.pdf​​。

代码中的关键操作是:

arduino 复制代码
info.setTitle("");
info.setAuthor("");
info.setSubject("");
info.setKeywords("");
info.setCreator("");

这些语句将指定属性的值设置为空字符串。

需要特别注意:清空上述字段不等于彻底删除 PDF 中的所有元数据。

PDF 除了常见的文档信息字段,还可能包含 XMP 元数据、自定义属性及其他内部信息。

因此,该示例适合清空指定的常见文档属性,但不能直接作为完整的 PDF 元数据清理或敏感信息删除方案。

如果文件涉及隐私或合规要求,还需要检查其他元数据以及 PDF 正文、批注、附件等内容。

五、操作 PDF 文档属性时需要注意的问题

1. 文档属性和 XMP 元数据有所不同

PDF 可以通过文档信息字典保存标题、作者等常见属性,也可能通过 XMP 保存结构化元数据。

两者可能包含相同或相似的信息,但并不意味着修改其中一处后,另一处就一定同步更新。

本文主要操作的是 ​​PdfDocumentInformation​​ 中的常见字段。如果需要检查或修改 XMP 元数据,应另外处理。

2. 修改后需要重新保存文件

读取文档属性不会改变原文件。

但修改或清空属性后,需要调用 ​​saveToFile()​​ 将结果保存到 PDF 文件中。

本文将结果保存为新的文件,便于与原始 PDF 对比,也可以避免误覆盖源文件。

3. 创建时间不一定等于文件创建时间

PDF 文档属性中的 ​​CreationDate​​ 与操作系统显示的文件创建时间不是一回事。

例如,将一份旧 PDF 复制到新的文件夹中,文件系统记录的创建时间可能发生变化,但 PDF 内部的创建日期仍可能保留原值。

如果需要根据时间进行文件归档或筛选,应该先明确使用的是 PDF 内部时间,还是文件系统时间。

4. 部分属性可能由生成软件重新写入

在保存 PDF 时,处理软件可能更新某些属性,例如修改时间或 ​​Producer​​ 信息。

因此,如果需要清理特定属性,建议在保存后重新打开输出文件,检查这些字段的实际值,而不是只根据代码执行成功就判断清理完成。

相关推荐
SL_staff1 小时前
从‘改一行代码等三天’到‘改完即生效’:实施工程师的逻辑引擎避坑手记
java·产品·全栈
小羊没烦恼!1 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
hhwyqwqhhwy1 小时前
设备树之 provider 和 consumer
java·linux·前端
\光辉岁月/1 小时前
9.日期时间类
java·date·localdatetime·日期类
用户3721574261351 小时前
Java 操作 PPT 超链接:添加、修改和删除
java
需要8261 小时前
容器化 Java:镜像瘦身与 JVM 容器感知(cgroup)
java·开发语言·jvm
Thomas.Sir2 小时前
第2课:SpringBoot4.x 项目构建:Maven/Gradle配置详解,父工程与依赖管理
java·spring boot
譕痕2 小时前
Rabbit 实例
java·开发语言·java-rabbitmq
weixin_448771722 小时前
使用Aspose给PDF添加水印
java·pdf