Поле формы iTextSharp не отображает амперсанды, &, с SetField - PullRequest
0 голосов
/ 27 июня 2011

У меня проблема с iTextSharp и формой PDF (особенно с полями формы), на которую я потратил почти два дня, и я искренне надеюсь, что у кого-то есть ответ.

У меня есть форма в формате PDF, и когда я открываю ее как пользователь, я могу очень хорошо вводить амперсанды и & в поля формы. Однако, когда я использую iTextSharp для заполнения значения поля формы с помощью .SetField, амперсанды исчезают. Я попытался использовать & (что фактически приводит к тому, что весь текст в поле отображается пустым), представление в Юникоде &, не сглаживать форму, сглаживать форму и т. Д., Но все безрезультатно. Я не уверен, в чем может быть проблема, поскольку я упомянул, что поле формы может принимать запятые и амперсанды с кодировкой по умолчанию.

Есть что-то, чего мне не хватает?

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

Ответы [ 2 ]

0 голосов
/ 01 ноября 2012

Был похожий случай, когда немецкие умлауты, введенные пользователем в приложении, не отображались в PDF.Оказалось, проблема с шрифтами.Пришлось поставлять наши собственные шрифты с приложением (пакет Liberation для получения кроссплатформенного стиля Arial) и делать это (это Java):

BaseFont baseFont = BaseFont.createFont(FONT_FILE, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
acroFields.setFieldProperty(fieldName, "textfont", baseFont, null);
0 голосов
/ 27 июня 2011

Я не могу воспроизвести вашу проблему, я использую версию 5.1.1.0. Ниже приведен пример кода, который создает PDF-файл, добавляет к нему поле, а затем устанавливает значение поля в This & that. (Это в три этапа, потому что я не знаю, как добавить поле во время первоначального создания PDF.) Я также попытался вручную создать PDF-файл в Acrobat, и мне также удалось установить амперсанд в поле. Вы создаете поле формы в 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

EDIT

Я только что попробовал его с отправленным вами PDF-файлом, и он отлично работает для меня. Ниже приведен полный код, который я запустил. Вот 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
...