如何加载字体? | Aspose.Font for .NET
概述
为了回答“如何加载字体”这一问题,首先我们需要了解,任何字体在物理底层存储上都是一个字节数组,数据以某种特定格式表示。 因此,为了正确加载字体,您需要了解两个关键参数:
- 字体格式:字体可以有不同的格式,例如
TrueType、Type1等。 - 存储方式:存储代表字体的二进制数据的位置。每个字体都表示为二进制数据,但存储这些数据的方式可能有所不同。在大多数情况下,字体以文件的形式存储在硬盘驱动器上。但有时,字体二进制数据可能位于其他非字体本身的文件中。例如,由 Microsoft Word 或 Adobe Acrobat 创建的文件(扩展名为
.docx或.pdf的文件),它们可能包含多种不同的字体。
字体加载所需的对象和参数
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 对象都会提供与所需字体相关的字节流访问。
让我们具体描述这些对象:
StreamSource 类: 这个抽象基类定义了访问字体字节流的属性和方法。 该类的 GetFontStream() 方法返回与二进制字体数据相关的流。 Offset 属性指向该流中数据读取的起始位置。
从基础 StreamSource 继承的两个最常用的类:
- FileSystemStreamSource:旨在提供基于文件系统的流访问。 FileName 属性返回字体文件的名称。 GetFontStream() 方法返回与该文件相关的字节流。
- ByteContentStreamSource:提供基于字节数组的流访问。
如何初始化类?
以下是这些类初始化的示例。
- 假设字体位于名为
Lora.ttf的文件中。在这种情况下,要访问此字体的字节流,我们需要使用其构造函数创建 FileSystemStreamSource 类型的对象:
1
2 FileSystemStreamSource fontSource = new FileSystemStreamSource("Lora.ttf");- 如果字体二进制数据位于由
byte[] fontArray变量定义的字节数组中,则 ByteContentStreamSource 类型的对象将根据fontArray变量提供对字体数据流的访问。
1
2 ByteContentStreamSource fontSource = new ByteContentStreamSource(fontArray);因此,要提供对字体二进制数据的访问,请使用从基础 StreamSource 类继承的对象。我们称此类对象为字体流源 (font stream sources)。
FontFileDefinition 对象
大多数字体位于常规文件中,但同时,部分字体可能具有不同的数据源。为了将“文件”和“字体二进制流”这两个概念统一到一个对象中,Aspose.Font 库提供了专门的对象 FontFileDefinition。
该对象具有以下属性:
- FileName:字体文件的名称。
- FileExtension:字体文件的扩展名。
- StreamSource:字体流源。
- Offset:字体字节流中的偏移量。
该对象最简单且最常用的构造函数之一是具有以下签名的构造函数: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 参数的值可以是 ttf 或 ttc(如果字体文件是 TrueType 字体的集合)。如果字体格式为“Embedded OpenType”,则
FileExtension 参数的值应为 eot。
下表显示了 Aspose.Font for .NET 中最常使用的字体文件格式及其对应的 FileExtension 参数应取的值。
| 字体文件格式 | 文件扩展名 (FileExtension) |
|---|---|
TrueType (单一字体) | ttf |
TrueType 字体集合 | ttc |
Web Open Font Format | woff |
Web Open Font Format 2.0 版 | woff2 |
Embedded OpenType | eot |
Adobe Type 1 字体 | pfa、pfb、afm、pfm |
Compact Font Format | cff (可以为空) |
如果字体数据起始位置不是字节流的 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 包含几种具体的存储格式,其扩展名可以是 ttf、eot、ttc 等。如果对于 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 对象加载
要实现加载,请执行以下操作:
- 构建文件路径。
- 初始化 [FontDefinition] 对象,传递
TTF作为 [FontType] 值。 - 获取自动计算的 [FileExtension] 值。
- 加载字体。
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 类型对象加载
采取以下步骤完成操作:
- 构建文件路径。
- 初始化 [FontDefinition] 对象。
- 将 [FileExtension] 设置为
ttf。 - 加载字体。
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
必须采取以下操作:
- 构建文件路径。
- 初始化 [FontDefinition] 对象,传递
TTF作为 [FontType]、ttf作为扩展名以及FileSystemStreamSource对象。这里的扩展名参数是正确检测字体格式所必需的。 - 加载字体。
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 对象加载
要从字节数组加载字体,您需要:
- 将字体二进制数据加载到字节数组中。
- 初始化 [FontDefinition] 对象,传递
TTF作为 [FontType]、ttf作为扩展名,以及基于fontBytes数组的ByteContentStreamSource对象。 - 加载字体。
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 板块发布您的提问,我们的支持团队将在几小时内为您解答。