繁体   English   中英

在 PDF 上添加签名图像,无需使用 iTextSharp 对其进行数字签名

[英]Add signature image on PDF without digitally signing it using iTextSharp

我正在使用 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 的书的第 6 章中描述的方式。 您还需要确定(1)图像是签名字段的一部分(在这种情况下它会在 PDF 实际签名时消失)或(2)图像是否需要添加为签名字段的一部分是否重要内容流(在这种情况下,一旦您签署文档,它仍然存在)。

(1) 的情况下,请查看我关于数字签名的书的代码示例 2.6 和代码示例 2.7(有关代码的 C# 版本,请参阅CreateEmptyField示例)。 在代码示例2.6,您将学习如何创建一个PdfFormField使用自定义PdfAppearance 在代码示例 2.7 中,您将学习如何使用PdfStamper将签名字段添加到现有文档。 在您的情况下,您将删除现有的签名字段(使用removeField()方法)并将其替换为在完全相同的坐标处具有不同外观的新PdfFormField

(2) 的情况下,您只需创建一个Image对象并将其添加到使用GetOverContent()方法从PdfContentByte检索到的PdfStamper 请参阅第 6 章示例以获取灵感。

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

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

你会得到这样的页面: f.page和一个Rectangle定义这样的位置: 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();
                    }  
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM