Apache POI:XWPFDocument如何将带有注释的文本从一个文档复制到另一文档

时间:2018-09-11 14:49:38

标签: java apache-poi comments docx

Apache poi版本:4.0

我有2个文档(docx),带有注释和格式。

如何从第一到第二复制所有文本(带有注释)?

当我阅读here时,我们无法通过XWPFDocument编写comments.xml部分-它是开放的注释部分,仅供阅读。

当我将一个文档复制到第二个like this时:

private void copyDoc(XWPFDocument to_document, XWPFDocument from_document) {
    for (IBodyElement bodyElement : to_document.getBodyElements()) {
        BodyElementType elementType = bodyElement.getElementType();

        if (elementType.equals(BodyElementType.PARAGRAPH)) {
             ...
        } else if (elementType.equals(BodyElementType.TABLE)) {
             ...
        }
    }
}

我使用段落并在注释部分中运行,但是在目标文件的comment.xml中没有注释。

所以我的文件已损坏,并且打开时出现错误(“有些地方没有注释”),其中有红色的注释部分。

有没有一种方法可以将所有注释正确地复制到一个doc文件中?

---更新---

我曾经用this example复制评论,但遇到了一些问题。

首先,我尝试从源文件中获取所有段落,并通过@ axel-richter方法获取所有注释。但是在结果文档中,我有2个文件的注释,其中一些具有相同的ID。

如果MS-Word打开文件没有问题-所有注释都正确,则LibreOffice会将每个相同ID注释写为一个。

例如:

  • 来自1.docx的ID为1且文本为“ some comment 1”的评论
  • 来自2.docx的ID为1且文本为“ some comment 2”的评论

结果:

  • “来自1.docx的文本来自生成的docx” <-带有注释“一些注释1一些注释2”
  • “来自2.docx的文本(来自生成的docx)” <-带有注释“一些注释1一些注释2”

什么时候,我重写了段落的副本并为comment_id制作了幻灯片(+10)。

CTP paragraph_object = insert_paragraph.getCTP();

if (!paragraph_object.getCommentRangeStartList().isEmpty()) {
    CTMarkupRange comment_start = paragraph_object.getCommentRangeStartArray(0);
    BigInteger current_comment_id = comment_start.getId();
    BigInteger new_comment_id = current_comment_id.add(slide);

    comment_start.setId(new_comment_id);
    paragraph_object.getCommentRangeEndArray(0).setId(new_comment_id);
}

但是从段落开始,我无法更改commentReference和MS-Word打开的新结果docx,其中包含错误和插入的注释已损坏。

在Word文件的comments.xml和document.xml中,我具有所有具有新ID的新注释(在comment.xml中)和正确的commentStart / End(在document.xml中)。

但是commentReference仍然很老,我不知道如何更改它,也不知道它将对我有帮助

0 个答案:

没有答案