当我尝试从带有 Itext 5.1 的 PDF 中删除签名时,我发现了问题
这是我的方法:
PdfStamper stamper = new PdfStamper(reader, os);
AcroFields acroFields = reader.getAcroFields();
for (String name : acroFields.getSignatureNames()) {
acroFields.removeField(name);
}
stamper.close();
output = os.toByteArray();
此方法有效,但不适用于所有 PDF,某些 PDF 找不到带有此签名的签名。
然后我在 PDF 上发现了标记 SIG 的对象,所以我创建了一个新方法来补充签名清理方法:
private void removeSignatureObjects(PdfReader reader) {
for (int i = 1; i <= reader.getXrefSize(); i++) {
PdfObject object = reader.getPdfObject(i);
if (object != null) {
if (object.isDictionary()) {
PdfDictionary dict = (PdfDictionary) object;
if (validateObjectSign(dict)) {
dict.clear();
reader.resetReleasePage();
}
}
}
}
}
private boolean validateObjectSign(PdfDictionary dict) {
return PdfName.SIG.equals(dict.get(PdfName.TYPE))
||
(PdfName.ANNOT.equals(dict.get(PdfName.TYPE)) && PdfName.WIDGET.equals(dict.get(PdfName.SUBTYPE)) &&
PdfName.SIG.equals(dict.getAsName(PdfName.FT)));
}
它适用于我测试过的对象,但现在我不知道这是否涵盖所有 pdf 签名对象。
我需要帮助了解 PDF 中签名对象的模式是什么?