Use exact OPD header rendering pattern for discharge
This commit is contained in:
parent
94bcf4d37c
commit
ebf23b93e8
|
|
@ -7363,54 +7363,39 @@ class Ipd_discharge extends BaseController
|
||||||
$mpdf->SetTitle('Discharge Summary - ' . ($patientName !== '' ? $patientName : ('IPD ' . $ipdId)));
|
$mpdf->SetTitle('Discharge Summary - ' . ($patientName !== '' ? $patientName : ('IPD ' . $ipdId)));
|
||||||
$mpdf->SetAuthor('Atria HMS');
|
$mpdf->SetAuthor('Atria HMS');
|
||||||
|
|
||||||
// Build mPDF fragment following the exact structure from the mPDF docs:
|
// Replicate the exact OPD template rendering pattern: @page CSS + named blocks + body in one WriteHTML call.
|
||||||
// <style> (with @page if CSS contains it) → named header/footer → content.
|
$marginTopCm = (float) ($templateSettings['page_margin_top_cm'] ?? 0.8);
|
||||||
$templateCss = trim((string) ($templateSettings['template_css'] ?? ''));
|
$marginBottomCm = (float) ($templateSettings['page_margin_bottom_cm'] ?? 0.8);
|
||||||
|
$marginLeftCm = (float) ($templateSettings['page_margin_left_cm'] ?? 0.8);
|
||||||
|
$marginRightCm = (float) ($templateSettings['page_margin_right_cm'] ?? 0.8);
|
||||||
|
$marginHeaderCm = (float) ($templateSettings['margin_header_cm'] ?? 0.5);
|
||||||
|
$marginFooterCm = (float) ($templateSettings['margin_footer_cm'] ?? 0.5);
|
||||||
$useHeader = $withHeader && $headerHtml !== '';
|
$useHeader = $withHeader && $headerHtml !== '';
|
||||||
$useFooter = $footerHtml !== '';
|
$useFooter = $footerHtml !== '';
|
||||||
|
|
||||||
// Build @page block from margin fields — always prepend it so the header/footer bindings work.
|
$pdfHtml = '<style>@page {' . "\n"
|
||||||
$marginTopCm = (float) ($templateSettings['page_margin_top_cm'] ?? 0.8);
|
. "margin-top: {$marginTopCm}cm;\n"
|
||||||
$marginBottomCm = (float) ($templateSettings['page_margin_bottom_cm'] ?? 0.8);
|
. "margin-bottom: {$marginBottomCm}cm;\n"
|
||||||
$marginHeaderCm = (float) ($templateSettings['margin_header_cm'] ?? 0.5);
|
. "margin-left: {$marginLeftCm}cm;\n"
|
||||||
$marginFooterCm = (float) ($templateSettings['margin_footer_cm'] ?? 0.5);
|
. "margin-right: {$marginRightCm}cm;\n"
|
||||||
$pageBlock = '@page {'
|
. "margin-header: {$marginHeaderCm}cm;\n"
|
||||||
. "\n margin-top: {$marginTopCm}cm;"
|
. "margin-footer: {$marginFooterCm}cm;\n"
|
||||||
. "\n margin-bottom: {$marginBottomCm}cm;"
|
. ($useHeader ? "header: html_myHeader;\n" : '')
|
||||||
. "\n margin-header: {$marginHeaderCm}cm;"
|
. ($useFooter ? "footer: html_myFooter;\n" : '')
|
||||||
. "\n margin-footer: {$marginFooterCm}cm;"
|
. "}</style>\n";
|
||||||
. ($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 = (string) preg_replace_callback('/@page\s*\{/i', function ($m) {
|
|
||||||
return $m[0] . "\n header: html_myHeader;";
|
|
||||||
}, $templateCss, 1);
|
|
||||||
}
|
|
||||||
if ($useFooter && !preg_match('/footer\s*:\s*html_myFooter/i', $templateCss)) {
|
|
||||||
$templateCss = (string) preg_replace_callback('/@page\s*\{/i', function ($m) {
|
|
||||||
return $m[0] . "\n footer: html_myFooter;";
|
|
||||||
}, $templateCss, 1);
|
|
||||||
}
|
|
||||||
$pageBlock = ''; // user's CSS already has @page
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assemble: @page block → template CSS → named header/footer blocks → content.
|
|
||||||
$pdfHtml = '<style>' . "\n" . $pageBlock . "\n" . '</style>' . "\n";
|
|
||||||
$pdfHtml .= ($templateCss !== '' ? '<style>' . "\n" . $templateCss . "\n" . '</style>' . "\n" : '');
|
|
||||||
if ($useHeader) {
|
if ($useHeader) {
|
||||||
$pdfHtml .= '<htmlpageheader name="myHeader">' . "\n" . $headerHtml . "\n" . '</htmlpageheader>' . "\n";
|
$pdfHtml .= '<htmlpageheader name="myHeader">' . "\n" . $headerHtml . "\n" . '</htmlpageheader>' . "\n";
|
||||||
// show-this-page forces header on page 1 because mPDF adds the first page before @page CSS is processed
|
|
||||||
$pdfHtml .= '<sethtmlpageheader name="myHeader" value="on" show-this-page="1" />' . "\n";
|
|
||||||
}
|
}
|
||||||
if ($useFooter) {
|
if ($useFooter) {
|
||||||
$pdfHtml .= '<htmlpagefooter name="myFooter">' . "\n" . $footerHtml . "\n" . '</htmlpagefooter>' . "\n";
|
$pdfHtml .= '<htmlpagefooter name="myFooter">' . "\n" . $footerHtml . "\n" . '</htmlpagefooter>' . "\n";
|
||||||
$pdfHtml .= '<sethtmlpagefooter name="myFooter" value="on" show-this-page="1" />' . "\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$templateCss = trim((string) ($templateSettings['template_css'] ?? ''));
|
||||||
|
if ($templateCss !== '') {
|
||||||
|
$pdfHtml .= '<style>' . "\n" . $templateCss . "\n" . '</style>' . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
$pdfHtml .= $renderedHtml;
|
$pdfHtml .= $renderedHtml;
|
||||||
$pdfHtml = mpdf_normalize_font_weight_css($pdfHtml);
|
$pdfHtml = mpdf_normalize_font_weight_css($pdfHtml);
|
||||||
$pdfBinary = $this->runMpdfWithTolerantWarnings(static function () use ($mpdf, $pdfHtml, $fileName): string {
|
$pdfBinary = $this->runMpdfWithTolerantWarnings(static function () use ($mpdf, $pdfHtml, $fileName): string {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user