python-docx设置RTL文本方向时字号失效的解决方法
解决python-docx中设置RTL后字体大小失效的问题
问题原因
在python-docx中,直接设置run.font.rtl = True时,会重新创建一个Font对象实例,导致之前对run.font的属性设置(比如size、name)被覆盖重置。
解决方案
方案1:调整属性设置顺序
将run.font.rtl = True放在字体属性设置的最前面,让后续的字体大小、名称设置作用在新创建的Font对象上:
from docx import Document from docx.shared import Pt # 假设doc是已加载的Document对象,text是库尔德语文本列表 i = 0 # 示例索引 for paragraph in doc.paragraphs: if '{text}' in paragraph.text: paragraph.text = paragraph.text.replace('{text}', text[i].strip()) for run in paragraph.runs: run.font.rtl = True # 先设置RTL run.font.size = Pt(20) run.font.name = 'Arial'
方案2:直接操作XML元素设置RTL(更可靠)
绕过run.font.rtl的封装,直接修改run的XML元素来设置双向文本属性,避免干扰已设置的字体属性:
from docx import Document from docx.shared import Pt from docx.oxml.ns import qn # 假设doc是已加载的Document对象,text是库尔德语文本列表 i = 0 # 示例索引 for paragraph in doc.paragraphs: if '{text}' in paragraph.text: paragraph.text = paragraph.text.replace('{text}', text[i].strip()) for run in paragraph.runs: run.font.size = Pt(20) run.font.name = 'Arial' # 直接添加RTL的XML元素 rPr = run._element.get_or_add_rPr() rPr.append(rPr.makeelement(qn('w:rtl')))
验证说明
两种方案都能确保RTL文本方向生效的同时,保留字体大小和名称的设置。方案2直接操作底层XML,避免了python-docx封装层的属性覆盖问题,稳定性更强。
内容的提问来源于stack exchange,提问作者Hama Sabah
相关产品推荐
相关产品推荐

