Як завантажити шрифти? | Рішення API для C++

Огляд

Щоб відповісти на питання, як завантажувати шрифти, спочатку нам потрібно дізнатися, що будь-який шрифт фізично є масивом байтів, в якому дані представлені в певному форматі. Тому для правильного завантаження шрифту необхідно знати два ключових параметри:

Об’єкти та параметри, необхідні для завантаження шрифту

Aspose.Font для C++ надає об’єкт FontDefiniton для повідомлення двох ключових параметрів, необхідних для завантаження шрифту.

Після створення та ініціювання об’єкта FontDefiniton вам потрібно лише викликати статичний метод Aspose.Font.Font.Open() і передати щойно ініціалізований об’єкт FontDefiniton як параметр для завантаження потрібного шрифту та отримання посилання на нього.

Опишемо це за допомогою псевдокоду:

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

Кінцевим результатом завантаження шрифту є отримання об’єкта типу Aspose.Font.Font. Клас Aspose.Font.Font є базовим класом шрифту Aspose.Font для бібліотеки C++. Він представляє основний функціонал роботи зі шрифтами.

Завантаживши шрифт в об’єкт типу Aspose.Font.Font, ви зможете відтворювати текст із цим шрифтом, отримувати дані кодування та показники шрифту. Ви також зможете змінити або зберегти цей шрифт і багато іншого.

Щоб ініціювати об’єкт FontDefiniton, нам потрібно надати FontDefinition() 2 параметри шрифту, тип формату та об’єкт, який описує зберігання двійкових даних шрифту. Перший параметр повідомляється за допомогою переліку FontType.

Щоб спростити роботу з другим параметром, Aspose.Font пропонує серію об’єктів, які надають універсальний доступ до двійкових даних шрифту незалежно від місця розміщення шрифту.h

Цей універсальний доступ пов’язаний з такою річчю, як потік байтів. Таким чином, незалежно від місця розміщення шрифту – у файлі на диску, всередині іншого файлу, масиві байтів у пам’яті – у будь-якому випадку спеціальні об’єкти Aspose.Font нададуть доступ до потоку байтів. , пов’язані з потрібним шрифтом.

Опишемо ці об’єкти:

  1. Клас StreamSource. Цей абстрактний базовий клас визначає властивості та методи, які надають доступ до потоку байтів шрифту.

Метод GetFontStream() цього класу повертає потік, пов’язаний з даними двійкового шрифту. Властивість Offset вказує на позицію в цьому потоці, звідки ми повинні почати читати дані.

  1. Два найбільш часто використовувані класи, успадковані від базового StreamSource:

Властивість FileName повертає назву файлу шрифту. Метод GetFontStream() повертає потік байтів, пов’язаний із цим файлом.

Як ініціювати операцію?

Ось приклади запуску операції.

  1. Припустімо, що шрифт знаходиться у файлі під назвою Lora.ttf. У цьому випадку, щоб отримати доступ до потоку байтів цього шрифту, нам потрібно створити об’єкт типу FileSystemStreamSource за допомогою цього єдиного конструктора:
1    System::SharedPtr<FileSystemStreamSource> fontSource = System::MakeObject<FileSystemStreamSource>("Lora.ttf");
  1. Якщо двійкові дані шрифту розташовані в двійковому масиві, визначеному змінною byte [] fontArray, тоді об’єкт типу ByteContentStreamSource забезпечить доступ до потоку даних шрифту на основі змінної fontArray . Щоб отримати доступ до потоку байтів шрифтів, нам потрібно створити об’єкт типу ByteContentStreamSource, щоб отримати доступ до потоку, пов’язаного з масивом байтів шрифтів, використовуючи такий код:
1    System::SharedPtr<ByteContentStreamSource> fontSource = System::MakeObject<ByteContentStreamSource>(fontArray);

