在PDFBox 2.x中,我将/Lock
字典放入签名字段:
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField;
public class SigningUtils {
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_SIG_FIELD_LOCK = COSName.getPDFName("SigFieldLock");
public static void setLock(PDSignatureField pdSignatureField, PDAcroForm acroForm) {
COSDictionary lockDict = new COSDictionary();
lockDict.setItem(COS_NAME_ACTION, COS_NAME_ALL);
lockDict.setItem(COSName.TYPE, COS_NAME_SIG_FIELD_LOCK);
pdSignatureField.getCOSObject().setItem(COS_NAME_LOCK, lockDict);
}
}
然后,我签名区域:
PDSignature signature = findExistingSignature(document, signatureFieldName); //This is some method to find signature field and create PDSignature dictionary
signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
signature.setName("blablabla");
signature.setLocation("blablabla");
signature.setReason("blablabla");
signature.setSignDate(Calendar.getInstance());
document.addSignature(signature, this);
除了我在Adobe Acrobat中打开签名的文档时,它抱怨文档的内容已更改,一切看起来都还不错。如果我不添加/Lock
字典,一切都很好。
任何人都知道哪里错了吗?
问题在于PDFBox签名没有考虑 Lock 字典。
根据ISO 32000-1(以及类似的ISO 32000-2):
12.8.2.4 FieldMDP
的 FieldMDP 应使用变换的方法检测的变化形式的字段列表的值。表256中列出了其转换参数字典中的条目。
[…]
* 作者还可以指定在特定收件人签名文档后,对特定表单字段的任何修改都将使该收件人签名无效。对于每个指定的接收者,应该有一个单独的签名字段,每个签名接收者都有一个相关的签名字段锁定字典(参见表233),用于指定应为该用户锁定的表单字段。
- 当接收者在字段上签名时,应创建签名,签名参考和转换参数字典。应当从签名字段锁定字典中的相应字段复制变换参数字典中的“ 动作” 和“
字段” 条目。
因此,签名 锁 字典的预期处理包括将匹配的 FieldMDP 转换数据添加到签名字段值。默认情况下,PDFBox签名不这样做。
您可以在签名期间手动执行以下操作:
PDSignatureField signatureField = FIND_YOUR_SIGNATURE_FIELD_TO_SIGN;
PDSignature signature = new PDSignature();
signatureField.setValue(signature);
COSBase lock = signatureField.getCOSObject().getDictionaryObject(COSName.getPDFName("Lock"));
if (lock instanceof COSDictionary)
{
COSDictionary lockDict = (COSDictionary) lock;
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"), document.getDocumentCatalog());
sigRef.setDirect(true);
COSArray referenceArray = new COSArray();
referenceArray.add(sigRef);
signature.getCOSObject().setItem(COSName.getPDFName("Reference"), referenceArray);
}
signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
signature.setName("blablabla");
signature.setLocation("blablabla");
signature.setReason("blablabla");
signature.setSignDate(Calendar.getInstance());
document.addSignature(signature [, ...]);
( CreateSignature辅助方法signExistingFieldWithLock
)
关于注释中讨论的签名 锁* 字典中的 P 条目:此条目已在Adobe补充ISO 32000,扩展级别3中引入。 *
我有PDF文档。 1)Adobe reader可以很好地读取文档。 2)我签署文件(使用pdfbox),一切正常 第二:当我尝试关闭文档(我的意思是关闭adobe reader)时,adobe reader会告诉我:关闭之前,是否要保存对“原始[with-attachment][signed]”的更改?我没发现你发生这种事。 下面是上传到google doc的测试文件
我正在尝试向现有的数字签名pdf(认证签名)中添加一个空签名字段。 我有一个工作流,其中许多用户将签署该文档(批准签名),该文档创建时带有“n”个空签名字段,每个用户一个,我们的应用程序首先应用一个不可见的认证签名,然后每个用户可以在各自的字段中签署该文档,但由于工作流中意外的更改,其他用户可能希望签名,因此,我们希望添加相应的空签名字段,然后应用签名。 我试图将空字段(带有单元格事件的表)添加到
对于一个关于签名数据被哈希两次的C#问题,我看到了一个类似的答复,但是我不知道为什么我的签名数据会出现在这里。 C#PKCS7 Smartchard数字签名损坏
我尝试使用智能卡(USB令牌)对pdf文件进行签名,但在Adobe中打开签名的pdf文件时,遇到错误。这个错误不是描述性的,我也不知道该去哪里看,因为代码对我来说似乎很好,但显然不是… 我使用的代码是: 我尝试签名的pdf文件是这个。 添加签名字段后创建的临时pdf文件如下。 签名的Base64格式为
我已经研究了所有类似的问题,但找不到一个应用itextsharp延迟签名的案例。 基本上,我的应用程序使用签名对pdf文档进行签名,该签名是由远程web服务创建的。 我的应用程序向这个web服务发送原始文档的哈希(添加空签名字段后可签名字节的哈希),并接收一个Base64编码的签名文件。 我将此签名嵌入到先前生成的临时pdf文件中,该文件具有空签名字段。 最后,我的签名未被验证,因为Adobe R