iText 删除签名(扁平化过程)但保留其视觉表示

iText removes signatures (flattening process) but keeps their visual representation

我使用了以下 link 中的函数来删除 pdf 中的所有签名。

iText Remove signatures

我得到的是一个没有签名但在 pdf 内容中有视觉表示的 pdf。难道没有一个功能也可以删除视觉表示吗?

我需要这个,因为我想计算原始 pdf 的哈希值。谢谢!

您声称:我使用了以下 link 中的此功能来删除 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. Note that you have asked this question before, and that it was already adequately answered:

除非在附加模式中添加了签名(如果我是你,我不会假设),你无法获得原版PDF。 不知道签名是追加的吗?如果是这样,请将此信息添加到您的问题中。

如果附加节点中添加了签名,您可以使用下面列出的代码删除签名:

 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();
}