[英]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.