Подтвердить что ты не робот

Проверьте, установлен ли шрифт

Есть ли простой способ (в .Net) проверить, установлен ли шрифт на текущем компьютере?

4b9b3361

Ответ 1

string fontName = "Consolas";
float fontSize = 12;

using (Font fontTester = new Font( 
       fontName, 
       fontSize, 
       FontStyle.Regular, 
       GraphicsUnit.Pixel)) 
{
    if (fontTester.Name == fontName)
    {
        // Font exists
    }
    else
    {
        // Font doesn't exist
    }
}

Ответ 3

Благодаря Джеффу, я лучше прочитал документацию класса Font:

Если параметр familyName указывает шрифт, который не установлен на машине, на которой выполняется приложение или не поддерживается, Microsoft Sans Сериф будет заменен.

Результат этого знания:

    private bool IsFontInstalled(string fontName) {
        using (var testFont = new Font(fontName, 8)) {
            return 0 == string.Compare(
              fontName,
              testFont.Name,
              StringComparison.InvariantCultureIgnoreCase);
        }
    }

Ответ 4

Другие ответы, предлагаемые с использованием создания Font, работают только в том случае, если доступен FontStyle.Regular. Некоторые шрифты, например, Verlag Bold, не имеют обычного стиля. Создание завершится сбоем с исключением Font 'Verlag Bold' не поддерживает стиль 'Regular'. Вам нужно будет проверить стили, которые потребуются вашему приложению. Решение:

  public static bool IsFontInstalled(string fontName)
  {
     bool installed = IsFontInstalled(fontName, FontStyle.Regular);
     if (!installed) { installed = IsFontInstalled(fontName, FontStyle.Bold); }
     if (!installed) { installed = IsFontInstalled(fontName, FontStyle.Italic); }

     return installed;
  }

  public static bool IsFontInstalled(string fontName, FontStyle style)
  {
     bool installed = false;
     const float emSize = 8.0f;

     try
     {
        using (var testFont = new Font(fontName, emSize, style))
        {
           installed = (0 == string.Compare(fontName, testFont.Name, StringComparison.InvariantCultureIgnoreCase));
        }
     }
     catch
     {
     }

     return installed;
  }

Ответ 5

Отключение ответа GvS:

    private static bool IsFontInstalled(string fontName)
    {
        using (var testFont = new Font(fontName, 8))
            return fontName.Equals(testFont.Name, StringComparison.InvariantCultureIgnoreCase);
    }

Ответ 6

Вот как бы я это сделал:

private static bool IsFontInstalled(string name)
{
    using (InstalledFontCollection fontsCollection = new InstalledFontCollection())
    {
        return fontsCollection.Families
            .Any(x => x.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase));
    }
}

Следует отметить, что свойство Name не всегда является тем, что вы ожидаете от просмотра в C:\WINDOWS\Fonts. Например, у меня установлен шрифт, называемый "Арабский типсеттинг". IsFontInstalled("Arabic Typesetting Regular") вернет false, но IsFontInstalled("Arabic Typesetting") вернет значение true. ( "Арабский набор" - это название шрифта в средстве предварительного просмотра шрифтов Windows.)

Что касается ресурсов, я провел тест, где я вызывал этот метод несколько раз, и тест заканчивался всего за несколько миллисекунд каждый раз. Моя машина немного перегружена, но если вам не нужно будет запускать этот запрос очень часто, кажется, что производительность очень хорошая (и даже если вы это сделали, для чего используется кеширование).