PDFBox でこれを行うには、次のような単純な SignatureInterface 実装が必要です。
public class TimestampSignatureImpl implements SignatureInterface {
private TSAClient tsaClient;
public TimestampSignatureImpl(TSAClient tsaClient) {
super();
this.tsaClient = tsaClient;
}
@Override
public byte[] sign(InputStream paramInputStream) throws IOException {
return tsaClient.getTimeStampToken(IOUtils.toByteArray(paramInputStream));
}
}
そして、次のようないくつかの PDSignature:
PDSignature signature = new PDSignature();
signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
signature.setSubFilter(COSName.getPDFName("ETSI.RFC3161"));
signature.setSignDate(Calendar.getInstance());
次に、次のように PDF に署名します。
PDDocument pdf = PDDocument.load(inputFile);
MessageDigest digest = MessageDigest.getInstance("SHA-256");
TSAClient tsaClient = new TSAClient(new URL("your time stamp authority"), null, null, digest);
pdf.addSignature(signature, new TimestampSignatureImpl(tsaClient));
pdf.saveIncremental(new FileOutputStream(outputFile));
pdf.close();
PS: TSAClient は PDFBox の例から取られています。