使用“名称”表| .NET
trueType字体表’name’是与该字体相关的文本字符串的存储。这些字符串可以用不同的语言编写,可以代表各种实体,例如字体名称,姓名,设计师名称,许可证信息,版权通知等。 简而言之,表“名称”中保存的线描述了字体元数据。
“名称”表格。
有2种为“名称”表的格式,具有数字0和1的格式。在“名称”表中,这些格式数字被称为版本,因此格式0被指定为 版本0,而格式1-为 版本1。
格式1在语言标识中与格式0不同。 “名称”表中的任何条目都有一个语言标识符,用于检测该字符串的语言。格式0和格式1之间的差异在于如何解释这些语言标识符。
格式0的语言标识符具有特定于平台的解释,但是格式1的语言标识符与语言标签字符串相关联,语言标签字符串识别语言,无论平台如何。
为了更准确,格式1允许保持两种类型的语言标识符 - 具有特定于平台的解释的标识符以及与语言标签字符串相关的标识符(即独立于平台)。
aspose.font库支持“名称”表的格式0。为将来的版本计划对格式1的支持。
独立于“名称”表的格式,此表中的任何条目基于特定组件 - 结构 namerecord。
该结构的四个主要参数是:
- 平台标识符(平台ID),
- 平台特异性标识符(平台应用程序),
- 名称标识符(名称),
- 和语言标识符(语言ID)。
参数platformId
,platformSpecificid
和’LanagingId’用于以特定于平台的方式设置字符串的语言。参数的值platformspecificid
和`andageningId’仅在platformID参数的上下文中很重要。
例如,platformSpecificid
等于0为Mac平台定义了罗马脚本,同时,platformSpecificid
定义了Windows平台的罗马脚本。
以类似的方式,“语言ID”的值仅在使用的PlatformID参数的上下文中很重要。
例如,LeganageniD“定义英语美国)等于platformID = 1(Mac)和0x0409的
platformId` = 3(Windows)的0x0409。
对于名称表格式1,与语言标签字符串关联的名称表1仅是languageID
,该语言不论平台如何标识语言。
参数nameId
是一个数字,它标识了逻辑字符串类别,例如字体名称,姓名等。有一个名称标识符的
*预定义集,所有平台和语言都是相同的。
因此,表“名称”的每个条目都可以分为3个部分:
- 逻辑字符串类别,
- 字符串语言,
- 字符串本身。
参数nameId
与第一部分相关,parametersPlatformID
,platformspecificid
和langagenhingId’‘与第二部分有关。
如何使用aspose.font使用“名称”表记录?
对“名称”表的支持由类 ttfnameTable提供。此外,我们考虑此对象的功能。 首先,让我们描述使用 ttfnamegable类功能所需的枚举。
- 枚举 nameId和 platformid与上述参数相关。
- 枚举 unicodeplatformspecificid, MacPlatformSpecificid, MSPLATFORMSPECIFICID与参数PlatformSpecificid有关。
如上所述,“参数platformspecificid的值和语言ID仅在platformId参数的上下文中很重要”。因此,当平台ID为0时,这定义了Unicode平台时,请使用 unicodeplatformspecificid枚举,当PlatformID为1(Macintosh平台)时,使用 *MacPlatFormSpecificid 枚举,并且PlatformID为3(Windows Platform)是3(Windows Platform),请使用 * msplatformspecificiEnmumeration。
枚举 mslanguageId和 MacLanguageID与LagenchalID参数有关。 使用 mslanguageId枚举,当平台ID为3(Windows Platform)时,使用 MacLanguageId eNumeration当平台ID为1(Macintosh Platform)时。
现在让我们继续从“名称表中获取和刷新条目”的问题。
如何从“名称”表中获取记录?
让我们从方法 getAllnameRecords()开始。该方法如下,从其名称中返回所有条目,而无需排除“名称”表的排除。实际上,该方法通常不经常被调用,因为在大多数情况下,用户不需要所有条目,因此要获取所需的条目,必须对条目列表进行彻底过滤。
问题是,即使在一个逻辑类别中,例如,例如,该类别的字符串数据也可以是不同的语言。因此,每个语言都需要在此逻辑类别的“名称”表中单独的条目。就像Fontfamily类别的数据以英语,法语和德语存在,Fontfamily类别将包含3个条目。
此外,语言条目本身可以分为几个条目,这些条目重合字符串数据值和languageID
值,但因platformID
和 platformSpecificID
参数的值而差异。
为了简化“名称”表aspose.font库中的数据采样。
- getNamereCordsByNameID() - 返回由用户逻辑类别集合的条目列表,该条目由
nameId
参数定义了。 - getmultilanguagenamebyid() - 返回所有条目,与传递的逻辑类别nameid相关,作为 MultiLanguageString类型的对象。通过 - * MultinanguageString 类型的对象,我们可以找出此类别的所有语言,并获取SET语言的字符串数据。 您可以通过调用MultinanguageString*类型的方法来获取所有语言的列表。收到语言列表后,我们可以调用每种语言ID的 getStringforlanguageId()方法。此方法返回使用此语言编写的数据字符串。
MultanguageString类还提供下一个方法:
- containsString(String str) - 检查对象的所有语言字符串中是否存在传递的字符串。
- getEnglishString() - 如果发现,则返回用英语写的字符串。它返回第一个字符串,其中的语言是mslanguageId.english_united_states,mslanguageid.english_australia,mslanguageid.england.english_united_kingdom,mslanguageid.english_canada或mslanguageId.englugageId.englanguageId.englishId.english_ens_new_zealand。如果没有相关语言标识符的字符串,则该方法将返回列表的第一个字符串。
- getallstrings() - 返回对象包含的所有语言的所有字符串。
- 使用类ttfnameTable的最简单方法是 getNameByid(),它是针对您仅需要以英语获得设定类别的值的情况而设计的。此方法寻找记录,该记录与2个标准相对应:
- 该记录用英语编写,因此具有mslanguageId.english_united_states或mslanguageId.english_united_kingdom的值。
- 该记录的platformID具有等于 fontenvironment.current.currentplatformid的值(在当前实现中3,宣布Microsoft Platform)。
如何在“名称”表中添加/更新记录?
类ttfnameTable提供了一种方法 ADDNAME以在“名称”表中添加或更新记录。
此方法创建了
namerecord类型的结构,并将其插入“名称”表中。如果记录与parametersplatformId
,platformSpecificid
,languageID
和 nameID
相吻合,则该方法不会添加新记录,但是使用parametername
name’n name’n name’Snew falue froun new value中更新了现有记录中的字符串数据。
参数nameId
定义了记录的逻辑字符串类别。参数platformId
,platformSpecificid
和’LanagingId’用于设置字符串的语言。最后一个参数“名称”用于为记录设置字符串数据。
使用 * ttfNameTable *对象的功能的示例。
包括用于以下名称空间:
1 using System;
2 using System.Text;
3 using System.Collections.Generic;
4 using Aspose.Font.Ttf;
5 using Aspose.Font.TtfTables;
声明和初始化字体变量。
1 TtfFont font;
下一个2个类别的片段打印值 *完整字体名称 *并为字体lora-regular产生相同的结果
1 //1
2 string fullFontName = font.TtfTables.NameTable.GetNameById(TtfNameTable.NameId.FullName);
3 Console.WriteLine(String.Format("Full font name: {0}", fullFontName ));
4 //2
5 string fullFontName = font.TtfTables.NameTable.GetMultiLanguageNameById(TtfNameTable.NameId.FullName).GetEnglishString();
6 Console.WriteLine(String.Format("Full font name: {0}", fullFontName));
打印“名称”表的全部内容。
下面的摘要显示了如何完成此操作。
1 ttfnametable.nameid [] ids = enum.getValues <ttfnametable.nameid>();
2
3 foreach (TtfNameTable.NameId nameId in ids)
4 {
5 MultiLanguageString mlString = font.TtfTables.NameTable.GetMultiLanguageNameById(nameId);
6 if (mlString == null)
7 continue;
8 Console.WriteLine(string.Format("{0}: {1}", nameId, GetMultiLanguageStringValue(mlString)));
9 }
10 //Using of this method has no sense when strings from 'name' table have only single language, but it can be useful when font
11 //'name' table include multilingual strings
12 string GetMultiLanguageStringValue(MultiLanguageString mlString)
13 {
14 int[] languages = mlString.GetAllLanguageIds();
15 if(languages.Length == 1)
16 return mlString.GetEnglishString();
17
18 StringBuilder sb = new StringBuilder();
19
20 for(int i = 0; i < languages.Length; i++)
21 {
22 int langId = languages[i];
23 sb.Append(String.Format("{0}: {1}", Enum.GetName<TtfNameTable.MSLanguageId>(
24 (TtfNameTable.MSLanguageId)langId), mlString.GetStringForLanguageId(langId)));
25 if (i != (languages.Length - 1))
26 sb.Append(", ");
27 }
28
29 return sb.ToString();
30 }
更新类别“字体亚家族名称”和“描述”的值
要正确添加或刷新表“名称”中的条目,我们需要传递platformID,platformspecificid和Laganagening ID参数的值,这些值与已经存在的“名称”表中的参数相吻合。为此,在刷新数据之前,我们将阅读与名称标识符定义的与刷新逻辑类别相关的名称类型的现有记录。
1 //Struct for update operations
2 struct UpdateData
3 {
4 private TtfNameTable.NameId _nameId;
5 private string _data;
6
7 public UpdateData(TtfNameTable.NameId nameId, string data)
8 {
9 this._nameId = nameId;
10 this._data = data;
11 }
12
13 public TtfNameTable.NameId NameId => this._nameId;
14 public string StringData => this._data;
15 }
16
17 UpdateData[] recordsToUpdate = new UpdateData[]
18 {
19 new UpdateData(TtfNameTable.NameId.FontSubfamily, "Italic"),
20 new UpdateData(TtfNameTable.NameId.Description, "New description")
21 };
22
23 TtfNameTable.NameRecord firstRecord = null;
24
25 foreach (UpdateData updateData in recordsToUpdate)
26 {
27 TtfNameTable.NameRecord[] records = font.TtfTables.NameTable.GetNameRecordsByNameId(updateData.NameId);
28
29 //Declare variable for NameRecord structure to use for update operations
30 TtfNameTable.NameRecord record = null;
31
32 //In this example we will use only info from the first NameRecord structure returned to update font metadata.
33 //Many actual fonts require serious analyze of all NameRecords returned to update metadata correctly
34
35 //Initialize just created variables
36 if (records.Length == 0)
37 {
38 //If no any record was found for current name identifer,
39 //we will use first found record for any name identifier
40 if (firstRecord == null)
41 {
42 firstRecord = GetFirstExistingRecord(font.TtfTables.NameTable);
43 }
44 record = firstRecord;
45 }
46 else
47 {
48 record = records[0];
49 }
50
51 //Add or update record in 'name' table
52 font.TtfTables.NameTable.AddName(updateData.NameId, (TtfNameTable.PlatformId)record PlatformId,
53 record.PlatformSpecificId, record.LanguageId, updateData.StringData);
54 }
55
56
57 TtfNameTable.NameRecord GetFirstExistingRecord(TtfNameTable table)
58 {
59 TtfNameTable.NameRecord[] records = null;
60 foreach (TtfNameTable.NameId nameId in Enum.GetValues<TtfNameTable.NameId>())
61 {
62 records = table.GetNameRecordsByNameId(nameId);
63 if (records.Length != 0)
64 return records[0];
65 }
66
67 return table.GetAllNameRecords()[0];
68 }
您可以在测试中找到“名称”表的其他示例 解决方案metadataexamples.cs。