使用 itextsharp 库在 .pdf 文件中创建一个空的签名字段
Creating an empty signature field in .pdf file using itextsharp library
此代码应创建一个包含空签名字段的 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
您的代码中存在一些错误:
您的签名字段大小为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)
您的签名字段没有字段名称。是的,你设置 Name
属性:
field.Name = strFieldName
但这只设置了小部件的名称注释。但是,为了使表单域正常工作,表单域 本身需要一个名称,而注解名称是可选的:
field.FieldName = strFieldName
您在 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!)
除非确实需要,否则您必须使用更匹配的尺寸。
此代码应创建一个包含空签名字段的 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
您的代码中存在一些错误:
您的签名字段大小为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)
您的签名字段没有字段名称。是的,你设置
Name
属性:field.Name = strFieldName
但这只设置了小部件的名称注释。但是,为了使表单域正常工作,表单域 本身需要一个名称,而注解名称是可选的:
field.FieldName = strFieldName
您在
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!)
除非确实需要,否则您必须使用更匹配的尺寸。