Java 添加、验证PDF 数字签名
程序员文章站
2022-07-01 16:26:02
在设置文档内容保护的方法中,除了对文档加密、添加水印外,应用数字签名也是一种有效防伪手段。数字签名的文件比较容易验证,并且具有较高的权威性和可信度。在PDF文档中,有可直接添加或验证数字签名的功能方法,下面的文章中,将通过Java程序来介绍添加数字签名到PDF文档,以及验证签名是否有效。 使用工具: ......
在设置文档内容保护的方法中,除了对文档加密、添加水印外,应用数字签名也是一种有效防伪手段。数字签名的文件比较容易验证,并且具有较高的权威性和可信度。在pdf文档中,有可直接添加或验证数字签名的功能方法,下面的文章中,将通过java程序来介绍添加数字签名到pdf文档,以及验证签名是否有效。
使用工具:spire.pdf for java
jar文件获取及导入方法:
方法1:可通过官网下载jar文件包。下载后,解压文件,并将lib文件夹下的spire.pdf.jar文件导入到java程序。参考如下导入效果:(这里程序将jar文件分别导入了两个module)
方法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(); } }
数字签名添加效果:
【示例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,可以参考这篇文章。
(本文完)