Skip to content

Commit 43cd14a

Browse files
authored
Merge pull request #5 from row-bloom/4-fix-and-enhance-header-and-footer-handling
4 fix and enhance header and footer handling
2 parents 7d7b51f + 3a40f23 commit 43cd14a

File tree

4 files changed

+73
-15
lines changed

4 files changed

+73
-15
lines changed

src/MpdfConfig.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace RowBloom\ChromePhpRenderer;
4+
5+
class MpdfConfig
6+
{
7+
public function __construct(public bool $chromePdfViewerClassesHandling = false)
8+
{
9+
}
10+
}

src/MpdfDom.php

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,19 @@ final public function __construct(string $htmlString)
2828
public function translateHeaderFooterClasses(): static
2929
{
3030
// ? url title
31+
// ! bug: see input template output template
32+
// ✅
33+
// '{PAGENO}/{nbpg}'
34+
// string(22) "<p>{PAGENO}/{nbpg}</p>"
35+
// ✅
36+
// '<p>{PAGENO}/{nbpg}</p>'
37+
// string(22) "<p>{PAGENO}/{nbpg}</p>"
38+
// ❌
39+
// '<span class="pageNumber"></span>/<span class="totalPages"></span>'
40+
// string(15) "{PAGENO}/{nbpg}"
41+
// ❌
42+
// '<p><span class="pageNumber"></span>/<span class="totalPages"></span></p>'
43+
// string(22) "<p>{PAGENO}/{nbpg}</p>"
3144

3245
return $this->replaceWithTextNode(
3346
'//*[@class="pageNumber"]',
@@ -37,7 +50,7 @@ public function translateHeaderFooterClasses(): static
3750
'{nbpg}'
3851
)->replaceWithTextNode(
3952
'//*[@class="date"]',
40-
'{DATE j-m-Y}'
53+
date('d/m/Y h:i') // TODO: make date format configurable
4154
);
4255
}
4356

@@ -64,12 +77,20 @@ private function replaceWithTextNode(string $xPathQuery, string $newText): stati
6477

6578
public function toHtml(): string
6679
{
67-
$htmlString = $this->dom->saveHTML();
80+
$bodyElement = $this->dom->getElementsByTagName('body')->item(0);
81+
82+
if (is_null($bodyElement)) {
83+
throw new RowBloomException('Error retrieving the DOM body element');
84+
}
85+
86+
$htmlString = $this->dom->saveHTML($bodyElement);
6887

6988
if ($htmlString === false) {
7089
throw new RowBloomException('An error occurred while dumping the internal document');
7190
}
7291

92+
$htmlString = str_replace(['<body>', '</body>'], '', $htmlString);
93+
7394
return $htmlString;
7495
}
7596
}

src/MpdfRenderer.php

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Mpdf\HTMLParserMode;
66
use Mpdf\Mpdf;
7+
use RowBloom\ChromePhpRenderer\MpdfConfig;
78
use RowBloom\RowBloom\Config;
89
use RowBloom\RowBloom\Fs\File;
910
use RowBloom\RowBloom\Options;
@@ -44,6 +45,7 @@ public function save(File $file): bool
4445
->save($this->rendering);
4546
}
4647

48+
/** @see https://mpdf.github.io/headers-footers/method-2.html */
4749
public function render(Html $html, Css $css, Options $options, Config $config = null): static
4850
{
4951
$this->html = $html;
@@ -113,22 +115,47 @@ private function setHeaderAndFooter(): void
113115
return;
114116
}
115117

116-
if (! is_null($this->options->headerTemplate)) {
117-
$headerTemplate = MpdfDom::fromString($this->options->headerTemplate)
118-
->translateHeaderFooterClasses()
119-
->toHtml();
118+
$this->setHeader();
119+
$this->setFooter();
120+
}
120121

121-
$this->mpdf->SetHTMLHeader($headerTemplate);
122+
private function setHeader(): void
123+
{
124+
if (is_null($this->options->headerTemplate)) {
125+
return;
122126
}
123127

124-
if (! is_null($this->options->footerTemplate)) {
125-
$footerTemplate = MpdfDom::fromString($this->options->footerTemplate)
126-
->translateHeaderFooterClasses()
127-
->toHtml();
128+
if (! $this->enabledChromePdfViewerLikeValuesInjection()) {
129+
$this->mpdf->SetHTMLHeader($this->options->headerTemplate);
128130

129-
$this->mpdf->SetHTMLHeader($footerTemplate);
131+
return;
130132
}
131133

132-
$this->mpdf->SetHTMLFooter($this->options->footerTemplate);
134+
$this->mpdf->SetHTMLHeader(MpdfDom::fromString($this->options->headerTemplate)
135+
->translateHeaderFooterClasses()
136+
->toHtml());
137+
}
138+
139+
private function setFooter(): void
140+
{
141+
if (is_null($this->options->footerTemplate)) {
142+
return;
143+
}
144+
145+
if (! $this->enabledChromePdfViewerLikeValuesInjection()) {
146+
$this->mpdf->SetHTMLFooter($this->options->footerTemplate);
147+
148+
return;
149+
}
150+
151+
$this->mpdf->SetHTMLFooter(MpdfDom::fromString($this->options->footerTemplate)
152+
->translateHeaderFooterClasses()
153+
->toHtml());
154+
}
155+
156+
private function enabledChromePdfViewerLikeValuesInjection(): bool
157+
{
158+
// TODO: rename all
159+
return $this->config->getDriverConfig(MpdfConfig::class)?->chromePdfViewerClassesHandling ?? false;
133160
}
134161
}

tests/unit/MpdfDomTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515
->translateHeaderFooterClasses()
1616
->toHtml();
1717

18-
expect($results)
19-
->toContain('{DATE j-m-Y}')
18+
expect($results)->not->toContain('body')
2019
->toContain('{PAGENO}')
2120
->toContain('{nbpg}')
2221
->toContain('<span class="title"></span>')
22+
->toContain(date('d/m/Y'))
2323
->not->toContain('<span class="date"></span>')
2424
->not->toContain('<span class="pageNumber"></span>')
2525
->not->toContain('<span class="totalPages"></span>');

0 commit comments

Comments
 (0)