PDF 2.0 defines a new filter (Adobe.PPKLite) and sub-filter (ETSI.CAdES.detached) for PAdES signatures, which are compliant with the European eIDAS regulation.

Support for PAdES was added in v2017R1 of Qoppa’s Java PDF libraries.

This sample shows how to add a PAdES signature to a PDF document using Qoppa’s Java PDF library jPDFSecure. It is easy to update this sample to work with jPDFProcess.

// Load the document
PDFSecure pdfDoc = new PDFSecure ("input.pdf", null);
 
// Load the keystore that contains the digital id to use in signing
FileInputStream pkcs12Stream = new FileInputStream ("keystore.pfx");
KeyStore store = KeyStore.getInstance("PKCS12");
store.load(pkcs12Stream, "store_pwd".toCharArray());
pkcs12Stream.close();
 
// Create signing information
SigningInformation signInfo = new SigningInformation (store, "key_alias", "key_pwd");
signInfo.setSignatureFormat(SigningInformation.FORMAT_PADES);
 
// Create signature field on the first page
Rectangle2D signBounds = new Rectangle2D.Double (36, 36, 144, 48);
SignatureField signField = pdfDoc.addSignatureField(0, "signature", signBounds);
 
// Apply digital signature
pdfDoc.signDocument(signField, signInfo);
 
// Save the document
pdfDoc.saveDocument ("output.pdf");

Note 1: This sample is using a PCKS12 keystore but it could also be work with a PKCS11 keystore from a USB token.

Note 2: According to the CAdES specifications, you can either set the signing-certificate attribute OR the signing-certificate-v2 attribute. The former is used with SHA1 and the later can be used with SHA256 or other hashing algorithms. Our signing code creates the signing-certificate attribute and use SHA1.