我有数千个使用 iText 签名并加盖时间戳的 PDF 文档。
出于法律原因,我现在需要能够从任何 PDF 中提取与时间戳相关的所有数据(当然包括日期/时间,还包括 TSA 名称、他的公共证书、签名哈希和使用的算法)。
我可以检测 PDF 是否实际上带有时间戳,并使用以下代码(受此处找到的代码启发)提取日期/时间:
AcroFields acroFields = reader.getAcroFields();
List<String> names = acroFields.getSignatureNames();
String sigName = names.get(names.size() - 1);
PdfPKCS7 pdfPkcs7 = acroFields.verifySignature(sigName);
for (String name: names) {
System.out.printf("Signature : %s\n", name);
if (pdfPkcs7.getTimeStampDate() != null) {
SimpleDateFormat date_format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS");
System.out.println("Signed on: " + date_format.format(pdfPkcs7.getSignDate().getTime()));
System.out.println("TimeStamp: " + date_format.format(pdfPkcs7.getTimeStampDate().getTime()));
System.out.println("Timestamp token : " + pdfPkcs7.getTimeStampToken().toString());
System.out.println("Timestamp verified : " + pdfPkcs7.verifyTimestampImprint());
System.out.println("Subject: " + pdfPkcs7.getSigningCertificate());
} else {
System.out.println("No timestamp found");
}
我认为我的目标可以通过使用getTimeStampToken()和getSigningCertificate()函数轻松实现...实际上getTimeStampToken()
返回类似org.bouncycastle.tsp.TimeStampToken@59f55efc
, 并getSigningCertificate()
返回与用于签署文档的证书相关的信息,这与那个无关由 TSA 使用。
有人可以帮助我获得预期的结果吗?