「名前」テーブルで作業します | .NET
TrueTypeフォントテーブル「名前」は、そのフォントに関連するテキスト文字列のストレージです。これらの文字列は、さまざまな言語で記述でき、フォント名、姓、デザイナー名、ライセンス情報、著作権通知など、さまざまなエンティティを表すことができます。 要するに、テーブル「名前」に保持されている行は、フォントメタデータを説明しています。
「名前」テーブルのスキーマ。
それに応じて番号0と1の「名前」テーブルには2つの形式があります。 「名前」テーブルに関しては、これらの形式番号はバージョンとして名前が付けられているため、形式0は バージョン0、形式1- バージョン1として指定されます。
形式1は、言語識別のフォーマット0とは異なります。 「名前」テーブルのエントリには、その文字列の言語を検出するために使用される言語識別子があります。フォーマット0とフォーマット1の違いは、これらの言語識別子の解釈方法です。
フォーマット0の言語識別子にはプラットフォーム固有の解釈がありますが、形式1の言語識別子は言語タグ文字列に関連付けられており、プラットフォームに関係なく言語を識別します。
より正確にするために、フォーマット1を使用すると、両方のタイプの言語識別子を維持できます - プラットフォーム固有の解釈を持つ識別子と、言語タグ文字列に関連する識別子(つまり、プラットフォームから独立しています)。
Aspose.Font Libraryは、「名前」テーブルのフォーマット0をサポートしています。フォーマット1のサポートは、将来のリリースのために計画されています。
「名前」テーブルが持っている形式とは独立して、このテーブルのすべてのエントリは特定のコンポーネント構造 namerecordに基づいています。
この構造の4つの主なパラメーターは次のとおりです。
- プラットフォーム識別子(PlatformID)、
- プラットフォーム固有の識別子(Platformspecificid)、
- 名前識別子(nameID)、
- および言語識別子(LanguageID)。
パラメーターPlatformId
、Platformspecifid
、およびLanguageID
は、文字列の言語をプラットフォーム固有の方法で設定するために使用されます。 PlatformIDパラメーターのコンテキストでのみ、パラメーターの値Platformspecificid
とLanguageID
は重要です。
たとえば、Platformspecificid
equal 0はMACプラットフォームのローマスクリプトを定義し、同時にPlatformspecificid
はWindowsプラットフォームのローマスクリプトを定義します。
同様に、LanguageID
の値は、使用されているPlatformIDパラメーターのコンテキストでのみ重要です。
たとえば、LanguageID
英語USAを定義するPlatformID
= 1(MAC)の場合は0、PlatformId
= 3(Windows)が0x0409に等しい。
除外は、プラットフォームに関係なく言語を識別する言語タグ文字列に関連付けられている名前テーブル形式1のLanguageID
です。
パラメーターnameId
は数字であり、フォント名、姓などの論理文字列カテゴリを識別します。名前識別子には
事前定義されたセットがあります。これは、すべてのプラットフォームと言語で同じです。
したがって、条件付きでテーブル「名前」の各エントリは、3つの部分に分けることができます。
- 論理文字列カテゴリ、
- 文字列言語、
- 文字列自体。
パラメーターnameId
は、最初の部分に関連しています。パラメーターPlatformId
、Platformspecifid
、およびLanguageID
は2番目の部分に関連しています。
Aspose.Fontを使用して「名前」テーブルレコードを使用する方法は?
「名前」テーブルのサポートは、クラス ttfnametableによって提供されます。さらに、このオブジェクトの機能を検討します。 まず、 ttfnametableクラスの機能を使用して作業するために必要な列挙について説明しましょう。
- 列挙 nameIdおよび platformIdは、上記のnameIdおよびplatformIDとして説明されたこのようなパラメーターに関連しています。
- 列挙 unicodeplatformspecid、 macplatformspecid、 msplatformspeficidは、パラメータープラットフォームSpecifidに関連しています。
上記のように、PlatformID
パラメーターのコンテキストでのみ、パラメータープラットフォーム固有のパラメーターの値とLanguageIDは重要です。」したがって、PlatformIDが0であり、これがUnicodeプラットフォームを定義する場合、 UnicodePlatformspecid列挙を使用します。PlatformIDが1(Macintoshプラットフォーム)の場合、 MacPlatformspecid列挙 *(Windows Platform)が3(Windows Platform)の場合、 msplatformspecid eNumerationを使用します。
列挙 mslanguageidおよび maclanguageidは、LanguageIDパラメーターに関連しています。 PlatformIDが3(Windows Platform)の場合、 MSLANGUAGEID列挙を使用し、PlatformIDが1(Macintoshプラットフォーム)の場合は MacLanguageID列挙を使用します。
次に、「名前テーブルから入手してリフレッシュする問題を進めましょう。
「名前」テーブルからレコードを取得する方法は?
メソッド getallnamerecords()から始めましょう。この方法は、その名前から次のように、「名前」テーブルの除外なしにすべてのエントリを返します。実際には、ほとんどの場合、ユーザーはすべてのエントリを必要としないため、ユーザーが呼び出されることはあまりないことが多いため、必要なエントリを取得するには、エントリのリストを徹底的にフィルタリングする必要があります。
問題は、たとえば、1つのロジックカテゴリであっても、このカテゴリの文字列データが異なる言語である可能性があることです。したがって、各言語には、このロジックカテゴリの「名前」テーブルに別のエントリが必要です。 Fontfamilyカテゴリのデータが英語、フランス語、ドイツ語に存在する場合のように、Fontfamilyカテゴリには3つのエントリが含まれます。
さらに、言語エントリは、文字列データ値とLanguageID
値に一致するいくつかのエントリに分割することができますが、PlatformId
とPlatformspecifid
パラメーターの値によって異なります。
「名前」テーブルからのデータサンプリングを簡素化するには、次の方法を提供します。
- getnamerecordsbynameid() -
nameId
パラメーターで定義されたユーザーロジックカテゴリのセットのエントリのリストを返します。 - getMultInanguageNameById() - すべてのエントリを返します。これは、 multiLanguageStringタイプのオブジェクトとして、渡されたロジックカテゴリnameIDに関連しています。 - MultiLanguageStringタイプのオブジェクトにより、このカテゴリのすべての言語を見つけて、設定言語の文字列データを取得できます。 getalllanguageids()multilanguageStringタイプのメソッドを呼び出すことにより、すべての言語のリストを取得できます。言語のリストを受信した後、各LanguageIDの getStringforlanguageId()メソッドを呼び出すことができます。このメソッドは、この言語で記述されたデータ文字列を返します。
- MultilanguageString*クラスは次の方法も提供します。
- containsstring(string str) - オブジェクトのすべての言語文字列内に通過した文字列が存在するかどうかを確認します。
- getEnglishString() - 見つかった場合は英語で書かれた文字列を返します。最初の文字列、その言語はmslanguageid.english_united_states、mslanguageid.english_australia、mslanguageid.englignageid.english_united_kinit_kingdom、mslanguageid.english_canada、またはmslanguageid.english_new_zealandです。関連する言語識別子に文字列がない場合、メソッドはリストの最初の文字列を返します。
- getAllStrings() - オブジェクトに含まれるすべての言語のすべての文字列を返します。
- クラスttfnametableの最も単純な方法は getnameByid()です。これは、英語のセットカテゴリの値を取得する必要がある場合に設計されています。この方法は、2つの基準に対応するレコードを探します。
- このレコードは英語で書かれているため、valunedlanguageid.english_united_statesまたはmslanguageid.english_united_kingdomの値があります。
- このレコードには、 fontenvironment.current.currentplatformid(Microsoftプラットフォームを宣言する現在の実装では3)に等しい値を持つPlatformIDがあります。
「名前」テーブルにレコードを追加/更新する方法は?
classTTFNAMETABLEは、 addNameを提供して、「名前」テーブルにレコードを追加または更新します。
このメソッドは、
namerecordの型の構造を作成し、「名前」テーブルに挿入します。レコードがパラメーターPlatformId
、Platformspecifid
、LanguageID
、およびnameId
によって追加されたものと一致する場合、メソッドは新しいレコードを追加しませんが、パラメーター「名前」で定義された値を使用して既存のレコードの文字列データを更新します。
パラメーター nameId
レコードの論理文字列カテゴリを定義します。パラメーターPlatformId
、Platformspecifid
、およびLanguageID
は、文字列の言語を設定するために使用されます。最後のパラメーター「名前」は、レコードの文字列データを設定するために使用されます。
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-レギュラーと同じ結果を生成します
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 }
カテゴリ「フォントサブファミリー名」と「説明」の値を更新する
テーブル「名前」のエントリを正しく追加または更新するには、「名前」テーブルに既に存在するものと一致するプラットフォーム、プラットフォーム固有、および言語IDパラメーターの値を渡す必要があります。このため、データを更新する前に、名前識別子で定義された更新ロジックカテゴリに関連するNameRecordタイプの既存のレコードを読み取ります。
1 //更新操作用のstruct
2 struct updatedata
3 {
4 private ttfnametable.nameid _nameid;
5 プライベートストリング_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 }
テスト solution metadataexamples.csで見つけることができる「名前」テーブルを更新する他の例。