Pdf iTextSharp表单字段不显示符号和(&;);,设定场
我对iTextSharp和PDF表单(特别是表单字段)有一个问题,我花了将近两天的时间在上面,我非常希望有人能找到答案 我有一个PDF表单,当我以用户身份打开它时,我可以在表单字段中输入&。但是,当我使用iTextSharp使用.SetField填充表单字段值时,符号将消失。我尝试过使用&(这实际上会导致字段中的所有文本显示为空白)、unicode表示&、不展平表单、展平表单等,但都没有效果。我不确定问题可能是什么,因为我提到表单字段肯定可以接受逗号和符号,并使用默认编码 有什么我遗漏的吗Pdf iTextSharp表单字段不显示符号和(&;);,设定场,pdf,encoding,itextsharp,itext,Pdf,Encoding,Itextsharp,Itext,我对iTextSharp和PDF表单(特别是表单字段)有一个问题,我花了将近两天的时间在上面,我非常希望有人能找到答案 我有一个PDF表单,当我以用户身份打开它时,我可以在表单字段中输入&。但是,当我使用iTextSharp使用.SetField填充表单字段值时,符号将消失。我尝试过使用&(这实际上会导致字段中的所有文本显示为空白)、unicode表示&、不展平表单、展平表单等,但都没有效果。我不确定问题可能是什么,因为我提到表单字段肯定可以接受逗号和符号,并使用默认编码 有什么我遗漏的吗 Pr
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'Using iText 4.1.2.0
GeneratePDF2()
End Sub
Private Sub GeneratePDF2()
''//The directory to output files to
Dim WorkingFolder = My.Computer.FileSystem.SpecialDirectories.Desktop
Dim FormFileName = Path.Combine(WorkingFolder, "testfile.pdf")
Dim FinalFileName = Path.Combine(WorkingFolder, "Final.pdf")
''//The name of the form field that we are going to create
Dim TextFieldName = "form1[0].#subform[0].Table3[0].Row2[0].Line2_FullName_and_AddressofEmployer[0]"
Dim FieldValue As String = "Jonathan & Chris & Mark" ' Does Not Work
'Dim FieldValue As String = "Jonathan and Chris and Mark" ' Works
Dim Letter As RandomAccessFileOrArray
'Create a PDF reader object based on the PDF template
Dim PDFReader As PdfReader
'Dim BAOS1 As MemoryStream
Dim Stamper As PdfStamper
Dim BAOS As MemoryStream = New MemoryStream()
Dim Copy As PdfCopyFields = New PdfCopyFields(BAOS)
Dim FormFilePath As String = FormFileName
Letter = New RandomAccessFileOrArray(FormFilePath)
'Create a PDF reader object based on the PDF template
PDFReader = New PdfReader(Letter, Nothing)
Dim BAOS1 As MemoryStream = New MemoryStream()
Stamper = New PdfStamper(PDFReader, BAOS1)
Dim FormFields As AcroFields = Stamper.AcroFields
'Set field value
FormFields.SetField(TextFieldName, FieldValue)
'Rename field after setting value
Dim RenamedFormFieldName As String
RenamedFormFieldName = String.Concat(Guid.NewGuid().ToString, "_", Guid.NewGuid().ToString)
FormFields.RenameField(TextFieldName, RenamedFormFieldName)
' flatten the form to remove editting options, set it to false
' to leave the form open to subsequent manual edits
Stamper.FormFlattening = True
' close the pdf
Stamper.Close()
'This could be the correct location
Copy.AddDocument(New PdfReader(BAOS1.ToArray))
Copy.Writer.CloseStream = False
Copy.Close()
PDFReader = New PdfReader(BAOS.ToArray())
Stamper = New PdfStamper(PDFReader, New FileStream(FinalFileName, FileMode.Create))
Stamper.FormFlattening = True
Stamper.Close()
End Sub
我无法重现您的问题,我使用的是5.1.1.0版。下面是创建PDF的示例代码,向其中添加一个字段,然后将该字段的值设置为
This&that
。(分三步进行,因为我不知道如何在最初的PDF创建过程中添加一个字段。)我还尝试在Acrobat中手动创建一个PDF,并且我能够将字段设置为一个符号,也很好。是否在iTextSharp或其他程序中创建表单字段?你能把PDF发到什么地方让我们看看吗
Option Explicit On
Option Strict On
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports System.IO
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
''//The directory to output files to
Dim WorkingFolder = My.Computer.FileSystem.SpecialDirectories.Desktop
''//This sample code creates a base PDF, then adds a text field to it and finally sets the field value.
''//These filenames represent those three actions
Dim BaseFileName = Path.Combine(WorkingFolder, "Base.pdf")
Dim FormFileName = Path.Combine(WorkingFolder, "Form.pdf")
Dim FinalFileName = Path.Combine(WorkingFolder, "Final.pdf")
''//The name of the form field that we are going to create
Dim TextFieldName = "Text1"
''//Create our base PDF
Using FS As New FileStream(BaseFileName, FileMode.Create, FileAccess.Write, FileShare.Read)
Using Doc As New Document(PageSize.LETTER)
Using W = PdfWriter.GetInstance(Doc, FS)
Doc.Open()
Doc.NewPage()
Doc.Add(New Paragraph("This is my form"))
Doc.Close()
End Using
End Using
End Using
''//Add our form field
Using FS As New FileStream(FormFileName, FileMode.Create, FileAccess.Write, FileShare.Read)
Dim R1 = New PdfReader(BaseFileName)
Using S As New PdfStamper(R1, FS)
Dim F As New TextField(S.Writer, New Rectangle(50, 50, 500, 100), TextFieldName)
S.AddAnnotation(F.GetTextField(), 1)
S.Close()
End Using
End Using
''//Set the field value to text with an ampersand
Using FS As New FileStream(FinalFileName, FileMode.Create, FileAccess.Write, FileShare.Read)
Dim R2 = New PdfReader(FormFileName)
Using S As New PdfStamper(R2, FS)
S.AcroFields.SetField(TextFieldName, "This & that")
S.Close()
End Using
End Using
Me.Close()
End Sub
End Class
编辑
我刚刚用你发送的PDF试用过,对我来说效果很好。下面是我运行的完整代码。你确定你没有对PDF做其他事情吗(我不知道是什么)。如果你创建了一个全新的Windows应用程序,并对5.1.1.0使用下面的代码,它对你有用吗
Option Explicit On
Option Strict On
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports System.IO
Imports System.Text
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
''//The directory to output files to
Dim WorkingFolder = My.Computer.FileSystem.SpecialDirectories.Desktop
Dim FormFileName = Path.Combine(WorkingFolder, "testfile.pdf")
Dim FinalFileName = Path.Combine(WorkingFolder, "Final.pdf")
''//The name of the form field that we are going to create
Dim TextFieldName = "form1[0].#subform[0].Table3[0].Row2[0].Line2_FullName_and_AddressofEmployer[0]"
''//Set the field value to text with an ampersand
Using FS As New FileStream(FinalFileName, FileMode.Create, FileAccess.Write, FileShare.Read)
Dim R2 = New PdfReader(FormFileName)
Using S As New PdfStamper(R2, FS)
S.AcroFields.SetField(TextFieldName, "Chris & Mark")
S.FormFlattening = True
S.Close()
End Using
End Using
Me.Close()
End Sub
End Class
有一个类似的案例,用户在应用程序中输入的德语UMLAUT没有显示在PDF中。结果是字体问题。 我们必须在应用程序中附带我们自己的字体(解放软件包以获得跨平台的Arial风格),并且这样做(它是Java):
writer.addAnnotation(PdfAnnotation)代码>PdformField源自PdfnNotation。和TextField
/RadioCheckField
/pushbutonfield
非常适合创建PdfFormField
实例。各种列表类型使用TextField。这在布局过程中不会占用空间,但我认为您可以使用带有无笔划无填充矩形的通用标记。@Mark Storer,我想您会找到答案的!我没有检查编写器本身,我只是试图用它制作一个压模,但显然失败了。下面是我的示例文件,它展示了在特定感兴趣的领域中奇怪的“不能使用符号”行为。尝试将“Chris&Mark”放在名为“form1[0]。#子表单[0]。表3[0]。行2[0]。行2_全名_和_AddressofEmployer[0]”的字段中,放平表单,然后查看结果。我神秘地找不到符号,但当我只是在字段中键入时,我就可以很好地输入它。@AudioFrk,我更新了上面的帖子,不幸的是(对你们来说)你们发送的PDF对我来说效果很好。@Chris,我添加了我用这个问题测试的代码。它是您提供的内容和现有代码的组合,并确认问题仍然存在。我使用的是不同版本的iText,4.1.2.0,但我想知道我使用的是代码还是版本。
BaseFont baseFont = BaseFont.createFont(FONT_FILE, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
acroFields.setFieldProperty(fieldName, "textfont", baseFont, null);