首页 > 解决方案 > 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");
        }
}

标签: javams-wordapache-poi

解决方案


使用 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
    }

推荐阅读