Teste se a fonte é instalada
Pergunta
Existe uma maneira fácil (em .net) para testar se uma fonte é instalado na máquina atual?
Solução
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
}
}
Outras dicas
Como você recebe uma lista de todas as fontes instaladas?
var fontsCollection = new InstalledFontCollection();
foreach (var fontFamiliy in fontsCollection.Families)
{
if (fontFamiliy.Name == fontName) ... \\ installed
}
Consulte InstalledFontCollection classe para detalhes .
Graças a Jeff, eu li melhor a documentação da classe Font:
Se o parâmetro familyName especifica uma fonte que não está instalado na máquina executando o aplicativo ou não é suportado, Microsoft Sans Serif será substituído.
O resultado deste conhecimento:
private bool IsFontInstalled(string fontName) {
using (var testFont = new Font(fontName, 8)) {
return 0 == string.Compare(
fontName,
testFont.Name,
StringComparison.InvariantCultureIgnoreCase);
}
}
Outras respostas proposto usando a criação Font
só funcionam se o FontStyle.Regular
está disponível. Algumas fontes, por exemplo Verlag Negrito, não tem um estilo regular. Criação falharia com exceção Fonte 'Verlag Negrito' não suporta estilo 'regular' . Você precisa verificar se há estilos que sua aplicação vai exigir. A solução seguinte:
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;
}
Saindo de resposta GVS':
private static bool IsFontInstalled(string fontName)
{
using (var testFont = new Font(fontName, 8))
return fontName.Equals(testFont.Name, StringComparison.InvariantCultureIgnoreCase);
}
Aqui está como eu faria isso:
private static bool IsFontInstalled(string name)
{
using (InstalledFontCollection fontsCollection = new InstalledFontCollection())
{
return fontsCollection.Families
.Any(x => x.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase));
}
}
Uma coisa a nota com este é que a propriedade Name
nem sempre é o que você esperaria de olhar em C: \ WINDOWS \ Fonts. Por exemplo, eu tenho uma fonte instalada chamado de "árabe Typsetting Regular". IsFontInstalled("Arabic Typesetting Regular")
retornará falso, mas IsFontInstalled("Arabic Typesetting")
retornará verdadeiro. ( "Árabe Typesetting" é o nome da fonte na ferramenta de visualização de fontes do Windows').
Quanto aos recursos ir, eu corri um teste onde eu chamado este método várias vezes, e o teste terminou em apenas alguns milissegundos de cada vez. Minha máquina é um pouco dominado, mas a menos que você precisa para executar essa consulta muito frequentemente parece que o desempenho é muito bom (e mesmo se você fez, isso é o que o cache é para).