将可见的电子签名添加到PDF

我知道这将是一个非常特殊的话题。 电子签名PDF远不是主流用例。 但是,我将其编写的原因有两个:第一,我认为它对真正需要它的人非常有用;第二,我认为随着eIDAS法规的普及,它将变得越来越普遍。电子签名在欧洲各地都得到认可(由于某些无聊的法律细节,现在还不完全正确 ,但无论如何)。

因此,用例是什么-首先,您必须使用数字签名对PDF进行电子签名(法律术语为“电子签名”,因此尽管它们不完全匹配,但我将互换使用它们-例如,任何电子应用于其他数据的数据可以看作是电子签名,其中数字签名是基于PKI的签名)。

其次,您可能希望在页面上实际显示签名,而不是让PDF阅读器识别签名并将其显示在侧面板上。 这是为什么? 因为人们习惯于在页面上看到签名,有些人可能坚持要使签名可见(真实的故事–我评论说,分离的签名“不是真正的电子签名,因为在页面上不可见”)。

现在,请注意我在“页面”上写了“页面”。 是的,电子文档没有页面-它是字节流。 因此,仅在最后一页上签名即可。 但是,人们还是习惯于对所有页面进行签名,因此他们希望电子签名在所有页面上都可见。

这使任务变得棘手– PDF可以在最后一页上有一个数字签名框,但效果很好。 因此,必须添加看起来像签名框的其他类型的批注,然后单击以打开签名面板(就像实际的签名框一样)。

我必须在这里介绍DSS-欧盟委员会提供的一组很棒的组件 ,可用于签名和验证各种电子签名。 它是开源的,您可以随意使用。 部署演示应用程序 ,仅使用库。 它包括开箱即用的签名功能-只需检查PAdESService或PDFBoxSignatureService即可 。 它甚至还包括一次可视化签名的选项(在特定页面上)。

但是,它没有选择在多个页面上显示“图章”(图像)的选项。 这就是为什么我分叉并实现功能的原因。 我的大部分更改都在loadAndStampDocument(..)方法的PDFBoxSignatureService中。 如果要使用该功能,则可以从我的叉子中构建一个jar并将其使用(通过将适当的SignatureImageParameters传递给PAdESSErvice.sign(..)来定义签名的外观)。

为什么首先需要这样做? 因为当文档签名后,您将无法再对其进行修改,因为您将更改哈希。 但是,PDF具有增量更新,可以将其追加到文档中,从而具有较新的版本,而无需修改原始版本中的任何内容。 这样,签名仍然有效(原始签名的内容不会被修改),但是会添加新内容。 在我们的案例中,这些新内容是一些“注释”,它们表示图像和可打开区域,可打开签名面板(至少在Adobe Reader中)。 并且在添加签名框之前添加它们时,如果签名者不止一个,则第二个签名者的注释将在第一个签名之后添加。

可悲的是,PDFBox不支持该功能。 好吧,它几乎可以做到–下面的代码看起来很笨拙,花了一段时间才弄清楚应该确切地调用什么以及何时调用,但是仅需一个反射调用即可工作:

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 controlwriter.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 annotationstry {Method method = writer.getClass().getDeclaredMethod("addObjectToWrite", COSBase.class);method.setAccessible(true);method.invoke(writer, cosObject);} catch (Exception ex) {throw new RuntimeException(ex);}
}

它的作用是–加载原始PDF,清除一些内部目录,将注释(图像)添加到所有页面,然后“强制添加注释”,因为“否则它们将不会保存在增量更新中”。 我希望PDFBox可以使其更加简单明了,但是暂时可行,并且不会使现有签名无效。

我希望这篇文章能为您介绍:

  • 具有法律约束力的电子签名的存在
  • DSS实用程序的存在
  • 用于PDF签名的PAdES标准
  • 如何在PDF文档中放置多个签名框

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

翻译自: https://www.javacodegeeks.com/2018/02/adding-visible-electronic-signatures-pdfs.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高斯白噪声下基于EM的多径时延估计

