You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用iText7向已数字签名PDF的签名域中添加位图?

如何使用iText7向已数字签名PDF的签名域中添加位图?

嘿,我之前也踩过这个坑!用iText7给已签名PDF的签名域加位图却不显示,后来摸清楚了正确的操作方式,给你详细说说:

首先要明确,已数字签名的PDF只能用追加模式修改,你已经用stampingProperties.UseAppendMode()做对了这一步,这是基础,不然会破坏原有签名,还可能导致外观异常。

接下来是关键:别直接用SetContents来塞位图,这个方法主要是处理文本内容,位图得通过签名域外观的图层来绘制,具体步骤如下:

  1. 加载位图资源
    先把你要添加的图片加载成iText能识别的ImageData对象,比如:

    ImageData imageData = ImageDataFactory.Create("你的图片路径.png");
    

    注意要确保图片路径正确,格式支持(PNG、JPG这些都没问题)。

  2. 获取签名域的外观图层
    签名域的外观有多个图层,我们自定义的内容(包括位图)要放到Layer2这个图层里,代码如下:

    SignatureFieldAppearance appearance = signer.GetSignatureFieldAppearance();
    // 获取Layer2的画布,用来绘制自定义内容
    PdfCanvas canvas = new PdfCanvas(appearance.GetLayer2(), signer.GetDocument());
    
  3. 绘制到位图到画布上
    你需要指定位图在签名域里的位置和尺寸,避免超出域范围导致看不到:

    // 示例:距离签名域左边界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);
    
  4. 如果要同时添加文本
    要是还要加文本,也建议用画布来绘制,避免和位图冲突:

    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

火山引擎 最新活动