有没有办法在我的WPF应用程序中使用ODTTF字体文件?

有没有办法在我的WPF应用程序中使用ODTTF字体文件?,wpf,resources,fonts,xps,Wpf,Resources,Fonts,Xps,创建XPS文件时,它会将原始文档的字体子集和模糊处理为ODTTF字体文件,并将其捆绑到XPS文件中(XPS文件只是一个zip文件,因此易于提取) 我提取了其中一个ODTTF文件,并将其作为资源包含在我的WPF应用程序中 我现在尝试将其用作文本块的FontFamily。我尝试了各种URI字符串来引用XAML中的ODTTF字体,但我根本无法让它工作。(我可以使用常规TTF文件,但不能使用ODTTF) 有办法做到这一点吗?我在一些谷歌搜索中发现了证据,证明人们正设法做到这一点 ODTTF文件被混淆。要

创建XPS文件时,它会将原始文档的字体子集和模糊处理为ODTTF字体文件,并将其捆绑到XPS文件中(XPS文件只是一个zip文件,因此易于提取)

我提取了其中一个ODTTF文件,并将其作为资源包含在我的WPF应用程序中

我现在尝试将其用作文本块的FontFamily。我尝试了各种URI字符串来引用XAML中的ODTTF字体,但我根本无法让它工作。(我可以使用常规TTF文件,但不能使用ODTTF)


有办法做到这一点吗?我在一些谷歌搜索中发现了证据,证明人们正设法做到这一点

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);
        }
    }
}
void deobfouscatefont(XpsFont字体,字符串outname)
{
使用(Stream stm=font.GetStream())
{
使用(FileStream fs=newfilestream(outname,FileMode.Create))
{
字节[]dta=新字节[stm.Length];
stm.Read(dta,0,dta.Length);
如果(字体已模糊化)
{
字符串guid=新guid(font.Uri.GetFileName().Split('.')[0])。ToString(“N”);
字节[]guidBytes=新字节[16];
for(int i=0;i
以这种方式写入.TTF文件后,您可以使用字体。请注意,XPS文件中的字体是子集,仅包含XPS文件中实际使用的字符,因此它们在MS Word中用作字体时不会有用