diff --git a/library/Pdfexport/PrintableHtmlDocument.php b/library/Pdfexport/PrintableHtmlDocument.php index 8dfb57c..ff2a101 100644 --- a/library/Pdfexport/PrintableHtmlDocument.php +++ b/library/Pdfexport/PrintableHtmlDocument.php @@ -6,7 +6,10 @@ use Icinga\Application\Icinga; use Icinga\Web\StyleSheet; +use Icinga\Web\Url; +use ipl\Html\Attributes; use ipl\Html\BaseHtmlElement; +use ipl\Html\HtmlDocument; use ipl\Html\HtmlElement; use ipl\Html\HtmlString; use ipl\Html\Text; @@ -14,6 +17,44 @@ class PrintableHtmlDocument extends BaseHtmlElement { + /** @var string */ + const DEFAULT_HEADER_FOOTER_STYLE = <<<'CSS' +@font-face { + font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif; +} + +header, footer { + width: 100%; + height: 21px; + font-size: 7px; + display: flex; + justify-content: space-between; + margin-left: 0.75cm; + margin-right: 0.75cm; +} + +header > *:not(:last-child), +footer > *:not(:last-child) { + margin-right: 10px; +} + +span { + line-height: 7px; + white-space: nowrap; +} + +p { + margin: 0; + line-height: 7px; + word-break: break-word; + text-overflow: ellipsis; + overflow: hidden; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; +} +CSS; + /** @var string Document title */ protected $title; @@ -129,6 +170,10 @@ class PrintableHtmlDocument extends BaseHtmlElement * * For example, `` would generate span containing the title. * + * Note that the header cannot exceed a height of 21px regardless of the margin's height or document's scale. + * With the default style, this height is separated by three lines, each accommodating 7px. + * Use `span`'s for single line text and `p`'s for multiline text. + * * @var ValidHtml */ protected $headerTemplate; @@ -145,6 +190,10 @@ class PrintableHtmlDocument extends BaseHtmlElement * * For example, `` would generate span containing the title. * + * Note that the footer cannot exceed a height of 21px regardless of the margin's height or document's scale. + * With the default style, this height is separated by three lines, each accommodating 7px. + * Use `span`'s for single line text and `p`'s for multiline text. + * * @var ValidHtml */ protected $footerTemplate; @@ -195,6 +244,7 @@ public function setTitle($title) * Set page header * * @param ValidHtml $header + * * @return $this */ public function setHeader(ValidHtml $header) @@ -208,6 +258,7 @@ public function setHeader(ValidHtml $header) * Set page footer * * @param ValidHtml $footer + * * @return $this */ public function setFooter(ValidHtml $footer) @@ -231,6 +282,7 @@ public function getCoverPage() * Set cover page * * @param ValidHtml $coverPage + * * @return $this */ public function setCoverPage(ValidHtml $coverPage) @@ -334,15 +386,23 @@ public function getPrintParameters() } if (isset($this->headerTemplate)) { - $parameters['headerTemplate'] = $this->headerTemplate->render(); + $parameters['headerTemplate'] = $this->createHeader()->render(); $parameters['displayHeaderFooter'] = true; + + if (! isset($parameters['marginTop'])) { + $parameters['marginTop'] = 0.6; + } } else { $parameters['headerTemplate'] = ' '; // An empty string is ignored } if (isset($this->footerTemplate)) { - $parameters['footerTemplate'] = $this->footerTemplate->render(); + $parameters['footerTemplate'] = $this->createFooter()->render(); $parameters['displayHeaderFooter'] = true; + + if (! isset($parameters['marginBottom'])) { + $parameters['marginBottom'] = 0.6; + } } else { $parameters['footerTemplate'] = ' '; // An empty string is ignored } @@ -440,4 +500,36 @@ protected function createLayoutScript(): ValidHtml HtmlString::create($layoutJS) ); } + + /** + * Create document header + * + * @return ValidHtml + */ + protected function createHeader(): ValidHtml + { + return (new HtmlDocument()) + ->addHtml( + new HtmlElement('style', null, HtmlString::create( + static::DEFAULT_HEADER_FOOTER_STYLE + )), + new HtmlElement('header', null, $this->headerTemplate) + ); + } + + /** + * Create document footer + * + * @return ValidHtml + */ + protected function createFooter(): ValidHtml + { + return (new HtmlDocument()) + ->addHtml( + new HtmlElement('style', null, HtmlString::create( + static::DEFAULT_HEADER_FOOTER_STYLE + )), + new HtmlElement('footer', null, $this->footerTemplate) + ); + } }