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