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

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

此代码应创建一个包含空签名字段的 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 文件,但缺少空签名字段。

这就是空签名字段的外观。 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 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

最佳答案

您的代码中有一些错误:

  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. 您在附加文件模式下创建 PDF 文件:

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

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

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

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

screenshot

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

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

特别是当你只在上面画一个小矩形时:

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

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

关于vb.net - 使用 itextsharp 库在 .pdf 文件中创建空签名字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49324642/

相关文章:

vb.net - OleDbException 未处理......UPDATE 语句中的语法错误

c# - VB.NET 等同于 C# 属性简写?

c# - 获取生成 PDF 的堆栈溢出异常

c# - ItextSharp 在 pdf 中查找文本并突出显示

c# - 在 visual studio 2010 winforms 项目中获取表单设计 View 的任何快捷方式/

c# - VB 到 C# 函数

r - 在 R 中,如何自动注释每个保存的图形?

javascript - 如何在浏览器中渲染 PDF 上的 HTML 元素

java - iText-PdfReader : Rebuild failed: Dictionary key endstream is not a name

java - 如何在java中创建pdf文件,顶部有交替的彩色行和图片