当前位置: 首页 > 知识库问答 >
问题:

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

上官高畅
2023-03-14

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

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

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

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

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

下面是第一次用来替换数据或填充的代码,它是http://sourceforge.net/p/itextsharp/code/head/tree/trunk/book/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);
        }
    }

如有任何帮助,我们将不胜感激。

共有1个答案

孔瑾瑜
2023-03-14

我推翻了你的答案,因为它不是不正确的(我很高兴我对演示的引用引导你再看一遍你的代码),但是现在我再看一遍你的原始代码,我认为最好使用书中的示例:

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)。

 类似资料:
  • 代码: 这段代码没有异常,一切似乎都很好,但是如果我打开填充的pdf,Adobe Reader会说这样的话: 此文档启用了扩展功能。此文档自创建以来已更改,无法再使用扩展功能。 有些字段填写正确,但我无法编辑。某些字段为空。若我通过单击Adobe Reader中的“导入数据”手动选择xml,则表单填写正确,所以我猜xml中并没有错误。

  • 我有一个基于XFA的pdf表单,我们需要使用java来填充它。你能建议最好的方法吗。我能够使用iText为pdf生成xfa xml。 我有从上面的代码生成的Pdf和Xfa XML。你能不能建议我如何继续下去,因为我似乎没有主意了。我试图检查XFA文档,但似乎不对。我没有xml,pdf非常复杂,因为它有许多字段,是一个动态XFA pdf表单。 您的帮助和建议将受到衷心的感谢。

  • 我有一个不包含XFA数据的PDF。我想做的是,以编程方式创建一个XFA表单模板(不是使用Adobe LiveCycle或类似程序),然后将其嵌入到PDF中,然后填写XFA表单。 这可能吗?或者我必须使用Adobe LiveCycle吗? 编辑 XFAF(XFA前台)子集-(在XFA 2.5中引入)-XFA表单的每一页都覆盖在PDF背景上的表单。它只能用于静态XFA表单。此体系结构仅使用XFA的一个

  • 要求:在移动设备上查看基于XFA的PDF。 我尝试过的选项: 由于Adobe移动阅读器不支持XFA,因此我可以将XFA展平为静态PDF。我尝试过,但无法使用iText将动态XFA转换为静态PDF。 后来我尝试使用“Adobe PDF”作为打印服务打印XFA表单。这在手动执行时可以正常工作,但在通过代码执行时会以某种方式清除表单数据。 下面是打印任务的示例代码。已为“Adobe PDF”打印服务安装

  • 我试图在具有动态输入字段的pdf表单中设置值,但流编写器不断出错。 我研究了填写表格(http://mail-archives.apache.org/mod_mbox/pdfbox-users/201510.mbox/browser)的步骤,并阅读了类似的问题结合XFA与PDFBox和PDFBox臃肿的PDF文件大小 有什么不同的方法吗?有什么建议可以引导我走向正确的方向吗? 这是我的代码 这就是

  • 我需要将预填充的PDF/XFA表单设置为只读(因为在没有输入的情况下,例如文本、复选框、单选按钮等可以更改其值)。 对于常规AcroForms PDF和静态XFA表单,我可以通过在PdfStamper实例上调用setFormFlatting(true)来实现这一点。对于动态XFA表单,我必须将XDP的“字段”节点的“访问”属性设置为“只读”。 问题是,如何检测表单是否是动态XFA?不区分静态或动态