Таблицы с переполнением текста при создании PDF с dompdf - PullRequest
5 голосов
/ 05 февраля 2010

alt text

Я создаю несколько PDF-файлов с помощью dompdf, который содержит текст и изображения в таблице. Но если в тексте есть большой URL, он переносится до конца строки. Весь текст и URL обернуты в div с фиксированной шириной и высотой, но URL по-прежнему переполняется.

Тот же HTML-код, отображаемый в браузере, выглядит нормально.

Есть мысли?

Ответы [ 2 ]

3 голосов
/ 27 февраля 2010

Я считаю, что DOMPDF использует довольно ограниченный набор символов для определения того, как разбить строку. Прямо сейчас это только разделяет линию в тире или пробел. Таким образом, что-то вроде URL в вашем образце будет превышать ширину контейнера. DOMPDF просто не знает, как его разбить.

Начиная с dompdf v0.6.0, вы можете стилизовать ваш текст так, чтобы слова были разбиты на любой символ, например ::

<span style="word-wrap: break-word;">http://example.com/really/long/.../url</span>

Это не так чисто, как разбить на конкретного персонажа (например, /). Если вам удобно взламывать код, вы можете обойти эту проблему немного более элегантно. Откройте текстовый класс reflower и измените регулярное выражение, которое разделяет строку. Регулярное выражение выглядит следующим образом:

preg_split('/([\s-]+)/u', $text, -1, PREG_SPLIT_DELIM_CAPTURE)

Измените этот код так, чтобы он включал любые дополнительные символы, которые, по вашему мнению, помогут сделать хороший разрыв строки Например, вы можете разбить URL-адреса на?, & Или даже /, если вы ожидаете, что в вашем тексте будут очень длинные URL-адреса:

$words = preg_split('/([\s-\?\&\/]+)/u', $text, -1, PREG_SPLIT_DELIM_CAPTURE);

В dompdf 0.6.1 RegEx можно найти в строках dompdf / include / text_frame_reflower.cls.php 86 и 371. В следующих версиях 0.7.0 RegEx можно найти в строках dompdf / src / FrameReflower / Text.php. 106 и 402.

Недостатком модификации RegEx является то, что это повлияет на весь текст (не только на URL).

1 голос
/ 30 сентября 2015

Откройте файл dompdf / include / text_frame_reflower.cls.php и начертите строку, которая выглядит следующим образом:

$words = preg_split('/([\s-]+)/u', $text, -1, PREG_SPLIT_DELIM_CAPTURE);

Измените регулярное выражение так, чтобы оно включало любые дополнительные символы, которые, по вашему мнению, сделают хороший разрыв строки. Например, вы можете разбить URL-адреса на ? , & или даже / , если ожидаете, что в вашем тексте будут слишком длинные URL-адреса:

$words = preg_split('/([\s-\?\&\/]+)/u', $text, -1, PREG_SPLIT_DELIM_CAPTURE);

Также замените следующую строку

$words = array_flip(preg_split("/[\s-]+/u",$str, -1, PREG_SPLIT_DELIM_CAPTURE));

с

$words = array_flip(preg_split('/([\s-\?\&\/]+)/u', $str, -1, PREG_SPLIT_DELIM_CAPTURE));
...