Первая попытка
Вот что мы получаем для шрифта Arial TTF:
![](https://framapic.org/dgOhAcOFbSoX/fXIytpnQ08UN)
Вот что мы получаем для шрифта Sitka TT C :
![](https://framapic.org/Z3WcpAqA0gt0/5W5AigptKK3C)
А вот что мы получаем для шрифта SimSun TT C:
![](https://framapic.org/KjPnJ9kthDhV/90Z9CgjQV9lR)
Я пытался использовать OpenFontReader
объект из пакета Typography.OpenFont.NetCore .
using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Typography.OpenFont;
namespace MyApp
{
class Program
{
static async Task Main(string[] args)
{
var fontName1 = GetRegistryFontName(@"C:\Windows\Fonts\arial.ttf");
var fontName2 = GetRegistryFontName(@"C:\Windows\Fonts\Sitka.ttc");
var fontName3 = GetRegistryFontName(@"C:\Windows\Fonts\simsun.ttc");
Console.WriteLine("Press a key to exit...");
Console.ReadKey();
}
static string GetRegistryFontName(string fontFile)
{
var fontReader = new OpenFontReader();
var fontInfo = fontReader.ReadPreview(File.OpenRead(fontFile));
var fontExtension = Path.GetExtension(fontFile).ToLower();
var fontTypeSuffix = (fontExtension == ".otc" || fontExtension == ".otf") ? "(OpenType)" : "(TrueType)";
if (fontExtension == ".otf" || fontExtension == ".ttf")
{
return $"{fontInfo.Name} {fontInfo.SubFamilyName} {fontTypeSuffix}";
}
else if (fontExtension == ".otc" || fontExtension == ".ttc")
{
var fontNames = fontInfo.Name.Split(",").Skip(1).ToArray();
var result = new StringBuilder(fontNames[0]);
foreach (var fontName in fontNames[1..^1])
{
result.Append($" & {fontName}");
}
result.Append($" & {fontNames[^1]} {fontTypeSuffix}");
return result.ToString();
}
return null;
}
}
}
И вот результат:
![](https://framapic.org/680rMqHLPfP3/M8Rmt7Bwn95o)
Это почти работает, но есть две проблемы:
- Имя для шрифта
arial.ttf
в реестре Arial (TrueType)
и Arial Normal (TrueType)
в моем результате. - Я получаю Азиатское имя для шрифта
simsun.ttc
с OpenFontReader
.
Вторая попытка
Я попытался с помощью fontview и пакета FlaUI .
using FlaUI.Core;
using FlaUI.Core.Tools;
using FlaUI.UIA3;
using System;
using System.Diagnostics;
using System.Threading.Tasks;
namespace MyApp
{
class Program
{
static async Task Main(string[] args)
{
var fontName1 = GetRegistryFontName(@"C:\Windows\Fonts\arial.ttf");
Console.WriteLine("Press a key to exit...");
Console.ReadKey();
}
static string GetRegistryFontName(string fontFile)
{
var psi = new ProcessStartInfo()
{
FileName = "fontview",
Arguments = fontFile
};
string fontName = null;
var app = Application.Launch(psi);
using (var automation = new UIA3Automation())
{
var window = Retry.WhileNull(() =>
app.GetMainWindow(automation),
TimeSpan.FromSeconds(10)
).Result;
window.SetTransparency(0);
window.Focus();
fontName = window.Title;
window.Close();
}
return fontName;
}
}
}
Результат еще более странный:
![](https://framapic.org/jktP4vq8cGDy/5IHaLg30Fd2L)
Шрифт Arial теперь является шрифтом OpenType. Спасибо Windows. :)
У вас есть решение для восстановления того же имени, что и в реестре?
Оно должно работать с любым шрифтом, даже внешним, и с. NET Core.