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

发布于 2024-12-05 18:30:23 字数 299 浏览 1 评论 0原文

创建 XPS 文件时,它会将原始文档的字体子集化并混淆为 ODTTF 字体文件,并将它们捆绑在 XPS 文件中(这只是一个 zip 文件,因此很容易提取它们。)

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

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

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

When an XPS file is created, it subsets and obfuscates the original document's fonts as ODTTF font files, and bundles them in the XPS file (which is just a zip file, so they are easily extracted.)

I've extracted one of these ODTTF files, and included it as a Resource in my WPF app.

I'm now trying to use it as the FontFamily of a TextBlock. I tried various URI strings to reference the ODTTF font in my XAML, but I can't get it to work at all. (I can get a regular TTF file to work, just not an ODTTF)

Is there a way to do this? I've found evidence in a few Google searches that people are managing to do this!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

阳光下慵懒的猫 2024-12-12 18:30:23

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 等中用作字体。

ODTTF files are obfuscated. To use them as TTF you must deobfuscate them. You can use this code:

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);
        }
    }
}

Once written to a .TTF file this way you can use the font. Note that the fonts in XPS files are subsets, only containing those characters actually used in the XPS file, so they won't be useful to use in, say, MS-Word as a font.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文