欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java 添加、验证PDF 数字签名

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

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

使用工具:spire.pdf for java

jar文件获取及导入方法:

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

Java 添加、验证PDF 数字签名

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

 

java代码示例

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

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】验证数字签名有效性

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,可以参考这篇文章

 

(本文完)