PDF远非主流用途
作者:互联网
我知道这将是一个非常利基的话题。电子签名PDF远非主流用途。然而,我写它有两个原因-首先,我认为它对那些真正需要它的少数人是非常有用的,其次,我认为它将变得越来越普遍,因为越来越受欢迎-它基本上是说电子签名在欧洲的任何地方都被认可(现在,因为一些无聊的法律细节,但无论如何)。
那么,用途是什么?首先,您必须以电子方式用数字签名对PDF进行签名(法律术语是“电子签名”,所以我将交替使用它们,尽管它们并不完全匹配--例如,应用于其他数据的任何电子数据都可以视为电子签名,其中数字签名是基于PKI的签名)。
其次,您可能希望在页面上实际显示签名,而不是让PDF阅读器识别它并在某个侧面板中显示它。那是为什么?因为人们习惯于在页面上看到签名,有些人可能会坚持签名是可见的(真实的故事--我得到了这样的评论:一个独立的签名“不是一个真正的电子签名,因为它在页面上是不可见的”)。
现在,注意我在“页面”上写了“页面”。是的,电子文档没有页面-它是一个字节流。所以在最后一页签名就可以了。但是,再一次,人们习惯于在所有页面上签名,所以他们更喜欢在所有页面上都可以看到电子签名。
这使得任务变得很棘手--PDF在最后一页上有一个数字签名框是很好的,但是多个这样的框不能很好地工作。因此,必须添加其他类型的注释,这些注释看起来像签名框,单击时打开签名面板(就像实际的签名框)。
我要在这里介绍一用来签署和验证各种电子签名。它是开源的,你可以用任何你喜欢的方式。部署使用图书馆什么的。它包括开箱即用的签名功能--只需检它甚至包括将签名可视化一次(在特定页面上)的选项。
但是,它没有在多个页面上显示“邮票”(图像)的选项。这就是为什么法。如果您想使用该功能,只需从我的分叉构建一个JAR并使用它(通过传递适当的SignatureImageParameters
到PAdESSErvice.sign(..)
以定义签名的外观)。
https://movie.douban.com/people/246078197/
为什么首先需要这样做?因为当文档被签名时,您不能再修改它了,因为您将更改散列。但是,PDF有增量更新,允许附加到文档中,因此具有较新的版本,而无需修改原始版本中的任何内容。这样,签名仍然有效(最初签名的内容没有修改),但是添加了新的内容。在我们的例子中,这个新的东西是一些“注释”,它表示一个图像和一个可点击的区域来打开签名面板(至少在AdobeReader中)。当在添加签名框之前添加它们时,如果有多个签名者,则在第一个签名之后添加第二个签名者的注释。
遗憾的是,PDFBox并不支持这一点。嗯,几乎是这样的--下面这段代码看上去很烦人,花了一段时间才弄清楚到底应该调用什么以及什么时候调用,但它只适用于一个反射调用:
https://movie.douban.com/people/246110479/question
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
for (PDPage page : pdDocument.getPages()) {
// reset existing annotations (needed in order to have the stamps added)
page.setAnnotations( null );
}
// reset document outline (needed in order to have the stamps added)
pdDocument.getDocumentCatalog().setDocumentOutline( null );
List<PDAnnotation> annotations = addStamps(pdDocument, parameters);
setDocumentId(parameters, pdDocument);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (COSWriter writer = new COSWriter(baos, new RandomAccessBuffer(pdfBytes))) {
// force-add the annotations (wouldn't be saved in incremental updates otherwise)
annotations.forEach(ann -> addObjectToWrite(writer, ann.getCOSObject()));
// technically the same as saveIncremental but with more control
writer.write(pdDocument);
}
pdDocument.close();
pdDocument = PDDocument.load(baos.toByteArray());
...
}
private void addObjectToWrite(COSWriter writer, COSDictionary cosObject) {
// the COSWriter does not expose the addObjectToWrite method, so we need reflection to add the annotations
try {
Method method = writer.getClass().getDeclaredMethod( "addObjectToWrite" , COSBase. class );
method.setAccessible( true );
method.invoke(writer, cosObject);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
|
它所做的是-加载原始PDF,清除一些内部目录,向所有页面添加注释(图像),然后“强制添加注释”,因为“否则不会在增量更新中保存注释”。我希望PDFBox能让它变得简单一些,但是暂时来说,它并不会使现有的签名失效。
https://greasyfork.org/ja/scripts?set=476094
我希望这篇文章向你介绍:
- 是否存在具有法律约束力的电子签字
- DSS公用设施的存在
- PDF签名的PADES标准
- 如何在PDF文档中放置多个签名框
我希望随着时间的推移,这篇文章越来越受欢迎,因为越来越多的企业意识到他们可以使用电子签名
标签:远非,writer,pdDocument,用途,电子签名,签名,PDF,页面 来源: https://www.cnblogs.com/aiqiyi/p/15248672.html