package es.uji.security.crypto.pdf; import java.io.IOException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import com.lowagie.text.pdf.AcroFields; import com.lowagie.text.pdf.PdfPKCS7; import com.lowagie.text.pdf.PdfReader; import es.uji.security.crypto.CryptoCoreException; import es.uji.security.crypto.IDetailInformationGenerator; import es.uji.security.crypto.SignatureDetailInformation; public class PDFSignatureDetail implements IDetailInformationGenerator { @SuppressWarnings("unchecked") public List<SignatureDetailInformation> getDetails(byte[] data) throws CryptoCoreException { List<SignatureDetailInformation> result = new ArrayList<SignatureDetailInformation>(); PdfReader reader = null; try { reader = new PdfReader(data); } catch (IOException e) { return result; } AcroFields acroFields = reader.getAcroFields(); ArrayList<String> signatureNameList = acroFields.getSignatureNames(); for (String name : signatureNameList) { SignatureDetailInformation signatureDetailInformation = new SignatureDetailInformation(); PdfPKCS7 pkcs7 = acroFields.verifySignature(name); Calendar signingTime = pkcs7.getSignDate(); if (signingTime != null) { signatureDetailInformation.setSignatureTime(signingTime.getTime()); } X509Certificate certificate = pkcs7.getSigningCertificate(); if (certificate != null) { String cnField = certificate.getSubjectDN().getName(); if (cnField != null) { String[] fields = cnField.split(","); for (String f : fields) { if (f.trim().startsWith("CN=")) { signatureDetailInformation.setSignerCN(f.trim().substring(3)); } } } } result.add(signatureDetailInformation); } return result; } }