java - Apache POI XWPF 转换为 HTML:如何识别具有修订/跟踪更改(ins/del)的文本?
问题描述
我正在使用 Apache POI 将 Word 文档转换为 HTML。这个特定的 Word 文档在 MS Word 中打开了“跟踪更改”。这意味着,如果在 Word 文档中,有一些文本已被用户删除,MS Word 将对删除的文本进行删除线并添加“XYZ”用户删除该文本的注释。
现在,当我查看文本的 OOXML 时,我看到以下结构:
<w:p w14:paraId="168813AD" w14:textId="5277CBBF" w:rsidR="00575536" w:rsidRDefault="00575536" w:rsidP="00575536">
<w:pPr>
<w:pStyle w:val="Body1"/>
<w:spacing w:before="120" w:after="60"/>
<w:jc w:val="both"/>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:eastAsia="Times New Roman" w:hAnsi="Times New Roman"/>
<w:snapToGrid w:val="0"/>
<w:color w:val="auto"/>
<w:sz w:val="20"/>
</w:rPr>
</w:pPr>
<w:r w:rsidRPr="001D5C8C">
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:eastAsia="Times New Roman" w:hAnsi="Times New Roman"/>
<w:snapToGrid w:val="0"/>
<w:color w:val="auto"/>
<w:sz w:val="20"/>
</w:rPr>
<w:t xml:space="preserve">Some text </w:t>
</w:r>
<w:del w:id="1" w:author="XYZ" w:date="2020-06-10T20:48:00Z">
<w:r w:rsidRPr="001D5C8C" w:rsidDel="00E231AF">
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:eastAsia="Times New Roman" w:hAnsi="Times New Roman"/>
<w:snapToGrid w:val="0"/>
<w:color w:val="auto"/>
<w:sz w:val="20"/>
</w:rPr>
<w:delText>This text is deleted</w:delText>
</w:r>
</w:del>
</w:p>
在这里,我看到 <w:del> 标记,其中包含已删除文本的字符运行。
现在,当为包含已删除文本的此字符运行调用“visitRun”方法时,我如何识别此字符运行包含已删除文本。我以为我可以通过获取它的父级来找出答案,但是当我运行下面的代码时,我确实看到这个字符运行的父级是一个段落而不是“w:del”。
有没有办法识别字符运行包含已删除的文本?
@Override
protected void visitRun( XWPFRun run, boolean pageNumber, String url, Object paragraphContainer )
throws Exception
{
if(run.getParent() instanceof XWPFParagraph) {
log.debug("Parent is paragraph");
}
}
解决方案
使用 DelTextList 的大小对我有用。这是解决方案(希望对某人有所帮助):
@Override
protected void visitRun( XWPFRun run, boolean pageNumber, String url, Object paragraphContainer )
throws Exception
{
//Sometimes Word documents have "Track changes" tunrned ON.
//In that case, you will see that the deleted text will be marked with a strikethrough but not really deleted.
//We don't want to display deleted text. So, we need to skip the character run for such deleted text.
if(run.getCTR().getDelTextList().size()>0) {
return;
}
......
....
//do work for non-deleted character runs
}
推荐阅读
- c# - Parallel.For/Foreach 循环以同步顺序获取列表之外的元素
- anaconda - 安装GDAL包的问题| 蟒蛇2
- java - 如何恢复整数?
- jquery - 按下刷新按钮/代码时如何保持页面位置
- qt - 在 i2c 线上接收 Qt 数据
- spring - 问题春季启动应用程序部署到谷歌应用引擎
- c# - “Visual Studio 已将 ASP.NET MVC 5 的全套依赖项添加到项目中”我可以扭转它吗?
- python - Subprocess.check_call() 不打开窗口
- javascript - 无法查看图表中的条形图
- scala - 如何在scala中解压list(list())