iText 使用自定义 "Signed by" 名称签署 PDF

iText Sign PDF with custom "Signed by" name

我可以使用 iText 7 签署 PDF。

现在,我想显示一个不同于证书中的名称,例如姓氏(不仅在 PDF 本身的外观上,而且在 Adob​​e 的“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, null, null, 0, signatureType);

您问如何显示与证书中不同的名称,例如姓氏(不仅在 PDF 本身的外观上,而且在“Rev1:由 X 签名”中)在 Adob​​e 中)。

这基本上是两个问题,一个关于如何自定义文档页面上签名外观中的文本,一个关于如何自定义 Adob​​e Acrobat 在其签名面板中显示的文本。

自定义文档页面签名外观中的文本

这里基本上有两个相关的助手:

  • PdfSignatureAppearance 方法 setLayer2Text 允许您在签名可视化中设置 描述 文本。您可以使用 setLayer2FontsetLayer2FontSizesetLayer2FontColor.
  • 更改其样式
  • PdfSignatureAppearance 方法 getLayer2 return 是一个 PdfFormXObject,您可以在其中创建完全自定义的签名可视化。您还可以使用 getLayer0 到 return 一个 PdfFormXObject 作为背景。

您可以根据需要定制的程度来选择您的帮手。

自定义 Adob​​e Acrobat 在其签名面板中显示的文本

这完全是另外一回事。由于此面板位于文档区域之外,因此 PDF 规范并未规定该面板的内容,由 Adob​​e 决定将哪些信息放在那里。因此,您希望实现的目标只能在一定程度上得到管理。

使用相当新的 Adob​​e Acrobat Reader 进行了一些试验后发现,在某些情况下,签名字典的 Name 条目的值(如果设置at all) 在这里使用而不是证书信息。

您可以像这样使用签名事件设置该条目:

PdfSigner pdfSigner = new PdfSigner(...);
pdfSigner.setSignatureEvent(new PdfSigner.ISignatureEvent() {
    @Override
    public void getSignatureDictionary(PdfSignature sig) {
        sig.setName("A Custom Signer");
    }
});
...

使用此添加进行签名后,Adobe Acrobat 有时会使用 “自定义签名者” 而不是其签名面板中的证书信息。

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

    然后打开PDF,你看

    明确请求验证后,您得到

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

  • 另一方面,如果您在首选项中激活打开时的自动验证,您会得到

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

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