Itext 未看到添加到PDF的空白签名字段

Itext 未看到添加到PDF的空白签名字段,itext,Itext,我正在将文本字段替换为签名字段,但无法在生成的PDF中看到这些空白签名字段。 这些空白字段需要在后期由客户进行数字签名 /// <summary> /// Adds a text field to the report that the user can update signatures to the specified location. /// </summary> /// <param name="writer">pdf

我正在将文本字段替换为签名字段,但无法在生成的PDF中看到这些空白签名字段。 这些空白字段需要在后期由客户进行数字签名

    /// <summary>
    /// Adds a text field to the report that the user can update signatures to the specified location.
    /// </summary>
    /// <param name="writer">pdfwriter of document.</param>
    /// <param name="xPosition">The lower left x position of the text field.</param>
    /// <param name="yPosition">The lower left y position of the text field.</param>
    /// <param name="width">The width of the text field.</param>
    /// <param name="height">The height of the text field.</param>
    /// <param name="fieldId"></param>   
    protected virtual void AddTextField(iTextSharp.text.pdf.PdfWriter writer, String fieldId, float xPosition, float yPosition, float width, float height)
    {
        Rectangle position = new Rectangle(xPosition, yPosition, xPosition + width, Math.Max(yPosition - height, 0));
        iTextSharp.text.pdf.TextField field = new iTextSharp.text.pdf.TextField(writer, position, fieldId);

        // Requirement is to change existing textFields to blank Signature fields
        // In the method, memoryStream, reader and stamper are not available.

        // Below is the textField I need to transform into Signature field.
        // field.Text = String.Empty;
        // field.Font = FontFactory.GetFont("Arial Narrow").BaseFont;
        // field.TextColor = Color.WHITE;
        // field.FontSize = 9;

        // Not seeing the signature field appear on the pdf.
        // Don't know exactly the reason
        PdfFormField sig = PdfFormField.CreateSignature(writer);
        sig.SetWidget(position, null);
        sig.Flags = PdfAnnotation.FLAGS_PRINT;
        sig.Put(PdfName.DA, new PdfString("/Helv 0 Tf 0 g"));
        sig.FieldName = fieldId;
        sig.SetPage();

        writer.AddAnnotation(sig);

//Also tried below code
        //PdfFormField pfield = PdfFormField.CreateSignature(writer);
        //pfield.FieldName = fieldId;
        //pfield.SetFieldFlags(PdfAnnotation.FLAGS_PRINT);
        //pfield.SetWidget(position, null);
        //pfield.SetPage();
        //pfield.MKBorderColor = Color.BLACK;
        //pfield.MKBackgroundColor = Color.BLUE;
        //PdfAppearance tp = PdfAppearance.CreateAppearance(writer, width, height);
        //tp.Rectangle(position);
        //tp.Stroke();
        //pfield.SetAppearance(PdfAnnotation.APPEARANCE_NORMAL, tp);

        //writer.AddAnnotation(pfield);


    }
