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

python-docx中rtl与粗体/斜体同时设置不生效如何解决

问题产生原因

python-docx操作Word文档遵循OOXML规范,针对从右到左(RTL)的复杂脚本类语言(包括希伯来语、阿拉伯语等),字符格式的粗体、斜体属性和从左到右(LTR)的普通文本是两套互相独立的存储属性:

  • 直接调用runner.bold = True、runner.italic = True,默认只会修改LTR普通文本对应的w:b、w:i属性
  • Word渲染RTL文本时,只会读取复杂脚本专属的w:bCs(复杂脚本粗体)、w:iCs(复杂脚本斜体)属性,完全忽略LTR侧的粗体、斜体设置
  • 下划线属性没有LTR/RTL的区分,属于全局通用字符属性,所以直接调用API设置可以正常生效
解决方法

python-docx目前没有暴露设置复杂脚本粗体、斜体的高层API,需要直接操作run元素的底层XML节点来补充设置对应属性,完整实现代码如下:

from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn

document = Document()
p = document.add_paragraph()
p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.RIGHT
runner = p.add_run(f.strip())
runner.font.rtl = True

# 操作底层XML设置RTL复杂脚本的粗体、斜体
run_props = runner._element.get_or_add_rPr()
# 启用复杂脚本粗体
run_props.set(qn('w:bCs'), '1')
# 需要斜体则放开下面这行注释
# run_props.set(qn('w:iCs'), '1')
# 下划线直接用原有API设置即可
runner.font.underline = True

# 额外注意:如果需要指定RTL文本的字体,也要补充设置复杂脚本字体,否则字体可能不生效
# runner.font.name = "David"
# run_props.rFonts.set(qn('w:cs'), "David")

document.save("hebrew_doc.docx")

如果需要取消粗体/斜体,将对应属性的参数值改为'0',或者直接从run_props节点移除对应属性即可。

内容的提问来源于stack exchange,提问作者Yoni A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:57:31