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

C# 如何获取XFA表单中的字段列表?,c#,itextsharp,xfa,C#,Itextsharp,Xfa,我正在尝试获取XFA表单中所有字段的简单列表。我正在使用以下代码: private void ListFieldNames() { string pdfTemplate = @"C:\Projects\iTextSharp\SReport.pdf"; MemoryStream m = new MemoryStream(); // title the form this.Text += " - " + pdfTemplate; // create a n

我正在尝试获取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?然后你应该去找到你复制/粘贴的例子的地方

这可能是:

或者在这里:

甚至在这里:

此代码段将返回完整的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之上编写的封闭源代码库),但让我们将这些问题留给另一个线程;-)