Вкажіть розташування шрифтів TrueType

Цей розділ описує поведінку Aspose.Words за замовчуванням під час пошуку шрифтів TrueType, включаючи відмінності в операційній системі, та демонструє, як вказати власні джерела шрифтів.

Клас FontSourceBase використовується для вказівки різних джерел шрифтів. Існує кілька реалізацій класу FontSourceBase:

Деталі реалізації для деяких класів описані нижче.

Завантаження шрифтів із системи

Існує спеціальний клас SystemFontSource, який завжди використовується за замовчуванням. Він представляє всі шрифти TrueType, встановлені в системі. Таким чином, можна створити список джерел з SystemFontSource та будь-якими іншими необхідними джерелами:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"Rendering.doc");
System::SharedPtr<FontSettings> fontSettings = System::MakeObject<FontSettings>();
// Retrieve the array of environment-dependent font sources that are searched by default. For example this will contain a "Windows\Fonts\" source on a Windows machines.
// We add this array to a new ArrayList to make adding or removing font entries much easier.
System::SharedPtr<TFontSourceBasePtrList> fontSources = System::MakeObject<TFontSourceBasePtrList>(fontSettings->GetFontsSources());
// Add a new folder source which will instruct Aspose.Words to search the following folder for fonts.
System::SharedPtr<FolderFontSource> folderFontSource = System::MakeObject<FolderFontSource>(u"C:\\MyFonts\\", true);
// Add the custom folder which contains our fonts to the list of existing font sources.
fontSources->Add(folderFontSource);
// Convert the Arraylist of source back into a primitive array of FontSource objects.
System::ArrayPtr<TFontSourceBasePtr> updatedFontSources = fontSources->ToArray();
// Apply the new set of font sources to use.
fontSettings->SetFontsSources(updatedFontSources);
// Set font settings
doc->set_FontSettings(fontSettings);
System::String outputPath = outputDataDir + u"SetFontsFoldersSystemAndCustomFolder.pdf";
doc->Save(outputPath);

За замовчуванням в FontSettings визначено один екземпляр класу SystemFontSource. У різних операційних системах шрифти можуть розташовуватися в різних місцях. Однак використання екземпляра FontSettings для кожного документа не є оптимальним рішенням. У більшості випадків використання DefaultInstance має бути достатньо.

Окремі екземпляри для кожного документа потрібні тільки в тому випадку, якщо потрібно використовувати різні джерела шрифтів для різних документів, що є рідкісним випадком. Використання декількох екземплярів FontSettings знижує продуктивність, оскільки вони не використовують спільний кеш.

Де Aspose.Words шукає TrueType шрифти в Windows

У більшості випадків Windows користувачі не стикаються з серйозними проблемами, пов’язаними з пропущеними шрифтами або неправильним розташуванням. Як правило, Aspose.Words переглядає документ і, знайшовши посилання на шрифт, успішно витягує дані про шрифт із системної папки.

В Windows, Aspose.Words спочатку використовуються всі доступні шрифти з папки _%windir%\Fonts. Ця настройка буде працювати для вас більшу частину часу. Ви можете вказати власні папки шрифтів, лише якщо це необхідно. Aspose.Words також здійснює пошук додаткових шрифтів, зареєстрованих у розділі реєстру HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts. Крім того, Windows 10 дозволяє встановити шрифти для поточного користувача. Шрифти поміщаються в папку %userprofile%\AppData\Local\Microsoft\Windows\Fonts і також вказуються в реєстрі HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Fonts, де Aspose.Words буде шукати ці шрифти.

Якщо документ містить вбудовані шрифти, Aspose.Words може зчитувати відповідні дані шрифту з документа та використовувати їх для створення макета документа. Документи також можуть містити посилання на Шрифти, яких немає в системних папках, і в цьому випадку можуть працювати такі сценарії:

  • Користувачі можуть налаштувати нові джерела шрифтів за допомогою класу FontSettings
  • Aspose.Words можна спробувати замінити пропущений шрифт на подібний

Шрифти в системах, відмінних відWindows

Aspose.Words буде шукати шрифти в системних папках шрифтів. Список цих папок можна переглянути за допомогою методу GetSystemFontFolders. Якщо підтримувані шрифти не знайдені, Aspose.Words використовуватиме вбудований шрифт за замовчуванням Fanwood.ttf.

Оскільки параметри шрифту Windows та шрифту, відмінного від Windows OS, різні, Aspose.Words робить все можливе, щоб знайти подібний шрифт і створити макет, подібний до оригінального. Однак це не завжди можливо. У цих випадках клас FontSettings слід використовувати для додавання спеціальних шрифтів або правил заміни.

