如何加载字体? | Aspose.Font for .NET

概述

为了回答“如何加载字体”这一问题,首先我们需要了解,任何字体在物理底层存储上都是一个字节数组,数据以某种特定格式表示。 因此,为了正确加载字体,您需要了解两个关键参数:

字体加载所需的对象和参数

Aspose.Font for .NET 提供了 FontDefinition 对象,用于指定字体加载所需的两个关键参数。 在创建并初始化 FontDefinition 对象后,您只需调用静态方法 Aspose.Font.Font.Open(),并将初始化后的 FontDefinition 对象作为参数传递,即可加载所需的字体并获取其引用。

让我们用伪代码来描述这个过程:

1 
2using Aspose.Font;
3    ...
4
5    // 使用适当的属性初始化 FontDefinition 对象
6    FontDefinition fontDef = new FontDefinition(); 
7    Font desiredFont = Font.Open(fontDef);

字体加载的最终结果是获得一个 Aspose.Font.Font 类型的对象。 Aspose.Font.Font 类是 Aspose.Font for .NET 库的基础字体类。它代表了操作字体的核心功能。

将字体加载到 Aspose.Font.Font 类型对象中后,您将能够使用此字体渲染文本、获取编码数据和字体指标。您还可以修改或保存此字体等。

如前所述,要初始化我们需要的 FontDefinition 对象,需要提供 2 个字体参数:格式类型,以及描述字体二进制数据存储位置的对象。 第一个参数通过 FontType 枚举来通知。

为了简化第二个参数的处理,Aspose.Font 提供了一系列对象,可以实现对字体二进制数据的通用访问,而不受字体存储位置的影响。

这种通用访问与“字节流”这一概念相关联。 因此,无论字体位于磁盘文件、其他文件内部,还是内存中的字节数组中,专门的 Aspose.Font 对象都会提供与所需字体相关的字节流访问。

让我们具体描述这些对象:

  1. StreamSource 类: 这个抽象基类定义了访问字体字节流的属性和方法。 该类的 GetFontStream() 方法返回与二进制字体数据相关的流。 Offset 属性指向该流中数据读取的起始位置。

  2. 从基础 StreamSource 继承的两个最常用的类:

如何初始化类?

以下是这些类初始化的示例。

  1. 假设字体位于名为 Lora.ttf 的文件中。在这种情况下,要访问此字体的字节流,我们需要使用其构造函数创建 FileSystemStreamSource 类型的对象:
1 
2    FileSystemStreamSource fontSource = new FileSystemStreamSource("Lora.ttf");
  1. 如果字体二进制数据位于由 byte[] fontArray 变量定义的字节数组中,则 ByteContentStreamSource 类型的对象将根据 fontArray 变量提供对字体数据流的访问。
1 
2    ByteContentStreamSource fontSource = new ByteContentStreamSource(fontArray);

因此,要提供对字体二进制数据的访问,请使用从基础 StreamSource 类继承的对象。我们称此类对象为字体流源 (font stream sources)

FontFileDefinition 对象

大多数字体位于常规文件中,但同时,部分字体可能具有不同的数据源。为了将“文件”和“字体二进制流”这两个概念统一到一个对象中,Aspose.Font 库提供了专门的对象 FontFileDefinition

该对象具有以下属性:

该对象最简单且最常用的构造函数之一是具有以下签名的构造函数:FontFileDefinition(FileInfo fontFile)。当所需字体位于硬盘驱动器上的文件中时,请使用此构造函数。

下面是为位于文件 C:\Windows\Fonts\Montserrat.ttf 中的字体 Montserrat 初始化此类对象的示例:

1 
2    FontFileDefinition fileDef = new FontFileDefinition(new FileInfo(@"C:\Windows\Fonts\Montserrat.ttf"));

此外, FontFileDefinition 还可以使用以下构造函数引用 Montserrat 字体:

1 
2    FontFileDefinition fileDef = new FontFileDefinition(new FileSystemStreamSource(@"C:\Windows\Fonts\Montserrat.ttf"));
3
4    FontFileDefinition fileDef = new FontFileDefinition("ttf", new FileSystemStreamSource(@"C:\Windows\Fonts\Montserrat.ttf"));

参数 FileExtension 应与字体格式的标准扩展名相匹配。例如,如果字体格式为 TrueType,则 FileExtension 参数的值可以是 ttfttc(如果字体文件是 TrueType 字体的集合)。如果字体格式为“Embedded OpenType”,则 FileExtension 参数的值应为 eot

下表显示了 Aspose.Font for .NET 中最常使用的字体文件格式及其对应的 FileExtension 参数应取的值。

字体文件格式文件扩展名 (FileExtension)
TrueType (单一字体)ttf
TrueType 字体集合ttc
Web Open Font Formatwoff
Web Open Font Format 2.0 版woff2
Embedded OpenTypeeot
Adobe Type 1 字体pfapfbafmpfm
Compact Font Formatcff (可以为空)

如果字体数据起始位置不是字节流的 0 位置,则使用带有 Offset 参数的构造函数:

1 
2    FontFileDefinition(string fileExtension, StreamSource streamSource, long offset);

如何初始化 FontDefinition 对象?

现在,您已经了解了从 StreamSource 类继承的对象(提供字节流访问)以及 FontFileDefinition 对象。接下来,我们将向您解释如何根据不同情况正确初始化 FontDefinition 对象。

FontDefinition 对象为您提供了许多重载构造函数。所有现有构造函数的共同特征是 FontType 参数,它描述了字体格式的类型。如前所述,除了 [FontType] 值之外,还需要通过引用字体二进制数据来初始化对象。

在这种情况下,可以使用 FontDefinition 构造函数的以下参数:

