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

Огляд

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

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

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

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

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

1 
2    package com.aspose.font;
3
4    import com.aspose.font.FontDefinition;
5    ...
6
7    // Initialize object FontDefinition with appropriate properties
8    FontDefinition fontDef = new FontDefinition(); 
9    Font desiredFont = Font.open(fontDef);

Кінцевим результатом завантаження шрифту є отримання об’єкта типу com.aspose.font.Font.

Клас com.aspose.font.Font є базовим класом шрифтів пакета com.aspose.font для бібліотеки Java. Він представляє основний функціонал роботи зі шрифтами.

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

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

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

Цей універсальний доступ пов’язаний з такою річчю, як потік байтів. Отже, незалежно від місця розміщення шрифту — у файлі на диску, всередині іншого файлу, масиві байтів у пам’яті — у будь-якому випадку спеціальні об’єкти com.aspose.font нададуть доступ до потоку байтів, пов’язаних із бажаний шрифт.

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

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

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

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

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

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

Ось приклади запуску операції.1. Припустімо, що шрифт знаходиться у файлі під назвою Lora.ttf. У цьому випадку, щоб отримати доступ до потоку байтів цього шрифту, нам потрібно створити об’єкт типу FileSystemStreamSource за допомогою цього єдиного конструктора:

1 
2    FileSystemStreamSource fontSource = new FileSystemStreamSource("Lora.ttf");
  1. Якщо двійкові дані шрифту розташовані в двійковому масиві, визначеному змінною byte [] fontArray, тоді об’єкт типу ByteContentStreamSource забезпечить доступ до потоку даних шрифту на основі змінної fontArray.

Щоб отримати доступ до потоку байтів шрифтів, нам потрібно створити об’єкт типу ByteContentStreamSource, щоб отримати доступ до потоку, пов’язаного з масивом байтів шрифтів, використовуючи такий код:

1 
2    ByteContentStreamSource fontSource = new ByteContentStreamSource(fontArray);

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

Об’єкт FontFileDefinition

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

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

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

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

1 
2    FontFileDefinition fileDef = new FontFileDefinition(new File("C:\\Windows\\Fonts\\Montserrat.ttf"));

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

1 
2    FontFileDefinition fileDef = new FontFileDefinition(new FileSystemStreamSource("C:\\Windows\\Fonts\\Montserrat.ttf"));
3
4    FontFileDefinition fileDef = new FontFileDefinition("ttf", new FileSystemStreamSource("C:\\Windows\\Fonts\\Montserrat.ttf"));

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

У таблиці нижче показано формати файлів шрифтів, які найчастіше використовуються в Aspose.Font. Ось вони з відповідними значеннями, які має приймати параметр 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 
2    FontFileDefinition(String fileExtension, StreamSource streamSource, long 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 і наступного завантаження шрифту для різних випадків.

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

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

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

Розглянемо, наприклад, завантаження шрифту Montserrat з файлу Montserrat-Regular.ttf.

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

 1    package com.aspose.font;
 2
 3    import java.io.File;
 4    import java.io.IOException;
 5    import java.nio.file.Files;
 6    import java.nio.file.Paths;
 7
 8    import com.aspose.font.ByteContentStreamSource;
 9    import com.aspose.font.FileSystemStreamSource;
10    import com.aspose.font.Font;
11    import com.aspose.font.FontDefinition;
12    import com.aspose.font.FontFileDefinition;
13    import com.aspose.font.FontType;

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

Завантаження за допомогою об’єкта java.io.File

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

  1. Побудувати шлях до файлу.
  2. Ініціювати об’єкт FontDefiniton, передаючи TTF як значення FontType.
  3. Отримати автоматично розраховане значення fileExtension.
  4. Завантажте шрифт.
 1    // Construct path to the file
 2    String fontPath = Paths.get(getDataDir(), "Montserrat-Regular.ttf").toString();
 3
 4    // Initialize FontDefinition object passing TTF as FontType value and using FontFileDefinition
 5    FontFileDefinition fileDef = new FontFileDefinition(new File(fontPath));
 6
 7    // Based on FileInfo object, fileExtension value is calculated automatically from FileInfo fields.
 8    FontDefinition fontDef = new FontDefinition(FontType.TTF, fileDef);
 9
10    // Load the font 
11    Font font = Font.open(fontDef);

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

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

  1. Побудувати шлях до файлу.
  2. Ініціювати об’єкт FontDefiniton.
  3. Установіть fileExtension на ttf.
  4. Завантажте шрифт.
 1    // Construct path to the file
 2    String fontPath = Paths.get(getDataDir(), "Montserrat-Regular.ttf").toString();
 3
 4    // Initialize FontDefinition object passing TTF as FontType value and using FontFileDefinition
 5    FontFileDefinition fileDef = new FontFileDefinition("ttf", new FileSystemStreamSource(fontPath));
 6
 7    // Based on FileSystemStreamSource object, set fileExtension to "ttf"
 8    FontDefinition fontDef = new FontDefinition(FontType.TTF, fileDef);
 9
10    // Load the font
11    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    String fontPath = Paths.get(getDataDir(), "Montserrat-Regular.ttf").toString();
 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    FontDefinition fontDef = new FontDefinition(FontType.TTF, "ttf", new FileSystemStreamSource(fontPath));
 8
 9    // Load the font
10    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    String fontPath = Paths.get(getDataDir(), "Montserrat-Regular.ttf").toString();
 3
 4    // Load font binary data into byte array
 5    byte[] fontBytes = Files.readAllBytes(Paths.get(fontPath));
 6
 7    // Initialize FontDefinition object  passing TTF as FontType value, "ttf" as fileExtension value, 
 8    // and ByteContentStreamSource object based on fontBytes array
 9    FontDefinition fontDef = new FontDefinition(FontType.TTF, "ttf", new ByteContentStreamSource(fontBytes));
10
11    // Load the font
12    Font font = Font.open(fontDef);

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

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

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.