【问题标题】:Add signature image on PDF without digitally signing it using iTextSharp在 PDF 上添加签名图像而不使用 iTextSharp 对其进行数字签名
【发布时间】:2013-12-18 14:29:13
【问题描述】:

我正在使用 iTextSharp 处理 PDF。我想将签名图像添加到签名字段而不对文档进行数字签名(不涉及任何证书)。

有可能吗?我可以使用数字签名,但我也想在签名字段上添加签名图像而不使用任何证书。

更新:

现在写我有以下代码。

// Set PDF Reader and PDF Stamper
PdfReader reader = new PdfReader(sourceDocument);

// File stream where PDF will write
FileStream fout = new FileStream(destinationPath, FileMode.Create, FileAccess.ReadWrite);
PdfStamper stamper = PdfStamper.CreateSignature(reader, fout, '\0', null, true);

// Set PDF Appearance              
PdfSignatureAppearance appearance = stamper.SignatureAppearance;
iTextSharp.text.Image signatureFieldImage = iTextSharp.text.Image.GetInstance(image, System.Drawing.Imaging.ImageFormat.Png);
appearance.SignatureGraphic = signatureFieldImage;
appearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.GRAPHIC;
appearance.SetVisibleSignature(signatureFieldName);

stamper.Close();
reader.Close();
fout.Close();

但是当我尝试运行它时,它会给出以下错误:

签名已定义。必须在 PdfSignatureAppearance 中关闭

【问题讨论】:

  • 为签名字段添加外观后,签名字段仍显示为未使用(在签名选项卡中)。你可以吗?
  • 是的,没关系。我只想在其中一个案例中显示签名图像。
  • @mkl 请查看更新后的帖子。
  • 如我所见,@Bruno 已经恰当地回答了您的问题。
  • 感谢 mkl 和布鲁诺。布鲁诺的回答对我有用。

标签: c# pdf certificate itextsharp signature


【解决方案1】:

您正在使用代码对不想进行数字签名的 PDF 进行数字签名 ;-)

如果文档已经签名,添加任何额外内容(例如图像)将破坏签名,但如果文档尚未签名,您有不同的选择。

您需要使用PdfStamper 正常方式,即:不是使用CreateSignature() 方法,而是使用我关于iText 的书chapter 6 中描述的方式。您还需要决定 (1) 图像是否是签名字段的一部分(在这种情况下,它会在 PDF 实际签名时消失)或 (2) 需要将图像添加为内容流的一部分(在这种情况下,一旦您签署文档,它仍然会存在)。

如果是(1),请查看my book about digital signatures 的代码示例2.6 和代码示例2.7(参见CreateEmptyField 示例代码的C# 版本)。在代码示例 2.6 中,您将了解如何使用自定义 PdfAppearance 创建 PdfFormField。在代码示例 2.7 中,您将了解如何使用 PdfStamper 将签名字段添加到现有文档。在您的情况下,您将删除现有的签名字段(使用 removeField() 方法)并将其替换为在完全相同的坐标处具有不同外观的新 PdfFormField

如果是(2),您只需创建一个Image 对象并将其添加到使用GetOverContent() 方法从PdfStamper 检索到的PdfContentByte 中。请参阅examples of chapter 6 获取灵感。

在这两种情况下,您都需要知道两种情况下的坐标和页码。可以这样检索此信息:

AcroFields form = stamper.AcroFields;
AcroFields.FieldPosition f = form.GetFieldPositions("mySigName")[0];

您将获得这样的页面:f.page 和定义位置的 Rectangle,如下所示:f.position

由于我们不确切知道您需要哪种类型的最终结果,因此很难详细说明。您的代码中最重要的错误是您使用CreateSignature() 方法获取PdfStamper 对象,而您不想签署文档。

【讨论】:

  • 感谢@Bruno,它对我有用。我已使用 GetOverContent() 方法在 PDF 上显示我的图像。
  • 在您的情况下,您将删除现有的签名字段(使用 removeField() 方法)并替换它 - 如果有人这样做,请小心;如果您的原始签名字段带有特殊设置,例如锁定字典或种子值,只需替换字段就会丢弃该信息。您还必须复制有问题的参考资料。
  • 我没有删除签名字段,而是使用 FLAGS_HIDDEN 注释隐藏它。我稍后要签名字段名称。
【解决方案2】:

这就是我添加未签名签名字段的方式

     public void buildPDFMemoSignature()
     {   
        using (var ms = new MemoryStream())
        {
        var doc = new Document(PageSize.A4, 20f, 10f, 30f, 0f);
        {
            PdfWriter writer = PdfWriter.GetInstance(doc, ms);
            doc.Open();
            try
            {
              // add stuff to your PDF

             // Signature is added here ***************

             PdfFormField field = PdfFormField.CreateSignature(writer);
  field.SetWidget(new iTextSharp.text.Rectangle(190, 730, 440, 650), PdfAnnotation.HIGHLIGHT_NONE);
                    //Rectangle(float llx, float lly, float urx, float ury) 
                    field.FieldName = "mySig";
                    field.Flags = PdfAnnotation.FLAGS_PRINT;
                    field.SetPage();
                    field.MKBorderColor = BaseColor.BLACK;
                    field.MKBackgroundColor = BaseColor.WHITE;
                    PdfAppearance tp = PdfAppearance.CreateAppearance(writer, 72, 48);
                    tp.Rectangle(0.5f, 0.5f, 71.5f, 47.5f);
                    tp.Stroke();
                    field.SetAppearance(PdfAnnotation.APPEARANCE_NORMAL, tp);
                    writer.AddAnnotation(field); 
                    }
                    catch (Exception ex)
                    {  
                      //exceptions                   
                    }
                    finally
                    {
                        doc.Close();
                    }  
 }

【讨论】:

  • 这不是一个工作示例...您没有使用方法中传递的任何一个参数...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 2017-06-03
  • 2019-10-10
相关资源
最近更新 更多