Paper presentation on Comparison of Medical versus Surgical Management of Adenomyosis for gynec resident doctor

Asking for Preferences
Reading File
Searching PubMed

adenomyosis medical surgical management comparison

Finding Sources
Reading Article

PMID: 39032312

Reading Article

PMID: 38837727

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

mkdir -p /home/daytona/workspace/adenomyosis-presentation

Writing File

~/adenomyosis-presentation/build_slides.py

#!/usr/bin/env python3
"""
Build a professional PDF slide deck:
"Comparison of Medical vs Surgical Management of Adenomyosis"
Target audience: Gynecology Resident Doctors
"""

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

# ─── Colour Palette ────────────────────────────────────────────────────────────
TEAL       = colors.HexColor('#1B6CA8')   # header / accent
DARK_TEAL  = colors.HexColor('#0D4A7A')   # title bg
LIGHT_BLUE = colors.HexColor('#D6E9F8')   # row shading
MINT       = colors.HexColor('#E8F6EF')   # callout boxes
ORANGE     = colors.HexColor('#E8732A')   # highlight accent
WHITE      = colors.white
DARK_GRAY  = colors.HexColor('#2C2C2C')
MED_GRAY   = colors.HexColor('#5A5A5A')
LIGHT_GRAY = colors.HexColor('#F4F4F4')
GREEN      = colors.HexColor('#27AE60')
RED        = colors.HexColor('#C0392B')

PAGE_W, PAGE_H = A4   # 595 x 842 pt
MARGIN = 1.8 * cm

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

def S(name, **kw):
    """Helper: clone a base style with overrides."""
    base = styles.get(name, styles['Normal'])
    s = ParagraphStyle(
        f"custom_{name}_{id(kw)}",
        parent=base,
        **kw
    )
    return s

# ─── Slide builder helpers ──────────────────────────────────────────────────────
CONTENT_W = PAGE_W - 2 * MARGIN

def slide_title_page(title, subtitle, authors="", institution="", date=""):
    """Full-page title slide."""
    elems = []
    elems.append(Spacer(1, 2.5 * cm))
    elems.append(HRFlowable(width=CONTENT_W, thickness=4, color=ORANGE, spaceAfter=6))
    elems.append(Paragraph(title, S('Title',
        fontSize=28, textColor=DARK_TEAL, alignment=TA_CENTER,
        leading=36, spaceAfter=8)))
    elems.append(HRFlowable(width=CONTENT_W, thickness=2, color=TEAL, spaceBefore=4, spaceAfter=14))
    elems.append(Paragraph(subtitle, S('Normal',
        fontSize=15, textColor=TEAL, alignment=TA_CENTER, leading=20, spaceAfter=30)))
    if authors:
        elems.append(Paragraph(authors, S('Normal',
            fontSize=11, textColor=MED_GRAY, alignment=TA_CENTER, spaceAfter=4)))
    if institution:
        elems.append(Paragraph(institution, S('Normal',
            fontSize=10, textColor=MED_GRAY, alignment=TA_CENTER, spaceAfter=4)))
    if date:
        elems.append(Paragraph(date, S('Normal',
            fontSize=10, textColor=MED_GRAY, alignment=TA_CENTER)))
    elems.append(Spacer(1, 2 * cm))
    elems.append(HRFlowable(width=CONTENT_W, thickness=1.5, color=LIGHT_BLUE, spaceAfter=8))
    tagline = (
        "A structured clinical overview for Gynecology Resident Doctors | "
        "Sources: Berek & Novak's Gynecology · Bailey & Love's Surgery · "
        "PubMed systematic reviews 2021-2025"
    )
    elems.append(Paragraph(tagline, S('Normal',
        fontSize=8, textColor=MED_GRAY, alignment=TA_CENTER, leading=12)))
    return elems

def slide_header(slide_num, slide_title):
    """Header bar for each content slide."""
    data = [[
        Paragraph(slide_title, S('Normal',
            fontSize=15, textColor=WHITE, leading=18, fontName='Helvetica-Bold')),
        Paragraph(f"Slide {slide_num}", S('Normal',
            fontSize=9, textColor=LIGHT_BLUE, alignment=TA_RIGHT))
    ]]
    t = Table(data, colWidths=[CONTENT_W - 1.5*cm, 1.5*cm])
    t.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), DARK_TEAL),
        ('ROWBACKGROUNDS', (0,0), (-1,-1), [DARK_TEAL]),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('TOPPADDING', (0,0), (-1,-1), 8),
        ('BOTTOMPADDING', (0,0), (-1,-1), 8),
        ('LEFTPADDING', (0,0), (0,-1), 12),
        ('RIGHTPADDING', (-1,0), (-1,-1), 10),
        ('ROUNDEDCORNERS', [4, 4, 0, 0]),
    ]))
    return [t, Spacer(1, 8)]

def bullet(text, level=0, color=DARK_GRAY, size=10.5):
    indent = level * 14
    marker = "\u2022" if level == 0 else "\u2013"
    return Paragraph(
        f"<font color='#{format(color.hexval() & 0xFFFFFF, \"06x\")}' size='{size+1}'>{marker}</font>"
        f"&nbsp; {text}",
        S('Normal', fontSize=size, textColor=color, leading=16,
          leftIndent=10 + indent, spaceAfter=3)
    )

def section_label(text, bg=LIGHT_BLUE, fg=DARK_TEAL):
    data = [[Paragraph(text, S('Normal', fontSize=10.5, textColor=fg,
                                fontName='Helvetica-Bold'))]]
    t = Table(data, colWidths=[CONTENT_W])
    t.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), bg),
        ('LEFTPADDING', (0,0), (-1,-1), 10),
        ('TOPPADDING', (0,0), (-1,-1), 5),
        ('BOTTOMPADDING', (0,0), (-1,-1), 5),
    ]))
    return [t, Spacer(1, 4)]

