`

Java 添加、验证PDF 数字签名

阅读更多

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

    }
}

 

验证结果:


 

 

 

(本文完)

 

 

  • 大小: 43.2 KB
  • 大小: 152.8 KB
  • 大小: 14.7 KB
0
0
分享到:
评论

相关推荐

    PDF数字签名(ITEXT+keytool)

    1. **PDF数字签名**:PDF数字签名是一种用于验证PDF文档未经修改的机制。它使用非对称加密,通过将文档的哈希值与签名者的私钥一起加密,然后嵌入到PDF中。当读者打开文档时,会使用签名者的公钥解密哈希并重新计算...

    java多种方式实现pdf文件电子签名

    它的电子签名功能强大,支持创建、验证和添加数字签名。在使用iTextPDF进行电子签名时,首先需要获取证书,这通常来自认证机构(CA)。然后,通过iTextPDF的SignatureAppearance和PdfStamper类,可以创建一个可视化...

    java数字签名(签名生成,用证书验证签名)[汇编].pdf

    java数字签名(签名生成,用证书验证签名)[汇编].pdf

    pdf.rar_java数字水印_pdf_pdf签名_数字签名_签名

    本资源包含"java数字水印"、"pdf签名"、"数字签名"以及"签名"的相关内容,特别是针对PDF文件的签名操作。 Java数字水印: Java是一种跨平台的编程语言,它允许开发者创建用于在PDF文件中添加水印的程序。数字水印...

    java实现pdf文件电子签名

    Apache PDFBox是一个常用的开源Java库,可以用于读写PDF文件,包括添加电子签名。首先,我们需要加载PFX证书,然后创建PDFSignatureAppearance对象,设置签名的位置和大小。接着,创建签署者信息,包括证书、时间戳...

    Java+电子签名,生成PDF格式的合同

    Java电子签名技术是一种在PDF文档中实现安全、可验证签署的方法,它结合了现代加密技术和数字证书,确保了文档的完整性和不可篡改性。在本文中,我们将深入探讨如何利用Java来生成带有电子签名的PDF格式合同。 首先...

    java数字签名(签名生成,用证书验证签名)[定义].pdf

    "java数字签名和证书应用" 数字签名是指使用某种签名算法对某些内容进行数字签名后得到的数字凭证。证书(Certificate)是数字签名的一种特殊形式,是用某种签名算法对某些内容(比如公钥)进行数字签名后得到的,...

    对pdf文档进行数字签名

    - 选择合适的加密库,确保其支持PDF签名功能。 - 理解PDF规范,特别是与签名相关的部分(如ISO 32000-1)。 - 正确处理证书和私钥的安全存储,避免泄露。 - 处理签名时间戳,以证明签名的确切时间。 至于工具,除了...

    XML数字签名技术的研究及在Java中的实现.pdf

    将签名添加到XML文档中。 5. 接收方使用公钥验证签名的有效性。 **5. 应用领域** - **电子商务**: 保证交易数据的安全性和完整性。 - **电子政务**: 实现政府间的数据交换。 - **医疗保健**: 保护患者隐私的...

    Free Spire.PDF for JAVA

    Free Spire.PDF for JAVA可以支持许多功能,例如从PDF中提取文本,在PDF文档中绘制文本/图像/形状,创建和填充表单域,创建 PDF/A-1,添加和验证 PDF 数字签名。 此外,Free Spire.PDF for JAVA 支持将PDF 转换为...

    免费版 PDF Java组件_Free Spire.PDF for Java 1.1.0

    Free Spire.PDF for JAVA 是一个 100% 免费的 PDF API, 在 JAVA 应用程序上调用该组件即可读取,...支持添加 PDF 数字签名并验证 PDF 文档上的签名。 4.易于集成。 可以轻松集成到 Java 应用程序(J2SE 和 J2EE)中。

    pdfdigisign:一个用于签名和验证PDF文件中的数字签名的Java库

    PDFdigisign是一个Java库,专门设计用于对PDF文档进行数字签名和验证。在深入讨论这个库之前,让我们首先理解一下数字签名的概念及其在PDF文件中的应用。 数字签名是一种先进的安全技术,它允许用户在电子文档上...

    Java实现浏览器CA证书的签名和验证

    本文将深入探讨数字证书的基本概念,以及如何利用Java技术实现浏览器与服务器之间基于数字证书的安全通信,重点在于数字证书的签名和验证过程。 #### 数字证书及其重要性 数字证书是一种在网络上验证用户身份的...

    基于JAVA的数字签名设计与实现.pdf

    将数字签名S1和从接收到的消息中得到的数字签名s2比较,若S1和s2相等,则数字签名得到验证,否则,数字签名可能是篡改或伪造。 美国国家标准技术研究所(NITS)于1991提出了数字签名标准DDS,并在1993年和1996年...

    itext-5.4.2资源包附带pdf加密、pdf水印签名java文件

    它允许用户使用证书来签署PDF,验证签名的有效性,并显示签名信息,如签名人、签名时间等。此外,iText还支持可视化展示签名,可以将签名图像嵌入到PDF中。 在提供的压缩包中,我们看到有多个jar文件,例如`itext...

    Java Applet小程序的数字签名和客户端认证.pdf

    具体而言,当浏览器检测到经过数字签名的Java Applet程序时,会自动搜索匹配的数字签名并进行验证。如果签名验证通过,则允许Java小程序在客户端执行。这种方法既保障了程序的安全性,又能够赋予经过认证的Java程序...

    Java加密和数字签名编程快速入门[整理].pdf

    4)数字签名:数字签名是一种用于验证数据完整性和发送者身份的技术。它结合了消息摘要和非对称加密。发送者使用自己的私钥对消息摘要进行加密,接收者可以使用发送者的公钥解密这个签名,然后对比解密后的摘要和...

    Pdf电子签名及jar包

    PDF电子签名技术是一种确保文档完整性和来源真实性的安全机制,广泛应用于各种电子文档的签署与验证。在Java环境中,JSIGNPDF...同时,源码的学习有助于提高对PDF签名机制的理解,从而开发出更符合业务需求的安全功能。

    adobe pdf编辑器 java利用itextpdf根据模板导出pdf配套资源

    此外,iTextPDF还支持更复杂的功能,比如添加水印、创建复杂的表格、处理图像和签名验证等。开发者可以根据实际需求,结合Adobe PDF编辑器的可视化编辑和iTextPDF的编程能力,实现各种自定义的PDF生成逻辑。 总之,...

    网络安全技术应用——数字签名技术在Java中的实现.pdf

    其核心是采用加密技术的加、解密算法体制来实现对信息的数字签名。数字签名技术的应用范围非常广泛,在保障电子数据交换的安全性上是一个突破性的进展。 在数字签名技术中,发送者使用秘密密钥对报文进行加密,将...

Global site tag (gtag.js) - Google Analytics