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

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

谢谢

更新1:

可能的例子:

PdfReader reader = new PdfReader(PATH_TO_PDF); AcroFields fields = reader.getAcroFields(); ArrayList 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键的值,而后者又是签名字段字典中/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( Rev1Rev2 )。 这在Signatures示例中显示:

 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是此操作产生的修订的路径。