iText 删除签名(扁平化过程)但保留其视觉表示
iText removes signatures (flattening process) but keeps their visual representation
我使用了以下 link 中的函数来删除 pdf 中的所有签名。
我得到的是一个没有签名但在 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();
}
我使用了以下 link 中的函数来删除 pdf 中的所有签名。
我得到的是一个没有签名但在 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();
}