我们不得不使用设计不佳的XFA样式的PDF表单,但我们不是表单的作者(我们需要执行此操作的表单有很多种形式)。该表单具有大多数字段的数据绑定(貌似iText能够为XFA设置字段值所需的内容),但某些字段缺少字段绑定。
示例:TextField FirstName绑定到“使用名称(FirstName)” 在Adobe LiveCycle Designer中,它允许iText拾取该字段 在读取XFA数据时,允许保留设定值。该 TextField LastName没有绑定集,但它出现在 用户与FirstName相同。
使用iText或iTextSharp,有没有一种方法可以编程方式查找和更改所有没有数据绑定的XFA TextField,以便使用iText将数据绑定设置为自己(无需进入LiveCycle并手动查找每个)?
答案 0 :(得分:2)
iText(夏普)通常对XFA做的是提取,插入和替换相关的XML(XDP流)。
因此,您可以使用iText(Sharp)提取代表XFA表单的XML文档,然后处理该XML文档。调整XML文档后,您可以使用iText(夏普)重新插入它。
您必须检查XML以确定OK(例如FirstName)字段和非字段(例如LastName)之间的确切区别。有关字段和数据绑定的信息位于“template”元素中。 “field”元素定义字段。他们有一个“绑定”元素作为孩子,你的某些领域可能会遗漏。 详细信息可在XFA规范中找到:http://partners.adobe.com/public/developer/xml/index_arch.html
使用iText获取XML文档:
PdfReader reader = new PdfReader("xfa form.pdf");
XfaForm xfa = new XfaForm(reader);
Document doc = xfa.getDomDocument();
插入XML文档:
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("xfa form edit.pdf"));
xfa.setDomDocument(doc);
xfa.setChanged(true);
XfaForm.setXfa(xfa, stamper.getReader(), stamper.getWriter());
stamper.close();
reader.close();