Uterine Fibroid impact on women Health and quality of life -case paper presentation for gynec resident

Asking for Preferences
Reading File
Searching PubMed

uterine fibroids quality of life women

Searching the Web

uterine fibroid impact women health quality of life 2024 guidelines management

Finding Sources
Reading Article

PMID: 38280434

Reading Article

PMID: 40183418

Searching PubMed

uterine leiomyoma symptoms burden quality life heavy menstrual bleeding

Finding Sources
Reading Article

PMID: 36370871

Reading Article

PMID: 39277104

Finding Sources
Finding Sources
Reading File
Reading File
Finding Sources
Finding Sources
Reading File
Reading File
Running Command

mkdir -p /home/daytona/workspace/uterine-fibroid-case && ls /home/daytona/workspace/uterine-fibroid-case

Writing File

~/uterine-fibroid-case/build_case_paper.py

#!/usr/bin/env python3
"""
Case Paper: Uterine Fibroid Impact on Women's Health and Quality of Life
For Gynecology Resident Presentation
"""

from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.lib import colors
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY, TA_RIGHT

# ── Color Palette ──────────────────────────────────────────────────────────────
DARK_BLUE   = colors.HexColor('#1A3A5C')
MED_BLUE    = colors.HexColor('#2C6FAC')
LIGHT_BLUE  = colors.HexColor('#D6E8F7')
ACCENT_TEAL = colors.HexColor('#1B8A8E')
ACCENT_PINK = colors.HexColor('#C0395A')
LIGHT_PINK  = colors.HexColor('#FDEEF3')
LIGHT_GREY  = colors.HexColor('#F5F5F5')
MID_GREY    = colors.HexColor('#888888')
WHITE       = colors.white
BLACK       = colors.black

# ── Styles ─────────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()

def S(name, **kwargs):
    """Create a named ParagraphStyle."""
    base = styles.get(name, styles['Normal'])
    return ParagraphStyle(name + str(id(kwargs)), parent=base, **kwargs)

COVER_TITLE = S('Normal', fontSize=26, textColor=WHITE, alignment=TA_CENTER,
                fontName='Helvetica-Bold', leading=32, spaceAfter=6)
COVER_SUB   = S('Normal', fontSize=13, textColor=LIGHT_BLUE, alignment=TA_CENTER,
                fontName='Helvetica', leading=18)
COVER_META  = S('Normal', fontSize=10, textColor=LIGHT_BLUE, alignment=TA_CENTER,
                fontName='Helvetica', leading=14)

H1 = S('Normal', fontSize=15, textColor=WHITE, fontName='Helvetica-Bold',
        leading=20, spaceBefore=4, spaceAfter=4, alignment=TA_LEFT)
H2 = S('Normal', fontSize=12, textColor=DARK_BLUE, fontName='Helvetica-Bold',
        leading=16, spaceBefore=8, spaceAfter=3)
H3 = S('Normal', fontSize=10.5, textColor=ACCENT_TEAL, fontName='Helvetica-Bold',
        leading=14, spaceBefore=5, spaceAfter=2)
BODY = S('Normal', fontSize=9.5, textColor=BLACK, fontName='Helvetica',
         leading=14, spaceBefore=2, spaceAfter=2, alignment=TA_JUSTIFY)
BODY_B = S('Normal', fontSize=9.5, textColor=BLACK, fontName='Helvetica-Bold',
           leading=14, spaceBefore=2, spaceAfter=2)
BULLET = S('Normal', fontSize=9.5, textColor=BLACK, fontName='Helvetica',
           leading=13, leftIndent=14, spaceBefore=1, spaceAfter=1)
SMALL  = S('Normal', fontSize=8, textColor=MID_GREY, fontName='Helvetica',
           leading=11, spaceAfter=2, alignment=TA_LEFT)
CITE   = S('Normal', fontSize=8, textColor=MID_GREY, fontName='Helvetica-Oblique',
           leading=11, leftIndent=12, spaceAfter=1, alignment=TA_LEFT)
CAPTION = S('Normal', fontSize=8, textColor=MID_GREY, fontName='Helvetica-Oblique',
            leading=11, alignment=TA_CENTER)
TABLE_HDR = S('Normal', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold',
              leading=12, alignment=TA_CENTER)
TABLE_CELL = S('Normal', fontSize=8.5, textColor=BLACK, fontName='Helvetica',
               leading=12, alignment=TA_LEFT)
TABLE_CELL_C = S('Normal', fontSize=8.5, textColor=BLACK, fontName='Helvetica',
                 leading=12, alignment=TA_CENTER)
HIGHLIGHT = S('Normal', fontSize=9.5, textColor=DARK_BLUE, fontName='Helvetica-Bold',
              leading=13, alignment=TA_CENTER, spaceBefore=4, spaceAfter=4)

# ── Helper: Section Banner ────────────────────────────────────────────────────
def section_banner(text, color=DARK_BLUE):
    tbl = Table([[Paragraph(text, H1)]], colWidths=[17.6*cm])
    tbl.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), color),
        ('TOPPADDING', (0,0), (-1,-1), 6),
        ('BOTTOMPADDING', (0,0), (-1,-1), 6),
        ('LEFTPADDING', (0,0), (-1,-1), 10),
        ('RIGHTPADDING', (0,0), (-1,-1), 10),
        ('ROUNDEDCORNERS', [4, 4, 4, 4]),
    ]))
    return tbl

# ── Helper: Highlighted Box ───────────────────────────────────────────────────
def info_box(text, bg=LIGHT_BLUE, left_color=MED_BLUE):
    content = [[Paragraph(text, BODY)]]
    tbl = Table(content, colWidths=[17.6*cm])
    tbl.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), bg),
        ('TOPPADDING', (0,0), (-1,-1), 8),
        ('BOTTOMPADDING', (0,0), (-1,-1), 8),
        ('LEFTPADDING', (0,0), (-1,-1), 12),
        ('RIGHTPADDING', (0,0), (-1,-1), 12),
        ('LINEWIDTH', (0,0), (0,-1), 3),
        ('LINECOLOR', (0,0), (0,-1), left_color),
    ]))
    return tbl

def key_stat_row(items):
    """3-column key stats row. items = list of (value, label) tuples."""
    cells = []
    for val, lbl in items:
        cell_content = [
            Paragraph(f'<font size=18 color="{DARK_BLUE.hexval()}"><b>{val}</b></font>', HIGHLIGHT),
            Paragraph(lbl, CAPTION),
        ]
        cells.append(cell_content)
    col_w = 17.6 * cm / len(items)
    tbl = Table([cells], colWidths=[col_w]*len(items))
    tbl.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), LIGHT_BLUE),
        ('ALIGN', (0,0), (-1,-1), 'CENTER'),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('TOPPADDING', (0,0), (-1,-1), 10),
        ('BOTTOMPADDING', (0,0), (-1,-1), 10),
        ('LINEAFTER', (0,0), (-2,-1), 0.5, colors.HexColor('#AAAAAA')),
    ]))
    return tbl

# ─────────────────────────────────────────────────────────────────────────────
# DOCUMENT CONTENT
# ─────────────────────────────────────────────────────────────────────────────
story = []

