首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在iTextSharp中设置静态XFA表单中的XFA数据并保存它?

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

Stack Overflow用户
提问于 2013-05-12 06:47:30
回答 2查看 3.7K关注 0票数 2

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

我有两个版本的iText在运行,并且一直在参考第二版以及书中的iTextSharp代码示例转换。

背景:我有一个XFA表单,可以在我的计算机上使用Adobe Acrobat手动填写。使用iTextSharp,我可以读取XML数据并查看数据的结构。我本质上是想用iText来模仿这一点。

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

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

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

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

代码语言:javascript
复制
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);
        }
    }

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2013-05-13 00:59:57

我提升了您的答案,因为它不是错误的(我很高兴我对演示的引用让您重新查看了您的代码),但是现在我再次查看了您的原始代码,我认为使用book example更好

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-05-12 22:34:50

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16502427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档