【问题标题】:How to get a list of the fields in an XFA form?如何获取 XFA 表单中的字段列表?
【发布时间】:2013-02-13 22:43:02
【问题描述】:

我正在尝试获取 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 表格,而不是任何字段。知道我做错了什么吗?

提前致谢

【问题讨论】:

    标签: c# itextsharp xfa


    【解决方案1】:

    您从我的书“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&ex=XfaMovie

    这段代码 sn-p 将返回完整的 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();    
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-17
      • 2012-08-24
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      相关资源
      最近更新 更多