gpt4 book ai didi

php - Zend_Pdf 计算当前字体中文本字符串的长度以进行换行

转载 作者:行者123 更新时间:2023-12-02 03:07:10 24 4
gpt4 key购买 nike

有没有人有一种简单的方法来计算一段文本在特定字体和大小下将在页面上消耗多少个点? (简单=最少的代码行+计算成本低)。 Zend_Pdf 似乎没有执行此操作的函数,除了对每个字符进行一些非常昂贵的调用 getGlyphForCharacter()、getUnitsPerEm() 和 getWidthsForGlyph() 之外。

我正在生成一个多页 PDF,每页上有多个表格,并且需要将文本换行到各列中。创建它已经花了几秒钟,我不希望它花太长时间,否则我将不得不开始摆弄后台任务或进度条等。

我想出的唯一解决方案是预先计算所使用的每种字体大小中每个字符的宽度(以磅为单位),然后将它们加到每个字符串上。仍然相当昂贵。

我错过了什么吗?或者你还有更简单的吗?

谢谢!

最佳答案

有一种方法可以精确计算宽度,而不是使用 Gorilla3D's worst case algorithm .

试试 http://devzone.zend.com/article/2525-Zend_Pdf-tutorial#comments-2535 中的代码

我在我的应用程序中使用它来计算右对齐文本的偏移量,并且它有效

/**
* Returns the total width in points of the string using the specified font and
* size.
*
* This is not the most efficient way to perform this calculation. I'm
* concentrating optimization efforts on the upcoming layout manager class.
* Similar calculations exist inside the layout manager class, but widths are
* generally calculated only after determining line fragments.
*
* @link http://devzone.zend.com/article/2525-Zend_Pdf-tutorial#comments-2535
* @param string $string
* @param Zend_Pdf_Resource_Font $font
* @param float $fontSize Font size in points
* @return float
*/
function widthForStringUsingFontSize($string, $font, $fontSize)
{
$drawingString = iconv('UTF-8', 'UTF-16BE//IGNORE', $string);
$characters = array();
for ($i = 0; $i < strlen($drawingString); $i++) {
$characters[] = (ord($drawingString[$i++]) << 8 ) | ord($drawingString[$i]);
}
$glyphs = $font->glyphNumbersForCharacters($characters);
$widths = $font->widthsForGlyphs($glyphs);
$stringWidth = (array_sum($widths) / $font->getUnitsPerEm()) * $fontSize;
return $stringWidth;
}

关于性能,我没有在脚本中大量使用它,但我可以想象它很慢。如果可能的话,我建议将 PDF 写入磁盘,这样重复查看速度非常快,并尽可能缓存/硬编码数据。

关于php - Zend_Pdf 计算当前字体中文本字符串的长度以进行换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1283555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com