div на той же странице с опцией float mpdf - PullRequest
0 голосов
/ 09 мая 2018

Я использую структуру div для печати pdf с использованием mPDF. Я хочу связать div на той же странице, и если место не доступно на той же странице, тогда весь раздел должен появиться на следующей странице. Я использую float для divs для дизайна. Ниже приведен пример для одного раздела

<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'] и для $ danger ['name']. Невозможно использовать разрыв страницы после каждого цикла, поскольку он может показывать пустую страницу с очень небольшим количеством данных об этом.

1 Ответ

0 голосов
/ 09 мая 2018

mPDF имеет базовую поддержку свойства page-break-inside: avoid CSS ( см. Документацию по всем поддерживаемым CSS ), но, как мне показалось, это не работает (если вообще) для плавающих элементов. Если это работает, это легкий выигрыш:

<div style="page-break-inside: avoid;">
    <!-- Contents -->
</div>

Если это не работает, вы можете разбить ваш HTML-контент на более мелкие куски и записать каждый блок в раздел за раз:

$mpdf->WriteHTML($chunk1);
$mpdf->WriteHTML($chunk2);
$mpdf->WriteHTML($chunk3);

Между чанками вы можете проверить, где находится текущий указатель Y на странице, используя $mpdf->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). Я рекомендую библиотеку myclabs / DeepCopy ( пакет, который будет свернут в mPDF в будущем обновлении ). Если массив увеличивается, ваш чанк не умещается на одной странице, и вам нужно добавить разрыв страницы:

$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 с использованием этого метода возникают большие издержки. Я рекомендую запустить свои собственные тесты, прежде чем принять решение о внедрении этой техники.

...