从签名的 pdf 中获取原始内容

2024-01-10

我想知道如何使用 iText java 库或其他库从签名的 pdf 文档中获取原始内容。

Thanks

更新1:

可能的例子:

PdfReader reader = new PdfReader(PATH_TO_PDF);
AcroFields fields = reader.getAcroFields();
ArrayList<String> signatures = fields.getSignatureNames();
for (String signature : signatures)
{
    // Start revision extraction
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    byte bb[] = new byte[8192];
    InputStream ip = fields.extractRevision(signature);
    int n = 0;
    while ((n = ip.read(bb)) > 0)
        out.write(bb, 0, n);
    out.close();
    ip.close();
    MessageDigest md = MessageDigest.getInstance("SHA1");
    byte[] resum = md.digest(out.toByteArray());
    // End revision extraction        
}

注1:本例中所有标志均在多个标志时实现。

注2:但是哈希值不等于原始哈希文档(未签名的文档)


请看下面的图片:

在本例中,您有一个 PDF 文件(以%PDF-1.并以%%EOF)并且数字签名是文档本身的一部分。它的价值在于/Contents签名字典中的 key,也就是签名字典中的值/V签名字段字典中的条目。

无法获得原来的 PDF,因为原始 PDF 已被更改:对象被重新编号、添加了签名字段或 通过添加签名字典来“填写”。

您可以删除签名,但这不会为您提供原始 PDF 文件。

PdfReader reader = new PdfReader(SIGNED); 
AcroFields acroFields = reader.getAcroFields(); 
acroFields.removeField("sig"); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(UNSIGNED)); 
stamper.close(); 
reader.close(); 

在这种情况下,SIGNED是带有名为的签名的文件的路径"sig"。我们删除完整的签名(包括签名字段)。结果文件的路径是UNSIGNED该文件中不再有签名字段的踪迹"sig"。这不再是已签名的原始 PDF。

现在看下面的图片:

这显示了带有三个签名的 PDF。第一个签名是按照我之前描述的方式添加的:您无法再获取原始文档。

但是,第二个和第三个签名是在附加模式下添加的。这是添加额外签名的唯一方法因为更改修订版 1 会破坏第一个签名。

如果您有修订版 3(标记为Rev3),检索修订版 1 和 3 非常容易(Rev1 and Rev2)。这显示在签名 http://itextpdf.com/examples/iia.php?id=222例子:

PdfReader reader = new PdfReader(SIGNED);
AcroFields af = reader.getAcroFields();
FileOutputStream os = new FileOutputStream(REVISION);
byte bb[] = new byte[1028];
InputStream ip = af.extractRevision("first");
int n = 0;
while ((n = ip.read(bb)) > 0)
    os.write(bb, 0, n);
os.close();
ip.close();

在这个例子中"first"是签名字段的名称,SIGNED是带有签名的文件的路径,REVISION是此操作所产生的修订版本的路径。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从签名的 pdf 中获取原始内容 的相关文章

随机推荐