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” Aspone.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.Text;
3    using System.Collections.Generic;
4    using Aspose.Font.Ttf;
5    using Aspose.Font.TtfTables;

Dichiarare e inizializzare una variabile di carattere.

1    TtfFont font;

I prossimi 2 frammenti stampano il valore per la categoria Nome completo del font e producono lo stesso risultato per il font Lora-Regular

1    // 1
2    String fullFontName = font.ttftables.Nametable.getNameById (ttfnetable.nameid.fullname);
3    Console.WriteLine (String.Format ("Nome del carattere completo: {0}", fullfontName));
4    // 2
5    String fullFontName = font.ttftables.Nametable.getMultUnganingAgenameById (ttfnetable.nameid.fullname) .getEnglishString ();
6    Console.WriteLine (String.Format ("Nome del carattere completo: {0}", fullfontName));

Stampa l’intero contenuto della tabella “Nome”.

Lo snippet seguente mostra come realizzare questa operazione.

 1    Ttfnetable.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    }		

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

Per aggiungere o aggiornare la voce nella tabella ‘Nome’ correttamente, dobbiamo passare i valori di PlatformID, PlatformSpecificid e Linguaid ID che coincidono con quelli che sono già presenti nella tabella ‘Name’. Per questo, prima di rinfrescare i dati leggeremo i record esistenti del tipo Namerecord rilevante per la categoria logica rinfrescante, definita dall’identificatore di nome.

 1    // Struttura per le operazioni di aggiornamento
 2    struct updateData
 3    {
 4        privato ttfnametable.nameid _nameid;
 5        stringa privata _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    } 	

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

Have any questions about Aspose.Font?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.