# ══════════════════════════════════════════════════════════════════════════════
# COVER PAGE
# ══════════════════════════════════════════════════════════════════════════════
# Full-page cover table
cover_rows = [
    [Paragraph('CASE PAPER PRESENTATION', COVER_META)],
    [Spacer(1, 0.5*cm)],
    [Paragraph('Uterine Fibroids:', COVER_TITLE)],
    [Paragraph('Impact on Women\'s Health &<br/>Quality of Life', COVER_TITLE)],
    [Spacer(1, 0.6*cm)],
    [HRFlowable(width=8*cm, thickness=2, color=ACCENT_PINK, hAlign='CENTER')],
    [Spacer(1, 0.6*cm)],
    [Paragraph('Department of Obstetrics &amp; Gynaecology', COVER_SUB)],
    [Paragraph('Resident Case Conference - May 2026', COVER_SUB)],
    [Spacer(1, 1*cm)],
    [Paragraph(
        '<i>"Fibroids affect up to 80% of women by age 50,<br/>'
        'yet their profound impact on quality of life<br/>remains vastly under-recognised."</i>',
        COVER_META)],
]
cover_tbl = Table(cover_rows, colWidths=[17.6*cm])
cover_tbl.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), DARK_BLUE),
    ('TOPPADDING', (0,0), (-1,-1), 6),
    ('BOTTOMPADDING', (0,0), (-1,-1), 6),
    ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
    ('ALIGN', (0,0), (-1,-1), 'CENTER'),
    ('ROUNDEDCORNERS', [8, 8, 8, 8]),
]))
# Wrap cover in full-page table
outer = Table([[cover_tbl]], colWidths=[17.6*cm], rowHeights=[24*cm])
outer.setStyle(TableStyle([
    ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
    ('ALIGN', (0,0), (-1,-1), 'CENTER'),
]))
story.append(outer)
story.append(PageBreak())

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 1 - INTRODUCTION & EPIDEMIOLOGY
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_banner('1. Introduction & Epidemiology'))
story.append(Spacer(1, 6))

story.append(Paragraph(
    'Uterine leiomyomas (fibroids, myomas) are the most common benign tumours of '
    'the female genital tract, arising from smooth muscle cells of the myometrium. '
    'Despite their benign nature, symptomatic fibroids impose a significant burden '
    'on physical health, mental well-being, sexual function, work productivity, and '
    'overall quality of life (QoL). This case paper explores these dimensions through '
    'an illustrative representative case.', BODY))
story.append(Spacer(1, 6))

story.append(key_stat_row([
    ('70-80%', 'Cumulative incidence by age 50'),
    ('30%', 'Are symptomatic'),
    ('25-50%', 'Cause significant QoL impairment'),
]))
story.append(Spacer(1, 8))

# Epidemiology table
epi_data = [
    [Paragraph('Parameter', TABLE_HDR), Paragraph('Data', TABLE_HDR)],
    [Paragraph('Global prevalence', TABLE_CELL), Paragraph('Affects 25-40% of women of reproductive age; lifetime incidence up to 80% by age 50', TABLE_CELL)],
    [Paragraph('Racial disparity', TABLE_CELL), Paragraph('Black women: 2-3x higher risk, earlier onset (mid-20s), more severe symptoms', TABLE_CELL)],
    [Paragraph('Peak incidence', TABLE_CELL), Paragraph('30-40 years (reproductive years); regress post-menopause', TABLE_CELL)],
    [Paragraph('Asymptomatic', TABLE_CELL), Paragraph('50-75% unaware of their condition; found incidentally on imaging', TABLE_CELL)],
    [Paragraph('Treatment delay', TABLE_CELL), Paragraph('Average 3.6 years before seeking treatment; 32% wait >5 years (Mayo Clinic, AJOG)', TABLE_CELL)],
    [Paragraph('Economic burden', TABLE_CELL), Paragraph('Annual US cost: $5.9-34.4 billion (direct + indirect costs)', TABLE_CELL)],
]
epi_tbl = Table(epi_data, colWidths=[5.5*cm, 12.1*cm])
epi_tbl.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), DARK_BLUE),
    ('BACKGROUND', (0,1), (-1,1), LIGHT_BLUE),
    ('BACKGROUND', (0,2), (-1,2), WHITE),
    ('BACKGROUND', (0,3), (-1,3), LIGHT_BLUE),
    ('BACKGROUND', (0,4), (-1,4), WHITE),
    ('BACKGROUND', (0,5), (-1,5), LIGHT_BLUE),
    ('BACKGROUND', (0,6), (-1,6), WHITE),
    ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#CCCCCC')),
    ('TOPPADDING', (0,0), (-1,-1), 5),
    ('BOTTOMPADDING', (0,0), (-1,-1), 5),
    ('LEFTPADDING', (0,0), (-1,-1), 7),
    ('RIGHTPADDING', (0,0), (-1,-1), 7),
    ('VALIGN', (0,0), (-1,-1), 'TOP'),
]))
story.append(epi_tbl)
story.append(Spacer(1, 8))

# Aetiology
story.append(Paragraph('Aetiology & Pathogenesis', H2))
story.append(Paragraph(
    'Leiomyomas arise from a single smooth muscle cell that undergoes somatic '
    'mutation. Growth is hormonally driven - both oestrogen and progesterone '
    'stimulate fibroid proliferation. Key risk factors include:', BODY))
risk_items = [
    ('<b>Genetic:</b> Chromosomal alterations (del(7q), t(12;14), HMGA2, MED12 mutations)',),
    ('<b>Hormonal:</b> Oestrogen and progesterone dependence (fibroid-free pre-menarche; regress post-menopause)',),
    ('<b>Race:</b> Black/African-American women disproportionately affected',),
    ('<b>Reproductive factors:</b> Nulliparity, early menarche',),
    ('<b>Metabolic:</b> Obesity (BMI >30 increases risk), hypertension, diabetes',),
    ('<b>Dietary:</b> Red meat intake increases risk; green vegetables and fruit protective',),
]
for item in risk_items:
    story.append(Paragraph(f'• {item[0]}', BULLET))
story.append(Spacer(1, 6))

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 2 - CASE PRESENTATION
# ══════════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
story.append(section_banner('2. Illustrative Case Presentation', color=ACCENT_PINK))
story.append(Spacer(1, 6))

story.append(info_box(
    '<b>Patient:</b> Mrs. S.K. | <b>Age:</b> 34 years | <b>Parity:</b> P1L1 | '
    '<b>Occupation:</b> Schoolteacher | <b>Referred from:</b> Primary Health Centre',
    bg=LIGHT_PINK, left_color=ACCENT_PINK))
story.append(Spacer(1, 8))

story.append(Paragraph('Chief Complaints', H2))
complaints = [
    '1. Excessively heavy menstrual bleeding (HMB) - 18 months',
    '2. Dragging lower abdominal pain and pelvic pressure - 12 months',
    '3. Fatigue, easy breathlessness on exertion - 6 months',
    '4. Urinary frequency and incomplete bladder emptying - 4 months',
    '5. Inability to conceive (secondary infertility) - attempting for 2 years',
]
for c in complaints:
    story.append(Paragraph(c, BULLET))
story.append(Spacer(1, 6))

story.append(Paragraph('History of Present Illness', H2))
story.append(Paragraph(
    'Mrs. S.K. presented with a progressively worsening 18-month history of heavy '
    'menstrual bleeding. She reported soaking 8-10 pads per day for 7-8 days per '
    'cycle, passing large clots, and requiring double protection at night. She had '
    'been missing 2-3 days of school per month during her periods. She described '
    'constant pelvic pressure and a dull dragging lower abdominal pain that '
    'worsened premenstrually.', BODY))
story.append(Spacer(1, 4))
story.append(Paragraph(
    'She reported progressive fatigue, difficulty climbing stairs, and palpitations '
    'on minimal exertion over the past 6 months. Urinary frequency (10-12 times/day) '
    'and a sensation of incomplete voiding had developed over the past 4 months. '
    'She denied haematuria, bowel symptoms, or post-coital bleeding. Sexual '
    'intercourse had become uncomfortable due to deep dyspareunia.', BODY))
story.append(Spacer(1, 4))
story.append(Paragraph(
    'She and her husband had been trying to conceive for 2 years without success '
    'despite regular unprotected intercourse. She reported significant psychological '
    'distress, anxiety about cancer, and fear of needing a hysterectomy.', BODY))
story.append(Spacer(1, 6))

