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

Python-pptx中font.name设置无效,如何批量修改PPT所有字体?

解决Python-pptx批量修改PPT字体无效的问题

一、修复font.name设置无效的问题

你的代码中修改字体大小、颜色生效,但字体名称不生效,核心原因是PPT文本的字体属性包含多语言维度(ASCII、ANSI、东亚等),仅设置font.name只会修改西文(latin)字体规则,无法覆盖原文本绑定的其他字体配置。

修改后的完整代码如下:

from pptx import Presentation
from pptx.util import Pt
from pptx.dml.color import RGBColor
from pptx.oxml.ns import qn  # 导入XML命名空间工具

ppt = Presentation('tmp.pptx')
for slide in ppt.slides:
    for shape in slide.shapes:
        if shape.has_text_frame:
            # 先设置文本框默认字体,避免后续文本继承旧样式
            text_frame_font = shape.text_frame.font
            text_frame_font.name = 'Calibri'
            text_frame_font._element.rPr.rFonts.set(qn('w:ascii'), 'Calibri')
            text_frame_font._element.rPr.rFonts.set(qn('w:hAnsi'), 'Calibri')
            text_frame_font._element.rPr.rFonts.set(qn('w:eastAsia'), 'Calibri')
            
            for para in shape.text_frame.paragraphs:
                # 设置段落层级默认字体
                para_font = para.font
                para_font.name = 'Calibri'
                para_font._element.rPr.rFonts.set(qn('w:ascii'), 'Calibri')
                para_font._element.rPr.rFonts.set(qn('w:hAnsi'), 'Calibri')
                para_font._element.rPr.rFonts.set(qn('w:eastAsia'), 'Calibri')
                
                for run in para.runs:
                    font = run.font
                    font.size = Pt(20)
                    font.color.rgb = RGBColor(140, 0, 0)
                    # 显式覆盖所有语言维度的字体设置
                    font.name = 'Calibri'
                    font._element.rPr.rFonts.set(qn('w:ascii'), 'Calibri')
                    font._element.rPr.rFonts.set(qn('w:hAnsi'), 'Calibri')
                    font._element.rPr.rFonts.set(qn('w:eastAsia'), 'Calibri')
ppt.save('tmp_modified.pptx')

关键说明:

  • 新增了对ASCII、ANSI、东亚三种字体类型的显式设置,彻底覆盖PPT中不同语言文本的字体规则;
  • 同时设置文本框、段落的默认字体,确保所有层级的文本都应用新字体,避免部分文本因继承旧样式而未修改。

二、获取系统可用字体名称列表

Windows系统

用pywin32库直接读取系统字体库:

import win32api

# 获取所有字体家族名称
font_families = win32api.GetFontFamilies()
for family in font_families:
    print(family)

先安装依赖:pip install pywin32

跨平台(Windows/macOS/Linux)

用fonttools库解析字体文件获取名称:

from fonttools.ttLib import TTFont
import os
import sys

def get_system_fonts():
    font_paths = []
    # 适配不同系统的字体路径
    if sys.platform == 'win32':
        font_paths.append('C:/Windows/Fonts/')
    elif sys.platform == 'darwin':
        font_paths.extend(['/Library/Fonts/', os.path.expanduser('~/Library/Fonts/')])
    elif sys.platform.startswith('linux'):
        font_paths.extend(['/usr/share/fonts/', '/usr/local/share/fonts/', os.path.expanduser('~/.fonts/')])
    
    font_names = set()
    for path in font_paths:
        if not os.path.exists(path):
            continue
        for file in os.listdir(path):
            # 支持常见字体文件格式
            if file.lower().endswith(('.ttf', '.otf', '.ttc')):
                try:
                    # 处理字体集合文件(.ttc)
                    if file.lower().endswith('.ttc'):
                        ttc = TTFont(os.path.join(path, file), fontNumber=0)
                        font_names.add(ttc['name'].getDebugName(4))
                    else:
                        ttfont = TTFont(os.path.join(path, file))
                        font_names.add(ttfont['name'].getDebugName(4))
                except Exception:
                    continue
    return sorted(font_names)

# 打印所有可用字体名称
for name in get_system_fonts():
    print(name)

先安装依赖:pip install fonttools


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:58:25