
使用 odfdo 库进行文本替换时,默认会忽略换行符和多余空格;需启用 formatted=True 参数,才能完整保留多行文本中的 \n、缩进及空白字符。
使用 odfdo 库进行文本替换时,默认会忽略换行符和多余空格;需启用 `formatted=true` 参数,才能完整保留多行文本中的 `\n`、缩进及空白字符。
在 odfdo(OpenDocument Format Document Object)中,.replace() 方法默认采用“纯文本”模式替换——即自动折叠连续空白字符(包括换行符 \n、制表符 \t 和多个空格),导致你传入的多行缩进字符串 """some multiline \n\n text""" 被渲染为紧凑的单行 some multiline text。
从 odfdo v3.13.5 起,.replace() 方法新增了 formatted 参数(布尔类型,默认为 False)。当设为 True 时,该方法将严格保留替换字符串中的所有空白语义:
✅ 换行符 \n 转为 ODF 中的 <line-break></line-break>;
✅ 连续空格与缩进(如开头的 9 个空格)转为 <s></s>(空格占位符)或 <tab></tab>;
✅ 制表符 \t 同样被正确解析并保留结构。
因此,只需修改你的 search_replace 函数中的一行代码:
def search_replace(document):
body = document.body
body.replace(
"MAIN_TEXT",
"""some multiline
text""",
formatted=True # ← 关键:启用格式化替换
)
⚠️ 注意事项:
-
formatted=True仅影响替换内容的格式解析,不影响匹配逻辑(仍为纯字符串匹配); - 若原文档中
"MAIN_TEXT"位于表格单元格、页眉/页脚或文本框内,.replace()默认仅作用于主文档正文(document.body),如需全局替换,请遍历document.get_all_texts()或显式处理对应元素; - 替换后的格式依赖于目标段落的样式设置(如是否启用“保留空格”属性),但 odfdo 会自动插入符合 ODF 规范的标记,主流办公软件(LibreOffice / OpenOffice)均可正确渲染。
总结:formatted=True 是解决 odfdo 多行文本替换失真问题的标准方案,无需手动构造 XML 元素或调用底层 API,简洁且可靠。










