Paper presentation on Comparison of Medical versus Surgical Management of Adenomyosis for gynec resident doctor
adenomyosis medical surgical management comparison
PMID: 39032312
PMID: 38837727
mkdir -p /home/daytona/workspace/adenomyosis-presentation
~/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" {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 & Pathophysiology"),
("2.", "Clinical Features & Diagnosis"),
("3.", "Overview of Management Strategies"),
("4.", "Medical Management — Agents & Evidence"),
("5.", "Surgical Management — Options & Techniques"),
("6.", "Head-to-Head Comparison"),
("7.", "Special Considerations: Fertility & Recurrence"),
("8.", "Current Evidence & Recommendations"),
("9.", "Key Takeaways & 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 & 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 & 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 & Novak's Gynecology</i>, 16th ed. (2020). Management of Adenomyosis, pp. 581–582.",
"2. Williams NS et al. <i>Bailey & 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 & Kumar Pathologic Basis of Disease</i>, 10th ed. (2024). Endometriosis & 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")
cd /home/daytona/workspace/adenomyosis-presentation && python3 build_slides.py 2>&1
~/adenomyosis-presentation/build_slides.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/adenomyosis-presentation/build_slides.py'
cd /home/daytona/workspace/adenomyosis-presentation && python3 build_slides.py 2>&1
~/adenomyosis-presentation/build_slides.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/adenomyosis-presentation/build_slides.py'
cd /home/daytona/workspace/adenomyosis-presentation && python3 build_slides.py 2>&1
Adenomyosis Medical vs Surgical Management
PDF Document · PDF
| Slide | Content |
|---|---|
| 1 | Title slide |
| 2 | Presentation outline |
| 3 | Definition, Epidemiology & Pathophysiology |
| 4 | Clinical Features & Diagnosis (MUSA criteria, MRI, histology) |
| 5 | Overview of all management strategies |
| 6 | Medical Management - 8 drug classes with mechanisms & evidence |
| 7 | Procedural/Minimally Invasive interventions (HIFU, UAE, RFA, PMWA, ablation) |
| 8 | Surgical management (adenomyomectomy techniques + hysterectomy) |
| 9 | Head-to-head comparison table across 12 parameters |
| 10 | Fertility considerations & recurrence rates |
| 11 | Current evidence 2021-2025 with 4 key studies cited |
| 12 | Clinical decision algorithm (step-by-step) |
| 13 | 9 Key takeaways |
| 14 | Full references |