使用 Itext 从 Java 中的 PDF 文件中删除签名

问题描述 投票:0回答:0

当我尝试从带有 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 中签名对象的模式是什么?

java pdf itext pdf-generation digital-signature
© www.soinside.com 2019 - 2024. All rights reserved.