1 回答
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)
因此,您可以在此处检索使用时间,甚至可以自己设置!
添加回答
举报