首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用java从odt文件中读取XForm

用java从odt文件中读取XForm
EN

Stack Overflow用户
提问于 2015-08-27 09:25:48
回答 1查看 1.3K关注 0票数 0

我正在尝试从odt文件(用LibreOffice创建)读取数据。所需的是获取绑定到文档中包含的XForm的xml。我目前正在使用odfdom-java库来读取文件。到目前为止,我已经通过使用jdom解析文档来读取表单字段的值,但我真正想要的是使用表单数据获取整个xml。或者,我可以将文件加载为

OdfTextDocument.loadDocument("C://myFile.odt");

有人知道我如何从那里获得XForm xml吗?

或者,如果我以编程方式将odt文件转换为pdf会有帮助吗?使用pdfbox,我成功地获得了顶体

代码语言:javascript
复制
    PDDocument pdDoc = PDDocument.loadNonSeq( new File("C://myFile.odt"), null);
    PDDocumentCatalog pdCatalog = pdDoc.getDocumentCatalog();
    PDAcroForm pdAcroForm = pdCatalog.getAcroForm();

但是之后也面临着同样的问题(如何使用表单数据获取xml )。

EN

回答 1

Stack Overflow用户

发布于 2015-08-27 16:06:30

我已经设法通过jdom (odfdom-java)实现了这一点。绑定的xml本身存在于表示odt的xml中。您所需要的只是知道表单的id或标记的名称,以便获得正确的节点。然后,构造一个包含带有表单数据的xml的字符串。我的代码如下:

代码语言:javascript
复制
import org.apache.xerces.dom.DeepNodeListImpl;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class TestXFormData {

    private static StringBuilder nodeContent;

    public static void main(String[] args) throws Exception {
        //Unzip the openOffice Document
        ZipFile zipFile = new ZipFile("C://myFile.odt");
        Enumeration entries = zipFile.entries();
        ZipEntry entry;

        while(entries.hasMoreElements()) {
            entry = (ZipEntry) entries.nextElement();
            if (entry.getName().equals("content.xml")) {
                // construct document
                DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
                domFactory.setNamespaceAware(true);
                DocumentBuilder docBuilder = domFactory.newDocumentBuilder();
                Document doc = docBuilder.parse(zipFile.getInputStream(entry));
                // print the document
                printDocument(doc);
                // get the node
                NodeList list = doc.getElementsByTagName("myTagName");
                Node node = ((DeepNodeListImpl) list).item(0);
                nodeContent = new StringBuilder();
                // print the xml with the form data
                prettyPrint(node);
                System.out.println(nodeContent.toString());
            }
        }
    }


    private static void prettyPrint(Node node) {
        if (node.getNodeType() == Node.TEXT_NODE) {
            nodeContent.append(node.getNodeValue());
        } else if (node.getNodeType() == Node.ELEMENT_NODE) {
            nodeContent.append("<" + node.getNodeName() + ">");
            NodeList kids = node.getChildNodes();
            for (int i = 0; i < kids.getLength(); i++) {
                prettyPrint(kids.item(i));
            }
            nodeContent.append("</" + node.getNodeName() + ">");
        }
    }


    private static void printDocument(Document doc) throws IOException {
         OutputFormat format = new OutputFormat(doc);
         format.setIndenting(true);
         XMLSerializer serializer = new XMLSerializer(System.out, format);
         serializer.serialize(doc);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32245500

复制
相关文章

相似问题

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