其他分享
首页 > 其他分享> > PDF远非主流用途

PDF远非主流用途

作者:互联网

我知道这将是一个非常利基的话题。电子签名PDF远非主流用途。然而,我写它有两个原因-首先,我认为它对那些真正需要它的少数人是非常有用的,其次,我认为它将变得越来越普遍,因为越来越受欢迎-它基本上是说电子签名在欧洲的任何地方都被认可(现在,因为一些无聊的法律细节,但无论如何)。

那么,用途是什么?首先,您必须以电子方式用数字签名对PDF进行签名(法律术语是“电子签名”,所以我将交替使用它们,尽管它们并不完全匹配--例如,应用于其他数据的任何电子数据都可以视为电子签名,其中数字签名是基于PKI的签名)。

其次,您可能希望在页面上实际显示签名,而不是让PDF阅读器识别它并在某个侧面板中显示它。那是为什么?因为人们习惯于在页面上看到签名,有些人可能会坚持签名是可见的(真实的故事--我得到了这样的评论:一个独立的签名“不是一个真正的电子签名,因为它在页面上是不可见的”)。

现在,注意我在“页面”上写了“页面”。是的,电子文档没有页面-它是一个字节流。所以在最后一页签名就可以了。但是,再一次,人们习惯于在所有页面上签名,所以他们更喜欢在所有页面上都可以看到电子签名。

这使得任务变得很棘手--PDF在最后一页上有一个数字签名框是很好的,但是多个这样的框不能很好地工作。因此,必须添加其他类型的注释,这些注释看起来像签名框,单击时打开签名面板(就像实际的签名框)。

我要在这里介绍一用来签署和验证各种电子签名。它是开源的,你可以用任何你喜欢的方式。部署使用图书馆什么的。它包括开箱即用的签名功能--只需检它甚至包括将签名可视化一次(在特定页面上)的选项。

但是,它没有在多个页面上显示“邮票”(图像)的选项。这就是为什么法。如果您想使用该功能,只需从我的分叉构建一个JAR并使用它(通过传递适当的SignatureImageParametersPAdESSErvice.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

我希望这篇文章向你介绍:

我希望随着时间的推移,这篇文章越来越受欢迎,因为越来越多的企业意识到他们可以使用电子签名

标签:远非,writer,pdDocument,用途,电子签名,签名,PDF,页面
来源: https://www.cnblogs.com/aiqiyi/p/15248672.html