gd-text PHP-библиотека не переносит текст в поле - PullRequest
0 голосов
/ 13 октября 2018

Я использую PHP-библиотеку gd-text для рисования текста на изображении

Она работает, но текст не переносится в границу, которую я установил, если я неЧтобы предоставить пробелы, вот мой код:

$textbox = new Box($img);
$textbox->setFontSize(20);
$textbox->setFontFace('arial.ttf');
$textbox->setFontColor(new Color(255,0,0));
$textbox->setBox(
   10,  // distance from left edge
   10,  // distance from top edge
   10, // textbox width
   10  // textbox height
);
$textbox->setTextAlign('center', 'top');
$textbox->draw("my text my text my text my text my text my text");

Текст переносится правильно, но если я не вставляю пробелы, это не так.Текст просто выходит за рамки.В документации не объясняется, как принудительно переносить текст, даже если отсутствуют пробелы

1 Ответ

0 голосов
/ 14 октября 2018

Библиотека разбивается только на пробелы, однако это довольно просто, я внес изменение, которое будет нарушаться всякий раз, когда вы превышаете ширину поля, если в вашей входной строке нет пробелов.Это изменение будет применяться только в том случае, если во всей строке нет пробелов.В идеале должен быть режим, который будет переноситься без переполнения.Это было бы довольно легко добавить.Вы также можете добавить символ для вставки, когда в середине слова произойдет разрыв.

Замените метод wrapTextWithOverflow в классе Box следующим:

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;
}
...