работает ли PrivateFontCollection.AddMemoryFont с файлами WOFF?

Я пытаюсь написать веб-приложение, которое должно получить ссылку на шрифт и вернуть изображение чего-либо, написанного в формате отправленного шрифта.

Я открываю поток, который читает файл шрифта, и отправляю InPtr файла в PrivateFontCollection.AddMemoryFont, чтобы я мог использовать его позже с некоторым графическим объектом. Все работает хорошо, когда я использую действительный файл .ttf, но всякий раз, когда я пытаюсь использовать файлы шрифтов .woff, я получаю «System.IO.FileNotFoundException: File not found» для строки AddMemoryFont, хотя я вижу, что файл был читать без ошибок.

Я попытался использовать онлайн-конвертер для преобразования файла .woff в .ttf, и когда я запустил свой код в новом файле .ttf, он работал отлично.

Есть ли проблема с использованием файлов .woff или мне нужно что-то изменить, чтобы все заработало?

WebClient client = new WebClient();
Stream stream = client.OpenRead("http://www.drivehq.com/file/df.aspx/shareID2129391/fileID59377155/arial.ttf"); // Works fine.
//Stream stream = client.OpenRead("http://themes.googleusercontent.com/static/fonts/kiteone/v1/VNHoD96LpZ9rGZTwjozAOvesZW2xOQ-xsNqO47m55DA.woff"); // Doesn't work.
PrivateFontCollection fonts;
FontFamily family = LoadFontFamily(stream, out fonts);

public static FontFamily LoadFontFamily(Stream stream, out PrivateFontCollection fontCollection)
{
    byte[] buffer = null;
    using (MemoryStream ms = new MemoryStream())
    {
        int count = 0;
        do
        {
            byte[] buf = new byte[1024];
            count = stream.Read(buf, 0, 1024);
            ms.Write(buf, 0, count);
        } while (stream.CanRead && count > 0);
        buffer = ms.ToArray();
    }

    var handle = System.Runtime.InteropServices.GCHandle.Alloc(buffer, System.Runtime.InteropServices.GCHandleType.Pinned);

    try
    {
        var ptr = System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0);
        fontCollection = new PrivateFontCollection();
        fontCollection.AddMemoryFont(ptr, buffer.Length);
        return fontCollection.Families[0];
    }
    finally
    {
        handle.Free();
    }
}

person modz0r    schedule 13.11.2012    source источник
comment
Это должен быть файл TTF, зачеркните WOFF.   -  person Hans Passant    schedule 13.11.2012
comment
Ну, это мой вопрос. есть ли способ использовать WOFF, или нет никакого способа? (кроме конвертации файла, конечно)   -  person modz0r    schedule 14.11.2012


Ответы (1)


.NET Framework не поддерживает импорт шрифтов WOFF, как и Windows XP/Vista/7/8.

Вам нужно будет преобразовать его в TTF с помощью внешнего инструмента и импортировать TTF.

person Robin Rodricks    schedule 05.03.2013