使用“名称”表| .NET

trueType字体表’name’是与该字体相关的文本字符串的存储。这些字符串可以用不同的语言编写,可以代表各种实体,例如字体名称,姓名,设计师名称,许可证信息,版权通知等。 简而言之,表“名称”中保存的线描述了字体元数据。

“名称”表格。

可访问“名称”表的详细规范 MicrosoftApple文档。

有2种为“名称”表的格式,具有数字0和1的格式。在“名称”表中,这些格式数字被称为版本,因此格式0被指定为 版本0,而格式1-为 版本1

格式1在语言标识中与格式0不同。 “名称”表中的任何条目都有一个语言标识符,用于检测该字符串的语言。格式0和格式1之间的差异在于如何解释这些语言标识符。

格式0的语言标识符具有特定于平台的解释,但是格式1的语言标识符与语言标签字符串相关联,语言标签字符串识别语言,无论平台如何。

为了更准确,格式1允许保持两种类型的语言标识符 - 具有特定于平台的解释的标识符以及与语言标签字符串相关的标识符(即独立于平台)。

aspose.font库支持“名称”表的格式0。为将来的版本计划对格式1的支持。

独立于“名称”表的格式,此表中的任何条目基于特定组件 - 结构 namerecord

该结构的四个主要参数是:

参数platformIdplatformSpecificid和’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个部分:

  1. 逻辑字符串类别,
  2. 字符串语言,
  3. 字符串本身。

参数nameId与第一部分相关,parametersPlatformIDplatformspecificid和langagenhingId’‘与第二部分有关。

如何使用aspose.font使用“名称”表记录?

对“名称”表的支持由类 ttfnameTable提供。此外,我们考虑此对象的功能。 首先,让我们描述使用 ttfnamegable类功能所需的枚举。

如上所述,“参数platformspecificid的值和语言ID仅在platformId参数的上下文中很重要”。因此,当平台ID为0时,这定义了Unicode平台时,请使用 unicodeplatformspecificid枚举,当PlatformID为1(Macintosh平台)时,使用 *MacPlatFormSpecificid 枚举,并且PlatformID为3(Windows Platform)是3(Windows Platform),请使用 * msplatformspecificiEnmumeration。

枚举 mslanguageIdMacLanguageID与LagenchalID参数有关。 使用 mslanguageId枚举,当平台ID为3(Windows Platform)时,使用 MacLanguageId eNumeration当平台ID为1(Macintosh Platform)时。

现在让我们继续从“名称表中获取和刷新条目”的问题。

如何从“名称”表中获取记录?

让我们从方法 getAllnameRecords()开始。该方法如下,从其名称中返回所有条目,而无需排除“名称”表的排除。实际上,该方法通常不经常被调用,因为在大多数情况下,用户不需要所有条目,因此要获取所需的条目,必须对条目列表进行彻底过滤。

问题是,即使在一个逻辑类别中,例如,例如,该类别的字符串数据也可以是不同的语言。因此,每个语言都需要在此逻辑类别的“名称”表中单独的条目。就像Fontfamily类别的数据以英语,法语和德语存在,Fontfamily类别将包含3个条目。

此外,语言条目本身可以分为几个条目,这些条目重合字符串数据值和languageID值,但因platformIDplatformSpecificID参数的值而差异。

为了简化“名称”表aspose.font库中的数据采样。

MultanguageString类还提供下一个方法:

  1. 该记录用英语编写,因此具有mslanguageId.english_united_states或mslanguageId.english_united_kingdom的值。
  2. 该记录的platformID具有等于 fontenvironment.current.currentplatformid的值(在当前实现中3,宣布Microsoft Platform)。

如何在“名称”表中添加/更新记录?

ttfnameTable提供了一种方法 ADDNAME以在“名称”表中添加或更新记录。

此方法创建了 namerecord类型的结构,并将其插入“名称”表中。如果记录与parametersplatformIdplatformSpecificidlanguageIDnameID相吻合,则该方法不会添加新记录,但是使用parameternamename’n name’n name’Snew falue froun new value中更新了现有记录中的字符串数据。

参数nameId定义了记录的逻辑字符串类别。参数platformIdplatformSpecificid和’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

Have any questions about Aspose.Font?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.