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

目录
  • Jar文件获取及导入方法:

在设置文档内容保护的方法中,除了对文档加密、添加水印外,应用数字签名也是一种有效防伪手段。数字签名的文件比较容易验证,并且具有较高的权威性和可信度。在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,可以参考这篇文章。

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

(0)

相关推荐

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

    经过数字签名的文档,能够使作者之外的人无法对其进行修改.因此,在PDF文档中添加数字签名可以保证其安全性和真实性.同时根据添加内容的差异性,数字签名可分为文本数字签名.图片数字签名.图片及文本数字签名.本文将通过Spire.PDF for Java来演示如何在PDF文档中添加数字签名. 使用工具:Spire.PDF for Java 2.11.4 Jar文件获取及导入: 方法1:通过官网下载获取Jar包.下载后,解压文件,并将lib文件夹下的Spire.Pdf.jar文件导入Java程序.(如下

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

    目录 Jar文件获取及导入方法: 在设置文档内容保护的方法中,除了对文档加密.添加水印外,应用数字签名也是一种有效防伪手段.数字签名的文件比较容易验证,并且具有较高的权威性和可信度.在PDF文档中,有可直接添加或验证数字签名的功能方法,下面的文章中,将通过Java程序来介绍添加数字签名到PDF文档,以及验证签名是否有效. 使用工具:Spire.PDF for Java Jar文件获取及导入方法: 方法1:可通过官网下载jar文件包.下载后,解压文件,并将lib文件夹下的Spire.Pdf.jar

  • C#/VB.NET 给Excel添加、删除数字签名的方法

    一.程序环境 以下内容通过C#及VB.NET代介绍如何给Excel文档添加数字签名,以及删除Excel文档中已有的数字签名.工具使用最近发布的Spire.XLS for .NET 版本10.11.2,可在官网下载包,或者通过Nuget搜索下载:编辑代码前,注意先将Spire.XLS.dll添加引用到VS,并添加相应using指令,如下添加引用效果: 二.C# / VB示例代码 1. 添加数字签名 C# using Spire.Xls; using Spire.Xls.Core.MergeSpre

  • Python实现合并同一个文件夹下所有PDF文件的方法示例

    本文实例讲述了Python实现合并同一个文件夹下所有PDF文件的方法.分享给大家供大家参考,具体如下: 一.需求说明 下载了网易云课堂的吴恩达免费的深度学习的pdf文档,但是每一节是一个pdf,我把这些PDF文档放在一个文件夹下,希望合并成一个PDF文件.于是写了一个python程序,很好的解决了这个问题. 二.数据形式 三.合并效果 四.python代码实现 # -*- coding:utf-8*- import sys reload(sys) sys.setdefaultencoding('

  • java自定义注解验证手机格式的实现示例

    1.@Valid与@Validated的区别 1.1 基本区别 @Valid:Hibernate validation校验机制 @Validated:Spring Validator校验机制,这个也是最常用的 @Validation只是对@Valid进行了二次封装,在使用上并没有太大区别,但在分组.注解位置.嵌套验证等功能上有所不同 1.2 作用范围 @Validated:用在类型.方法和方法参数上.但不能用于成员属性(field) @Valid:可以用在方法.构造函数.方法参数和成员属性(fi

  • Java实现可配置换肤的方法示例

    目录 接口设计 数据库设计 逻辑代码 实体类 jpa controller 返回示例 最后 夏天来了,是不是要给App换个夏天主题的皮肤呢?但是夏天过去后再换回默认皮肤难道还需要再重新发版么.不需要的,下面来编写个通用的配置项接口,可以做个让运营可配置的APP换肤功能.只要切换参数值,就可以让App换回原来的皮肤. 接口设计 在设计接口前,需要考虑的是可能不只换肤需要页面联动变化,其他功能也需要,例如APP不同的版本,某个功能是否展示.这种通用的配置项,都可以使用一个接口返回. 所以考虑扩展性,

  • Java网络编程之URL+URLconnection使用方法示例

    目录 HTTP GET和POST 从URLs到本地文件 在java.net包中包含两个有趣的类:URL类和URLConnection类.这两个类可以用来创建客户端到web服务器(HTTP服务器)的连接.下面是一个简单的代码例子: URL url = new URL("http://jenkov.com"); URLConnection urlConnection = url.openConnection(); InputStream input = urlConnection.getI

  • vscode添加GIT和SVN的方法示例

    一.添加SVN (1)添加svn插件 (2)安装的svn最好是默认路径安装的,不要问我为什么,因为很多软件都是按照默认路径找到bin的 表示安装正确,参考 vscode打开文件夹后右下角提示如下报错:SVN not found. Install it or configure it using the "svn.path" 同时输出窗口提信息:Svn installation not found. 错误原因: vscode找不到本地的svn.exe. 这个exe在默认安装Tortois

  • @Validated验证List集合的方法示例

    在开发时发现,@Validated只能验证单个实体类,在验证List集合时则不生效 @PostMapping(value="/test") public ApiResult getRepaymentPlan(@RequestBody @Validated List<Test> repaymentPlanVOs){ } 经过查资料得知,@valid是可以使用的,我们自定义一个ValidList类来替换List就可以达到验证的目的,话不多说,直接看代码 public class

  • Java实现Excel导入导出数据库的方法示例

    本文实例讲述了Java实现Excel导入导出数据库的方法.分享给大家供大家参考,具体如下: 由于公司需求,想通过Excel导入数据添加到数据库中,而导入的Excel的字段是不固定的,使用得通过动态创建数据表,每个Excel对应一张数据表,怎么动态创建数据表,可以参考前面一篇<java使用JDBC动态创建数据表及SQL预处理的方法>. 下面主要讲讲怎么将Excel导入到数据库中,直接上代码:干货走起~~ ExcellToObjectUtil 类 主要功能是讲Excel中的数据导入到数据库中,有几

  • C#实现WPS文件转PDF格式的方法示例

    本文实例讲述了C#实现WPS文件转PDF格式的方法.分享给大家供大家参考,具体如下: 这里主要是采用C#将wps文件转为PDF.需要提前安装好WPS,并在程序中添加引用using Microsoft.Office.Interop.Word; 具体源码如下所示: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.IO; using Microsoft.O

随机推荐