使用dompdf生成PDF时,文本溢出表格

6

alt text

我正在使用dompdf生成一些PDF文件,其中包含表格中的一些文本和图像。但是,如果文本中有一个很长的URL,URL会一直换行到行的末尾。所有文本和URL都被包裹在具有固定宽度和高度的div中,但URL仍然溢出。

在浏览器中呈现的相同HTML似乎没有问题。

有什么想法吗?

2个回答

3

我相信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中,正则表达式可以在dompdf/include/text_frame_reflower.cls.php的第86行和第371行找到。在即将发布的0.7.0中,正则表达式可以在dompdf/src/FrameReflower/Text.php的第106行和第402行找到。
修改正则表达式的缺点是会影响所有文本(而不仅仅是URL)。

感谢匿名用户 Props to anonymous 提供了额外的正则表达式位置。 - BrianS

1
打开文件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));

不确定为什么您的编辑被拒绝了。看起来是一个可以接受的修改。 - BrianS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接