我想将特定文本截断为特定宽度。我知道我将使用的字体和字体大小。我试图找出解决这个问题的最佳方法。 必须在服务器端完成。
据我所知,PHP中没有输出每个字符宽度的函数。我可以使用image *函数,但我不想创建图像,只是为了确定给定文本的宽度。
我想到的一个明显的解决方案是创建一个魔术宽度表,如:a - 16px,b - 14px等,但这听起来很可怕(很明显我无法通过整个范围给出文字的字符有)。
我想到的另一个解决方案是通过Cufón将TTF转换为json,然后使用该参考文件截断给定的文本,但这听起来像是一种迂回的做事方式。如果我没记错的话,Cufón(和其他转换器)使用Batik来生成SVG参考,并且使用它作为一个步骤也是不可能的。
我是否必须在PHP中编写自己的hmtx table parsing实现,或者是否可以使用某些实现?
答案 0 :(得分:3)
如果您可以在PHP安装中使用ImageMagick,那么Imagick::queryFontMetrics(以及其他一些相关的字体函数)应该可以帮到您。链接页面上的示例几乎完全符合您的要求:基本上,您设置字体& size,然后将一个字符串传递给queryFontMetrics。它返回许多指标,其中一个是textWidth,您可以使用它来确定您是否在指定的宽度范围内。
您可能需要在给定字符串上进行一些传递以使其正确。尽管使用完整的字符串很重要(而不是简单地加上字符的宽度),因为字体内部的数据会导致宽度之间的差异,例如“AV”与“A”和“A”的总宽度相比V”。
正如我在评论中提到的,在各种平台和浏览器上,您的服务器与客户端之间也可能存在差异,因此我建议采用某种容错,特别是在较小的字体大小,差异很可能是夸张了。
答案 1 :(得分:1)
与djanodude的答案类似,但GD库也具有相同的功能,GD通常安装在PHP服务器上。
您需要的功能是imagettfbbox
(TTF字体的图像边界框)。 http://php.net/manual/en/function.imagettfbbox.php
这为您提供了给定TrueType字体(以像素为单位)的文本角,从这里您可以计算出屏幕上的像素。
与djanodude关于服务器和客户端之间的细微差别的答案中提到的相同的限制。另一个问题是True Type字体可能与您在服务器上读取的TTF不同,可能与客户端计算机上的TTF不同。
另一个警告:GD库可能是内存饥饿。如果运行它没有问题,您可能希望缓存结果(以节省不必要的处理)和用户ini_set('memory_limit','128M');
。