Не удалось прочитать поля из динамической формы PDF с помощью iTextSharp

Я использовал простую динамическую форму PDF, созданную дизайнером Adobe LiveCycle, и попытался прочитать поле, используя версию iTextSharp 5.0/5.5, используя следующий код.

            string pdfTemplate = @"c:\ExpandingTextBox.pdf";
            PdfReader pdfReader = null;
            pdfReader = new PdfReader(pdfTemplate);                

            StringBuilder sb = new StringBuilder();
            foreach (var de in pdfReader.AcroFields.Fields)
            {
                sb.Append(de.Key.ToString() + Environment.NewLine);
            }               
            pdfReader.Close();

Образец PDF можно загрузить по ссылке: https://forums.adobe.com/servlet/JiveServlet/download/2051245-11361/ExpandingTextBox.pdf

Но я всегда получаю нулевые поля, хотя я вижу поле в дизайнере Adobe Live Cycle. Я не уверен, что я здесь делаю. Любая помощь очень ценится.


person Surendra Chatakondu    schedule 06.08.2014    source источник
comment
Дизайнер Adobe LiveCycle создает форму XFA, в то время как pdfReader.AcroFields в основном управляет формой Acroform, особенно AcroFields.Fields содержит только поля Acroform. Вместо этого вы можете проверить атрибут AcroFields Xfa.   -  person mkl    schedule 07.08.2014
comment
Я также попробовал этот вариант, и все равно количество полей равно нулю.   -  person Surendra Chatakondu    schedule 07.08.2014
comment
количество полей равно нулю - AcroFields.Fields Count останется равным 0; в вашем PDF нет полей AcroForm.   -  person mkl    schedule 07.08.2014
comment
Поля Xfa также считаются нулевыми. Не знаю, о чем еще вы говорите.   -  person Surendra Chatakondu    schedule 07.08.2014
comment
Я использую версию iText/Java для доступа к информации, но iTextSharp/C# должен быть эквивалентен. System.out.printf("%s", pdfReader.getAcroFields().getXfa().getTemplateSom().getName2Node()); дает мне {form1[0].#subform[0].TextFieldContainer[0].TextField1[0]=[field: null]}.   -  person mkl    schedule 08.08.2014
comment
Спасибо за ваши комментарии. Я успешно выполнил эту задачу, используя приведенный ниже ответ.   -  person Surendra Chatakondu    schedule 12.08.2014


Ответы (2)


Я использовал метод FillXfaForm для заполнения динамической формы PDF, как показано ниже. Прежде чем сделать это, вам нужно убедиться, что вы создали динамическую форму PDF в Adobe Live Cycle.

        string pdfTemplate = @"c:\test.pdf";
        string newFile = @"c:\new_test.pdf";
        string xmlForm = @"C:\fill_test.xml";

            PdfReader pdfReader = new PdfReader(pdfTemplate);
            PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(
                newFile, FileMode.Create));                
            pdfStamper.AcroFields.Xfa.FillXfaForm(xmlForm);
            pdfStamper.FormFlattening = false;

            pdfStamper.Close();
            pdfReader.Close();

Пожалуйста, дайте мне знать, если кому-то нужна помощь в понимании этого.

person Surendra Chatakondu    schedule 12.08.2014

Приведенный ниже пример кода — это то, что я использую для извлечения значений полей из формы занятости правительства I-9.pdf. Этот формат pdf аналогичен приведенному выше принятому ответу и комментариям. Использование традиционного AcroFields.Fields не будет работать с формой PDF этого типа.

using System.Linq;
using iTextSharp.text.pdf;

namespace PdfFormReader
{
    class Program
    {
        static void Main(string[] args)
        {
            string pdfTemplate = @"C:\\forms\\i-9.pdf";
            PdfReader pdfReader = new PdfReader(pdfTemplate);
            var xfaFields = pdfReader.AcroFields.Xfa.DatasetsSom.Name2Node;

            foreach (var xmlNode in xfaFields)
            {
                Console.WriteLine(xmlNode.Value.Name+":"+xmlNode.Value.InnerText);
            }

            /*Example of how to get a field value*/
            var lastName = xfaFields.First(a => a.Value.Name == "textFieldLastNameGlobal").Value.InnerText;
            Console.ReadLine();
        }
    }
}
person JimSTAT    schedule 02.12.2016