问题描述
我可以使用iText 7签名PDF。
现在,我想显示一个不同于证书中名称的名称,例如一个姓氏(不仅在具有外观的PDF本身上,而且在Adobe中的“ Rev1:X签名”中)。
这是我实际用于签名PDF的代码:
PdfReader reader = new PdfReader(src);
PdfSigner signer = new PdfSigner(reader,new FileOutputStream(dest),new StampingProperties().useAppendMode());
// Create the signature appearance
pdfpage page = signer.getDocument().getPage(1);
Rectangle rect = new Rectangle(10,10,120,80);
PdfSignatureAppearance appearance = signer.getSignatureAppearance().setReason(reason).setPageNumber(1)
.setLocation(location).setPageRect(rect);
signer.setFieldName("sig");
IExternalSignature pks = new PrivateKeySignature(pk,digestAlgorithm,provider);
IExternalDigest digest = new BouncyCastleDigest();
// Sign the document using the detached mode,CMS or CAdES equivalent.
signer.signDetached(digest,pks,chain,null,signatureType);
解决方法
您问如何显示与证书中的名称不同的名称,例如一个姓氏(不仅在具有外观的PDF本身上,而且在Adobe中的“ Rev1:X签名”中)。
这基本上是两个问题,一个是关于如何自定义文档页面上签名外观中的文本,另一个是有关如何自定义Adobe Acrobat在其“签名面板”中显示的文本。
自定义文档页面上签名外观中的文本
这里您基本上有两个相关的助手:
- 通过
PdfSignatureAppearance
方法setLayer2Text
,您可以在签名可视化中设置说明文本。您可以使用setLayer2Font
,setLayer2FontSize
和setLayer2FontColor
更改其样式。 -
PdfSignatureAppearance
方法getLayer2
返回一个PdfFormXObject
,您可以在其上创建完全自定义的签名可视化。您还可以使用getLayer0
返回一个PdfFormXObject
作为背景。
您可以根据所需的自定义程度选择助手。
自定义Adobe Acrobat在其签名面板中显示的文本
这完全是另外一回事。由于此面板不在文档区域之内,因此PDF规范并不规定该面板的内容,而是由Adobe负责提供哪些信息。因此,您希望实现的目标只能在一定程度上得到管理。
使用相当最新的Adobe Acrobat Reader进行了一些实验,结果表明,在某些情况下,此处使用签名字典的 Name 条目的值(如果有设置),而不是证书信息。
您可以使用如下签名事件来设置该条目:
PdfSigner pdfSigner = new PdfSigner(...);
pdfSigner.setSignatureEvent(new PdfSigner.ISignatureEvent() {
@Override
public void getSignatureDictionary(PdfSignature sig) {
sig.setName("A Custom Signer");
}
});
...
对此添加了签名的Adobe Acrobat有时会使用“自定义签名者” 代替其签名面板中的证书信息。