如何通过poi删除Word文档中的注释及其引用

问题描述 投票:0回答:1

在我的项目中,我使用 Word 作为模板。我的主管将修改此模板并在其中发表评论。当程序生成最终文档时,需要删除模板中的所有注释。下面是我写的代码。不过,它只是删除了部分评论内容,并没有完全删除。

package com.office;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

public class BookmarkSetter {

    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("f:\\test.docx");
        XWPFDocument document = new XWPFDocument(fis);

        List<XWPFParagraph> paragraphList = document.getParagraphs();
        for (XWPFParagraph paragraph : paragraphList) {

            List<CTMarkupRange> start = paragraph.getCTP().getCommentRangeStartList();
            for (int i = start.size() - 1; i >= 0; --i) {
                paragraph.getCTP().removeCommentRangeStart(i);
            }
            List<CTMarkupRange> end = paragraph.getCTP().getCommentRangeEndList();
            for (int i = end.size() - 1; i >= 0; --i) {
                paragraph.getCTP().removeCommentRangeEnd(i);
            }
        }
        // Save changes
        FileOutputStream out = new FileOutputStream("f:\\test1.docx");
        document.write(out);
        out.close();
    }
}

input file output file

ms-word apache-poi comments
1个回答
0
投票

文字注释的存储方式如下:

/word/document.xml

...
<w:p ...
 ...
 <w:commentRangeStart w:id="..."/>
...
<w:p ...
 ...
 <w:commentRangeEnd w:id="..."/>
...
 <w:r ...
 ...
  <w:commentReference w:id="..."/>
 </w:r>
...

其中

commentRangeStart 
commentRangeEnd
标记注释的文本部分。运行元素中的
commentReference
指向存储在
/word/comments.xml
中的注释。

您的代码已经删除了所有

commentRangeStart 
commentRangeEnd
标记,但缺少删除
commentReference
s。

因此:

...
  for (XWPFParagraph paragraph : document.getParagraphs()) {
   // remove all comment range start marks
   for (int i = paragraph.getCTP().getCommentRangeStartList().size() - 1; i >= 0; i--) {
    paragraph.getCTP().removeCommentRangeStart(i);
   }
   // remove all comment range end marks
   for (int i = paragraph.getCTP().getCommentRangeEndList().size() - 1; i >= 0; i--) {
    paragraph.getCTP().removeCommentRangeEnd(i);
   }
   // remove all comment references
   for (int i = paragraph.getRuns().size() - 1; i >=0; i--) {
    XWPFRun run = paragraph.getRuns().get(i);   
    if (run.getCTR().getCommentReferenceList().size() > 0) {
     paragraph.removeRun(i);    
    }
   }
  }
...

但是另外

/word/comments.xml
中的评论也应该被删除:

那就是:

...
  // remove all document comments
  XWPFComments comments = document.getDocComments();
   for (int i = comments.getComments().size() - 1; i >=0; i--) {
    comments.removeComment(i);
  }   
...
© www.soinside.com 2019 - 2024. All rights reserved.