Pdf iTextSharp表单字段不显示符号和(&;);,设定场

Pdf iTextSharp表单字段不显示符号和(&;);,设定场,pdf,encoding,itextsharp,itext,Pdf,Encoding,Itextsharp,Itext,我对iTextSharp和PDF表单(特别是表单字段)有一个问题,我花了将近两天的时间在上面,我非常希望有人能找到答案 我有一个PDF表单,当我以用户身份打开它时,我可以在表单字段中输入&。但是,当我使用iTextSharp使用.SetField填充表单字段值时,符号将消失。我尝试过使用&(这实际上会导致字段中的所有文本显示为空白)、unicode表示&、不展平表单、展平表单等,但都没有效果。我不确定问题可能是什么,因为我提到表单字段肯定可以接受逗号和符号,并使用默认编码 有什么我遗漏的吗 Pr

我对iTextSharp和PDF表单(特别是表单字段)有一个问题,我花了将近两天的时间在上面,我非常希望有人能找到答案

我有一个PDF表单,当我以用户身份打开它时,我可以在表单字段中输入&。但是,当我使用iTextSharp使用.SetField填充表单字段值时,符号将消失。我尝试过使用&(这实际上会导致字段中的所有文本显示为空白)、unicode表示&、不展平表单、展平表单等,但都没有效果。我不确定问题可能是什么,因为我提到表单字段肯定可以接受逗号和符号,并使用默认编码

有什么我遗漏的吗

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);