验证 pdf 中的数字签名是确定文档未被篡改,并且确实由声明的签署者签署的关键步骤。这一验证过程对于保持文档的完整性和可信度至关重要。同时,提取数字签名可以让你获取签名的详细信息,包括签名图片和数字证书信息等,这些信息对于后续的验证和归档工作非常重要。这篇文章将介绍如何使用 spire.pdf for java 和 java 验证或提取 pdf 中的数字签名。
安装 spire.pdf for java
首先,您需要在 java 程序中添加 spire.pdf.jar 文件作为依赖项。jar 文件可以从此链接下载。如果您使用 maven,则可以将以下代码添加到项目的 pom.xml 文件中,从而在应用程序中导入 jar 文件。
com.e-iceblue
e-iceblue
https://repo.e-iceblue.cn/repository/maven-public/
e-iceblue
spire.pdf
11.2.3
java 验证 pdf 数字签名
spire.pdf for java 提供了 pdfsignature.verifysignature() 方法,用于检查 pdf 文档中数字签名的有效性。详细步骤如下:
- 创建 pdfdocument 类的对象。
- 使用 pdfdocument.loadfromfile() 方法加载 pdf 文档。
- 使用 pdfdocument.form 属性获取 pdf 文档的表单。
- 遍历表单中的所有域,找到签名域。
- 使用 pdfsignaturefieldwidget.getsignature() 方法获取签名。
- 使用 pdfsignature.verifysignature() 方法验证签名的有效性。
- java
import com.spire.pdf.pdfdocument;
import com.spire.pdf.fields.pdffield;
import com.spire.pdf.security.pdfsignature;
import com.spire.pdf.widget.pdfformwidget;
import com.spire.pdf.widget.pdfsignaturefieldwidget;
public class verifysignature {
public static void main(string[] args) {
// 创建 pdfdocument 对象
pdfdocument pdf = new pdfdocument();
// 加载 pdf 文档
pdf.loadfromfile("签名.pdf");
// 获取 pdf 文档的表单
pdfformwidget formwidget = (pdfformwidget) pdf.getform();
if (formwidget.getfieldswidget().getcount() > 0) {
// 遍历表单中的所有域
for (int i = 0; i < formwidget.getfieldswidget().getcount(); i ) {
pdffield field = formwidget.getfieldswidget().get(i);
// 查找签名域
if (field instanceof pdfsignaturefieldwidget) {
pdfsignaturefieldwidget signaturefield = (pdfsignaturefieldwidget) field;
// 获取签名
pdfsignature signature = signaturefield.getsignature();
// 验证签名
boolean valid = signature.verifysignature();
if (valid) {
system.out.print("签名有效!");
} else {
system.out.print("签名无效!");
}
}
}
}
}
}
java 检查已签名的 pdf 是否被修改
要验证已签名的 pdf 文档是否被修改,你可以使用 pdfsignature.verifydocmodified() 方法。详细步骤如下:
- 创建 pdfdocument 类的对象。
- 使用 pdfdocument.loadfromfile() 方法加载 pdf 文档。
- 使用 pdfdocument.form 属性获取 pdf 文档的表单。
- 遍历表单中的所有域,找到签名域。
- 使用 pdfsignaturefieldwidget.getsignature() 方法获取签名。
- 使用 pdfsignature.verifydocmodified() 方法检查文档自签署以来是否已被修改。
- java
import com.spire.pdf.pdfdocument;
import com.spire.pdf.fields.pdffield;
import com.spire.pdf.security.pdfsignature;
import com.spire.pdf.widget.pdfformwidget;
import com.spire.pdf.widget.pdfsignaturefieldwidget;
public class checkifsignedpdfismodified {
public static void main(string[] args) {
// 创建 pdfdocument 对象
pdfdocument pdf = new pdfdocument();
// 加载 pdf 文档
pdf.loadfromfile("签名.pdf");
// 获取 pdf 文档的表单
pdfformwidget formwidget = (pdfformwidget) pdf.getform();
if (formwidget.getfieldswidget().getcount() > 0) {
// 遍历表单中的所有域
for (int i = 0; i < formwidget.getfieldswidget().getcount(); i ) {
pdffield field = formwidget.getfieldswidget().get(i);
// 查找签名域
if (field instanceof pdfsignaturefieldwidget) {
pdfsignaturefieldwidget signaturefield = (pdfsignaturefieldwidget) field;
// 获取签名
pdfsignature signature = signaturefield.getsignature();
// 验证签名
boolean modified = signature.verifydocmodified();
if (modified) {
system.out.print("文档已被修改!");
} else {
system.out.print("文档未被修改!");
}
}
}
}
}
}
java 从 pdf 中提取签名图片和数字证书信息
你可以使用 pdfformwidget.extractsignatureasimages() 和 pdfsignature.getcertificate().tostring() 方法从 pdf 中提取签名图片和数字证书信息。详细步骤如下:
- 创建 pdfdocument 类的对象。
- 使用 pdfdocument.loadfromfile() 方法加载 pdf 文档。
- 使用 pdfdocument.form 属性获取 pdf 文档的表单。
- 使用 pdfformwidget.extractsignatureasimages() 方法提取签名图片,然后将每个图片保存到文件。
- 遍历表单中的所有域,找到签名域。
- 使用 pdfsignaturefieldwidget.getsignature() 方法获取签名。
- 使用 pdfsignature.getcertificate().tostring() 方法获取签名的数字证书信息。
- java
import com.spire.pdf.pdfdocument;
import com.spire.pdf.fields.pdffield;
import com.spire.pdf.security.pdfsignature;
import com.spire.pdf.widget.pdfformwidget;
import com.spire.pdf.widget.pdfsignaturefieldwidget;
import javax.imageio.imageio;
import java.awt.*;
import java.awt.image.bufferedimage;
import java.io.bufferedwriter;
import java.io.file;
import java.io.filewriter;
import java.io.ioexception;
public class extractsignatureimage {
public static void main(string[] args) {
// 创建 pdfdocument 对象
pdfdocument pdf = new pdfdocument();
// 加载 pdf 文档
pdf.loadfromfile("签名.pdf");
// 获取 pdf 文档的表单
pdfformwidget formwidget = (pdfformwidget) pdf.getform();
// 提取签名图片
image[] images = formwidget.extractsignatureasimages();
// 遍历图片并将每个图片保存到文件
for (int i = 0; i < images.length; i ) {
try {
// 将 image 转换为 bufferedimage
bufferedimage bufferedimage = (bufferedimage) images[i];
// 指定输出文件路径
file outputfile = new file("output\\签名_" i ".png");
// 将图片保存为 png 文件
imageio.write(bufferedimage, "png", outputfile);
} catch (ioexception e) {
e.printstacktrace();
}
}
// 创建文本文件以保存数字证书信息
try (bufferedwriter writer = new bufferedwriter(new filewriter("output\\数字证书信息.txt"))) {
if (formwidget.getfieldswidget().getcount() > 0) {
// 遍历表单中的所有域
for (int i = 0; i < formwidget.getfieldswidget().getcount(); i ) {
pdffield field = formwidget.getfieldswidget().get(i);
// 查找签名域
if (field instanceof pdfsignaturefieldwidget) {
pdfsignaturefieldwidget signaturefield = (pdfsignaturefieldwidget) field;
// 获取签名
pdfsignature signature = signaturefield.getsignature();
// 获取签名的数字证书信息
string certificateinfo = signature.getcertificate() != null ? signature.getcertificate().tostring() : "没有证书";
// 将数字证书信息写入文本文件
writer.write("数字证书信息: \n" certificateinfo);
writer.write("-----------------------------------\n");
}
}
} else {
writer.write("未找到签名域。");
}
} catch (ioexception e) {
e.printstacktrace();
}
}
}
申请临时 license
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用javascript。获取有效期 30 天的临时许可证。