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

如何在python-pptx中添加并使用自定义OTF/TTF字体?

使用python-pptx配置自定义OTF/TTF字体方法

核心逻辑

python-pptx本身不直接支持嵌入字体,但可以指定文本使用的字体名称。只要打开PPT的设备上安装了该自定义字体,就能正常显示;如果需要确保无字体环境下也能正确渲染,需要额外步骤完成字体嵌入。


步骤1:获取自定义字体的真实名称

字体文件名(比如Org-Sans-Text-Regular.otf)不等于字体的内部识别名称,必须使用真实名称才能让PPT正确匹配。获取方式:

  • Windows:打开控制面板→字体,找到目标字体,查看其显示名称(示例:“Org Sans Text Regular”)
  • Mac:打开字体册,选中字体后查看顶部标注的正式名称
  • 代码方式(需先安装fonttools库):
from fontTools.ttLib import TTFont

# 替换为你的字体文件路径
font = TTFont("Org-Sans-Text-Regular.ttf")
# 输出字体的真实内部名称
print(font["name"].getDebugName(4))

步骤2:在python-pptx中指定字体名称

修改你的代码,给文本段落的字体对象设置name属性:

from pptx import Presentation
from pptx.util import Inches,Pt
from pptx.enum.text import PP_ALIGN

# 替换为你获取到的字体真实名称
CUSTOM_FONT_NAME = "Org Sans Text Regular"

ppt = Presentation()
slide_layout = ppt.slide_layouts[6]
slide = ppt.slides.add_slide(slide_layout)

text_box1 = slide.shapes.add_textbox(Inches(0), Inches(0.15), Inches(10), Inches(0.35))

tf1 = text_box1.text_frame
p = tf1.paragraphs[0]
p.text = 'Sample Title'
p.alignment = PP_ALIGN.CENTER
p.font.bold = True
# 设置自定义字体
p.font.name = CUSTOM_FONT_NAME
# 若使用中文/非拉丁字符,需额外设置以下属性
# p.font.name_asian = CUSTOM_FONT_NAME
# p.font.name_complex = CUSTOM_FONT_NAME
# 可按需设置字体大小
p.font.size = Pt(24)

ppt.save('test.pptx')

步骤3:嵌入字体(可选,适配无字体环境)

由于python-pptx原生不支持嵌入字体,可通过pywin32库调用PowerPoint COM接口完成嵌入操作:

import win32com.client as win32
import os

ppt_path = os.path.abspath("test.pptx")
powerpoint = win32.Dispatch("PowerPoint.Application")
presentation = powerpoint.Presentations.Open(ppt_path)

# 启用TrueType字体嵌入
presentation.Fonts.EmbedTrueTypeFonts = True
# 禁用系统字体嵌入(减少文件体积)
presentation.Fonts.EmbedSystemFonts = False

presentation.Save()
presentation.Close()
powerpoint.Quit()

注意:此方法仅适用于Windows系统且安装了Microsoft PowerPoint的环境,同时嵌入字体需符合字体版权要求,请确认授权后使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:12:21