如何使用 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
奇怪的事情。我正在尝试删除 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