Де Aspose.Words шукає TrueType шрифти в Linux

У різних дистрибутивах Linux шрифти можуть зберігатися в різних папках. Aspose.Words пошук шрифтів здійснюється в декількох місцях. За замовчуванням Aspose.Words здійснює пошук шрифтів у всіх наступних місцях: /usr/share/fonts, /usr/local/share/fonts, /usr/X11R6/lib/X11/fonts. Ця поведінка за замовчуванням буде працювати для більшості дистрибутивів Linux, але не гарантується, що вона буде працювати постійно, і в цьому випадку вам може знадобитися чітко вказати розташування шрифтів true type. Для цього вам потрібно знати, де встановлені шрифти TrueType у вашому дистрибутиві Linux.

Де Aspose.Words шукає TrueType шрифти в Mac OS X

Aspose.Words здійснює пошук шрифтів у папці /Library/Fonts, яка є стандартним розташуванням для TrueType шрифтів у Mac OS X. Хоча це налаштування буде працювати для вас більшу частину часу, у разі потреби вам може знадобитися вказати власні папки шрифтів.

TrueType шрифти на Android

Android робочий процес fonts інкапсульований у клас Typeface. Існує п’ять типів шрифтів, кожен з яких є групою подібних сімейств шрифтів:

  • DEFAULT
  • DEFAULT_BOLD
  • MONOSPACE
  • SANS_SERIF
  • SERIF

Наприклад, відповідно до Android - м fonts.xml конфігураційний файл " times “належить до сімейства” serif", тому при запиті" times " буде використовуватися NotoSerif-Regular.ttf:

Fonts.xml

<family name="serif">
        <font weight="400" style="normal">NotoSerif-Regular.ttf</font>
        <font weight="700" style="normal">NotoSerif-Bold.ttf</font>
        <font weight="400" style="italic">NotoSerif-Italic.ttf</font>
        <font weight="700" style="italic">NotoSerif-BoldItalic.ttf</font>
</family>
<alias name="times" to="serif" />
<alias name="times new roman" to="serif" />

Для пошуку схожих шрифтів використовуються стратегії, описані раніше.

На додаток до них, у Aspose.Words є свій власний список замін для платформи Android.

Припустимо, документ містить шрифт PMingLiU-ExtB, перш за все, Aspose.Words шукає потрібний шрифт в системних джерелах.

За замовчуванням список папок шрифту Android виглядає наступним чином:

  • / система / шрифти
  • / системний / шрифт
  • / дані / шрифти

Параметр Aspose.Words переглядає визначені користувачем джерела, які були встановлені методом:

Java

fontSettings->SetFontsFolder(u"C:\\MyFonts\\", true);

У разі, якщо була вказана явна Заміна, Aspose.Words замінює відсутній шрифт на запропонований Користувачем:

Java

fontSettings->get_SubstitutionSettings()->get_TableSubstitution()->SetSubstitutes(u"PMingLiU-ExtB", System::MakeArray<System::String>({ u"Liberation Serif" }));

Якщо жодне з правил не спрацювало, Aspose.Words перевірте внутрішню таблицю заміни. Якщо таблиця містить інформацію про відповідний шрифт, то шрифт буде замінений. У нашому випадку Aspose.Words вибере Typeface.SERIF. Але якщо таблиця нічого не знає про запитуваний Шрифт, то Aspose.Words вибирає шрифт на основі спеціальних правил MS Word або найближчої відстані в просторі панорами.

TrueType шрифти на .NET Core та Xamarin

Для .NET Core та Xamarin застосовується те саме правило, що і для Aspose.Words для версії Java. За замовчуванням доступні всі системні шрифти платформи, на якій запущено додаток. Список папок, в яких буде виконуватися пошук, можна знайти, викликавши метод:

Java

SystemFontSource()->GetAvailableFonts()

Завантажити шрифти з папки

Якщо документ, що обробляється, містить посилання на Шрифти, яких немає в системі, або ви не хочете додавати їх до системної папки, або у вас немає прав доступу, то найкращим рішенням буде додати папку власних шрифтів за допомогою методу SetFontsSources. Це дозволить замінити системний джерело на користувальницький. Aspose.Words більше не буде шукати шрифти в реєстрі або Windows\F папці ont, а натомість скануватиме шрифти лише у зазначених папках. Метод GetFontSources поверне відповідні значення.

Вкажіть одну або кілька папок шрифтів

