/
docNemo
/
clothes-graph
Обзор
Документация
Войти
/
docNemo
/
clothes-graph
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
src/ClothesGraph.Printing/SystemFontResolver.cs
84 строки
3 KB
docNemo
Фундамент продукта: параметрическое построение выкроек, печать, установщик
08 авг 2026, 22:17
08 авг 2026, 22:17
cd47cce
Код
Авторство
О чём код?
using System; using System.Collections.Generic; using System.IO; using PdfSharp.Fonts; namespace ClothesGraph.Printing; /// <summary> /// Поиск шрифтов для вывода надписей на листе. /// </summary> /// <remarks> /// PDFsharp 6 не ищет шрифты сам: библиотека кроссплатформенная и не делает /// предположений о системе. Шрифт берётся из системной папки, а не встраивается /// в поставку, потому что распространять начертания вроде Arial лицензия /// не позволяет. Надписи на выкройке служебные, поэтому подойдёт любой /// шрифт с кириллицей. /// </remarks> public sealed class SystemFontResolver : IFontResolver { /// <summary>Порядок предпочтения: первый найденный и будет использован.</summary> private static readonly string[] Candidates = [ "arial.ttf", "segoeui.ttf", "tahoma.ttf", "verdana.ttf", "calibri.ttf", "DejaVuSans.ttf", "LiberationSans-Regular.ttf" ]; private static readonly string[] Directories = [ Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "/usr/share/fonts/truetype/dejavu", "/usr/share/fonts/truetype/liberation" ]; private static readonly Dictionary<string, byte[]> Cache = new(StringComparer.OrdinalIgnoreCase); private static readonly object Gate = new(); private const string FaceName = "default"; /// <summary>Подключает поиск шрифтов. Повторные вызовы безвредны.</summary> public static void Install() { lock (Gate) GlobalFontSettings.FontResolver ??= new SystemFontResolver(); } public FontResolverInfo? ResolveTypeface(string familyName, bool isBold, bool isItalic) => new(FaceName); public byte[]? GetFont(string faceName) { lock (Gate) { if (Cache.TryGetValue(faceName, out var cached)) return cached; foreach (var directory in Directories) { if (string.IsNullOrEmpty(directory) || !Directory.Exists(directory)) continue; foreach (var candidate in Candidates) { var path = Path.Combine(directory, candidate); if (!File.Exists(path)) continue; var data = File.ReadAllBytes(path); Cache[faceName] = data; return data; } } throw new InvalidOperationException( "Не найден ни один шрифт для надписей на листе. " + "Проверьте, что в системе установлен Arial, Segoe UI или Tahoma"); } } }