Html2pdf不支持word-break:break-all css

时间:2012-10-06 11:50:47

标签: php word-wrap textwrapping html2pdf word-break

hai大家我正在使用html2pdf,它不支持word-break:break-all css任何想法?

例如

   <td style="width:30%;word-break:break-all ;">
      testtestetstetstetstetstettstetstetstetstetstetstetstetstetstetstets
    </td>

输出pdf宽度超过30%,如字符串长度

输出pdf:testtestetstetstetstetstettstetstetstetstetstetstetstetstetstetstets

我想要输出:

testtestetstetstetstetstettstets
tetstetstetstetstetstetstetstets

10 个答案:

答案 0 :(得分:11)

嗯,这很复杂。你的测试字符串太长了,但它不是由多个单词组成的。这意味着分词不会起作用,因为没有任何词可以打破。显然,这可能只是一个例子,在这种情况下,html2pdf可能不支持相对宽度和word-break,因此您可以尝试使用绝对宽度word-break

那就是说,这里有一些我知道可行的东西:PHP中的wordwrap。因此,您可以使用echo $yourvar;来代替echo wordwrap($yourvar, 75, "\n", true),而总是剪切字符串,即使它只是一个长字符串。需要花一点时间才能获得与您正在寻找的宽度相匹配的字符数,但它会起作用。

<?php
$foo = str_repeat('test',12);
echo wordwrap($foo, 20, '<br />', true);

输出:

testtesttesttesttest
testtesttesttesttest
testtest

答案 1 :(得分:6)

试试这个;

<td style="width:30%; word-wrap:break-word;">
   testtestetstetstetstetstettstetstetstetstetstetstetstetstetstetstets
</td>

不是word-break它是word-wrap;

答案 2 :(得分:5)

如果您希望长字符串在边界容器中一致地包装,我认为您应该能够通过在每个字母之间插入zero-width space characters&#8203;\xe2\x80\x8b)来实现此目的orignial字符串。这将具有包装的效果,就像每个字符都是它自己的单词一样,但不向最终用户显示空格。这可能会导致您在最终产品上进行文本搜索或索引时出现问题,但它应该从审美角度可靠地完成任务。

因此:

testtestetstetstetstetstettstetstetstetstetstetstetstetstetstetstets

变为

t&#8203;e&#8203;s&#8203;t&#8203;t&#8203;e&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s&#8203;t&#8203;e&#8203;t&#8203;s

(显示:“具体情况”吨式T(E T)吨式T(E T)式T(E T)式T(E T)式T(E T)s ^ T E吨式T(E T)式T(E T)式T(E T)式T(E T)式T(E T)的“)

因此,如果你将它包装起来,它将完全包裹到其容器的边界。的 Here's a fiddle of it as an example

只需编写一个PHP脚本来循环遍历字符串并插入空格:

$string="testtestetstetstetstetstettstetstetstetstetstetstetstetstetstetstets";
$new_string = "";
for($i=0;$i<strlen($string);$i++){
   if ($string[$i]==' ' || $string[$i+1]==' '){ //if it is a space or the next letter is a space, there's no reason to add a break character
      continue;
   }
   $new_string .= $string[$i]."&#8203;";
}
echo $new_string

这是一个特别好的解决方案,因为与wordwrap()不同,它会自动调整非固定宽度字体(基本上是实际使用的字体的99%)。

同样,如果您需要生成可搜索的PDF,这不是一个好方法,但它会使看起来就像您想要的那样。

答案 3 :(得分:4)

在你的测试中,单词break不会起作用,因为单词break只能在特定句子中的单词之间起作用。所以你可以使用多个单词的句子然后尝试使用断字器

答案 4 :(得分:4)

您只需在代码中使用substr函数。 我举了一个例子。首先将输出放在变量中。

$get_value = "testtestetstetstetstetstettstetstetstet";
$first = substr("$get_value",0,3);
$second = substr("$get_value",4,7);

等等。

答案 5 :(得分:3)

您可以使用"\r\n"打印换行符。确保使用双引号。如果您的字符串在变量中,那么您需要使用字数统计函数并附加此字符串。您还可以使用PHP_EOL来避免平台依赖。

答案 6 :(得分:2)

html2pdf不支持这个单词分解:break-all css

参考:http://www.yaronet.com/en/posts.php?sl=&h=0&s=151321#0

答案 7 :(得分:0)

您可以使用此方法。

<?php
$get_value = "testtestetstetstetstetstettstetstetstet";
$first = substr("$get_value",0,3);
$second = substr("$get_value",4,7);
$third = substr("$get_value",8,11);
?>

答案 8 :(得分:0)

我想在HTML2PDF和表格中添加一些自己的经验。

我使用此解决方案生成PDF,其中包含一个充满交付确认(产品列表)的表格。此类列表最多可包含数千种产品(行)。

我在单元格中遇到格式化和长字符串问题。第一个问题是,即使我将表格的宽度设置为100%并且标题(<th>)列的宽度(HTML2PDF不支持<colgroup>,表格也变得太宽,所以我无法和#39;定义全局) - 某些列不在可见区域内。我使用wordwrap()<br />作为分隔符来分解看起来像它正在工作的长字符串。不幸的是,事实证明,如果在第一行和最后一行中存在这么长的字符串,则整个表格 prepended 并且追加与空页面。不是一个真正的bugger,但也不好看。最终的解决方案是(适用于宽度可以超出可见区域的桌子):

  • 设置表格的固定宽度,每个行以像素为单位
    • 对于A4字母大小,我使用的是550 px的总宽度和默认边距,但你不得不玩一点来分配列之间的宽度
  • wordwrap中使用空格或&#8203; / \xe2\x80\x8b作为分隔符

对于您希望以100%的可见区域宽度进行传播的小型表格,可以使用%中表示的宽度。

答案 9 :(得分:-1)

我认为这个功能是一个跛行的解决方案。

function String2PDFString($string,$Length)
    {
    $Arry=explode(" ",$string);
    foreach($Arry as $Line)
        {
        if(strlen($Line)>$Length)
            $NewString.=wordwrap ($Line,$Length," ",true);
        else
            $NewString.=" ".$Line;
        }
    return $NewString;
    }