def callout(text, bg=MINT, fg=DARK_TEAL):
    data = [[Paragraph(text, S('Normal', fontSize=10, textColor=fg, leading=15))]]
    t = Table(data, colWidths=[CONTENT_W])
    t.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), bg),
        ('LEFTPADDING', (0,0), (-1,-1), 12),
        ('RIGHTPADDING', (0,0), (-1,-1), 12),
        ('TOPPADDING', (0,0), (-1,-1), 7),
        ('BOTTOMPADDING', (0,0), (-1,-1), 7),
        ('BOX', (0,0), (-1,-1), 1.5, TEAL),
    ]))
    return [Spacer(1, 6), t, Spacer(1, 6)]

def two_col_table(headers, rows, col_ratios=None):
    if col_ratios is None:
        col_ratios = [0.38, 0.62]
    col_w = [CONTENT_W * r for r in col_ratios]
    header_style = S('Normal', fontSize=10, textColor=WHITE,
                      fontName='Helvetica-Bold', leading=14)
    cell_style = S('Normal', fontSize=9.5, textColor=DARK_GRAY, leading=13)
    data = [[Paragraph(h, header_style) for h in headers]]
    for row in rows:
        data.append([Paragraph(str(c), cell_style) for c in row])
    t = Table(data, colWidths=col_w)
    row_colors = [LIGHT_BLUE if i % 2 == 0 else WHITE for i in range(len(rows))]
    ts = TableStyle([
        ('BACKGROUND', (0, 0), (-1, 0), DARK_TEAL),
        ('VALIGN', (0, 0), (-1, -1), 'TOP'),
        ('TOPPADDING', (0, 0), (-1, -1), 5),
        ('BOTTOMPADDING', (0, 0), (-1, -1), 5),
        ('LEFTPADDING', (0, 0), (-1, -1), 7),
        ('RIGHTPADDING', (0, 0), (-1, -1), 7),
        ('ROWBACKGROUNDS', (0, 1), (-1, -1), [LIGHT_BLUE, WHITE]),
        ('GRID', (0, 0), (-1, -1), 0.4, colors.HexColor('#AAAAAA')),
    ])
    t.setStyle(ts)
    return t

def three_col_table(headers, rows, col_ratios=None):
    if col_ratios is None:
        col_ratios = [0.3, 0.35, 0.35]
    col_w = [CONTENT_W * r for r in col_ratios]
    header_style = S('Normal', fontSize=9.5, textColor=WHITE,
                      fontName='Helvetica-Bold', leading=13)
    cell_style = S('Normal', fontSize=9, textColor=DARK_GRAY, leading=13)
    data = [[Paragraph(h, header_style) for h in headers]]
    for row in rows:
        data.append([Paragraph(str(c), cell_style) for c in row])
    t = Table(data, colWidths=col_w)
    t.setStyle(TableStyle([
        ('BACKGROUND', (0, 0), (-1, 0), DARK_TEAL),
        ('VALIGN', (0, 0), (-1, -1), 'TOP'),
        ('TOPPADDING', (0, 0), (-1, -1), 5),
        ('BOTTOMPADDING', (0, 0), (-1, -1), 5),
        ('LEFTPADDING', (0, 0), (-1, -1), 7),
        ('RIGHTPADDING', (0, 0), (-1, -1), 7),
        ('ROWBACKGROUNDS', (0, 1), (-1, -1), [LIGHT_BLUE, WHITE]),
        ('GRID', (0, 0), (-1, -1), 0.4, colors.HexColor('#AAAAAA')),
    ]))
    return t

def footer_note(text):
    return Paragraph(
        f"<font color='#888888' size='7.5'>{text}</font>",
        S('Normal', fontSize=7.5, textColor=MED_GRAY, leading=11, spaceAfter=2)
    )

# ─── Build Story ───────────────────────────────────────────────────────────────
story = []

# ══════════════════════════════════════════════════════════════
# SLIDE 1 — Title
# ══════════════════════════════════════════════════════════════
story += slide_title_page(
    title="Comparison of Medical versus Surgical\nManagement of Adenomyosis",
    subtitle="A Clinical Overview for the Gynecology Resident",
    date="Paper Presentation | May 2026"
)
story.append(PageBreak())

# ══════════════════════════════════════════════════════════════
# SLIDE 2 — Outline
# ══════════════════════════════════════════════════════════════
story += slide_header(2, "Presentation Outline")
outline_items = [
    ("1.", "Definition, Epidemiology &amp; Pathophysiology"),
    ("2.", "Clinical Features &amp; Diagnosis"),
    ("3.", "Overview of Management Strategies"),
    ("4.", "Medical Management — Agents &amp; Evidence"),
    ("5.", "Surgical Management — Options &amp; Techniques"),
    ("6.", "Head-to-Head Comparison"),
    ("7.", "Special Considerations: Fertility &amp; Recurrence"),
    ("8.", "Current Evidence &amp; Recommendations"),
    ("9.", "Key Takeaways &amp; Clinical Algorithm"),
]
for num, item in outline_items:
    data = [[
        Paragraph(num, S('Normal', fontSize=11, textColor=ORANGE,
                          fontName='Helvetica-Bold', alignment=TA_CENTER)),
        Paragraph(item, S('Normal', fontSize=11, textColor=DARK_GRAY, leading=15))
    ]]
    t = Table(data, colWidths=[0.8*cm, CONTENT_W - 0.8*cm])
    t.setStyle(TableStyle([
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('TOPPADDING', (0,0), (-1,-1), 4),
        ('BOTTOMPADDING', (0,0), (-1,-1), 4),
    ]))
    story.append(t)
