iText 使用自定义 "Signed by" 名称签署 PDF
iText Sign PDF with custom "Signed by" name
我可以使用 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, null, null, 0, signatureType);
您问如何显示与证书中不同的名称,例如姓氏(不仅在 PDF 本身的外观上,而且在“Rev1:由 X 签名”中)在 Adobe 中)。
这基本上是两个问题,一个关于如何自定义文档页面上签名外观中的文本,一个关于如何自定义 Adobe Acrobat 在其签名面板中显示的文本。
自定义文档页面签名外观中的文本
这里基本上有两个相关的助手:
PdfSignatureAppearance
方法 setLayer2Text
允许您在签名可视化中设置 描述 文本。您可以使用 setLayer2Font
、setLayer2FontSize
和 setLayer2FontColor
. 更改其样式
PdfSignatureAppearance
方法 getLayer2
return 是一个 PdfFormXObject
,您可以在其中创建完全自定义的签名可视化。您还可以使用 getLayer0
到 return 一个 PdfFormXObject
作为背景。
您可以根据需要定制的程度来选择您的帮手。
自定义 Adobe Acrobat 在其签名面板中显示的文本
这完全是另外一回事。由于此面板位于文档区域之外,因此 PDF 规范并未规定该面板的内容,由 Adobe 决定将哪些信息放在那里。因此,您希望实现的目标只能在一定程度上得到管理。
使用相当新的 Adobe 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,你看
明确请求验证后,您得到
如您所见,“自定义签名者”一直如此。
另一方面,如果您在首选项中激活打开时的自动验证,您会得到
如您所见,此处使用了证书中的信息。
此外,如果 Adobe Acrobat 无法正确读取签名(例如,由于未知的签名算法),您总是会得到 “自定义签名者”。
我可以使用 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, null, null, 0, signatureType);
您问如何显示与证书中不同的名称,例如姓氏(不仅在 PDF 本身的外观上,而且在“Rev1:由 X 签名”中)在 Adobe 中)。
这基本上是两个问题,一个关于如何自定义文档页面上签名外观中的文本,一个关于如何自定义 Adobe Acrobat 在其签名面板中显示的文本。
自定义文档页面签名外观中的文本
这里基本上有两个相关的助手:
PdfSignatureAppearance
方法setLayer2Text
允许您在签名可视化中设置 描述 文本。您可以使用setLayer2Font
、setLayer2FontSize
和setLayer2FontColor
. 更改其样式
PdfSignatureAppearance
方法getLayer2
return 是一个PdfFormXObject
,您可以在其中创建完全自定义的签名可视化。您还可以使用getLayer0
到 return 一个PdfFormXObject
作为背景。
您可以根据需要定制的程度来选择您的帮手。
自定义 Adobe Acrobat 在其签名面板中显示的文本
这完全是另外一回事。由于此面板位于文档区域之外,因此 PDF 规范并未规定该面板的内容,由 Adobe 决定将哪些信息放在那里。因此,您希望实现的目标只能在一定程度上得到管理。
使用相当新的 Adobe 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,你看
明确请求验证后,您得到
如您所见,“自定义签名者”一直如此。
另一方面,如果您在首选项中激活打开时的自动验证,您会得到
如您所见,此处使用了证书中的信息。
此外,如果 Adobe Acrobat 无法正确读取签名(例如,由于未知的签名算法),您总是会得到 “自定义签名者”。