服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java实现添加、验证PDF数字签名的方法示例

Java实现添加、验证PDF数字签名的方法示例

2021-10-18 13:33E-iceblue Java教程

在设置文档内容保护的方法中,除了对文档加密、添加水印外,应用数字签名也是一种有效防伪手段。本文就使用Java实现添加、验证PDF数字签名,感兴趣的可以了解一下

在设置文档内容保护的方法中,除了对文档加密、添加水印外,应用数字签名也是一种有效防伪手段。数字签名的文件比较容易验证,并且具有较高的权威性和可信度。在pdf文档中,有可直接添加或验证数字签名的功能方法,下面的文章中,将通过java程序来介绍添加数字签名到pdf文档,以及验证签名是否有效。

使用工具:spire.pdf for java

jar文件获取及导入方法:

方法1:可通过官网下载jar文件包。下载后,解压文件,并将lib文件夹下的spire.pdf.jar文件导入到java程序。参考如下导入效果:(这里程序将jar文件分别导入了两个module)

Java实现添加、验证PDF数字签名的方法示例

方法2:可通过maven仓库安装导入。

java代码示例

【示例1】添加数字签名到pdf

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import com.spire.pdf.*;
import com.spire.pdf.graphics.pdfimage;
import com.spire.pdf.graphics.pdftruetypefont;
import com.spire.pdf.security.graphicmode;
import com.spire.pdf.security.pdfcertificate;
import com.spire.pdf.security.pdfcertificationflags;
import com.spire.pdf.security.pdfsignature;
 
import java.awt.*;
import java.awt.geom.point2d;
import java.awt.geom.rectangle2d;
 
public class addcertificate {
    public static void main(string[]args){
        //加载pdf文档
        pdfdocument doc = new pdfdocument();
        doc.loadfromfile("test.pdf");
 
        //加载pfx证书,及证书秘钥
        pdfcertificate cert = new pdfcertificate("cermia.pfx","123654yes!");
 
        //添加数字签名到指定页面,并设置其位置和大小
        pdfsignature signature = new pdfsignature(doc, doc.getpages().get(2), cert, "mysignature");
        rectangle2d rect = new rectangle2d.float();
        rect.setframe(new point2d.float((float) doc.getpages().get(0).getactualsize().getwidth() - 340, (float) doc.getpages().get(0).getactualsize().getheight() - 230), new dimension(280, 150));
        signature.setbounds(rect);
 
        //设置签名为图片加文本模式
        signature.setgraphicmode(graphicmode.sign_image_and_sign_detail);
 
        //设置签名的内容
        signature.setnamelabel("签字者:");
        signature.setname("mia");
        signature.setcontactinfolabel("联系电话:");
        signature.setcontactinfo("02881705109");
        signature.setdatelabel("日期:");
        signature.setdate(new java.util.date());
        signature.setlocationinfolabel("地点:");
        signature.setlocationinfo("成都");
        signature.setreasonlabel("原因:");
        signature.setreason("文档所有者");
        signature.setdistinguishednamelabel("dn: ");
        signature.setdistinguishedname(signature.getcertificate().get_issuername().getname());
        signature.setsignimagesource(pdfimage.fromfile("sign.png"));
 
        //设置签名的字体
        signature.setsigndetailsfont(new pdftruetypefont(new font("arial unicode ms", font.plain, 9)));
 
        //设置文档权限为禁止更改
        signature.setdocumentpermissions(pdfcertificationflags.forbid_changes);
        signature.setcertificated(true);
 
        //保存文档
        doc.savetofile("addsignature.pdf");
        doc.close();
    }
}

数字签名添加效果:

Java实现添加、验证PDF数字签名的方法示例

【示例2】验证数字签名有效性

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import com.spire.pdf.*;
import com.spire.pdf.security.pdfsignature;
import com.spire.pdf.widget.pdfformfieldwidgetcollection;
import com.spire.pdf.widget.pdfformwidget;
import com.spire.pdf.widget.pdfsignaturefieldwidget;
 
import javax.swing.*;
 
public class validatesignature {
    public static void main(string[]args){
        //创建pdfdocument实例
        pdfdocument doc = new pdfdocument();
        //加载含有签名的pdf文件
        doc.loadfromfile("signnedfile.pdf");
 
        //获取域集合
        pdfformwidget pdfformwidget = (pdfformwidget) doc.getform();
        pdfformfieldwidgetcollection pdfformfieldwidgetcollection = pdfformwidget.getfieldswidget();
 
        //遍历域
        for (int i = 0; i < pdfformfieldwidgetcollection.getcount(); i++) {
            //判定是否为签名域
            if (pdfformfieldwidgetcollection.get(i) instanceof pdfsignaturefieldwidget) {
                //获取签名域
                pdfsignaturefieldwidget signaturefieldwidget = (pdfsignaturefieldwidget) pdfformfieldwidgetcollection.get(i);
                //获取签名
                pdfsignature signature = signaturefieldwidget.getsignature();
 
                //判定签名是否有效
                boolean result = signature.verifysignature();
                if (result) {
                    string str1 =" 有效签名";
                    joptionpane.showmessagedialog(null,str1);
                } else {
                    string str2 =" 无效签名";
                    joptionpane.showmessagedialog(null,str2);
                }
            }
        }
 
    }
}

验证结果:

Java实现添加、验证PDF数字签名的方法示例

扩展:java 添加签名域到pdf,可以参考这篇文章

到此这篇关于java实现添加、验证pdf数字签名的方法示例的文章就介绍到这了,更多相关java pdf数字签名内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/Yesi/p/11271058.html

延伸 · 阅读

精彩推荐
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7472021-02-04
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16