# History boxes in 2-col layout
hist_data = [
    [Paragraph('Menstrual History', H3), Paragraph('Past Medical / Surgical History', H3)],
    [
        Paragraph(
            '<b>Menarche:</b> 12 years<br/>'
            '<b>Cycle:</b> Irregular, 21-28 days<br/>'
            '<b>Flow:</b> Very heavy, 7-8 days<br/>'
            '<b>Dysmenorrhoea:</b> Severe (VAS 8/10)<br/>'
            '<b>Dyspareunia:</b> Deep, cyclical<br/>'
            '<b>LMP:</b> 14 days ago', TABLE_CELL),
        Paragraph(
            '<b>Medical:</b> Nil significant<br/>'
            '<b>Surgical:</b> LSCS x1 (5 years ago)<br/>'
            '<b>Gynaec:</b> No prior fibroid diagnosis<br/>'
            '<b>Medications:</b> OTC NSAIDs for pain<br/>'
            '<b>Allergies:</b> Nil known<br/>'
            '<b>Family Hx:</b> Mother - hysterectomy at 42', TABLE_CELL),
    ],
]
hist_tbl = Table(hist_data, colWidths=[8.8*cm, 8.8*cm])
hist_tbl.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (0,0), LIGHT_BLUE),
    ('BACKGROUND', (1,0), (1,0), LIGHT_PINK),
    ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#CCCCCC')),
    ('TOPPADDING', (0,0), (-1,-1), 6),
    ('BOTTOMPADDING', (0,0), (-1,-1), 6),
    ('LEFTPADDING', (0,0), (-1,-1), 8),
    ('RIGHTPADDING', (0,0), (-1,-1), 8),
    ('VALIGN', (0,0), (-1,-1), 'TOP'),
]))
story.append(hist_tbl)
story.append(Spacer(1, 8))

story.append(Paragraph('Physical Examination', H2))
exam_data = [
    [Paragraph('System', TABLE_HDR), Paragraph('Finding', TABLE_HDR), Paragraph('Significance', TABLE_HDR)],
    [Paragraph('General', TABLE_CELL), Paragraph('Pallor ++, conjunctival pallor, tachycardia (HR 104), BP 110/70 mmHg', TABLE_CELL), Paragraph('Anaemia, compensatory response', TABLE_CELL)],
    [Paragraph('Abdomen', TABLE_CELL), Paragraph('Lower abdomen: firm, irregular mass palpable up to umbilicus, non-tender', TABLE_CELL), Paragraph('Corresponds to ~20-week uterine size', TABLE_CELL)],
    [Paragraph('P/S Examination', TABLE_CELL), Paragraph('Cervix healthy, no contact bleeding; uterus bulky, irregular felt through vault', TABLE_CELL), Paragraph('No concurrent cervical pathology', TABLE_CELL)],
    [Paragraph('P/V Examination', TABLE_CELL), Paragraph('Uterus 20-week size, irregular, firm, non-tender; limited mobility', TABLE_CELL), Paragraph('Multiple large fibroids', TABLE_CELL)],
    [Paragraph('Rectal exam', TABLE_CELL), Paragraph('Rectal mucosa free; no posterior pelvic masses', TABLE_CELL), Paragraph('No rectal involvement', TABLE_CELL)],
]
exam_tbl = Table(exam_data, colWidths=[3.5*cm, 8.5*cm, 5.6*cm])
exam_tbl.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), MED_BLUE),
    ('ROWBACKGROUNDS', (0,1), (-1,-1), [LIGHT_GREY, WHITE]),
    ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#CCCCCC')),
    ('TOPPADDING', (0,0), (-1,-1), 5),
    ('BOTTOMPADDING', (0,0), (-1,-1), 5),
    ('LEFTPADDING', (0,0), (-1,-1), 6),
    ('RIGHTPADDING', (0,0), (-1,-1), 6),
    ('VALIGN', (0,0), (-1,-1), 'TOP'),
]))
story.append(exam_tbl)
story.append(Spacer(1, 8))

story.append(Paragraph('Investigations', H2))
inv_data = [
    [Paragraph('Investigation', TABLE_HDR), Paragraph('Result', TABLE_HDR), Paragraph('Reference', TABLE_HDR), Paragraph('Comment', TABLE_HDR)],
    [Paragraph('Hb', TABLE_CELL), Paragraph('7.2 g/dL', TABLE_CELL), Paragraph('11.5-16', TABLE_CELL), Paragraph('Severe iron deficiency anaemia', TABLE_CELL)],
    [Paragraph('MCV / MCH', TABLE_CELL), Paragraph('62 fL / 18 pg', TABLE_CELL), Paragraph('80-100 / 27-32', TABLE_CELL), Paragraph('Microcytic hypochromic pattern', TABLE_CELL)],
    [Paragraph('Serum ferritin', TABLE_CELL), Paragraph('4 ng/mL', TABLE_CELL), Paragraph('12-200', TABLE_CELL), Paragraph('Severely depleted iron stores', TABLE_CELL)],
    [Paragraph('TSH', TABLE_CELL), Paragraph('2.1 mIU/L', TABLE_CELL), Paragraph('0.4-4.0', TABLE_CELL), Paragraph('Normal - rules out thyroid cause', TABLE_CELL)],
    [Paragraph('Coagulation screen', TABLE_CELL), Paragraph('Normal', TABLE_CELL), Paragraph('Normal', TABLE_CELL), Paragraph('No coagulopathy', TABLE_CELL)],
    [Paragraph('PAP smear', TABLE_CELL), Paragraph('NILM', TABLE_CELL), Paragraph('-', TABLE_CELL), Paragraph('No cervical abnormality', TABLE_CELL)],
    [Paragraph('Endometrial biopsy', TABLE_CELL), Paragraph('Secretory endometrium, no atypia', TABLE_CELL), Paragraph('-', TABLE_CELL), Paragraph('Benign - no hyperplasia/malignancy', TABLE_CELL)],
    [Paragraph('Pelvic USS (TVS)', TABLE_CELL), Paragraph('Uterus: 18x14x11 cm. Multiple fibroids: largest intramural 8.2 cm posterior wall; 2 submucosal (FIGO type 1 & 2); 1 subserosal 5 cm. No adnexal pathology. Endometrium: 9 mm', TABLE_CELL), Paragraph('-', TABLE_CELL), Paragraph('Multiple fibroids distorting uterine cavity - FIGO Classification assessed', TABLE_CELL)],
    [Paragraph('MRI Pelvis', TABLE_CELL), Paragraph('Confirms 6 fibroids; submucosal type 1 (3.2 cm) distorting cavity significantly. No degenerative malignant features. Ovaries normal.', TABLE_CELL), Paragraph('-', TABLE_CELL), Paragraph('Gold standard for surgical planning', TABLE_CELL)],
    [Paragraph('HSG / SIS', TABLE_CELL), Paragraph('Significant cavity distortion by submucosal fibroids bilaterally', TABLE_CELL), Paragraph('-', TABLE_CELL), Paragraph('Contributes to infertility', TABLE_CELL)],
]
inv_tbl = Table(inv_data, colWidths=[3.2*cm, 5.5*cm, 2.8*cm, 6.1*cm])
inv_tbl.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), DARK_BLUE),
    ('ROWBACKGROUNDS', (0,1), (-1,-1), [LIGHT_BLUE, WHITE]),
    ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#CCCCCC')),
    ('TOPPADDING', (0,0), (-1,-1), 4),
    ('BOTTOMPADDING', (0,0), (-1,-1), 4),
    ('LEFTPADDING', (0,0), (-1,-1), 5),
    ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ('VALIGN', (0,0), (-1,-1), 'TOP'),
    ('FONTSIZE', (0,1), (-1,-1), 8),
]))
story.append(inv_tbl)
story.append(Spacer(1, 8))

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 3 - FIBROID CLASSIFICATION
# ══════════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
story.append(section_banner('3. Classification of Uterine Fibroids (FIGO / PALM-COEIN)', color=ACCENT_TEAL))
story.append(Spacer(1, 6))

story.append(Paragraph(
    'The FIGO PALM-COEIN classification system (2011, updated 2018) provides the '
    'current standard for categorising abnormal uterine bleeding including that caused '
    'by fibroids. Leiomyomas are assigned subtype designations 0-8 based on location:', BODY))
story.append(Spacer(1, 4))

