Как загрузить шрифты? | API-решение для C++
Обзор
Чтобы ответить на вопрос, как загружать шрифты, сначала нам нужно усвоить, что любой шрифт физически представляет собой массив байтов, в котором данные представлены в некотором формате. Поэтому для корректной загрузки шрифта необходимо знать два ключевых параметра:
- Формат шрифта. Шрифты могут иметь разные форматы, такие как «TrueType», «Type1» и т. д.
- Хранилище, где хранятся двоичные данные, представляющие шрифт. Каждый шрифт представлен в виде двоичных данных, но способ хранения этих данных может отличаться. В большинстве случаев шрифт сохраняется в виде файла на жестком диске. Но иногда двоичные данные шрифта могут быть помещены в другой файл, который сам по себе не является шрифтом. Например, файлы, созданные Microsoft Word или Adobe Acrobat. Это файлы с расширениями
.docx
,.pdf
. Они могут включать в себя разные шрифты.
Объекты и параметры, необходимые для загрузки шрифта
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 будут обеспечивать доступ к потоку байтов. , связанный с желаемым шрифтом.
- Класс StreamSource. Этот абстрактный базовый класс определяет свойства и методы, которые предоставляют доступ к потоку байтов шрифта.
Опишем эти объекты:
- FileSystemStreamSource — предназначен для предоставления доступа к потоку на основе файловой системы. Свойство FileName возвращает имя файла шрифта. Метод GetFontStream() возвращает поток байтов, относящийся к этому файлу.
- ByteContentStreamSource — обеспечивает доступ к потоку на основе массива байтов.
Метод GetFontStream() этого класса возвращает поток, связанный с данными двоичного шрифта.
Свойство Offset указывает на позицию в этом потоке, откуда мы должны начать читать данные.
- Два наиболее часто используемых класса, унаследованных от базового StreamSource:
Как начать занятия?
Вот примеры инициирования этих занятий.
- Предположим, что шрифт находится в файле Lora.ttf. В данном случае, чтобы получить доступ к потоку байтов этого шрифта, нам нужно создать объект типа FileSystemStreamSource с помощью этого единственного конструктора:
1 System::SharedPtr<FileSystemStreamSource> fontSource = System::MakeObject<FileSystemStreamSource>("Lora.ttf");
- Если двоичные данные шрифта расположены в двоичном массиве, определенном переменной byte[] fontArray, то объект типа ByteContentStreamSource обеспечит доступ к потоку данных шрифта на основе переменной fontArray.
Чтобы получить доступ к потоку байтов шрифта, нам нужно создать объект типа ByteContentStreamSource, чтобы получить доступ к потоку, связанному с массивом байтов шрифта, используя такой код:
1 System::SharedPtr<ByteContentStreamSource> fontSource = System::MakeObject<ByteContentStreamSource>(fontArray);
Итак, чтобы обеспечить доступ к двоичным данным шрифта, используйте объекты, унаследованные от базового класса StreamSource. В дальнейшем мы будем называть такие объекты источниками потока шрифтов.
Объект FontFileDefinition
Большинство фронтов расположены в обычных файлах, но при этом часть шрифтов может иметь разные источники данных. Чтобы объединить в один объект термины файл и двоичный поток шрифтов, библиотека Aspose.Font предоставляет специальный объект FontFileDefinition.
- FileName - имя файла шрифта.
- FileExtension - расширение файла шрифта.
- StreamSource — источник потока шрифтов.
- Offset - смещение внутри потока байтов шрифта.
Этот объект имеет такие свойства:
Самый простой и один из наиболее часто используемых конструкторов этого объекта — это конструктор со следующей сигнатурой: 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 Format | woff |
Web Open Font Format version 2.0 | woff2 |
Embedded OpenType | eot |
Adobe Type 1 шрифт | pfa , pfb , afm , pfm |
Compact Font Format | cff , может біть нулем |
Если данные шрифта начинаются не с позиции 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 должен быть инициализирован со ссылкой на двоичные данные шрифта.
- fontName;
- fileExtension;
- объект типа StreamSource;
- объект типа FontFileDefinition. В этом случае можно использовать следующие параметры конструкторов 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
Для выполнения загрузки сделайте следующее:
- Постройте путь к файлу.
- Инициируйте объект
FontDefiniton, передав
TTF
в качестве значения FontType. - Получите автоматически рассчитанное значение fileExtension.
- Загрузите шрифт.
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
Для выполнения операции выполните следующие действия:
- Постройте путь к файлу.
- Инициализируйте объект FontDefiniton.
- Установите для
fileExtension значение
ttf
. - Загрузите шрифт.
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.
Для загрузки шрифта таким способом необходимо выполнить следующие действия:
- Постройте путь к файлу.
- Инициируйте объект
FontDefiniton, передав
TTF
как значение FontType,ttf
как значение fileExtension и объект FileSystemStreamSource . Параметр fileExtension здесь не является дублирующим значением параметра FontType. - Загрузите шрифт.
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.
Чтобы загрузить шрифт из байтового массива, вам необходимо:
- Постройте путь к файлу.
- Загрузите двоичные данные шрифта в массив байтов.
- Инициализируйте объект
FontDefiniton, передав
TTF
как значение FontType,ttf
как значение fileExtension и ByteContentStreamSource. объект на основе массива fontBytes. - Загрузите шрифт.
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);
For getting more examples of using the Aspose.Font go to Aspose.Font.Examples.CPP.sln solution, in the cpp-examples of the Aspose.Font Documentation.
Если у вас остались какие-либо проблемы или вопросы, вы можете опубликовать их в разделе Aspose.Font.Product Family на Форуме бесплатной поддержки, и в течение нескольких часов наша служба поддержки ответит вам. проясню тебе все.