story.append(PageBreak())

# ══════════════════════════════════════════════════════════════
# SLIDE 3 — Definition, Epidemiology & Pathophysiology
# ══════════════════════════════════════════════════════════════
story += slide_header(3, "Definition, Epidemiology & Pathophysiology")

story += section_label("DEFINITION")
story.append(Paragraph(
    "Adenomyosis is a <b>benign uterine disorder</b> characterised by the presence of ectopic "
    "endometrial glands and stroma within the myometrium, accompanied by "
    "<b>smooth muscle hypertrophy/hyperplasia</b>. It may be diffuse or focal (adenomyoma).",
    S('Normal', fontSize=10.5, textColor=DARK_GRAY, leading=16, spaceAfter=8)
))

story += section_label("EPIDEMIOLOGY")
epi_data = [
    ["Prevalence", "1%–70% (variable diagnostic criteria); often in reproductive-age women, peak 4th–5th decade"],
    ["Association", "Endometriosis (co-exists in up to 40% cases), leiomyomas"],
    ["Gold standard", "Histopathological diagnosis at hysterectomy (historically)"],
    ["Non-invasive Dx", "Transvaginal USS and MRI now enable pre-operative diagnosis"],
]
story.append(two_col_table(["Parameter", "Details"], epi_data))
story.append(Spacer(1, 8))

story += section_label("PATHOPHYSIOLOGY")
patho_items = [
    "Invasion theory: direct extension of basal endometrium through disrupted junctional zone (JZ)",
    "de Novo metaplasia of Mullerian remnants within myometrium",
    "Stem cell dysregulation promoting ectopic implantation",
    "Oestrogen-dependent growth: JZ thickening (>12 mm on MRI = diagnostic criterion)",
    "Leads to uterine enlargement, altered uterine contractility, impaired implantation",
]
for item in patho_items:
    story.append(bullet(item))
story.append(PageBreak())

# ══════════════════════════════════════════════════════════════
# SLIDE 4 — Clinical Features & Diagnosis
# ══════════════════════════════════════════════════════════════
story += slide_header(4, "Clinical Features & Diagnosis")

story += section_label("SYMPTOMS")
symp_data = [
    ["Dysmenorrhoea", "Most common; worsens with age; secondary, progressive"],
    ["Abnormal Uterine Bleeding", "Menorrhagia, metrorrhagia; often leads to anaemia"],
    ["Chronic Pelvic Pain", "Non-cyclical; may mimic endometriosis/fibroids"],
    ["Subfertility", "Impaired implantation; miscarriage; infertility"],
    ["Dyspareunia", "Deep; associated with posterior adenomyosis"],
    ["Uterine Enlargement", "Symmetrical, globular, tender uterus on examination"],
]
story.append(two_col_table(["Symptom", "Key Features"], symp_data))
story.append(Spacer(1, 8))

story += section_label("DIAGNOSTIC TOOLS")
diag_data = [
    ["Transvaginal USS (TVUSS)",
     "MUSA criteria: myometrial cysts, fan-shaped shadowing, asymmetric thickening, irregular JZ, "
     "hyperechoic islands. ≥3 features required. Sensitivity 72–82%, Specificity 85%"],
    ["MRI Pelvis",
     "JZ thickness ≥12 mm; low-signal intensity JZ on T2; differentiates adenomyoma from fibroid. "
     "Sensitivity 77–78%, Specificity 89%"],
    ["Histopathology",
     "Gold standard: endometrial glands/stroma >2.5 mm from basal endometrium within myometrium"],
    ["Hysteroscopy",
     "Irregular endometrium, cystic haemorrhagic lesions, altered vascularisation"],
]
story.append(two_col_table(["Investigation", "Details"], diag_data))
story.append(PageBreak())

# ══════════════════════════════════════════════════════════════
# SLIDE 5 — Overview of Management Strategies
# ══════════════════════════════════════════════════════════════
story += slide_header(5, "Overview of Management Strategies")

story += section_label("GUIDING PRINCIPLES")
principles = [
    "Management depends on <b>age</b>, <b>desire for future fertility</b>, <b>symptom severity</b>, "
    "and <b>extent of disease</b>",
    "Hysterectomy is definitive/curative — but uterus-sparing options are preferred for younger women",
    "No medical therapy is curative; symptoms may recur after stopping treatment",
    "Combination of medical + procedural therapy shows superior outcomes over monotherapy",
]
for p in principles:
    story.append(bullet(p))
story.append(Spacer(1, 10))

