使用itextsharp库在.pdf文件中创建空签名字段

时间:2018-03-16 15:41:37

标签: vb.net pdf itext digital-signature vb.net-2010

此代码应创建一个包含空签名字段的pdf文件:

AppDomain.CurrentDomain.UnhandledException

它创建一个带文本的pdf文件,但缺少空签名字段。

这是空签名字段的外观。 This is how an empty signature field would look.

我发现了一些类似的问题: iTextsharp - Create Empty Signature Field - how can you create a signature field for a PDF template?,但他们没有完全回答我的问题。

修改 mkl解决了它。这是最终版本:

Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports System.IO

Public Sub createPdfFileWithAnEmptySignatureField()
    Dim strOutputFilePath As String = "C:\Temp\File_ready_for_signing.pdf"
    Dim strFieldName = "myEmptySignatureField"
    Dim document As Document = New Document
    Dim writer As PdfWriter
    writer = PdfWriter.GetInstance(document, New FileStream(strOutputFilePath, FileMode.Append))
    document.Open()
    document.Add(New Paragraph("This text element is successfully added, but the empty signature field is missing from this document, for some reason..."))
    Dim field As PdfFormField = PdfFormField.CreateSignature(writer)
    field.SetWidget(New Rectangle(222, 222, 222, 222), PdfAnnotation.HIGHLIGHT_OUTLINE)
    field.Name = strFieldName
    field.Flags = PdfAnnotation.FLAGS_PRINT
    field.SetPage()
    Dim tp As PdfAppearance = PdfAppearance.CreateAppearance(writer, 1222, 1222)
    tp.Rectangle(0.5!, 0.5!, 71.5!, 47.5!)
    tp.Stroke()
    field.SetAppearance(PdfAnnotation.APPEARANCE_NORMAL, tp)
    writer.AddAnnotation(field)
    document.Close()
End Sub

1 个答案:

答案 0 :(得分:1)

您的代码中存在许多错误:

  1. 您的签名字段大小为0×0 ,即它不可见。

    您可以在此处定义签名字段的位置和大小:

    field.SetWidget(New Rectangle(222, 222, 222, 222), PdfAnnotation.HIGHLIGHT_OUTLINE)
    

    Rectangle构造函数声明为

    /// <summary>
    /// Constructs a Rectangle-object.
    /// </summary>
    /// <param name="llx">lower left x</param>
    /// <param name="lly">lower left y</param>
    /// <param name="urx">upper right x</param>
    /// <param name="ury">upper right y</param>
    public Rectangle(float llx, float lly, float urx, float ury)
    

    因此,您在左下角和右上角使用相同的坐标。因此,您的签名字段的大小为0×0,因此不可见。

    假设你认为后两个参数是宽度222和高度222,你应该使用

    field.SetWidget(New Rectangle(222, 222, 444, 444), PdfAnnotation.HIGHLIGHT_OUTLINE)
    
  2. 您的签名字段没有字段名称。是的,您设置了Name属性:

    field.Name = strFieldName
    

    但这仅设置小部件注释的名称。但是,要使表单字段正常工作,表单字段本身需要一个名称,而注释名称是可选的:

    field.FieldName = strFieldName
    
  3. 您以Append档案模式创建PDF文件:

    writer = PdfWriter.GetInstance(document, New FileStream(strOutputFilePath, FileMode.Append))
    

    这通常是一个坏主意,因为PDF的连接不再是有效的PDF文档。您应该使用Create文件模式:

    writer = PdfWriter.GetInstance(document, New FileStream(strOutputFilePath, FileMode.Create))
    
  4. 应用这些更改后,您可以:

    screenshot

    顺便说一句,可能另一个错误是你选择的外观尺寸:

    Dim tp As PdfAppearance = PdfAppearance.CreateAppearance(writer, 1222, 1222)
    

    特别是因为你只是画了一个小矩形:

    tp.Rectangle(0.5!, 0.5!, 71.5!, 47.5!)
    

    除非确实需要,否则你必须使用更好的匹配尺寸。