PHP - 判断给定字体中是否存在特定字形

3
我想知道在PHP中是否有一种方法可以确定字体中给定字符的字形是否存在。我的用例是这样的 - 我正在使用Imagick生成小图像,基本上是提供用户信息的小“徽章”,我真的很想支持完整的Unicode,包括表情符号等。目前,我有一些字体非常适合支持某些类别的字符(例如,我的“主”字体是Futura,我有Symbola用于表情符号和其他符号,我可能需要添加另一个字体用于东方字符),但它们没有足够的重叠以仅使用一个字体。我看到了post建议商业PDFlib附加组件可以做到这一点,但如果可以的话,我想避免商业附加组件。我还看到PECL PS附加组件具有ps_symbol_name(),但这需要一个AFM文件,并且据我所知,我无法将其与多字节字体一起使用。
我已经处理了Imagick中的字体切换部分 - 我只需要知道如何以编程方式告诉它对于给定字符使用哪个字体。谢谢!
2个回答

4
这里有另一种使用PHP检查给定字体(OTF / TTF)是否支持UTF-8字符的解决方案。
1. 从字体中提取所有支持的代码点列表。 2. 将您的字符/字符串转换为相应代码点的列表。 3. 将您字符串的代码点与字体支持的代码点列表进行比较,以确定它们是否被支持。
我建议使用现有库(如pdf-font-lib)从字体中提取所有支持的代码点列表。
要将您的UTF-8字符串转换为代码点,您可以使用this code snippet
这是一个完整示例,用于检查给定字符串的所有字母是否由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尚未被表情符号污染)。或者,您可以使用类似AdobeFDK的tx程序,通过shell-exec或类似方法运行它来查看是否找到字形定义,或者运行整个字体通过ttx,将CMAP表的XML保存为自己的文件,然后只需对其运行检查(如果您的字体不太可能经常更改,则这是非常可靠的解决方案)。

非常感谢!我最终选择了ttx路线,因为它似乎是最简单/处理器负荷最小的选项,考虑到我的字体最多每年更改一次。现在...要解决当我从一种字体切换到另一种字体时的字距问题。 :/ 向您致敬,感谢您在php-font-parser上的工作-这肯定比我预期的要复杂得多。 - csyria

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接