//
///向报告中添加一个文本字段,用户可以将签名更新到指定位置。
/// 
///文档的PDF编写器。
///文本字段的左下角x位置。
///文本字段的左下角y位置。
///文本字段的宽度。
///文本字段的高度。
///    
受保护的虚拟void AddTextField(iTextSharp.text.pdf.PdfWriter编写器、字符串字段ID、float xPosition、float yPosition、float width、float height)
{
矩形位置=新矩形(xPosition,yPosition,xPosition+宽度,数学最大值(yPosition-高度,0));
iTextSharp.text.pdf.TextField=new iTextSharp.text.pdf.TextField(writer,position,fieldId);
//要求是将现有文本字段更改为空白签名字段
//在该方法中,memoryStream、reader和Stamp不可用。
//下面是我需要转换为签名字段的文本字段。
//field.Text=String.Empty;
//field.Font=FontFactory.GetFont(“Arial窄”).BaseFont;
//field.TextColor=Color.WHITE;
//field.FontSize=9;
//在pdf上看不到签名字段。
//我不知道确切的原因
PdfFormField sig=PdfFormField.CreateSignature(writer);
sig.SetWidget(位置,空);
sig.Flags=pdfanotation.Flags\u PRINT;
sig.Put(PdfName.DA,新的PdfString(“/Helv 0 Tf 0 g”);
sig.FieldName=fieldId;
sig.SetPage();
writer.AddAnnotation(sig);
//也尝试了下面的代码
//PdfFormField pfield=PdfFormField.CreateSignature(writer);
//pfield.FieldName=fieldId;
//pfield.SetFieldFlags(PDFanRotation.FLAGS_打印);
//pfield.SetWidget(位置,空);
//pfield.SetPage();
//pfield.MKBorderColor=Color.BLACK;
//pfield.MKBackgroundColor=Color.BLUE;
//PdfAppearance tp=PdfAppearance.CreateAppearance(书写器、宽度、高度);
//tp.矩形(位置);
//tp.Stroke();
//pfield.SetAppearance(PDFanRotation.APPEARANCE_NORMAL,tp);
//writer.AddAnnotation(pfield);
}
第二个任务: *如果客户端在以后的阶段(使用第三方工具,如DocuSign)将签名文本添加到这些字段中,我真的需要签名字段吗?或者简单的PDFTextFields真的有效

在查询中添加上述问题,因为这可能有助于关联我的场景


提前感谢您的帮助。

我刚刚用

public void AddSignatureFieldLikePrashantJha()
{
    Document document = new Document();
    Stream stream = new FileStream(@"emptySignatureFieldLikePrashantJha.pdf", FileMode.Create);
    PdfWriter pdfWriter = PdfWriter.GetInstance(document, stream);
    document.Open();
    AddTextField(pdfWriter, "Signature", 100, 100, 400, 50);
    document.Close();
}
在结果中,Adobe Reader DC通过箭头清楚地指示签名字段的位置:

将焦点放在该字段上(例如,按TAB键),该字段甚至会有一个帧:

早期的Adobe Reader版本更清楚地显示了这一点,例如9.5:

因此,我无法复制你是谁

无法在生成的PDF中看到这些空白签名字段


如果您想让字段区域看起来更加明显,您确实可以使用
pdfaappearance
,例如

protected virtual void AddFancySignatureField(iTextSharp.text.pdf.PdfWriter writer, String fieldId, float xPosition, float yPosition, float width, float height)
{
    Rectangle position = new Rectangle(xPosition, yPosition, xPosition + width, Math.Max(yPosition - height, 0));
    iTextSharp.text.pdf.TextField field = new iTextSharp.text.pdf.TextField(writer, position, fieldId);

    PdfFormField sig = PdfFormField.CreateSignature(writer);
    sig.SetWidget(position, null);
    sig.Flags = PdfAnnotation.FLAGS_PRINT;
    sig.Put(PdfName.DA, new PdfString("/Helv 0 Tf 0 g"));
    sig.FieldName = fieldId;
    sig.SetPage();

    PdfAppearance tp = PdfAppearance.CreateAppearance(writer, width, height);
    PdfShading radial = PdfShading.SimpleRadial(writer, 0, height / 2, 0, 0, height / 2, width, BaseColor.RED, BaseColor.GREEN);
    tp.PaintShading(radial);
    sig.SetAppearance(PdfAnnotation.APPEARANCE_NORMAL, tp);

    writer.AddAnnotation(sig);
}
结果如下所示:


第二个任务:*如果客户端在稍后阶段(使用第三方工具,如DocuSign)将签名文本添加到这些字段中,我真的需要签名字段吗?或者简单的PDFTextFields真的有效

这在很大程度上取决于所使用的第三方工具。有些这样的工具需要签名字段,有些需要内容中的文本标记,有些需要坐标给定的位置