Как загрузить шрифты? | 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:
    • FileSystemStreamSource — предназначен для предоставления доступа к потоку на основе файловой системы. Свойство FileName возвращает имя файла шрифта. Метод getFontStream() возвращает поток байтов, относящийся к этому файлу.
    • ByteContentStreamSource — обеспечивает доступ к потоку на основе массива байтов.

Как начать занятия?

Вот примеры инициирования этих занятий.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 шрифтpfa, pfb, afm, pfm
Compact Font Formatcff, может біть нулем

Если данные шрифта начинаются не с позиции 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);

For getting more examples of using the Aspose.Font go to Aspose.Font.Examples.sln solution, in the java-examples of the 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.