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

Ubuntu系统下LibreOffice中RTF输出显示"{ Apple0}"而非加粗"Apple"的问题求助

Ubuntu系统下LibreOffice中RTF输出显示"{ Apple0}"而非加粗"Apple"的问题求助

我正在写一个Python脚本,用来生成包含文本片段的RTF文件,其中需要把搜索关键词加粗显示。脚本成功生成了带有关键词的片段,但关键词并没有像预期那样加粗。

下面是我的具体情况:

  • 搜索关键词: "Apple"
  • LibreOffice中预期输出: Apple(加粗显示)
  • LibreOffice中实际输出: "Apple0"(普通文本,还额外加了个"0")
  • 查看原始RTF文本: { Apple0}

按照RTF语法,我预期这部分应该是{\b Apple\b0},其中\b开启加粗,\b0结束加粗。

这里是我简化后的Python代码:

import re

TERM = "Apple"
RTF_HEADER = r"{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033{\fonttbl{\f0\fswiss\fcharset0 Calibri;}}\f0\fs22\par"
RTF_FOOTER = r"}"
BOLD_START = r"{\b "
BOLD_END = r"\b0}"

excerpt = "This is an Apple test."
term_pattern = re.compile(rf"\b{TERM}\b", re.IGNORECASE)
bolded_term = BOLD_START + TERM + BOLD_END  # Intended: {\b Apple\b0}
excerpt_bolded = term_pattern.sub(bolded_term, excerpt)

with open("output.rtf", "w", encoding="utf-8") as f:
    f.write(RTF_HEADER + excerpt_bolded + RTF_FOOTER)

问题根源

问题出在re.sub()的替换逻辑上:当你把拼接好的bolded_term作为替换字符串传入时,正则引擎会把其中的\b解析为退格字符(ASCII 8),而不是RTF语法中需要的字面\b。这就导致原本应该是{\b Apple\b0}的内容,被处理成了包含退格符的字符串——退格符会删掉它前面的空格,最终就变成了你看到的{ Apple0}。

解决方案

最稳妥的办法是使用lambda函数作为re.sub()的替换参数,这样可以直接返回我们需要的字面字符串,避免正则引擎解析转义序列:

修改代码中替换的部分:

# 替换原来的bolded_term和excerpt_bolded两行
excerpt_bolded = term_pattern.sub(lambda match: f"{BOLD_START}{match.group(0)}{BOLD_END}", excerpt)

这样,lambda函数会直接把匹配到的关键词(match.group(0))用正确的RTF加粗标签包裹,正则引擎不会处理字符串中的\b,最终写入RTF文件的就是正确的{\b Apple\b0}。

修改后的完整代码

import re

TERM = "Apple"
RTF_HEADER = r"{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033{\fonttbl{\f0\fswiss\fcharset0 Calibri;}}\f0\fs22\par"
RTF_FOOTER = r"}"
BOLD_START = r"{\b "
BOLD_END = r"\b0}"

excerpt = "This is an Apple test."
term_pattern = re.compile(rf"\b{TERM}\b", re.IGNORECASE)
# 使用lambda函数替换,避免转义问题
excerpt_bolded = term_pattern.sub(lambda match: f"{BOLD_START}{match.group(0)}{BOLD_END}", excerpt)

with open("output.rtf", "w", encoding="utf-8") as f:
    f.write(RTF_HEADER + excerpt_bolded + RTF_FOOTER)

现在生成的RTF文件在LibreOffice中打开,"Apple"就会正确显示为加粗样式了。

备注:内容来源于stack exchange,提问作者robbin olsson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 11:29:49