如何从DOCX中获取所有文本

时间:2014-07-31 11:59:17

标签: java docx4j

我有一个word文档,其中包含来自纽约时代的示例文本,如下所示:

  

示例文字:

     

阿富汗喀布尔 - 国务卿约翰克里开始了一系列的   周五在喀布尔召开会议,希望找到一条出路   总统选举危机已经威胁要分裂阿富汗人   政府并促使西方官员警告阿富汗   冒着损失数十亿美元的风险,它依赖于它。

当我将文档上传到docx4java在线演示时,我得到以下PartsList:

<w:p w14:paraId="4CB9CEA6" w14:textId="77777777">
                    <w:r>
                        <w:t>Sample Text:</w:t>
                    </w:r>
                </w:p>
                <w:p w14:paraId="0F399D69" w14:textId="77777777"/>
                <w:p w14:paraId="0C68A7DC" w14:textId="6C93B9E5">
                    <w:r>
                        <w:t>KABUL, Af</w:t>
                    </w:r>
                    <w:r>
                        <w:t>g</w:t>
                    </w:r>
                    <w:r>
                        <w:t xml:space="preserve">hanistan – Secretary of State John Kerry began a series of meetings in Kabul on Friday in hopes of finding a way out of a presidential election crisis that has threatened to split the Afghan government and prompted Western officials to warn that Afghanistan risked losing billions of dollars in air on which it depends. </w:t>
                    </w:r>
                    <w:bookmarkStart w:name="_GoBack" w:id="0"/>
                    <w:bookmarkEnd w:id="0"/>
                </w:p>

请注意单词Afghanistan如何分为三个不同的标签?我不确定为什么会这样。

我使用docx4j从此docx中提取文本,代码如下:

StringBuilder builder;
class DocumentTraverser  extends TraversalUtil.CallbackImpl {
    @Override
    public List<Object> apply(Object o) {
        if (o instanceof org.docx4j.wml.Text) {
            builder.append(((org.docx4j.wml.Text) o).getValue());
        }
        return null;
    }
}

使用此代码builder具有以下内容:

  

示例文本:阿富汗喀布尔 - 国务卿约翰克里开始了   周五在喀布尔举行一系列会议,希望找到出路   总统选举危机已经威胁要分裂阿富汗人   政府并促使西方官员警告阿富汗   冒着损失数十亿美元的风险,它依赖于它。

但是,此文本不是AS-IS docx包含的内容。 Sample Text:KABUL不应该是一个字。

问题

有没有办法从DOCX中提取文本?这意味着所有单词是否与原始文档中的单独分开?

1 个答案:

答案 0 :(得分:2)

您应该加入段落</w:p>。由于我的机器上没有docx4j,因此以下内容更为明确:

public List<Object> apply(Object o) {
    if (o instanceof org.docx4j.wml.Text) {
        builder.append(((org.docx4j.wml.Text) o).getValue());
    } else if (o instanceof Element)
        && ((Element) o).getTagName().equals("w:p") {
        builder.append("\n");
    }
    return null;
}

这会在段落的开头添加换行符;但看看你如何改进它。

顺便说一下,只检查<w:t>,因为还有特殊的命令 Text

"\f"上也可以添加分页符<w:lastRenderedPageBreak>)。