2016-12-20 1 views
1

Я заменяю поля TextFields на подпись и не могу видеть эти пустые поля подписи в сгенерированном 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); 


    } 

Второй квест: * Мне действительно нужно поле подпись, если - клиент будет добавить текст подписи к этим полем на более поздних стадиях (с использованием 3-й инструмент партии, как DocuSign)? или простые PDFTextFields действительно будут работать?

Добавление вышеуказанного вопроса с запросом, поскольку это может быть полезно при связывании моего сценария.

Заранее благодарим за помощь.

ответ

0

Я просто проверял свой код, используя

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 четко указано положение поля подписи стрелкой:

Screenshot Adobe Reader DC

Положив фокус этой области (например, при нажатии TAB) поле даже дается рамкой:

Screenshot Adobe Reader DC with focus

Раньше версии Adobe Reader показали, что они еще четче, например. 9,5:

Screenshot Adobe Reader 9.5

Таким образом, я не могу воспроизвести, что вы

не в состоянии видеть эти пустые поля подписи в созданном PDF


Если вы хотите поля области кажутся как-то более выраженными, вы действительно можете использовать PdfAppearance, например

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

Результат выглядит следующим образом:

Screenshot Adobe Reader DC, fancy


Второй квест: * Нужно ли мне действительно нужно поле подписи, если - клиент будет добавить текст подписи к этим полем в дальнейшем (используя сторонний инструмент, такой как DocuSign)? или простые PDFTextFields действительно будут работать?

Это очень сильно зависит от точного Сторонний инструмент б/у. Некоторые из таких инструментов требуют полей подписи, некоторые требуют текстового маркера в содержимом, некоторые хотят, чтобы позиция была задана координатами ...

Смежные вопросы