Make ppt on epistaxis clinical overview and management with slides on newer advances
epistaxis management newer advances
epistaxis newer advances treatment 2024 2025 sphenopalatine artery embolization cryotherapy
epistaxis nasal anatomy Kiesselbach's plexus Little's area
epistaxis nasal anatomy Kiesselbach plexus Little area blood supply
mkdir -p /tmp/workspace/epistaxis-ppt && ls /tmp/workspace/epistaxis-ppt/
~/epistaxis-ppt/build_ppt.py
#!/usr/bin/env python3
"""
Epistaxis Clinical Overview & Management - Comprehensive PPT
"""
import json, subprocess, base64
from io import BytesIO
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.oxml.ns import qn
from lxml import etree
# ── Color palette ────────────────────────────────────────────────────────────
DEEP_RED = RGBColor(0xC0, 0x20, 0x2A) # header / accent
DARK_NAVY = RGBColor(0x1A, 0x23, 0x3A) # title text
MID_NAVY = RGBColor(0x2C, 0x3E, 0x70) # sub-heading
LIGHT_GRAY = RGBColor(0xF4, 0xF6, 0xF9) # slide background
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
TEXT_DARK = RGBColor(0x22, 0x22, 0x22)
ACCENT_TEAL = RGBColor(0x00, 0x88, 0x99)
GOLD = RGBColor(0xD4, 0xA0, 0x17)
W, H = Inches(13.333), Inches(7.5)
# ── Helpers ──────────────────────────────────────────────────────────────────
def new_prs():
prs = Presentation()
prs.slide_width = W
prs.slide_height = H
return prs
def blank(prs):
return prs.slides.add_slide(prs.slide_layouts[6])
def rect(slide, x, y, w, h, fill_color=None, line_color=None, line_width=None):
shape = slide.shapes.add_shape(1, x, y, w, h) # MSO_SHAPE_TYPE.RECTANGLE = 1
shape.line.fill.background()
if fill_color:
shape.fill.solid()
shape.fill.fore_color.rgb = fill_color
else:
shape.fill.background()
if line_color:
shape.line.color.rgb = line_color
if line_width:
shape.line.width = line_width
else:
shape.line.fill.background()
return shape
def textbox(slide, x, y, w, h, text, size, bold=False, color=TEXT_DARK,
align=PP_ALIGN.LEFT, wrap=True, italic=False, font="Calibri"):
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = wrap
tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = 0
p = tf.paragraphs[0]
p.alignment = align
r = p.add_run()
r.text = text
r.font.name = bold_font = font
r.font.size = Pt(size)
r.font.bold = bold
r.font.italic = italic
r.font.color.rgb = color
return tb
def add_bullet_box(slide, x, y, w, h, items, size=15, color=TEXT_DARK,
bullet_char="▸", heading=None, heading_size=17,
heading_color=None, font="Calibri"):
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = Inches(0.05)
tf.margin_right = Inches(0.05)
tf.margin_top = Inches(0.05)
tf.margin_bottom = Inches(0.05)
if heading:
p = tf.paragraphs[0]
p.alignment = PP_ALIGN.LEFT
r = p.add_run()
r.text = heading
r.font.bold = True
r.font.size = Pt(heading_size)
r.font.color.rgb = heading_color or MID_NAVY
r.font.name = font
for i, item in enumerate(items):
if heading and i == 0:
p = tf.add_paragraph()
elif i == 0:
p = tf.paragraphs[0]
else:
p = tf.add_paragraph()
p.space_before = Pt(2)
p.alignment = PP_ALIGN.LEFT
r = p.add_run()
r.text = f"{bullet_char} {item}"
r.font.size = Pt(size)
r.font.color.rgb = color
r.font.name = font
return tb
def slide_header(slide, title, subtitle=None):
"""Top red bar with white title text."""
rect(slide, 0, 0, W, Inches(1.05), fill_color=DEEP_RED)
textbox(slide, Inches(0.4), Inches(0.1), Inches(12.5), Inches(0.85),
title, 30, bold=True, color=WHITE, align=PP_ALIGN.LEFT)
if subtitle:
textbox(slide, Inches(0.4), Inches(0.82), Inches(12.5), Inches(0.35),
subtitle, 14, color=RGBColor(0xFF, 0xCC, 0xCC), align=PP_ALIGN.LEFT, italic=True)
def slide_bg(slide):
rect(slide, 0, 0, W, H, fill_color=LIGHT_GRAY)
def footer(slide, text="Epistaxis – Clinical Overview & Management"):
rect(slide, 0, Inches(7.15), W, Inches(0.35), fill_color=DARK_NAVY)
textbox(slide, Inches(0.3), Inches(7.17), Inches(12.7), Inches(0.3),
text, 9, color=WHITE, align=PP_ALIGN.LEFT)
# ── Slide builders ───────────────────────────────────────────────────────────
def slide_title(prs):
s = blank(prs)
# gradient-style bg - dark navy rectangle
rect(s, 0, 0, W, H, fill_color=DARK_NAVY)
rect(s, 0, 0, Inches(6.5), H, fill_color=RGBColor(0x10, 0x18, 0x2D))
# red accent bar left
rect(s, 0, 0, Inches(0.15), H, fill_color=DEEP_RED)
# title
textbox(s, Inches(0.5), Inches(1.5), Inches(8), Inches(1.4),
"EPISTAXIS", 60, bold=True, color=WHITE, align=PP_ALIGN.LEFT)
textbox(s, Inches(0.5), Inches(2.9), Inches(8), Inches(0.7),
"Clinical Overview & Management", 28, color=RGBColor(0xFF, 0xCC, 0xCC), align=PP_ALIGN.LEFT)
textbox(s, Inches(0.5), Inches(3.6), Inches(8), Inches(0.5),
"Including Newer Advances in Diagnosis & Treatment", 18, italic=True,
color=RGBColor(0xAA, 0xCC, 0xFF), align=PP_ALIGN.LEFT)
# decorative line
rect(s, Inches(0.5), Inches(4.25), Inches(6), Inches(0.04), fill_color=DEEP_RED)
textbox(s, Inches(0.5), Inches(4.4), Inches(8), Inches(0.4),
"ENT / Emergency Medicine", 14, color=RGBColor(0x88, 0xAA, 0xCC), align=PP_ALIGN.LEFT)
# right-side decorative circles
for y_offset, alpha in [(1.0, 0.15), (2.5, 0.10), (4.2, 0.08)]:
sh = s.shapes.add_shape(9, Inches(9.5), Inches(y_offset), Inches(3.5), Inches(3.5)) # oval
sh.fill.solid(); sh.fill.fore_color.rgb = RGBColor(0x30, 0x50, 0x80)
sh.line.fill.background()
return s
def slide_agenda(prs):
s = blank(prs); slide_bg(s); slide_header(s, "Contents"); footer(s)
topics = [
("01", "Introduction & Epidemiology"),
("02", "Anatomy of Nasal Blood Supply"),
("03", "Classification: Anterior vs Posterior"),
("04", "Etiology & Predisposing Factors"),
("05", "Clinical Features & Initial Assessment"),
("06", "Step-by-Step Management Algorithm"),
("07", "Anterior Epistaxis Management"),
("08", "Posterior Epistaxis Management"),
("09", "Surgical Approaches"),
("10", "Newer Advances – Embolization & Endoscopic SPA Ligation"),
("11", "Newer Advances – Pharmacological & Hemostatic Agents"),
("12", "Newer Advances – Technology & Future Directions"),
("13", "Special Situations (HHT, Anticoagulation)"),
("14", "Summary & Key Takeaways"),
]
col_gap = Inches(6.7)
for i, (num, topic) in enumerate(topics):
col = i // 7
row = i % 7
x = Inches(0.4) + col * col_gap
y = Inches(1.2) + row * Inches(0.77)
rect(s, x, y, Inches(0.5), Inches(0.5), fill_color=DEEP_RED)
textbox(s, x+Inches(0.05), y+Inches(0.05), Inches(0.4), Inches(0.4),
num, 13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
textbox(s, x+Inches(0.6), y+Inches(0.08), Inches(5.8), Inches(0.4),
topic, 14, color=DARK_NAVY)
return s
def slide_intro(prs):
s = blank(prs); slide_bg(s)
slide_header(s, "Introduction & Epidemiology", "Epistaxis: Overview")
footer(s)
# left column
add_bullet_box(s, Inches(0.4), Inches(1.15), Inches(6.0), Inches(5.6),
[
"Epistaxis = bleeding from the nose; one of the most common ENT emergencies",
"Bimodal age distribution: peaks in children <10 yrs and adults >50 yrs",
"~60% of the general population experience at least one episode in their lifetime",
"Only ~6% seek medical attention; <1% require hospital admission",
"Rare but potentially life-threatening in elderly with comorbidities",
"Incidence higher in winter months due to dry, cold air and indoor heating",
"Male-to-female ratio slightly higher in adults",
], heading="Epidemiology", heading_size=18, size=14)
# right column
add_bullet_box(s, Inches(6.8), Inches(1.15), Inches(6.1), Inches(5.6),
[
"Anterior (90%) – Kiesselbach's plexus (Little's area), anteroinferior septum",
"Posterior (10%) – Sphenopalatine artery territory; more severe, older adults",
"Rarely life-threatening but can cause significant distress and anxiety",
"Hypertension often present at time of bleed but causal link not firmly established",
"Anticoagulants and antiplatelet agents are major risk factors for recurrence",
"Death from epistaxis is exceedingly rare",
], heading="Key Facts", heading_size=18, size=14)
return s
def slide_anatomy(prs):
s = blank(prs); slide_bg(s)
slide_header(s, "Anatomy of Nasal Blood Supply", "Kiesselbach's Plexus & Sphenopalatine Artery")
footer(s)
# Embed the anatomy image from Rosen's textbook
img_url = "https://cdn.orris.care/cdss_images/21feeb7dfb567bb6c3c696736b0a38c343fdc2c9d1656338c25731559ac76591.png"
result = json.loads(subprocess.check_output(
["python", "/tmp/skills/shared/scripts/fetch_images.py", img_url]
))
img_data = result[0]
if img_data.get("base64"):
raw = base64.b64decode(img_data["base64"].split(",", 1)[-1])
s.shapes.add_picture(BytesIO(raw), Inches(0.3), Inches(1.1), Inches(5.5), Inches(5.5))
# annotations on the right
add_bullet_box(s, Inches(6.2), Inches(1.15), Inches(6.7), Inches(5.8),
[
"Sphenopalatine artery (SPA) – branch of internal maxillary artery (ECA); "
"supplies turbinates and posterior septum; most common vessel in severe posterior epistaxis",
"Anterior ethmoidal artery – branch of ophthalmic artery (ICA); "
"supplies superior mucosa and septum",
"Posterior ethmoidal artery – also from ophthalmic artery (ICA)",
"Superior labial artery – branch of facial artery; supplies anterior septum",
"Greater palatine artery – ascending branch contributes to anterior septum",
"Kiesselbach's (Little's) area – anterior-inferior septum where all five arteries "
"anastomose; most common site of bleeding (~90%)",
"Woodruff's plexus – posterior lateral nasal wall; site of posterior epistaxis",
], heading="Key Vascular Anatomy", heading_size=18, size=13)
textbox(s, Inches(0.3), Inches(6.55), Inches(5.5), Inches(0.35),
"Fig: Arterial supply to medial wall of nose (Rosen's Emergency Medicine)", 10,
italic=True, color=RGBColor(0x55, 0x55, 0x55), align=PP_ALIGN.CENTER)
return s
def slide_classification(prs):
s = blank(prs); slide_bg(s)
slide_header(s, "Classification", "Anterior vs Posterior Epistaxis")
footer(s)
# Two comparison boxes
for col, (title_txt, fill, items) in enumerate([
("ANTERIOR EPISTAXIS (90%)", RGBColor(0x1A, 0x6B, 0x3C),
["Site: Kiesselbach's plexus – Little's area (anteroinferior nasal septum)",
"Demographics: Children and young adults",
"Cause: Nose picking, trauma, dry air, URI, allergies",
"Character: Unilateral, venous or arteriolar, self-limiting",
"Management: Direct pressure, topical vasoconstrictors, silver nitrate cautery, "
"anterior packing",
"Prognosis: Excellent; rarely requires hospital admission",
"Visualization: Easy – anterior nasal examination"]),
("POSTERIOR EPISTAXIS (10%)", RGBColor(0x8B, 0x1A, 0x1A),
["Site: Sphenopalatine artery territory, Woodruff's plexus",
"Demographics: Elderly with hypertension, anticoagulation",
"Cause: Arterial bleeding, HHT, coagulopathy, hypertension",
"Character: More severe, bilateral, may flow into pharynx",
"Management: Posterior packing, balloon catheters, surgical/endoscopic SPA ligation, "
"arterial embolization",
"Prognosis: Requires admission; monitoring for cardiac/pulmonary complications",
"Visualization: Difficult – requires endoscopy"])
]):
x = Inches(0.3 + col * 6.55)
rect(s, x, Inches(1.1), Inches(6.3), Inches(0.5), fill_color=fill)
textbox(s, x+Inches(0.1), Inches(1.13), Inches(6.1), Inches(0.45),
title_txt, 16, bold=True, color=WHITE)
add_bullet_box(s, x+Inches(0.1), Inches(1.65), Inches(6.1), Inches(5.1),
items, size=13, color=DARK_NAVY, bullet_char="◆")
return s
def slide_etiology(prs):
s = blank(prs); slide_bg(s)
slide_header(s, "Etiology & Predisposing Factors", "Local and Systemic Causes")
footer(s)
add_bullet_box(s, Inches(0.4), Inches(1.15), Inches(6.0), Inches(5.8),
["Nose picking (most common in children)",
"Nasal trauma / facial fractures",
"Foreign body",
"Nasal polyps",
"Nasal tumors (e.g., juvenile angiofibroma, SCC)",
"Granulomatous disease (sarcoidosis, Wegener's / GPA, TB)",
"Septal perforation / deviated nasal septum",
"Post-operative (sinus surgery, septoplasty)",
"Infection / rhinitis / URI",
"Environmental irritants, cocaine use",
"Barotrauma",
"Chronic nasal steroid spray misuse"],
heading="LOCAL CAUSES", heading_size=17, size=13)
add_bullet_box(s, Inches(6.7), Inches(1.15), Inches(6.2), Inches(5.8),
["Hypertension (associated, not strictly causal)",
"Anticoagulants: Warfarin, DOACs (rivaroxaban, apixaban)",
"Antiplatelet drugs: Aspirin, clopidogrel",
"Hereditary Haemorrhagic Telangiectasia (Osler-Weber-Rendu)",
"Haemophilia A & B, von Willebrand disease",
"Thrombocytopenia (leukaemia, ITP, chemotherapy)",
"Liver disease (reduced clotting factor synthesis)",
"Chronic alcoholism",
"Vitamin K deficiency",
"Folic acid deficiency",
"Renal failure (platelet dysfunction)",
"Non-accidental trauma (in children <2 yrs – consider safeguarding)"],
heading="SYSTEMIC CAUSES", heading_size=17, size=13)
return s
def slide_clinical(prs):
s = blank(prs); slide_bg(s)
slide_header(s, "Clinical Features & Initial Assessment")
footer(s)
add_bullet_box(s, Inches(0.4), Inches(1.15), Inches(5.8), Inches(5.8),
["Active bleeding – unilateral or bilateral; anterior vs posterior",
"Blood in pharynx / haemoptysis / melaena – suggests posterior",
"Volume of blood loss – rarely significant but assess haemodynamics",
"Duration, frequency, and episodes",
"History: trauma, medications (anticoagulants), comorbidities",
"Family history: HHT, bleeding disorders",
"EXAMINE: nasal speculum, rigid nasendoscopy if available",
"Identify bleeding point – essential for targeted treatment",
"Head positioned upright; patient leans forward",
"Note telangiectasias on lips/tongue (suggests HHT)"],
heading="Clinical Assessment", heading_size=17, size=13)
add_bullet_box(s, Inches(6.4), Inches(1.15), Inches(6.5), Inches(2.8),
["CBC, coagulation (PT, aPTT, INR) – if on anticoagulants or severe bleed",
"Blood group & crossmatch – if significant volume loss",
"Renal function – if suspected liver/renal disease",
"CT face/sinuses – if tumour, trauma or foreign body suspected",
"Angiography – if planning embolization"],
heading="Investigations", heading_size=17, size=13)
add_bullet_box(s, Inches(6.4), Inches(4.2), Inches(6.5), Inches(2.6),
["Airway – assess patency first",
"Breathing – posterior bleeds can compromise airway",
"Circulation – fluid resuscitation if haemodynamically compromised",
"Patient anxiety – reassurance reduces blood pressure",
"Reverse any reversible coagulopathy (Vitamin K, FFP)"],
heading="Initial Priorities (ABCs)", heading_size=17, size=13,
heading_color=DEEP_RED)
return s
def slide_algorithm(prs):
s = blank(prs); slide_bg(s)
slide_header(s, "Management Algorithm", "Step-by-Step Approach to Epistaxis")
footer(s)
steps = [
("STEP 1", "Stabilise & Assess", "Airway, ABC, IV access if needed, position upright, lean forward"),
("STEP 2", "Compress & Vasoconstrictors", "Pinch cartilaginous nose 10-15 min; 0.05% oxymetazoline / topical adrenaline + lidocaine"),
("STEP 3", "Identify Bleeding Point", "Nasal speculum ± endoscopy after clearing clots"),
("STEP 4", "Chemical Cautery", "Silver nitrate cautery if bleeding point visible (anterior)"),
("STEP 5", "Topical Haemostatics", "Tranexamic acid soaked pledget, Gelfoam, Surgicel, Nasopore"),
("STEP 6", "Anterior Packing", "Merocel tampon or Rapid Rhino balloon; leave 24-48 hrs"),
("STEP 7", "Posterior Packing", "Double balloon catheter or Foley catheter (5-7 mL); admit & monitor"),
("STEP 8", "Endoscopic / Surgical", "Endoscopic SPA ligation / clip; ethmoidal artery ligation"),
("STEP 9", "Interventional Radiology", "Superselective arterial embolization of IMA/SPA"),
]
col_items = 5
for i, (step, title, detail) in enumerate(steps):
col = i % 3
row = i // 3
x = Inches(0.3 + col * 4.35)
y = Inches(1.15 + row * 1.9)
rect(s, x, y, Inches(4.1), Inches(1.8), fill_color=WHITE,
line_color=DEEP_RED if row == 0 else MID_NAVY, line_width=Pt(1.2))
rect(s, x, y, Inches(1.1), Inches(0.4), fill_color=DEEP_RED if row == 0 else MID_NAVY)
textbox(s, x+Inches(0.05), y+Inches(0.02), Inches(1.0), Inches(0.38),
step, 10, bold=True, color=WHITE)
textbox(s, x+Inches(0.1), y+Inches(0.42), Inches(3.9), Inches(0.42),
title, 13, bold=True, color=DARK_NAVY)
textbox(s, x+Inches(0.1), y+Inches(0.84), Inches(3.9), Inches(0.92),
detail, 11, color=TEXT_DARK, wrap=True)
return s
def slide_anterior_mgmt(prs):
s = blank(prs); slide_bg(s)
slide_header(s, "Anterior Epistaxis – Management", "Conservative to Procedural Escalation")
footer(s)
add_bullet_box(s, Inches(0.4), Inches(1.15), Inches(6.0), Inches(5.8),
["Reassure patient; sit upright, lean forward (not back)",
"Bilateral digital compression of cartilaginous nose for 10-15 min",
"Nose clip superior to manual compression alone",
"Oxymetazoline (0.05%) spray into affected naris before compression",
"2% lidocaine via mucosal atomizer for analgesia and exam",
"Identify bleeding point with nasal speculum (head in neutral, "
"not tilted); open speculum vertically",
"Silver nitrate cautery – periphery to centre, "
"superior to inferior; max 15 sec contact; never bilateral simultaneously",
"Gelfoam / Surgicel / FloSeal if cautery fails",
"Merocel nasal tampon – insert along nasal floor; expand with saline",
"Rapid Rhino – carboxymethylcellulose coating; inflate with air",
"Leave anterior pack in place 24-48 hours",
"Prophylactic antibiotics NOT routinely recommended"],
heading="Anterior Management", heading_size=17, size=12.5)
add_bullet_box(s, Inches(6.7), Inches(1.15), Inches(6.2), Inches(5.8),
["Antifibrinolytic; inhibits fibrinolysis",
"500 mg IV solution applied to nasal pledget or atomized nasally",
"Shown to reduce bleeding at 10 min AND re-bleeding at 7-10 days",
"Superior to anterior packing in antiplatelet drug users (RCTS)",
"No significant increase in adverse events in meta-analyses",
"Accessible, inexpensive, non-traumatic – ideal first-line adjunct",
"---",
"Nasopore – absorbable polyurethane foam; no removal needed",
"Floseal – thrombin + gelatin hemostatic matrix; effective for posterior bleeds",
"Cellulose-based products (Surgicel) – biodegradable, no removal",
"Chitosan-based dressings (HemCon) – new generation; antimicrobial properties",
"TachoSil – fibrin-thrombin collagen fleece"],
heading="Topical Tranexamic Acid & Haemostatic Agents", heading_size=17, size=12.5)
return s
def slide_posterior_mgmt(prs):
s = blank(prs); slide_bg(s)
slide_header(s, "Posterior Epistaxis – Management",
"Requires Specialist Input & Inpatient Monitoring")
footer(s)
add_bullet_box(s, Inches(0.4), Inches(1.15), Inches(6.0), Inches(5.8),
["Suspect posterior epistaxis when:",
" • Bleeding persists with properly placed anterior pack",
" • Blood seen in pharynx / bilateral bleeding",
" • Elderly patient with no visible anterior bleeding point",
"Double balloon catheter (Rapid Rhino Posterior, Epistat, Brighton)",
" – Insert along nasal floor; inflate posterior balloon (7-10 mL) first,",
" seat it in nasopharynx by gentle traction",
" – Inflate anterior balloon slowly to patient tolerance",
" – Leave in place 48-72 hours",
"Foley catheter alternative (14-16 Fr):",
" – Advance to nasopharynx, inflate 5-7 mL sterile water",
" – Apply nasal clip to prevent forward displacement",
"ADMIT for monitoring: O₂ saturation, cardiac monitoring in elderly",
"Nasal packing may cause vasovagal response, hypoxia, pressure necrosis",
"Reverse anticoagulation when appropriate"],
heading="Posterior Packing", heading_size=17, size=12)
add_bullet_box(s, Inches(6.7), Inches(1.15), Inches(6.2), Inches(5.8),
["Nasal packing complications in the elderly:",
" • Hypoxia due to nasal obstruction (reflex hypoventilation)",
" • Vasovagal reactions, bradycardia",
" • Eustachian tube dysfunction, sinusitis",
" • Pressure necrosis of alar skin or columella",
" • Toxic shock syndrome (Staph aureus) – use antibiotic-impregnated gauze",
"Indications for early referral to ENT / IR:",
" • Failure of bilateral anterior + posterior packing",
" • Refractory or recurrent episodes",
" • HHT with frequent severe bleeds",
" • Suspected vascular anomaly or tumour",
" • Haemodynamic instability",
"Haematological correction:",
" • Vitamin K / FFP for warfarin reversal",
" • Hold DOACs; andexanet alfa / idarucizumab if critical",
" • DDAVP for vWD or platelet dysfunction",
" • Platelet transfusion if <50×10⁹/L with active bleed"],
heading="Complications & Escalation Criteria", heading_size=17, size=12)
return s
def slide_surgical(prs):
s = blank(prs); slide_bg(s)
slide_header(s, "Surgical Approaches", "Artery Ligation for Refractory Epistaxis")
footer(s)
add_bullet_box(s, Inches(0.4), Inches(1.15), Inches(6.1), Inches(5.8),
["Most effective endoscopic procedure for posterior epistaxis",
"Success rate ~90-98%; lower morbidity vs open surgery",
"Approach: Incision posterior to middle turbinate; mucosal flap elevated",
"SPA identified at sphenopalatine foramen; ligated with metallic clips",
"Terminal branch of internal maxillary artery (ECA territory)",
"TESPAL (Transnasal Endoscopic SPA Ligation):",
" – Equivalent efficacy to embolization (~75% 1-yr success)",
" – Lower complication rate: 18% vs 34% for embolization",
" – Preferred over embolization at many ENT centres",
"Can be combined with anterior/posterior ethmoidal artery ligation if needed"],
heading="Endoscopic SPA Ligation (ESPAL)", heading_size=17, size=12.5)
add_bullet_box(s, Inches(6.7), Inches(1.15), Inches(6.2), Inches(5.8),
["Anterior ethmoidal artery ligation:",
" – Lynch incision approach; ligate at orbital wall",
" – For bleeding from upper nasal cavity / ethmoid area",
"Internal maxillary artery (IMA) ligation:",
" – Transantral approach through Caldwell-Luc incision",
" – Access pterygopalatine fossa; ligate IMA",
" – Largely replaced by endoscopic SPA ligation",
"External carotid artery (ECA) ligation:",
" – Last resort; neck incision above lingual artery origin",
" – Reserved for failure of all other interventions",
"Septoplasty:",
" – If deviated septum contributes to recurrent trauma",
"Juvenile Angiofibroma:",
" – Preoperative embolization + endoscopic or open surgical resection",
" – MRI/CT essential for staging and surgical planning"],
heading="Other Surgical Options", heading_size=17, size=12)
return s
def slide_embolization(prs):
s = blank(prs); slide_bg(s)
slide_header(s, "Newer Advances I: Endovascular Embolization & Endoscopic SPA Ligation",
"Interventional Radiology in Epistaxis Management")
footer(s)
add_bullet_box(s, Inches(0.4), Inches(1.15), Inches(6.1), Inches(5.8),
["Indication: Severe posterior epistaxis failing packing; alternative to surgery",
"Technique: Bilateral selective ICA & ECA angiography; "
"superselective microcatheterisation of IMA, facial, and ascending pharyngeal arteries",
"Particles (150-400 µm PVA microspheres, gelatin sponge) or coils used",
"Distal rather than proximal occlusion preferred – reduces collateral re-bleed",
"Superselective unilateral SPA embolization (2025 prospective study):",
" – 100% immediate haemostasis rate",
" – 6% recurrence rate in high-risk patients (hypertension, antithrombotics)",
" – No major ischemic or neurological adverse events",
"Success rates: 91-97%; complication rates: 0-3% with modern microcatheters",
"Complications: Facial pain, trismus, mucosal necrosis (bilateral), stroke (rare)",
"TESPAL vs Embolization: Equivalent 1-yr success (~75%); TESPAL preferred for "
"lower complication profile (18% vs 34%)"],
heading="Arterial Embolization", heading_size=17, size=12)
add_bullet_box(s, Inches(6.7), Inches(1.15), Inches(6.2), Inches(5.8),
["Nationwide US cohort study (2024 – J NeuroInterventional Surgery):",
" – Embolization superior to conservative management alone for severe epistaxis",
" – Lower rates of re-bleed and shorter hospital stays",
"Scoping review (2024, Eur Arch Otorhinolaryngol – Dispenza et al.):",
" – SPA ligation or cauterization effective for uncontrolled/recurrent epistaxis",
" – Endoscopic approach recommended as first surgical option",
"Hellenic Rhinological Society Guidelines (2024 – Koskinas et al.):",
" – Posterior epistaxis management framework: packing → endoscopy → "
"TESPAL → embolization → surgery",
"Medical Clinics of North America Review (2026 – Valencia-Sanchez et al.):",
" – Updated algorithm incorporating topical TXA and endoscopic techniques",
" – Embolization reserved for patients with contraindications to surgery",
"Key trend: Shift toward endoscopic approaches as first-line over packing "
"for persistent posterior epistaxis"],
heading="Recent Evidence (2023-2026)", heading_size=17, size=12)
return s
def slide_pharmacological(prs):
s = blank(prs); slide_bg(s)
slide_header(s, "Newer Advances II: Pharmacological & Haemostatic Agents",
"Emerging Medical Therapies for Epistaxis")
footer(s)
add_bullet_box(s, Inches(0.4), Inches(1.15), Inches(6.1), Inches(5.8),
["Mechanism: Inhibits fibrinolysis by blocking plasminogen binding to fibrin",
"Topical dose: 500 mg IV solution on pledget or atomized nasally",
"Superiority over anterior packing in antiplatelet drug users (RCT evidence)",
"Meta-analysis: Moderate-quality evidence – reduces 10-min bleeding AND "
"7-10 day re-bleeding; no increase in thromboembolic events",
"Increasingly recommended as first-line adjunct before proceeding to packing",
"Cost-effective, widely available, non-traumatic",
"---",
"Bevacizumab (anti-VEGF) nasal spray:",
" – Used in Hereditary Haemorrhagic Telangiectasia (HHT)",
" – Reduces epistaxis frequency and severity (multiple case series/trials)",
" – Not standard care yet; reserved for HHT refractory to other treatments",
"Oestrogen-progesterone therapy (historical):",
" – Used for HHT; largely replaced by anti-VEGF agents",
"Thalidomide/Lenalidomide:",
" – Anti-angiogenic; used in severe HHT with systemic involvement"],
heading="Tranexamic Acid & Novel Pharmacological Agents", heading_size=17, size=12)
add_bullet_box(s, Inches(6.7), Inches(1.15), Inches(6.2), Inches(5.8),
["FloSeal (thrombin + gelatin matrix):",
" – Effective for diffuse posterior and HHT bleeds",
" – Conforms to irregular surfaces; haemostasis within minutes",
"Floseal vs packing: Reduced pain, comparable haemostasis in RCTs",
"Nasopore (absorbable polyurethane foam):",
" – Biodegradable; no removal required (key advantage)",
" – Used post-sinus surgery and for epistaxis",
"HemCon nasal dressing (chitosan-based):",
" – Antimicrobial + haemostatic properties",
" – Works even in anticoagulated patients",
"Platelet-rich plasma (PRP):",
" – Experimental; topical application being studied for HHT",
"Recombinant activated Factor VIIa (rFVIIa):",
" – Reserved for life-threatening bleeds in coagulopathy",
"DDAVP (desmopressin):",
" – For von Willebrand disease and platelet dysfunction"],
heading="Haemostatic Agents – New Generation", heading_size=17, size=12)
return s
def slide_technology(prs):
s = blank(prs); slide_bg(s)
slide_header(s, "Newer Advances III: Technology & Future Directions",
"Innovation in Epistaxis Diagnosis & Treatment")
footer(s)
add_bullet_box(s, Inches(0.4), Inches(1.15), Inches(6.1), Inches(5.8),
["4K Ultra-HD nasal endoscopy:",
" – Superior bleeding point localisation vs standard 2D scopes",
" – Reduces need for blind packing",
"3D endoscopy & image fusion:",
" – CT/MRI fusion with endoscopic view for angiofibroma/complex cases",
"Cryotherapy:",
" – Targeted freeze ablation of bleeding vessels",
" – Promising for HHT and recurrent anterior epistaxis",
" – Outpatient; avoids septal damage from chemical cautery",
"Diode laser & KTP laser photocoagulation:",
" – Used for HHT; targets individual telangiectatic vessels",
" – Reduces local recurrence without septal perforation risk",
"Bipolar electrocautery advancements:",
" – Fine-tip endoscopic bipolar forceps; precise haemostasis",
"Augmented reality (AR) navigation:",
" – Endoscopic epistaxis surgery guided by real-time AR overlay"],
heading="Endoscopic & Technological Advances", heading_size=17, size=12)
add_bullet_box(s, Inches(6.7), Inches(1.15), Inches(6.2), Inches(5.8),
["AI-assisted triage and prediction models:",
" – Machine learning models predicting rebleed risk from clinical parameters",
" – Can guide admission vs discharge decisions",
"Wearable nasal monitoring devices:",
" – Continuous monitoring of nasal mucosal humidity and temperature",
"Absorbable nasal stents:",
" – Provide tamponade + gradual drug release (TXA, steroids)",
"Drug-eluting nasal implants for HHT:",
" – VEGF inhibitor-coated matrices placed directly on telangiectasias",
"Genetic therapy for HHT:",
" – ENG and ALK1 gene mutation targeted therapies in clinical trials",
"Bevacizumab systemic + intranasal combination:",
" – New trials assessing optimal dosing/frequency in HHT",
"Tissue adhesives (cyanoacrylate, fibrin glue):",
" – Applied endoscopically for persistent posterior bleeds",
"Telemedicine epistaxis management:",
" – Remote guidance protocols for home management of mild-moderate epistaxis"],
heading="Future Directions & Experimental Therapies", heading_size=17, size=12)
return s
def slide_special(prs):
s = blank(prs); slide_bg(s)
slide_header(s, "Special Situations",
"HHT, Anticoagulation, Pregnancy, Paediatrics")
footer(s)
add_bullet_box(s, Inches(0.4), Inches(1.15), Inches(6.1), Inches(5.8),
["Autosomal dominant vascular dysplasia (ENG/ALK1/SMAD4 mutations)",
"Recurrent, bilateral, multifocal mucosal telangiectasias",
"Curaçao criteria for diagnosis (clinical triad + family history)",
"Treatment ladder:",
" 1st: Humidification, saline sprays, petrolatum ointment",
" 2nd: Laser photocoagulation (KTP, Nd:YAG), cryotherapy",
" 3rd: Septal dermoplasty (Young's procedure closes anterior nares)",
" 4th: Bevacizumab intranasal spray or IV",
" 5th: Thalidomide / lenalidomide",
"Multidisciplinary care: ENT + haematology + genetics + interventional radiology",
"Screen for AVMs in lung, liver, brain (MRI/CT recommended)"],
heading="Hereditary Haemorrhagic Telangiectasia (HHT)", heading_size=17, size=12)
add_bullet_box(s, Inches(6.7), Inches(1.15), Inches(6.2), Inches(5.8),
["Warfarin: Vitamin K (oral/IV), FFP, Prothrombin Complex Concentrate (PCC)",
"DOACs (rivaroxaban, apixaban): Hold dose; andexanet alfa for factor Xa inhibitors",
"Dabigatran: Idarucizumab (Praxbind) for reversal",
"Aspirin/Clopidogrel: Generally continue if cardiovascular indication; "
"platelet transfusion if life-threatening",
"Goal: Reverse coagulopathy sufficient to achieve haemostasis without "
"thrombotic risk",
"---",
"Pregnancy: Increased vascularity and hormonal effects; typically mild; "
"avoid silver nitrate in 1st trimester; prefer packing",
"Paediatrics: Foreign body must be excluded; "
"non-accidental trauma (NAI) if <2 yrs; screen for bleeding disorder",
"Elderly: High risk from posterior bleeds; cardiac monitoring during packing; "
"early endoscopic or embolization approach preferred"],
heading="Anticoagulation & Other Special Groups", heading_size=17, size=12)
return s
def slide_summary(prs):
s = blank(prs); slide_bg(s)
slide_header(s, "Summary & Key Takeaways")
footer(s)
points = [
("90% of epistaxis is anterior", "from Kiesselbach's plexus; self-limiting and manageable in ED"),
("Start with simple measures", "Upright posture, digital compression 10-15 min, oxymetazoline spray"),
("Topical TXA is a game-changer", "Reduces immediate and delayed rebleeding; "
"superior to packing for antiplatelet users"),
("Chemical cautery first, pack second", "Silver nitrate for visible anterior bleeds; "
"never bilaterally on septum simultaneously"),
("Posterior epistaxis = specialist territory", "Admit; balloon packing; "
"early ENT/IR involvement"),
("TESPAL is first-line surgery", "Endoscopic SPA ligation: 90-98% success; "
"lower complication rate than embolization"),
("Embolization for refractory cases", "Superselective SPA embolization: "
"100% immediate haemostasis; 6% recurrence (2025 data)"),
("HHT needs a dedicated protocol", "KTP laser, bevacizumab, septodermoplasty; "
"screen for systemic AVMs"),
("Correct coagulopathy", "Vitamin K, PCC, idarucizumab, andexanet alfa as appropriate"),
("Future: AI + novel haemostatics", "Drug-eluting implants, absorbable packs, "
"4K endoscopy, gene therapy for HHT"),
]
for i, (bold_txt, rest) in enumerate(points):
col = i % 2
row = i // 2
x = Inches(0.4 + col * 6.5)
y = Inches(1.15 + row * 1.12)
rect(s, x, y, Inches(0.06), Inches(0.92), fill_color=DEEP_RED)
textbox(s, x+Inches(0.15), y+Inches(0.04), Inches(6.05), Inches(0.42),
bold_txt, 14, bold=True, color=DARK_NAVY)
textbox(s, x+Inches(0.15), y+Inches(0.46), Inches(6.05), Inches(0.5),
rest, 12, color=TEXT_DARK, wrap=True)
return s
def slide_references(prs):
s = blank(prs); slide_bg(s)
slide_header(s, "References")
footer(s)
refs = [
"Rosen's Emergency Medicine: Concepts and Clinical Practice, 10th ed. (2023) – Epistaxis",
"Bailey & Love's Short Practice of Surgery, 28th ed. (2023) – Ch. 51: Nose & Paranasal Sinuses",
"Cummings Otolaryngology Head & Neck Surgery, 7th ed. (2021)",
"Grainger & Allison's Diagnostic Radiology, 6th ed. – Endovascular Management",
"Valencia-Sanchez BA, Donaldson AM. Epistaxis. Med Clin North Am. 2026. PMID: 41206200",
"Koskinas I, et al. Posterior epistaxis management: proposed guidelines. Eur Arch ORL. 2024. PMID: 38032485",
"Gottlieb M, Long B. Managing Epistaxis. Ann Emerg Med. 2023. PMID: 36117013",
"Vizzuso A, et al. Superselective Unilateral Embolization of SPA. J Clin Med. 2025.",
"Dispenza F, et al. SPA ligation or cauterization: scoping review. Eur Arch ORL. 2024.",
"Nationwide cohort study: Embolization vs conservative management for severe epistaxis. J NeuroInterv Surg. 2024.",
]
for i, ref in enumerate(refs):
y = Inches(1.2 + i * 0.55)
rect(s, Inches(0.35), y+Inches(0.1), Inches(0.08), Inches(0.28), fill_color=DEEP_RED)
textbox(s, Inches(0.55), y, Inches(12.4), Inches(0.52),
ref, 12, color=DARK_NAVY, wrap=True)
return s
# ── Build presentation ───────────────────────────────────────────────────────
prs = new_prs()
slide_title(prs)
slide_agenda(prs)
slide_intro(prs)
slide_anatomy(prs)
slide_classification(prs)
slide_etiology(prs)
slide_clinical(prs)
slide_algorithm(prs)
slide_anterior_mgmt(prs)
slide_posterior_mgmt(prs)
slide_surgical(prs)
slide_embolization(prs)
slide_pharmacological(prs)
slide_technology(prs)
slide_special(prs)
slide_summary(prs)
slide_references(prs)
out = "/tmp/workspace/epistaxis-ppt/Epistaxis_Clinical_Overview_Management.pptx"
buf = BytesIO()
prs.save(buf)
with open(out, "wb") as f:
f.write(buf.getvalue())
print(f"Saved: {out} ({len(buf.getvalue())//1024} KB) slides={len(prs.slides)}")
python /tmp/workspace/epistaxis-ppt/build_ppt.py 2>&1
find /tmp/skills -name "fetch_images.py" 2>/dev/null; ls /tmp/skills/ 2>/dev/null
**/*.py in /tmp/skills
python /tmp/skills/shared/scripts/fetch_images.py "https://cdn.orris.care/cdss_images/21feeb7dfb567bb6c3c696736b0a38c343fdc2c9d1656338c25731559ac76591.png" 2>&1 | head -20
python /tmp/workspace/epistaxis-ppt/build_ppt.py 2>&1
Why
No top up available