【发布时间】:2018-04-18 08:03:09
【问题描述】:
在 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 字典,一切都很好。
有人知道哪里出了问题吗?
【问题讨论】:
-
您是如何保存文件的?
-
@TilmanHausherr 我在添加
/Lock字典后调用save,然后加载到一个新的PDDocument,然后在签名后调用saveIncremental。 -
@TilmanHausherr 我必须在一个单独的阶段向文档添加签名字段,在另一个步骤中我放置一个签名,所以我必须在第一阶段调用
save。如果我在 Adobe Reader 中打开第一阶段创建的文档,然后在该程序中签名,则一切正常。 -
@TilmanHausherr 我已经这样做了 :-) 最后我找到了解决方案 - 我必须在添加
/Lock字典时添加:lockDict.setInt(COSName.getPDFName("P"), 1);。 -
是的,你是对的,我在 pdf 规范中也没有找到这样的键。该解决方案是基于对 Foxit Reader 生成的 pdf 文件结构的观察。我会尝试进一步阅读,也许有更好的解决方案。