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

(1)的情况下,请查看我的书中关于数字签名的代码示例2.6和代码示例2.7(请参阅代码的C#版本的CreateEmptyField示例)。 在代码示例2.6中,您将学习如何使用自定义PdfAppearance创建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和一个定义如下位置的Rectanglef.position

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

这是我添加无符号签名字段的方法

  public void buildPDFMemoSignature(string DocName, BuildableDoc docBuild) { 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(); } }