Html2pdf不支持word-break:break-all的CSS。

9

大家好,我正在使用html2pdf,它不支持word-break:break-all css。有什么办法吗?

举个例子:

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

输出的pdf需要占据30%以上的宽度,就像字符串长度大小一样。

输出的pdf内容为:testtestetstetstetstetstettstetstetstetstetstetstetstetstetstetstets

我的期望输出为:

testtestetstetstetstetstettstets
tetstetstetstetstetstetstetstets


为什么你不数一下字符呢? - Ionut Flavius Pogacian
你尝试过使用实际内容吗?与其修复在生产中不太可能发生的问题,这样做可能会更好。 - Madara's Ghost
2
由于html2pdf存在渲染问题,我们使用了wkhtmltopdf,因为它使用了webkit渲染引擎。通过这种方式,我们创建了超过25页的PDF报告。 - nickhar
wkhtml还支持一些页面分页的功能,您可以使用*page-break-inside: avoid;*将内容保留在同一页上。 - ern0
@srini 迁移到 wkhtmltopdf 或 phantomjs 可能是最好的主意了 ;) - Berry Langerak
我通过循环遍历字符串中的字符,并在需要时手动插入换行符和连字符(如果在单词中间)来解决了这个问题。 - Brett Gregson
10个回答

15

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

话虽如此,以下是我知道会起作用的方法:PHP中的 wordwrap 函数。因此,你可以使用 echo wordwrap($yourvar, 75, "\n", true) 替换 echo $yourvar;,它将始终截断字符串,即使它只是一个很长的字符串。需要一些调整才能让字符数与你想要的宽度匹配,但它会起作用。

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

输出:

testtesttesttesttest
testtesttesttesttest
testtest

所有的动态内容,如用户输入的名字和姓氏。 - srini
@srini 那又怎样?你仍然可以使用 wordwrap 来实现你的目标。 - Berry Langerak
1
实际上,现在使用wordwrap是HTML2PDF的唯一方法...遗憾的是我没有使用mPDF...不过有一个注意点 - **换行符必须是HTML的<br />**:wordwrap($string, $length, '<br />');. - shadyyx

7

试试这个;

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

不是 word-break,而是 word-wrap


不可能的。我认为你的HTML页面中没有表格标签。你可以使用td代替div。 - avalkab
1
我知道它只适用于HTML页面而不适用于HTML2PDF,这就是为什么我在这里提问的原因。 - srini
1
html2pdf 不支持此功能 http://www.yaronet.com/en/posts.php?sl=&h=0&s=151321#0 - srini
@ErhanSönmez - 你为什么认为这是“不可能”的?CSS支持在各个平台上都很普遍...文件类型转换系统被罕见的CSS规则(甚至是非罕见的规则,如float)绊倒并不罕见。这个问题涉及到一个构建的PDF,而不是在浏览器中呈现的HTML页面。 - Ben D
不错,这对我有用。谢谢! - daneczech

5
如果你希望长字符串在边界容器中保持一致的换行,我认为你可以通过在原始字符串的每个字母之间插入零宽空格字符(zero-width space characters)(&#8203;\xe2\x80\x8b)来实现该功能。这将具有像每个字符都是自己的单词一样换行的效果,但不会向最终用户显示空格。这可能会给最终产品的文本搜索或索引带来麻烦,但从美学角度来看,它应该可靠地完成任务。

因此:

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

所以,如果你将它包裹起来,它会完美地适应其容器的边界。这是一个示例的 jsFiddle

只需编写 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 可搜索,则这不是一个好方法,但它可以使其看起来像您想要的。


你使用的编码是什么??只在PDF中显示还是同时在PDF和HTML文件中都显示了? - Ben D
看看如果您使用\xe2\x80\x8b而不是&#8203;会发生什么。 - Ben D
我在答案中添加了UTF-8代码,因此如果您正在使用该编码,请将$new_string .= $string[$i]."&#8203;"行更改为$new_string .= $string[$i]."\xe2\x80\x8b" - Ben D
1
你可以插入一个空的HTML标签,例如<i></i>,而不是插入一个零宽度空格字符,这样文本将保持可搜索性。 - Pedro Sanção
我遇到了和Srini一样的问题,强制使用Arial也不起作用: <span style="font-family: Arial!important;">​</span> 对于 \xe2\x80\x8b 也是如此 <i></i> 不起作用。 - Reign.85

4

在您的测试中,单词断点不起作用,因为单词断点仅适用于特定句子中单词之间的断点。因此,您可以使用多个单词的句子,然后尝试使用单词断点器。


4
你只需在代码中使用 substr 函数。我为此提供了一个示例。首先将你的输出放入变量中。
$get_value = "testtestetstetstetstetstettstetstetstet";
$first = substr("$get_value",0,3);
$second = substr("$get_value",4,7);

等等。


3

您可以使用"\r\n"来打印换行符。请确保与双引号一起使用。如果您的字符串存储在变量中,则需要使用单词计数函数并附加此字符串。您也可以使用PHP_EOL来避免平台依赖性。


2

0

您可以使用这种方法。

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

0

我想分享一下我使用HTML2PDF和表格的经验。

我使用这个解决方案生成包含交货确认(产品列表)的PDF。这样的列表可能包含数千个产品(行)。

在单元格中遇到了格式和长字符串的问题。首先,即使我将表格宽度设置为100%并设置标题(<th>)列的宽度(HTML2PDF不支持<colgroup>,因此我无法全局定义),表格仍然变得太宽 - 一些列超出了可见区域。我使用wordwrap()<br />作为分隔符来拆分长字符串,看起来像是有效的解决方法。不幸的是,如果第一行和最后一行有这样的长字符串,则整个表格会被添加空白页。虽然不是真正的错误,但也不好看。最终的解决方案是(适用于宽度可能超出可见区域的表格):

  • 将表格和每一行的固定宽度设置为像素
    • 对于A4信纸大小,我使用总宽度为550像素的默认边距,但您需要稍微调整一下以在列之间分配宽度
  • wordwrap中使用空格或&#8203; / \xe2\x80\x8b作为分隔符

对于您想要扩展到100%可见区域宽度的小型表格,可以使用以%表示的宽度。


-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;
    }

用锤子打死一只蚂蚁,这是一个糟糕的工具。 - shadyyx

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