Лучшим решением было бы использовать собственную функцию переноса слов, поскольку FPDF не будет обрезать слова, поэтому вам не нужно полагаться на разрыв строки MultiCell.
Я написал метод, который проверяет каждую подстроку текста, является ли getStringWidth FPDF больше ширины столбца, и разделяется соответствующим образом.
Это замечательно, если вам важнее красивый макет PDF, чем производительность.
public function wordWrapMultiCell($text, $cellWidth = 80) {
$explode = explode("\n", $text);
array_walk($explode, 'trim');
$lines = [];
foreach($explode as $split) {
$sub = $split;
$char = 1;
while($char <= strlen($sub)) {
$substr = substr($sub, 0, $char);
if($this->pdf->getStringWidth($substr) >= $cellWidth - 1) { // -1 for better getStringWidth calculating
$pos = strrpos($substr, " ");
$lines[] = substr($sub, 0, ($pos !== FALSE ? $pos : $char)).($pos === FALSE ? '-' : '');
if($pos !== FALSE) { //if $pos returns FALSE, substr has no whitespace, so split word on current position
$char = $pos + 1;
$len = $char;
}
$sub = ltrim(substr($sub, $char));
$char = 0;
}
$char++;
}
if(!empty($sub)) {
$lines[] = $sub;
}
}
return $lines;
}
Возвращает массив текстовых строк, которые можно объединить, используя implode / join:
join("\r\n", $lines);
И для чего он вообще использовался, получим высоту строки:
$lineHeight = count($lines) * $multiCellLineHeight;
Это работает только для строк с пробелом, без пробелов, как табуляции. Тогда вы можете заменить strpos функцией регулярного выражения.