【问题标题】:Creating an empty signature field in .pdf file using itextsharp library使用 itextsharp 库在 .pdf 文件中创建一个空的签名字段
【发布时间】:2018-03-16 15:41:37
【问题描述】:

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

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

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

这是一个空签名字段的外观。

我发现了一些类似的问题: 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 as String = "myEmptySignatureField"
    Dim document As Document = New Document
    Dim writer As PdfWriter
    writer = PdfWriter.GetInstance(document, New FileStream(strOutputFilePath, FileMode.Create))
    document.Open()
    document.Add(New Paragraph("The following is an empty signature field:"))
    Dim field As PdfFormField = PdfFormField.CreateSignature(writer)
    field.SetWidget(New Rectangle(50, 740, 120, 780), PdfAnnotation.HIGHLIGHT_OUTLINE)
    field.FieldName = strFieldName
    writer.AddAnnotation(field)
    document.Close()
End Sub

【问题讨论】:

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


    【解决方案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))
      

    应用这些更改后,您会得到:

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

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

    特别是当您只在其上绘制一个小矩形时:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 2016-01-20
      相关资源
      最近更新 更多