Como carregar fontes? | Solução da API para C ++
Visão geral
Para responder à pergunta, como carregar fontes, primeiro precisamos aprender que qualquer fonte é fisicamente uma matriz de bytes nos quais os dados são representados em algum formato. Portanto, para o carregamento correto da fonte, você precisa conhecer dois parâmetros principais:
- Formato de fonte. As fontes podem ter formatos diferentes como
truetype
,type1
, etc. - Armazenamento, onde os dados binários que representam a fonte estão sendo mantidos. Cada fonte é representada como dados binários, mas a maneira como esses dados são armazenados pode ser diferente. Na maioria dos casos, a fonte está sendo armazenada como um arquivo em um disco rígido. Mas, às vezes, dados binários da fonte podem ser colocados em um arquivo diferente que não é uma fonte. Por exemplo, arquivos criados pelo Microsoft Word ou Adobe Acrobat. Estes são arquivos com extensões
.docx
,.pdf
. Eles podem incluir fontes diferentes.
Objetos e parâmetros necessários para o carregamento da fonte
Aspose.font for c ++ fornece objeto fontdefiniton para notificar dois parâmetros principais exigidos para carregamento de fontes.
Depois de criar e iniciar o objeto fontDefiniton, você só precisa chamar o método estático aspose.font.Font.open() e passar apenas o objeto inicializado fontdefiniton como um parâmetro para carregar a fonte desejada e obter uma referência.
Vamos descrevê -lo com o 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);
O resultado final do carregamento da fonte está obtendo um objeto de aspose.font.font tipo. Classe Aspose.font.font é uma classe de fonte base de aspose.font para a biblioteca C ++. Representa a principal funcionalidade de trabalhar com fontes.
Ficando carregado uma fonte em aspose.font.font Tipo Objeto Você poderá renderizar texto com esta fonte, obter dados de codificação e métricas de font. Você também poderá modificar ou salvar essa fonte e muito mais.
Para iniciar o objeto fontDefiniton, precisamos fornecer fontDefinition () 2 parâmetros da fonte, - o tipo de formato e o objeto que descreve o armazenamento para dados binários da fonte. O primeiro parâmetro é notificado com a enumeração FontType.
Para simplificar o trabalho com o segundo parâmetro, aspose.font oferece uma série de objetos que fornecem acesso universal aos dados binários da fonte independentemente de onde a fonte é colocada.h
Esse acesso universal está vinculado a algo como um fluxo de bytes. Portanto, independentemente de onde a fonte é colocada - em um arquivo em um disco, dentro de outro arquivo, matriz de bytes na memória - em qualquer caso, os objetos especiais aspose.font fornecerão um acesso ao fluxo de bytes, relacionado à fonte desejada.
Vamos descrever esses objetos:
Streamsource Classe. Esta classe base abstrata define as propriedades e métodos que dão acesso ao fluxo de bytes de fonte. GetFontStream() O método desta classe retorna um fluxo, relacionado aos dados da fonte binária. Propriedade Offset pontos na posição neste fluxo, de onde devemos começar a ler os dados.
Duas classes mais usadas herdadas da base streamsource:
- FileSystemStreamSource - Projetado para fornecer acesso ao fluxo, com base no sistema de arquivos. Propriedade nome do arquivo Retorna o nome do arquivo de fontes. GetFontStream() O método retorna um fluxo de bytes, relacionado a este arquivo.
- ByteContentStreamSource - fornece acesso ao fluxo, com base na matriz de bytes.
Como iniciar classes?
Aqui estão exemplos do início dessas classes. 1.Vamos supor que a fonte esteja no arquivo chamado lora.ttf. Nesse caso, para obter acesso ao fluxo de bytes desta fonte, precisamos criar o objeto do tipo filesystemStreamSource usando este único construtor:
1 System::SharedPtr<FileSystemStreamSource> fontSource = System::MakeObject<FileSystemStreamSource>("Lora.ttf");
- Se os dados binários da fonte estiverem localizados em uma matriz binária definida pela variável BYTE [] FONTARRAY, um objeto do tipo byteContentsTreamSource fornecerá um acesso ao fluxo de dados da fonte, com base na variável FontArray. Para obter acesso ao fluxo de bytes de fonte, precisamos criar um objeto do tipo byteContentStreamSource para obter acesso ao fluxo, relacionado à matriz de bytes de font usando código como este:
1 System::SharedPtr<ByteContentStreamSource> fontSource = System::MakeObject<ByteContentStreamSource>(fontArray);
Portanto, para fornecer acesso aos dados binários da fonte, use objetos herdados da classe streamSource. Além disso, chamaremos esses objetos fontes de fluxo de fontes.
Objeto FontfiledEfinition
A maioria das frentes está localizada em arquivos regulares, mas, ao mesmo tempo, parte das fontes pode ter diferentes fontes de dados. Para ingressar em um objeto Termos Arquivo e Freio binário da fonte, Aspose.font Library fornece objeto especial fontfiledEfinition.
Este objeto tem tais propriedades:
- Nome do arquivo - Nome do arquivo de font.
- FileExtension - Extensão de um arquivo de fonte.
- StreamSource - Fonte da fonte.
- Offset - Deslocamento dentro do fluxo de bytes de fonte.
O mais simples e um dos construtores mais utilizados deste objeto é o construtor com a seguinte assinatura: FontfiledEfinition (System::SharedPtr System::IO::FileInfo fontFile), use este construtor para casos em que a fonte desejada estiver em um arquivo no rastreamento.
Aqui está um exemplo de iniciar esse objeto para font Montserrat
, localizado no arquivo C:\Windows\Fonts\Montserrat.ttf:
1 System::SharedPtr<FontFileDefinition> fileDef = System::MakeObject<FontFileDefinition>(System::MakeObject<System::IO::FileInfo>(u"C:\\Windows\\Fonts\\Montserrat.ttf"));
Além disso,
fontfiledefinition pode fazer referência à fonte de Montserrat
usando os seguintes construtores:
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"));
O parâmetro
fileExtension deve corresponder ao padrão, para o formato da fonte, extensão. Por exemplo, se o formato da fonte for truetype
, o valor do parâmetro
fileExtension poderá ser ttf
ou ttc
(se o arquivo de fonte for uma coleção de fontes truetype
).
Se o formato da fonte for Embedded Open Type
, o valor do parâmetro
fileExtension deverá ser eot
.
A tabela abaixo mostra a mais usada no Aspose.Font para os formatos de arquivo de fontes C ++. Lá estão eles com os valores correspondentes que o parâmetro fileExtension deve assumir.
Formato de ficheiro fonte | Extensão de ficheiro |
---|---|
TrueType , single font | ttf |
TrueType font collection | ttc |
Web Open Font Format | woff |
Web Open Font Format version 2.0 | woff2 |
Embedded OpenType | eot |
Adobe Type 1 font | pfa , pfb , afm , pfm |
Compact Font Format | cff , can be null |
Se os dados da fonte não iniciarem a posição 0 do fluxo de bytes, use o seguinte construtor com o parâmetro offset:
1 FontFileDefinition(System::String fileExtension, System::SharedPtr<Aspose::Font::Sources::StreamSource> streamSource, int64_t offset).
Como iniciar o objeto FontDefinition?
Agora, quando você tem uma idéia dos objetos herdados da classe streamsource e fornecendo acesso ao fluxo de bytes de fonte e do objeto fontfiledefinition, explicaremos a esses objetos de maneira adequada para iniciar as diferentes.
FontDefiniton Objeto fornece muitos construtores sobrecarregados. O recurso comum de todos os construtores existentes é o parâmetro fontType. Ele descreve o tipo de formato de fonte.
Como foi mencionado anteriormente, além do valor FontType, o objeto fontDefiniton deve ser inicializado com referência aos dados binários da fonte.
Próximos parâmetros de FontDefiniton Os construtores podem ser usados neste caso:
- fontName;
- fileExtension;
- objeto do tipo streamSource;
- objeto do tipo fontfiledEfinition.
Você pode ter uma pergunta. Por que passaríamos no parâmetro fileExtension para o objeto fontDefiniton ou o objeto fontfiledEfinition, quando sempre passamos pelo parâmetro Fonttype que parece coincidir por seu valor com arquivo de file? O problema é que fontType nem sempre coincide com o valor de fileExtension. FontType define o formato de fonte comum, mas não o formato de fonte de um arquivo específico. Algumas fontes de um formato podem ter formatos de arquivo diferentes.
Por exemplo, o valor FontType.ttf define o formato TrueType
. Mas, ao mesmo tempo, o TrueType
inclui alguns formatos de fonte e existem arquivos de fonte com extensões ttf
, eot
, ttc
etc. E se, por exemplo, para a fonte do formato eot
, passamos para
fontdefiniton apenas o valor FontType.ttf, como esse objeto entenderá que a fonte pertence ao formato eot
e não para ttf
?
Da mesma forma, o valor do Fonttype.Type1 é a definição comum para fontes desse formato. Ao mesmo tempo, os arquivos de fonte do formato type1
têm extensões .pfa
, .pfb
, .afm
, .pfm
. Portanto, você não pode definir o formato de arquivo de fontes dependendo adequadamente apenas no valor do fontype.type1. Portanto, para definir o formato da fonte corretamente, precisamos especificar o parâmetro
FontType com o valor do parâmetro
fileExtension.
Abaixo, você pode aprender exemplos de fontdefiniton Inicialização do objeto e após o carregamento da fonte para diferentes casos.
Em todos os casos, o resultado final de carregamento da fonte é colocado na variável de aspose.font.font tipo. Este tipo é a classe básica de fonte da biblioteca aspose.font e os objetos desse tipo fornecem funcionalidade básica comum para trabalhar com fontes.
Carregando a fonte nesse objeto, você poderá renderizar texto com esta fonte, obter informações de codificação, métricas de fonte, etc.
Exemplos de como carregar fontes
Vamos ter como exemplo, carregando a fonte Montserrat
do arquivo C:\Windows\Fonts\Montserrat.ttf
Adicione os próximos namespaces à frente do arquivo:
1using Aspose::Font;
2using Aspose::Font::Sources;
3using System::IO;
Você pode carregar essa fonte usando fontdefiniton e fontfiledefinition objetos de algumas maneiras diferentes:
Carregando com a ajuda do System::IO::FileInfo Objeto
Para cumprir o carregamento, faça o próximo:
- Construa o caminho para o arquivo.
- Inicie
fontDefiniton Passagem do objeto
ttf
como fontType Valor. - Obtenha o valor calculado automaticamente FILEEXTENSNENTE.
- Carregue a fonte.
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);
Carregando com a ajuda do objeto Tipo de Sistema de FileStemStreamSource
Dê os próximos passos para cumprir a operação:
- Construa o caminho para o arquivo.
- Iniciar fontDefiniton objeto.
- Definir
fileExtension como
ttf
. - Carregue a fonte.
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);
Carregamento de fontes sem objeto FontfiledEfinition, com a passagem de arquivos STEMSTREAMSource diretamente para a FontDefinition
As próximas ações devem ser tomadas para carregar a fonte desta maneira:
- Construa o caminho para o arquivo.
- Inicie
FontDefiniton Passagem do objeto
TTF
como FontType Valor,ttf
como FileExtension valor e FileSystemStreamSource objeto. Parâmetro Filextension Aqui não há um valor duplicado para o parâmetro FontType. - Carregue a fonte.
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);
Carregando de fonte com a variável de tipo [] de byte e com o uso do objeto ByteContentStreamSource
Para carregar uma fonte da matriz de bytes, você precisa:
- Construa o caminho para o arquivo.
- Carregue dados binários da fonte na matriz de bytes
- Inicialize
fontDefiniton Passagem do objeto
ttf
como FontType Valor,ttf
como arquivoextension valor e ByteContentStreamSource objeto baseado em fontbytes Array. - Carregue a fonte.
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 obter mais exemplos de uso do Aspose.font, acesse aspose.font.examples.cpp.sln Solution, no cpp-examples da documentação Aspose.font.
Se você tiver algum problema ou dúvida, poderá publicá -los na seção Aspose.Font.Product Family do fórum de suporte gratuito e em poucas horas nossa equipe de suporte limpará tudo para você.