如何使用 docx4j 删除书签?

How can i delete a bookmark using docx4j?

奇怪的事情。我正在尝试删除 docx 文件中的“_GoBack”书签,因为它会破坏 VariablePrepare(有趣但不同的主题)。我有一个非常简单的模板,只有一个书签,即:

<w:bookmarkStart w:id="0" w:name="_GoBack"/>
<w:bookmarkEnd w:id="0"/>

每当我在模板中进行更改时,它都会出现在上次更改的位置。

此代码:

MainDocumentPart main = docx.getMainDocumentPart();
List<Object> bmList = getAllElementFromObject(main, CTBookmark.class);
CTBookmark bm = (CTBookmark) bmList.get(0);
System.out.println(bm.getName());

给我 "_GoBack",所以我确定书签已正确找到。但奇怪的是,如果我这样做:

getAllElementFromObject(main, CTBookmark.class).remove(0);

书签没有被删除。要检查,此代码:

System.out.println(getAllElementFromObject(main, CTBookmark.class).size());
getAllElementFromObject(main, CTBookmark.class).remove(0);
System.out.println(getAllElementFromObject(main, CTBookmark.class).size());

returns

1
1

我应该使用其他方法删除 docx4j 中的书签吗?

您没有提供方法 getAllElementFromObject 的代码,但我猜它找不到包装在 JAXB 元素中的 CTBookmark 对象。

来自BookmarksDeleter.java sample

    // Can't just remove the object from the parent,
    // since in the parent, it may be wrapped in a JAXBElement
    for (Object ox : theList) {
    if (XmlUtils.unwrap(ox).equals(bm)) {
        return theList.remove(ox);
    }

您还需要处理 CTMarkupRange 吗?

是的,要使用 docx4j 删除书签,请参阅链接示例,或尝试 RangeFinder.java