签署文档时出现 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);
}
这是我在 eclipse 日志中得到的:
18:50:25,702 INFO [default task-14] stdout - Document pages ? 1
18:50:25,740 INFO [default task-14] stdout - KeyStore is null ? false
18:50:25,779 INFO [default task-14] stdout - Acroform is null ? false
18:50:25,780 INFO [default task-14] stdout - Acroform getNeedAppearances ? false
18:50:25,782 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - PDF Structure has been created
18:50:25,782 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDFTemplateCreator - pdf building has been started
18:50:25,782 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - ProcSet array has been created
18:50:25,782 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - PDF page has been created
18:50:25,783 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - AcroForm has been created
18:50:25,788 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Signature field has been created
18:50:25,788 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - PDSignature has been created
18:50:25,788 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - AcroForm dictionary has been created
18:50:25,789 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Matrix has been added
18:50:25,792 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Signature rectangle has been created
18:50:25,793 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Formatter rectangle has been created
18:50:25,815 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Visible Signature Image has been created
18:50:25,815 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Holder form stream has been created
18:50:25,816 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Holder form resources have been created
18:50:25,816 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Holder form has been created
18:50:25,816 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - PDF appearance dictionary has been created
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Stream of another form (inner form - it will be inside holder form) has been created
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Resources of another form (inner form - it will be inside holder form)have been created
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Another form (inner form - it will be inside holder form) has been created
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Now inserted inner form inside holder form
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Created image form stream
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Created image form resources
18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Created image form
18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Created background layer form
18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Inserted ProcSet to PDF
18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Injected appearance stream to pdf
18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Visible signature has been created
18:50:25,819 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - WidgetDictionary has been created
18:50:25,825 DEBUG [default task-14] org.apache.pdfbox.cos.COSStream - Create InputStream called without data being written before to stream.
18:50:25,825 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDFTemplateCreator - stream returning started, size= 21301
18:50:25,825 INFO [default task-14] stdout - SignerName Test
18:50:25,857 INFO [default task-14] stdout - Content length: >>>>>>>>>>>>>>>>>>> 0
有人知道这是怎么回事吗?
在您的代码中,您没有为文档提供可用于签名的 SignatureInterface
实现。在这个用例中没有提供,PDFBox 假设您将在外部创建签名(例如查看原始 CreateVisibleSignature
方法 sign
)。在这种情况下,在使用 ExternalSigningSupport
方法 setSignature
设置签名后,结果将写入输出流。如果您不这样做,您的 ByteArrayOutputStream baos
将保持为空。
但是您确实有一个 SignatureInterface
实例,您已经使用证书和密钥 material 初始化了该实例:您的 VisibleSignature vs
。因此,我假设您没有提供 SignatureInterface
不是故意的。
因此,要提供 SignatureInterface
,您必须使用带有 SignatureInterface
参数的 PDDocument.addSignature
重载。例如。替换你的电话
doc.addSignature(signature, vs.signatureOptions);
来自
doc.addSignature(signature, vs, vs.signatureOptions);
使您的代码按预期运行。
我正在尝试使用此方法签署 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 [default task-14] stdout - Document pages ? 1
18:50:25,740 INFO [default task-14] stdout - KeyStore is null ? false
18:50:25,779 INFO [default task-14] stdout - Acroform is null ? false
18:50:25,780 INFO [default task-14] stdout - Acroform getNeedAppearances ? false
18:50:25,782 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - PDF Structure has been created
18:50:25,782 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDFTemplateCreator - pdf building has been started
18:50:25,782 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - ProcSet array has been created
18:50:25,782 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - PDF page has been created
18:50:25,783 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - AcroForm has been created
18:50:25,788 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Signature field has been created
18:50:25,788 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - PDSignature has been created
18:50:25,788 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - AcroForm dictionary has been created
18:50:25,789 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Matrix has been added
18:50:25,792 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Signature rectangle has been created
18:50:25,793 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Formatter rectangle has been created
18:50:25,815 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Visible Signature Image has been created
18:50:25,815 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Holder form stream has been created
18:50:25,816 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Holder form resources have been created
18:50:25,816 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Holder form has been created
18:50:25,816 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - PDF appearance dictionary has been created
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Stream of another form (inner form - it will be inside holder form) has been created
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Resources of another form (inner form - it will be inside holder form)have been created
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Another form (inner form - it will be inside holder form) has been created
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Now inserted inner form inside holder form
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Created image form stream
18:50:25,817 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Created image form resources
18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Created image form
18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Created background layer form
18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Inserted ProcSet to PDF
18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Injected appearance stream to pdf
18:50:25,818 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Visible signature has been created
18:50:25,819 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - WidgetDictionary has been created
18:50:25,825 DEBUG [default task-14] org.apache.pdfbox.cos.COSStream - Create InputStream called without data being written before to stream.
18:50:25,825 INFO [default task-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDFTemplateCreator - stream returning started, size= 21301
18:50:25,825 INFO [default task-14] stdout - SignerName Test
18:50:25,857 INFO [default task-14] stdout - Content length: >>>>>>>>>>>>>>>>>>> 0
有人知道这是怎么回事吗?
在您的代码中,您没有为文档提供可用于签名的 SignatureInterface
实现。在这个用例中没有提供,PDFBox 假设您将在外部创建签名(例如查看原始 CreateVisibleSignature
方法 sign
)。在这种情况下,在使用 ExternalSigningSupport
方法 setSignature
设置签名后,结果将写入输出流。如果您不这样做,您的 ByteArrayOutputStream baos
将保持为空。
但是您确实有一个 SignatureInterface
实例,您已经使用证书和密钥 material 初始化了该实例:您的 VisibleSignature vs
。因此,我假设您没有提供 SignatureInterface
不是故意的。
因此,要提供 SignatureInterface
,您必须使用带有 SignatureInterface
参数的 PDDocument.addSignature
重载。例如。替换你的电话
doc.addSignature(signature, vs.signatureOptions);
来自
doc.addSignature(signature, vs, vs.signatureOptions);
使您的代码按预期运行。