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

时间:2018-10-26 07:52:22

标签: java itext signature

我想使用自定义文本和真实的签名时间戳(如使用的借阅模式描述)和方法present.setLayer2Text()创建签名外观。我读了Digital Signatures for PDF documents书(尤其是第40-48页),却找不到方法。渲染模式为元数据的用法(例如名称,签名戳,原因等)提供默认描述。我只需要从中签名时间戳,而无需其他。我看到了一些使用new Date()作为设置第2层文本的签名时间的示例,但我不希望这样做。我想在setLayer2Text()上使用真正的签名时间戳和一些自定义文本。

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

一开始,您似乎希望从数字签名时间戳中获得确切的日期时间,以显示该签名。这是不可能的,请参阅下面的第一部分。

同时,您的注释指向您仅希望使用iText在创建第二层文本和签名中的签名时间条目时使用的日期时间的方向。这很简单,请参阅下面的第二部分。

数字签名时间戳中的日期时间

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

当然,您可以尝试尽可能地靠近它,例如首先请求数字时间戳,然后立即使用该时间戳构建外观并使用新的时间戳签名,但是您可能会有点失望。

如果您的签名认证级别不禁止它,则还可以在登录增量更新后更改签名外观。不过,在这种情况下,Adobe Reader会在签名后警告有关更改的信息。

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

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

SignDate

它在/** Holds value of property signDate. */ private Calendar signDate; 构造函数中以当前时间初始化:

PdfSignatureAppearance

这是iText在/** * Constructs a PdfSignatureAppearance object. * @param writer the writer to which the signature will be written. */ PdfSignatureAppearance(PdfStamperImp writer) { [...] signDate = new GregorianCalendar(); [...] } 中创建文本时使用的日期时间:

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()));
    [...]
}

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