1

Web で入手できる例を使用して、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 署名はそのままですか?)

4

1 に答える 1