如何在iTextSharp中设置静态XFA表单中的XFA数据并使其保存?

3
我使用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);
        }
    }

任何帮助都将十分感激。

你试过在线演示吗?请访问http://demo.itextsupport.com/xfademo。如果该演示可以正常运行,则说明你的代码存在问题;如果不能正常运行,则说明iText存在问题。在后一种情况下,请在运行演示后填写反馈表格。 - Bruno Lowagie
谢谢Bruno。我之前没有尝试过那个演示,但现在我已经尝试了。当我尝试在线演示并且不压缩XFA文件(这是所需的),演示中的字段会被更新。 - jon333
2个回答

2

我点赞你的回答,因为它并不是不正确的(我很高兴我的演示文稿让你重新审视了自己的代码),但现在我再次查看你的原始代码,我认为最好使用书本例子

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,而不仅仅是数据或数据集部分。

希望这能帮助其他人,如果你遇到了同样的问题。 - jon333

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接