Как загрузить шрифты? | API-решение для .NET

Обзор

Чтобы ответить на вопрос, как загружать шрифты, сначала нам нужно усвоить, что любой шрифт физически представляет собой массив байтов, в котором данные представлены в некотором формате.

Поэтому для корректной загрузки шрифта необходимо знать два ключевых параметра:

Объекты и параметры, необходимые для загрузки шрифта

Aspose.Font для .NET предоставляет объект FontDefiniton для уведомления о двух ключевых параметрах, необходимых для загрузки шрифта.

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

Опишем это с помощью псевдокода:

1 
2using Aspose.Font;
3    ...
4
5    // Initialize object FontDefinition with appropriate properties
6    FontDefinition fontDef = new FontDefinition(); 
7    Font desiredFont = Font.Open(fontDef);

Конечным результатом загрузки шрифта является получение объекта типа Aspose.Font.Font. Класс Aspose.Font.Font — это базовый класс шрифтов Aspose.Font для библиотеки .NET. Он представляет собой основной функционал работы со шрифтами.

Загрузив шрифт в объект типа Aspose.Font.Font, вы сможете отображать текст с помощью этого шрифта, получать данные кодирования и метрики шрифта. Вы также сможете изменить или сохранить этот шрифт и многое другое.

Для инициализации объекта FontDefiniton нам необходимо, как уже упоминалось ранее, передать ему 2 параметра шрифта: тип формата и объект, описывающий хранилище двоичных данных шрифта. Первый параметр сообщается с помощью перечисления FontType.

Чтобы упростить работу со вторым параметром, Aspose.Font предлагает ряд объектов, которые предоставляют универсальный доступ к двоичным данным шрифта независимо от того, где размещен шрифт.

Этот универсальный доступ связан с такой вещью, как поток байтов. Итак, независимо от того, где размещен шрифт - в файле на диске, внутри другого файла, массиве байтов в памяти - в любом случае специальные объекты Aspose.Font будут обеспечивать доступ к потоку байтов. , связанный с желаемым шрифтом.

Опишем эти объекты:

  1. Класс StreamSource.

Этот абстрактный базовый класс определяет свойства и методы, которые предоставляют доступ к потоку байтов шрифта.

Метод GetFontStream() этого класса возвращает поток, связанный с данными двоичного шрифта.

Свойство Offset указывает на позицию в этом потоке, откуда мы должны начать читать данные.

  1. Два наиболее часто используемых класса, унаследованных от базового StreamSource:

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

Вот примеры инициирования этих занятий.

  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

Большинство фронтов расположены в обычных файлах, но при этом часть шрифтов может иметь разные источники данных. Чтобы объединить в один объект термины файл и двоичный поток шрифтов, библиотека Aspose.Font предоставляет специальный объект FontFileDefinition.

Этот объект имеет такие свойства:

Самым простым и одним из наиболее часто используемых конструкторов этого объекта является конструктор со следующей сигнатурой: FontFileDefinition (FileInfo fontFile), используйте этот конструктор в случаях, когда нужный шрифт находится в файле на жестком диске.

Вот пример создания такого объекта для шрифта Montserrat, который находится в файле C:\Windows\Fonts\Montserrat.ttf:

1 
2    FontFileDefinition fileDef = new FontFileDefinition(new FileInfo(@"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 for .NET форматы файлов шрифтов. Вот они с соответствующими значениями, которые должен принимать параметр 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 должен быть инициализирован со ссылкой на двоичные данные шрифта.

У вас может возникнуть вопрос. Зачем нам передавать параметр 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 System;
2using Aspose.Font;
3using Aspose.Font.Sources;
4using System.IO;

Вы можете загрузить этот шрифт с помощью объектов FontDefiniton и FontFileDefinition несколькими различными способами:

Загрузка с помощью объекта System.IO.FileInfo

Для выполнения загрузки сделайте следующее:

  1. Постройте путь к файлу.
  2. Инициируйте объект FontDefiniton, передав TTF в качестве значения FontType.
  3. Получите автоматически рассчитанное значение fileExtension.
  4. Загрузите шрифт.
 1    // Construct path to the file
 2    string fontPath = @"C:\Windows\Fonts\Montserrat.ttf";
 3
 4    // Initialize FontDefinition object passing TTF as FontType value and using FontFileDefinition
 5    FontFileDefinition fileDef = new FontFileDefinition(new FileInfo(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 font
11    Font font = Font.Open(fontDef);

Загрузка с помощью объекта типа FileSystemStreamSource

Для выполнения операции выполните следующие действия:

  1. Постройте путь к файлу.
  2. Инициируйте объект FontDefiniton.
  3. Установите для fileExtension значение ttf.
  4. Загрузите шрифт.
 1    // Construct path to the file
 2    string fontPath = @"C:\Windows\Fonts\Montserrat.ttf";
 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 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 = @"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    FontDefinition fontDef = new FontDefinition(FontType.TTF, "ttf", new FileSystemStreamSource(fontPath));
 8
 9    // Load 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 = @"C:\Windows\Fonts\Montserrat.ttf";
 3
 4    // Load font binary data into byte array
 5    byte[] fontBytes;
 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 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 net-examples of the Aspose.Font Documentation

Если у вас остались какие-либо проблемы или вопросы, вы можете опубликовать их в разделе Aspose.Font.Product Family на Форуме бесплатной поддержки, и в течение нескольких часов наша служба поддержки ответит вам. проясню тебе все.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.