我使用以下链接中的功能删除了pdf中的所有签名。
我得到的是没有签名的pdf,但在pdf内容中有可视化表示。是否有一个删除视觉表示的功能?
我需要这个,因为我想计算原始pdf的哈希值。谢谢!
答案 0 :(得分:1)
您声明:我使用以下链接中的此功能删除了PDF 中的所有签名,但该示例并不意味着删除签名,它意味着展平签名(示例称为FlattenSignatures
)。
展平意味着签名字段 已移除(签名已消失),但相应的小部件注释(可视化表示为你称之为保留。
如果要删除签名字段及其窗口小部件注释,则需要删除字段:
PdfReader reader = new PdfReader(src);
AcroFields acroFields = reader.getAcroFields();
acroFields.removeField("my_signature_name");
PdfStamper stamper = new PdfStamper(reader, dest);
stamper.close();
reader.close();
但是,你声称我需要这个,因为我想计算原始pdf的哈希值。这是完全错误的。删除签名不会产生原始PDF!
如果要验证签名,则应从签名字典中定义的PDF中提取字节范围。见Verifying digital signatures in PDF documents。请注意,您之前已经问过这个问题,并且已经得到了充分的回答:iText verify integrity of a pdf in java。
除非在附加模式中添加了签名(如果我是你,我不会假设),无法获取原始PDF。您是否知道签名是否以附加模式添加?如果是,请将此信息添加到您的问题中。
答案 1 :(得分:0)
如果签名已添加到append节点中,则可以使用下面列出的代码删除签名:
PdfReader reader = new PdfReader(src);
AcroFields acroFields = reader.getAcroFields();
ArrayList<String> signatureNames = acroFields.getSignatureNames();
if(!signatureNames.isEmpty()) {
PdfStamper stamper = null;
try {
stamper = new PdfStamper(reader, dest);
for (String name : signatureNames) {
AcroFields.Item signature = (AcroFields.Item) stamper.getAcroFields().getFieldItem(name);
for (int i = 0; i < signature.size(); ++i) {
signature.getWidget(i).clear();
signature.getMerged(i).clear();
signature.getValue(i).clear();
}
}
} finally {
if (stamper != null) {
stamper.close();
}
}
}
如果您还需要删除嵌入式签名字典,则可以使用:
PdfDictionary dictionary = stamper.getAcroFields().getSignatureDictionary("signature_name");
if(dictionary!=null){
dictionary.clear();
}