1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
<?php
namespace Dompdf\Tests\LayoutTest;
use DOMElement;
use Dompdf\Canvas;
use Dompdf\Dompdf;
use Dompdf\FrameDecorator\AbstractFrameDecorator;
use Dompdf\Options;
use Dompdf\Tests\TestCase;
class PageTest extends TestCase
{
public function pageBreakProvider(): array
{
return [
// TODO: Heredocs can be nicely indented starting with PHP 7.3
"one page" => [
<<<HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
@page {
size: 400pt 400pt;
margin: 0;
}
body {
background-color: rgb(0, 0, 0, 0.05);
}
.box {
height: 400pt;
background-color: lightblue;
}
</style>
</head>
<body><div class="box"></div></body>
</html>
HTML
,
1,
["box" => 1]
],
"two pages" => [
<<<HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
@page {
size: 400pt 400pt;
margin: 0;
}
@page :first {
margin-bottom: 100pt;
}
body {
background-color: rgb(0, 0, 0, 0.05);
}
.box {
height: 400pt;
background-color: lightblue;
}
</style>
</head>
<body><div class="box"></div></body>
</html>
HTML
,
2,
["box" => 2]
],
];
}
/**
* @dataProvider pageBreakProvider
*/
public function testPageBreak(
string $html,
int $pageCount,
array $expectedPages
): void {
$elementPages = [];
$options = new Options();
// Use callback to inspect frame tree
$dompdf = new Dompdf($options);
$dompdf->setCallbacks([
[
"event" => "begin_frame",
"f" => function (AbstractFrameDecorator $frame, Canvas $canvas) use ($expectedPages, &$elementPages) {
$node = $frame->get_node();
if (!($node instanceof DOMElement)) {
return;
}
$class = $node->getAttribute("class");
if (isset($expectedPages[$class])) {
$elementPages[$class] = $canvas->get_page_number();
}
}
]
]);
$dompdf->loadHtml($html);
$dompdf->render();
$this->assertSame($pageCount, $dompdf->getCanvas()->get_page_count());
foreach ($expectedPages as $class => $pageNumber) {
$this->assertSame($pageNumber, $elementPages[$class] ?? 0);
}
}
}
|