如何加载字体? | Java的API解决方案
概述
为了回答这个问题,如何加载字体,首先我们需要学习任何字体在物理上都是一个字节数组,其中数据以某种格式表示。 因此,要正确的字体加载,您需要知道两个关键参数:
- 字体格式。字体可以有不同的格式,例如
TrueType
、Type1
等。 - 存储,其中代表字体的二进制数据。每个字体表示为二进制数据,但存储数据的方式可能有所不同。在大多数情况下,该字体被存储在硬盘驱动器上。但是有时可以将字体二进制数据放在不是字体本身的其他文件中。例如,由Microsoft Word或Adobe Acrobat创建的文件。这些是带有扩展名的文件
.docx
,.pdf
。它们可以包括不同的字体。
字体加载所需的对象和参数
java的aspose.font给出对象 fontdefiniton通知字体加载所需的两个关键参数。
创建并初始化 FontDefiniton 对象后,您只需调用静态方法 com.aspose.font.Font.open() 并传递刚刚初始化的对象 FontDefiniton 作为参数来加载所需的字体并获取对它的引用。
让我们用伪代码来描述它:
1
2 com.aspose.font;
3
4 import com.aspose.font.FontDefinition;
5 ...
6
7 // Initialize object FontDefinition with appropriate properties
8 FontDefinition fontDef = new FontDefinition();
9 Font desiredFont = Font.open(fontDef);
字体加载的最终结果是获得 com.aspose.font.font类型的对象。 类 com.aspose.font.font是 com.aspose.font java库的基本字体类。它代表使用字体工作的主要功能。
将字体加载到 com.aspose.font.font类型对象中,您将能够使用此字体呈现文本,获取编码数据和字体指标。您还可以修改或保存此字体等。
启动 fontdefiniton我们需要的对象,如前所述,以给出2个字体参数 - 格式类型,以及描述字体二进制数据存储的对象。 通过 fonttype枚举通知第一个参数。
为了简化第二个参数的工作, com.aspose.font提供了一系列对象,可通用对字体二进制数据的通用访问,从放置字体的位置。
这种通用访问与字节流这样的东西链接。 因此,独立于将字体放置在磁盘上的文件中,在另一个文件中,内存中的字节数组中的一个文件 - 在任何情况下,special com.aspose.font对象都将提供对与所需字体有关的字节流的访问。
让我们描述这些对象:
streamsource类。该抽象基类定义了访问字体字节流的属性和方法。 getFontStream()此类方法返回与二进制字体数据有关的流。 属性 offset在此流的位置上的点,从那里我们必须开始读取数据。
从基础 streamsource继承的两个最常用的类:
- FileSystemStreamSource - 旨在根据文件系统提供对流的访问。 属性 filename返回字体文件的名称。 getFontStream()方法返回与此文件相关的字节流。
- ByteContentStreamSource - 基于字节数组提供对流的访问。
如何开始课程?
以下是这些班级启动的示例。
- 假设字体在名为lora.ttf的文件中。在这种情况下,要访问此字体的字节流,我们需要使用此单个构造函数来创建类型 filesystemstreamsource的对象:
1
2 filesystemstreamsource fontsource = new filesystemstreamsource(“ lora.ttf”);
- 如果字体二进制数据位于由字节[] fontarray变量定义的二进制数组中,则基于FontArray变量的类型 bytecontentstreamsource类型的对象将提供对字体数据流的访问。
要访问字体字节流,我们必须创建一个类型 bytecontentstreamsource的对象,以访问与字体字节数组相关的流,使用类似的代码:
1
2 ByteContentStreamSource fontSource = new ByteContentStreamSource(fontArray);
因此,要提供对字体二进制数据的访问,请使用从基本 * streamsource *类继承的对象。此外,我们将称之为此类对象字体流源。
fontfiledefinition对象
大多数方面都位于常规文件中,但同时,一部分字体可能具有不同的数据源。要加入一个对象项文件和字体二进制流, com.aspose.font库提供特殊对象 fontfiledefinition。
该对象具有这样的属性:
- 文件名 - 字体文件的名称。
- fileextension - 字体文件的扩展。
- streamsource - 字体流源。
- offset - 字体字节中的偏移量。
该对象的最简单和最常用的构造函数之一是具有以下签名的构造函数: fontfiledefinition(文件fontfile),在硬盘驱动器上的文件中使用该构造函数。
下面是为位于文件 C:\Windows\Fonts\Montserrat.ttf 中的字体Montserrat
启动此类对象的示例:
1
2 FontFileDefinition fileDef = new FontFileDefinition(new File("C:\\Windows\\Fonts\\Montserrat.ttf"));
另外, fontfiledefinition可以使用以下构造函数参考`蒙特塞拉特字体:
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 fonts的集合)。
如果字体格式为“嵌入式打开类型”,则 fileextension参数的值应为eot
。
下表显示了aspose.font字体文件格式中最常使用的。在那里,它们具有 fileextension参数应采用的匹配值。
字体文件格式 | 文件扩展名 |
---|---|
TrueType , single font | ttf |
TrueType font collection | ttc |
Web Open Font Format | woff |
Web Open Font Format version 2.0 | woff2 |
Embedded OpenType | eot |
Adobe Type 1 font | pfa , pfb , afm , pfm |
Compact Font Format | cff , can be null |
如果字体数据不是从字节流的位置0启动,请使用 offset参数的以下构造函数:
1
2 FontFileDefinition(String fileExtension, StreamSource streamSource, long offset).
如何启动FontDefinition对象?
现在,当您了解从 streamsource类继承的对象并提供对字体字节流的访问权限以及 fontfiledefinition对象的访问权限时,我们将向您解释如何使用fontdefiniton使用这些对象适当地使用这些对象,以适合这些对象。
fontdefiniton对象为您提供许多超载构造函数。 所有现有构造函数的共同特征是 fonttype参数。它描述了字体格式的类型。 如前所述,除了 fonttype值之外,应参考字体二进制数据初始化对象 fontdefiniton。
在这种情况下,可以使用 fontdefiniton构造函数的下一个参数:
- fontname;
- fileextension;- streamsource类型的对象;
- fontfiledefinition类型的对象。
您可能有一个问题。为什么我们要将参数 fileextension传递到 fontdefiniton或 fontfiledefinition对象时,当我们始终传递参数 fonttype时,它似乎与 fileextension重合其值?
问题是 fonttype并不总是与 fileextension的值一致。 fonttype定义了常见的字体格式,但没有定义特定文件的字体格式。一种格式的某些字体可以具有不同的文件格式。
例如,值 FontType.TTF 定义了 TrueType
格式。但同时,TrueType
包含几种字体格式,其中包含以 ttf
、eot
、ttc
等为扩展名的字体文件。例如,对于 EOT
格式的字体,如果我们只将 FontType.TTF 值传递给 FontDefiniton,那么该对象如何理解该字体属于 EOT
格式而不是 TTF
格式?
以同样的方式,fonttype.type1的值是该格式字体的常见定义。同时,type1
格式字体文件具有扩展名.pfa
,.pfb
,.afm
,.pfm
。因此,您不能仅适当地定义字体文件格式,仅依赖于fontype.type1值。因此,要正确定义字体格式,我们需要用 fileextension参数的值指定参数 fonttype。
在下面,您可以学习 fontdefiniton对象初始化的示例,并在不同情况下加载字体。
在所有情况下,最终的字体加载结果都放入 com.aspose.font.font.font类型的变量中。这种类型是 com.aspose.font的基本字体类,此类型的对象为使用字体提供了共同的基础功能。
将字体加载到此对象中,您将能够使用此字体呈现文本,获取编码信息,字体指标等。
如何加载字体的示例
举一个例子,从文件montserrat-regular.ttf中加载字体montserrat
。
使用下一个语句:
1 com.aspose.font;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.nio.file.Files;
6 import java.nio.file.Paths;
7
8 import com.aspose.font.ByteContentStreamSource;
9 import com.aspose.font.FileSystemStreamSource;
10 import com.aspose.font.Font;
11 import com.aspose.font.FontDefinition;
12 import com.aspose.font.FontFileDefinition;
13 import com.aspose.font.FontType;
您可以使用 fontdefiniton和 fontfiledefinition对象加载此字体:
在Java.io.file对象的帮助下加载
要实现加载,请执行下一个:
- 构建文件的路径。
- 启动 fontdefiniton对象将
ttf
作为 fonttype值。 - 获取自动计算的值 fileextension。
- 加载字体。
1 //构造文件的路径
2 字符串fontpath = paths.get(getDatadir(),“ montserrat-regular.ttf”)。toString();
3
4 // Initialize FontDefinition object passing TTF as FontType value and using FontFileDefinition
5 FontFileDefinition fileDef = new FontFileDefinition(new File(fontPath));
6
7 // Based on FileInfo object, fileExtension value is calculated automatically from FileInfo fields.
8 FontDefinition fontDef = new FontDefinition(FontType.TTF, fileDef);
9
10 // Load the font
11 Font font = Font.open(fontDef);
借助filesystemstreamsource类型对象加载
采取下一步完成操作:
- 构建文件的路径。
- 启动 fontdefiniton对象。
- 设置 fileextension to
ttf
。 - 加载字体。
1 //构造文件的路径
2 字符串fontpath = paths.get(getDatadir(),“ montserrat-regular.ttf”)。toString();
3
4 // Initialize FontDefinition object passing TTF as FontType value and using FontFileDefinition
5 FontFileDefinition fileDef = new FontFileDefinition("ttf", new FileSystemStreamSource(fontPath));
6
7 // Based on FileSystemStreamSource object, set fileExtension to "ttf"
8 FontDefinition fontDef = new FontDefinition(FontType.TTF, fileDef);
9
10 // Load the font
11 Font font = Font.open(fontDef);
字体加载无FontfiledEfinition对象,将FifeSystreamSource直接传递给FontDefinition
必须采取下一个操作以使字体加载:
- 构建文件的路径。
- 启动 fontdefiniton对象传递
ttf
作为 fonttype value,ttf
as fileextension value * value和 filesystemstreamsource object。参数 fileextension这不是参数 fonttype的重复值。 - 加载字体。
1 //构造文件的路径
2 字符串fontpath = paths.get(getDatadir(),“ montserrat-regular.ttf”)。toString();
3
4 // Initialize FontDefinition object passing TTF as FontType value, "ttf" as fileExtension value,
5 // and FileSystemStreamSource object. Parameter 'fileExtension' here is not duplicate value
6 // for parameter 'FontType' and it's needed for correct font format detection
7 FontDefinition fontDef = new FontDefinition(FontType.TTF, "ttf", new FileSystemStreamSource(fontPath));
8
9 // Load the font
10 Font font = Font.open(fontDef);
字体加载字节[]类型变量以及使用ByteContentsTreamSource类型对象
要从字节数组加载字体,您需要:
- 构建文件的路径。
- 将字体二进制数据加载到字节数组中3.初始化 fontdefiniton对象传递
ttf
为 fonttype value,ttf
as fileextension value value value and bytecontentstreamsource基于fontbytes array的对象。 - 加载字体。
1 //构造文件的路径
2 字符串fontpath = paths.get(getDatadir(),“ montserrat-regular.ttf”)。toString();
3
4 // Load font binary data into byte array
5 byte[] fontBytes = Files.readAllBytes(Paths.get(fontPath));
6
7 // Initialize FontDefinition object passing TTF as FontType value, "ttf" as fileExtension value,
8 // and ByteContentStreamSource object based on fontBytes array
9 FontDefinition fontDef = new FontDefinition(FontType.TTF, "ttf", new ByteContentStreamSource(fontBytes));
10
11 // Load the font
12 Font font = Font.open(fontDef);
要获取更多使用 Aspose.Font 的示例,请转到 Aspose.Font 文档 中的 java-examples 中的 Aspose.Font.Examples.sln 解决方案
如果您剩下任何问题或问题,则可以将它们发布在 ASPOSE.FONT.PRODUCT.REMPLE 免费支持论坛的部分中,我们的支持团队将为您清除所有内容。