本文主要来源于复现文献的部分内容&#xff0c;有一定的参考价值&#xff1a; [1] 刘波. 基于EM的突发通信参数估计技术研究[D]. 2009. 文末有代码和参考文献网盘下载地址&#xff0c;有问题欢迎留言交流&#xff01; 1 引言 对于多径传播&#xff0c;接收信号是由源信号与它…

传智杯Java终端有一天您厌烦了电脑上又丑又没用的终端,打算自己实现一个 Terminal

Java思路&#xff1a;使用String的字符串处理以及ArrayList的列表处理。 Java代码&#xff1a; import java.util.ArrayList; import java.util.Scanner; public class Main{public static ArrayList<String> list new ArrayList<>();public static void main(S…

新年迈出Java后台服务器与数据库交互第一步2022最新通用Java8jdbc8连接mysql8数据库进行增删改查等基本操作详解(IDEA),jar包导入,图片等文件流,批量操作

文章目录一、JDBC下载与导入二、获取连接三、PreparedStatement类操作数据库四、操作BLOB类型字段&#xff08;图片视频等&#xff09;五、Batch批量插入&#x1f646;&#x1f3fb;‍♀️&#x1f646;&#x1f3fb;‍♀️文末最新版jdbc jar包下载 &#x1f646;&#x1f3fb…

最优化理论与算法笔记

最优化理论与算法笔记

ejb+jpa_使用Arquillian(包括JPA,EJB,Bean验证和CDI)测试Java EE 6

ejbjpa很长时间以来&#xff0c;我听到很多人对Arquillian说好话 。 尽管我一直在阅读有关其用法的文章&#xff0c;但实际上我无法在一篇文章中找到涵盖我认为重要的某些方面的文章。 当然&#xff0c;我看起来还不够努力。 我要讲的要点是&#xff1a; 使用JPA。 我只是在这…

Win32编程之基于MATLAB与VC交互的多项式回归

运行环境 Matlab R2018b x64 or x32 Visual Studio 2017 企业版 程序预览 文末有完整程序代码下载地址,有任何问题欢迎留言,谢谢点赞哟! 程序功能描述 矩阵运算是大多数科学运算的必要工具。通常情况下,Matlab是实现矩阵运算的最佳工具,但是大多数Matlab运算都是基于d…

隔离区别对待?如何捆绑?Java中的jdbc数据库事务及其隔离级别

文章目录一、数据库事务简介二、JDBC事务处理三、事务的ACID属性四、数据库的隔离级别五、设置隔离级别一、数据库事务简介 事务&#xff1a;一组逻辑操作单元&#xff0c;使数据从一种状态变换到另一种状态。 事务处理&#xff08;事务操作&#xff09;&#xff1a;保证所有…

基于VS的连连看小游戏

运行环境 Matlab R2018b x64 or x32 Visual Studio 2017 企业版 程序预览 目前功能只开发了基本模式,也即是基本的连连看功能和帮助功能,文末有完整程序代码下载地址,有任何问题欢迎留言,谢谢点赞哟! 重要设计步骤和思路以及实现如下所示。 设计思路 类设计

idea使用c3p0数据库连接池无法加载配置文件xml,配置文件放置的位置

注意&#xff1a;要把c3p0-config.xml文件放在输出的文件夹里面&#xff0c;即放在out里面&#xff0c;而不是放在src里面。&#xff08;如下图&#xff09; 至于配置文件怎么写&#xff0c;可以参考其他经验教程&#xff0c;这里不再赘述。

spring boo_为您的下一个基于Spring的应用程序考虑使用spring-boot的原因!

spring booSpring-boot提供了一种创建基于Spring的应用程序的快速方法。 对于下一个项目&#xff0c;有一些非常令人信服的理由考虑使用Spring-boot&#xff1a; 原因1&#xff1a;使用spring-boot启动程序项目进行更简单的依赖性管理。 考虑使用CR2是使用h2数据库来实现的&am…

自适应滤波实例之系统辨识

