当前位置: 首页 > 知识库问答 >
问题:

PDF签名通过带锁的PDFBox

谯阳伯
2023-03-14

我想通过使用锁签署一个pdf文件。我正在使用PDFBox 2.0.9

我想实现的流量是:

    null
PDSignatureField signatureField = getSignatureField(pdDocument, pdSignature);
if (signatureField != null) {
    COSDictionary lockDict = new COSDictionary();
    lockDict.setItem(COSName.TYPE, COS_NAME_SIG_FIELD_LOCK);
    lockDict.setItem(COS_NAME_ACTION, COS_NAME_EXCLUDE);

    COSArray lockFields = new COSArray();
    lockFields.add(new COSString("textbox1"));

    lockDict.setItem(COS_NAME_FIELDS, lockFields);

    signatureField.getCOSObject().setItem(COS_NAME_LOCK, lockDict);

    COSDictionary transformParams = new COSDictionary(lockDict);
    transformParams.setItem(COSName.TYPE, COSName.getPDFName("TransformParams"));
    transformParams.setItem(COSName.V, COSName.getPDFName("1.2"));
    transformParams.setDirect(true);
    COSDictionary sigRef = new COSDictionary();
    sigRef.setItem(COSName.TYPE, COSName.getPDFName("SigRef"));
    sigRef.setItem(COSName.getPDFName("TransformParams"), transformParams);
    sigRef.setItem(COSName.getPDFName("TransformMethod"), COSName.getPDFName("FieldMDP"));
    //sigRef.setItem(COSName.getPDFName("Data"), pdDocument.getDocumentCatalog());
    sigRef.setDirect(true);
    COSArray referenceArray = new COSArray();
    referenceArray.add(sigRef);
    pdSignature.getCOSObject().setItem(COSName.getPDFName("Reference"), referenceArray);

}

我可以签名,更改字段值,然后再次签名,签名就可以了。问题是当我在第二个签名之后更改字段的值时,签名仍然有效。我希望在上次更改后,第二个签名一定是无效的。

共有1个答案

汪鸿志
2023-03-14

问题出在我的代码上,因为这个代码每次都会添加排除。当我像下面这样编码(我的第一个签名名是签名1)时,一切都像预期的那样变得正常。

    public static final COSName COS_NAME_LOCK = COSName.getPDFName("Lock");
    public static final COSName COS_NAME_ACTION = COSName.getPDFName("Action");
    public static final COSName COS_NAME_ALL = COSName.getPDFName("All");
    public static final COSName COS_NAME_INCLUDE = COSName.getPDFName("Include");
    public static final COSName COS_NAME_EXCLUDE = COSName.getPDFName("Exclude");
    public static final COSName COS_NAME_FIELDS = COSName.getPDFName("Fields");
    public static final COSName COS_NAME_SIG_FIELD_LOCK = COSName.getPDFName("SigFieldLock");


        PDSignatureField signatureField = getSignatureField(pdDocument, pdSignature);
        if (signatureField != null) {
            COSDictionary lockDict = new COSDictionary();
            lockDict.setItem(COSName.TYPE, COS_NAME_SIG_FIELD_LOCK);
            lockDict.setItem(COS_NAME_ACTION, COS_NAME_EXCLUDE);

            COSArray lockFields = new COSArray();
            if (pdSignature.getName().equals("Signature1")) {
                lockFields.add(new COSString("textbox1"));
            }

            lockDict.setItem(COS_NAME_FIELDS, lockFields);

            signatureField.getCOSObject().setItem(COS_NAME_LOCK, lockDict);

            COSDictionary transformParams = new COSDictionary(lockDict);
            transformParams.setItem(COSName.TYPE, COSName.getPDFName("TransformParams"));
            transformParams.setItem(COSName.V, COSName.getPDFName("1.2"));
            transformParams.setDirect(true);
            COSDictionary sigRef = new COSDictionary();
            sigRef.setItem(COSName.TYPE, COSName.getPDFName("SigRef"));
            sigRef.setItem(COSName.getPDFName("TransformParams"), transformParams);
            sigRef.setItem(COSName.getPDFName("TransformMethod"), COSName.getPDFName("FieldMDP"));
            sigRef.setDirect(true);
            COSArray referenceArray = new COSArray();
            referenceArray.add(sigRef);
            pdSignature.getCOSObject().setItem(COSName.getPDFName("Reference"), referenceArray);

        }
 类似资料:
  • 我正在尝试通过签名服务签署一个pdf文件。这个服务需要发送一个十六进制编码的SHA256摘要,作为回报,我会收到一个十六进制编码的SignatureValue。此外,我还收到了签名证书、中间证书、OCSP响应和TimeStampToken。但是,我在尝试使用SignatureValue对pdf进行签名时已经陷入了困境。 我读过布鲁诺的白皮书,过度浏览互联网,尝试了很多不同的方式,但签名不断出现无效

  • 作为我对客户机/服务器pdf签名研究的一部分,我测试了itext pdf延迟签名示例。不幸的是,我得到的合并空签名pdf和哈希值的pdf ie输出显示无效签名。 下面是我的代码片段 我正在使用pkcss11 usb令牌进行签名

  • 我正在将代码从iText5迁移到iText7,目前我正在努力将一个签名添加到已经包含另一个签名的PDF中。这些签名是用我们的国民身份证(公民卡)进行的。 在iText5中,我使用了PdfStamper,但它在Itext7中丢失了... 这是我目前所掌握的: POReID(https://github.com/POReID/POReID)是用于与智能卡交互的库。 当第一次签署文件时,它工作得很好。再

  • PDF下载示例:https://drive.google.com/file/d/12wv1Pb7gh4vCKOGhX4cZ3aOrLSiOo4If/view?usp=sharing 因此,当PDF在A.Reader(连续版本)中打开时,它表示证书无效,因为对该文档所做的更改导致签名无效。 但我看不出有什么变化。我们自己的应用程序只添加了一个签名(证书),为数千个其他PDF添加了正确的签名。未执行其

  • 我已经玩弄了一段时间的iTextSharp 5.5.7,找不到正确的方法从智能卡为PDF制作一个有效的数字签名-Adobe Reader总是说它的签名人和未知,并且不能解码签名的DER数据。 我查看了Makesignature.cs代码以供参考,以及is的功能: 然后,根据iExternalSignature.cs中的“Sign”方法 “@param message要进行散列和签名的邮件” 所以我

  • 我需要使用外部服务签署pdf文档,该服务将返回PKCS1签名。这意味着我必须在IExternalSignatureContainer实例中添加公钥。我使用iText 7进行整个签名过程。 在iText网站上有一个关于这种方法的很好的例子 我在一个文件中创建了整个演唱过程的示例。必需的引用: null 示例代码(为控制台应用程序准备好的一个文件中的两个类):