You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在LibreOffice中如何获取已插入到文本内的bookmark书签?

问题解答

完全可以实现你的需求。首先你目前调用XBookmarksSupplier.getBookmarks()获取到的所有书签对象,本身就都是已经插入到当前文档中的书签,不存在「未插入到文档的可用书签」的情况。

如果你是想筛选出仅锚定在正文主文本流中的书签,排除掉页眉、页脚、文本框、批注等其他位置的书签,可以按以下逻辑处理:

  1. 遍历拿到的所有书签对象,查询每个书签的XTextContent接口,获取它的锚定文本对象
  2. 判断该文本对象是否属于文档的主文本范围即可

示例代码(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:09:04