PDFBOX-签署PDF时,不会调用SignatureInterface的标志

时间:2019-08-10 08:32:42

标签: pdf pdfbox sign

我正在尝试使用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元数据验证-是吗?

1 个答案:

答案 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

所有这些变化都像在方法之间滚动外国关注之类的东西一样填充我...如果有人有更好的布局方法,我将很高兴听到。