使用docx4j从Word文档中解析内容

时间:2012-09-08 23:33:26

标签: docx4j word-2010

感谢previous answer,我现在能够阅读受密码保护的Word 2010文档。 (我必须将它们从.doc逐个翻译成.docx。它们可以追溯到1994年,但没关系。)

我写了一个简单的Java类来开始:

package model.docx4j;

import model.JournalEntry;
import model.JournalEntryFactory;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.OpcPackage;
import org.docx4j.openpackaging.parts.Parts;

import java.io.IOException;
import java.io.InputStream;
import java.security.GeneralSecurityException;
import java.util.LinkedList;
import java.util.List;

/**
 * JournalEntryFactoryImpl using docx4j
 * @author Michael
 * @link
 * @since 9/8/12 12:44 PM
 */
public class JournalEntryFactoryImpl implements JournalEntryFactory {
    @Override
    public List<JournalEntry> getEntries(InputStream inputStream, String password) throws IOException, GeneralSecurityException {
        List<JournalEntry> journalEntries = new LinkedList<JournalEntry>();
        if (inputStream != null) {
            try {
                OpcPackage opcPackage = OpcPackage.load(inputStream, password);
                Parts parts = opcPackage.getParts();
            } catch (Docx4JException e) {
                LOGGER.error("Could not load document into docx4j", e);
                throw new IOException(e);
            }
        }
        return journalEntries;
    }
}

用JUnit测试来驱动它:

package model.docx4j;

import model.JournalEntry;
import model.JournalEntryFactory;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.OpcPackage;
import org.docx4j.openpackaging.parts.Parts;

import java.io.IOException;
import java.io.InputStream;
import java.security.GeneralSecurityException;
import java.util.LinkedList;
import java.util.List;

/**
 * JournalEntryFactoryImpl using docx4j
 * @author Michael
 * @link
 * @since 9/8/12 12:44 PM
 */
public class JournalEntryFactoryImpl implements JournalEntryFactory {
    @Override
    public List<JournalEntry> getEntries(InputStream inputStream, String password) throws IOException, GeneralSecurityException {
        List<JournalEntry> journalEntries = new LinkedList<JournalEntry>();
        if (inputStream != null) {
            try {
                OpcPackage opcPackage = OpcPackage.load(inputStream, password);
                Parts parts = opcPackage.getParts();
            } catch (Docx4JException e) {
                LOGGER.error("Could not load document into docx4j", e);
                throw new IOException(e);
            }
        }
        return journalEntries;
    }
}

我在测试中放了一个断点,看看docx4j在读取我的文档后正在做什么。我看到了8个部分的列表,但是我在没有找到内容的情况下走过树。

每个文档都包含一个包含日期和内容的页面,但我找不到页面。他们住在哪里?

1 个答案:

答案 0 :(得分:3)

主要文档内容位于“主文档部分”,通常命名为“/word/document.xml”。

通过docx4j获取它的常用方法是:

WordprocessingMLPackage wordMLPackage = (WordprocessingMLPackage)opcPackage;
MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();

但你也希望你的方法也能运作。