实验模型 x(n):随机信号,服从N(0,1)分布 h(n):未知的系统响应(由5阶FIR低通滤波器模拟) h=[0.2,0.5,0.7,-0.5,0.2]; d(n):期望信号,d(n)=x(n)*h(n) 目标:根据接收端接收信号r(n)(此时即为期望信号d(n))和训练序列x’(n)求未知的h(n) LMS实验结果 设自适应滤波器…

jdbc数据库连接池C3P0和Druid德鲁伊,Java与MySQL数据库交互

文章目录一、 连接池的必要性二、数据库连接池技术三、多种开源的数据库连接池四、C3P0数据库连接池五、Druid&#xff08;德鲁伊&#xff09;数据库连接池六、C3P0和Druid驱动jar包一、 连接池的必要性 在使用开发基于数据库的web程序时&#xff0c;传统的模式基本是按以下步…

使用Spring Boot构建REST Web服务

本教程提供了有关如何使用Spring Boot构建Restfull Web服务的分步指南。 先决条件&#xff1a; Eclipse IDE&#xff08;最新版本&#xff09; Maven的4 Java 1.8 1.创建Maven Web项目 打开eclipse&#xff0c;然后创建一个新的Maven Web项目&#xff0c;并将其命名为Spri…

Apache-DBUtils实现CRUD操作,已封装的API实现jdbc对数据库进行操作

文章目录一、Apache-DBUtils简介二、主要API的使用1、DbUtils类2、QueryRunner类3、ResultSetHandler接口及实现类三、Apache-DBUtils驱动下载一、Apache-DBUtils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库&#xff0c;它是对JDBC的简单封装&#xff0c…

自适应滤波实例之系统逆辨识(以及系统零极点对逆辨识效果的影响分析)

实验模型 x(n):随机信号,服从N(0,1)分布 h(n):未知的系统响应(由10阶FIR低通滤波器模拟) h=[0.03,-0.04,0.06,-0.2,-0.5,0.75,0.37,0.24,0.01,0.06]; d(n):期望信号,d(n)=x(n)*h(n) 目标:根据接收端接收信号r(n)和训练序列x’(n) (此时即为期望信号d(n)),求未知…

卡尔曼滤波实例之系统逆辨识

实验模型 x(n):随机信号,服从N(0,1)分布 h(n):未知的系统响应(由10阶FIR低通滤波器模拟) h=[0.03,-0.04,0.06,-0.2,-0.5,0.75,0.37,0.24,0.01,0.06]; d(n):期望信号,d(n)=x(n)*h(n) 目标:根据接收端接收信号r(n)和训练序列x’(n) (此时即为期望信号d(n)),求未知…

static和瞬态_具有瞬态属性的视图对象的钝化和激活

static和瞬态在应用程序模块的钝化/激活周期内&#xff0c;框架也将钝化并激活视图对象。 通常&#xff0c;框架保存有关VO状态&#xff0c;当前行&#xff0c;绑定变量值等的信息。 但是没有数据。 激活视图对象后&#xff0c;将重新执行VO的查询&#xff0c;并重新获取数据。…

你是不是已经超纲了?一文解决JavaWeb中要求的HTML,是什么样的?

文章目录一、正经的开始 &#x1f469;&#x1f3fb;&#x1f469;&#x1f3fb;&#x1f469;&#x1f3fb;二、HTML简介1、HTML“化简为繁”2、超文本“醉翁之意”3、标记“画地为牢”4、永远的HelloWorld5、HTML文件“解衣”6、HTML“潜规则”三、使用HTML展示文章1、标题“…

自适应滤波实例之噪声抵消

实验模型 s(n)是立体声音乐信号,fs=8kHz,平均功率为0.0047; v(n)是零均值高斯白噪声,方差为1; h(n)是由5阶FIR低通滤器模拟,带宽为[0, 0.35fs]; 目标:d(n)中包含音乐信号s’(n)和白噪声v’(n),v’(n)为v(n)经过系统h(n)后的输出,则x(n)=v(n)与v’(n)具有相关性,利…