在LibreOffice中如何获取已插入到文本内的bookmark书签?
问题解答
完全可以实现你的需求。首先你目前调用XBookmarksSupplier.getBookmarks()获取到的所有书签对象,本身就都是已经插入到当前文档中的书签,不存在「未插入到文档的可用书签」的情况。
如果你是想筛选出仅锚定在正文主文本流中的书签,排除掉页眉、页脚、文本框、批注等其他位置的书签,可以按以下逻辑处理:
- 遍历拿到的所有书签对象,查询每个书签的
XTextContent接口,获取它的锚定文本对象 - 判断该文本对象是否属于文档的主文本范围即可
示例代码(Java UNO)
import com.sun.star.text.XBookmarksSupplier; import com.sun.star.text.XTextContent; import com.sun.star.text.XText; import com.sun.star.container.XNameAccess; import com.sun.star.uno.UnoRuntime; // 你的原有代码 XBookmarksSupplier xBookmarksSupplier = UnoRuntime.queryInterface(XBookmarksSupplier.class, xCurrentComponent); XNameAccess xNamedBookmarks = xBookmarksSupplier.getBookmarks(); // 获取文档主文本对象 XText mainText = xCurrentComponent.getText(); // 遍历筛选正文里的书签 String[] allBookmarkNames = xNamedBookmarks.getElementNames(); for (String bookmarkName : allBookmarkNames) { Object bookmarkObj = xNamedBookmarks.getByName(bookmarkName); XTextContent bookmarkContent = UnoRuntime.queryInterface(XTextContent.class, bookmarkObj); // 判断书签所属的文本是否是正文主文本 if (bookmarkContent.getText().equals(mainText)) { // 此处获取到的就是插入在正文文本中的书签 System.out.println("正文内书签:" + bookmarkName); } }
补充说明
如果你的需求只是确认某书签是否已经插入到文档的任意位置,直接判断xNamedBookmarks.hasByName("目标书签名")返回结果即可,返回true就说明该书签存在于当前文档中。
内容的提问来源于stack exchange,提问作者Manuel Nunes
相关产品推荐
相关产品推荐

