Java PDF 添加数字签名的实现方法

作者:Tina_Tang 时间:2022-01-03 04:05:56 

经过数字签名的文档,能够使作者之外的人无法对其进行修改。因此,在PDF文档中添加数字签名可以保证其安全性和真实性。同时根据添加内容的差异性,数字签名可分为文本数字签名、图片数字签名、图片及文本数字签名。本文将通过Spire.PDF for Java来演示如何在PDF文档中添加数字签名。

使用工具:Spire.PDF for Java 2.11.4

Jar文件获取及导入:

方法1:通过官网下载获取Jar包。下载后,解压文件,并将lib文件夹下的Spire.Pdf.jar文件导入Java程序。(如下图)

Java PDF 添加数字签名的实现方法

方法2:通过maven仓库安装导入。具体安装教程详见此网页。

示例1:添加文本数字签名


import com.spire.pdf.PdfDocument;
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 TextSignature {
 public static void main(String[] args) {
//加载PDF文档
PdfDocument doc = new PdfDocument();
doc.loadFromFile("C:\\Users\\Test1\\Desktop\\Sample.pdf");
//加载pfx证书
PdfCertificate cert = new PdfCertificate("C:\\Users\\Test1\\Desktop\\gary.pfx", "abc123");
//添加数字签名,设置其位置和大小
PdfSignature signature = new PdfSignature(doc, doc.getPages().get(doc.getPages().getCount()-1), cert, "MySignature");
Rectangle2D rect = new Rectangle2D.Float();
rect.setFrame(new Point2D.Float((float) doc.getPages().get(0).getActualSize().getWidth() - 270, (float) doc.getPages().get(0).getActualSize().getHeight() - 300), new Dimension(200, 110));
signature.setBounds(rect);
//设置签名为文本形式
signature.setGraphicMode(GraphicMode.Sign_Detail);
//设置签名的内容
signature.setNameLabel("签字者:");
signature.setName("Gary");
signature.setContactInfoLabel("联系电话:");
signature.setContactInfo("010333555");
signature.setDateLabel("日期:");
signature.setDate(new java.util.Date());
signature.setLocationInfoLabel("地点:");
signature.setLocationInfo("US");
signature.setReasonLabel("原因:");
signature.setReason("我是文档所有者");
signature.setDistinguishedNameLabel("DN: ");
signature.setDistinguishedName(signature.getCertificate().get_IssuerName().getName());
//设置签名的字体
signature.setSignDetailsFont(new PdfTrueTypeFont(new Font("Arial Unicode MS", Font.PLAIN, 11)));
//设置文档权限为禁止更改
signature.setDocumentPermissions(PdfCertificationFlags.Forbid_Changes);
signature.setCertificated(true);
//保存文档
doc.saveToFile("output/TextSignature.pdf");
doc.close();
 }
}

文本数字签名效果:

Java PDF 添加数字签名的实现方法

示例2:添加图片数字签名


import com.spire.pdf.PdfDocument;
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 ImageSignature {
 public static void main(String[] args) {
//加载PDF文档
PdfDocument doc = new PdfDocument();
 doc.loadFromFile("C:\\Users\\Test1\\Desktop\\Sample.pdf");
//加载pfx证书
PdfCertificate cert = new PdfCertificate("C:\\Users\\Test1\\Desktop\\gary.pfx", "abc123");

//添加数字签名,设置其位置和大小
PdfSignature signature = new PdfSignature(doc, doc.getPages().get(doc.getPages().getCount()-1), cert, "MySignature");
Rectangle2D rect = new Rectangle2D.Float();
rect.setFrame(new Point2D.Float((float) doc.getPages().get(0).getActualSize().getWidth() - 250, (float) doc.getPages().get(0).getActualSize().getHeight() - 300), new Dimension(170, 150));
signature.setBounds(rect);
//设置签名为图片形式
signature.setGraphicMode(GraphicMode.Sign_Image_Only);
 signature.setSignImageSource(PdfImage.fromFile("C:\\Users\\Test1\\Desktop\\Image.png"));
//设置签名的字体
signature.setSignDetailsFont(new PdfTrueTypeFont(new Font("Arial Unicode MS", Font.PLAIN, 11)));
//设置文档权限为禁止更改
signature.setDocumentPermissions(PdfCertificationFlags.Forbid_Changes);
signature.setCertificated(true);
//保存文档
doc.saveToFile("output/ImageSignature.pdf");
doc.close();
 }
}

图片数字签名效果:

