【发布时间】:2018-05-08 00:32:02
【问题描述】:
我正在尝试使用此方法签署 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);
}
这就是我在 eclipse 日志中得到的:
18:50:25,702 INFO [默认任务 14] 标准输出 - 文档页面? 1
18:50:25,740 INFO [default task-14] stdout - KeyStore 为空?假的
18:50:25,779 信息 [默认任务 14] 标准输出 - Acroform 为空?假的
18:50:25,780 信息 [默认任务 14] 标准输出 - Acroform getNeedAppearances ?假的
18:50:25,782 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - PDF 结构已创建
18:50:25,782 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDFTemplateCreator - pdf 构建已经开始
18:50:25,782 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - ProcSet 数组已创建
18:50:25,782 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - PDF 页面已创建
18:50:25,783 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - AcroForm 已创建
18:50:25,788 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 签名字段已创建
18:50:25,788 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - PDSignature 已创建
18:50:25,788 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - AcroForm 字典已创建
18:50:25,789 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 已添加矩阵
18:50:25,792 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 签名矩形已创建
18:50:25,793 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 格式化程序矩形已创建
18:50:25,815 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 可见签名图像已创建
18:50:25,815 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 已创建持有人表单流
18:50:25,816 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 已创建持有人表单资源
18:50:25,816 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 已创建持有人表单
18:50:25,816 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - PDF 外观字典已创建
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 另一种形式的流(内部形式 - 它将在持有人形式内)已创建
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 另一个表单的资源(内部表单 - 它将在持有人表单中)已创建
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 已创建另一个表单(内部表单 - 将在持有人表单内)
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 现在在持有人表单中插入内部表单
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 创建的图像表单流
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 创建的图像表单资源
18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 创建的图像表单
18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 创建背景层表单
18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 将 ProcSet 插入 PDF
18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 向 pdf 注入外观流
18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - 可见签名已创建
18:50:25,819 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - WidgetDictionary 已创建
18:50:25,825 DEBUG [default task-14] org.apache.pdfbox.cos.COSStream - 创建 InputStream 调用之前没有将数据写入流。
18:50:25,825 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDFTemplateCreator - 流返回开始,大小 = 21301
18:50:25,825 INFO [默认任务 14] 标准输出 - SignerName 测试
18:50:25,857 INFO [default task-14] stdout - 内容长度:>>>>>>>>>>>>>>>>>>> 0
有人知道这里发生了什么吗?
【问题讨论】:
-
我尝试重现您的问题。
VisibleSignature类到底是什么?它似乎与CreateVisibleSignaturePDFBox 示例类有关,但不一样。 -
嗨@mkl,VisibleSignature 类基于 CreateVisibleSignature 并添加了 sign 方法,试图遵循位于 CreateVisibleSignature 类中的 signPDF 方法的逻辑,但只接收 PDDoucument 对象。
-
所以将原来的
CreateVisibleSignature类复制为VisibleSignature并添加你的sign方法应该会给我你使用什么? -
我不得不做一些额外的小改动,但它起作用了。参照。我对如何解决您的问题的回答。