为了账号安全,请及时绑定邮箱和手机立即绑定

如何在自定义第 2 层文本中使用真实签名时间戳在 itextpdf 上创建签名外观

如何在自定义第 2 层文本中使用真实签名时间戳在 itextpdf 上创建签名外观

波斯汪 2021-12-10 09:14:03
我想通过方法appearance.setLayer2Text() 使用自定义文本和真实签名时间戳(如使用的渲染模式描述)创建签名外观。我阅读了PDF 文档的数字签名一书(尤其是第 40-48 页),但找不到如何做的方法。渲染模式为元数据的使用提供默认描述,如名称、签名戳、原因等。我只需要从中签名时间戳而不是其他。我看到了一些使用new Date()作为签名时间设置第 2 层文本的示例,但我不想要它。我想在 setLayer2Text() 使用真正的签名时间戳和一些自定义文本。
查看完整描述

1 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

我不确定我是否清楚地理解你的问题。


起初,您似乎希望在该签名的可视化中获得来自数字签名时间戳的确切日期时间。这是不可能的,请参阅下面的第一部分。


同时,您的评论指向您只想使用 iText 在创建第 2 层文本和签名中的签名时间条目时也使用的日期时间。这是微不足道的,请参阅下面的第二部分。


来自数字签名时间戳的日期时间

这是不可能的:签名的可视化是 PDF 中的注释,因此它是签名内容的一部分。因此,必须在请求数字时间戳之前生成可视化。因此,您无法尽早从时间戳中读取时间以放入签名外观。


当然,您可以尝试尽可能接近它,例如首先请求一个数字时间戳,然后立即使用该时间戳构建外观并使用新的时间戳进行签名,但您可能会有点偏离。


如果您的签名认证级别没有禁止,您还可以在登录增量更新后更改签名外观。但是,在这种情况下,Adobe Reader 会在签名后警告更改...


创建第 2 层文本和签名时 iText 使用的日期时间

另一方面,如果您只是想在创建第 2 层文本和签名中的签名时间条目时使用 iText 也使用的日期时间,则解决方案很简单:PdfSignatureAppearance该类具有一个SignDate属性:


/** Holds value of property signDate. */

private Calendar signDate;

它在PdfSignatureAppearance构造函数中用当前时间初始化:


/**

 * Constructs a PdfSignatureAppearance object.

 * @param writer    the writer to which the signature will be written.

 */

PdfSignatureAppearance(PdfStamperImp writer) {

    [...]

    signDate = new GregorianCalendar();

    [...]

}

这是 iText 在创建文本时使用的日期时间getAppearance:


if (layer2Text == null) {

    StringBuilder buf = new StringBuilder();

    buf.append("Digitally signed by ");

    [...]

    SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss z");

    buf.append("Date: ").append(sd.format(signDate.getTime()));

    [...]

}

这个属性有一个公共 getter 和一个公共 setter


/**

 * Gets the signature date.

 * @return the signature date

 */

public java.util.Calendar getSignDate()


/**

 * Sets the signature date.

 * @param signDate the signature date

 */

public void setSignDate(java.util.Calendar signDate)

因此,您可以在此处检索使用时间,甚至可以自己设置!


查看完整回答
反对 回复 2021-12-10
  • 1 回答
  • 0 关注
  • 302 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信