我正在尝试使用PDFBOX库对PDF进行签名(主要遵循CreateSignature
和GitHub中example
包中的其他类)。
采用了SignatureInterface
方法,我正在向addSignature
提供一个方法,但是sign
方法未被调用。
相关代码段:
private void signPDF(PDDocument document) throws Exception {
PDSignature signature = new PDSignature();
signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
signature.setName("iSure");
signature.setLocation("IL");
signature.setReason("Security");
signature.setSignDate(Calendar.getInstance(TimeZone.getTimeZone("UTC")));
// this is the only 'foreign' call here, it looks exactly as in example
setMDPPermission(document, signature, 1);
document.addSignature(signature, new Signer());
}
调用signPDF
之后,文档立即保存到OutputStream
中。
PS:在MDP权限中,我需要删除“ DigestMethod”条目,它无法通过PDF / A元数据验证-是吗?
答案 0 :(得分:0)
好吧,追溯COSWriter
流程,我终于发现,当保存不是递增时,根本不会调用编写签名方法。在示例中清楚地说明了这一部分,但是我认为它仅与那些特定方案或继续使用PDDocument
有关,而我的情况是签名实际上是流中的终止操作。底线-我的坏事:(
所以我将上述方法更改如下:
// since forced to saveIncremental, need to finilized the input document and return a new one
private PDDocument signPDF(PDDocument document) throws Exception {
PDSignature signature = new PDSignature();
... this part stays exactly as it was
document.addSignature(signature, new Signer());
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
document.saveIncremental(baos);
return PDDocument.load(baos.toByteArray());
}
}
另一种可能性是将目标OutputStream
传递给signPDF
方法并在此处执行实际的流程终止:保存文档,然后将其关闭。
还有另一种方法是在主流(saveIncremental
调用方)中调用signPDF
。
所有这些变化都像在方法之间滚动外国关注之类的东西一样填充我...如果有人有更好的布局方法,我将很高兴听到。