如何获取XFA表单中的字段列表?

我正在尝试获取我的XFA表单中所有字段的简单列表。 我正在使用此代码:

private void ListFieldNames() { string pdfTemplate = @"C:\Projects\iTextSharp\SReport.pdf"; MemoryStream m = new MemoryStream(); // title the form this.Text += " - " + pdfTemplate; // create a new PDF reader based on the PDF template document PdfReader pdfReader = new PdfReader(pdfTemplate); PdfStamper pdfStamper = new PdfStamper(pdfReader, m); AcroFields formFields = pdfStamper.AcroFields; AcroFields form = pdfReader.AcroFields; XfaForm xfa = form.Xfa; StringBuilder sb = new StringBuilder(); sb.Append(xfa.XfaPresent ? "XFA form" : "AcroForm"); sb.Append(Environment.NewLine); foreach (string key in form.Fields.Keys) { sb.Append(key); sb.Append(Environment.NewLine); txtFields.Text = sb.ToString(); } txtFields.Text = sb.ToString(); } 

但我得到的只是XFA表格而不是任何字段。 知道我做错了什么吗?

提前致谢

您已经从我的书“iText in Action”的第8章中获取了代码示例。 该代码示例的结果与我在第273页上所写的内容一致:

使用此表单作为资源运行清单8.18将为您提供以下结果:

AcroForm

如果你的问题是我知道我做错了什么? 那么答案很简单:你在第270页停止阅读,或者你没有阅读随附文档就使用了代码示例。 如何解决这个问题? 阅读文档!

如果您的问题是为什么我没有获得有关这些字段的任何信息? (这不是你的问题,但我们假设它是),答案是:你使用代码来检索AcroForm字段,但你的表单不包含任何这样的字段。 您的表单是纯XFA表单,这意味着所有字段信息仅存储为XML和XML!

假设您现在想知道: 我如何提取该XML? 然后你应该去你找到你复制/粘贴的例子的地方。

可能就在这里: http : //itextpdf.com/examples/iia.php?id = 164

或者在这里: http : //sourceforge.net/p/itextsharp/code/HEAD/tree/trunk/book/iTextExamplesWeb/iTextExamplesWeb/iTextInAction2Ed/Chapter08/XfaMovie.cs

甚至在这里: http : //kuujinbo.info/iTextInAction2Ed/index.aspx?ch = Chapter08&e = XfaMovie

此代码段将返回完整的XFA流:

 public string ReadXfa(PdfReader reader) { XfaForm xfa = new XfaForm(reader); XmlDocument doc = xfa.DomDocument; reader.Close(); if (!string.IsNullOrEmpty(doc.DocumentElement.NamespaceURI)) { doc.DocumentElement.SetAttribute("xmlns", ""); XmlDocument new_doc = new XmlDocument(); new_doc.LoadXml(doc.OuterXml); doc = new_doc; } var sb = new StringBuilder(4000); var Xsettings = new XmlWriterSettings() {Indent = true}; using (var writer = XmlWriter.Create(sb, Xsettings)) { doc.WriteTo(writer); } return sb.ToString(); } 

现在查找标记; 它将有一个子标签 (如果表单为空,则可能为空)和子标签 。 在dataDescription标记内,您会发现类似于XSD的内容。 这就是你需要知道表格中的字段是什么。

我可以继续猜测问题,例如: 我如何填写这样的表格? 通过使用fillXfaForm()方法; 我怎样才能压扁这样的表格? 通过使用XFA Worker(这是一个在iTextSharp之上编写的封闭源库),但让我们将这些问题留给另一个线程;-)