如何使用docx4j删除书签?

时间:2015-06-19 11:55:32

标签: java templates docx bookmarks 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());

返回

1
1

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

1 个答案:

答案 0 :(得分:1)

您没有为方法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