Отже, щоб надати доступ до двійкових даних шрифту, використовуйте об’єкти, успадковані від базового класу StreamSource. Далі ми будемо називати такі об’єкти джерелами потоку шрифтів.

Об’єкт FontFileDefinition

Більшість фасадів розташовані в звичайних файлах, але в той же час частина шрифтів може мати різні джерела даних. Щоб об’єднати в один об’єкт терміни файл і двійковий потік шрифтів, бібліотека Aspose.Font надає спеціальний об’єкт FontFileDefinition.

Цей об’єкт має такі властивості:

Найпростішим і одним із найбільш використовуваних конструкторів цього об’єкта є конструктор із такою сигнатурою: FontFileDefinition (System::SharedPtr System::IO::FileInfo fontFile), використовуйте цей конструктор для випадків коли потрібний шрифт знаходиться у файлі на жорсткому диску.

Ось приклад ініціювання такого об’єкта для шрифту Montserrat, який знаходиться у файлі C:\Windows\Fonts\Montserrat.ttf:

1    System::SharedPtr<FontFileDefinition> fileDef = System::MakeObject<FontFileDefinition>(System::MakeObject<System::IO::FileInfo>(u"C:\\Windows\\Fonts\\Montserrat.ttf"));

Крім того, FontFileDefinition може посилатися на шрифт Montserrat за допомогою таких конструкторів:

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

Параметр fileExtension має відповідати стандартному для формату шрифту розширенню. Наприклад, якщо формат шрифту TrueType, тоді значенням параметра fileExtension може бути ttf або ttc (якщо файл шрифту є набором шрифтів TrueType). Якщо формат шрифту Embedded Open Type, тоді значення параметра fileExtension має бути eot.

У таблиці нижче показано формати файлів шрифтів, які найчастіше використовуються в Aspose.Font для C++. Ось вони з відповідними значеннями, які має приймати параметр fileExtension.

Формат файлу шрифтуfileExtension
TrueType, окремий шрифтttf
TrueType колекція шрифтівttc
Web Open Font Formatwoff
Web Open Font Format version 2.0woff2
Embedded OpenTypeeot
Adobe Type 1 fontpfa, pfb, afm, pfm
Compact Font Formatcff, can be null

Якщо дані шрифту починаються не з позиції 0 потоку байтів, використовуйте такий конструктор із параметром offset:

1    FontFileDefinition(System::String fileExtension, System::SharedPtr<Aspose::Font::Sources::StreamSource> streamSource, int64_t offset).

Як ініціювати об’єкт FontDefinition?

Тепер, коли ви маєте уявлення про об’єкти, успадковані від класу StreamSource і які надають доступ до потоку байтів шрифту, а також про об’єкт FontFileDefinition, ми пояснимо, ви дізнаєтесь, як правильно ініціювати об’єкт FontDefiniton із цими об’єктами для різних ситуацій.

Об’єкт FontDefiniton надає вам багато перевантажених конструкторів. Спільною рисою всіх існуючих конструкторів є параметр FontType. Він описує тип формату шрифту.

Як було зазначено раніше, окрім значення FontType, об’єкт FontDefiniton має бути ініціалізовано з посиланням на двійкові дані шрифту.

У цьому випадку можна використовувати наступні параметри конструкторів FontDefiniton:

У вас може виникнути запитання. Чому ми повинні передавати параметр fileExtension в об’єкт FontDefiniton або FontFileDefinition, коли ми завжди передаємо параметр FontType яке, здається, збігається за своїм значенням із fileExtension?

Проблема в тому, що FontType не завжди збігається зі значенням fileExtension. FontType визначає загальний формат шрифту, але не формат шрифту конкретного файлу. Деякі шрифти одного формату можуть мати різні формати файлів.

Наприклад, значення FontType.TTF визначає формат TrueType. Але в той же час TrueType включає кілька форматів шрифтів і файли шрифтів із розширеннями ttf, eot, ttc тощо. І якщо, наприклад, для шрифту формату EOT ми передамо в FontDefiniton лише значення FontType.TTF, то як цей об’єкт зрозуміє, що шрифт належить до формату EOT, а не до TTF?