figo_data = [
    [Paragraph('FIGO Type', TABLE_HDR), Paragraph('Location', TABLE_HDR), Paragraph('Clinical Relevance', TABLE_HDR), Paragraph('In this Case', TABLE_HDR)],
    [Paragraph('Type 0', TABLE_CELL), Paragraph('Pedunculated intracavitary (submucosal)', TABLE_CELL), Paragraph('Heaviest bleeding; most fertility impact', TABLE_CELL), Paragraph('No', TABLE_CELL)],
    [Paragraph('Type 1', TABLE_CELL), Paragraph('Submucosal <50% intramural', TABLE_CELL), Paragraph('Significant bleeding & infertility', TABLE_CELL), Paragraph('<b>YES - 3.2 cm</b>', TABLE_CELL)],
    [Paragraph('Type 2', TABLE_CELL), Paragraph('Submucosal >=50% intramural', TABLE_CELL), Paragraph('Bleeding; cavity distortion', TABLE_CELL), Paragraph('<b>YES</b>', TABLE_CELL)],
    [Paragraph('Type 3', TABLE_CELL), Paragraph('Intramural - contacts endometrium', TABLE_CELL), Paragraph('Bleeding, bulk symptoms', TABLE_CELL), Paragraph('Likely', TABLE_CELL)],
    [Paragraph('Type 4', TABLE_CELL), Paragraph('Intramural - entirely within myometrium', TABLE_CELL), Paragraph('Bulk symptoms, pain', TABLE_CELL), Paragraph('<b>YES - 8.2 cm</b>', TABLE_CELL)],
    [Paragraph('Type 5-6', TABLE_CELL), Paragraph('Subserosal (intramural >=/<50%)', TABLE_CELL), Paragraph('Pressure symptoms, mass effect', TABLE_CELL), Paragraph('<b>YES - 5 cm</b>', TABLE_CELL)],
    [Paragraph('Type 7', TABLE_CELL), Paragraph('Subserosal pedunculated', TABLE_CELL), Paragraph('Risk of torsion', TABLE_CELL), Paragraph('No', TABLE_CELL)],
    [Paragraph('Type 8', TABLE_CELL), Paragraph('Cervical/broad ligament/parasitic', TABLE_CELL), Paragraph('Urinary/bowel obstruction', TABLE_CELL), Paragraph('No', TABLE_CELL)],
]
figo_tbl = Table(figo_data, colWidths=[2.4*cm, 5.2*cm, 5.5*cm, 4.5*cm])
figo_tbl.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), ACCENT_TEAL),
    ('ROWBACKGROUNDS', (0,1), (-1,-1), [LIGHT_BLUE, WHITE]),
    ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#CCCCCC')),
    ('TOPPADDING', (0,0), (-1,-1), 5),
    ('BOTTOMPADDING', (0,0), (-1,-1), 5),
    ('LEFTPADDING', (0,0), (-1,-1), 5),
    ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ('VALIGN', (0,0), (-1,-1), 'TOP'),
]))
story.append(figo_tbl)
story.append(Spacer(1, 6))

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 4 - IMPACT ON QOL
# ══════════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
story.append(section_banner('4. Impact on Women\'s Health & Quality of Life'))
story.append(Spacer(1, 6))

story.append(Paragraph(
    'Symptomatic uterine fibroids have a multi-dimensional impact extending far '
    'beyond the uterus. The Uterine Fibroid Symptom and Quality of Life (UFS-QoL) '
    'questionnaire captures six key domains. In Mrs. S.K., all six were substantially '
    'impaired:', BODY))
story.append(Spacer(1, 6))

# 4a - Physical
story.append(Paragraph('4.1 Physical Health Impact', H2))

phys_data = [
    [Paragraph('Domain', TABLE_HDR), Paragraph('Manifestation in Case', TABLE_HDR), Paragraph('Mechanism', TABLE_HDR)],
    [Paragraph('Heavy Menstrual Bleeding (HMB)', TABLE_CELL),
     Paragraph('8-10 pads/day x 7-8 days; clots; double protection at night', TABLE_CELL),
     Paragraph('Submucosal fibroids increase endometrial surface area; impair haemostasis; increase angiogenesis (VEGF)', TABLE_CELL)],
    [Paragraph('Iron Deficiency Anaemia', TABLE_CELL),
     Paragraph('Hb 7.2 g/dL, ferritin 4 ng/mL; pallor, tachycardia', TABLE_CELL),
     Paragraph('Chronic blood loss exceeds erythropoiesis; leads to cardiovascular stress', TABLE_CELL)],
    [Paragraph('Pelvic Pain & Dysmenorrhoea', TABLE_CELL),
     Paragraph('VAS 8/10; non-cyclic pressure + cyclic cramping', TABLE_CELL),
     Paragraph('Mass effect; prostaglandin release; myometrial ischaemia', TABLE_CELL)],
    [Paragraph('Bulk Symptoms', TABLE_CELL),
     Paragraph('Urinary frequency (10-12x/day); incomplete voiding', TABLE_CELL),
     Paragraph('20-week uterus compresses bladder trigone/ureters', TABLE_CELL)],
    [Paragraph('Dyspareunia', TABLE_CELL),
     Paragraph('Deep pain on intercourse; avoidance behaviour', TABLE_CELL),
     Paragraph('Posterior intramural fibroid + pelvic congestion', TABLE_CELL)],
    [Paragraph('Bowel symptoms', TABLE_CELL),
     Paragraph('Rare in this case; potential constipation with large posterior fibroids', TABLE_CELL),
     Paragraph('Rectal compression by posterior wall fibroids', TABLE_CELL)],
]
phys_tbl = Table(phys_data, colWidths=[4.2*cm, 6.0*cm, 7.4*cm])
phys_tbl.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), MED_BLUE),
    ('ROWBACKGROUNDS', (0,1), (-1,-1), [LIGHT_BLUE, WHITE]),
    ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#CCCCCC')),
    ('TOPPADDING', (0,0), (-1,-1), 5),
    ('BOTTOMPADDING', (0,0), (-1,-1), 5),
    ('LEFTPADDING', (0,0), (-1,-1), 5),
    ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ('VALIGN', (0,0), (-1,-1), 'TOP'),
    ('FONTSIZE', (0,1), (-1,-1), 8.5),
]))
story.append(phys_tbl)
story.append(Spacer(1, 8))

# 4b - Reproductive
story.append(Paragraph('4.2 Reproductive Health & Fertility Impact', H2))
story.append(info_box(
    '<b>In this case:</b> Mrs. S.K. has been unable to conceive for 2 years. '
    'Hysteroscopy and MRI confirm submucosal fibroids (FIGO Type 1 & 2) distorting '
    'the uterine cavity - a recognised cause of implantation failure and recurrent '
    'pregnancy loss.',
    bg=LIGHT_PINK, left_color=ACCENT_PINK))
story.append(Spacer(1, 4))

repro_items = [
    ('<b>Implantation failure:</b> Submucosal fibroids distort the endometrial cavity, interfere with endometrial receptivity, and impair sperm transport.',),
    ('<b>Recurrent miscarriage:</b> Intracavitary or type 1/2 submucosal fibroids are associated with 1st and 2nd trimester losses.',),
    ('<b>Preterm labour:</b> Large intramural fibroids reduce uterine volume and increase uterine irritability.',),
    ('<b>Malpresentation:</b> Obstruction of normal fetal descent; increased LSCS rate.',),
    ('<b>Placental abruption / PPH:</b> Impaired uterine contractility at placental site.',),
    ('<b>Post-myomectomy fertility:</b> Removal of submucosal fibroids significantly improves conception rates (RR ~2.0).',),
]
for item in repro_items:
    story.append(Paragraph(f'• {item[0]}', BULLET))
story.append(Spacer(1, 8))

# 4c - Psychological
story.append(Paragraph('4.3 Psychological & Mental Health Impact', H2))

