Шрифты являются неотъемлемой частью цифровых документов и веб-страниц, которые используются для определения внешнего вида текста. Файлы шрифтов используются для хранения информации о шрифтах, такой как стили, вес, размер и т. д. Может быть случай, когда вам потребуется манипулировать шрифтами, чтобы извлечь информацию о них. Для таких сценариев в этой статье вы узнаете, как загружать и читать информацию из шрифтов TrueType, CFF и Type1 с помощью C++.

Библиотека управления шрифтами C++

Aspose.Font for C++ — это мощный API для управления шрифтами, позволяющий работать с TrueType, CFF, OpenType и Type1. , EOT и многие другие шрифты из ваших приложений C++. Вы можете загружать, сохранять и извлекать информацию о кодировке из шрифтов, а также работать с глифами. API можно загрузить из раздела downloads или установить через NuGet.

Загрузка шрифтов CFF, TrueType и Type1 с помощью C++

Aspose.Font for C++ позволяет загружать шрифты CFF, TrueType и Type1 из файлов, расположенных на вашем носителе. Ниже приведены шаги для загрузки шрифта.

  • Создайте объект класса FontDefinition для загрузки шрифта, указав его тип, т.е. TrueType, Type1 и т. д.
  • Используйте класс CffFont, TtfFont или Type1Font для открытия шрифтов CFF, TrueType и Type1 соответственно из объекта FontDefinition.

Загрузите шрифты CFF с помощью C++

В следующем примере кода показано, как загружать шрифты CFF с помощью C++.

For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-C
System::String fileName = dataDir + u"OpenSans-Regular.cff";
//Имя файла шрифта с полным путем
    
System::SharedPtr<FontDefinition> fd = System::MakeObject<FontDefinition>(Aspose::Font::FontType::CFF, System::MakeObject<FontFileDefinition>(u"cff", System::MakeObject<FileSystemStreamSource>(fileName)));
System::SharedPtr<CffFont> ttfFont = System::DynamicCast_noexcept<Aspose::Font::Cff::CffFont>(Aspose::Font::Font::Open(fd));

Загрузка шрифтов TrueType с помощью C++

В следующем примере кода показано, как загружать шрифты TrueType с помощью C++.

For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-C
System::String fileName = dataDir + u"Montserrat-Regular.ttf";
//Имя файла шрифта с полным путем
    
System::SharedPtr<FontDefinition> fd = System::MakeObject<FontDefinition>(Aspose::Font::FontType::TTF, System::MakeObject<FontFileDefinition>(u"ttf", System::MakeObject<FileSystemStreamSource>(fileName)));
System::SharedPtr<TtfFont> ttfFont = System::DynamicCast_noexcept<Aspose::Font::Ttf::TtfFont>(Aspose::Font::Font::Open(fd));

Загрузка шрифтов Type1 с помощью C++

В следующем примере кода показано, как загружать шрифты Type1 с помощью C++.

For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-C
System::String fileName = dataDir + u"courier.pfb";
//Имя файла шрифта с полным путем
    
System::SharedPtr<FontDefinition> fd = System::MakeObject<FontDefinition>(Aspose::Font::FontType::Type1, System::MakeObject<FontFileDefinition>(u"pfb", System::MakeObject<FileSystemStreamSource>(fileName)));
System::SharedPtr<Type1Font> font = System::DynamicCast_noexcept<Aspose::Font::Type1::Type1Font>(Aspose::Font::Font::Open(fd));

Извлечение метрик шрифта из TrueType или Type1 с помощью C++

Aspose.Font для C++ также позволяет извлекать метрики шрифта, которые содержат такую информацию, как Ascender, Descender, TypoAscender, TypoDescender и UnitsPerEm. Ниже приведены шаги для получения метрик шрифта из шрифта TrueType или Type1.

  • Создайте объект класса FontDefinition для загрузки шрифта TrueType или Type1.
  • Откройте шрифт с помощью класса TtfFont или Type1Font в зависимости от типа шрифта.
  • Извлеките информацию о метриках шрифта.

Получить метрики шрифта из шрифта TrueType с помощью C++

For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-C
System::String fileName = dataDir + u"Montserrat-Regular.ttf";
//Имя файла шрифта с полным путем
    
System::SharedPtr<FontDefinition> fd = System::MakeObject<FontDefinition>(Aspose::Font::FontType::TTF, System::MakeObject<FontFileDefinition>(u"ttf", System::MakeObject<FileSystemStreamSource>(fileName)));
System::SharedPtr<TtfFont> font = System::DynamicCast_noexcept<Aspose::Font::Ttf::TtfFont>(Aspose::Font::Font::Open(fd));
    
