我有一个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中提取文本?这意味着所有单词是否与原始文档中的单独分开?
答案 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>
)。