与浮动选项mpdf在同一页面上的div

时间:2018-05-09 06:36:29

标签: php mpdf

我使用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;">
        &nbsp;
    </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;">
        &nbsp;
    </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'],内容也可能有所不同。每次循环后都不能使用分页,因为它可以显示一个空白页面,其中包含很少的数据。

1 个答案:

答案 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 librarya 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时会产生大量开销。我建议在决定实施此技术之前运行自己的基准测试。