我需要从签名后的PDF文档中提取签名字段,以创建打印版的签名。到目前为止,我已经使用以下iText代码成功地恢复了签名者证书、原因、签名日期和其他字段:
PdfReader reader = new PdfReader(signedPdf);
AcroFields af = reader.getAcroFields();
ArrayList<String> names = af.getSignatureNames();
SimpleDateFormat sdf = new SimpleDateFormat(
"dd/MM/yyyy 'a las' HH:mm:ss");
for (int i = 0; i < names.size(); ++i) {
StringBuilder sb = new StringBuilder();
String name = names.get(i);
PdfPKCS7 pk = af.verifySignature(name);
String firmante = CertificateInfo.getSubjectFields(
pk.getSigningCertificate()).getField("CN");
sb.append("Nombre del firmante: " + firmante + "\n");
Date signDate = pk.getSignDate().getTime();
String sdate = sdf.format(signDate);
sb.append("Fecha y hora de la firma: " + sdate + "\n");
String razon = pk.getReason();
sb.append("proposito: " + razon + "\n");
}
据我所知,PDF签名是使用iText PdfPkcs7类创建的,使用setExternalDigest方法添加了在外部应用程序中创建的PKCS1字节数组。该文件看起来已经正确签名,并且可以通过外部工具验证。
// Create the signature
PdfPKCS7 sgn = new PdfPKCS7(null, chain, "SHA1", "BC", null, false);
//pkcs1Bytes is a byte array with the signed document hash
sgn.setExternalDigest(pkcs1Bytes, null, "RSA");
然而,打印版本所需的一个必要字段是“签名数字图章”,它是已签署文档哈希或PKCS1的base64字符串。
能够从已签名的PDF文档中提取那些PKCS1字节吗?
修改:我忘了提到,在验证签名后使用PdfPKCS7.getEncodedPKCS1()
方法时,会抛出ExceptionConverter: java.security.SignatureException: object not initialized for signing
异常。