Есть ли способ использовать файл шрифта ODTTF в моем приложении WPF? - PullRequest
5 голосов
/ 22 сентября 2011

Когда создается файл XPS, он устанавливает и скрывает шрифты исходного документа как файлы шрифтов ODTTF и связывает их в файл XPS (который является просто файлом zip, поэтому их легко извлечь).

Я извлек один из этих файлов ODTTF и включил его в качестве ресурса в мое приложение WPF.

Я сейчас пытаюсь использовать его как FontFamily для TextBlock. Я пробовал различные строки URI для ссылки на шрифт ODTTF в моем XAML, но я не могу заставить его работать вообще. (Я могу заставить работать обычный файл TTF, но не ODTTF)

Есть ли способ сделать это? В нескольких поисках в Google я нашел доказательства того, что людям удается это сделать!

1 Ответ

9 голосов
/ 23 сентября 2011

ODTTF файлы обфусцированы.Чтобы использовать их в качестве TTF, вы должны деобфусцировать их.Вы можете использовать этот код:

void DeobfuscateFont(XpsFont font, string outname)
{
    using (Stream stm = font.GetStream())
    {
        using (FileStream fs = new FileStream(outname, FileMode.Create))
        {
            byte[] dta = new byte[stm.Length];
            stm.Read(dta, 0, dta.Length);
            if (font.IsObfuscated)
            {
                string guid = new Guid(font.Uri.GetFileName().Split('.')[0]).ToString("N");
                byte[] guidBytes = new byte[16];
                for (int i = 0; i < guidBytes.Length; i++)
                    guidBytes[i] = Convert.ToByte(guid.Substring(i * 2, 2), 16);

                for (int i = 0; i < 32; i++)
                {
                    int gi = guidBytes.Length - (i % guidBytes.Length) - 1;
                    dta[i] ^= guidBytes[gi];
                }
            }
            fs.Write(dta, 0, dta.Length);
        }
    }
}

После записи в файл .TTF вы можете использовать шрифт.Обратите внимание, что шрифты в файлах XPS являются подмножествами, содержащими только те символы, которые фактически используются в файле XPS, поэтому их не будет полезно использовать, например, в MS-Word в качестве шрифта.

...