【问题标题】:PHP - Determine if a glyph exists in a given fontPHP - 确定给定字体中是否存在字形
【发布时间】:2015-07-09 05:35:18
【问题描述】:

我正在寻找在 PHP 中是否有一种方法可以确定字体中给定字符是否存在字形。

我的用例是这样的——我正在使用 Imagick 生成小图像——给定用户提供的信息,本质上是小的“徽章”,我真的很想支持完整的 Unicode,包括表情符号和诸如此类的东西。到目前为止,我有一些字体都很好地支持“类”字符(例如,我的“主要”字体是 Futura,我有用于表情符号和其他符号的 Symbola,我可能需要为东方字形),但它们没有足够的重叠,只能使用一种字体。

我看到post 表明商业 PDFlib 插件可以做到这一点,但如果可以的话,我想避免使用商业插件。我还看到 PECL PS 插件有 ps_symbol_name(),但这需要一个 AFM 文件,据我所知,我不能将它与多字节字体一起使用。

我已经在 Imagick 中处理了字体切换部分 - 我只需要知道如何以编程方式告诉它给定字符使用什么字体。谢谢!

【问题讨论】:

    标签: php unicode fonts truetype


    【解决方案1】:

    这是使用 PHP 检查给定字体 (OTF / TTF) 是否支持 UTF-8 字符的另一种解决方案。

    1. 从您的字体中提取所有支持的代码点列表
    2. 将您的字符/字符串转换为相应代码点列表
    3. 将字符串的代码点与支持的列表进行比较 根据您的字体确定代码点是否受支持

    我建议使用pdf-font-lib 之类的现有库从您的字体中提取支持的代码点列表。

    要将 UTF-8 字符串转换为代码点,您可以使用 this code snippet

    这是一个complete example,用于检查给定字符串的所有字母是否都被 OTF 字体支持。 (需要 php-font-lib,不包括字体)

    这种方法也可以用作检测用于呈现给定 UTF-8 字符串的最佳字体的简单方法的基础:

    1. 浏览所有现有字体
    2. 按百分比比较每种字体支持的字符对字符串的覆盖率
    3. 选择覆盖率最高的字体或默认字体作为后备字体

    【讨论】:

      【解决方案2】:

      根据您需要做的事情的复杂程度,看看https://github.com/pomax/php-font-parser,我出于同样的目的写了它(尽管使用gd而不是imagemagick)。

      请注意,仅支持 CMAP 4 和 12,其中包括 UCS-2 和 UCS-4。即使字体中存在更高的代码点也可能找不到(主要是因为当我写这个时,Unicode还没有被表情符号污染)。

      或者,您可以使用类似 Adob​​eFDK 的 tx 程序,通过 shell-exec 等针对您的字体运行它,以查看它是否找到字形定义,或者您可以通过 ttx 运行整个字体,将 CMAP 表的 XML 保存为自己的文件,然后对其进行检查(如果您的字体不太可能发生很大变化,这是一个非常可靠的解决方案)

      【讨论】:

      • 非常感谢!我确实最终选择了 ttx 路线,因为它似乎是最简单/处理器密集度最低的选项,因为我的字体每年最多更改一次。现在...解决当我从一种字体切换到另一种字体时的字距调整问题。 :/ 向您致敬,感谢您在 php-font-parser 上的工作 - 这绝对比我预期的要复杂。
      猜你喜欢
      • 2014-04-26
      • 2017-07-21
      • 2010-12-03
      • 2012-04-13
      • 1970-01-01
      • 2011-09-26
      • 2011-06-09
      • 1970-01-01
      • 2023-03-25
      相关资源
      最近更新 更多