PHP - 确定给定字体中是否存在字形

PHP - Determine if a glyph exists in a given font

我想看看在 PHP 中是否有一种方法可以确定字体中给定字符的字形是否存在。

我的用例是这样的——我正在使用 Imagick 生成小图像——本质上是小图像 "badges" 给定用户提供的信息,我真的很想支持完整的 Unicode,包括表情符号和诸如此类的东西。截至目前,我有一些字体,每种字体都很好地支持 "class" 个字符(例如,我的 "main" 字体是 Futura,我有用于表情符号和其他符号的 Symbola,我可能需要为东方字形添加另一种字体),但它们没有足够的重叠来仅使用一种字体。

我看到 post 表明商业 PDFlib 附加组件可以做到这一点,但我想尽可能避免使用商业附加组件。我还看到 PECL PS 附加组件具有 ps_symbol_name(),但这需要 AFM 文件,据我所知,我不能将其用于多字节字体。

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

根据您需要执行的操作的复杂性,请查看我出于相同目的而编写的 https://github.com/pomax/php-font-parser(尽管使用 gd 而不是 imagemagick)。

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

或者,您可以使用类似 Adob​​eFDK 的 tx program, running it against your font through shell-exec or the like, to see if it finds a glyph definition, or you can run the entire font through ttx,将 CMAP table 的 XML 保存为自己的文件,然后 运行 您的支票反对那个(如果你的字体不太可能改变很多,这是一个非常可靠的解决方案)

这是使用 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. 选择覆盖率最高的字体或默认字体作为后备