Методи SetFontsFolder і SetFontsFolders є скороченнями до методу SetFontSources з одним або декількома екземплярами FolderFontSource. Ці методи використовуються для вказівки, де Aspose.Words слід шукати шрифти. Якщо папка не існує або недоступна, Aspose.Words просто ігнорує цю папку. Якщо всі папки, включаючи джерела для заміни шрифту, були проігноровані, Aspose.Words використовуватиме шрифт Fanwood за замовчуванням.

У наступному прикладі показано, як задати папку або джерело, які Aspose.Words згодом буде використовувати для пошуку шрифтів TrueType під час рендеринга або вбудовування шрифтів:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// The path to the documents directories.
System::String inputDataDir = GetInputDataDir_RenderingAndPrinting();
System::String outputDataDir = GetOutputDataDir_RenderingAndPrinting();
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"Rendering.doc");
System::SharedPtr<FontSettings> fontSettings = System::MakeObject<FontSettings>();
// Note that this setting will override any default font sources that are being searched by default. Now only these folders will be searched for
// Fonts when rendering or embedding fonts. To add an extra font source while keeping system font sources then use both FontSettings.GetFontSources and
// FontSettings.SetFontSources instead.
fontSettings->SetFontsFolder(u"C:\\MyFonts\\", false);
// Set font settings
doc->set_FontSettings(fontSettings);
System::String outputPath = outputDataDir + u"SetTrueTypeFontsFolder.pdf";
doc->Save(outputPath);

Ви можете завантажити файл шаблону для цього прикладу з сайту Aspose.Words GitHub.

Додатковий логічний параметр визначає, чи будуть шрифти перевірятися рекурсивно по всіх папках, отже, будуть перевірятися всі дочірні папки зазначеної папки. У наступному прикладі показано, як задати Aspose.Words для пошуку шрифтів TrueType в декількох папках при рендерингу або впровадженні шрифтів:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// The path to the documents directories.
System::String inputDataDir = GetInputDataDir_RenderingAndPrinting();
System::String outputDataDir = GetOutputDataDir_RenderingAndPrinting();
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"Rendering.doc");
System::SharedPtr<FontSettings> fontSettings = System::MakeObject<FontSettings>();
// Note that this setting will override any default font sources that are being searched by default. Now only these folders will be searched for
// Fonts when rendering or embedding fonts. To add an extra font source while keeping system font sources then use both FontSettings.GetFontSources and
// FontSettings.SetFontSources instead.
fontSettings->SetFontsFolders(System::MakeArray<System::String>({u"C:\\MyFonts\\", u"D:\\Misc\\Fonts\\"}), true);
// Set font settings
doc->set_FontSettings(fontSettings);
System::String outputPath = outputDataDir + u"SetFontsFoldersMultipleFolders.pdf";
doc->Save(outputPath);

Зверніть увагу на пріоритети. Якщо різні джерела шрифтів мають шрифти з однаковою назвою сім’ї та стилем, тоді Aspose.Words вибере шрифт із джерела з вищим пріоритетом. Дивіться опис поля “пріоритет” нижче.

Якщо ви взагалі не хочете використовувати системні шрифти, Aspose.Words дозволяє ігнорувати їх і використовувати лише власні шрифти:

C++

System::SharedPtr<FontSettings> fontSettings = System::MakeObject<FontSettings>()->get_DefaultInstance();
fontSettings->SetFontsFolder(u"C:\\MyFonts\\", true);

Пріоритетна властивість

Властивість Priority використовується, коли в різних джерелах шрифтів є шрифти з однаковою назвою сімейства та стилем. У цьому випадку Aspose.Words вибирає шрифт із джерела з вищим значенням пріоритету. Наприклад, у системній папці є стара версія шрифту, а клієнт додав нову версію того самого шрифту до папки користувача.

C++

System::SharedPtr<FolderFontSource> folderFontSource = System::MakeObject<FolderFontSource>(u"C:\\MyFonts\\", true, 1);

Завантаження шрифтів із потоку

