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
相关产品推荐
相关产品推荐