# Overview table
data = [
    ["Category", "Options", "Curative?", "Fertility Preserved?"],
    ["Medical", "NSAIDs, COC, Progestins, GnRH agonists/antagonists, LNG-IUS, Aromatase inhibitors", "No", "Yes"],
    ["Procedural / Minimally Invasive",
     "HIFU / MRgFUS, UAE, RFA, PMWA, Endometrial ablation", "No", "Limited"],
    ["Surgical — Uterus-Sparing", "Adenomyomectomy (focal / diffuse techniques)", "No", "Possible"],
    ["Surgical — Definitive", "Total Hysterectomy ± BSO", "Yes", "No"],
]
col_w = [2.8*cm, 6.5*cm, 1.8*cm, 3*cm]
header_s = S('Normal', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold', leading=13)
cell_s = S('Normal', fontSize=9, textColor=DARK_GRAY, leading=13)
tdata = [[Paragraph(str(c), header_s if i == 0 else cell_s)
          for c in row]
         for i, row in enumerate(data)]
ot = Table(tdata, colWidths=col_w)
ot.setStyle(TableStyle([
    ('BACKGROUND', (0, 0), (-1, 0), DARK_TEAL),
    ('VALIGN', (0, 0), (-1, -1), 'TOP'),
    ('TOPPADDING', (0, 0), (-1, -1), 5),
    ('BOTTOMPADDING', (0, 0), (-1, -1), 5),
    ('LEFTPADDING', (0, 0), (-1, -1), 6),
    ('RIGHTPADDING', (0, 0), (-1, -1), 6),
    ('ROWBACKGROUNDS', (0, 1), (-1, -1), [LIGHT_BLUE, WHITE, LIGHT_BLUE, WHITE]),
    ('GRID', (0, 0), (-1, -1), 0.4, colors.HexColor('#AAAAAA')),
]))
story.append(ot)
story.append(PageBreak())

# ══════════════════════════════════════════════════════════════
# SLIDE 6 — Medical Management
# ══════════════════════════════════════════════════════════════
story += slide_header(6, "Medical Management — Agents & Evidence")

med_data = [
    ["Drug / Class", "Mechanism", "Evidence / Key Points"],
    ["NSAIDs\n(Ibuprofen, Mefenamic acid)",
     "COX inhibition — reduces prostaglandin-mediated pain",
     "First-line for mild dysmenorrhoea; symptomatic relief only; no disease modification"],
    ["Combined Oral Contraceptive\n(COC)",
     "Suppress ovulation; reduce menstrual flow; pseudo-decidualisation",
     "Reduces AUB and dysmenorrhoea; continuous use preferred; no volume reduction"],
    ["Progestogens\n(Dienogest 2 mg/day; MPA)",
     "Decidualisation and atrophy of ectopic endometrium; anti-angiogenic",
     "Dienogest: significant pain reduction + uterine volume decrease (superior to LNG-IUS for pain in 2024 meta-analysis, PMID 39032312)"],
    ["LNG-IUS (Mirena)",
     "Local progestogenic effect on endometrium; reduces menstrual blood loss",
     "Effective for menorrhagia; superior haemoglobin vs dienogest; does not consistently reduce uterine volume"],
    ["GnRH Agonists\n(Leuprolide, Triptorelin)",
     "Down-regulate HPO axis → hypo-oestrogenic state; temporary menopause",
     "Highly effective; max 6 months without add-back; causes bone loss; used pre-operatively"],
    ["GnRH Antagonists\n(Relugolix, Elagolix)",
     "Competitive GnRH receptor block; faster onset than agonists",
     "Emerging agents; oral administration; relugolix + add-back approved for AUB/pain"],
    ["Aromatase Inhibitors\n(Letrozole, Anastrozole)",
     "Inhibit local oestrogen synthesis in ectopic tissue",
     "Used in refractory/post-menopausal adenomyosis; often combined with progestogen/GnRH-a"],
    ["Danazol",
     "Androgenic; suppresses HPO axis",
     "Effective but significant side effects (acne, virilisation); largely replaced by newer agents"],
]

col_w2 = [3.2*cm, 4.0*cm, CONTENT_W - 7.2*cm]
h_s = S('Normal', fontSize=8.5, textColor=WHITE, fontName='Helvetica-Bold', leading=12)
c_s = S('Normal', fontSize=8.5, textColor=DARK_GRAY, leading=12)
mdata = [[Paragraph(str(c), h_s if i == 0 else c_s) for c in row]
         for i, row in enumerate(med_data)]
mt = Table(mdata, colWidths=col_w2)
mt.setStyle(TableStyle([
    ('BACKGROUND', (0, 0), (-1, 0), DARK_TEAL),
    ('VALIGN', (0, 0), (-1, -1), 'TOP'),
    ('TOPPADDING', (0, 0), (-1, -1), 4),
    ('BOTTOMPADDING', (0, 0), (-1, -1), 4),
    ('LEFTPADDING', (0, 0), (-1, -1), 5),
    ('RIGHTPADDING', (0, 0), (-1, -1), 5),
    ('ROWBACKGROUNDS', (0, 1), (-1, -1), [LIGHT_BLUE, WHITE]),
    ('GRID', (0, 0), (-1, -1), 0.4, colors.HexColor('#AAAAAA')),
]))
story.append(mt)
story.append(Spacer(1, 6))
story.append(footer_note(
    "Sources: Berek & Novak's Gynecology; Bailey & Love's Surgery 28th ed; "
    "Akhigbe et al. 2024 Systematic Review & Meta-Analysis (PMID 39032312)"
))
story.append(PageBreak())

# ══════════════════════════════════════════════════════════════
# SLIDE 7 — Procedural / Minimally Invasive
# ══════════════════════════════════════════════════════════════
story += slide_header(7, "Procedural & Minimally Invasive Interventions")

story += section_label("UTERUS-SPARING PROCEDURAL OPTIONS")
proc_data = [
    ["Procedure", "Mechanism", "Efficacy", "Limitations"],
    ["HIFU / MRgFUS\n(High-Intensity Focused\nUltrasound)",
     "Thermal ablation of adenomyotic tissue; non-invasive",
     "60–75% volume reduction; significant AUB + pain improvement; combination with GnRH-a superior (2025 NMA, PMID 39648811)",
     "Not FDA-approved for adenomyosis; limited US access; AEs: abdominal pain, skin burns, sciatic nerve injury"],
    ["Uterine Artery Embolisation (UAE)",
     "Devascularisation of uterus via femoral artery catheter; ischaemic necrosis of adenomyotic tissue",
     "72–90% symptom improvement; durable 2–3 yr outcomes",
     "Post-embolisation syndrome (pain, fever, nausea); ovarian reserve impairment; reintervention rate ~20% at 5 yr"],
    ["Radiofrequency Ablation (RFA)",
     "Transcervical or percutaneous thermal ablation",
     "Effective for focal adenomyosis; low reintervention",
     "Limited long-term data; not suitable for diffuse disease"],
    ["Percutaneous Microwave\nAblation (PMWA)",
     "Image-guided microwave energy delivery",
     "Promising outcomes; emerging evidence",
     "Limited RCTs; not widely available"],
    ["Endometrial Ablation /\nResection",
     "Destroy endometrial lining; reduces menstrual blood loss",
     "Useful for AUB in women not seeking fertility; may fail in deep adenomyosis",
     "Not curative; recurrence; Asherman's syndrome risk; not for fertility-seeking"],
]
col_w3 = [2.8*cm, 3.2*cm, 3.5*cm, CONTENT_W - 9.5*cm]
h_s3 = S('Normal', fontSize=8.5, textColor=WHITE, fontName='Helvetica-Bold', leading=12)
c_s3 = S('Normal', fontSize=8.5, textColor=DARK_GRAY, leading=12)
pdata = [[Paragraph(str(c), h_s3 if i == 0 else c_s3) for c in row]
         for i, row in enumerate(proc_data)]
pt = Table(pdata, colWidths=col_w3)
pt.setStyle(TableStyle([
    ('BACKGROUND', (0, 0), (-1, 0), DARK_TEAL),
    ('VALIGN', (0, 0), (-1, -1), 'TOP'),
    ('TOPPADDING', (0, 0), (-1, -1), 4),
    ('BOTTOMPADDING', (0, 0), (-1, -1), 4),
    ('LEFTPADDING', (0, 0), (-1, -1), 5),
    ('RIGHTPADDING', (0, 0), (-1, -1), 5),
    ('ROWBACKGROUNDS', (0, 1), (-1, -1), [LIGHT_BLUE, WHITE]),
    ('GRID', (0, 0), (-1, -1), 0.4, colors.HexColor('#AAAAAA')),
]))
story.append(pt)
story.append(Spacer(1, 6))
story.append(footer_note("Sources: Zeccola & Allen, Curr Opin Obstet Gynecol 2024 (PMID 38837727); Song & Wang, J Ultrasound Med 2025 (PMID 39648811)"))
story.append(PageBreak())

# ══════════════════════════════════════════════════════════════
# SLIDE 8 — Surgical Management
# ══════════════════════════════════════════════════════════════
story += slide_header(8, "Surgical Management — Options & Techniques")

story += section_label("A. UTERUS-PRESERVING: ADENOMYOMECTOMY")
adeno_items = [
    ("<b>Indication:</b> Fertility-desiring women with focal or symptomatic diffuse adenomyosis "
     "who have failed medical therapy"),
    ("<b>Techniques for FOCAL adenomyosis:</b> Complete excision — double-flap method, triple-flap "
     "method, asymmetric dissection method"),
    ("<b>Techniques for DIFFUSE adenomyosis:</b> Wedge resection, wedge-shaped uterine wall removal, "
     "modified reductive surgery, transverse H-incision"),
    ("<b>Non-excisional:</b> Thermal coagulation of diseased myometrium (for selected cases)"),
    ("<b>Risk:</b> Uterine rupture ~6% in subsequent pregnancy (vs 0.26% after myomectomy); "
     "placenta accreta, Asherman's syndrome; disease recurrence"),
    ("<b>Post-operative medical therapy</b> (GnRH-a / LNG-IUS) reduces recurrence risk"),
]
for item in adeno_items:
    story.append(bullet(item))
story.append(Spacer(1, 8))

story += section_label("B. DEFINITIVE: HYSTERECTOMY")
hyst_items = [
    "<b>Total hysterectomy preferred</b> over subtotal (cervical stump recurrence reported)",
    "BSO: consider in peri/post-menopausal women (reduces oestrogen drive); not routine in premenopausal",
    "Routes: laparoscopic (preferred if feasible), abdominal, vaginal — surgeon/patient dependent",
    "<b>Indication:</b> Completed family; failed conservative treatment; severe/refractory symptoms",
    "Cure rate: near 100% for adenomyosis symptoms",
    "Complications: infection, haemorrhage, bladder/ureter injury, VTE, premature menopause if oophorectomy",
]
for item in hyst_items:
    story.append(bullet(item))
story.append(PageBreak())

# ══════════════════════════════════════════════════════════════
# SLIDE 9 — Head-to-Head Comparison Table
# ══════════════════════════════════════════════════════════════
story += slide_header(9, "Head-to-Head Comparison: Medical vs Surgical")

comp_data = [
    ["Parameter", "Medical Management", "Surgical (Conservative)", "Surgical (Hysterectomy)"],
    ["Curative?", "No", "No (recurrence possible)", "Yes — definitive"],
    ["Fertility Preserved?", "Yes", "Possible (with precautions)", "No"],
    ["Onset of Relief", "Weeks–months", "Weeks–months", "Immediate"],
    ["Duration of Effect", "Temporary; recurs on cessation", "Variable; 1–5 yr", "Permanent"],
    ["Recurrence Rate", "High after stopping", "~20–50% (diffuse > focal)", "None"],
    ["Uterine Volume Reduction",
     "Dienogest > LNG-IUS; GnRH-a highest",
     "Moderate–significant",
     "N/A (uterus removed)"],
    ["Pain Control (VAS)",
     "Dienogest superior to LNG-IUS; GnRH-a effective",
     "Good (especially HIFU + GnRH-a)",
     "Excellent (>95%)"],
    ["Anaemia / AUB",
     "LNG-IUS superior for Hb levels; COC reduces blood loss",
     "UAE/HIFU effective for AUB",
     "Resolves completely"],
    ["Side Effects",
     "Hormonal SE (mood, weight, bone loss with GnRH-a); amenorrhoea",
     "Post-procedural pain, UAE syndrome, ovarian reserve↓",
     "Surgical risks; premature menopause"],
    ["Cost", "Low–moderate (ongoing)", "Moderate–high (one-time)",
     "High (one-time; recovery costs)"],
    ["Patient Preference", "Non-invasive; preferred initially", "Uterus-sparing; good for fertility",
     "Acceptable when family complete"],
]
col_w4 = [2.5*cm, 3.5*cm, 3.5*cm, 3.5*cm]
h_s4 = S('Normal', fontSize=8.5, textColor=WHITE, fontName='Helvetica-Bold', leading=12)
c_s4 = S('Normal', fontSize=8.5, textColor=DARK_GRAY, leading=12)
cdata = [[Paragraph(str(c), h_s4 if i == 0 else c_s4) for c in row]
         for i, row in enumerate(comp_data)]
ct = Table(cdata, colWidths=col_w4)
ct.setStyle(TableStyle([
    ('BACKGROUND', (0, 0), (-1, 0), DARK_TEAL),
    ('VALIGN', (0, 0), (-1, -1), 'TOP'),
    ('TOPPADDING', (0, 0), (-1, -1), 4),
    ('BOTTOMPADDING', (0, 0), (-1, -1), 4),
    ('LEFTPADDING', (0, 0), (-1, -1), 5),
    ('RIGHTPADDING', (0, 0), (-1, -1), 5),
    ('ROWBACKGROUNDS', (0, 1), (-1, -1), [LIGHT_BLUE, WHITE]),
    ('GRID', (0, 0), (-1, -1), 0.4, colors.HexColor('#AAAAAA')),
]))
story.append(ct)
story.append(PageBreak())

# ══════════════════════════════════════════════════════════════
# SLIDE 10 — Special Considerations: Fertility & Recurrence
# ══════════════════════════════════════════════════════════════
story += slide_header(10, "Special Considerations: Fertility & Recurrence")

story += section_label("ADENOMYOSIS & FERTILITY")
fert_items = [
    "Adenomyosis impairs implantation: distorted uterine contractility, altered endometrial receptivity (HOXA10↓, integrin αvβ3↓)",
    "IVF outcomes: live birth rates reduced by ~30% in adenomyosis (systematic review evidence)",
    "GnRH-a pre-treatment (3–6 months) before IVF improves pregnancy rates in adenomyosis",
    "LNG-IUS use pre-IVF: emerging evidence for improved endometrial receptivity",
    "Adenomyomectomy before IVF: controversial; uterine rupture risk 6% in pregnancy; careful counselling required",
    "Medical downregulation remains first-line before ART in adenomyosis",
]
for item in fert_items:
    story.append(bullet(item))
story.append(Spacer(1, 8))

story += section_label("RECURRENCE AFTER TREATMENT")
rec_data = [
    ["Treatment", "Recurrence Rate", "Notes"],
    ["Medical (on cessation)", "High — symptoms return within months", "Indicates need for long-term or maintenance therapy"],
    ["LNG-IUS", "Low during use; moderate after removal", "Continued use maintains suppression; re-insertion an option"],
    ["HIFU / UAE", "~15–25% at 2 yr; ~30–40% at 5 yr", "Younger age and diffuse disease = higher recurrence"],
    ["Adenomyomectomy", "20–50% at 5 yr", "Post-op GnRH-a / LNG-IUS reduces recurrence significantly"],
    ["Total Hysterectomy", "Near 0% (isolated cases in cervical stump)", "Subtotal hysterectomy: cervical stump recurrence reported"],
]
story.append(three_col_table(["Treatment", "Recurrence Rate", "Notes"], rec_data[1:],
                              col_ratios=[0.25, 0.35, 0.4]))
story.append(PageBreak())

# ══════════════════════════════════════════════════════════════
# SLIDE 11 — Current Evidence & Recommendations
# ══════════════════════════════════════════════════════════════
story += slide_header(11, "Current Evidence & Recommendations (2021-2025)")

story += section_label("KEY RECENT EVIDENCE")
ev_items = [
    ("<b>Akhigbe et al. 2024 (Meta-Analysis; PMID 39032312):</b> Dienogest superior to LNG-IUS "
     "for pelvic pain reduction (lower VAS) and uterine volume decrease. LNG-IUS superior for "
     "haemoglobin levels. Side effects comparable. N=707 women."),
    ("<b>Zeccola &amp; Allen 2024 (Review; PMID 38837727):</b> UAE, RFA, HIFU, PMWA, and "
     "adenomyomectomy all proven effective for AUB and dysmenorrhoea. Combination therapy "
     "more effective than monotherapy. Overall low reintervention rates."),
    ("<b>Song &amp; Wang 2025 (Network Meta-Analysis; PMID 39648811):</b> HIFU combined with "
     "medication (GnRH-a) significantly outperforms either alone for adenomyosis outcomes."),
    ("<b>Shi et al. 2024 (Review; PMID 38836931):</b> Long-term LNG-IUS use safe and effective "
     "for adenomyosis management with sustained suppression of AUB."),
]
for item in ev_items:
    story.append(bullet(item))
story.append(Spacer(1, 8))

story += section_label("EVIDENCE GAPS & LIMITATIONS")
gap_items = [
    "Most RCTs are from Asia; generalisation to other populations limited",
    "No standardised diagnostic criteria across studies (histological vs imaging)",
    "Long-term RCT data comparing all management strategies lacking",
    "FDA approval for HIFU/ablative therapies in adenomyosis absent in the USA",
    "Fertility outcomes after conservative procedures need higher-quality prospective trials",
]
for item in gap_items:
    story.append(bullet(item))
story.append(PageBreak())

# ══════════════════════════════════════════════════════════════
# SLIDE 12 — Clinical Algorithm
# ══════════════════════════════════════════════════════════════
story += slide_header(12, "Clinical Algorithm: Management Decision Pathway")

story.append(Paragraph(
    "A practical stepwise approach to managing adenomyosis based on patient profile:",
    S('Normal', fontSize=10.5, textColor=MED_GRAY, leading=15, spaceAfter=6)
))

algo_data = [
    ["Step", "Patient Profile", "Preferred Management"],
    ["Step 1\n(First-Line)",
     "Any patient with mild symptoms; premenopausal",
     "NSAIDs ± COC pill; trial 3–6 months"],
    ["Step 2\n(Second-Line)",
     "Persistent symptoms; no fertility desire in short term",
     "Progestins (Dienogest) OR LNG-IUS; GnRH agonist if severe"],
    ["Step 3A\n(Fertility-Seeking)",
     "Failed medical therapy; wishes pregnancy",
     "GnRH-a pre-treatment (3–6 months) → ART/IVF; "
     "consider adenomyomectomy for focal adenomyoma (with counselling)"],
    ["Step 3B\n(No Fertility Wish)",
     "Failed medical therapy; uterus preservation desired",
     "HIFU or UAE (if accessible) ± post-procedure LNG-IUS/GnRH-a for maintenance"],
    ["Step 4\n(Definitive)",
     "Family complete; failed conservative management; severe symptoms",
     "Total laparoscopic / abdominal hysterectomy (± BSO in peri-menopausal)"],
    ["Adjunct",
     "Pre-operative (any surgery)",
     "GnRH agonist 3 months pre-op to reduce uterine size, correct anaemia"],
]
col_w5 = [1.8*cm, 4.5*cm, CONTENT_W - 6.3*cm]
h_s5 = S('Normal', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold', leading=13)
c_s5 = S('Normal', fontSize=9, textColor=DARK_GRAY, leading=13)
aldata = [[Paragraph(str(c), h_s5 if i == 0 else c_s5) for c in row]
          for i, row in enumerate(algo_data)]
alt = Table(aldata, colWidths=col_w5)
alt.setStyle(TableStyle([
    ('BACKGROUND', (0, 0), (-1, 0), DARK_TEAL),
    ('VALIGN', (0, 0), (-1, -1), 'TOP'),
    ('TOPPADDING', (0, 0), (-1, -1), 5),
    ('BOTTOMPADDING', (0, 0), (-1, -1), 5),
    ('LEFTPADDING', (0, 0), (-1, -1), 6),
    ('RIGHTPADDING', (0, 0), (-1, -1), 6),
    ('ROWBACKGROUNDS', (0, 1), (-1, -1), [LIGHT_BLUE, WHITE]),
    ('GRID', (0, 0), (-1, -1), 0.4, colors.HexColor('#AAAAAA')),
]))
story.append(alt)
story.append(Spacer(1, 8))
story += callout(
    "<b>Key Principle:</b> Always individualise management. Consider: age, parity, fertility desire, "
    "severity of disease, co-existing pathology, patient preference, and local resource availability.",
    bg=MINT
)
story.append(PageBreak())

# ══════════════════════════════════════════════════════════════
# SLIDE 13 — Key Takeaways
# ══════════════════════════════════════════════════════════════
story += slide_header(13, "Key Takeaways")

takeaways = [
    ("1", "Adenomyosis is common but often under-diagnosed; TVUSS is the first-line imaging tool "
          "(MUSA criteria; ≥3 features needed)"),
    ("2", "No medical therapy is curative — all provide symptom control but recurrence occurs on cessation"),
    ("3", "Dienogest is superior to LNG-IUS for pain and uterine volume reduction; LNG-IUS is better "
          "for correcting anaemia (2024 meta-analysis)"),
    ("4", "GnRH agonists remain the most potent medical option but are limited to 6 months without add-back therapy"),
    ("5", "HIFU + GnRH-a combination therapy is the most effective procedural approach — superior to either alone"),
    ("6", "Adenomyomectomy is an option for fertility-seeking women but carries significant uterine rupture "
          "risk (6%) in subsequent pregnancy"),
    ("7", "Total hysterectomy is the only definitive cure — indicated when family is complete and conservative "
          "measures have failed"),
    ("8", "Combination therapy (medical + procedural/surgical) consistently outperforms monotherapy across all outcomes"),
    ("9", "High-quality RCTs comparing all treatment modalities are still lacking — management must be "
          "individualised and shared decision-making is essential"),
]
for num, text in takeaways:
    data = [[
        Paragraph(num, S('Normal', fontSize=13, textColor=WHITE,
                          fontName='Helvetica-Bold', alignment=TA_CENTER)),
        Paragraph(text, S('Normal', fontSize=10, textColor=DARK_GRAY, leading=15))
    ]]
    bg = DARK_TEAL if int(num) % 2 == 1 else TEAL
    t = Table(data, colWidths=[0.85*cm, CONTENT_W - 0.85*cm])
    t.setStyle(TableStyle([
        ('BACKGROUND', (0, 0), (0, 0), bg),
        ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
        ('TOPPADDING', (0, 0), (-1, -1), 5),
        ('BOTTOMPADDING', (0, 0), (-1, -1), 5),
        ('LEFTPADDING', (0, 0), (0, 0), 0),
        ('LEFTPADDING', (1, 0), (1, 0), 8),
    ]))
    story.append(t)
    story.append(Spacer(1, 3))
story.append(PageBreak())

# ══════════════════════════════════════════════════════════════
# SLIDE 14 — References
# ══════════════════════════════════════════════════════════════
story += slide_header(14, "References")
refs = [
    "1. Berek JS et al. <i>Berek &amp; Novak's Gynecology</i>, 16th ed. (2020). Management of Adenomyosis, pp. 581–582.",
    "2. Williams NS et al. <i>Bailey &amp; Love's Short Practice of Surgery</i>, 28th ed. (2023). Table 87.4: Adenomyosis Management Options, pp. 1604–1605.",
    "3. Kumar V et al. <i>Robbins, Cotran &amp; Kumar Pathologic Basis of Disease</i>, 10th ed. (2024). Endometriosis &amp; Adenomyosis.",
    "4. Akhigbe RE et al. Comparison of the effectiveness of levonorgestrel intrauterine system and dienogest in adenomyosis: systematic review and meta-analysis. <i>Eur J Obstet Gynecol Reprod Biol.</i> 2024 Sep. PMID: 39032312.",
    "5. Zeccola AM, Allen SE. Alternative treatments of adenomyosis — an update in procedural management and clinical outcomes. <i>Curr Opin Obstet Gynecol.</i> 2024 Aug. PMID: 38837727.",
    "6. Shi J et al. Long-term efficacy and safety of levonorgestrel releasing intrauterine system in adenomyosis: evidence mapping. <i>Arch Gynecol Obstet.</i> 2024 Jul. PMID: 38836931.",
    "7. Song Y, Wang L. Combining medication with high-intensity-focused ultrasound for adenomyosis: network meta-analysis. <i>J Ultrasound Med.</i> 2025 Mar. PMID: 39648811.",
    "8. MUSA Group. Terms, definitions and measurements to describe sonographic features of myometrium and uterine masses. <i>Ultrasound Obstet Gynecol.</i> 2015.",
    "9. ESHRE Working Group on Adenomyosis. Working definitions and diagnostic criteria for adenomyosis. <i>Hum Reprod Open.</i> 2021.",
]
for ref in refs:
    story.append(Paragraph(ref, S('Normal', fontSize=9, textColor=DARK_GRAY,
                                   leading=14, spaceAfter=4, leftIndent=8)))

story.append(Spacer(1, 1.2*cm))
story += callout(
    "<b>Disclosure:</b> This presentation is for educational purposes for postgraduate medical "
    "training. Clinical decisions should be individualised and guided by current institutional "
    "protocols and patient-specific factors.",
    bg=LIGHT_BLUE, fg=DARK_TEAL
)

# ─── Page numbering callback ───────────────────────────────────────────────────
def on_page(canvas, doc):
    canvas.saveState()
    canvas.setFont('Helvetica', 7.5)
    canvas.setFillColor(MED_GRAY)
    canvas.drawRightString(PAGE_W - MARGIN, 0.6*cm,
                           f"Adenomyosis: Medical vs Surgical Management | Page {doc.page}")
    canvas.drawString(MARGIN, 0.6*cm,
                      "For Gynecology Resident Education | May 2026")
    canvas.restoreState()

# ─── Build PDF ─────────────────────────────────────────────────────────────────
out_path = "/home/daytona/workspace/adenomyosis-presentation/Adenomyosis_Medical_vs_Surgical_Management.pdf"
doc = SimpleDocTemplate(
    out_path,
    pagesize=A4,
    leftMargin=MARGIN, rightMargin=MARGIN,
    topMargin=MARGIN, bottomMargin=1.4*cm,
    title="Comparison of Medical vs Surgical Management of Adenomyosis",
    author="Gynecology Resident Presentation",
    subject="Adenomyosis — Medical vs Surgical Management"
)
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print(f"PDF created: {out_path}")
print(f"File size: {os.path.getsize(out_path):,} bytes")
Running Command

cd /home/daytona/workspace/adenomyosis-presentation && python3 build_slides.py 2>&1

Editing File

~/adenomyosis-presentation/build_slides.py

Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/adenomyosis-presentation/build_slides.py'
Running Command

cd /home/daytona/workspace/adenomyosis-presentation && python3 build_slides.py 2>&1

Editing File

~/adenomyosis-presentation/build_slides.py

Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/adenomyosis-presentation/build_slides.py'
Running Command

cd /home/daytona/workspace/adenomyosis-presentation && python3 build_slides.py 2>&1

Your PDF paper presentation is ready:

Adenomyosis Medical vs Surgical Management

PDF Document · PDF


What's Inside (14 Slides)

SlideContent
1Title slide
2Presentation outline
3Definition, Epidemiology & Pathophysiology
4Clinical Features & Diagnosis (MUSA criteria, MRI, histology)
5Overview of all management strategies
6Medical Management - 8 drug classes with mechanisms & evidence
7Procedural/Minimally Invasive interventions (HIFU, UAE, RFA, PMWA, ablation)
8Surgical management (adenomyomectomy techniques + hysterectomy)
9Head-to-head comparison table across 12 parameters
10Fertility considerations & recurrence rates
11Current evidence 2021-2025 with 4 key studies cited
12Clinical decision algorithm (step-by-step)
139 Key takeaways
14Full references

Key Clinical Points Highlighted

  • Dienogest vs LNG-IUS: Dienogest is superior for pain and uterine volume reduction; LNG-IUS is better for correcting anaemia (Akhigbe et al. 2024 meta-analysis, PMID 39032312)
  • HIFU + GnRH-a combination outperforms either alone (Song & Wang 2025 NMA, PMID 39648811)
  • Adenomyomectomy carries ~6% uterine rupture risk in subsequent pregnancy - much higher than myomectomy (0.26%)
  • Total hysterectomy (not subtotal) is the definitive cure; cervical stump recurrence reported with subtotal
  • No medical therapy is curative - all require long-term or maintenance strategies
This is a shared conversation. Sign in to Orris to start your own chat.