Lavorare con la tabella "Nome" | .NET

La tabella dei caratteri TrueType ‘Nome’ è l’archiviazione per le stringhe di testo relative a quel carattere. Queste stringhe possono essere scritte in diverse lingue e possono rappresentare varie entità, come nomi di caratteri, nomi di familiari, nomi di design, informazioni sulla licenza, avvisi di copyright e così via. In breve, le righe che sono trattenute nella tabella “nome” descrivono i metadati del carattere.

Schema della tabella “Nome”.

La tabella dettagliata per la tabella “Nome” è accessibile in Microsoft e Apple Documentazioni.

Esistono 2 formati per una tabella “nome” con numeri 0 e 1 di conseguenza. In termini di tabella “Nome”, questi numeri di formato sono denominati come versione, quindi il formato 0 è designato come versione 0 e il formato 1 - come versione 1.

Il formato 1 differisce dal formato 0 nell’identificazione del linguaggio. Qualsiasi voce nella tabella “Nome” ha un identificatore di lingua, che viene utilizzato per rilevare il linguaggio di quella stringa. E la differenza tra il formato 0 e il formato 1 è nel modo in cui vengono interpretati questi identificatori di linguaggio.

Gli identificatori linguistici per il formato 0 hanno un’interpretazione specifica della piattaforma, ma gli identificatori linguistici per il formato 1 sono associati alle stringhe di tag linguistico, che identificano le lingue indipendentemente dalla piattaforma.

Per una maggiore precisione, il formato 1 consente di mantenere gli identificatori linguistici di entrambi i tipi: identificatori con interpretazione specifica della piattaforma e identificatori associati alle stringhe di tag linguistico (cioè indipendenti da una piattaforma).

Aspose.Font Library supporta il formato 0 della tabella “Nome”. Il supporto per il formato 1 è previsto per le versioni future.

Indipendentemente dal formato che ha la tabella “Nome”, qualsiasi voce in questa tabella si basa su un componente particolare: la struttura NameRecord.

I quattro parametri principali di questa struttura sono:

I parametri platformid, platformspecificid e linguaid vengono utilizzati per impostare il linguaggio della stringa in modo specifico della piattaforma. I valori dei parametri Platformspecificid e Linguaid importa solo nel contesto del parametro PlatformID.

Ad esempio, PlatformSpecificid uguali 0 definisce lo script romano per la piattaforma MAC e allo stesso tempo, PlatformSpecificid definisce lo script romano per la piattaforma Windows. Allo stesso modo il valore di “Linguaid” è importante solo nel contesto del parametro di PlatformID utilizzato.

Ad esempio Linguaid Definizione inglese USA è uguale a 0 per PlatformID = 1 (Mac) e 0x0409 per PlatformID = 3 (Windows).

