加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:33:53 所属栏目:百科 来源:网络整理
导读:我正在尝试获取我的XFA表单中所有字段的简单列表.我正在使用此代码: private void ListFieldNames(){ string pdfTemplate = @"C:ProjectsiTextSharpSReport.pdf"; MemoryStream m = new MemoryStream(); // title the form this.Text += " - " + pdfTemp
我正在尝试获取我的XFA表单中所有字段的简单列表.我正在使用此代码:
private void ListFieldNames()
{
    string pdfTemplate = @"C:ProjectsiTextSharpSReport.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页上所写的内容一致:

Running Listing 8.18 with this form as resource will give you the following result:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读