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

Java 如何在itextpdf上创建签名外观时在自定义第2层文本中使用真实签名时间戳,java,itext,signature,Java,Itext,Signature,我想使用自定义文本和带有方法appearance.setLayer2Text()的真实签名时间戳(如使用的格式副本模式描述)创建签名外观。我读了这本书(特别是第40-48页),却找不到一个方法。呈现模式为元数据的使用提供默认描述,如名称、签名戳、原因等。我只需要签名时间戳从它,而不是其他。我看到一些示例使用作为签名时间设置第2层文本,但我不想要它。我想在setLayer2Text()处使用真正的签名时间戳来处理一些自定义文本 提前感谢您的帮助 我不太清楚你的问题 起初,您似乎希望在该签名的可视化

我想使用自定义文本和带有方法appearance.setLayer2Text()的真实签名时间戳(如使用的格式副本模式描述)创建签名外观。我读了这本书(特别是第40-48页),却找不到一个方法。呈现模式为元数据的使用提供默认描述,如名称、签名戳、原因等。我只需要签名时间戳从它,而不是其他。我看到一些示例使用作为签名时间设置第2层文本,但我不想要它。我想在setLayer2Text()处使用真正的签名时间戳来处理一些自定义文本


提前感谢您的帮助

我不太清楚你的问题

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

同时,您的注释指向一个方向,即在创建第2层文本和签名中的签名时间条目时,您只想使用iText也使用的日期时间。这很简单,请参见下面的第二部分

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

当然,您可以尝试尽可能接近它,例如,首先请求数字时间戳,然后立即使用该时间戳构建外观,并使用新的时间戳签名,但您可能有点不对劲

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

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

/**保存属性signDate的值*/
私人日历签署日期;
它在
PdfSignatureAppearance
构造函数中用当前时间初始化:

/**
*构造PdfSignatureAppearance对象。
*@param writer将向其写入签名的写入器。
*/
PDFSignaturePearance(PdfStamperImp编写器){
[...]
signDate=新的Gregorianalendar();
[...]
}
这是iText在
getAppearance
中创建文本时使用的日期时间:

if(layer2Text==null){
StringBuilder buf=新的StringBuilder();
buf.追加(“数字签名人”);
[...]
SimpleDataFormat sd=新的SimpleDataFormat(“yyyy.MM.dd HH:MM:ss z”);
buf.append(“日期:”).append(sd.format(signDate.getTime()));
[...]
}
此属性有一个公共getter和一个公共setter

/**
*获取签名日期。
*@返回签名日期
*/
public java.util.Calendar getSignDate()的
/**
*设置签名日期。
*@param signDate签名日期
*/
public void setSignDate(java.util.Calendar signDate)

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

我不太清楚你的问题

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

同时,您的注释指向一个方向,即在创建第2层文本和签名中的签名时间条目时,您只想使用iText也使用的日期时间。这很简单,请参见下面的第二部分

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

当然,您可以尝试尽可能接近它,例如,首先请求数字时间戳,然后立即使用该时间戳构建外观,并使用新的时间戳签名,但您可能有点不对劲

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

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

/**保存属性signDate的值*/
私人日历签署日期;
它在
PdfSignatureAppearance
构造函数中用当前时间初始化:

/**
*构造PdfSignatureAppearance对象。
*@param writer将向其写入签名的写入器。
*/
PDFSignaturePearance(PdfStamperImp编写器){
[...]
signDate=新的Gregorianalendar();
[...]
}
这是iText在
getAppearance
中创建文本时使用的日期时间:

if(layer2Text==null){
StringBuilder buf=新的StringBuilder();
buf.追加(“数字签名人”);
[...]
SimpleDataFormat sd=新的SimpleDataFormat(“yyyy.MM.d