首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何利用iText填充XFA,使之成为Foxit阅读器的折叠式

如何利用iText填充XFA,使之成为Foxit阅读器的折叠式
EN

Stack Overflow用户
提问于 2015-11-01 16:18:00
回答 1查看 425关注 0票数 1

我使用web上的示例创建了一个应用程序,该应用程序能够获得XFA表单的xml结构,然后将其设置为填充。重要代码如下所示:

代码语言:javascript
运行
复制
public void readData(String src, String dest)
        throws IOException, ParserConfigurationException, SAXException,
        TransformerFactoryConfigurationError, TransformerException {
    FileOutputStream os = new FileOutputStream(dest);
    PdfReader reader = new PdfReader(src);
    XfaForm xfa = new XfaForm(reader);
    Node node = xfa.getDatasetsNode();
    NodeList list = node.getChildNodes();
    for (int i = 0; i < list.getLength(); i++) {
        if ("data".equals(list.item(i).getLocalName())) {
            node = list.item(i);
            break;
        }
    }

    Transformer tf = TransformerFactory.newInstance().newTransformer();
    tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    tf.setOutputProperty(OutputKeys.INDENT, "yes");
    tf.transform(new DOMSource(node), new StreamResult(os));
    reader.close();
}

public void fillPdfWithXmlData(String src, String xml, String dest)
        throws IOException, DocumentException {

    PdfReader.unethicalreading = true;
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest), '\0', true);
    AcroFields form = stamper.getAcroFields();
    XfaForm xfa = form.getXfa();
    xfa.fillXfaForm(new FileInputStream(xml));
    stamper.close();
    reader.close();
}

当我使用它填充这个表单:http://www.vzp.cz/uploads/document/tiskopisy-pro-zamestnavatele-hromadne-oznameni-zamestnavatele-verze-2-pdf-56-kb.pdf时,它工作得很好,我可以在Acrobat中看到已填充的表单。但是,如果我在Foxit中打开文档,就会看到一个空白表单(在最新版本和5.x版本中测试)。

我试着玩了一下,得到了这些XfaForm(...).getDomDocument()数据:

由Acrobat阅读器填充:http://pastebin.com/kXKyh9EM

由Foxit阅读器填充:http://pastebin.com/tiZ7EmfE

由iText:http://pastebin.com/tTKLMERC填充

iText:http://pastebin.com/Uuq0jS4b填充后由Foxit阅读器填充

被填满的田野是。即使使用Foxit ( XFA签名保留不变),也可以使用iText吗?

EN

Stack Overflow用户

回答已采纳

发布于 2015-11-05 16:34:03

在通过iText填充的示例中,有一个多余的<xfa:data>元素:

代码语言:javascript
运行
复制
<xfa:datasets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/">
  <xfa:data>
    <xfa:data>
      <HOZ>
        <!-- rest of your data here -->
      </HOZ>
    </xfa:data>
  </xfa:data>
  <!-- data description -->
</xfa:datasets>

这是因为XfaFormXfaForm方法需要没有<xfa:data>的XML数据作为根元素。因此,您的XML数据应该如下所示:

代码语言:javascript
运行
复制
<HOZ>
  <!-- rest of your data here -->
</HOZ>

我看到提取现有表单数据的readData()方法,包括<xfa:data>元素:

代码语言:javascript
运行
复制
<xfa:data>
  <HOZ>
    <!-- rest of your data here -->
  </HOZ>
</xfa:data>

剥离外部元素可以解决你的问题。例如:

代码语言:javascript
运行
复制
XfaForm xfa = new XfaForm(reader);
Node node = xfa.getDatasetsNode();
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
    if ("data".equals(list.item(i).getLocalName())) {
        node = list.item(i);
        break;
    }
}
// strip <xfa:data>
node = node.getFirstChild();

// Transformer code here
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33464305

复制
相关文章

相似问题

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