From d99a83babb8fbb2eab550a902ef4fd40adb16a60 Mon Sep 17 00:00:00 2001 From: carli2 Date: Tue, 2 Apr 2024 22:33:04 +0200 Subject: [PATCH] Add support for page-break-before: avoid; and page-break-after: avoid; for elements --- CHANGELOG.md | 1 + src/Mpdf.php | 8 +++++++- src/Tag/BlockTag.php | 2 +- src/Tag/Tr.php | 11 +++++++++++ tests/Issues/Issue2004Test.php | 27 +++++++++++++++++++++++++++ 5 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 tests/Issues/Issue2004Test.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d1d402c1..fc37aae83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ New features * Watermark text can now be colored using \Mpdf\Watermark DTO. \Mpdf\WatermarkImage DTO for images. (#1876) * Added support for `psr/http-message` v2 without dropping v1. (@markdorison, @apotek, @greg-1-anderson, @NigelCunningham #1907) * PHP 8.3 support in mPDF 8.2.1 +* Add support for `page-break-before: avoid;` and `page-break-after: avoid;` for tr elements inside tables mPDF 8.1.x =========================== diff --git a/src/Mpdf.php b/src/Mpdf.php index 9089cb061..61b57a2ad 100644 --- a/src/Mpdf.php +++ b/src/Mpdf.php @@ -22238,7 +22238,13 @@ function _tableWrite(&$table, $split = false, $startrow = 0, $startcol = 0, $spl $extra = $table['max_cell_border_width']['B'] / 2; } - if ($j == $startcol && ((($y + $maxrowheight + $extra ) > ($pagetrigger + 0.001)) || (($this->keepColumns || !$this->ColActive) && !empty($tablefooter) && ($y + $maxrowheight + $tablefooterrowheight + $extra) > $pagetrigger) && ($this->tableLevel == 1 && $i < ($numrows - $table['headernrows']))) && ($y0 > 0 || $x0 > 0) && !$this->InFooter && $this->autoPageBreak) { + // lookahead for pagebreak + $pagebreaklookahead = 1; + while (isset($table['pagebreak-before']) && isset($table['pagebreak-before'][$i + $pagebreaklookahead]) && $table['pagebreak-before'][$i + $pagebreaklookahead] == 'avoid') { + // pagebreak-after is mapped to pagebreak-before on i+1 in Tags/Tr.php + $pagebreaklookahead++; + } + if ($j == $startcol && ((($y + $pagebreaklookahead * $maxrowheight + $extra ) > ($pagetrigger + 0.001)) || (($this->keepColumns || !$this->ColActive) && !empty($tablefooter) && ($y + $maxrowheight + $tablefooterrowheight + $extra) > $pagetrigger) && ($this->tableLevel == 1 && $i < ($numrows - $table['headernrows']))) && ($y0 > 0 || $x0 > 0) && !$this->InFooter && $this->autoPageBreak) { if (!$skippage) { $finalSpread = true; $firstSpread = true; diff --git a/src/Tag/BlockTag.php b/src/Tag/BlockTag.php index 495661a6d..7f2ba763e 100644 --- a/src/Tag/BlockTag.php +++ b/src/Tag/BlockTag.php @@ -247,7 +247,7 @@ public function open($attr, &$ahtml, &$ihtml) /* -- END CSS-PAGE -- */ // If page-box has changed AND/OR PAGE-BREAK-BEFORE - // mPDF 6 (uses $p - preview of properties so blklvl can be imcremented after page-break) + // mPDF 6 (uses $p - preview of properties so blklvl can be incremented after page-break) if (!$this->mpdf->tableLevel && (($pagesel && (!$this->mpdf->page_box['current'] || $pagesel != $this->mpdf->page_box['current'])) || (isset($p['PAGE-BREAK-BEFORE']) && $p['PAGE-BREAK-BEFORE']))) { // mPDF 6 pagebreaktype diff --git a/src/Tag/Tr.php b/src/Tag/Tr.php index 24b7749b8..1e9bdc6b3 100644 --- a/src/Tag/Tr.php +++ b/src/Tag/Tr.php @@ -17,6 +17,17 @@ public function open($attr, &$ahtml, &$ihtml) $this->mpdf->col = -1; $properties = $this->cssManager->MergeCSS('TABLE', 'TR', $attr); + // write pagebreak markers into row list, so _tableWrite can respect it + if (isset($properties['PAGE-BREAK-BEFORE']) && strtoupper($properties['PAGE-BREAK-BEFORE']) === 'AVOID' + && !$this->mpdf->ColActive && !$this->mpdf->keep_block_together && !isset($attr['PAGEBREAKAVOIDCHECKED'])) { + $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['pagebreak-before'][$this->mpdf->row] = 'avoid'; + } + + if (isset($properties['PAGE-BREAK-AFTER']) && strtoupper($properties['PAGE-BREAK-AFTER']) === 'AVOID' + && !$this->mpdf->ColActive && !$this->mpdf->keep_block_together && !isset($attr['PAGEBREAKAVOIDCHECKED'])) { + $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['pagebreak-before'][$this->mpdf->row + 1] = 'avoid'; + } + if (!$this->mpdf->simpleTables && (!isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['borders_separate']) || !$this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['borders_separate'])) { if (!empty($properties['BORDER-LEFT'])) { diff --git a/tests/Issues/Issue2004Test.php b/tests/Issues/Issue2004Test.php new file mode 100644 index 000000000..d641ebd5d --- /dev/null +++ b/tests/Issues/Issue2004Test.php @@ -0,0 +1,27 @@ +groupheader'; + } else { + $html .= 'content'; + } + } + $mpdf->WriteHTML('

Test

+ '.$html.'
+ '); + $this->assertEquals($mpdf->page, 3); + } + +}