Java 如何使用iText设置签名的外观?

Java 如何使用iText设置签名的外观?,java,itext,signing,Java,Itext,Signing,我正在使用iText进行pdf签名,在设置其外观时遇到问题 我想把签名字段分成两部分。左边应该是证书的CN,用于用大写字母签名。右边应该是日期和其他一些附加信息,包括原始格式的CN。背景是图像 现在我正在使用名称和描述渲染模式,将签名字段分为两部分。它几乎满足了我的要求,但iText自动从证书中获取原始CN并将其作为名称打印(在左侧) 是否有办法更改名称部分(我需要大写CN)。或者是否有其他方法将签名字段拆分为两部分并手动设置文本 以下是我到目前为止的情况: 设置背景和渲染模式: Pdf

我正在使用iText进行pdf签名,在设置其外观时遇到问题

我想把签名字段分成两部分。左边应该是证书的CN,用于用大写字母签名。右边应该是日期和其他一些附加信息,包括原始格式的CN。背景是图像

现在我正在使用名称和描述渲染模式,将签名字段分为两部分。它几乎满足了我的要求,但iText自动从证书中获取原始CN并将其作为名称打印(在左侧)

是否有办法更改名称部分(我需要大写CN)。或者是否有其他方法将签名字段拆分为两部分并手动设置文本

以下是我到目前为止的情况: 设置背景和渲染模式:

    PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
    appearance.setImage(Image.getInstance("image.gif"));
    appearance.setReason("I've written this.");
    appearance.setVisibleSignature(new Rectangle(420, 732, 512, 780), 1, 1);
    appearance.setRenderingMode(PdfSignatureAppearance.RenderingMode.NAME_AND_DESCRIPTION);
设置说明(右侧):


您是否已检索到
appearance.getLayer(0)
appearance.getLayer(2)
并在这些
PdfTemplate
实例上绘制了图形?@mkl我以前尝试过,但无法继续。根据这一点,n0层用于背景,n2层用于签名信息。但是,当我添加图像时,它没有出现,仍然无法按我想要的方式设置文本。右侧的文本可以显式设置(正如您已经发现的),但左侧的文本是以硬编码方式确定的。只有自己绘制第2层才能解决这个问题。您可以使用iText源作为灵感(,方法
getAppearance
,如果(应用程序[2]==null){…})中的代码,并填充
appearance.getLayer(2)
)以满足您的要求。@mkl谢谢!经过几次修改,它终于开始工作了,看起来就像我想要的那样:)。
    X500Name x500name = new JcaX509CertificateHolder(x509Certificate).getSubject();
    RDN cn = x500name.getRDNs(BCStyle.CN)[0];
    String cnName = IETFUtils.valueToString(cn.getFirst().getValue());
    appearance.setLayer2Text("Digitally signed by:" + cnName + "\n\n" + x509Certificate.getSubjectDN().getName() + "\n\n" + new Date().toString());