psych_data = [
    [Paragraph('Dimension', TABLE_HDR), Paragraph('Prevalence / Impact', TABLE_HDR), Paragraph('In this Case', TABLE_HDR)],
    [Paragraph('Anxiety & Fear', TABLE_CELL),
     Paragraph('79% fear fibroids will grow; 55% fear needing hysterectomy (Mayo Clinic survey, ~1000 women)', TABLE_CELL),
     Paragraph('YES - expressed fear of hysterectomy and cancer', TABLE_CELL)],
    [Paragraph('Depression', TABLE_CELL),
     Paragraph('Women with fibroids have significantly higher rates of depression & anxiety vs. controls', TABLE_CELL),
     Paragraph('Tearful, withdrawn, poor concentration', TABLE_CELL)],
    [Paragraph('Body Image', TABLE_CELL),
     Paragraph('Enlarged abdomen causes self-consciousness; avoidance of social activities', TABLE_CELL),
     Paragraph('Avoids fitted clothing; embarrassed at work', TABLE_CELL)],
    [Paragraph('Hopelessness', TABLE_CELL),
     Paragraph('Feeling of loss of control; anticipatory grief about fertility', TABLE_CELL),
     Paragraph('Distressed about secondary infertility for 2 years', TABLE_CELL)],
    [Paragraph('Sexual Function', TABLE_CELL),
     Paragraph('Decreased libido; avoidance of intercourse; relationship strain in ~40%', TABLE_CELL),
     Paragraph('Dyspareunia; reduced intimacy with partner', TABLE_CELL)],
]
psych_tbl = Table(psych_data, colWidths=[4.0*cm, 7.5*cm, 6.1*cm])
psych_tbl.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), ACCENT_PINK),
    ('ROWBACKGROUNDS', (0,1), (-1,-1), [LIGHT_PINK, WHITE]),
    ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#CCCCCC')),
    ('TOPPADDING', (0,0), (-1,-1), 5),
    ('BOTTOMPADDING', (0,0), (-1,-1), 5),
    ('LEFTPADDING', (0,0), (-1,-1), 5),
    ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ('VALIGN', (0,0), (-1,-1), 'TOP'),
    ('FONTSIZE', (0,1), (-1,-1), 8.5),
]))
story.append(psych_tbl)
story.append(Spacer(1, 8))

# 4d - Occupational / Social
story.append(Paragraph('4.4 Occupational & Social Impact', H2))
story.append(Paragraph(
    'The Mayo Clinic landmark survey (AJOG / J Womens Health) of ~1000 women with '
    'fibroids found:', BODY))
occ_items = [
    '66% were concerned about missed days from work due to symptoms',
    '24% of employed women felt fibroid symptoms interfered with work performance',
    'Average 3.6 years of treatment delay - with 32% waiting >5 years before seeking help',
    'Women with fibroids reported significantly impaired social, recreational, and family activities',
]
for item in occ_items:
    story.append(Paragraph(f'• {item}', BULLET))
story.append(Spacer(1, 4))
story.append(info_box(
    '<b>In Mrs. S.K.:</b> Missing 2-3 school days per month during her period; unable '
    'to participate in sports activities; social isolation due to embarrassment about '
    'heavy bleeding and enlarged abdomen. Economic loss from absenteeism estimated '
    'at 2-3% of annual salary.',
    bg=LIGHT_BLUE, left_color=MED_BLUE))
story.append(Spacer(1, 6))

# UFS-QoL Summary
story.append(Paragraph('4.5 UFS-QoL Score Profile (Estimated for Case)', H2))
ufsqol_data = [
    [Paragraph('UFS-QoL Domain', TABLE_HDR), Paragraph('Estimated Score*', TABLE_HDR), Paragraph('Normal Range', TABLE_HDR), Paragraph('Impairment Level', TABLE_HDR)],
    [Paragraph('Symptom Severity (SS)', TABLE_CELL), Paragraph('72/100', TABLE_CELL), Paragraph('<30 = mild', TABLE_CELL), Paragraph('SEVERE', TABLE_CELL)],
    [Paragraph('Concern', TABLE_CELL), Paragraph('32/100', TABLE_CELL), Paragraph('>70 = good', TABLE_CELL), Paragraph('SEVERE', TABLE_CELL)],
    [Paragraph('Activities', TABLE_CELL), Paragraph('38/100', TABLE_CELL), Paragraph('>70 = good', TABLE_CELL), Paragraph('SEVERE', TABLE_CELL)],
    [Paragraph('Energy / Mood', TABLE_CELL), Paragraph('29/100', TABLE_CELL), Paragraph('>70 = good', TABLE_CELL), Paragraph('SEVERE', TABLE_CELL)],
    [Paragraph('Control', TABLE_CELL), Paragraph('35/100', TABLE_CELL), Paragraph('>70 = good', TABLE_CELL), Paragraph('SEVERE', TABLE_CELL)],
    [Paragraph('Self-Consciousness', TABLE_CELL), Paragraph('30/100', TABLE_CELL), Paragraph('>70 = good', TABLE_CELL), Paragraph('SEVERE', TABLE_CELL)],
    [Paragraph('Sexual Function', TABLE_CELL), Paragraph('28/100', TABLE_CELL), Paragraph('>70 = good', TABLE_CELL), Paragraph('SEVERE', TABLE_CELL)],
    [Paragraph('Total HR-QoL Score', TABLE_CELL_C), Paragraph('32/100', TABLE_CELL_C), Paragraph('>70 = good', TABLE_CELL_C), Paragraph('<b>SEVERELY IMPAIRED</b>', TABLE_CELL_C)],
]
ufsqol_tbl = Table(ufsqol_data, colWidths=[4.8*cm, 3.2*cm, 4.2*cm, 5.4*cm])
ufsqol_tbl.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), DARK_BLUE),
    ('ROWBACKGROUNDS', (0,1), (-1,-2), [LIGHT_BLUE, WHITE]),
    ('BACKGROUND', (0,-1), (-1,-1), colors.HexColor('#FFE4E4')),
    ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#CCCCCC')),
    ('TOPPADDING', (0,0), (-1,-1), 5),
    ('BOTTOMPADDING', (0,0), (-1,-1), 5),
    ('LEFTPADDING', (0,0), (-1,-1), 5),
    ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
]))
story.append(ufsqol_tbl)
story.append(Spacer(1, 4))
story.append(Paragraph(
    '* Scores estimated based on symptom severity documented in the history. '
    'UFS-QoL HR-QoL: higher = better QoL; SS scale: higher = worse symptoms.',
    SMALL))
story.append(Spacer(1, 6))

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 5 - DIAGNOSIS APPROACH
# ══════════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
story.append(section_banner('5. Diagnostic Approach', color=MED_BLUE))
story.append(Spacer(1, 6))

story.append(Paragraph('Differential Diagnosis', H2))
dd_data = [
    [Paragraph('Condition', TABLE_HDR), Paragraph('Distinguishing Features', TABLE_HDR), Paragraph('Excluded by', TABLE_HDR)],
    [Paragraph('Adenomyosis', TABLE_CELL), Paragraph('Diffusely enlarged globular uterus; severe dysmenorrhoea; junctional zone >12mm on MRI', TABLE_CELL), Paragraph('MRI: no JZ thickening; discrete fibroids confirmed', TABLE_CELL)],
    [Paragraph('Endometrial hyperplasia/carcinoma', TABLE_CELL), Paragraph('Postmenopausal / abnormal bleeding; endometrial thickening with atypia', TABLE_CELL), Paragraph('Endometrial biopsy: no atypia; premenopausal', TABLE_CELL)],
    [Paragraph('Ovarian mass', TABLE_CELL), Paragraph('Adnexal mass; may be separate from uterus on imaging', TABLE_CELL), Paragraph('USS + MRI: mass arises from uterus; ovaries normal', TABLE_CELL)],
    [Paragraph('Leiomyosarcoma', TABLE_CELL), Paragraph('Rapid growth; heterogeneous signal on MRI; postmenopausal', TABLE_CELL), Paragraph('MRI: no malignant features; age 34; no rapid growth', TABLE_CELL)],
    [Paragraph('Coagulopathy', TABLE_CELL), Paragraph('Personal/family bleeding history; mucocutaneous bleeding; abnormal coag screen', TABLE_CELL), Paragraph('Normal coagulation screen; no other bleeding sites', TABLE_CELL)],
]
dd_tbl = Table(dd_data, colWidths=[4.2*cm, 7.0*cm, 6.4*cm])
dd_tbl.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), MED_BLUE),
    ('ROWBACKGROUNDS', (0,1), (-1,-1), [LIGHT_BLUE, WHITE]),
    ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#CCCCCC')),
    ('TOPPADDING', (0,0), (-1,-1), 5),
    ('BOTTOMPADDING', (0,0), (-1,-1), 5),
    ('LEFTPADDING', (0,0), (-1,-1), 5),
    ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ('VALIGN', (0,0), (-1,-1), 'TOP'),
    ('FONTSIZE', (0,1), (-1,-1), 8.5),
]))
story.append(dd_tbl)
story.append(Spacer(1, 8))

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 6 - MANAGEMENT
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_banner('6. Management', color=ACCENT_TEAL))
story.append(Spacer(1, 6))

