Arbeiten mit der Tabelle „Name“ | .NET
Die TrueType-Schriftarttabelle „Name“ ist der Speicher für Textzeichenfolgen, die sich auf diese Schriftart beziehen. Diese Zeichenfolgen können in verschiedenen Sprachen geschrieben sein und verschiedene Entitäten darstellen, z. B. Schriftartnamen, Familiennamen, Designernamen, Lizenzinformationen, Urheberrechtshinweise usw. Kurz gesagt beschreiben die Zeilen, die in der Tabelle „Name“ enthalten sind, Schriftartmetadaten.
Schema der Tabelle „Name“.
Die detaillierte Spezifikation für die Tabelle „Name“ ist in den Dokumentationen von Microsoft und Apple verfügbar.
Es gibt zwei Formate für eine Namenstabelle mit den entsprechenden Zahlen 0 und 1. In Bezug auf die Tabelle „Name“ werden diese Formatnummern als Version bezeichnet, sodass Format 0 als Version 0 und Format 1 als Version 1 bezeichnet wird.
Format 1 unterscheidet sich von Format 0 in der Sprachidentifikation. Jeder Eintrag in der Tabelle „Name“ verfügt über eine Sprachkennung, die zur Erkennung der Sprache dieser Zeichenfolge verwendet wird. Und der Unterschied zwischen Format 0 und Format 1 besteht darin, wie diese Sprachkennungen interpretiert werden.
Sprachbezeichner für Format 0 haben eine plattformspezifische Interpretation, Sprachbezeichner für Format 1 sind jedoch mit Sprach-Tag-Zeichenfolgen verknüpft, die Sprachen unabhängig von der Plattform identifizieren.
Für mehr Genauigkeit ermöglicht Format 1 die Beibehaltung von Sprachbezeichnern beider Typen – Bezeichner mit plattformspezifischer Interpretation und Bezeichner, die mit Sprach-Tag-Strings verknüpft sind (d. h. unabhängig von einer Plattform).
Die Aspose.Font-Bibliothek unterstützt Format 0 der Tabelle „Name“. Die Unterstützung von Format 1 ist für zukünftige Versionen geplant.
Unabhängig vom Format der Tabelle „Name“ basiert jeder Eintrag in dieser Tabelle auf einer bestimmten Komponente – der Struktur NameRecord.
Die vier Hauptparameter dieser Struktur sind:
- Plattformkennung (Plattform-ID),
- plattformspezifische Kennung (platformSpecificID),
- Namenskennung (nameid),
- und Sprachkennung (Spracheid).
Die Parameter „PlatformID“, „PlatformSpecificID“ und „LanguageID“ werden verwendet, um die Sprache der Zeichenfolge plattformspezifisch festzulegen. Die Werte der Parameter „platformSpecificID“ und „LanguageID“ sind nur im Kontext des Parameters „platformID“ von Bedeutung.
Beispielsweise definiert „platformSpecificID“ gleich 0 die lateinische Schrift für die Mac-Plattform und gleichzeitig definiert „platformSpecificID“ die römische Schrift für die Windows-Plattform.
In ähnlicher Weise ist der Wert von „LanguageID“ nur im Kontext des verwendeten PlatformID-Parameters von Bedeutung.
Beispielsweise entspricht „SpracheID“, die Englisch USA definiert, 0 für Plattform-ID = 1 (Mac) und 0x0409 für „Plattform-ID“ = 3 (Windows).
Bei den Ausschlüssen handelt es sich lediglich um „LanguageID“ für das Namenstabellenformat 1, verknüpft mit einer Sprach-Tag-Zeichenfolge, die Sprachen unabhängig von der Plattform identifiziert.
Der Parameter „nameID“ ist eine Zahl, die eine logische Zeichenfolgenkategorie identifiziert, z. B. Schriftartennamen, Familiennamen und andere. Es gibt einen vordefinierten Satz von Namensbezeichnern, der für alle Plattformen und Sprachen gleich ist.
Somit kann jeder Eintrag der Tabelle „Name“ bedingt in 3 Teile unterteilt werden:
- logische String-Kategorie,
- String-Sprache,
- die Zeichenfolge selbst.
Der Parameter „nameID“ bezieht sich auf den ersten Teil, die Parameter „platformID“, „platformSpecificID“ und „LanguageID“ beziehen sich auf den zweiten Teil.
Wie arbeite ich mit „Name“-Tabellendatensätzen mit Aspose.Font?
Unterstützung für die Tabelle „name“ wird von der Klasse TtfNameTable bereitgestellt. Darüber hinaus betrachten wir die Funktionalität dieses Objekts.
Beschreiben wir zunächst die Aufzählungen, die für die Arbeit mit der Funktionalität der Klasse TtfNameTable erforderlich sind.
- Die Aufzählungen NameID und PlatformId beziehen sich auf die oben beschriebenen Parameter nameID und platformID.
- Die Aufzählungen UnicodePlatformSpecificId, MacPlatformSpecificId, MSPlatformSpecificId beziehen sich auf den Parameter platformSpecificID.
Wie oben erwähnt: „Werte der Parameter platformSpecificID und languageID sind nur im Kontext des platformID-Parameters von Bedeutung.“ Wenn die Plattform-ID also 0 ist und dies die Unicode-Plattform definiert, verwenden Sie die Aufzählung UnicodePlatformSpecificId, wenn die Plattform-ID 1 ist (Macintosh-Plattform), verwenden Sie die Aufzählung MacPlatformSpecificId und wenn die Plattform-ID 3 ist (Windows-Plattform), verwenden Sie die Aufzählung MSPlatformSpecificId .
Die Aufzählungen MSLanguageId und MacLanguageId beziehen sich auf den Parameter languageID.
Verwenden Sie die MSLanguageId-Enumeration, wenn die Plattform-ID 3 ist (Windows-Plattform), und verwenden Sie die MacLanguageId-Enumeration, wenn die Plattform-ID 1 ist (Macintosh-Plattform).
Fahren wir nun damit fort, Einträge aus der Namenstabelle abzurufen und zu aktualisieren.
Wie erhalte ich Datensätze aus der Tabelle „Name“?
Beginnen wir mit der Methode GetAllNameRecords(). Diese Methode gibt, wie aus ihrem Namen hervorgeht, alle Einträge ohne Ausschlüsse der Tabelle „Name“ zurück. In der Praxis wird die Methode nicht oft aufgerufen, da Benutzer in den meisten Fällen nicht alle Einträge benötigen und daher die Liste der Einträge gründlich gefiltert werden muss, um den benötigten Eintrag zu erhalten.
Tatsache ist, dass selbst in einer Logikkategorie, beispielsweise FontFamily, die Zeichenfolgendaten dieser Kategorie in verschiedenen Sprachen vorliegen können. Daher benötigt jede Sprache einen separaten Eintrag in der Tabelle „Name“ für diese Logikkategorie. Wenn die Daten für die Kategorie „FontFamily“ beispielsweise in Englisch, Französisch und Deutsch vorhanden wären, würde die Kategorie „FontFamily“ drei Einträge enthalten.
Darüber hinaus kann der Spracheintrag selbst in einige Einträge unterteilt werden, die in den String-Datenwerten und dem „LanguageID“-Wert übereinstimmen, sich jedoch in den Werten der Parameter „PlatformID“ und „PlatformSpecificID“ unterscheiden.
Um die Datenerfassung aus der Tabelle „Name“ zu vereinfachen, bietet die Aspose.Font-Bibliothek die folgenden Methoden an:
- GetNameRecordsByNameId() – gibt die Liste der Einträge für die vom Benutzer festgelegte Logikkategorie zurück, die durch den Parameter „nameID“ definiert wird.
- GetMultiLanguageNameById() – gibt alle Einträge zurück, die für die übergebene Logikkategorie nameID relevant sind, als Objekt vom Typ MultiLanguageString. Mithilfe des Objekts vom Typ - MultiLanguageString können wir alle Sprachen dieser Kategorie herausfinden und die String-Daten für die eingestellte Sprache erhalten.
Sie können die Liste aller Sprachen abrufen, indem Sie die Methode GetAllLanguageIds() vom Typ MultiLanguageString aufrufen. Nachdem wir die Liste der Sprachen erhalten haben, können wir die Methode GetStringForLanguageId() für jede Sprach-ID aufrufen. Diese Methode gibt die in dieser Sprache geschriebene Datenzeichenfolge zurück.
Die Klasse MultiLanguageString bietet außerdem die folgenden Methoden:
- ContainsString (string str) – prüft, ob ein übergebener String in allen Sprachstrings des Objekts vorhanden ist.
- GetEnglishString() – gibt eine in Englisch geschriebene Zeichenfolge zurück, wenn sie gefunden wird. Es wird die erste Zeichenfolge zurückgegeben, deren Sprach-ID MSLanguageId.English_United_States, MSLanguageId.English_Australia, MSLanguageId.English_United_Kingdom, MSLanguageId.English_Canada oder MSLanguageId.English_New_Zealand ist. Wenn keine Zeichenfolgen mit der entsprechenden Sprachkennung vorhanden sind, gibt die Methode die erste Zeichenfolge der Liste zurück.
- GetAllStrings() – gibt alle Strings aller Sprachen zurück, die das Objekt enthält.
- Die am einfachsten zu verwendende Methode der Klasse TtfNameTable ist GetNameById(), die für Fälle entwickelt wurde, in denen Sie nur den Wert für die festgelegte Kategorie auf Englisch abrufen müssen. Diese Methode sucht nach einem Datensatz, der zwei Kriterien entspricht:
- Dieser Datensatz ist in Englisch verfasst und hat daher den Wert MSLanguageId.English_United_States oder MSLanguageId.English_United_Kingdom für den Parameter languageID.
- Dieser Datensatz hat eine Plattform-ID mit dem Wert FontEnvironment.Current.CurrentPlatformId (3 in der aktuellen Implementierung, die die Microsoft-Plattform deklariert).
Wie füge ich Datensätze in der Tabelle „Name“ hinzu bzw. aktualisiere sie?
Die Klasse TtfNameTable bietet eine Methode AddName zum Hinzufügen oder Aktualisieren von Datensätzen in der Tabelle „Name“.
Diese Methode erstellt die Struktur vom Typ NameRecord und fügt sie in die Tabelle „name“ ein. Wenn der Datensatz mit dem hinzugefügten übereinstimmt, indem die Parameter „platformID“, „platformSpecificID“, „LanguageID“ und „NameID“ bereits vorhanden sind, fügt die Methode keinen neuen Datensatz hinzu, sondern aktualisiert die Zeichenfolgendaten im vorhandenen Datensatz mithilfe des Werts , definiert durch den Parameter „name“.
Der Parameter „nameId“ definiert die logische Zeichenfolgenkategorie für einen Datensatz. Die Parameter „platformId“, „platformSpecificId“ und „LanguageId“ werden verwendet, um die Sprache der Zeichenfolge festzulegen. Und der letzte Parameter „name“ wird verwendet, um Zeichenfolgendaten für einen Datensatz festzulegen.
Beispiele für die Verwendung von Funktionen des TtfNameTable-Objekts.
Schließen Sie „using“ für folgende Namespaces ein:
1 using System;
2 using System.IO;
3 using System.Text;
4 using Aspose.Font;
5 using Aspose.Font.Sources;
6 using Aspose.Font.Ttf;
7 using Aspose.Font.TtfTables;Laden der in den Beispielen verwendeten Schriftart
Die folgenden Codeausschnitte setzen voraus, dass TTF/montserrat-bold.ttf aus DataDir in eine TtfFont-Variable namens font geladen wurde. Das Ladeverfahren ist unter
Laden, Extrahieren von Daten und Speichern aus TrueType-Schriftarten beschrieben.
Die nächsten beiden Codeausschnitte geben den Wert Vollständiger Schriftname aus. Für die Beispielschriftart liefern beide Montserrat Bold.
1// Read the full font name by name ID
2
3string fullFontName = font.TtfTables.NameTable.GetNameById(TtfNameTable.NameId.FullName);
4Console.WriteLine("Full font name: {0}", fullFontName);1// Read the English full font name from multilingual metadata
2
3string fullFontName = font.TtfTables.NameTable.GetMultiLanguageNameById(TtfNameTable.NameId.FullName).GetEnglishString();
4Console.WriteLine("Full font name: {0}", fullFontName);Datensätze für vordefinierte Namens-IDs ausgeben
Der folgende Codeausschnitt durchläuft die vordefinierten TtfNameTable.NameId-Werte und gibt für jede vorhandene Kategorie die verfügbaren Sprachzeichenfolgen aus.
1// Print name-table strings for predefined name IDs
2
3TtfNameTable.NameId[] ids = Enum.GetValues<TtfNameTable.NameId>();
4
5foreach (TtfNameTable.NameId nameId in ids)
6{
7 MultiLanguageString? mlString = font.TtfTables.NameTable.GetMultiLanguageNameById(nameId);
8 if (mlString == null)
9 continue;
10 Console.WriteLine(string.Format("{0}: {1}", nameId, GetMultiLanguageStringValue(mlString)));
11}
12// Format the available language values for each predefined name ID.
13string GetMultiLanguageStringValue(MultiLanguageString mlString)
14{
15 int[] languages = mlString.GetAllLanguageIds();
16 if (languages.Length == 1)
17 return mlString.GetEnglishString();
18
19 StringBuilder sb = new StringBuilder();
20
21 for (int i = 0; i < languages.Length; i++)
22 {
23 int langId = languages[i];
24 sb.Append(String.Format("{0}: {1}", (Enum.GetName<TtfNameTable.MSLanguageId>(
25 (TtfNameTable.MSLanguageId)langId) ?? langId.ToString()), mlString.GetStringForLanguageId(langId)));
26 if (i != (languages.Length - 1))
27 sb.Append(", ");
28 }
29
30 return sb.ToString();
31}Werte für die Kategorien „Name der Schriftart-Unterfamilie“ und „Beschreibung“ aktualisieren
Um einen Eintrag in der name-Tabelle hinzuzufügen oder zu aktualisieren, übergeben Sie Plattform-, plattformspezifische und Sprach-IDs, die mit den vorhandenen Datensätzen der Schriftart übereinstimmen. Das Beispiel aktualisiert den ersten passenden Datensatz Schriftunterfamilie. Da die Beispielschriftart keinen Datensatz Beschreibung enthält, wird einer mit den IDs des ersten verfügbaren Namensdatensatzes erstellt. Andere Plattform- und Sprachvarianten bleiben unverändert.
1// Update font subfamily and description records
2
3// Use tuples so the complete operation fits in one method without a helper type.
4(TtfNameTable.NameId NameId, string StringData)[] recordsToUpdate =
5{
6 (TtfNameTable.NameId.FontSubfamily, "Italic"),
7 (TtfNameTable.NameId.Description, "New description")
8};
9
10TtfNameTable.NameRecord? firstRecord = null;
11foreach (var updateData in recordsToUpdate)
12{
13 TtfNameTable.NameRecord[] records = font.TtfTables.NameTable.GetNameRecordsByNameId(updateData.NameId);
14 TtfNameTable.NameRecord record;
15 // Update only the first matching record, preserving its platform and language.
16 // If the category is absent, use the identifiers of an existing name record.
17 if (records.Length == 0)
18 {
19 firstRecord ??= GetFirstExistingRecord(font.TtfTables.NameTable);
20 record = firstRecord;
21 }
22 else
23 {
24 record = records[0];
25 }
26
27 font.TtfTables.NameTable.AddName(updateData.NameId, (TtfNameTable.PlatformId)record.PlatformId,
28 record.PlatformSpecificId, record.LanguageId, updateData.StringData);
29}
30
31TtfNameTable.NameRecord GetFirstExistingRecord(TtfNameTable table)
32{
33 foreach (TtfNameTable.NameId nameId in Enum.GetValues<TtfNameTable.NameId>())
34 {
35 TtfNameTable.NameRecord[] records = table.GetNameRecordsByNameId(nameId);
36 if (records.Length != 0)
37 return records[0];
38 }
39
40 TtfNameTable.NameRecord[] allRecords = table.GetAllNameRecords();
41 if (allRecords.Length == 0)
42 throw new InvalidOperationException("The name table has no record to supply platform and language identifiers.");
43 return allRecords[0];
44}Weitere Beispiele zum Aktualisieren der Tabelle „Name“ finden Sie im Test solution MetadataExamples.cs.