diff --git a/src/Plugin/EntityPrint/PrintEngine/DomPdf.php b/src/Plugin/EntityPrint/PrintEngine/DomPdf.php index a6d6db8..c43f7ef 100644 --- a/src/Plugin/EntityPrint/PrintEngine/DomPdf.php +++ b/src/Plugin/EntityPrint/PrintEngine/DomPdf.php @@ -241,6 +241,7 @@ class DomPdf extends PdfEngineBase implements ContainerFactoryPluginInterface { try { $this->dompdf->render(); $this->hasRendered = TRUE; + $this->injectPageCount(); } catch (DompdfLibException $e) { throw new PrintEngineException(sprintf('Failed to generate PDF: %s', $e)); @@ -306,4 +307,31 @@ class DomPdf extends PdfEngineBase implements ContainerFactoryPluginInterface { return $this->dompdf; } + /** + * {@inheritdoc} + */ + public function injectPageCount() { + /** @var \Dompdf\Canvas $canvas */ + $canvas = $this->dompdf->getCanvas(); + $pdf = $canvas->get_cpdf(); + $search = '@@PC'; + $search_null = self::insertNullByteBeforeEachCharacter($search); + $replace = strval($canvas->get_page_count()); + $replace_null = self::insertNullByteBeforeEachCharacter($replace); + foreach ($pdf->objects as &$object) { + if ($object['t'] === 'contents') { + if (substr_count($object['c'], "\u{0000}")) { + $object['c'] = str_replace($search_null, $replace_null, $object['c']); + } + else { + $object['c'] = str_replace($search, $replace, $object['c']); + } + } + } + return $this->dompdf; + } + private static function insertNullByteBeforeEachCharacter(string $string): string { + return "\u{0000}" . substr(chunk_split($string, 1, "\u{0000}"), 0, -1); + } + }