itext5 在上下文上签名图像

itext5 sign image over context

当我签署文档并在签名外观中使用图像时,我得到了这个结果:

但是,我希望结果是这样的:

这是我的代码:

PdfSignatureAppearance appearance =  stamper.getSignatureAppearance();
appearance.setReason(info.getReason());
appearance.setLocation(info.getLocation());
appearance.setVisibleSignature(t.getRectangle(), 1, "SIGN");
appearance.setSignatureGraphic(image); 
appearance.setCertificationLevel(PdfSignatureAppearance.NOT_CERTIFIED); 
appearance.setRenderingMode(PdfSignatureAppearance.RenderingMode.GRAPHIC);
MakeSignature.signDetached(appearance, digest, signature,chain, null, null, null, 0, MakeSignature.CryptoStandard.CADES);

PDF 文档中数字签名的可视化表示是 小部件注释 小部件注释 是一种特定类型的注释。

在 PDF 中,您拥有页面的实际内容。此内容存储在内容流中。页面在页面字典中定义。此页面字典中有一个 /Contents 条目指向多个内容流之一。这些内容流一起包含描述页面内容的语法。

注释不是任何这些流的一部分。使用 /Annots 条目从页面字典中引用注释。在您的情况下,有一个 /Annots 条目引用带有您签名外观的小部件注释。

所有注释都呈现在实际页面内容之上。

长话短说:您有一个包含某些页面内容的 PDF,并且在该页面内容的顶部添加了注释的外观。这个是正常的。这是 ISO-32000-1 中描述的 。您现在要求 PDF 查看器在页面内容 下呈现注释。根据 PDF 规范,这是不可能的。

对您的问题的简短回答是:您在问一些无法完成的事情。最接近解决方案的方法是使图像透明(但这是另一个问题)。

虽然 Bruno 的回答是正确的 - 无法使签名注释出现在内容下方 - 但在某些情况下你可以 看起来是。

混合模式使用

Bruno 已经提到一种方法可能是使图像透明。不过,常规(alpha 通道样式)透明度有一个主要缺点:原始内容或图像(可能两者都有)会显得有些苍白。但是在 PDF 中有一个相关的技术以一种特殊的方式将前景和背景放在一起:混合模式。

特别是如果您的 pdf 内容大部分是黑白的,使用混合模式 DarkenMultiply 将创建看起来像的结果想要的图片。

内容中的签名图片

如果您的 pdf 还没有签名,您实际上可以将签名图像添加到页面背景本身,例如使用 PdfStamperUnderContent。 (如果页面有一个不透明的背景,例如由于白色填充矩形作为背景,这将变得有点困难但仍然可以管理。)

签名外观的页面内容

或者,您可以在签名注释外观的图像上绘制页面内容的副本。这也适用于以前签名的 PDF,但对不透明的页面内容也很敏感。