story.append(info_box(
    '<b>Key management goals in this case:</b> (1) Correct severe anaemia, '
    '(2) Control heavy menstrual bleeding, (3) Relieve bulk symptoms, '
    '(4) Restore uterine cavity for fertility, (5) Improve QoL across all domains',
    bg=LIGHT_BLUE, left_color=ACCENT_TEAL))
story.append(Spacer(1, 8))

story.append(Paragraph('6.1 Immediate / Supportive Measures', H2))
imm_items = [
    'IV/oral iron supplementation + haematinics (target Hb >10 g/dL pre-operatively)',
    'Tranexamic acid 1g TDS during menstruation to reduce blood loss by ~50%',
    'NSAIDs (mefenamic acid) for dysmenorrhoea management',
    'Nutritional counselling; high-iron diet',
    'Psychological support and clear counselling addressing cancer fears',
]
for item in imm_items:
    story.append(Paragraph(f'• {item}', BULLET))
story.append(Spacer(1, 6))

story.append(Paragraph('6.2 Medical Management Options', H2))
med_data = [
    [Paragraph('Drug', TABLE_HDR), Paragraph('Class', TABLE_HDR), Paragraph('Effect', TABLE_HDR), Paragraph('Limitation', TABLE_HDR)],
    [Paragraph('GnRH Agonists\n(Leuprolide, Goserelin)', TABLE_CELL),
     Paragraph('GnRH analogue', TABLE_CELL),
     Paragraph('Reduce fibroid volume 35-65%; preop haemoglobin correction (Cochrane 2025)', TABLE_CELL),
     Paragraph('Hypoestrogenic symptoms; bone loss; max 6 months; rebound growth on cessation', TABLE_CELL)],
    [Paragraph('Relugolix Combo\n(40mg+E2+NETA)', TABLE_CELL),
     Paragraph('GnRH antagonist + add-back', TABLE_CELL),
     Paragraph('LIBERTY trials: 73% reduction in MBL; UFS-QoL total score improved +37.6 vs +13.1 placebo (AJOG 2023)', TABLE_CELL),
     Paragraph('Oral daily; not fertility-preserving', TABLE_CELL)],
    [Paragraph('Ulipristal Acetate', TABLE_CELL),
     Paragraph('SPRM', TABLE_CELL),
     Paragraph('PEARL trials: fibroid volume reduction + bleeding control', TABLE_CELL),
     Paragraph('Suspended - risk of serious liver injury (EMA 2020)', TABLE_CELL)],
    [Paragraph('Levonorgestrel-IUS\n(Mirena)', TABLE_CELL),
     Paragraph('Progestogen IUS', TABLE_CELL),
     Paragraph('Reduces HMB by up to 97%; effective for intramural/subserosal fibroids', TABLE_CELL),
     Paragraph('Difficult insertion with large/submucosal fibroids; not fertility-seeking', TABLE_CELL)],
    [Paragraph('Tranexamic acid', TABLE_CELL),
     Paragraph('Antifibrinolytic', TABLE_CELL),
     Paragraph('Reduces MBL by ~50%; symptomatic; no fibroid volume effect', TABLE_CELL),
     Paragraph('Symptomatic only; not suitable long-term', TABLE_CELL)],
]
med_tbl = Table(med_data, colWidths=[3.5*cm, 2.8*cm, 6.0*cm, 5.3*cm])
med_tbl.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), ACCENT_TEAL),
    ('ROWBACKGROUNDS', (0,1), (-1,-1), [LIGHT_BLUE, WHITE]),
    ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#CCCCCC')),
    ('TOPPADDING', (0,0), (-1,-1), 5),
    ('BOTTOMPADDING', (0,0), (-1,-1), 5),
    ('LEFTPADDING', (0,0), (-1,-1), 5),
    ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ('VALIGN', (0,0), (-1,-1), 'TOP'),
    ('FONTSIZE', (0,1), (-1,-1), 8.5),
]))
story.append(med_tbl)
story.append(Spacer(1, 8))

story.append(Paragraph('6.3 Surgical Management', H2))
surg_data = [
    [Paragraph('Procedure', TABLE_HDR), Paragraph('Indication', TABLE_HDR), Paragraph('Advantages', TABLE_HDR), Paragraph('Relevant Evidence', TABLE_HDR)],
    [Paragraph('Hysteroscopic Myomectomy', TABLE_CELL),
     Paragraph('FIGO Type 0-2 submucosal fibroids; fertility desired', TABLE_CELL),
     Paragraph('Day-case; uterus preserved; restores cavity; fertility sparing', TABLE_CELL),
     Paragraph('Gold standard for Type 0-2; most effective for restoring fertility', TABLE_CELL)],
    [Paragraph('Laparoscopic / Open Myomectomy', TABLE_CELL),
     Paragraph('Intramural/subserosal fibroids; fertility desired; large fibroids', TABLE_CELL),
     Paragraph('Removes fibroids while preserving uterus; significant QoL improvement', TABLE_CELL),
     Paragraph('Meta-analysis (AJOG 2024): myomectomy reduces reintervention vs UAE (RR 0.32)', TABLE_CELL)],
    [Paragraph('Uterine Artery Embolisation (UAE)', TABLE_CELL),
     Paragraph('Symptomatic fibroids; uterus preservation desired; fertility not immediate priority', TABLE_CELL),
     Paragraph('Minimally invasive; no general anaesthesia; treats all fibroids', TABLE_CELL),
     Paragraph('FEMME RCT (2022): similar QoL to myomectomy at 2 years; higher reintervention rate', TABLE_CELL)],
    [Paragraph('Radiofrequency Ablation (RFA)', TABLE_CELL),
     Paragraph('Symptomatic intramural/subserosal fibroids; uterus preservation', TABLE_CELL),
     Paragraph('Outpatient; rapid recovery; UFS-QoL improvement 53.4 points (AAGL SR 2025)', TABLE_CELL),
     Paragraph('Limited long-term data; not for submucosal or fertility preservation', TABLE_CELL)],
    [Paragraph('Hysterectomy', TABLE_CELL),
     Paragraph('Completed family; failed conservative treatment; large symptomatic fibroids', TABLE_CELL),
     Paragraph('Definitive cure; no recurrence', TABLE_CELL),
     Paragraph('NOT first choice in this case - fertility desired; age 34', TABLE_CELL)],
]
surg_tbl = Table(surg_data, colWidths=[3.5*cm, 4.5*cm, 4.5*cm, 5.1*cm])
surg_tbl.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), DARK_BLUE),
    ('ROWBACKGROUNDS', (0,1), (-1,-1), [LIGHT_BLUE, WHITE]),
    ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#CCCCCC')),
    ('TOPPADDING', (0,0), (-1,-1), 5),
    ('BOTTOMPADDING', (0,0), (-1,-1), 5),
    ('LEFTPADDING', (0,0), (-1,-1), 5),
    ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ('VALIGN', (0,0), (-1,-1), 'TOP'),
    ('FONTSIZE', (0,1), (-1,-1), 8.5),
]))
story.append(surg_tbl)
story.append(Spacer(1, 8))

# Recommended plan
story.append(Paragraph('6.4 Recommended Management Plan for Mrs. S.K.', H2))
story.append(info_box(
    '<b>Step 1 (Immediate):</b> Iron supplementation + tranexamic acid + GnRH agonist '
    'x 3 months to correct anaemia (target Hb >10) and reduce fibroid volume before surgery.<br/><br/>'
    '<b>Step 2 (Definitive):</b> Hysteroscopic myomectomy for FIGO Type 1 & 2 submucosal '
    'fibroids (Day 1 priority - fertility-critical) + laparoscopic myomectomy for '
    'intramural/subserosal fibroids under same or staged anaesthesia.<br/><br/>'
    '<b>Step 3 (Post-operative):</b> Infertility workup including husband\'s semen analysis; '
    'HSG at 3 months post-op; consider ART if no spontaneous conception at 12 months.<br/><br/>'
    '<b>Step 4 (QoL support):</b> Psychological counselling; menstrual hygiene education; '
    'iron-rich diet; follow-up UFS-QoL scoring at 3, 6, and 12 months.',
    bg=LIGHT_BLUE, left_color=ACCENT_TEAL))
story.append(Spacer(1, 6))

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 7 - EVIDENCE BASE
# ══════════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
story.append(section_banner('7. Evidence Summary & Key Literature', color=MED_BLUE))
story.append(Spacer(1, 6))

evid_data = [
    [Paragraph('Study / Source', TABLE_HDR), Paragraph('Key Finding', TABLE_HDR), Paragraph('Evidence Level', TABLE_HDR)],
    [Paragraph('Tzanis et al. (AJOG 2024)\nPMID: 38280434', TABLE_CELL),
     Paragraph('Meta-analysis of 6 RCTs: no significant QoL difference between UAE and myomectomy overall; myomectomy sensitivity analysis shows better QoL and lower reintervention (RR 0.32)', TABLE_CELL),
     Paragraph('Meta-Analysis (Tier 1)', TABLE_CELL)],
    [Paragraph('Peng et al. (Sci Rep 2024)\nPMID: 39164326', TABLE_CELL),
     Paragraph('Systematic review: UAE vs myomectomy - similar symptom control; myomectomy preferred for fertility-seeking women', TABLE_CELL),
     Paragraph('Systematic Review (Tier 1)', TABLE_CELL)],
    [Paragraph('Puscasiu et al. (Cochrane 2025)\nPMID: 40183418', TABLE_CELL),
     Paragraph('Preoperative GnRHa: reduces uterine volume, increases preop Hb +0.88 g/dL; surgical duration reduced 10 min; adverse events higher with GnRHa', TABLE_CELL),
     Paragraph('Cochrane SR (Tier 1)', TABLE_CELL)],
    [Paragraph('Stewart et al. LIBERTY trials (AJOG 2023)\nPMID: 36370871', TABLE_CELL),
     Paragraph('Relugolix combination therapy: UFS-QoL total HR-QoL +37.6 vs +13.1 placebo; SS score -33.5 vs -12.1; bleeding/pelvic discomfort significantly improved', TABLE_CELL),
     Paragraph('Phase III RCT (Tier 3)', TABLE_CELL)],
    [Paragraph('Chen et al. AAGL SR (JMIG 2025)\nPMID: 39277104', TABLE_CELL),
     Paragraph('RFA: fibroid volume reduction 65.4% at 12 months; UFS-QoL improvement 53.4 points; return to work/activities within 2 weeks', TABLE_CELL),
     Paragraph('Systematic Review (Tier 1)', TABLE_CELL)],
    [Paragraph('Daniels et al. FEMME RCT (HTA 2022)\nPMID: 35435818', TABLE_CELL),
     Paragraph('UAE vs myomectomy RCT: similar QoL outcomes at 2 years in women not wanting hysterectomy; UAE had higher reintervention rate', TABLE_CELL),
     Paragraph('RCT (Tier 3)', TABLE_CELL)],
    [Paragraph('Mayo Clinic Survey (AJOG / J Womens Health)', TABLE_CELL),
     Paragraph('~1000 women with fibroids: avg 3.6yr treatment delay; 79% fear growth; 55% fear hysterectomy; 24% work-performance impairment; Black women disproportionately affected', TABLE_CELL),
     Paragraph('Survey Study', TABLE_CELL)],
    [Paragraph('Tintinalli Emergency Medicine\n(Textbook)', TABLE_CELL),
     Paragraph('Leiomyomas: most common benign pelvic tumour; 25% of white, 50% of black women; growth hormone-dependent; 30% cause bleeding/pain', TABLE_CELL),
     Paragraph('Textbook Reference', TABLE_CELL)],
    [Paragraph('Berek & Novak Gynaecology\n(Textbook)', TABLE_CELL),
     Paragraph('Fibroid-related pelvic pain: no correlation between pain and fibroid volume/number; submucosal fibroid with pain/haemorrhage: hysteroscopic excision', TABLE_CELL),
     Paragraph('Textbook Reference', TABLE_CELL)],
]
evid_tbl = Table(evid_data, colWidths=[4.5*cm, 9.2*cm, 3.9*cm])
evid_tbl.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), MED_BLUE),
    ('ROWBACKGROUNDS', (0,1), (-1,-1), [LIGHT_BLUE, WHITE]),
    ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#CCCCCC')),
    ('TOPPADDING', (0,0), (-1,-1), 5),
    ('BOTTOMPADDING', (0,0), (-1,-1), 5),
    ('LEFTPADDING', (0,0), (-1,-1), 5),
    ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ('VALIGN', (0,0), (-1,-1), 'TOP'),
    ('FONTSIZE', (0,1), (-1,-1), 8),
]))
story.append(evid_tbl)
story.append(Spacer(1, 8))

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 8 - LEARNING POINTS & DISCUSSION
# ══════════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
story.append(section_banner('8. Key Learning Points & Discussion'))
story.append(Spacer(1, 6))

lp_items = [
    ('<b>Fibroids are not just a uterine problem.</b> They cause systemic effects: severe anaemia (Hb 7.2 in this case), cardiovascular stress, work disability, and profound psychological morbidity.',),
    ('<b>QoL impairment is multi-dimensional and severe.</b> All 6 UFS-QoL domains were severely impaired in Mrs. S.K. - this should be formally scored and documented using validated tools.',),
    ('<b>Treatment delay is common and harmful.</b> Average 3.6 years before women seek care. Gynaecology residents should proactively screen for fibroid symptoms in all women of reproductive age with HMB.',),
    ('<b>Fertility implications are critical.</b> FIGO Type 1 and 2 submucosal fibroids are the most important to treat for fertility restoration. Hysteroscopic myomectomy is the gold standard.',),
    ('<b>Racial disparities must be acknowledged.</b> Black women are 2-3x more likely to have fibroids, present younger, have more severe disease, and have greater barriers to accessing care.',),
    ('<b>Individualise treatment.</b> No one-size-fits-all approach: consider age, fertility desires, fibroid type/location/number, symptom burden, and patient preferences.',),
    ('<b>Pre-operative medical therapy</b> (GnRHa) is evidence-based (Cochrane 2025) for correcting anaemia and reducing surgical blood loss, but carries adverse effect burden.',),
    ('<b>New oral GnRH antagonists</b> (relugolix combination, linzagolix) offer significant QoL improvement without the hypoestrogenic side-effect burden of GnRH agonists - important emerging option.',),
    ('<b>Psychological support is non-optional.</b> Address fears explicitly. 79% of women with fibroids fear malignant transformation. Clear, compassionate counselling reduces decision delay.',),
    ('<b>UFS-QoL is the validated outcome tool</b> to use for monitoring - both the Symptom Severity and HR-QoL subscales should be measured at baseline and after treatment.',),
]
for i, item in enumerate(lp_items, 1):
    story.append(Paragraph(f'{i}. {item[0]}', BULLET))
    story.append(Spacer(1, 3))

