gd-text PHP库不会在框中包装文本

时间:2018-10-13 10:17:22

标签: php gd

我正在使用gd-text PHP库在图像上绘制文本

它可以工作,但是如果不提供空格,则文本不会在我设置的边界框中自动换行,这是我的代码:

map

文本正确换行,但是如果我不插入任何空格,则不会。文字一直在框外。该文档没有说明即使没有空格也如何强制文本换行

1 个答案:

答案 0 :(得分:1)

该库仅在空格处中断,但是非常简单,如果输入字符串中没有空格,则我所做的更改将在您超出框的宽度时中断。仅当整行没有空格时,此更改才适用。理想情况下,应该有一个不会溢出的模式。这将很容易添加。您可能还想添加一个字符,以在单词中间出现中断时插入。

使用以下方法替换Box类中的wrapTextWithOverflow方法:

protected function wrapTextWithOverflow($text)
{
    $lines = array();
    // Split text explicitly into lines by \n, \r\n and \r
    $explicitLines = preg_split('/\n|\r\n?/', $text);
    foreach ($explicitLines as $line) {
        // Check every line if it needs to be wrapped
        if((strpos($line, ' ')))
        {
            $words = explode(" ", $line);
            $line = $words[0];

            for ($i = 1; $i < count($words); $i++) {
                $box = $this->calculateBox($line." ".$words[$i]);
                if (($box[4]-$box[6]) >= $this->box['width']) {
                    $lines[] = $line;
                    $line = $words[$i];
                } else {
                    $line .= " ".$words[$i];
                }
            }
        }
        else
        {
            //If there are no spaces, append each character and create a new line when an overrun occurs
            $string = $line;
            $line = $string[0];

            for ($i = 1; $i < strlen($string); $i++) {
                $box = $this->calculateBox($line.$string[$i]);
                if (($box[4]-$box[6]) >= $this->box['width']) {
                    $lines[] = $line;
                    $line = $string[$i];
                } else {
                    $line .= $string[$i];
                }
            }
        }

        $lines[] = $line;
    }
    return $lines;
}