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

