簡體   English   中英

如何通過使用iText填充XFA,使其可兼容Foxit Reader

[英]How to fill XFA from using iText so it is Foxit Reader comptible

我使用了網上提供的示例來創建一個應用程序,該應用程序能夠獲取XFA表單的xml結構,然后將其重新填充。 重要代碼如下所示:

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 Reader中看到填寫好的表格。 但是,如果我在Foxit Reader中打開文檔,則會看到一個空白表格(已在最新版本和5.x版本中進行了測試)。

我試着玩了一下,並得到了以下XfaForm(...).getDomDocument()數據:

由Acrobat Reader填充: http : //pastebin.com/kXKyh9EM
由Foxit Reader填寫: http : //pastebin.com/tiZ7EmfE
由iText填充: http : //pastebin.com/tTKLMERC
由iText填充后由Foxit Reader填充: http : //pastebin.com/Uuq0jS4b

填充的字段是。 是否可以以與Foxit Reader兼容的方式使用iText(並且XFA簽名保持不變?)

在您的Filled by iText示例中,有一個多余的<xfa:data>元素:

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

這是因為fillXfaForm()的方法XfaForm預計沒有XML數據<xfa:data>作為根元素。 因此,您的XML數據應如下所示:

<HOZ>
  <!-- rest of your data here -->
</HOZ>

我看到您的readData()方法提取了包括<xfa:data>元素的現有表單數據:

<xfa:data>
  <HOZ>
    <!-- rest of your data here -->
  </HOZ>
</xfa:data>

剝掉外部元件應該可以解決您的問題。 例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM