我使用div结构使用mPDF打印pdf。我想在同一页面上绑定一个div,如果在同一页面上没有空格,那么整个部分应该出现在下一页。 我正在使用float来设计div。以下是一个div部分的示例
<div class="action_div">
<div style="width: 100%;padding-top: 10px;padding-bottom: 10px;font-size: 12px;font-family: segoe;font-weight: bold;">
<div style="width: 10%;float:left;text-align: center;">
</div>
<div style="width: 90%;float:left;">
<?php echo str_pad($i, 2, "0", STR_PAD_LEFT); ?>. <?php echo $hazard['name'] ?>
</div>
</div>
<div style="width: 100%;background-color: #EBECEC;padding-top: 8px;padding-bottom: 8px;font-size: 12px;font-family: segoe;border-bottom: 1px dotted #939598;border-top: 1px dotted #939598;font-weight: bold;">
<div style="width: 10%;float:left;text-align: center;">
</div>
<div style="width: 90%;float:left;">
Top 3 Control Measure
</div>
</div>
<?php
$j=1; foreach($hazard['pie_char_arr'] as $action){ ?>
<div style="width: 100%;padding-top: 10px;padding-bottom: 10px;font-size: 12px;font-family: segoe;border-bottom: 1px dotted #939598;">
<div style="width: 15%;float:left;text-align: center;">
<?php echo str_pad($j, 2, "0", STR_PAD_LEFT); ?>
</div>
<div style="width: 85%;float:left;">
<?php echo $action['action'] ?>
</div>
</div>
<?php if($j==3){
break;
}
$j++;} ?>
这一部分正在循环中。对于$ action ['action']和$ hazard ['name'],内容也可能有所不同。每次循环后都不能使用分页,因为它可以显示一个空白页面,其中包含很少的数据。
答案 0 :(得分:1)
mPDF对page-break-inside: avoid
CSS属性(see documentation of all supported CSS)有基本支持,但我的经验是,这对于浮动元素不起作用(如果有的话)。如果它有效,那将是一场轻松的胜利:
<div style="page-break-inside: avoid;">
<!-- Contents -->
</div>
如果它不起作用,您可以将HTML内容分成更小的块,并一次写一个部分:
$mpdf->WriteHTML($chunk1);
$mpdf->WriteHTML($chunk2);
$mpdf->WriteHTML($chunk3);
在块之间,您可以使用$mpdf->y
检查页面上当前Y指针的位置,如果没有足够空间容纳分块,则强制分页:
if ($mpdf->y > 150) { // if the Y pointer is lower than 150mm on the page
$mpdf->WriteHTML('<pagebreak />');
}
这种方法要求你可以1.将你的HTML分成更小的块,然后2.知道你的块有多大(或者至少是一个很好的近似值)。
对于真正的动态内容,我发现最简单的方法是在编写每个块之前克隆Mpdf对象并检查count($mpdf->pages)
是否已增加。 I recommend the myclabs/DeepCopy library(a package that will be rolled into mPDF in a future update)。如果数组增加,你的块将不适合单个页面,你需要添加分页符:
$copier = new DeepCopy\DeepCopy(true);
$MpdfClone = $copier->copy($mpdf);
$currentPageCount = count($MpdfClone->pages);
$currentPageCount = $currentPageCount !== 0 ? $currentPageCount : 1; //fix when the object is first created and no pages have been added
$MpdfClone->WriteHTML($chunk);
if ($currentPageCount !== count($MpdfClone->pages)) {
$mpdf->WriteHTML('<pagebreak />');
}
unset($MpdfClone);
$mpdf->WriteHTML($chunk);
使用此方法将大量块写入PDF时会产生大量开销。我建议在决定实施此技术之前运行自己的基准测试。