Java PDF 添加数字签名的实现方法

示例3:添加图片及文本数字签名


import com.spire.pdf.PdfDocument;
import com.spire.pdf.graphics.*;
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 TextAndImageSignature {
 public static void main(String[] args) {
//加载PDF文档
PdfDocument doc = new PdfDocument();
   doc.loadFromFile("C:\\Users\\Test1\\Desktop\\Sample.pdf");
//加载pfx证书
PdfCertificate cert = new PdfCertificate("C:\\Users\\Test1\\Desktop\\gary.pfx", "abc123");
//添加数字签名,设置其位置和大小
PdfSignature signature = new PdfSignature(doc, doc.getPages().get(doc.getPages().getCount()-1), cert, "MySignature");
Rectangle2D rect = new Rectangle2D.Float();
rect.setFrame(new Point2D.Float((float) doc.getPages().get(0).getActualSize().getWidth() - 350, (float) doc.getPages().get(0).getActualSize().getHeight() - 170), new Dimension(300, 170));
signature.setBounds(rect);
//设置签名为图片加文本模式
signature.setGraphicMode(GraphicMode.Sign_Image_And_Sign_Detail);
//设置签名的内容
signature.setNameLabel("签字者:");
signature.setName("Gary");
signature.setContactInfoLabel("联系电话:");
signature.setContactInfo("010333555");
signature.setDateLabel("日期:");
signature.setDate(new java.util.Date());
signature.setLocationInfoLabel("地点:");
signature.setLocationInfo("US");
signature.setReasonLabel("原因:");
signature.setReason("我是文档所有者");
signature.setDistinguishedNameLabel("DN: ");
  signature.setDistinguishedName(signature.getCertificate().get_IssuerName().getName());
 signature.setSignImageSource(PdfImage.fromFile("C:\\Users\\Test1\\Desktop\\Image.png"));
//设置签名的字体 signature.setSignDetailsFont(new PdfTrueTypeFont(new Font("Arial Unicode MS", Font.PLAIN, 11)));
//设置文档权限为禁止更改
signature.setDocumentPermissions(PdfCertificationFlags.Forbid_Changes);
signature.setCertificated(true);
//保存文档
doc.saveToFile("output/TextAndImageSignature.pdf");
doc.close();

}
}

图片及文本数字签名效果:

Java PDF 添加数字签名的实现方法

来源:https://segmentfault.com/a/1190000021398691

标签:Java,PDF,数字签名
0
投稿

猜你喜欢

  • JAVA设计模式----建造者模式详解

    2022-05-18 22:55:52
  • Java中检查字符串是否以特定字符结尾

    2021-08-07 20:04:47
  • JSON序列化Redis读取出错问题解决方案

    2022-10-13 18:57:50
  • Java C++题解leetcode 1684统计一致字符串的数目示例

    2023-04-23 09:06:31
  • ReentrantLock获取锁释放锁的流程示例分析

    2021-08-05 20:51:10
  • JavaCV实战之调用摄像头基础详解

    2022-07-15 02:14:10
  • 如何解决Spring in action @valid验证不生效的问题

    2023-08-29 07:59:56
  • svn 清理失败 (cleanup 失败) 的快速解决方法

    2022-10-25 11:22:40
  • Windows实现Flutter环境搭建及配置这一篇就够了

    2023-07-03 22:49:30
  • Spring+SpringMVC+MyBatis深入学习及搭建(一)之MyBatis的基础知识

    2021-09-27 15:12:59
  • C# 文件上传下载(Excel导入,多线程下载)功能的实现代码

    2021-12-09 20:16:34
  • Android实现横竖屏切换的实例代码

    2022-06-19 22:11:14
  • Netty分布式高性能工具类recycler的使用及创建

    2022-03-04 17:57:32
  • C#编写发送邮件组件

    2022-08-26 19:28:57
  • Android使用Intent.ACTION_SEND分享图片和文字内容的示例代码

    2023-12-17 02:57:28
  • Java Map接口概述和常用方法详解

    2022-07-29 14:19:06
  • java8 利用reduce实现将列表中的多个元素的属性求和并返回操作

    2021-09-29 06:53:38
  • IDEA无法使用Git Pull的问题

    2023-05-04 10:55:39
  • mybatis 对于生成的sql语句 自动加上单引号的情况详解

    2023-09-21 15:25:00
  • Java Bean与xml互相转换的方法分析

    2021-08-12 13:34:00
  • asp之家 软件编程 m.aspxhome.com