Не удалось прочитать поля из динамической 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 Designer. Я не уверен, что я делаю здесь. Любая помощь с благодарностью.
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();
Пожалуйста, дайте мне знать, если кому-то нужна помощь в понимании этого.
Приведенный ниже пример кода - это то, что я использую для извлечения значений полей из формы занятости I-9.pdf. Этот формат PDF является xfa похожим на принятый выше ответ и комментарии. Использование традиционных 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();
}
}
}