繁体   English   中英

签署文件时出现PDFBox 2.0.8问题

[英]PDFBox 2.0.8 issue while signing document

我正在尝试使用此方法签署pdf,但获得的文档没有大小:

public static void sign(PDDocument doc) throws KeyStoreException, NoSuchAlgorithmException, CertificateException,
        IOException, UnrecoverableKeyException {
    System.out.println("Document pages ? " + doc.getNumberOfPages());
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
    ks.load(VisibleSignature.class.getResourceAsStream(CERT_FILE), ALIAS_PASS);
    System.out.println("KeyStore is null ? " + (ks == null));
    VisibleSignature vs = new VisibleSignature(ks, ALIAS_PASS.clone());
    InputStream is = Resource.get(IMAGE_FILE);
    int page = 1;
    vs.setVisibleSignDesigner(doc, 0, 0, -50, is, page);
    is.close();
    vs.setVisibleSignatureProperties("Test", "Test", "Test", 0, page, true);
    PDSignature signature = new PDSignature();
    PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm();
    System.out.println("Acroform is null ? " + (acroForm == null));
    System.out.println("Acroform getNeedAppearances ? " + (acroForm.getNeedAppearances()));
    if (acroForm != null && acroForm.getNeedAppearances())
        if (acroForm.getFields().isEmpty())
            acroForm.getCOSObject().removeItem(COSName.NEED_APPEARANCES);
        else
            System.out.println("/NeedAppearances is set, signature may be ignored by Adobe Reader");
    signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
    signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
    if (vs.visibleSignatureProperties != null) {
        vs.visibleSignatureProperties.buildSignature();
        signature.setName(vs.visibleSignatureProperties.getSignerName());
        signature.setLocation(vs.visibleSignatureProperties.getSignerLocation());
        signature.setReason(vs.visibleSignatureProperties.getSignatureReason());
        System.out.println("SignerName " + vs.visibleSignatureProperties.getSignerName());
    }
    signature.setSignDate(Calendar.getInstance());
    vs.signatureOptions = new SignatureOptions();
    vs.signatureOptions.setVisualSignature(vs.visibleSignatureProperties.getVisibleSignature());
    vs.signatureOptions.setPage(vs.visibleSignatureProperties.getPage() - 1);
    doc.addSignature(signature, vs.signatureOptions);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    doc.saveIncremental(baos);
    doc.close();
    IOUtils.closeQuietly(vs.signatureOptions);
    byte[] content = baos.toByteArray();
    System.out.println("Content length: >>>>>>>>>>>>>>>>>>> " + content.length);
}

这就是我在日食日志中得到的:

18:50:25,702信息[默认任务14]标准输出-文档页面? 1

18:50:25,740信息[默认任务14]标准输出-KeyStore为空?

18:50:25,779信息[默认任务14]标准输出-Acroform为空吗?

18:50:25,780信息[默认任务14]标准输出-Acroform getNeedAppearances吗?

18:50:25,782信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-PDF结构已创建

18:50:25,782信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDFTemplateCreator-pdf构建已开始

18:50:25,782信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-ProcSet数组已创建

18:50:25,782信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-PDF页面已创建

18:50:25,783信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-AcroForm已创建

18:50:25,788信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-签名字段已创建

18:50:25,788信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-PDSignature已创建

18:50:25,788信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-AcroForm词典已创建

18:50:25,789信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-已添加矩阵

18:50:25,792信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-签名矩形已创建

18:50:25,793信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-格式化矩形

18:50:25,815信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-可见签名图像已创建

18:50:25,815信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-持有人表单流已创建

18:50:25,816信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-持有人表单资源已创建

18:50:25,816信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-持有人表单已创建

18:50:25,816信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-PDF外观字典已创建

18:50:25,817信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-已创建另一种形式的流(内部形式-它将在持有人形式内)

18:50:25,817信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-已创建另一种形式的资源(内部形式-它将在持有人形式内)

18:50:25,817信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-已创建另一种形式(内部形式-它将在持有人形式内)

18:50:25,817信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-现在在内部表单中插入内部表单

18:50:25,817信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-创建的图像表单流

18:50:25,817信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-创建的图像表单资源

18:50:25,818信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-创建的图像表单

18:50:25,818信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-创建的背景层表单

18:50:25,818信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-将ProcSet插入PDF

18:50:25,818信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-将外观流注入pdf

18:50:25,818信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-可见签名已创建

18:50:25,819信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder-WidgetDictionary已创建

18:50:25,825 DEBUG [默认任务14] org.apache.pdfbox.cos.COSStream-创建InputStream,而无需在流之前写入数据的情况下调用它。

18:50:25,825信息[默认任务14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDFTemplateCreator-流返回开始,大小= 21301

18:50:25,825信息[默认任务14]标准输出-SignerName测试

18:50:25,857信息[默认任务14]标准输出-内容长度:>>>>>>>>>>>>>>>>>>>>> 0

有人知道这是怎么回事吗?

在您的代码中,没有为文档提供可用于SignatureInterface实现。 在这种用例中不提供该选项,会使PDFBox假定您将在外部创建签名(例如,查看原始的CreateVisibleSignature方法sign )。 在这种情况下,使用ExternalSigningSupport方法setSignature设置签名后,结果将写入输出流。 否则,您的ByteArrayOutputStream baos保持为空。

但是您确实有一个SignatureInterface实例,该实例已经使用证书和密钥材料进行了初始化: VisibleSignature vs 因此,我认为您没有提供SignatureInterface并不是故意的。

因此,要提供SignatureInterface你必须使用一个PDDocument.addSignature超载与SignatureInterface参数。 例如替换您的电话

doc.addSignature(signature, vs.signatureOptions);

通过

doc.addSignature(signature, vs, vs.signatureOptions);

使您的代码按需工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM