diff --git a/src/markpdf/renderer.py b/src/markpdf/renderer.py index fabb03b..08fa686 100644 --- a/src/markpdf/renderer.py +++ b/src/markpdf/renderer.py @@ -11,6 +11,7 @@ from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet from reportlab.lib.units import inch from reportlab.platypus import ( + CondPageBreak, HRFlowable, Image, KeepTogether, @@ -114,6 +115,7 @@ def create_styles(theme: dict[str, str | None]) -> dict: spaceBefore=hd["sb"], leading=hd["ld"], fontName="Helvetica-Bold", + keepWithNext=True, ) ) @@ -298,22 +300,29 @@ def build_story( ): level = int(btype[1]) text = _fmt(content, theme) - story.append( - Paragraph(text, styles[f"Heading{level}Custom"]) - ) + # Avoid orphaned headings: break page if less than 1.2in remains + story.append(CondPageBreak(1.2 * inch)) if level == 2: - story.append(Spacer(1, 2)) story.append( - HRFlowable( - width="100%", - thickness=0.5, - color=colors.HexColor(theme["border"]), - spaceBefore=0, - spaceAfter=8, - ) + KeepTogether([ + Paragraph(text, styles[f"Heading{level}Custom"]), + Spacer(1, 2), + HRFlowable( + width="100%", + thickness=0.5, + color=colors.HexColor(theme["border"]), + spaceBefore=0, + spaceAfter=8, + ), + ]) ) else: - story.append(Spacer(1, 4)) + story.append( + KeepTogether([ + Paragraph(text, styles[f"Heading{level}Custom"]), + Spacer(1, 4), + ]) + ) elif btype == BLOCK_PARA: story.append(