微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有自定义“签名者”名称的iText Sign PDF

如何解决具有自定义“签名者”名称的iText Sign PDF

我可以使用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,您可以在签名可视化中设置说明文本。您可以使用setLayer2FontsetLayer2FontSizesetLayer2FontColor更改其样式。
  • 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有时会使用“自定义签名者” 代替其签名面板中的证书信息。

  • 如果您在Acrobat Reader中打开时关闭了自动验证功能

    Preferences

    然后打开PDF,您会看到

    Requires Validation

    明确请求验证后,您会得到

    Valid

    如您所见,“自定义签名者” 一直。

  • 如果您在打开首选项时激活了自动验证,则会得到

    Automatically Valid

    如您所见,此处使用证书中的信息。

  • 此外,如果Adobe Acrobat无法正确读取签名(例如,由于未知的签名算法),您总是会得到“自定义签名者”

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。