Aspose.Words надає клас StreamFontSource, який дозволяє завантажувати шрифти з потоку. Щоб використовувати джерело шрифтів stream, користувачеві потрібно створити похідний клас із StreamFontSource та надати реалізацію методу OpenFontDataStream. Метод OpenFontDataStream може бути викликаний кілька разів. Перший раз він буде викликаний, коли Aspose.Words перегляне надані джерела шрифтів, щоб отримати список доступних шрифтів. Пізніше це може бути викликано, якщо шрифт використовується в документі для аналізу даних шрифту та для вбудовування даних шрифту в деякі вихідні формати. StreamFontSource може бути корисним, оскільки дозволяє завантажувати дані шрифту лише тоді, коли це потрібно, а не зберігати їх у пам’яті протягом усього життя FontSettings.

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
namespace
{
class ResourceSteamFontSourceExample : public StreamFontSource
{
typedef ResourceSteamFontSourceExample ThisType;
typedef Aspose::Words::Fonts::StreamFontSource BaseType;
typedef ::System::BaseTypesInfo<BaseType> ThisTypeBaseTypesInfo;
RTTI_INFO(ThisType, ThisTypeBaseTypesInfo);
public:
System::SharedPtr<System::IO::Stream> OpenFontDataStream() override;
};
System::SharedPtr<System::IO::Stream> ResourceSteamFontSourceExample::OpenFontDataStream()
{
return System::Reflection::Assembly::GetExecutingAssembly()->GetManifestResourceStream(u"resourceName");
}
}
void ResourceSteamFontSource()
{
std::cout << "ResourceSteamFontSource example started." << std::endl;
// The path to the documents directory.
System::String dataDir = GetInputDataDir_RenderingAndPrinting();
System::SharedPtr<Document> doc = System::MakeObject<Document>(dataDir + u"Rendering.doc");
// FontSettings.SetFontSources instead.
FontSettings::get_DefaultInstance()->SetFontsSources(System::MakeArray<System::SharedPtr<FontSourceBase>>({System::MakeObject<SystemFontSource>(), System::MakeObject<ResourceSteamFontSourceExample>()}));
System::String outputPath = GetOutputDataDir_RenderingAndPrinting() + u"ResourceSteamFontSource.pdf";
doc->Save(outputPath);
std::cout << "ResourceSteamFontSource example finished." << std::endl << std::endl;
}

StreamFontSource

Збереження та завантаження кешу пошуку шрифтів

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

Процедура розбору всіх доступних файлів шрифтів для ініціалізації кешу займає досить багато часу. Aspose.Words дозволяє зберігати та завантажувати кеш за допомогою методу SaveSearchCache для вирішення проблеми продуктивності. Тобто користувач може завантажити раніше збережений кеш з файлу і пропустити етап розбору всіх доступних файлів шрифтів.

Отримати список доступних шрифтів

Якщо ви хочете отримати список доступних шрифтів, які, наприклад, можуть бути використані для візуалізації документа PDF, ви можете використовувати метод GetAvailableFonts, як показано в наступному прикладі коду. Клас PhysicalFontInfo визначає інформацію про фізичний шрифт, доступний для двигуна шрифтів Aspose.Words:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Get available system fonts
for (auto fontInfo : System::IterateOver(System::MakeObject<SystemFontSource>()->GetAvailableFonts()))
{
std::cout << "FontFamilyName : " << fontInfo->get_FontFamilyName().ToUtf8String() << std::endl;
std::cout << "FullFontName : " << fontInfo->get_FullFontName().ToUtf8String() << std::endl;
std::cout << "Version : " << fontInfo->get_Version().ToUtf8String() << std::endl;
std::cout << "FilePath : " << fontInfo->get_FilePath().ToUtf8String() << std::endl;
}
// Get available fonts in folder
for (auto fontInfo : System::IterateOver(System::MakeObject<FolderFontSource>(inputDataDir, true)->GetAvailableFonts()))
{
std::cout << "FontFamilyName : " << fontInfo->get_FontFamilyName().ToUtf8String() << std::endl;
std::cout << "FullFontName : " << fontInfo->get_FullFontName().ToUtf8String() << std::endl;
std::cout << "Version : " << fontInfo->get_Version().ToUtf8String() << std::endl;
std::cout << "FilePath : " << fontInfo->get_FilePath().ToUtf8String() << std::endl;
}
// Get available fonts from FontSettings
for (System::SharedPtr<FontSourceBase> fontsSource : FontSettings::get_DefaultInstance()->GetFontsSources())
{
for (auto fontInfo : System::IterateOver(fontsSource->GetAvailableFonts()))
{
std::cout << "FontFamilyName : " << fontInfo->get_FontFamilyName().ToUtf8String() << std::endl;
std::cout << "FullFontName : " << fontInfo->get_FullFontName().ToUtf8String() << std::endl;
std::cout << "Version : " << fontInfo->get_Version().ToUtf8String() << std::endl;
std::cout << "FilePath : " << fontInfo->get_FilePath().ToUtf8String() << std::endl;
}
}