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

使用工具:Spire.PDF for Java

Jar文件获取及导入方法:

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

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

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

(本文完)

转载于:https://www.cnblogs.com/Yesi/p/11271058.html

Java 添加、验证PDF 数字签名相关推荐

  1. Java PDF数字签名(五)—Java 给PDF签名时添加可信时间戳

    一.程序运行环境 编译环境:IntelliJ IDEA 所需测试文件:PDF..pfx数字证书及密钥.PDF Jar包(Free Spire.PDF for Java).签名图片(.png格式) 可信 ...

  2. java pdf数字签名_使用pdfbox的数字签名

    我想使用pdfbox将多个签名添加到我的pdf中,我尝试使用两个签名,而第二个签名总是变为无效.请咨询, 可以将PDF数字签名数次? Adobe生命周期论坛说是.使用pdfbox的数字签名 impor ...

  3. Java 添加、替换、删除PDF中的图片

    本文介绍通过java程序向PDF文档添加图片,以及替换和删除PDF中已有的图片. 工具: Free Spire.PDF for Java (免费版) Jar获取及导入:官网下载,并解压将lib文件夹下 ...

  4. java实现给PDF文件添加图片水印,java实现给PDF文件添加文字水印

    接上一篇,pdf跟tif 是一起做的 java实现 1.给PDF文件添加图片水印: public static void waterMark1(String inputFile,String outp ...

  5. pdf删除图层_在Java中以PDF添加和删除图层

    pdf删除图层 PDF层允许用户有选择地隐藏或显示PDF文档中出现在其上的内容. 在本文中,我们将介绍如何使用Free Spire.PDF for Java库在Java文档中添加图层,在图层中绘制内容 ...

  6. Java 添加PDF印章——图片印章、动态印章

    图章(印章)是一种在合同.票据.公文等文件中表明法律效应.部门机关权威的重要指示物,常见于各种格式的文件.文档中.对于纸质文档可以手动盖章,但对于电子文档,则需要通过特定的方法来实现.本篇文档分享通过 ...

  7. Java自动生成PDF并进行邮件群发

    这段时间,公司承办一个互联网峰会,需要对4000多位客户发送邀请函,其中包括一个pdf文件和一封手写信,PDF中将从公司数据库中读取所有客户姓名,自动生成到相应位置,前期尝试Java自动生成pdf文件 ...

  8. Java实现给PDF文件加文字水印和图片水印(可以自定义水印格式)

    使用Java代码给PDF文件加文字水印 直接上代码运行即可 依赖 有的可能用不上我直接复制全部了 <dependencies><!--word文件转PDF以及水印-->< ...

  9. java itext 导出pdf文件_【Java,PDF】使用Itext实现PDF文件生成

    重要声明:本文章仅仅代表了作者个人对此观点的理解和表述.读者请查阅时持自己的意见进行讨论. 前言 有时候,业务系统要求提供一个PDF文件导出的功能,这时候我们就需要将数据库的对应数据查询出来,然后生成 ...

  10. Scott Mitchell 的ASP.NET 2.0数据教程之三十九:: 在编辑和插入界面里添加验证控件...

    原文 | 下载本教程中的编码例子 | 下载本教程的PDF版 导言 到目前为止的讨论编辑DataList的教程里,没有包含任何验证用户的输入,即使是用户非法输入- 遗漏了product的name或者负的 ...

最新文章

  1. C#游戏开发快速入门2.2改变游戏对象的状态
  2. python【蓝桥杯vip练习题库】ADV-350珠心算测验
  3. 解决git无法clone地址为https的库
  4. scvmm2008R2创建委派管理员角色
  5. table: github.com/astaxie/beego/orm.Ormer not found
  6. 湛江高考2021成绩查询,2021广东省高中学业水平考试成绩查询(入口+方式)
  7. Java8的产品周期_java8的时间和`Date`的对比
  8. Qt工作笔记-对*QObject::sender()的认识
  9. 有长度要求的区间最大值
  10. 那些我在Android开发中所喜爱的Kotlin特性
  11. 11.3 帧中继基本配置
  12. 使用外网访问Flask项目
  13. Gromacs 中文手册目录
  14. 阿里云搭建大数据平台(9):kafka安装部署和测试
  15. java求2到100内的素数_java学习日记-基础-列出2~100内的素数
  16. Android5.0框架层短信接收过程分析
  17. JavaWeb中外部引入的js中涉及到location.href的页面跳转/jsp页面的外部js文件引入
  18. c语言转义字符(c语言转义字符是什么意思)
  19. cad 打开硬件加速卡_谁说没有核显就不能开启硬件加速?手把手教你开启加速
  20. 模块regsvr32 c:\Windows\SysWOW64\comdlg32.ocx 加载失败

热门文章

  1. docker中运行mysql5.7,使用navicat链接报错10061/10060
  2. 预测纽约出租车行程时间
  3. 迁移学习和数据扩充(附代码)
  4. Matlab协方差矩阵的计算原理
  5. Django - rest - framework - 下
  6. HTTP长连接和短连接(转)
  7. 20190708 帆软报表
  8. Redis HyperLogLog命令,phpredis如何执行HyperLogLog命令
  9. 解决远程服务器ssh登陆慢等问题
  10. linux/unix下telnet提示Escape character is '^]'的意义