Le esclusioni sono solo `linguaggio" per il formato della tabella di nome 1, associati a una stringa di tag lingua, che identifica le lingue indipendentemente dalla piattaforma.

Il parametro nameid è un numero, che identifica una categoria di stringa logica, come il nome del carattere, il nome della famiglia e altri. Esiste un set predefinito di identificatori di nome, che è lo stesso per tutte le piattaforme e le lingue.

Quindi, ogni voce della tabella “nome” può essere divisa in 3 parti:

  1. categoria stringa logica,
  2. linguaggio di stringa,
  3. la stringa stessa.

Il parametro nameid è correlato alla prima parte, i parametri platformid, platformspecificid e linguaid sono correlati alla seconda parte.

Come lavorare con i record di tabella “Nome” usando Aspose.Font?

Supporto per la tabella “Nome” è fornito da Class ttfnametable. Inoltre, consideriamo la funzionalità di questo oggetto. Innanzitutto, descriviamo le elencazioni necessarie per lavorare con la funzionalità della classe TtfNameTable.

Come accennato in precedenza, “I valori dei parametri platformSpecificID e languageID sono importanti solo nel contesto del parametro platformID”. Quindi, quando platformID è 0, e questo definisce la piattaforma Unicode, si usa l’enumerazione UnicodePlatformSpecificId, quando platformID è 1 (piattaforma Macintosh), si usa l’enumerazione MacPlatformSpecificId e quando platformID è 3 (piattaforma Windows), si usa l’enumerazione MSPlatformSpecificId.

Le enumerazioni mslanguageid e MacLanguageId sono correlate al parametro LanguageId. Utilizzare MSLanguageId enumeration, quando PlatformID è 3 (piattaforma Windows) e usa MSLanguageId enumeration quando PlatformID è 1 (piattaforma Macintosh).

Procediamo ora con la questione di ottenere e rinfrescare voci dalla tabella ‘Nome.

Come ottenere record dalla tabella “Nome”?

Cominciamo dal metodo getAllnamerecords (). Questo metodo, come segue dal suo nome, restituisce tutte le voci senza esclusioni della tabella “Nome”. In pratica il metodo non viene spesso chiamato come utenti nella maggior parte dei casi non hanno bisogno di tutte le voci, quindi per ottenere la voce necessaria, l’elenco delle voci deve essere accuratamente filtrato.

La questione è che anche in una categoria logica, la fontfamily, ad esempio, i dati di stringa di questa categoria possono essere in lingue diverse. Quindi ogni lingua ha bisogno di una voce separata nella tabella “Nome” per questa categoria logica. Come se i dati per la categoria di fontfamily esistessero in inglese, francese e tedesco, la categoria di fontfamily includerebbe 3 voci.

Inoltre, la voce del linguaggio può essere divisa in alcune voci che coincidono per valori di dati di stringa e valore “Linguaid”, ma differiscono per i valori dei parametri “PlatformID” e “Platformspecificid”.

Per semplificare il campionamento dei dati dalla tabella “Nome” Aspose.Font Library offre i metodi successivi:

  1. Questo record è scritto in inglese, quindi ha il valore mslanguageid.english_united_states o mslanguageid.english_united_kingdom per il parametro LanguageId.
  2. Questo record ha PlatformID con il valore pari a Fontenvironment.Current.CurrentPlatformid (3 nell’implementazione corrente, che dichiara la piattaforma Microsoft).

Come aggiungere/aggiornare i record nella tabella “Nome”?

Classettfnametablefornisce un metodo addName per aggiungere o aggiornare i record nella tabella “nome”.

Questo metodo crea la struttura del tipo namerecord e lo inserisce nella tabella “nome”. Se il record coincide con quello aggiunto per parametri PlatformId, Platformspecificid, Linguaid e nameId esiste già, il metodo non aggiunge un nuovo record, ma aggiorna i dati di stringa nel record esistente usando il valore, definito dal parametro nome.

Il parametro nameID definisce la categoria stringa logica per un record. I parametri platformid, platformspecificid e linguaid vengono utilizzati per impostare il linguaggio della stringa. E l’ultimo parametro nome viene utilizzato per impostare i dati di stringa per un record.

Esempi di utilizzo delle funzioni dell’oggetto TtfNameTable.

Includi l’utilizzo per i seguenti nomi spazi:

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;

Caricamento del font utilizzato negli esempi

I frammenti seguenti presuppongono che TTF/montserrat-bold.ttf sia stato caricato da DataDir in una variabile TtfFont denominata font. Per la procedura di caricamento, vedere Caricamento, estrazione dei dati e salvataggio dei font TrueType.

I due frammenti seguenti stampano il valore Nome completo del font. Entrambi restituiscono Montserrat Bold per il font di esempio.

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);

Stampa dei record per gli identificatori di nome predefiniti

Il frammento seguente enumera i valori predefiniti di TtfNameTable.NameId e stampa le stringhe disponibili nelle varie lingue per ogni categoria valorizzata.

 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}

Aggiornamento dei valori per le categorie “Nome della sottofamiglia dei caratteri” e “Descrizione”

Per aggiungere o aggiornare una voce nella tabella name, passare identificatori di piattaforma, specifici della piattaforma e della lingua che corrispondano ai record esistenti del font. L’esempio aggiorna il primo record Sottofamiglia del font corrispondente. Poiché il font di esempio non contiene un record Descrizione, ne crea uno usando gli identificatori del primo record di nome disponibile. Le altre varianti di piattaforma e lingua restano invariate.

 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}

Altri esempi per rinfrescare la tabella “Nome” che puoi trovare nel test Soluzione metadataexamples.cs.