You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Python-pptx设置font.name无效,始终显示Arial字体求助

解决python-pptx中文本框字体始终显示Arial的问题

看起来你遇到的核心问题和PPT的字体脚本设置有关——Hebrew属于**复杂脚本(Complex Script)**类型,而python-pptx默认的font.name只设置了ASCII脚本的字体,复杂脚本的字体还是会用PPT的默认值(也就是Arial)。结合你的代码,我整理了几个针对性的修复步骤:

1. 修改setFont函数,添加复杂脚本字体设置

在设置字体时,除了font.name,还要显式指定复杂脚本的字体。修改后的函数如下:

from pptx.oxml.ns import qn

def setFont(font,tags,fontStyle,size):
    font.language_id = MSO_LANGUAGE_ID.HEBREW
    font.size = Pt(size)
    # 同时设置ASCII和复杂脚本字体
    font.name = fontStyle
    # 确保复杂脚本(Hebrew属于这类)使用指定字体
    if font._element.rPr is None:
        font._element.get_or_add_rPr()
    font._element.rPr.rFonts.set(qn('w:cs'), fontStyle)
    
    for tag in tags:
        if tag == 'b':
            font.bold = True
        elif tag == 'i':
            font.italic = True
        elif tag == 'u':
            font.underline = True
    return font

2. 修复末尾的字体遍历逻辑

你原来的循环只处理了最后一个段落的run,需要嵌套遍历所有段落的所有run,同时统一设置复杂脚本字体:

# 替换你原来的两段循环
for paragraph in tf.paragraphs:
    # 设置段落级别的默认字体
    paragraph.font.name = fontStyle
    # 同步设置段落默认的复杂脚本字体
    if paragraph._element.pPr is None:
        paragraph._element.get_or_add_pPr()
    if paragraph._element.pPr.defRPr is None:
        paragraph._element.pPr.get_or_add_defRPr()
    paragraph._element.pPr.defRPr.rFonts.set(qn('w:cs'), fontStyle)
    
    # 遍历当前段落的所有run,逐个设置字体
    for run in paragraph.runs:
        run.font.name = fontStyle
        run.font._element.rPr.rFonts.set(qn('w:cs'), fontStyle)
        if run.font.name != fontStyle:
            print(run.text)

3. 检查addBullets函数的字体设置

你在调用addBullets时传入了fontStyle,要确保这个函数内部没有把字体重置为Arial。如果这个函数里涉及到run的字体修改,也要同步加上复杂脚本字体的设置逻辑,和上面的setFont保持一致。

4. (可选)暂时注释语言ID测试

如果问题仍然存在,可以先注释掉font.language_id = MSO_LANGUAGE_ID.HEBREW,测试是否是语言ID导致的字体强制映射——部分语言会绑定默认字体,可能会覆盖你的自定义设置。

原理说明

PPT的字体系统会针对不同脚本类型(ASCII、东亚、复杂脚本)分别设置字体,Hebrew属于复杂脚本范畴,python-pptxfont.name默认只配置ASCII脚本的字体,所以必须通过XML原生属性w:cs来指定复杂脚本的字体,才能覆盖默认的Arial。

内容的提问来源于stack exchange,提问作者Rahul Kumar

火山引擎 最新活动