如何在iTextSharp中以静态XFA格式设置XFA数据并将其保存?

时间:2013-05-11 22:47:30

标签: itextsharp itext xfa

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

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

背景:我有一张XFA表格,我可以在我的电脑上使用Adobe Acrobat手动填写。使用iTextSharp我可以读取Xfa XML数据的内容并查看数据的结构。我基本上试图用iText模仿它。

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

enter image description here

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

enter image description here

但是,当我将路径传递给替换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);
        }
    }

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

我赞成你的答案,因为它不是不正确的(我很高兴我对这个演示的引用让你再看看你的代码),但是现在我再看看你的原始代码,我觉得它更好使用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之间的数字。)

答案 1 :(得分:1)

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