在 Python 中自定义 PowerPoint 字体

概述

Aspose.Slides for Python 允许您在运行时提供自定义字体,以便即使在主机系统未安装所需字体时,演示文稿也能正确渲染。在导出为 PDF 或图像时,您可以提供字体文件夹或内存中的字体数据,以保留文本布局、字形度量和排版。这使得服务器端渲染在不同环境中可预测,消除操作系统级别的字体依赖,并防止不希望的回退或重新排版。本文展示了如何注册字体源。

演示文稿主题可以为各个书写系统引用不同的字体族。这些映射仅存储字体名称,但不会安装或加载字体文件。请参阅脚本特定主题字体以管理映射,并使用下面的加载选项使引用的字体可用于一致的渲染。

Aspose.Slides 允许您使用 FontsLoader 类的 load_external_fontload_external_fonts 方法加载以下字体:

  • TrueType(.ttf)和 TrueType Collection(.ttc)字体。参见TrueType
  • OpenType(.otf)字体。参见OpenType

加载自定义字体

Aspose.Slides 允许您在不将字体安装到系统上的情况下加载演示文稿中使用的字体。这会影响导出输出——如 PDF、图像和其他受支持的格式——使得生成的文档在不同环境中保持一致。字体从自定义目录加载。

  1. 指定一个或多个包含字体文件的文件夹。
  2. 调用静态 FontsLoader.load_external_fonts 方法,从这些文件夹加载字体。
  3. 加载并渲染/导出演示文稿。
  4. 调用 FontsLoader.clear_cache 清除字体缓存。

以下代码示例演示了字体加载过程:

import aspose.slides as slides

# 定义包含自定义字体文件的文件夹。
font_folders = ["fonts", "external_fonts"]

# 从指定的文件夹加载自定义字体。
slides.FontsLoader.load_external_fonts(font_folders)

with slides.Presentation("sample.pptx") as presentation:
    # 使用已加载的字体渲染/导出演示文稿(例如,导出为 PDF、图像或其他格式)。
    presentation.save("output.pdf", slides.export.SaveFormat.PDF)

# 工作完成后清除字体缓存。
slides.FontsLoader.clear_cache()

获取自定义字体文件夹

Aspose.Slides 提供 get_font_folders 方法来检索字体文件夹。该方法返回通过 load_external_fonts 添加的文件夹以及系统字体文件夹。

以下 Python 代码展示了如何使用 get_font_folders

import aspose.slides as slides

# 此调用返回检查字体文件的文件夹。
# 这些包括通过 load_external_fonts 方法添加的文件夹以及系统字体文件夹。
font_folders = slides.FontsLoader.get_font_folders()

为演示文稿指定自定义字体

Aspose.Slides 提供 document_level_font_sources 属性,可让您为演示文稿指定使用的外部字体。

以下 Python 示例展示了如何使用 document_level_font_sources

import aspose.slides as slides

with open("CustomFont1.ttf", "br") as font1_stream:
    font1_data = font1_stream.read()
    
with open("CustomFont2.ttf", "br") as font2_stream:
    font2_data = font2_stream.read()

load_options = slides.LoadOptions()
load_options.document_level_font_sources.font_folders = ["assets\\fonts", "global\\fonts"] 
load_options.document_level_font_sources.memory_fonts = [font1_data, font2_data]

with slides.Presentation("Fonts.pptx", load_options) as presentation:
    # ...
    # 对演示文稿进行操作。
    # CustomFont1、CustomFont2,以及来自 assets\\fonts 和 global\\fonts 文件夹(及其子文件夹)的字体可用于该演示文稿。
    # ...
    print(len(presentation.slides))

从二进制数据加载外部字体

Aspose.Slides 提供 load_external_font 方法,以从二进制数据加载外部字体。

以下 Python 示例演示了如何从字节数组加载字体:

import aspose.slides as slides

def read_all_bytes(file_path):
    with open(file_path, "rb") as file_stream:
        file_data = file_stream.read()
    return file_data

# 从字节数组加载外部字体。
slides.FontsLoader.load_external_font(read_all_bytes("ARIALN.TTF"))
slides.FontsLoader.load_external_font(read_all_bytes("ARIALNBI.TTF"))
slides.FontsLoader.load_external_font(read_all_bytes("ARIALNI.TTF"))

try:
    with slides.Presentation() as presentation:
        # 外部字体在此演示文稿实例的生命周期内可用。
        print("processing")
finally:
    slides.FontsLoader.clear_cache()

常见问题

自定义字体是否会影响所有格式(PDF、PNG、SVG、HTML)的导出?

是的。已连接的字体会被渲染器在所有导出格式中使用。

自定义字体是否会自动嵌入生成的 PPTX?

否。将字体注册用于渲染并不等同于将其嵌入 PPTX。如果需要将字体随演示文稿文件一起携带,必须使用明确的嵌入功能

当自定义字体缺少某些字形时,我能控制回退行为吗?

可以。通过配置字体替换替换规则回退集,可精确定义在请求的字形缺失时使用的字体。

我能在 Linux/Docker 容器中使用字体而无需在系统范围内安装它们吗?

可以。只需指向您自己的字体文件夹或从字节数组加载字体。这消除了容器镜像中对系统字体目录的任何依赖。

关于授权——我能在没有限制的情况下嵌入任何自定义字体吗?

您需自行负责字体授权的合规性。授权条款各不相同;某些授权禁止嵌入或商业使用。在分发输出之前,请务必查阅字体的最终用户许可协议(EULA)。