您可能会有一个疑问:既然我们总是传递 [FontType] 参数,且其值似乎与 [FileExtension] 一致,为什么还要将 [FileExtension] 参数传递给 [FontDefinition] 或 [FontFileDefinition] 对象呢? 问题在于 [FontType] 并不总是与 [FileExtension] 的值一致。[FontType] 定义了通用字体格式,但没有定义特定文件的具体格式。同一种字体格式的字体可能有不同的文件格式。 例如,值 FontType.TTF 定义了 TrueType 格式。但同时,TrueType 包含几种具体的存储格式,其扩展名可以是 ttfeotttc 等。如果对于 EOT 格式的字体,我们只将 FontType.TTF 值传递给 [FontDefinition],该对象将无法理解该字体属于 EOT 格式而非 TTF 格式。同样,FontType.Type1 是该格式字体的通用定义,其文件扩展名可以是 .pfa.pfb.afm.pfm。因此,为了正确定义字体格式,我们需要同时指定 [FontType] 和 [FileExtension] 参数。

在下面,您可以学习在不同情况下初始化 FontDefinition 对象并加载字体的示例。

在所有情况下,最终的字体加载结果都会存入 Aspose.Font.Font 类型的变量中。这是 Aspose.Font 库的基础字体类,它为使用字体提供了通用的基本功能。将字体加载到此对象中后,您将能够使用它渲染文本、获取编码信息、字体指标等。

加载字体的示例

让我们以从文件 C:\Windows\Fonts\Montserrat.ttf 加载 Montserrat 字体为例。

在文件头部添加以下命名空间:

1    using System;
2    using Aspose.Font;
3    using Aspose.Font.Sources;
4    using System.IO;

您可以使用 [FontDefinition] 和 [FontFileDefinition] 对象以几种不同的方式加载此字体:

借助 System.IO.FileInfo 对象加载

要实现加载,请执行以下操作:

  1. 构建文件路径。
  2. 初始化 [FontDefinition] 对象,传递 TTF 作为 [FontType] 值。
  3. 获取自动计算的 [FileExtension] 值。
  4. 加载字体。
 1    // 构建文件路径
 2    string fontPath = @"C:\Windows\Fonts\Montserrat.ttf";
 3
 4    // 使用 FileInfo 初始化 FontFileDefinition 对象
 5    FontFileDefinition fileDef = new FontFileDefinition(new FileInfo(fontPath));
 6
 7    // 根据 FileInfo 对象,系统会自动从 FileInfo 字段计算 FileExtension 值
 8    FontDefinition fontDef = new FontDefinition(FontType.TTF, fileDef);
 9	
10    // 加载字体
11    Font font = Font.Open(fontDef);

借助 FileSystemStreamSource 类型对象加载

采取以下步骤完成操作:

  1. 构建文件路径。
  2. 初始化 [FontDefinition] 对象。
  3. 将 [FileExtension] 设置为 ttf
  4. 加载字体。
 1    // 构建文件路径
 2    string fontPath = @"C:\Windows\Fonts\Montserrat.ttf";
 3
 4    // 传递 TTF 为 FontType 并使用 FileSystemStreamSource 初始化 FontFileDefinition
 5    FontFileDefinition fileDef = new FontFileDefinition("ttf", new FileSystemStreamSource(fontPath));
 6
 7    // 基于 fileDef 创建 FontDefinition
 8    FontDefinition fontDef = new FontDefinition(FontType.TTF, fileDef);
 9		
10    // 加载字体   
11    Font font = Font.Open(fontDef);

不使用 FontFileDefinition 对象,直接将 FileSystemStreamSource 传递给 FontDefinition

必须采取以下操作:

  1. 构建文件路径。
  2. 初始化 [FontDefinition] 对象,传递 TTF 作为 [FontType]、ttf 作为扩展名以及 FileSystemStreamSource 对象。这里的扩展名参数是正确检测字体格式所必需的。
  3. 加载字体。
1    // 构建文件路径
2    string fontPath = @"C:\Windows\Fonts\Montserrat.ttf";
3
4    // 传递 TTF 为 FontType、"ttf" 为扩展名,以及 FileSystemStreamSource 初始化 FontDefinition
5    // 这里的 'ttf' 参数对于正确检测字体格式非常重要
6    FontDefinition fontDef = new FontDefinition(FontType.TTF, "ttf", new FileSystemStreamSource(fontPath));
7
8    // 加载字体	
9    Font font = Font.Open(fontDef);

使用 byte[] 变量和 ByteContentStreamSource 对象加载

要从字节数组加载字体,您需要:

  1. 将字体二进制数据加载到字节数组中。
  2. 初始化 [FontDefinition] 对象,传递 TTF 作为 [FontType]、ttf 作为扩展名,以及基于 fontBytes 数组的 ByteContentStreamSource 对象。
  3. 加载字体。
1    // 假设 fontBytes 已包含字体的二进制数据
2    byte[] fontBytes = File.ReadAllBytes(@"C:\Windows\Fonts\Montserrat.ttf");
3
4    // 传递 TTF 为 FontType、"ttf" 为扩展名组件初始化 FontDefinition
5    FontDefinition fontDef = new FontDefinition(FontType.TTF, "ttf", new ByteContentStreamSource(fontBytes));
6	
7    // 加载字体	
8    Font font = Font.Open(fontDef);

要获取更多使用 Aspose.Font 的示例,请访问 Aspose.Font 文档 中的 net-examples 示例。

如果您有任何疑问,可以在 免费支持论坛Aspose.Font.Product Family 板块发布您的提问,我们的支持团队将在几小时内为您解答。

Have any questions about Aspose.Font?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.