我想通过使用锁签署一个pdf文件。我正在使用PDFBox 2.0.9
我想实现的流量是:
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)时,一切都像预期的那样变得正常。
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 示例代码(为控制台应用程序准备好的一个文件中的两个类):