【发布时间】:2011-01-13 09:18:41
【问题描述】:
我正在使用 dompdf 生成一些 PDF,其中包含表格中的一些文本和图像。但是,如果文本中有一个很大的 URL,则 URL 会一直换行到行尾。所有的文字和网址都包裹在一个固定宽度和高度的div中,但网址仍然溢出。
在浏览器中呈现相同的 HTML 似乎没问题。
有什么想法吗?
【问题讨论】:
我正在使用 dompdf 生成一些 PDF,其中包含表格中的一些文本和图像。但是,如果文本中有一个很大的 URL,则 URL 会一直换行到行尾。所有的文字和网址都包裹在一个固定宽度和高度的div中,但网址仍然溢出。
在浏览器中呈现相同的 HTML 似乎没问题。
有什么想法吗?
【问题讨论】:
我相信 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)。
【讨论】:
打开文件 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));
【讨论】: