diff --git a/app/Controllers/Ipd_discharge.php b/app/Controllers/Ipd_discharge.php
index 1b7af1c..1ec67ce 100644
--- a/app/Controllers/Ipd_discharge.php
+++ b/app/Controllers/Ipd_discharge.php
@@ -7369,36 +7369,39 @@ class Ipd_discharge extends BaseController
$useHeader = $withHeader && $headerHtml !== '';
$useFooter = $footerHtml !== '';
- // Auto-inject header/footer name bindings into @page if CSS has one but misses the binding.
- if ($templateCss !== '') {
+ // Build @page block from margin fields — always prepend it so the header/footer bindings work.
+ $marginTopCm = (float) ($templateSettings['page_margin_top_cm'] ?? 0.8);
+ $marginBottomCm = (float) ($templateSettings['page_margin_bottom_cm'] ?? 0.8);
+ $marginHeaderCm = (float) ($templateSettings['margin_header_cm'] ?? 0.5);
+ $marginFooterCm = (float) ($templateSettings['margin_footer_cm'] ?? 0.5);
+ $pageBlock = '@page {'
+ . "\n margin-top: {$marginTopCm}cm;"
+ . "\n margin-bottom: {$marginBottomCm}cm;"
+ . "\n margin-header: {$marginHeaderCm}cm;"
+ . "\n margin-footer: {$marginFooterCm}cm;"
+ . ($useHeader ? "\n header: html_myHeader;" : '')
+ . ($useFooter ? "\n footer: html_myFooter;" : '')
+ . "\n}";
+
+ // If the user wrote their own @page in the CSS, merge by replacing ours (theirs takes precedence).
+ if ($templateCss !== '' && preg_match('/@page\s*\{/i', $templateCss)) {
+ // Inject header/footer bindings if missing in the user's @page block.
if ($useHeader && !preg_match('/header\s*:\s*html_myHeader/i', $templateCss)) {
- $templateCss = preg_replace_callback('/@page\s*\{/', function ($m) {
+ $templateCss = (string) preg_replace_callback('/@page\s*\{/i', function ($m) {
return $m[0] . "\n header: html_myHeader;";
- }, $templateCss, 1) ?? $templateCss;
+ }, $templateCss, 1);
}
if ($useFooter && !preg_match('/footer\s*:\s*html_myFooter/i', $templateCss)) {
- $templateCss = preg_replace_callback('/@page\s*\{/', function ($m) {
+ $templateCss = (string) preg_replace_callback('/@page\s*\{/i', function ($m) {
return $m[0] . "\n footer: html_myFooter;";
- }, $templateCss, 1) ?? $templateCss;
+ }, $templateCss, 1);
}
- } else {
- // No CSS: build a minimal @page block from the margin form fields.
- $marginTopCm = (float) ($templateSettings['page_margin_top_cm'] ?? 0.8);
- $marginBottomCm = (float) ($templateSettings['page_margin_bottom_cm'] ?? 0.8);
- $marginHeaderCm = (float) ($templateSettings['margin_header_cm'] ?? 0.5);
- $marginFooterCm = (float) ($templateSettings['margin_footer_cm'] ?? 0.5);
- $templateCss = '@page {'
- . "\n margin-top: {$marginTopCm}cm;"
- . "\n margin-bottom: {$marginBottomCm}cm;"
- . "\n margin-header: {$marginHeaderCm}cm;"
- . "\n margin-footer: {$marginFooterCm}cm;"
- . ($useHeader ? "\n header: html_myHeader;" : '')
- . ($useFooter ? "\n footer: html_myFooter;" : '')
- . "\n}";
+ $pageBlock = ''; // user's CSS already has @page
}
- // Assemble exactly as shown in mPDF documentation: CSS → named blocks → content.
- $pdfHtml = '' . "\n";
+ // Assemble: @page block → template CSS → named header/footer blocks → content.
+ $pdfHtml = '' . "\n";
+ $pdfHtml .= ($templateCss !== '' ? '' . "\n" : '');
if ($useHeader) {
$pdfHtml .= '' . "\n" . $headerHtml . "\n" . '' . "\n";
}