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

