【问题标题】:How can I set XFA data in a static XFA form in iTextSharp and get it to save?如何在 iTextSharp 中以静态 XFA 表单设置 XFA 数据并保存?
【发布时间】:2013-05-11 22:47:30
【问题描述】:

我在 iText / iTextSharp(通过 NuGet 的 iTextSharp 5.3.3)中的 XFA 表单遇到了一个非常奇怪的问题。我正在尝试填写一个静态 XFA 样式的表单,但是我的更改没有生效。

我有两个版本的 iText in Action,并且一直在咨询第二版以及书中的 iTextSharp 代码示例转换。

背景:我有一个 XFA 表格,可以在我的计算机上使用 Adob​​e Acrobat 手动填写。使用 iTextSharp 我可以读取 Xfa XML 数据是什么并查看数据的结构。我基本上是在尝试用 iText 来模仿它。

当我添加数据并保存在 Acrobat 中时,数据是什么样的(注意:这只是数据集的特定部分)

这是我试图读入以替换现有数据的 XML 文件(注意:这是该文件的整个上下文):

但是,当我将路径传递给替换 XML 文件并尝试设置数据时,创建的新文件(已替换数据的原始副本)没有抛出任何错误,但数据没有更新。可以看到新文件创建好了,可以打开了,但是文件里面没有数据。

这是第一次用来替换数据或填充的代码,它是http://sourceforge.net/p/itextsharp/code/HEAD/tree/trunk/book/iTextExamplesWeb/iTextExamplesWeb/iTextInAction2Ed/Chapter08/XfaMovie.cs的变体

public void Generate(string sourceFilePath, string destinationtFilePath, string replacementXmlFilePath)
    {
        PdfReader pdfReader = new PdfReader(sourceFilePath);
        using (MemoryStream ms = new MemoryStream())
        {
            using (PdfStamper stamper = new PdfStamper(pdfReader, ms))
            {
                XfaForm xfaForm = new XfaForm(pdfReader);
                XmlDocument doc = new XmlDocument();
                doc.Load(replacementXmlFilePath);
                xfaForm.DomDocument = doc;
                xfaForm.Changed = true;
                XfaForm.SetXfa(xfaForm, stamper.Reader, stamper.Writer);
            }

            var bytes = ms.ToArray();
            File.WriteAllBytes(destinationtFilePath, bytes);
        }
    }

非常感谢任何帮助。

【问题讨论】:

  • 您尝试过在线演示吗?请参阅demo.itextsupport.com/xfademo 如果该演示有效,则说明您的代码有问题;如果没有,则 iText 有问题。在后一种情况下,请在运行演示后填写反馈表。
  • 谢谢布鲁诺。我没有尝试那个演示,但现在我有。当我尝试在线演示并且不展平 XFA 文件(所需要的)时,演示中的字段会更新。

标签: itextsharp itext xfa


【解决方案1】:

我赞成您的回答,因为它不正确(我很高兴我对演示的引用使您重新查看了您的代码),但是现在我再次查看了您的原始代码,我认为它更好使用book example:

public byte[] ManipulatePdf(String src, String xml) {
  PdfReader reader = new PdfReader(src);
  using (MemoryStream ms = new MemoryStream()) {
    using (PdfStamper stamper = new PdfStamper(reader, ms)) {
      AcroFields form = stamper.AcroFields;
      XfaForm xfa = form.Xfa;
      xfa.FillXfaForm(XmlReader.Create(new StringReader(xml)));
    }
    return ms.ToArray();
  }
}

如您所见,没有必要替换整个 XFA XML。如果使用FillXfaForm方法,数据就足够了。

注意:C#版本的例子见http://tinyurl.com/iiacsCH08(其他章节的例子把08改成01到16的数字)。

【讨论】:

    【解决方案2】:

    我发现了问题。替换的 DomDocument 需要是新文档的整个合并 XML,而不仅仅是数据或数据集部分。

    【讨论】:

    • 希望这可以帮助其他人,以防您遇到同样的问题。
    猜你喜欢
    • 2015-01-19
    • 2016-02-25
    • 2017-11-17
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    相关资源
    最近更新 更多