Таким же чином значення FontType.Type1 є загальним визначенням для шрифтів цього формату. При цьому файли шрифтів формату Type1 мають розширення .pfa, .pfb, .afm, .pfm. Таким чином, ви не можете правильно визначити формат файлу шрифту, покладаючись лише на значення FonType.Type1. Отже, щоб правильно визначити формат шрифту, нам потрібно вказати параметр FontType зі значенням параметра fileExtension.

Нижче ви можете дізнатися приклади ініціалізації об’єкта FontDefiniton і наступного завантаження шрифту для різних випадків.

У всіх випадках кінцевий результат завантаження шрифту поміщається в змінну типу Aspose.Font.Font. Цей тип є основним класом шрифтів бібліотеки Aspose.Font, і об’єкти цього типу забезпечують загальну базову функціональність для роботи зі шрифтами.

Завантаживши шрифт у цей об’єкт, ви зможете відтворити текст із цим шрифтом, отримати інформацію про кодування, показники шрифту тощо.

Приклади завантаження шрифтів

Розглянемо, наприклад, завантаження шрифту Montserrat з файлу C:\Windows\Fonts\Montserrat.ttf

Додайте наступні простори імен у заголовок файлу:

1using Aspose::Font;
2using Aspose::Font::Sources;
3using System::IO;

Ви можете завантажити цей шрифт за допомогою об’єктів FontDefiniton і FontFileDefinition кількома різними способами:

Завантаження за допомогою об’єкта System::IO::FileInfo

Щоб виконати завантаження, виконайте наступне:

  1. Побудувати шлях до файлу.
  2. Ініціювати об’єкт FontDefiniton, передаючи TTF як значення FontType.
  3. Отримати автоматично розраховане значення fileExtension.
  4. Завантажте шрифт.
 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);

Завантаження за допомогою об’єкта типу FileSystemStreamSource

Виконайте наступні кроки для виконання операції:

  1. Побудувати шлях до файлу.
  2. Ініціювати об’єкт FontDefiniton.
  3. Встановіть fileExtension на ttf.
  4. Завантажте шрифт.
 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);

Завантаження шрифту без об’єкта FontFileDefinition із передачею FileSystemStreamSource безпосередньо до FontDefinition

Для завантаження шрифту таким чином необхідно виконати наступні дії:

  1. Побудувати шлях до файлу.
  2. Ініціювати об’єкт FontDefiniton, передаючи TTF як значення FontType, ttf як значення fileExtension і об’єкт FileSystemStreamSource . Параметр fileExtension тут не є повторюваним значенням для параметра FontType.
  3. Завантажте шрифт.
 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);

Завантаження шрифту за допомогою змінної типу byte[] та використання об’єкта типу ByteContentStreamSource

Щоб завантажити шрифт з байтового масиву, потрібно:

  1. Побудувати шлях до файлу.
  2. Завантажте двійкові дані шрифту в масив байтів
  3. Ініціалізуйте об’єкт FontDefiniton, передаючи TTF як значення FontType, ttf як значення fileExtension і ByteContentStreamSource об’єкт на основі масиву fontBytes.
  4. Завантажте шрифт.
 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);

Щоб отримати більше прикладів використання Aspose.Font, перейдіть до [рішення Aspose.Font.Examples.CPP.sln]( https://github.com/aspose-font/Aspose.Font-Documentation/tree/master/cpp -examples), у cpp-examples [Aspose.Font Documentation] ( https://github.com/aspose-font/Aspose.Font-Documentation).

Якщо у вас залишилися проблеми чи запитання, ви можете опублікувати їх у розділі Aspose.Font.Product Family Безкоштовного форуму підтримки, і протягом кількох годин наша служба підтримки надішле прояснити все для вас.

Have any questions about Aspose.Font?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.