如何使用iText7向已数字签名PDF的签名域中添加位图?
如何使用iText7向已数字签名PDF的签名域中添加位图?
嘿,我之前也踩过这个坑!用iText7给已签名PDF的签名域加位图却不显示,后来摸清楚了正确的操作方式,给你详细说说:
首先要明确,已数字签名的PDF只能用追加模式修改,你已经用stampingProperties.UseAppendMode()做对了这一步,这是基础,不然会破坏原有签名,还可能导致外观异常。
接下来是关键:别直接用SetContents来塞位图,这个方法主要是处理文本内容,位图得通过签名域外观的图层来绘制,具体步骤如下:
加载位图资源
先把你要添加的图片加载成iText能识别的ImageData对象,比如:ImageData imageData = ImageDataFactory.Create("你的图片路径.png");注意要确保图片路径正确,格式支持(PNG、JPG这些都没问题)。
获取签名域的外观图层
签名域的外观有多个图层,我们自定义的内容(包括位图)要放到Layer2这个图层里,代码如下:SignatureFieldAppearance appearance = signer.GetSignatureFieldAppearance(); // 获取Layer2的画布,用来绘制自定义内容 PdfCanvas canvas = new PdfCanvas(appearance.GetLayer2(), signer.GetDocument());绘制到位图到画布上
你需要指定位图在签名域里的位置和尺寸,避免超出域范围导致看不到:// 示例:距离签名域左边界10px,下边界10px,宽50px,高50px float x = 10; float y = 10; float imgWidth = 50; float imgHeight = 50; // 把位图适配到指定的矩形区域里 canvas.AddImageFittedIntoRectangle(imageData, new Rectangle(x, y, imgWidth, imgHeight), false);如果要同时添加文本
要是还要加文本,也建议用画布来绘制,避免和位图冲突:canvas.BeginText() .SetFontAndSize(PdfFontFactory.CreateFont(StandardFonts.HELVETICA), 12) .MoveText(70, 30) // 文本位置 .ShowText("你的签名文本") .EndText();
另外还要注意两个常见坑:
- 别选错图层:
Layer0是背景层,Layer1是签名的标准层,只有Layer2是留给我们加自定义内容的,选不对图层位图肯定不显示。 - 签名域尺寸要够:如果你的位图尺寸比签名域还大,会被裁剪甚至完全看不到,所以要确保签名域的矩形大小能容纳位图。
要是你是新建签名域而不是修改已有的,那还要先把签名域添加到页面上:
// 创建一个新的签名域,指定位置和名称 PdfSignatureField signatureField = new PdfSignatureField(signer.GetDocument(), new Rectangle(150, 200, 250, 120), "mySignatureField"); // 把签名域添加到第一页 signer.GetDocument().GetFirstPage().AddAnnotation(signatureField); // 关联外观到这个签名域 appearance.SetFieldName("mySignatureField");
这样操作下来,位图应该就能正常显示啦!
备注:内容来源于stack exchange,提问作者xerves




