Таблицы переполнения текста при создании PDF с помощью dompdf

alt text

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

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

есть идеи?


person Dominic    schedule 05.02.2010    source источник


Ответы (2)


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

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

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

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

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-адреса).

person BrianS    schedule 26.02.2010
comment
Поддерживает анонимный для дополнительного местоположения RegEx. - person BrianS; 30.09.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));
person user1955103    schedule 30.09.2015
comment
Не знаю, почему ваше редактирование было отклонено. Вроде приемлемая модификация. - person BrianS; 30.09.2015