dompdf 在文档末尾插入空白页

问题描述 投票:0回答:12

我正在使用 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
12个回答
51
投票

结果是结尾

</body>
</html>
标签导致了额外的页面。我删除了它们,结果符合预期。

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

更新:

正如 Joe 在评论中提到的,将

</body>
</html>
标签移动到与结束
</div>
相同的行,并且保持有效的 html。


16
投票

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

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

9
投票

发生这种情况是因为您为

page-break-after: always;
类编写了
page
的 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>

编码快乐!


2
投票

就我而言,发生这种情况是因为内容大于 paperSet()。如果内容通过至少 1px,dompdf 会自动创建另一个工作表。所以你总是需要根据你设置的 paperSet() 比例来设置尺寸。

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

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

https://papersizes.io/


1
投票

如果你有数组变量,则在

youtpdfhtml.blade.php
中设置此条件:

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

1
投票

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


0
投票

如果您使用数组来存储和输出 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>';
    }
}

0
投票

Filip Molcik 提出了解决方案。这就是我实现的方法。

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

return $pdf->download('asd.pdf');

0
投票

通过添加

margin-bottom: -20px;
main
div
标签解决了我的问题。


0
投票

我遇到了同样的问题,并通过将页面高度从 -

更改来解决

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


0
投票

对我来说,这是因为我有一个“最小高度:100%;”在 CSS 文件中。删除它,就没有多余的空白页。


0
投票

我确实在文件末尾连接了 css 链接,这导致了新页面。

喜欢:

[...] //html with </html>
$html .= "<link>[...]</link>";

这当然会导致一个新页面,但你必须考虑一下,也许这对某人有帮助。

P.S.:我还没有足够的声誉来写这篇评论

© www.soinside.com 2019 - 2024. All rights reserved.