【问题标题】:dompdf inserts blank page at end of documentdompdf 在文档末尾插入空白页
【发布时间】:2014-01-10 07:57:26
【问题描述】:

我正在使用 dompdf 0.6.0 生成一个 pdf 文档,并且遇到了一个奇怪的问题,即最后创建了一个空白页面。我的(简化的)html:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>PDF</title>
<style type="text/css">
@page{ margin: 0;}

.page{
    width: 612px; 
    height: 792px; 
    overflow: hidden; 
    font-family: Arial, Helvetica; 
    position: relative; 
    color: #545554;
    page-break-after: always;
}
</style>
</head>
<body>
<div class="page" style="background-image: url(page1.jpg);">
...
</div>

<div class="page" style="background-image: url(page2.jpg);"></div>

<div class="page" style="background-image: url(page3.jpg); color: white;">
...
</div>
</body>
</html>

前三页看起来很神奇,但最后有一个空白页。我读过 dompdf 对嵌套和合规性等很挑剔,但是 html 非常干净并且可以签出。

【问题讨论】:

    标签: php dompdf


    【解决方案1】:

    原来&lt;/body&gt;&lt;/html&gt; 的结尾标签导致了额外的页面。我删除了它们,结果符合预期。

    我认为这是 dompdf 的问题,但我花了很长时间试图解决这个问题,并认为这可能对其他人有帮助。

    更新:

    正如 Joe 在 cmets 中提到的,将 &lt;/body&gt;&lt;/html&gt; 标记移动到与您的结束 &lt;/div&gt; 相同的行,并且仍然是有效的 html。

    【讨论】:

    • 我认为问题不是由关闭 &lt;/body&gt;&lt;/html&gt; 标记引起的,而是由关闭 &lt;/div&gt; 标记之后的换行符引起的。将&lt;/body&gt;&lt;/html&gt; 与最后一个&lt;/div&gt; 放在同一行也可以。
    • 有趣。很好的捕捉@Joe。我会尝试验证并更新我的答案。
    • @Joe 它就像一个魅力,这是完美的答案。谢谢
    • 谢谢!一百万年后,我绝不会考虑查看结束的 html 和 body 标签。
    • 这个,甚至可能是您即将转换为 PDF 的 html 字符串上的 trim()&lt;/html&gt; 之后的空白可能会让你头疼:)
    【解决方案2】:

    对我来说,解决方法是删除标签之间的任何空格。

     $html = preg_replace('/>\s+</', "><", $html);
    

    【讨论】:

    • 是的,我也是这样
    • 感谢它让我发疯,但对我来说它是在页面前添加空白
    • 这行得通,非常感谢。你救了我的命。
    【解决方案3】:

    在我的例子中,它的发生是因为内容比 paperSet() 大。如果内容至少超过 1px,dompdf 会自动创建另一个工作表。所以你总是需要根据你设置的 paperSet() 比例来设置大小。

    例如: 纸 A4 为 210mmx297mm。为方便起见,我建议使用“mm”而不是“px”。然后你可以创建你的 div 并将它们的高度相加,并确保它在 297mm 以内。

    要了解您可以在本网站上看到的纸张尺寸:

    https://papersizes.io/

    【讨论】:

      【解决方案4】:

      这是因为您为 page 类编写了 page-break-after: always; 的 CSS。 上面的样式也会在你的最后一页之后进行分页,dompdf 在最后创建一个空白页。

      另一种解决方案是为您的最后一页编写单独的 css 样式,不包括 page-break-after: always;

      <!DOCTYPE html>
      <html>
      <head>
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      <title>PDF</title>
      <style type="text/css">
      @page{ margin: 0;}
      
      .page{
          width: 612px; 
          height: 792px; 
          overflow: hidden; 
          font-family: Arial, Helvetica; 
          position: relative; 
          color: #545554;
          page-break-after: always;
      }
      .last-page{
         width: 612px; 
         height: 792px; 
         overflow: hidden; 
         font-family: Arial, Helvetica; 
         position: relative; 
         color: #545554;
       }
      
      </style>
      </head>
      <body>
      <div class="page" style="background-image: url(page1.jpg);">
      ...
      </div>
      
      <div class="page" style="background-image: url(page2.jpg);"></div>
      
      <div class="last-page" style="background-image: url(page3.jpg); color: white;">
      ...
      </div>
      </body>
      </html>
      

      编码愉快!

      【讨论】:

        【解决方案5】:

        只需删除, body> 和 html> 结束标签页的末尾有额外的行空间。我希望你能从 pdf 中删除多余的空白页。

        【讨论】:

        • 7 岁以上接受的答案已经说了同样的话,并且还提供了更多信息。你的回答对任何人有什么帮助?
        【解决方案6】:

        如果您使用数组来存储和输出 HTML 代码,但仍然出现错误,您可以使用 count() 函数删除除最后一页之外的所有页面中的最后一页,包括分页符。

        $html='';
        $i = 0; //counter
        $len = count($output_array);// lenght of the array
        foreach($output_array as $output)
        {   //store the html in a variable to use it in dompdf
        
            $html.= $output;
        
            if ($i < $len - 1) 
            { //if the counter is less than the lenght of the array, add a page break.
              $i++; 
              $html.=' <div class="page_break"></div>';
            }
        }
        

        【讨论】:

          【解决方案7】:

          如果您有数组变量,则在youtpdfhtml.blade.php 中设置此条件:

          @if($key<($total-1))
            <div class="page-break"></div>
          @endif 
          

          【讨论】:

            【解决方案8】:

            正如 Filip Molcik 建议的解决方案。我就是这样实现的。

            $view = view('layouts.qr-pdf');
            $html = $view->render();
            $html = preg_replace('/>\s+</', "><", $html);
            $pdf = PDF::loadHTML($html);
            
            return $pdf->download('asd.pdf');
            

            【讨论】:

              【解决方案9】:

              通过添加 margin-bottom: -20px;maindiv 标签解决了我的问题。

              【讨论】:

                【解决方案10】:

                我遇到了同样的问题并通过更改页面高度来解决 -

                最小高度:297 毫米至最小高度:290 毫米

                【讨论】:

                  猜你喜欢
                  • 2023-04-06
                  • 1970-01-01
                  • 2018-02-19
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多