story.append(Spacer(1, 6))

# Discussion prompt
story.append(Paragraph('Discussion Points for Residents', H2))
disc_items = [
    'What is the role of MRI over USS in planning fibroid surgery? When is it mandatory?',
    'How would your management change if Mrs. S.K. had a completed family and no desire for further fertility?',
    'Discuss the evidence comparing UAE vs. myomectomy for QoL outcomes - does one treatment fit all?',
    'How do you counsel a patient about the risk of fibroid recurrence after myomectomy?',
    'What emerging non-surgical treatments should residents be aware of?',
]
for item in disc_items:
    story.append(Paragraph(f'Q: {item}', BULLET))
    story.append(Spacer(1, 2))
story.append(Spacer(1, 6))

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 9 - CONCLUSION
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_banner('9. Conclusion'))
story.append(Spacer(1, 6))
story.append(Paragraph(
    'Uterine fibroids represent one of the most significant yet under-recognised '
    'causes of morbidity in women of reproductive age. As illustrated by Mrs. S.K., '
    'the impact extends far beyond heavy bleeding - encompassing severe anaemia, '
    'infertility, chronic pelvic pain, disrupted work and social life, and profound '
    'psychological distress.', BODY))
story.append(Spacer(1, 4))
story.append(Paragraph(
    'Effective management requires a systematic, patient-centred approach: early '
    'recognition, validated QoL assessment, personalised medical and surgical planning, '
    'and ongoing psychological support. With evidence-based care, most women - '
    'including those with fertility desires - can achieve excellent outcomes with '
    'significant improvement across all quality-of-life domains.', BODY))
story.append(Spacer(1, 8))

# Final stat box
story.append(key_stat_row([
    ('80%', 'Lifetime incidence by 50'),
    ('+37.6', 'UFS-QoL improvement with relugolix (LIBERTY)'),
    ('~2x', 'Fertility improvement post-myomectomy'),
]))
story.append(Spacer(1, 8))

# ══════════════════════════════════════════════════════════════════════════════
# REFERENCES
# ══════════════════════════════════════════════════════════════════════════════
story.append(HRFlowable(width='100%', thickness=0.5, color=MID_GREY))
story.append(Spacer(1, 4))
story.append(Paragraph('References', H2))
refs = [
    '1. Tzanis AA et al. UAE vs myomectomy for women with uterine leiomyomas: a systematic review and meta-analysis. Am J Obstet Gynecol. 2024 Aug. PMID: 38280434',
    '2. Peng J et al. Systematic review and meta-analysis: UAE vs myomectomy for symptomatic uterine fibroids. Sci Rep. 2024 Aug. PMID: 39164326',
    '3. Puscasiu L et al. Preoperative medical therapy before surgery for uterine fibroids. Cochrane Database Syst Rev. 2025 Apr. PMID: 40183418',
    '4. Stewart EA et al. Quality of life with relugolix combination therapy for uterine fibroids: LIBERTY randomized trials. Am J Obstet Gynecol. 2023 Mar. PMID: 36370871',
    '5. Chen I et al. Radiofrequency Ablation for the Treatment of Uterine Fibroids: AAGL SR. J Minim Invasive Gynecol. 2025 Jan. PMID: 39277104',
    '6. Daniels J et al. UAE versus myomectomy for premenopausal women with uterine fibroids: the FEMME RCT. Health Technol Assess. 2022 Apr. PMID: 35435818',
    '7. Stewart EA et al. Relugolix combination therapy in Black/African American women with symptomatic uterine fibroids: LIBERTY Long-Term Extension study. Am J Obstet Gynecol. 2024. PMID: 37863160',
    '8. Tintinalli JE et al. Emergency Medicine: A Comprehensive Study Guide, 9th Ed. McGraw-Hill. Chapter 96.',
    '9. Berek JS, Novak E. Berek & Novak\'s Gynecology, 16th Ed. Wolters Kluwer. Chapter 11 & Acute Pelvic Pain.',
    '10. Munro MG et al. FIGO Classification of Causes of Abnormal Uterine Bleeding (PALM-COEIN). Int J Gynaecol Obstet. 2018.',
    '11. American Medical Women\'s Association. Navigating Uterine Fibroid Management. amwa-doc.org. 2024.',
    '12. Mayo Clinic News Network. Uterine Fibroids Have Significant Impact on QoL, Workplace Performance. AJOG / J Womens Health.',
]
for ref in refs:
    story.append(Paragraph(ref, CITE))
    story.append(Spacer(1, 2))

# ── Page number footer helper ─────────────────────────────────────────────────
def footer_canvas(canvas, doc):
    canvas.saveState()
    canvas.setFont('Helvetica', 8)
    canvas.setFillColor(MID_GREY)
    canvas.drawCentredString(A4[0]/2, 1.5*cm,
        f'Uterine Fibroids - Case Paper Presentation | Dept. of Obstetrics & Gynaecology | May 2026')
    canvas.drawRightString(A4[0] - 2.5*cm, 1.5*cm, f'Page {doc.page}')
    canvas.restoreState()

# ── Build ─────────────────────────────────────────────────────────────────────
OUTPUT = '/home/daytona/workspace/uterine-fibroid-case/Uterine_Fibroid_Case_Paper.pdf'
doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=A4,
    rightMargin=2.0*cm, leftMargin=2.0*cm,
    topMargin=2.0*cm, bottomMargin=2.5*cm,
    title='Uterine Fibroids - Case Paper Presentation',
    author='Department of Obstetrics & Gynaecology',
)
doc.build(story, onFirstPage=footer_canvas, onLaterPages=footer_canvas)
print(f"PDF created: {OUTPUT}")
Running Command

cd /home/daytona/workspace/uterine-fibroid-case && python3 build_case_paper.py 2>&1

Running Command

ls -lh /home/daytona/workspace/uterine-fibroid-case/Uterine_Fibroid_Case_Paper.pdf

Your case paper PDF is ready:

Uterine Fibroid Case Paper

PDF Document · PDF


What's Inside the Case Paper

The document is structured as a professional gynaecology resident case presentation across 9 sections:

Structure at a Glance

SectionContent
1. Introduction & EpidemiologyKey statistics, incidence, racial disparities, aetiology & risk factors
2. Illustrative CaseMrs. S.K., 34F, P1L1 - complaints, HPI, menstrual/obstetric history, full examination findings
3. InvestigationsHaematology (Hb 7.2 g/dL), USS, MRI pelvis, endometrial biopsy, HSG
4. FIGO / PALM-COEIN ClassificationAll 8 fibroid types with the case-specific types highlighted
5. QoL Impact (multi-domain)Physical health, reproductive/fertility, psychological, occupational/social; full UFS-QoL score profile
6. Differential DiagnosisAdenomyosis, endometrial carcinoma, ovarian mass, LMS, coagulopathy - each excluded with reasoning
7. ManagementImmediate (iron + tranexamic acid + GnRHa), medical options, surgical options, step-by-step plan for the case
8. Evidence Summary9 key references with PMIDs including LIBERTY trials, FEMME RCT, Cochrane 2025, AAGL meta-analysis 2025
9. Learning Points + Discussion Questions10 take-home points; 5 discussion questions for the audience

Key Evidence Cited

  • Cochrane 2025 (PMID 40183418): GnRHa preoperatively raises Hb +0.88 g/dL, reduces operative time
  • LIBERTY trials, AJOG 2023 (PMID 36370871): Relugolix combo - UFS-QoL improved by +37.6 vs +13.1 on placebo
  • FEMME RCT 2022 (PMID 35435818): UAE vs myomectomy - similar 2-year QoL; UAE has higher reintervention rate
  • AAGL SR, JMIG 2025 (PMID 39277104): RFA gives 65.4% fibroid volume reduction + UFS-QoL +53.4 points
This is a shared conversation. Sign in to Orris to start your own chat.