【问题标题】:Html2pdf doesn't support word-break:break-all cssHtml2pdf 不支持 word-break:break-all css
【发布时间】:2020-10-01 00:20:51
【问题描述】:

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

例子

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

输出 pdf 宽度大于字符串长度大小的 30%

输出 pdf:testtestetstetstetsttesttstettstetstetstetstetstetstetstettstetstetstets

我想要输出:

测试测试测试测试测试测试
测试测试测试测试测试测试测试测试测试

【问题讨论】:

  • 为什么不计算字符数?
  • 您尝试过实际内容吗?它可能对您更有效,而不是修复在生产中不太可能发生的问题。
  • 由于html2pdf的渲染问题,我们使用wkhtmltopdf,因为它使用了webkit渲染引擎。有了这个,我们创建了 25pp 以上的 PDF 报告。
  • wkhtml 还支持某种分页符,您可以使用 page-break-inside: Avoid; 将内容保持在同一页面上
  • @srini 迁移到 wkhtmltopdf 或 phantomjs 可能是最好的主意 ;)

标签: php word-wrap html2pdf word-break


【解决方案1】:

嗯,这很复杂。您的测试字符串太长,但不是由多个单词组成。这意味着断词不起作用,因为没有任何词可以断。显然,这很可能只是一个示例,在这种情况下,可能是 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 所以?您仍然可以使用自动换行来实现您的目标。
  • 实际上,这些天使用wordwrap 是 HTML2PDF 的唯一方法...可惜我没有使用 mPDF...不过需要注意的是 - 线路制动必须是 HTML &lt;br /&gt;wordwrap($string, $length, '&lt;br /&gt;');.
【解决方案2】:

试试这个;

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

不是word-break,而是word-wrap

【讨论】:

  • 不可能。我认为你的html页面没有table标签。你可以设置td而不是div。
  • 我知道它只适用于 html 页面而不是 html2pdf 这就是我在这里提问的原因
  • @ErhanSönmez - 是什么让你认为这是“不可能的”?跨平台的 CSS 支持无处不在……文件类型转换系统遇到罕见的 css 规则(甚至是非罕见的 css 规则,例如float)并不罕见。该问题与构建的 PDF 相关,而不是在浏览器中呈现的 HTML 页面。
  • 不错,它为我做了。谢谢!
【解决方案3】:

如果您希望长字符串始终包裹在边界容器中,我认为您应该能够通过 在原始字符串的每个字母之间插入 zero-width space characters&amp;#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

(显示:“t​e​s​t​t​e​s​t​e​t​s​t​e​t​s​t​e​t​s​t​e​ t s t t t t t s t t s t t s t s t s t s t s t s t e t e t s t e t​t​e​t​s​t​e​t​s​t​e​t​t​e​t​s​t​e​t​s”)

因此,如果您包装它,它将完全包装到其容器的边界。 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 可供搜索,这不是一个好方法,但它会让它看起来像您想要的那样。

【讨论】:

  • 您使用的是什么编码? ? 是仅显示在 PDF 中还是同时显示在 PDF 和 HTML 文件中?
  • 看看如果你使用\xe2\x80\x8b而不是&amp;#8203;会发生什么
  • 我也在答案中添加了 UTF-8 代码,所以如果您使用该编码,只需将 $new_string .= $string[$i]."&amp;#8203;" 行更改为 $new_string .= $string[$i]."\xe2\x80\x8b"
  • 您可以插入一个空的 HTML 标签,而不是插入一个零宽度的空格字符,例如&lt;i&gt;&lt;/i&gt;,这样文字就可以继续搜索了
  • 我遇到了与 Srini 相同的问题,强制 Arial 也无法正常工作: 与 \xe2 相同\x80\x8b 不工作
【解决方案4】:

在您的测试中,单词 break 将不起作用,因为单词 break 仅在特定句子中的单词之间起作用。所以你可以使用多个单词的句子,然后尝试使用分词器

【讨论】:

    【解决方案5】:

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

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

    等等。

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          你可以使用这个方法。

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

          【讨论】:

            【解决方案9】:

            我想补充一点自己对 HTML2PDF 和表格的经验。

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

            我遇到了单元格中的格式和长字符串问题。第一个问题是即使我将表格的宽度设置为 100% 和标题 (&lt;th&gt;) 列的宽度(HTML2PDF 不支持 &lt;colgroup&gt; 所以我无法在全局范围内定义它),表格也变得太宽了) - 一些列超出了可见区域。我使用wordwrap()&lt;br /&gt; 作为分隔符来分解看起来像是在工作的长字符串。不幸的是,如果第一行和最后一行有这么长的字符串,则整个表是 prependedappended 空白页。不是一个真正的混蛋,但也不好看。最终的解决方案是(适用于宽度可以超出可见区域的表格):

            • 设置表格和每个行的固定宽度(以像素为单位)
              • 对于 A4 字母大小,我使用 550 像素的总宽度和默认边距,但您必须稍微调整一下才能在列之间分配宽度
            • wordwrap 中使用空格或&amp;#8203; / \xe2\x80\x8b 作为分隔符

            对于您希望以 100% 可见区域宽度展开的小表格,可以使用以 % 表示的宽度。

            【讨论】:

              【解决方案10】:

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

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

              【讨论】:

              • 用锤子杀死蚂蚁。一把坏锤子。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-06-13
              • 2014-07-07
              • 1970-01-01
              • 1970-01-01
              • 2010-12-20
              • 2013-08-20
              • 2016-03-11
              相关资源
              最近更新 更多