Load family (and not typeface) name from font in f

2019-06-24 02:20发布

问题:

I'm loading fonts from the filesystem .

generally my code works very well, but as i load the fonts through a PrivateFontCollection the name of the loaded FontFamily is the name of the TypeFace in the font (what i can see under Typeface name in the Font previewer of windows) and not the FontFamily name...

As i have some fonts which have the same Typeface name but another font name i would like to be able to distinguish between them. Anyone has a idea how to get the real FontFamily name?

    public Dictionary<string, FontFamily> LoadFontsFromDirectory(string path)
    {
        Dictionary<string, FontFamily> foundFonts = new Dictionary<string, FontFamily>();

        if (!Directory.Exists(path)) throw new Exception("directory doesnt exist");

        foreach(FileInfo fi in new DirectoryInfo(path).GetFiles("*.ttf"))
        {
            PrivateFontCollection fileFonts = new PrivateFontCollection();
            fileFonts.AddFontFile(fi.FullName);
            if (!foundFonts.ContainsKey(fileFonts.Families[0].Name))
            {
                //add the font only if this fontfamily doesnt exist yet
                FontFamily family = new FontFamily(String.Format("file:///{0}#{1}", fi.FullName, fileFonts.Families[0].Name));
                foundFonts.Add(family.Name, family);
            }
        }

        return foundFonts;
    }

回答1:

If you want to get the FontFamily as opposed to the value in fileFonts.Families[0].Name, you'll find it in family.FamilyNames by culture:

FontFamily family = new FontFamily(String.Format("file:///{0}#{1}", fi.FullName, fileFonts.Families[0].Name));
Console.WriteLine("\tFamilySource: {0}", family.Source);
foreach (var x in family.FamilyNames)
{
    Console.WriteLine("\tFamilyName: {0}", x);  // <------ HERE
}
foreach (var y in family.FamilyTypefaces)
{
    foreach (var z in y.AdjustedFaceNames)
    {                            
        Console.WriteLine("\tTypeface: {0}",z);
    }
}

Sample output:

Arial
    FamilySource: file:///C:\Users\tim\Desktop\arial.ttf#Arial
    FamilyName: [en-us, Arial]
    Typeface: [en-us, Regular]
    Typeface: [en-us, Bold]
    Typeface: [en-us, Bold Oblique]
    Typeface: [en-us, Oblique]
Arial
    FamilySource: file:///C:\Users\tim\Desktop\arialbd.ttf#Arial
    FamilyName: [en-us, Arial]
    Typeface: [en-us, Bold]
    Typeface: [en-us, Bold Oblique]
Arial
    FamilySource: file:///C:\Users\tim\Desktop\arialbi.ttf#Arial
    FamilyName: [en-us, Arial]
    Typeface: [en-us, Bold Italic]
Arial
    FamilySource: file:///C:\Users\tim\Desktop\ariali.ttf#Arial
    FamilyName: [en-us, Arial]
    Typeface: [en-us, Italic]
    Typeface: [en-us, Bold Italic]
Arial Narrow
    FamilySource: file:///C:\Users\tim\Desktop\ARIALN.TTF#Arial Narrow
    FamilyName: [en-us, Arial]
    Typeface: [en-us, Condensed]
    Typeface: [en-us, Condensed Bold]
    Typeface: [en-us, Condensed Bold Oblique]
    Typeface: [en-us, Condensed Oblique]
Arial Narrow
    FamilySource: file:///C:\Users\tim\Desktop\ARIALNB.TTF#Arial Narrow
    FamilyName: [en-us, Arial]
    Typeface: [en-us, Condensed Bold]
    Typeface: [en-us, Condensed Bold Oblique]
Arial Narrow
    FamilySource: file:///C:\Users\tim\Desktop\ARIALNBI.TTF#Arial Narrow
    FamilyName: [en-us, Arial]
    Typeface: [en-us, Condensed Bold Italic]
Arial Narrow
    FamilySource: file:///C:\Users\tim\Desktop\ARIALNI.TTF#Arial Narrow
    FamilyName: [en-us, Arial]
    Typeface: [en-us, Condensed Italic]
    Typeface: [en-us, Condensed Bold Italic]
Arial Black
    FamilySource: file:///C:\Users\tim\Desktop\ariblk.ttf#Arial Black
    FamilyName: [en-us, Arial]
    Typeface: [en-us, Black]
    Typeface: [en-us, Black Oblique]

That said, your note that "i have some fonts which have the same Typeface name but another font name and i would like to be able to distinguish between them" suggests that FontFamily is not what you are actually looking for.



标签: c# fonts