¿Cómo cargar fuentes? | Solución API para C++
Descripción general
Para responder a la pregunta de cómo cargar fuentes, primero debemos saber que cualquier fuente es físicamente una matriz de bytes en la que los datos se representan en algún formato. Por lo tanto, para cargar correctamente la fuente es necesario conocer dos parámetros clave:
- Formato de fuente. Las fuentes pueden tener diferentes formatos como “TrueType”, “Type1”, etc.
- Almacenamiento, donde se guardan los datos binarios que representan la fuente. Cada fuente se representa como datos binarios, pero la forma en que se almacenan estos datos puede diferir. En la mayoría de los casos, la fuente se almacena como un archivo en un disco duro. Pero a veces los datos binarios de fuentes se pueden colocar en un archivo diferente que no es una fuente en sí. Por ejemplo, archivos creados por Microsoft Word o Adobe Acrobat. Estos son archivos con extensiones
.docx
,.pdf
. Pueden incluir diferentes fuentes.
Objetos y parámetros necesarios para la carga de fuentes.
Aspose.Font para C++ proporciona el objeto FontDefiniton para notificar dos parámetros clave exigidos para la carga de fuentes.
Después de crear e iniciar el objeto FontDefiniton solo necesita llamar al método estático Aspose.Font.Font.Open() y pasar el objeto recién inicializado FontDefiniton como un parámetro para cargar la fuente deseada y obtener una referencia sobre ella.
Describámoslo con el pseudocódigo:
1using Aspose::Font;
2 ...
3
4 // Initialize object FontDefinition with appropriate properties
5 System::SharedPtr<FontDefinition> fontDef = System::MakeObject<FontDefinition>();
6 System::SharedPtr<Font> desiredFont = Aspose::Font::Font::Open(fd);
El resultado final de la carga de la fuente es obtener un objeto de tipo Aspose.Font.Font. La clase Aspose.Font.Font es una clase de fuente base de Aspose.Font para la biblioteca C++. Representa la funcionalidad principal de trabajar con fuentes.
Al cargar una fuente en un objeto de tipo Aspose.Font.Font, podrá representar texto con esta fuente, obtener datos de codificación y métricas de fuente. También podrás modificar o guardar esta fuente y muchas más.
Para iniciar el objeto FontDefiniton necesitamos proporcionar FontDefinition() 2 parámetros de fuente: el tipo de formato y el objeto que describe el almacenamiento de datos binarios de fuentes. El primer parámetro se notifica con la enumeración FontType.
Para simplificar el trabajo con el segundo parámetro, Aspose.Font ofrece una serie de objetos que brindan acceso universal a los datos binarios de la fuente independientemente de dónde se coloque la fuente.
Este acceso universal está vinculado a algo así como un flujo de bytes. Entonces, independientemente de dónde se coloque la fuente (en un archivo en un disco, dentro de otro archivo, en una matriz de bytes en la memoria), en cualquier caso, los objetos especiales Aspose.Font proporcionarán acceso al flujo de bytes. , relacionado con la fuente deseada.
Describamos estos objetos:
- clase StreamSource. Esta clase base abstracta define las propiedades y métodos que dan acceso al flujo de bytes de fuente.
El método GetFontStream() de esta clase devuelve una secuencia, relacionada con datos de fuentes binarias. La propiedad Offset apunta a la posición en este flujo, desde donde debemos comenzar a leer los datos.
- Dos de las clases más utilizadas heredadas de la base
StreamSource:
- FileSystemStreamSource - diseñado para proporcionar acceso a la secuencia, según el sistema de archivos. La propiedad FileName devuelve el nombre del archivo de fuente. El método GetFontStream() devuelve un flujo de bytes relacionado con este archivo.
- ByteContentStreamSource: proporciona acceso a la secuencia, según la matriz de bytes.
¿Cómo iniciar clases?
A continuación se muestran ejemplos de la iniciación de estas clases.1. Supongamos que la fuente está en el archivo llamado Lora.ttf. En este caso, para obtener acceso al flujo de bytes de esta fuente necesitamos crear el objeto de tipo FileSystemStreamSource usando este único constructor:
1 System::SharedPtr<FileSystemStreamSource> fontSource = System::MakeObject<FileSystemStreamSource>("Lora.ttf");
- Si los datos binarios de la fuente se encuentran en una matriz binaria definida por la variable byte [] fontArray, entonces un objeto de tipo ByteContentStreamSource proporcionará acceso al flujo de datos de la fuente, según la variable fontArray. . Para obtener acceso al flujo de bytes de fuente, tenemos que crear un objeto de tipo ByteContentStreamSource para obtener acceso al flujo, relacionado con la matriz de bytes de fuente usando un código como este:
1 System::SharedPtr<ByteContentStreamSource> fontSource = System::MakeObject<ByteContentStreamSource>(fontArray);
Por lo tanto, para proporcionar acceso a los datos binarios de fuentes, utilice objetos heredados de la clase base StreamSource. Además, llamaremos a dichos objetos fuentes de flujo de fuentes.
Objeto FontFileDefinition
La mayoría de las fuentes se encuentran en archivos normales, pero al mismo tiempo, algunas fuentes pueden tener diferentes fuentes de datos. Para unir en un solo objeto los términos archivo y flujo binario de fuente, la biblioteca Aspose.Font proporciona un objeto especial FontFileDefinition.
Este objeto tiene tales propiedades:
- FileName - nombre del archivo de fuente.
- FileExtension - extensión de un archivo de fuente.
- StreamSource - fuente de flujo de fuentes.
- Offset - desplazamiento dentro del flujo de bytes de la fuente.
El constructor más simple y uno de los más utilizados de este objeto es el constructor con la siguiente firma: FontFileDefinition (System::SharedPtr System::IO::FileInfo fontFile), use este constructor para casos cuando la fuente deseada está en un archivo en el disco duro.
A continuación se muestra un ejemplo de cómo iniciar un objeto de este tipo para la fuente Montserrat
que se encuentra en el archivo C:\Windows\Fonts\Montserrat.ttf:
1 System::SharedPtr<FontFileDefinition> fileDef = System::MakeObject<FontFileDefinition>(System::MakeObject<System::IO::FileInfo>(u"C:\\Windows\\Fonts\\Montserrat.ttf"));
Además,
FontFileDefinition puede hacer referencia a la fuente Montserrat
usando los siguientes constructores:
1 System::SharedPtr<FontFileDefinition> fileDef = System::MakeObject<FontFileDefinition>(System::MakeObject<FileSystemStreamSource>(u"C:\\Windows\\Fonts\\Montserrat.ttf"));
2
3 System::SharedPtr<FontFileDefinition> fileDef = System::MakeObject<FontFileDefinition>(u"ttf", System::MakeObject<FileSystemStreamSource>(u"C:\\Windows\\Fonts\\Montserrat.ttf"));
El parámetro fileExtension debe coincidir con la extensión estándar para el formato de fuente. Por ejemplo, si el formato de fuente es “TrueType”, entonces el valor del parámetro fileExtension puede ser “ttf” o “ttc” (si el archivo de fuente es una colección de fuentes “TrueType”). Si el formato de fuente es “Tipo abierto integrado”, entonces el valor del parámetro fileExtension debe ser “eot”.
La siguiente tabla muestra los formatos de archivos de fuentes más utilizados en Aspose.Font para C++. Ahí están con los valores coincidentes que debe tomar el parámetro fileExtension.
Formato de archivo de fuente | Extensión de archivo |
---|---|
TrueType , fuente única | ttf |
Colección de fuentes TrueType | ttc |
Web Open Font Format | woff |
Web Open Font Format versión 2.0 | woff2 |
Embedded OpenType | eot |
Fuente Adobe Type 1 | pfa , pfb , afm , pfm |
Compact Font Format | cff , puede ser nulo |
Si los datos de fuente no comienzan desde la posición 0 del flujo de bytes, utilice el siguiente constructor con el parámetro offset:
1 FontFileDefinition(System::String fileExtension, System::SharedPtr<Aspose::Font::Sources::StreamSource> streamSource, int64_t offset).
¿Cómo iniciar el objeto FontDefinition?
Ahora, cuando tenga una idea de los objetos heredados de la clase StreamSource y que proporcionan acceso al flujo de bytes de fuente, y del objeto FontFileDefinition, le explicaremos le mostrará cómo iniciar el objeto FontDefiniton con estos objetos correctamente para diferentes situaciones.
El objeto FontDefiniton le proporciona muchos constructores sobrecargados. La característica común de todos los constructores existentes es el parámetro FontType. Describe el tipo de formato de fuente.
Como se mencionó anteriormente, aparte del valor FontType, el objeto FontDefiniton debe inicializarse con referencia a los datos binarios de la fuente.
En este caso se pueden utilizar los siguientes parámetros de los constructores FontDefiniton:
- nombredefuente;
- extensión de archivo;
- objeto del tipo StreamSource;
- objeto del tipo FontFileDefinition.
Quizás tengas una pregunta. ¿Por qué pasaríamos el parámetro fileExtension al objeto FontDefiniton o FontFileDefinition, cuando siempre pasamos el parámetro FontType? que parece coincidir por su valor con fileExtension? El problema es que FontType no siempre coincide con el valor de fileExtension. FontType define el formato de fuente común pero no el formato de fuente de un archivo específico. Algunas fuentes de un formato pueden tener diferentes formatos de archivo.
Por ejemplo, el valor FontType.TTF define el formato “TrueType”. Pero al mismo tiempo, TrueType
incluye algunos formatos de fuente y hay archivos de fuente con extensiones ttf
, eot
, ttc
, etc. Y si, por ejemplo, para la fuente del formato EOT
pasamos a
FontDefiniton solo el valor FontType.TTF, entonces ¿cómo entenderá este objeto que la fuente pertenece al formato EOT
y no al ¿TTF
?
Del mismo modo, el valor de FontType.Type1 es la definición común para fuentes de este formato. Al mismo tiempo, los archivos de fuentes en formato Type1
tienen extensiones .pfa
, .pfb
, .afm
, .pfm
. Por lo tanto, no puede definir correctamente el formato del archivo de fuente basándose únicamente en el valor FonType.Type1. Por lo tanto, para definir el formato de fuente correctamente necesitamos especificar el parámetro
FontType con el valor del parámetro
fileExtension.
A continuación puede conocer ejemplos de FontDefiniton inicialización de objetos y la siguiente carga de fuentes para diferentes casos.
En todos los casos, el resultado final de la carga de la fuente se coloca en la variable de tipo Aspose.Font.Font. Este tipo es la clase de fuente básica de la biblioteca Aspose.Font y los objetos de este tipo proporcionan una funcionalidad básica común para trabajar con fuentes.
Al cargar la fuente en este objeto, podrá representar texto con esta fuente, obtener información de codificación, métricas de fuente, etc.
Ejemplos de cómo cargar fuentes
Tomemos como ejemplo cargar la fuente Montserrat
desde el archivo C:\Windows\Fonts\Montserrat.ttf
Agregue los siguientes espacios de nombres al principio del archivo:
1using Aspose::Font;
2using Aspose::Font::Sources;
3using System::IO;
Puedes cargar esta fuente usando objetos FontDefiniton y FontFileDefinition de diferentes maneras:
Cargando con la ayuda del objeto System::IO::FileInfo
Para completar la carga haga lo siguiente:
- Construya la ruta al archivo.
- Inicie el objeto
FontDefiniton pasando
TTF
como valor FontType. - Obtenga el valor calculado automáticamente fileExtension.
- Cargue la fuente.
1 // Construct path to the file
2 System::String fontPath = u"C:\\Windows\\Fonts\\Montserrat.ttf";
3
4 // Initialize FontDefinition object passing TTF as FontType value and using FontFileDefinition
5 System::SharedPtr<FontFileDefinition> fileDef = System::MakeObject<FontFileDefinition>(System::MakeObject<System::IO::FileInfo>(fontPath));
6
7 // Based on FileInfo object, fileExtension value is calculated automatically from FileInfo fields.
8 System::SharedPtr<FontDefinition> fontDef = System::MakeObject<FontDefinition>(Aspose::Font::FontType::TTF, fileDef);
9
10 // Load font
11 System::SharedPtr<Font> font = Font::Open(fontDef);
Cargando con la ayuda del objeto de tipo FileSystemStreamSource
Realice los siguientes pasos para cumplir con la operación:
- Construya la ruta al archivo.
- Inicie el objeto FontDefiniton.
- Establezca
fileExtension en
ttf
. - Cargue la fuente.
1 // Construct path to the file
2 System::String fontPath = u"C:\\Windows\\Fonts\\Montserrat.ttf";
3
4 // Initialize FontDefinition object passing TTF as FontType value and using FontFileDefinition
5 System::SharedPtr<FontFileDefinition> fileDef = System::MakeObject<FontFileDefinition>(u"ttf", System::MakeObject<FileSystemStreamSource>(fontPath));
6
7 // Based on FileSystemStreamSource object, set fileExtension to "ttf"
8 System::SharedPtr<FontDefinition> fontDef = System::MakeObject<FontDefinition>(Aspose::Font::FontType::TTF, fileDef);
9
10 // Load font
11 System::SharedPtr<Font> font = Font::Open(fontDef);
Carga de fuentes sin objeto FontFileDefinition, pasando FileSystemStreamSource directamente a FontDefinition
Se deben realizar las siguientes acciones para cargar la fuente de esta manera:
- Construya la ruta al archivo.
- Inicie el objeto
FontDefiniton pasando
TTF
como valor FontType,ttf
como valor fileExtension y objeto FileSystemStreamSource . El parámetro fileExtension aquí no es un valor duplicado para el parámetro FontType. - Cargue la fuente.
1 // Construct path to the file
2 System::String fontPath = u"C:\\Windows\\Fonts\\Montserrat.ttf";
3
4 // Initialize FontDefinition object passing TTF as FontType value, "ttf" as fileExtension value,
5 // and FileSystemStreamSource object. Parameter 'fileExtension' here is not duplicate value
6 // for parameter 'FontType' and it's needed for correct font format detection
7 System::SharedPtr<FontDefinition> fontDef = System::MakeObject<FontDefinition>(Aspose::Font::FontType::TTF, u"ttf", System::MakeObject<FileSystemStreamSource>(fontPath));
8
9 // Load font
10 System::SharedPtr<Font> font = Font::Open(fontDef);
Carga de fuentes con la variable de tipo byte[] y con el uso del objeto de tipo ByteContentStreamSource
Para cargar una fuente desde la matriz de bytes, necesita:
- Construya la ruta al archivo.
- Cargue datos binarios de fuente en la matriz de bytes.
- Inicialice el objeto
FontDefiniton pasando
TTF
como valor FontType,ttf
como valor fileExtension y ByteContentStreamSource objeto basado en la matriz fontBytes. - Cargue la fuente.
1 // Construct path to the file
2 System::String fontPath = u"C:\\Windows\\Fonts\\Montserrat.ttf";
3
4 // Load font binary data into byte array
5 System::ArrayPtr<uint8_t> fontBytes;
6
7 // Initialize FontDefinition object passing TTF as FontType value, "ttf" as fileExtension value,
8 // and ByteContentStreamSource object based on fontBytes array
9 System::SharedPtr<FontDefinition> fontDef = System::MakeObject<FontDefinition>(Aspose::Font::FontType::TTF, u"ttf", System::MakeObject<ByteContentStreamSource>(fontBytes));
10
11 // Load font
12 System::SharedPtr<Font> font = Font::Open(fontDef);
Para obtener más ejemplos de uso de Aspose.Font, vaya a la solución Aspose.Font.Examples.CPP.sln, en los cpp-examples de la Documentación de Aspose.Font.
Si le quedan problemas o preguntas, puede publicarlas en la sección Aspose.Font.Product Family del Foro de soporte gratuito y dentro de unas horas nuestro equipo de soporte le responderá. aclarar todo para usted.