我想使用Lock签署pdf。我正在使用PDFBox 2.0.9
我要实现的流程是:
因此,如果有人再次编辑此表单字段,则Adobe Reader应该说此文档已更改。
"Lock" dictionary in signature field is the reason of broken signature after signing
我从这里获得了示例代码,并编写了这一代码:
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);
}
我可以签名,更改字段值并再次签名,并且签名可以。问题是当我在第二个签名后更改字段的值时,签名仍然有效。我希望在最后一次更改之后,第二个签名必须无效。
答案 0 :(得分:0)
问题出在我的代码上,因为此代码每次都会添加排除。当我像下面这样编码时(我的第一个签名名称是Signature 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);
}