C# 在PDF上添加签名图像,而不使用iTextSharp对其进行数字签名

C# 在PDF上添加签名图像,而不使用iTextSharp对其进行数字签名,c#,pdf,certificate,itextsharp,signature,C#,Pdf,Certificate,Itextsharp,Signature,我正在使用iTextSharp处理PDF。我想将签名图像添加到签名字段,而无需对文档进行数字签名(无需任何证书) 可能吗?我可以使用数字签名,但我也希望只在签名字段中添加签名图像,而不使用任何证书 更新: 现在写我有以下代码 // Set PDF Reader and PDF Stamper PdfReader reader = new PdfReader(sourceDocument); // File stream where PDF will write FileStream fout

我正在使用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中关闭


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

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

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

如果是(1),请查看的代码示例2.6和代码示例2.7(代码的C#版本请参见示例)。在代码示例2.6中,您将学习如何使用自定义的
pdfaappearance
创建
PdfFormField
。在代码示例2.7中,您将学习如何使用
PdfStamper
向现有文档添加签名字段。在您的例子中,您需要删除现有的签名字段(使用
removeField()
方法),并将其替换为一个新的
PdfFormField
,在完全相同的坐标下具有不同的外观

对于(2),只需创建一个
图像
对象,并使用
GetOverContent()
方法将其添加到从
PdfStamper
检索的
PdfContentByte
。请参阅第页以获取灵感

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

AcroFields form = stamper.AcroFields;
AcroFields.FieldPosition f = form.GetFieldPositions("mySigName")[0];
您将得到如下页面:
f.page
和一个定义如下位置的
矩形:
f.position


由于我们不知道您需要哪种类型的最终结果,因此很难深入了解更多细节。代码中最重要的错误是使用
CreateSignature()
方法获取
PdfStamper
对象,而您不想对文档进行签名。

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

     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();
                    }  
 }

向签名字段添加外观后,签名字段仍显示为未使用(在“签名”选项卡中)。你可以吗?可以,可以。我只想展示其中一个案例中的签名图像。@mkl请查看更新后的帖子。如我所见,@Bruno已经恰当地回答了您的问题。谢谢mkl和Bruno。布鲁诺的回答对我有用。谢谢@Bruno,它对我有用。我已经使用GetOverContent()方法在PDF上显示我的图像。在您的情况下,您应该删除现有的签名字段(使用removeField()方法)并替换它-如果有人这样做,请小心;如果原始签名字段带有特殊设置,例如锁定字典或种子值,只需替换该字段即可丢弃该信息。您还必须复制有问题的引用。我不是删除签名字段,而是使用FLAGS\u HIDDEN annotation将其隐藏。稍后我需要签名字段名。这不是一个有效的示例。。。您不使用方法中传递的任何一个参数。。。