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

时间:2017-05-11 14:23:46

标签: java pdf itext signature

我使用以下链接中的功能删除了pdf中的所有签名。

iText Remove signatures

我得到的是没有签名的pdf,但在pdf内容中有可视化表示。是否有一个删除视觉表示的功能?

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

2 个答案:

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