【问题标题】:Reading font file content in winrt在winrt中读取字体文件内容
【发布时间】:2015-11-05 03:43:12
【问题描述】:

如何从 WinRT 平台读取字体文件流?我需要从 C# UWP 获取字体文件内容。据您所知,没有办法直接从 Fonts 文件夹中读取文件。 FilePicker 也不适合我,因为选择此文件夹不是用户的责任。我找到了使用 DirectWrite (C++) 枚举字体名称的方法,然后用 C# (https://code.msdn.microsoft.com/FontExplorer-lets-you-f01d415e#content) 中可用的 COM 组件包装它,我想知道是否可以做类似的事情来将字体文件内容读取为字节 []还是流?

【问题讨论】:

  • 您具体要查找哪些字体信息?您将无法直接打开字体文件,但使用 DirectWrite,您可以访问很多详细信息。
  • 我需要 ttf 的所有字节。我正在写 PDF 导出,我需要嵌入字体。
  • 我不认为这是可行的。更不用说您需要考虑以这种方式分发(商业)字体的法律影响。再加上这些花哨的应用程序的全部建议是使它们独立并防止访问外部文件 afaik。最坏的情况...位图他们。 :)
  • 是的,如果他们提供api来读取字体会很棒。这样我就不必为此使用文件 api。在这种情况下,我的应用程序将是独立的,我会很高兴:)

标签: c# c++ fonts windows-runtime directwrite


【解决方案1】:

如果没有用户手动导航到文件,您无法直接从 UWP 应用读取 TTF 文件。 UWP 应用程序不允许在没有提示用户的情况下打开文件,除非它们位于特定位置。

另外,正如评论中提到的,许多字体在没有特殊许可的情况下不得分发或嵌入。

【讨论】:

  • 1.我知道直接读取文件是不可能的,我在我的问题 BTW 中提到了这一点。但是有没有机会在加载过程中捕获字体内容或使用本机代码加载字体内容?例如在 sharpdx 中有很多有趣的接口,如 FontFileLoader、factory.RegisterFontLoader。我认为限制对字体目录的读取权限没有任何意义。如果 microsoft 看到它,它必须提供替代 API 来获取字体,但现在没有 winrt api。
  • 2.检查字体是否允许分发并不是一个大表盘。此信息存储在 ttf 中,只需读取一口即可。所以,不用担心许可问题,如果你有 ttf 字节,这不是问题。
  • 3.在 Windows 窗体、WPF 中编写 PDF 导出是可以的,但我不明白在 WinRT 中实现它有什么不好。我的应用程序需要 PDF 导出,不实施它不是一个选项,因为有人认为没有必要访问字体。甚至字体枚举 API 在 winRT 中也不可用,这对于许多应用程序来说都是必需的。
  • 4. ios 应用程序也使用沙盒方法,并且有一种获取 ttf 文件的方法:读取 ttf 表数据,然后将其写入 ttf 文件。 gist.github.com/Jyczeal/1892760
【解决方案2】:

好消息:PDF 导出在 Windows 10 中没有多大意义。Windows 10 具有内置 PDF 打印机。所以,不如一石二鸟:实现打印,免费导出PDF。

【讨论】:

    【解决方案3】:

    假设您已经创建了IDWriteFontFile 实例,那么很容易读取任意文件片段:

    1. 使用IDwriteFontFile::GetReferenceKey(); 获取文件引用密钥。
    2. IDWriteFontFile::GetLoader();获取加载器接口
    3. 使用步骤 1 中的密钥创建带有 IDWriteFontFileLoader::CreateStreamFromKey() 的流实例。
    4. 使用IDWriteFontFileStream::ReadFileFragment/ReleaseFileFragment 从文件流读取到缓冲区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多