System::String name = font->get_FontName();
System::Console::WriteLine(System::String(u"Font name: ") + name);
System::Console::WriteLine(System::String(u"Glyph count: ") + font->get_NumGlyphs());
System::String metrics = System::String::Format(u"Font metrics: ascender - {0}, descender - {1}, typo ascender = {2}, typo descender = {3}, UnitsPerEm = {4}", font->get_Metrics()->get_Ascender(), font->get_Metrics()->get_Descender(), font->get_Metrics()->get_TypoAscender(), font->get_Metrics()->get_TypoDescender(), font->get_Metrics()->get_UnitsPerEM());
    
System::Console::WriteLine(metrics);
    
//Получите таблицу кодировки Unicode cmap из шрифта как объект TtfCMapFormatBaseTable, чтобы получить доступ к информации о глифе шрифта для символа «A».
//Также убедитесь, что у шрифта есть объект TtfGlyfTable (таблица 'glyf') для доступа к глифу.
System::SharedPtr<Aspose::Font::TtfCMapFormats::TtfCMapFormatBaseTable> cmapTable;
if (font->get_TtfTables()->get_CMapTable() != nullptr)
{
    cmapTable = font->get_TtfTables()->get_CMapTable()->FindUnicodeTable();
}
if (cmapTable != nullptr && font->get_TtfTables()->get_GlyfTable() != nullptr)
{
    System::Console::WriteLine(System::String(u"Font cmap unicode table: PlatformID = ") + cmapTable->get_PlatformId() + u", PlatformSpecificID = " + cmapTable->get_PlatformSpecificId());
    
    //Код для символа «А»
    char16_t unicode = (char16_t)65;
    
    //Индекс глифа для «А»
    uint32_t glIndex = cmapTable->GetGlyphIndex(unicode);
    
    if (glIndex != static_cast<uint32_t>(0))
    {
        //Глиф для «А»
        System::SharedPtr<Glyph> glyph = font->GetGlyphById(glIndex);
        if (glyph != nullptr)
        {
            //Печать метрик глифа
            System::Console::WriteLine(u"Glyph metrics for 'A' symbol:");
            System::String bbox = System::String::Format(System::String(u"Glyph BBox: Xmin = {0}, Xmax = {1}") + u", Ymin = {2}, Ymax = {3}", glyph->get_GlyphBBox()->get_XMin(), glyph->get_GlyphBBox()->get_XMax(), glyph->get_GlyphBBox()->get_YMin(), glyph->get_GlyphBBox()->get_YMax());
            System::Console::WriteLine(bbox);
            System::Console::WriteLine(System::String(u"Width:") + font->get_Metrics()->GetGlyphWidth(System::MakeObject<GlyphUInt32Id>(glIndex)));
        }
    }
}

Извлечение метрик шрифта из шрифта Type1 с использованием C++

For complete examples and data files, please go to https://github.com/aspose-font/Aspose.Font-for-C
System::String fileName = dataDir + u"courier.pfb";
//Имя файла шрифта с полным путем
    
System::SharedPtr<FontDefinition> fd = System::MakeObject<FontDefinition>(Aspose::Font::FontType::Type1, System::MakeObject<FontFileDefinition>(u"pfb", System::MakeObject<FileSystemStreamSource>(fileName)));
System::SharedPtr<Type1Font> font = System::DynamicCast_noexcept<Aspose::Font::Type1::Type1Font>(Aspose::Font::Font::Open(fd));
    
System::String name = font->get_FontName();
System::Console::WriteLine(System::String(u"Font name: ") + name);
System::Console::WriteLine(System::String(u"Glyph count: ") + font->get_NumGlyphs());
System::String metrics = System::String::Format(u"Font metrics: ascender - {0}, descender - {1}, typo ascender = {2}, typo descender = {3}, UnitsPerEm = {4}", font->get_Metrics()->get_Ascender(), font->get_Metrics()->get_Descender(), font->get_Metrics()->get_TypoAscender(), font->get_Metrics()->get_TypoDescender(), font->get_Metrics()->get_UnitsPerEM());
    
System::Console::WriteLine(metrics);

Вывод

В этой статье вы узнали, как загружать шрифты CFF, TrueType и Type1 и извлекать их информацию с помощью C++. Вы можете узнать больше об API управления шрифтами C++, используя документацию.