Details presentation on bed sores
"pressure ulcer" OR "pressure injury" prevention treatment
mkdir -p /home/daytona/workspace/bed-sores-presentation && ls /home/daytona/work…
~/bed-sores-presentation/generate_pdf.py
"""
Bed Sores / Pressure Injuries - Detailed Medical Student Presentation
Generated using reportlab
"""
import requests
import io
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
PageBreak, HRFlowable, Image, KeepTogether
)
from reportlab.platypus.flowables import HRFlowable
from reportlab.lib.colors import HexColor
import urllib.request
OUTPUT = "/home/daytona/workspace/bed-sores-presentation/Bed_Sores_Pressure_Injuries.pdf"
# ── Color palette ──────────────────────────────────────────────
C_NAVY = HexColor("#1a3a5c")
C_TEAL = HexColor("#2a7d8e")
C_LIGHT = HexColor("#e8f4f8")
C_AMBER = HexColor("#d4860a")
C_RED = HexColor("#c0392b")
C_GREEN = HexColor("#1e8449")
C_GREY = HexColor("#5d6d7e")
C_WHITE = colors.white
C_STAGE1 = HexColor("#fff9c4")
C_STAGE2 = HexColor("#ffe0b2")
C_STAGE3 = HexColor("#ffccbc")
C_STAGE4 = HexColor("#ef9a9a")
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
leftMargin=1.8*cm, rightMargin=1.8*cm,
topMargin=1.5*cm, bottomMargin=1.5*cm
)
styles = getSampleStyleSheet()
def S(name, **kw):
"""Create a custom ParagraphStyle."""
base = styles.get(name, styles["Normal"])
return ParagraphStyle(name + "_custom_" + str(id(kw)), parent=base, **kw)
# ── Custom styles ───────────────────────────────────────────────
title_style = S("Title",
fontSize=28, textColor=C_WHITE, alignment=TA_CENTER,
spaceAfter=6, fontName="Helvetica-Bold")
subtitle_style = S("Normal",
fontSize=14, textColor=HexColor("#cce8f4"), alignment=TA_CENTER,
spaceAfter=4, fontName="Helvetica")
slide_title = S("Heading1",
fontSize=18, textColor=C_NAVY, fontName="Helvetica-Bold",
spaceBefore=6, spaceAfter=10, borderPad=4)
section_label = S("Normal",
fontSize=10, textColor=C_WHITE, fontName="Helvetica-Bold",
alignment=TA_CENTER)
h2 = S("Heading2",
fontSize=13, textColor=C_TEAL, fontName="Helvetica-Bold",
spaceBefore=8, spaceAfter=4)
body = S("Normal",
fontSize=10, textColor=HexColor("#1a1a2e"), leading=15,
fontName="Helvetica", spaceAfter=3)
body_just = S("Normal",
fontSize=10, textColor=HexColor("#1a1a2e"), leading=15,
fontName="Helvetica", alignment=TA_JUSTIFY, spaceAfter=3)
bullet = S("Normal",
fontSize=10, textColor=HexColor("#1a1a2e"), leading=15,
fontName="Helvetica", leftIndent=14, bulletIndent=0,
spaceAfter=2)
small = S("Normal",
fontSize=8.5, textColor=C_GREY, fontName="Helvetica",
leading=12, spaceAfter=2)
caption = S("Normal",
fontSize=8, textColor=C_GREY, fontName="Helvetica-Oblique",
alignment=TA_CENTER, spaceAfter=4)
ref_style = S("Normal",
fontSize=7.5, textColor=C_GREY, fontName="Helvetica",
leading=11, spaceAfter=2)
key_box = S("Normal",
fontSize=10, textColor=C_NAVY, fontName="Helvetica-Bold",
leading=14, spaceAfter=2)
def divider(color=C_TEAL, thickness=1.5):
return HRFlowable(width="100%", thickness=thickness, color=color, spaceAfter=6)
def spacer(h=0.3):
return Spacer(1, h*cm)
def banner(text, bg=C_NAVY, fg=C_WHITE, fontsize=11):
data = [[Paragraph(text, S("Normal", fontSize=fontsize, textColor=fg,
fontName="Helvetica-Bold", alignment=TA_CENTER))]]
t = Table(data, colWidths=["100%"])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
]))
return t
def info_box(text, bg=C_LIGHT, border=C_TEAL):
data = [[Paragraph(text, S("Normal", fontSize=9.5, textColor=C_NAVY,
fontName="Helvetica", leading=14))]]
t = Table(data, colWidths=["100%"])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("LINEAFTER", (0,0), (0,-1), 3, border),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING",(0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 8),
]))
return t
def fetch_image_from_url(url, width=6*cm, height=5*cm):
try:
req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
data = urllib.request.urlopen(req, timeout=10).read()
img = Image(io.BytesIO(data), width=width, height=height)
img.hAlign = "CENTER"
return img
except Exception as e:
return Paragraph(f"[Image unavailable: {e}]", caption)
# ═══════════════════════════════════════════════════════════════
# Build slides (flowables)
# ═══════════════════════════════════════════════════════════════
story = []
# ──────────────────────────────────────────
# SLIDE 1 - Cover
# ──────────────────────────────────────────
cover_data = [[
Paragraph("BED SORES", title_style),
Paragraph("(Pressure Injuries / Pressure Ulcers)", subtitle_style),
Spacer(1, 0.4*cm),
Paragraph("A Comprehensive Presentation for Medical Students",
S("Normal", fontSize=11, textColor=HexColor("#a8d8ea"),
fontName="Helvetica-Oblique", alignment=TA_CENTER)),
Spacer(1, 0.4*cm),
Paragraph("Sources: Schwartz's Principles of Surgery · Bailey & Love's Short Practice of Surgery<br/>"
"Swanson's Family Medicine Review · Miller's Anesthesia",
S("Normal", fontSize=8, textColor=HexColor("#afd3de"),
fontName="Helvetica", alignment=TA_CENTER)),
]]
cover_table = Table(cover_data, colWidths=["100%"])
cover_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_NAVY),
("TOPPADDING", (0,0), (-1,-1), 28),
("BOTTOMPADDING", (0,0), (-1,-1), 28),
("LEFTPADDING", (0,0), (-1,-1), 20),
("RIGHTPADDING", (0,0), (-1,-1), 20),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(cover_table)
story.append(spacer(0.6))
# table of contents mini
toc_items = [
"1. Definition & Terminology",
"2. Epidemiology & Burden",
"3. Pathophysiology",
"4. Risk Factors",
"5. Staging (NPIAP System)",
"6. Common Sites",
"7. Clinical Presentation & Assessment",
"8. Braden Scale",
"9. Complications",
"10. Prevention",
"11. Treatment — Conservative",
"12. Treatment — Surgical",
"13. Antibiotics in Infected Ulcers",
"14. Recent Evidence (2024–2026)",
"15. Key Takeaways",
]
toc_cols = [toc_items[:8], toc_items[8:]]
toc_rows = []
for i in range(max(len(c) for c in toc_cols)):
row = []
for col in toc_cols:
row.append(Paragraph(col[i] if i < len(col) else "",
S("Normal", fontSize=9, textColor=C_NAVY,
fontName="Helvetica", leading=14)))
toc_rows.append(row)
toc_table = Table(toc_rows, colWidths=["50%","50%"])
toc_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), HexColor("#f0f8ff")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 10),
("ROWBACKGROUNDS",(0,0),(-1,-1),[HexColor("#f0f8ff"), HexColor("#e4f0f9")]),
("LINEABOVE", (0,0), (-1,0), 1, C_TEAL),
("LINEBELOW", (0,-1), (-1,-1), 1, C_TEAL),
]))
story.append(banner("TABLE OF CONTENTS", bg=C_TEAL))
story.append(toc_table)
story.append(PageBreak())
# ──────────────────────────────────────────
# SLIDE 2 - Definition & Terminology
# ──────────────────────────────────────────
story.append(banner("SLIDE 1 — DEFINITION & TERMINOLOGY"))
story.append(spacer(0.2))
story.append(Paragraph("Definition & Terminology", slide_title))
story.append(divider())
story.append(info_box(
"<b>Pressure Injury (Pressure Ulcer / Bed Sore)</b><br/>"
"A localized area of tissue necrosis that develops when soft tissue is compressed "
"between a bony prominence and an external surface. Excessive pressure causes "
"capillary collapse and impedes the delivery of nutrients to body tissues."
))
story.append(spacer(0.3))
story.append(Paragraph("Terminology Evolution", h2))
term_data = [
[Paragraph("<b>Historical Terms</b>", S("Normal", fontSize=9.5, fontName="Helvetica-Bold",
textColor=C_WHITE)),
Paragraph("<b>Current Preferred Term</b>", S("Normal", fontSize=9.5, fontName="Helvetica-Bold",
textColor=C_WHITE))],
[Paragraph("Decubitus ulcer", body), Paragraph("Pressure Injury (NPIAP 2016)", body)],
[Paragraph("Bedsore", body), Paragraph("Replaced to describe <i>both</i> intact and ulcerated skin", body)],
[Paragraph("Pressure sore", body), Paragraph("More accurate and inclusive terminology", body)],
]
t = Table(term_data, colWidths=["45%","55%"])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_NAVY),
("BACKGROUND", (0,1), (-1,1), HexColor("#eaf4fb")),
("BACKGROUND", (0,2), (-1,2), C_WHITE),
("BACKGROUND", (0,3), (-1,3), HexColor("#eaf4fb")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("BOX", (0,0), (-1,-1), 1, C_TEAL),
("INNERGRID", (0,0), (-1,-1), 0.5, C_GREY),
]))
story.append(t)
story.append(spacer(0.3))
story.append(info_box(
"<b>Key Point:</b> The US National Pressure Injury Advisory Panel (NPIAP) replaced the "
"term 'pressure ulcer' with 'pressure injury' in 2016 to provide a more accurate description "
"of injuries to both intact and ulcerated skin.",
bg=HexColor("#fff8e1"), border=C_AMBER
))
story.append(PageBreak())
# ──────────────────────────────────────────
# SLIDE 3 - Epidemiology
# ──────────────────────────────────────────
story.append(banner("SLIDE 2 — EPIDEMIOLOGY & BURDEN"))
story.append(spacer(0.2))
story.append(Paragraph("Epidemiology & Disease Burden", slide_title))
story.append(divider())
epi_data = [
["Setting", "Prevalence"],
["Acute care hospitals", "7–9%"],
["Long-term care facilities", "11% (50% are Stage II)"],
["Critically ill patients (ICU)", "22–49%"],
["Bed/wheelchair-bound (≥1 wk)", "Up to 28% (Stage II+)"],
["Intraoperative (OR patients)", "~23% of all hospital pressure ulcers"],
]
t = Table(epi_data, colWidths=["55%", "45%"])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_NAVY),
("TEXTCOLOR", (0,0), (-1,0), C_WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 10),
("ROWBACKGROUNDS",(0,1),(-1,-1), [HexColor("#f5f8fb"), C_WHITE]),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("BOX", (0,0), (-1,-1), 1, C_TEAL),
("INNERGRID", (0,0), (-1,-1), 0.4, C_GREY),
]))
story.append(t)
story.append(spacer(0.3))
econ_data = [
[Paragraph("<b>3 million</b>", S("Normal", fontSize=18, textColor=C_NAVY,
fontName="Helvetica-Bold", alignment=TA_CENTER)),
Paragraph("<b>$5+ billion</b>", S("Normal", fontSize=18, textColor=C_RED,
fontName="Helvetica-Bold", alignment=TA_CENTER)),
Paragraph("<b>23–36%</b>", S("Normal", fontSize=18, textColor=C_AMBER,
fontName="Helvetica-Bold", alignment=TA_CENTER))],
[Paragraph("People affected/year", caption),
Paragraph("Annual cost in the US", caption),
Paragraph("In-hospital mortality (with PU)", caption)],
]
ec_t = Table(econ_data, colWidths=["33%","34%","33%"])
ec_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), HexColor("#f0f8ff")),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("BOX", (0,0), (-1,-1), 1.5, C_TEAL),
("LINEAFTER", (0,0), (1,-1), 1, C_TEAL),
]))
story.append(ec_t)
story.append(spacer(0.2))
story.append(Paragraph(
"<b>Note:</b> Pressure injuries are increasingly regarded as a marker of quality of care. "
"Most in-hospital deaths involve patients with severe underlying disease.",
small))
story.append(PageBreak())
# ──────────────────────────────────────────
# SLIDE 4 - Pathophysiology
# ──────────────────────────────────────────
story.append(banner("SLIDE 3 — PATHOPHYSIOLOGY"))
story.append(spacer(0.2))
story.append(Paragraph("Pathophysiology", slide_title))
story.append(divider())
story.append(Paragraph("Four Primary Causative Factors", h2))
factors_data = [
[Paragraph("<b>1. Pressure</b>", key_box),
Paragraph("External capillary perfusion pressure = ~30 mmHg. Pressures above this cause "
"local tissue ischemia. In animal models, pressure >2× capillary perfusion pressure "
"causes irreversible necrosis in just 2 hours.", body)],
[Paragraph("<b>2. Shearing Forces</b>", key_box),
Paragraph("Parallel forces between tissue layers (e.g., patient sliding down bed). "
"Causes stretching and tearing of blood vessels.", body)],
[Paragraph("<b>3. Friction</b>", key_box),
Paragraph("Surface rubbing damages epidermis, especially during patient transfers "
"or repositioning if technique is poor.", body)],
[Paragraph("<b>4. Moisture</b>", key_box),
Paragraph("Incontinence, sweat, or wound exudate macerate skin, reducing its "
"resistance to mechanical forces.", body)],
]
ft = Table(factors_data, colWidths=["28%","72%"])
ft.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS",(0,0),(-1,-1), [HexColor("#eaf5fb"), C_WHITE,
HexColor("#eaf5fb"), C_WHITE]),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("BOX", (0,0), (-1,-1), 1, C_TEAL),
("INNERGRID", (0,0), (-1,-1), 0.3, C_GREY),
]))
story.append(ft)
story.append(spacer(0.3))
story.append(Paragraph("Sequence of Pathophysiologic Events", h2))
steps = [
("1", "Sustained pressure on tissues overlying bony prominence"),
("2", "Ischemia — occlusion of blood vessels and lymphatic vessels"),
("3", "Endothelial cell swelling and vessel leakage"),
("4", "Plasma leakage into the interstitial space"),
("5", "Increased distance between cellular elements and blood vessels"),
("6", "Hemorrhage"),
("7", "Non-blanchable erythema of the skin"),
("8", "Accumulation of edema fluid, blood, inflammatory cells, toxic wastes, and bacteria"),
("9", "Death of muscle, subcutaneous tissue, and epidermal skin"),
]
step_rows = [[
Paragraph(f"<b>{s[0]}</b>", S("Normal", fontSize=10, textColor=C_WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER)),
Paragraph(s[1], body)
] for s in steps]
st = Table(step_rows, colWidths=["8%","92%"])
st.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), HexColor("#f8f9fa")),
("BACKGROUND", (0,0), (0,-1), C_TEAL),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("INNERGRID", (0,0), (-1,-1), 0.3, C_GREY),
("BOX", (0,0), (-1,-1), 1, C_TEAL),
]))
story.append(st)
story.append(spacer(0.2))
story.append(info_box(
"<b>Important:</b> Muscle has a higher metabolic demand than skin, so muscle necrosis can occur "
"beneath apparently intact skin — the ulcer may be far worse beneath than what is visible on the surface.",
bg=HexColor("#ffefd5"), border=C_AMBER
))
story.append(PageBreak())
# ──────────────────────────────────────────
# SLIDE 5 - Risk Factors
# ──────────────────────────────────────────
story.append(banner("SLIDE 4 — RISK FACTORS"))
story.append(spacer(0.2))
story.append(Paragraph("Risk Factors", slide_title))
story.append(divider())
rf_intrinsic = [
"Immobility or reduced activity (spinal cord injury, stroke, surgery)",
"Dementias (Alzheimer's disease, vascular dementia)",
"Parkinson disease",
"Congestive cardiac failure",
"Incontinence (urinary and/or fecal)",
"Nutritional deficiencies — protein, vitamins, minerals, calories",
"Hypoalbuminemia, cachexia, decreased body weight",
"Altered mental status",
"Chronic conditions (diabetes, peripheral vascular disease)",
]
rf_extrinsic = [
"Prolonged surgical procedures",
"General anesthesia (23% of all PU occur in the OR)",
"Poorly padded casts or splints",
"Foley catheters and medical devices",
"Artificial airways (endotracheal tubes, NIV masks)",
"Absence of pressure-relieving equipment",
"Inadequate nursing assessment/repositioning",
"Bed/wheelchair confinement",
]
rf_data = [
[Paragraph("<b>Intrinsic (Patient) Factors</b>", S("Normal", fontSize=10,
fontName="Helvetica-Bold", textColor=C_WHITE, alignment=TA_CENTER)),
Paragraph("<b>Extrinsic (Environmental) Factors</b>", S("Normal", fontSize=10,
fontName="Helvetica-Bold", textColor=C_WHITE, alignment=TA_CENTER))],
[[Paragraph(f"• {r}", bullet) for r in rf_intrinsic],
[Paragraph(f"• {r}", bullet) for r in rf_extrinsic]],
]
rft = Table(rf_data, colWidths=["50%","50%"])
rft.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_NAVY),
("BACKGROUND", (0,1), (0,1), HexColor("#eaf5fb")),
("BACKGROUND", (1,1), (1,1), HexColor("#f5fbf0")),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
("BOX", (0,0), (-1,-1), 1.5, C_TEAL),
("LINEBEFORE", (1,0), (1,-1), 1, C_TEAL),
]))
story.append(rft)
story.append(PageBreak())
# ──────────────────────────────────────────
# SLIDE 6 - Staging
# ──────────────────────────────────────────
story.append(banner("SLIDE 5 — STAGING (NPIAP SYSTEM)"))
story.append(spacer(0.2))
story.append(Paragraph("Staging of Pressure Injuries (NPIAP 2016)", slide_title))
story.append(divider())
story.append(Paragraph(
"The National Pressure Injury Advisory Panel (NPIAP) staging system classifies "
"pressure injuries based on depth of tissue destruction:", body_just))
story.append(spacer(0.2))
stage_data = [
["Stage", "NPIAP Label", "Description", "Clinical Features"],
["1", "Non-blanchable erythema of intact skin",
"Skin intact; localized area of non-blanchable redness",
"Discoloration, warmth, edema, hardness; darker skin may show different colors"],
["2", "Partial-thickness skin loss with exposed dermis",
"Loss of epidermis ± dermis; shallow open ulcer",
"Pink/red wound bed; may present as intact or ruptured blister"],
["3", "Full-thickness skin loss",
"Extends to subcutaneous fat; does NOT penetrate fascia",
"Deep crater; may show undermining/tunneling; no bone/tendon/muscle exposed"],
["4", "Full-thickness skin and tissue loss",
"Destruction extends to muscle, bone, tendon, or joint capsule",
"Exposed bone/tendon/muscle; often has slough/eschar; osteomyelitis possible"],
["Unstageable", "Obscured full-thickness skin and tissue loss",
"Base covered by slough or eschar; actual depth unknown",
"Must debride to determine true stage; often Stage 3 or 4 beneath"],
["Deep Tissue\nInjury (DTI)", "Persistent non-blanchable deep discoloration",
"Intact or non-intact skin; deep red, maroon, or purple",
"May indicate deep muscle damage; may evolve rapidly to Stage 3/4"],
]
bg_stages = [C_NAVY, C_STAGE1, C_STAGE2, C_STAGE3, C_STAGE4,
HexColor("#d7bde2"), HexColor("#b2babb")]
stage_table = Table(
[[Paragraph(str(cell), S("Normal", fontSize=8.5,
fontName="Helvetica-Bold" if r==0 else "Helvetica",
textColor=C_WHITE if r==0 else C_NAVY,
leading=12)) for cell in row]
for r, row in enumerate(stage_data)],
colWidths=["10%","25%","30%","35%"]
)
stage_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_NAVY),
("TEXTCOLOR", (0,0), (-1,0), C_WHITE),
*[("BACKGROUND", (0,i+1), (-1,i+1), bg_stages[i+1]) for i in range(6)],
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
("BOX", (0,0), (-1,-1), 1, C_TEAL),
("INNERGRID", (0,0), (-1,-1), 0.3, C_GREY),
]))
story.append(stage_table)
story.append(PageBreak())
# ──────────────────────────────────────────
# SLIDE 7 - Common Sites + Images
# ──────────────────────────────────────────
story.append(banner("SLIDE 6 — COMMON SITES & CLINICAL IMAGES"))
story.append(spacer(0.2))
story.append(Paragraph("Common Sites & Clinical Presentation", slide_title))
story.append(divider())
sites_data = [
[Paragraph("Ischium", body), Paragraph("Greater Trochanter", body)],
[Paragraph("Sacrum", body), Paragraph("Heel", body)],
[Paragraph("Malleolus", body), Paragraph("Occiput", body)],
]
st = Table(sites_data, colWidths=["50%","50%"])
st.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), HexColor("#e8f4f8")),
("FONTNAME", (0,0), (-1,-1), "Helvetica"),
("LEFTPADDING", (0,0), (-1,-1), 14),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("BOX", (0,0), (-1,-1), 1, C_TEAL),
("INNERGRID", (0,0), (-1,-1), 0.3, C_GREY),
]))
story.append(banner("Common Anatomical Sites of Pressure Injury", bg=C_TEAL, fontsize=9))
story.append(st)
story.append(spacer(0.3))
# Clinical images
img1 = fetch_image_from_url(
"https://cdn.orris.care/cdss_images/7073d2c389d3a3edc81a425ee667ea513fc3b6e3ad3a70d7c47cf12ac6701c55.png",
width=7*cm, height=7*cm)
img2 = fetch_image_from_url(
"https://cdn.orris.care/cdss_images/406038327f5f11e45b2785654755c12448caab22a1c39caa74b52dd8ae103ba5.png",
width=7*cm, height=7*cm)
img_data = [
[img1, img2],
[Paragraph("Stage 2 pressure wound after cast removal — wrist (Schwartz's Surgery)", caption),
Paragraph("Stage 4 sacral decubitus ulcer with deep tissue exposure (Schwartz's Surgery)", caption)],
]
img_t = Table(img_data, colWidths=["50%","50%"])
img_t.setStyle(TableStyle([
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
]))
story.append(img_t)
story.append(PageBreak())
# ──────────────────────────────────────────
# SLIDE 8 - Assessment & Braden Scale
# ──────────────────────────────────────────
story.append(banner("SLIDE 7 — RISK ASSESSMENT: BRADEN SCALE"))
story.append(spacer(0.2))
story.append(Paragraph("Clinical Assessment & Risk Scoring", slide_title))
story.append(divider())
story.append(Paragraph(
"Formal risk assessment should be performed for <b>all</b> patients on admission. "
"Several validated tools exist:", body))
story.append(spacer(0.15))
tools_data = [
["Tool", "Subscales", "Score Range", "At Risk"],
["Braden Scale", "Sensory perception, moisture, activity, mobility, nutrition, friction/shear", "6–23", "≤18"],
["Waterlow Score", "Build/weight, skin appearance, mobility, sex/age, appetite, special risks", "0–64+", "≥10"],
["Norton Scale", "Physical condition, mental state, activity, mobility, incontinence", "5–20", "≤14"],
]
tt = Table([[Paragraph(str(c), S("Normal", fontSize=8.5,
fontName="Helvetica-Bold" if r==0 else "Helvetica",
textColor=C_WHITE if r==0 else C_NAVY, leading=12))
for c in row] for r, row in enumerate(tools_data)],
colWidths=["20%","45%","17%","18%"])
tt.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_NAVY),
("ROWBACKGROUNDS",(0,1),(-1,-1),[HexColor("#eaf5fb"),C_WHITE,HexColor("#eaf5fb")]),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
("BOX", (0,0), (-1,-1), 1, C_TEAL),
("INNERGRID", (0,0), (-1,-1), 0.3, C_GREY),
]))
story.append(tt)
story.append(spacer(0.3))
story.append(Paragraph("Braden Scale — Subscale Detail", h2))
braden_data = [
["Subscale", "Range", "Low Score = Risk Indicator"],
["Sensory Perception", "1–4", "Completely limited sensation"],
["Moisture", "1–4", "Constantly moist (incontinence/sweat)"],
["Activity", "1–4", "Bedfast — confined to bed"],
["Mobility", "1–4", "Completely immobile"],
["Nutrition", "1–4", "Very poor — never eats complete meal"],
["Friction & Shear", "1–3", "Problem — requires maximal assistance"],
["<b>Total</b>", "<b>6–23</b>", "<b>≤18 = at risk; ≤12 = high risk</b>"],
]
bd = Table([[Paragraph(str(c), S("Normal", fontSize=8.5,
fontName="Helvetica-Bold" if r==0 or r==7 else "Helvetica",
textColor=C_WHITE if r==0 else C_NAVY, leading=12))
for c in row] for r, row in enumerate(braden_data)],
colWidths=["35%","15%","50%"])
bd.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_NAVY),
("BACKGROUND", (0,7), (-1,7), HexColor("#d5e8d4")),
("ROWBACKGROUNDS",(0,1),(-1,6),[HexColor("#f5f8fb"),C_WHITE]*4),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("BOX", (0,0), (-1,-1), 1, C_TEAL),
("INNERGRID", (0,0), (-1,-1), 0.3, C_GREY),
]))
story.append(bd)
story.append(PageBreak())
# ──────────────────────────────────────────
# SLIDE 9 - Complications
# ──────────────────────────────────────────
story.append(banner("SLIDE 8 — COMPLICATIONS"))
story.append(spacer(0.2))
story.append(Paragraph("Complications of Pressure Injuries", slide_title))
story.append(divider())
comp_data = [
[Paragraph("<b>Complication</b>", S("Normal", fontSize=10, fontName="Helvetica-Bold",
textColor=C_WHITE)),
Paragraph("<b>Details</b>", S("Normal", fontSize=10, fontName="Helvetica-Bold",
textColor=C_WHITE))],
[Paragraph("⚠ Sepsis (most serious)", S("Normal", fontSize=10, textColor=C_RED,
fontName="Helvetica-Bold")),
Paragraph("Most common cause of death; infected pressure ulcers can disseminate rapidly "
"in immunocompromised patients", body)],
[Paragraph("Cellulitis", body),
Paragraph("Local spreading infection of skin and soft tissue", body)],
[Paragraph("Osteomyelitis", body),
Paragraph("Bone infection from deep ulcers; rule out with imaging if clinically suspected", body)],
[Paragraph("Peritonitis", body),
Paragraph("Deeply undermined sacral/perineal ulcers may penetrate into the abdominal cavity", body)],
[Paragraph("Antibiotic resistance", body),
Paragraph("Infected PU are nosocomial reservoirs for MRSA, Pseudomonas, and other resistant organisms", body)],
[Paragraph("Polymicrobial infection", body),
Paragraph("Common organisms: Pseudomonas aeruginosa, Proteus spp., S. aureus, "
"Providencia spp., Bacteroides fragilis — gram-positive anaerobic cocci and "
"gram-negative anaerobic rods predominate", body)],
[Paragraph("Poor wound healing", body),
Paragraph("Failure to heal is independently associated with increased mortality in nursing home residents", body)],
]
ct = Table(comp_data, colWidths=["30%","70%"])
ct.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_RED),
("ROWBACKGROUNDS",(0,1),(-1,-1),[HexColor("#fef9f9"),C_WHITE]*5),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
("BOX", (0,0), (-1,-1), 1, C_RED),
("INNERGRID", (0,0), (-1,-1), 0.3, HexColor("#e0b0b0")),
]))
story.append(ct)
story.append(PageBreak())
# ──────────────────────────────────────────
# SLIDE 10 - Prevention
# ──────────────────────────────────────────
story.append(banner("SLIDE 9 — PREVENTION"))
story.append(spacer(0.2))
story.append(Paragraph("Prevention of Pressure Injuries", slide_title))
story.append(divider())
story.append(info_box(
"<b>Core Principle:</b> Pressure injuries should be regarded as largely <b>preventable</b>. "
"There is a significant decrease in incidence after educational programs and implementation "
"of multidisciplinary team approaches.",
bg=HexColor("#e8f8e8"), border=C_GREEN
))
story.append(spacer(0.3))
prev_items = [
("Formal Risk Assessment",
"Use validated tool (Braden, Waterlow, or Norton) for ALL patients on admission; reassess regularly."),
("Repositioning",
"High-risk patients: reposition every 2 hours. Lower-risk: every 2–4 hours. "
"Position at 30° lateral tilt (not 90°) to avoid trochanteric pressure."),
("Pressure-Redistributing Surfaces",
"Preferred: static/alternating air mattresses, gel mattresses, water mattresses. "
"Standard foam pads and sheepskins are insufficient to eliminate risk."),
("Prophylactic Dressings",
"Silicone foam dressings over bony prominences (sacrum, heels) shown to reduce pressure injuries."),
("Skin Assessment",
"Regular skin inspection especially over bony prominences. Keep skin clean and dry."),
("Nutritional Support",
"Address protein, caloric, vitamin (especially Vitamin C), and mineral deficiencies. "
"Hypoalbuminemia and cachexia are major risk factors."),
("Transfer Technique",
"Lifting devices or sheet movement (not dragging) minimizes friction and shear during transfers."),
("Early Mobilization",
"Prioritize getting patients out of bed as early as clinically appropriate."),
("Education",
"Target all levels: healthcare providers, patients, families, and caregivers."),
("Device Management",
"Regularly inspect skin under catheters, ET tubes, NIV masks, casts, and other devices."),
]
for title, detail in prev_items:
row_data = [[
Paragraph(f"<b>{title}</b>", S("Normal", fontSize=9.5, textColor=C_TEAL,
fontName="Helvetica-Bold", leading=13)),
Paragraph(detail, S("Normal", fontSize=9.5, textColor=C_NAVY,
fontName="Helvetica", leading=13))
]]
rt = Table(row_data, colWidths=["28%","72%"])
rt.setStyle(TableStyle([
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
("LINEBELOW", (0,0), (-1,-1), 0.3, HexColor("#aed6f1")),
]))
story.append(rt)
story.append(PageBreak())
# ──────────────────────────────────────────
# SLIDE 11 - Conservative Treatment
# ──────────────────────────────────────────
story.append(banner("SLIDE 10 — CONSERVATIVE TREATMENT"))
story.append(spacer(0.2))
story.append(Paragraph("Conservative Management", slide_title))
story.append(divider())
story.append(Paragraph(
"Treatment requires a <b>multidisciplinary approach</b> involving physicians, nurses, "
"dietitians, physical therapists, and wound care specialists.", body_just))
story.append(spacer(0.2))
cons_data = [
["Category", "Approach"],
["Pressure Relief", "Offload pressure immediately. Pressure-redistributing beds, repositioning q2h, early mobilization."],
["Wound Cleaning", "Normal saline is agent of choice. AVOID povidone-iodine, hypochlorite, acetic acid, hydrogen peroxide (cytotoxic to healing tissue)."],
["Debridement",
"Surgical debridement is most efficient. Wet-to-dry gauze with normal saline is adjunct. "
"Enzymatic agents used until wound bed is clean. Hydrophilic polymers for moist/exudative lesions."],
["Dressings",
"Stage II: occlusive or hydrocolloid dressings (improve healing rates). "
"Stage III/IV: moist gauze soaked in normal saline. Maintain moist wound environment once clean."],
["Vacuum-Assisted Closure (VAC)",
"Removes excess interstitial fluid, promotes capillary circulation, decreases bacterial colonization, "
"increases vascularity and granulation tissue, contributes to wound size reduction."],
["Nutrition",
"Optimize protein and caloric intake. Vitamin C: 84% reduction in ulcer surface area reported. "
"Address hypoalbuminemia."],
["Host Optimization",
"Treat underlying comorbidities (diabetes, heart failure, vascular disease). "
"Control incontinence. Manage pain."],
]
ct = Table([[Paragraph(str(c), S("Normal", fontSize=8.5,
fontName="Helvetica-Bold" if r==0 else "Helvetica",
textColor=C_WHITE if r==0 else C_NAVY, leading=12))
for c in row] for r, row in enumerate(cons_data)],
colWidths=["22%","78%"])
ct.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_TEAL),
("ROWBACKGROUNDS",(0,1),(-1,-1),[HexColor("#eaf5fb"),C_WHITE]*5),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
("BOX", (0,0), (-1,-1), 1, C_TEAL),
("INNERGRID", (0,0), (-1,-1), 0.3, C_GREY),
]))
story.append(ct)
story.append(PageBreak())
# ──────────────────────────────────────────
# SLIDE 12 - Surgical Treatment
# ──────────────────────────────────────────
story.append(banner("SLIDE 11 — SURGICAL TREATMENT"))
story.append(spacer(0.2))
story.append(Paragraph("Surgical Management", slide_title))
story.append(divider())
story.append(info_box(
"<b>Surgical Indications:</b> Surgery is NOT first-line. Stage III/IV ulcers alone are not an "
"automatic indication. Fever in patients with PU often originates from urinary or pulmonary sources, "
"not the ulcer itself. Patients must be well-motivated and able to comply with postoperative prevention.",
bg=HexColor("#fef9e7"), border=C_AMBER
))
story.append(spacer(0.25))
story.append(Paragraph("Goals of Surgical Intervention", h2))
surgical_goals = [
"Drainage of fluid collections",
"Wide debridement of devitalized and scarred tissue",
"Excision of pseudobursa",
"Osteotomy of involved bones (to remove bony prominences)",
"Hemostasis",
"Tension-free closure of dead space with well-vascularized tissue",
]
for g in surgical_goals:
story.append(Paragraph(f"• {g}", bullet))
story.append(spacer(0.2))
story.append(Paragraph("Flap Options", h2))
flap_data = [
["Flap Type", "Indication", "Notes"],
["Musculocutaneous flap", "Stage 3–4 sacral/trochanteric ulcers", "Provides well-vascularized bulk tissue; preferred"],
["Fasciocutaneous flap", "Smaller defects with good tissue quality", "Alternative when muscle is not needed"],
["Primary closure", "Generally AVOIDED", "High recurrence rates due to tension"],
["Skin grafting alone", "Generally AVOIDED for deep ulcers", "Insufficient to cover deep dead space"],
["Stage 2–3 (selected)", "May heal secondarily after debridement", "Careful selection required"],
]
ft = Table([[Paragraph(str(c), S("Normal", fontSize=8.5,
fontName="Helvetica-Bold" if r==0 else "Helvetica",
textColor=C_WHITE if r==0 else C_NAVY, leading=12))
for c in row] for r, row in enumerate(flap_data)],
colWidths=["28%","40%","32%"])
ft.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_NAVY),
("ROWBACKGROUNDS",(0,1),(-1,-1),[HexColor("#eaf5fb"),C_WHITE]*4),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
("BOX", (0,0), (-1,-1), 1, C_TEAL),
("INNERGRID", (0,0), (-1,-1), 0.3, C_GREY),
]))
story.append(ft)
story.append(spacer(0.2))
story.append(info_box(
"<b>Recurrence Warning:</b> Recurrence rates after surgical repair are extremely high "
"due to the underlying patient population and the difficulty of fully addressing causative mechanisms.",
bg=HexColor("#fdecea"), border=C_RED
))
story.append(PageBreak())
# ──────────────────────────────────────────
# SLIDE 13 - Antibiotics
# ──────────────────────────────────────────
story.append(banner("SLIDE 12 — ANTIBIOTICS IN INFECTED PRESSURE ULCERS"))
story.append(spacer(0.2))
story.append(Paragraph("Antibiotic Management of Infected Pressure Ulcers", slide_title))
story.append(divider())
story.append(info_box(
"<b>Microbiology:</b> Infections are <b>polymicrobial</b>. Common organisms include "
"<i>Pseudomonas aeruginosa</i>, <i>Proteus spp.</i>, <i>S. aureus</i> (including MRSA), "
"<i>Providencia spp.</i>, and <i>Bacteroides fragilis</i>.",
bg=HexColor("#f5eef8"), border=C_NAVY
))
story.append(spacer(0.25))
abx_data = [
["Severity", "Duration", "Antibiotic Options"],
["Mild\n(cellulitis/superficial)", "2 weeks",
"Cephalexin OR clindamycin OR amoxicillin/clavulanate\n"
"MRSA: linezolid"],
["Moderate\n(deep soft tissue)", "2–4 weeks",
"Clindamycin + ciprofloxacin OR ciprofloxacin + ceftriaxone IV\n"
"MRSA: vancomycin IV or linezolid IV"],
["Severe\n(bone involvement/sepsis)", "2–12 weeks\n(depends on osteomyelitis)",
"Clindamycin + ceftriaxone IV OR piperacillin/tazobactam OR\n"
"clindamycin + gentamicin IV (monitor renal function) OR\n"
"imipenem/meropenem IV — MRSA: vancomycin IV or linezolid IV"],
]
at = Table([[Paragraph(str(c), S("Normal", fontSize=8.5,
fontName="Helvetica-Bold" if r==0 else "Helvetica",
textColor=C_WHITE if r==0 else C_NAVY, leading=12))
for c in row] for r, row in enumerate(abx_data)],
colWidths=["20%","18%","62%"])
at.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_RED),
("BACKGROUND", (0,1), (-1,1), HexColor("#fef9c3")),
("BACKGROUND", (0,2), (-1,2), HexColor("#fde8cc")),
("BACKGROUND", (0,3), (-1,3), HexColor("#fddcdc")),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "TOP"),
("BOX", (0,0), (-1,-1), 1.5, C_RED),
("INNERGRID", (0,0), (-1,-1), 0.4, HexColor("#e0b0b0")),
]))
story.append(at)
story.append(spacer(0.2))
story.append(Paragraph(
"<b>Important:</b> Rule out osteomyelitis if clinically suspected (imaging, bone biopsy). "
"If osteomyelitis is confirmed, prolonged IV antibiotic therapy or surgical resection of infected bone is required.",
small))
story.append(PageBreak())
# ──────────────────────────────────────────
# SLIDE 14 - Recent Evidence
# ──────────────────────────────────────────
story.append(banner("SLIDE 13 — RECENT EVIDENCE (2023–2026)"))
story.append(spacer(0.2))
story.append(Paragraph("Recent Evidence — Key Systematic Reviews", slide_title))
story.append(divider())
evidence_items = [
("Cochrane Review 2024 (PMID 38345088)",
"Nutritional Interventions",
"Nutritional supplements (protein, vitamin C, zinc) may improve healing of existing "
"pressure ulcers, but evidence quality is moderate. Routine supplementation for prevention "
"remains uncertain."),
("Systematic Review & Meta-Analysis 2024 (PMID 38642429)",
"Care Bundles",
"Pressure injury prevention care bundles (standardized multi-component protocols including "
"risk assessment + repositioning + skin care + device management) significantly reduce "
"in-hospital pressure injury incidence vs. standard care."),
("Systematic Review 2024 (PMID 34813723)",
"Pressure-Relieving Cushions",
"Specialized pressure-redistributing seat cushions reduce pressure injury incidence in "
"wheelchair-dependent patients. Recommendation: prescribe appropriate cushions to all "
"at-risk wheelchair users."),
("Systematic Review 2024 (PMID 38826030)",
"NIV Mask-Related Pressure Injuries",
"Non-invasive ventilation masks are an increasingly recognized cause of pressure injury. "
"Protective dressings, mask rotation, and regular skin assessment are effective preventive strategies."),
]
for pmid_label, topic, text in evidence_items:
ev_data = [[
Paragraph(f"<b>{topic}</b><br/><font size='7' color='grey'>{pmid_label}</font>",
S("Normal", fontSize=9.5, textColor=C_NAVY, fontName="Helvetica-Bold",
leading=13)),
Paragraph(text, S("Normal", fontSize=9.5, textColor=C_NAVY,
fontName="Helvetica", leading=13))
]]
rt = Table(ev_data, colWidths=["28%","72%"])
rt.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,-1), HexColor("#d4e6f1")),
("BACKGROUND", (1,0), (1,-1), HexColor("#f8fbff")),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "TOP"),
("LINEBELOW", (0,0), (-1,-1), 0.5, HexColor("#aed6f1")),
]))
story.append(rt)
story.append(spacer(0.05))
story.append(PageBreak())
# ──────────────────────────────────────────
# SLIDE 15 - Key Takeaways
# ──────────────────────────────────────────
story.append(banner("SLIDE 14 — KEY TAKEAWAYS"))
story.append(spacer(0.2))
story.append(Paragraph("Key Takeaways for Medical Students", slide_title))
story.append(divider())
takeaways = [
("1", C_NAVY,
"Pressure injuries are common, costly, and largely preventable — they are a quality-of-care marker."),
("2", C_TEAL,
"Four factors drive formation: pressure, shearing forces, friction, and moisture."),
("3", C_AMBER,
"Average capillary perfusion pressure is ~30 mmHg. Exceeding this even briefly causes ischemia."),
("4", C_NAVY,
"NPIAP staging (Stage 1–4 + Unstageable + Deep Tissue Injury) drives management decisions."),
("5", C_TEAL,
"Muscle can necrose beneath intact-looking skin — do not underestimate depth."),
("6", C_GREEN,
"Prevention: Braden score ALL patients, reposition q2h, use pressure-redistributing surfaces, "
"prophylactic silicone dressings, nutritional optimization."),
("7", C_RED,
"Sepsis is the most feared complication — infections are polymicrobial including MRSA."),
("8", C_AMBER,
"For wound care: normal saline is best; AVOID povidone-iodine and hydrogen peroxide."),
("9", C_NAVY,
"Surgery (flaps) is reserved for refractory Stage 3–4; recurrence rates are very high."),
("10", C_GREEN,
"Recent evidence supports: care bundles, protective dressings, pressure cushions, and "
"nutritional supplementation."),
]
for num, color, text in takeaways:
row = [[
Paragraph(num, S("Normal", fontSize=14, textColor=C_WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER)),
Paragraph(text, S("Normal", fontSize=10, textColor=C_NAVY,
fontName="Helvetica", leading=14))
]]
tk = Table(row, colWidths=["7%","93%"])
tk.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,-1), color),
("BACKGROUND", (1,0), (1,-1), HexColor("#f8fafb")),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("LINEBELOW", (0,0), (-1,-1), 0.5, HexColor("#d0e8f0")),
]))
story.append(tk)
story.append(spacer(0.4))
# References footer
story.append(divider(color=C_GREY, thickness=0.5))
story.append(Paragraph("References", h2))
refs = [
"Schwartz's Principles of Surgery, 11th Edition — Chapter 16: Wound Healing",
"Bailey and Love's Short Practice of Surgery, 28th Edition — Chapter 3: Wound Care",
"Swanson's Family Medicine Review — Pressure Ulcers section",
"Miller's Anesthesia, 10th Edition — Chapter on Perioperative Complications",
"Langer G et al. Nutritional interventions for preventing and treating pressure ulcers. "
"Cochrane Database Syst Rev. 2024 Feb 12. PMID 38345088",
"Chaboyer W et al. The effect of pressure injury prevention care bundles on pressure injuries "
"in hospital patients. Int J Nurs Stud. 2024 Jul. PMID 38642429",
"Damiao J, Gentry T. A systematic review of pressure relieving cushions. Assist Technol. 2024. PMID 34813723",
"Emami Zeydi A et al. Mask-related pressure injury prevention associated with non-invasive ventilation. "
"Int Wound J. 2024 Jun. PMID 38826030",
"National Pressure Injury Advisory Panel (NPIAP). Revised Pressure Injury Staging System, 2016.",
]
for r in refs:
story.append(Paragraph(f"• {r}", ref_style))
# ── Build PDF ──────────────────────────────────────────────────
doc.build(story)
print(f"PDF generated: {OUTPUT}")
cd /home/daytona/workspace/bed-sores-presentation && python generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/bed-sores-presentation/Bed_Sores_Pressure_Injurie…
Bed Sores Pressure Injuries
PDF Document · PDF
| Slide | Topic |
|---|---|
| Cover + TOC | Title page with all sections listed |
| 1 | Definition & Terminology — evolution from "decubitus ulcer" to NPIAP "pressure injury" |
| 2 | Epidemiology & Burden — prevalence tables, cost, mortality statistics |
| 3 | Pathophysiology — 4 causative factors + 9-step sequence of tissue destruction |
| 4 | Risk Factors — intrinsic (immobility, dementia, malnutrition) vs. extrinsic (devices, OR time) |
| 5 | NPIAP Staging System — all 6 categories with full clinical descriptions |
| 6 | Common Sites & Clinical Images — 2 real clinical photos (wrist Stage 2; sacral Stage 4) |
| 7 | Risk Assessment — Braden, Waterlow, and Norton scales with scoring details |
| 8 | Complications — sepsis, osteomyelitis, peritonitis, MRSA reservoirs |
| 9 | Prevention — 10-point protocol with repositioning angles, surface types, nutrition |
| 10 | Conservative Treatment — wound cleaning, debridement, VAC therapy, dressings |
| 11 | Surgical Management — indications, flap types, why primary closure is avoided |
| 12 | Antibiotics — mild/moderate/severe protocols with MRSA coverage |
| 13 | Recent Evidence — 4 systematic reviews and meta-analyses from 2024 (PubMed-cited) |
| 14 | Key Takeaways — 10 high-yield exam points |
Create a PPTX version for classroom presentation
node /home/daytona/skills/shared/scripts/fetch_images.js \ "https://cdn.orris.…
~/bed-sores-presentation/generate_pptx.js
const pptxgen = require("pptxgenjs");
const { execSync } = require("child_process");
// ── Fetch clinical images ──────────────────────────────────────
const imgUrls = [
"https://cdn.orris.care/cdss_images/7073d2c389d3a3edc81a425ee667ea513fc3b6e3ad3a70d7c47cf12ac6701c55.png",
"https://cdn.orris.care/cdss_images/406038327f5f11e45b2785654755c12448caab22a1c39caa74b52dd8ae103ba5.png",
];
const fetchedImgs = JSON.parse(
execSync(`node /home/daytona/skills/shared/scripts/fetch_images.js ${imgUrls.map(u => `"${u}"`).join(" ")}`).toString()
);
const IMG_CAST = fetchedImgs[0].base64; // pressure wound wrist
const IMG_SACRAL = fetchedImgs[1].base64; // sacral stage4
// ── Color palette ─────────────────────────────────────────────
const C = {
navy: "1a3a5c",
teal: "2a7d8e",
ltblue: "e8f4f8",
ltblue2: "d4eaf5",
amber: "d4860a",
red: "c0392b",
green: "1e8449",
grey: "5d6d7e",
white: "FFFFFF",
offwhite:"f7fbfd",
stage1: "fffde7",
stage2: "fff3e0",
stage3: "fbe9e7",
stage4: "ffcdd2",
dtpi: "e1bee7",
unstageable: "d7ccc8",
};
// ── pptxgen setup ─────────────────────────────────────────────
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Bed Sores / Pressure Injuries";
pres.author = "Medical Education";
pres.subject = "Pressure Injury — Medical Student Presentation";
// ── Helpers ───────────────────────────────────────────────────
const W = 10, H = 5.625;
function addSectionBadge(slide, text, color = C.teal) {
slide.addShape(pres.shapes.RECTANGLE, {
x: 0, y: 0, w: W, h: 0.45, fill: { color }, line: { color, width: 0 }
});
slide.addText(text, {
x: 0, y: 0, w: W, h: 0.45,
fontSize: 11, color: C.white, bold: true, align: "center", valign: "middle",
fontFace: "Calibri", margin: 0,
});
}
function addSlideTitle(slide, text) {
slide.addText(text, {
x: 0.35, y: 0.52, w: 9.3, h: 0.6,
fontSize: 24, color: C.navy, bold: true, fontFace: "Calibri",
margin: 0,
});
slide.addShape(pres.shapes.RECTANGLE, {
x: 0.35, y: 1.14, w: 9.3, h: 0.04,
fill: { color: C.teal }, line: { color: C.teal, width: 0 }
});
}
function addFooter(slide, pageNum) {
slide.addShape(pres.shapes.RECTANGLE, {
x: 0, y: 5.37, w: W, h: 0.255, fill: { color: C.navy }, line: { color: C.navy, width: 0 }
});
slide.addText("Bed Sores / Pressure Injuries | Medical Education", {
x: 0.2, y: 5.37, w: 7, h: 0.255,
fontSize: 8, color: "afd3de", fontFace: "Calibri", valign: "middle", margin: 0,
});
slide.addText(`${pageNum}`, {
x: 9.5, y: 5.37, w: 0.4, h: 0.255,
fontSize: 8, color: C.white, fontFace: "Calibri", align: "right", valign: "middle", margin: 0,
});
}
function infoBox(slide, x, y, w, h, text, bgColor = C.ltblue, accentColor = C.teal) {
slide.addShape(pres.shapes.RECTANGLE, { x, y, w: 0.06, h, fill: { color: accentColor }, line: { color: accentColor, width: 0 } });
slide.addShape(pres.shapes.RECTANGLE, { x: x + 0.06, y, w: w - 0.06, h, fill: { color: bgColor }, line: { color: bgColor, width: 0 } });
slide.addText(text, {
x: x + 0.16, y: y + 0.05, w: w - 0.26, h: h - 0.1,
fontSize: 10, color: C.navy, fontFace: "Calibri", valign: "top", wrap: true,
});
}
// ══════════════════════════════════════════════════════════════
// SLIDE 1 — Cover
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
// full dark background
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: W, h: H, fill: { color: C.navy }, line: { color: C.navy, width: 0 } });
// teal accent bar (left)
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 0.18, h: H, fill: { color: C.teal }, line: { color: C.teal, width: 0 } });
// subtle bottom accent
s.addShape(pres.shapes.RECTANGLE, { x: 0.18, y: 4.8, w: W - 0.18, h: 0.06, fill: { color: C.teal }, line: { color: C.teal, width: 0 } });
s.addText("BED SORES", {
x: 0.5, y: 1.0, w: 9.2, h: 1.1,
fontSize: 54, color: C.white, bold: true, fontFace: "Calibri", align: "center",
charSpacing: 8,
});
s.addText("Pressure Injuries / Pressure Ulcers", {
x: 0.5, y: 2.15, w: 9.2, h: 0.55,
fontSize: 22, color: "a8d8ea", fontFace: "Calibri", align: "center", italic: true,
});
s.addShape(pres.shapes.RECTANGLE, { x: 2.5, y: 2.75, w: 5, h: 0.04, fill: { color: C.teal }, line: { color: C.teal, width: 0 } });
s.addText("A Comprehensive Presentation for Medical Students", {
x: 0.5, y: 2.9, w: 9.2, h: 0.4,
fontSize: 14, color: "cce8f4", fontFace: "Calibri", align: "center",
});
s.addText("Sources: Schwartz's Principles of Surgery · Bailey & Love's Short Practice of Surgery\nSwanson's Family Medicine Review · Miller's Anesthesia", {
x: 0.5, y: 4.35, w: 9.2, h: 0.6,
fontSize: 9, color: "7fb3c8", fontFace: "Calibri", align: "center",
});
}
// ══════════════════════════════════════════════════════════════
// SLIDE 2 — Definition & Terminology
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: W, h: H, fill: { color: C.offwhite }, line: { color: C.offwhite, width: 0 } });
addSectionBadge(s, "SLIDE 1 — DEFINITION & TERMINOLOGY");
addSlideTitle(s, "Definition & Terminology");
addFooter(s, 2);
infoBox(s, 0.35, 1.25, 9.3, 0.75,
"A localized area of tissue necrosis that develops when soft tissue is compressed between a bony prominence and an external surface. Excessive pressure causes capillary collapse and impedes nutrient delivery to body tissues.",
"d4eaf5", C.teal
);
// Two-column table
const termRows = [
[{ text: "Historical Term", options: { bold: true, color: C.white } }, { text: "Current Preferred Term", options: { bold: true, color: C.white } }, { text: "Notes", options: { bold: true, color: C.white } }],
[{ text: "Decubitus ulcer" }, { text: "Pressure Injury (NPIAP)" }, { text: "Revised 2016 by NPIAP" }],
[{ text: "Bedsore" }, { text: "Pressure Injury" }, { text: "Covers intact & ulcerated skin" }],
[{ text: "Pressure sore" }, { text: "Pressure Injury" }, { text: "More accurate, inclusive" }],
];
s.addTable(termRows, {
x: 0.35, y: 2.1, w: 9.3, h: 1.1,
rowH: 0.27,
fontFace: "Calibri", fontSize: 10.5,
border: { type: "solid", color: "aed6f1", pt: 0.5 },
fill: { color: C.white },
color: C.navy,
align: "left",
colW: [3.1, 3.1, 3.1],
});
infoBox(s, 0.35, 3.32, 9.3, 0.8,
"⚠ Key Point: The NPIAP replaced 'pressure ulcer' with 'pressure injury' in 2016. The new term covers injuries to both intact skin and ulcerated tissue, which the old term did not capture accurately.",
"fff8e1", C.amber
);
// Speaker note
s.addNotes("Define pressure injury clearly. Emphasize the terminology shift — examiners often test this. NPIAP = National Pressure Injury Advisory Panel.");
}
// ══════════════════════════════════════════════════════════════
// SLIDE 3 — Epidemiology
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: W, h: H, fill: { color: C.offwhite }, line: { color: C.offwhite, width: 0 } });
addSectionBadge(s, "SLIDE 2 — EPIDEMIOLOGY & BURDEN");
addSlideTitle(s, "Epidemiology & Disease Burden");
addFooter(s, 3);
// Stat boxes (top row)
const stats = [
{ num: "3 Million", label: "People affected per year (US)", color: C.navy },
{ num: "$5+ Billion", label: "Annual economic cost (US)", color: C.red },
{ num: "22–49%", label: "Critically ill patients affected", color: C.amber },
{ num: "23–36%", label: "In-hospital mortality rate", color: C.teal },
];
stats.forEach((st, i) => {
const x = 0.35 + i * 2.35;
s.addShape(pres.shapes.RECTANGLE, { x, y: 1.25, w: 2.2, h: 1.0, fill: { color: st.color }, line: { color: st.color, width: 0 },
shadow: { type: "outer", color: "000000", blur: 5, offset: 2, angle: 135, opacity: 0.12 }
});
s.addText(st.num, { x, y: 1.28, w: 2.2, h: 0.52, fontSize: 19, color: C.white, bold: true, fontFace: "Calibri", align: "center", valign: "middle" });
s.addText(st.label, { x, y: 1.82, w: 2.2, h: 0.38, fontSize: 9, color: C.white, fontFace: "Calibri", align: "center", valign: "middle" });
});
// Prevalence table
const epRows = [
[{ text: "Care Setting", options: { bold: true, color: C.white } }, { text: "Prevalence", options: { bold: true, color: C.white } }],
[{ text: "Acute care hospitals" }, { text: "7–9%" }],
[{ text: "Long-term care facilities" }, { text: "11% (50% are Stage II)" }],
[{ text: "Critically ill (ICU)" }, { text: "22–49%" }],
[{ text: "Bed/chair-bound patients (≥1 week)" }, { text: "Up to 28% (Stage II+)" }],
[{ text: "OR / Intraoperative" }, { text: "~23% of all hospital PU occur here" }],
];
s.addTable(epRows, {
x: 0.35, y: 2.38, w: 9.3, h: 1.45,
rowH: 0.24,
fontFace: "Calibri", fontSize: 10,
border: { type: "solid", color: "aed6f1", pt: 0.5 },
fill: { color: C.white },
color: C.navy,
colW: [6.2, 3.1],
});
s.addNotes("Emphasize that PU are a quality-of-care marker. ~23% occur intraoperatively — relevant for surgical students.");
}
// ══════════════════════════════════════════════════════════════
// SLIDE 4 — Pathophysiology
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: W, h: H, fill: { color: C.offwhite }, line: { color: C.offwhite, width: 0 } });
addSectionBadge(s, "SLIDE 3 — PATHOPHYSIOLOGY");
addSlideTitle(s, "Pathophysiology");
addFooter(s, 4);
// 4 factor boxes (2x2)
const factors = [
{ title: "1. Pressure", body: "Capillary perfusion pressure ≈ 30 mmHg. Pressures >30 mmHg cause local ischemia. >2× capillary pressure → irreversible necrosis in 2 hours.", color: C.navy },
{ title: "2. Shearing Forces", body: "Parallel forces between tissue layers (e.g., patient sliding in bed). Stretches and tears blood vessels between skin and deeper tissue.", color: C.teal },
{ title: "3. Friction", body: "Surface rubbing damages the epidermis, especially during poor transfer technique. Reduces skin barrier integrity.", color: C.amber },
{ title: "4. Moisture", body: "Incontinence, sweat, or wound exudate macerates skin, reducing mechanical resistance and accelerating breakdown.", color: C.green },
];
factors.forEach((f, i) => {
const x = 0.35 + (i % 2) * 4.7;
const y = 1.28 + Math.floor(i / 2) * 1.55;
s.addShape(pres.shapes.RECTANGLE, { x, y, w: 4.5, h: 1.4, fill: { color: "f0f8ff" }, line: { color: f.color, width: 2 } });
s.addShape(pres.shapes.RECTANGLE, { x, y, w: 4.5, h: 0.32, fill: { color: f.color }, line: { color: f.color, width: 0 } });
s.addText(f.title, { x, y, w: 4.5, h: 0.32, fontSize: 11, color: C.white, bold: true, fontFace: "Calibri", align: "center", valign: "middle", margin: 0 });
s.addText(f.body, { x: x + 0.1, y: y + 0.36, w: 4.3, h: 0.98, fontSize: 10, color: C.navy, fontFace: "Calibri", valign: "top", wrap: true });
});
infoBox(s, 0.35, 4.35, 9.3, 0.6,
"Key: Muscle has higher metabolic demand than skin → muscle necrosis can occur beneath apparently intact skin. Never underestimate depth by surface appearance alone.",
"fff8e1", C.amber
);
s.addNotes("The 30 mmHg figure is high-yield. Emphasize that this is why repositioning every 2 hours matters. Shear and friction are often underappreciated.");
}
// ══════════════════════════════════════════════════════════════
// SLIDE 5 — Pathophysiologic Sequence
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: W, h: H, fill: { color: C.offwhite }, line: { color: C.offwhite, width: 0 } });
addSectionBadge(s, "SLIDE 3B — SEQUENCE OF TISSUE DESTRUCTION");
addSlideTitle(s, "Pathophysiologic Sequence");
addFooter(s, 5);
const steps = [
"Sustained pressure on tissues over bony prominence",
"Ischemia — occlusion of blood & lymphatic vessels",
"Endothelial cell swelling & vessel leakage",
"Plasma leakage into interstitial space",
"Increased cell-to-vessel distance; impaired nutrition",
"Hemorrhage",
"Non-blanchable erythema (earliest visible sign)",
"Accumulation of edema, inflammatory cells, toxic waste, bacteria",
"Death of muscle, subcutaneous tissue, and epidermis",
];
const cols = [steps.slice(0, 5), steps.slice(5)];
cols.forEach((col, ci) => {
col.forEach((step, si) => {
const stepNum = ci === 0 ? si + 1 : si + 6;
const x = 0.35 + ci * 4.8;
const y = 1.28 + si * 0.7;
s.addShape(pres.shapes.RECTANGLE, { x, y, w: 0.38, h: 0.52, fill: { color: C.teal }, line: { color: C.teal, width: 0 } });
s.addText(`${stepNum}`, { x, y, w: 0.38, h: 0.52, fontSize: 14, color: C.white, bold: true, fontFace: "Calibri", align: "center", valign: "middle", margin: 0 });
s.addShape(pres.shapes.RECTANGLE, { x: x + 0.38, y, w: 4.3, h: 0.52, fill: { color: si % 2 === 0 ? "eaf5fb" : C.white }, line: { color: "aed6f1", width: 0.5 } });
s.addText(step, { x: x + 0.48, y: y + 0.04, w: 4.1, h: 0.44, fontSize: 10, color: C.navy, fontFace: "Calibri", valign: "middle" });
});
});
}
// ══════════════════════════════════════════════════════════════
// SLIDE 6 — Risk Factors
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: W, h: H, fill: { color: C.offwhite }, line: { color: C.offwhite, width: 0 } });
addSectionBadge(s, "SLIDE 4 — RISK FACTORS");
addSlideTitle(s, "Risk Factors");
addFooter(s, 6);
// Two columns
const intrinsic = [
"Immobility / reduced activity",
"Spinal cord injury, stroke",
"Dementias (Alzheimer's, vascular)",
"Parkinson disease",
"Congestive cardiac failure",
"Incontinence (urinary / fecal)",
"Malnutrition, hypoalbuminemia",
"Altered mental status",
"Diabetes / peripheral vascular disease",
];
const extrinsic = [
"Prolonged surgical procedures",
"General anesthesia",
"Poorly padded casts / splints",
"Foley catheters & medical devices",
"Artificial airways / NIV masks",
"No pressure-relieving surfaces",
"Inadequate repositioning",
"Bed / wheelchair confinement",
];
// Headers
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 1.22, w: 4.5, h: 0.32, fill: { color: C.navy }, line: { color: C.navy, width: 0 } });
s.addText("Intrinsic (Patient) Factors", { x: 0.35, y: 1.22, w: 4.5, h: 0.32, fontSize: 11, color: C.white, bold: true, fontFace: "Calibri", align: "center", valign: "middle", margin: 0 });
s.addShape(pres.shapes.RECTANGLE, { x: 5.15, y: 1.22, w: 4.5, h: 0.32, fill: { color: C.teal }, line: { color: C.teal, width: 0 } });
s.addText("Extrinsic (Environmental) Factors", { x: 5.15, y: 1.22, w: 4.5, h: 0.32, fontSize: 11, color: C.white, bold: true, fontFace: "Calibri", align: "center", valign: "middle", margin: 0 });
intrinsic.forEach((item, i) => {
const y = 1.6 + i * 0.38;
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y, w: 4.5, h: 0.34, fill: { color: i % 2 === 0 ? "eaf5fb" : C.white }, line: { color: "aed6f1", width: 0.3 } });
s.addText(`• ${item}`, { x: 0.5, y: y + 0.03, w: 4.2, h: 0.28, fontSize: 10, color: C.navy, fontFace: "Calibri", valign: "middle" });
});
extrinsic.forEach((item, i) => {
const y = 1.6 + i * 0.38;
s.addShape(pres.shapes.RECTANGLE, { x: 5.15, y, w: 4.5, h: 0.34, fill: { color: i % 2 === 0 ? "e8f8e8" : C.white }, line: { color: "a9dfbf", width: 0.3 } });
s.addText(`• ${item}`, { x: 5.3, y: y + 0.03, w: 4.2, h: 0.28, fontSize: 10, color: C.navy, fontFace: "Calibri", valign: "middle" });
});
s.addNotes("High-yield exam: malnutrition + immobility is the classic combo. Surgical patients develop PU intraoperatively from prolonged positioning on hard OR tables.");
}
// ══════════════════════════════════════════════════════════════
// SLIDE 7 — NPIAP Staging
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: W, h: H, fill: { color: C.offwhite }, line: { color: C.offwhite, width: 0 } });
addSectionBadge(s, "SLIDE 5 — STAGING: NPIAP 2016 SYSTEM");
addSlideTitle(s, "Staging of Pressure Injuries (NPIAP 2016)");
addFooter(s, 7);
const stages = [
{ label: "Stage 1", desc: "Non-blanchable erythema of intact skin", detail: "Discoloration, warmth, edema or firmness. Darker skin may not show redness.", color: C.stage1, textcol: C.navy },
{ label: "Stage 2", desc: "Partial-thickness skin loss with exposed dermis", detail: "Shallow open ulcer or intact/ruptured blister. Pink/red moist wound bed.", color: C.stage2, textcol: C.navy },
{ label: "Stage 3", desc: "Full-thickness skin loss", detail: "Down to subcutaneous fat, NOT through fascia. May have undermining/tunneling.", color: C.stage3, textcol: C.navy },
{ label: "Stage 4", desc: "Full-thickness skin and tissue loss", detail: "Bone, tendon, muscle or joint capsule exposed. Osteomyelitis possible.", color: C.stage4, textcol: C.navy },
{ label: "Unstageable", desc: "Obscured full-thickness loss", detail: "Covered by eschar or slough. Cannot determine depth until debrided.", color: C.unstageable, textcol: C.navy },
{ label: "Deep Tissue\nInjury (DTI)", desc: "Persistent non-blanchable discoloration", detail: "Deep red/maroon/purple. May be intact skin. Can rapidly evolve to Stage 3/4.", color: C.dtpi, textcol: C.navy },
];
stages.forEach((st, i) => {
const col = i % 2;
const row = Math.floor(i / 2);
const x = 0.35 + col * 4.8;
const y = 1.28 + row * 1.35;
s.addShape(pres.shapes.RECTANGLE, { x, y, w: 4.5, h: 1.2, fill: { color: "f8f9fa" }, line: { color: "aed6f1", width: 1 } });
s.addShape(pres.shapes.RECTANGLE, { x, y, w: 1.0, h: 1.2, fill: { color: st.color }, line: { color: "aed6f1", width: 0 } });
s.addText(st.label, { x, y: y + 0.34, w: 1.0, h: 0.52, fontSize: 10, color: C.navy, bold: true, fontFace: "Calibri", align: "center", valign: "middle", wrap: true });
s.addText(st.desc, { x: x + 1.08, y: y + 0.04, w: 3.3, h: 0.36, fontSize: 10, color: C.navy, bold: true, fontFace: "Calibri", valign: "top", wrap: true });
s.addText(st.detail, { x: x + 1.08, y: y + 0.42, w: 3.3, h: 0.7, fontSize: 9, color: C.grey, fontFace: "Calibri", valign: "top", wrap: true });
});
s.addNotes("This staging table is the most tested topic in wound care. Stage 3 does NOT penetrate fascia; Stage 4 does. DTI is easily missed — key in dark-skinned patients.");
}
// ══════════════════════════════════════════════════════════════
// SLIDE 8 — Common Sites + Images
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: W, h: H, fill: { color: C.offwhite }, line: { color: C.offwhite, width: 0 } });
addSectionBadge(s, "SLIDE 6 — COMMON SITES & CLINICAL IMAGES");
addSlideTitle(s, "Common Sites & Clinical Presentation");
addFooter(s, 8);
// Sites list (left column)
const sites = ["Sacrum", "Ischium", "Greater Trochanter", "Heel", "Malleolus", "Occiput"];
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 1.22, w: 2.8, h: 0.32, fill: { color: C.navy }, line: { color: C.navy, width: 0 } });
s.addText("Common Sites", { x: 0.35, y: 1.22, w: 2.8, h: 0.32, fontSize: 11, color: C.white, bold: true, fontFace: "Calibri", align: "center", valign: "middle", margin: 0 });
sites.forEach((site, i) => {
const y = 1.6 + i * 0.44;
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y, w: 2.8, h: 0.38, fill: { color: i % 2 === 0 ? "eaf5fb" : C.white }, line: { color: "aed6f1", width: 0.3 } });
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: y + 0.14, w: 0.06, h: 0.1, fill: { color: C.teal }, line: { color: C.teal, width: 0 } });
s.addText(site, { x: 0.52, y: y + 0.04, w: 2.5, h: 0.3, fontSize: 11, color: C.navy, fontFace: "Calibri", valign: "middle" });
});
// Clinical images (right 2/3)
if (IMG_CAST && !IMG_CAST.error) {
s.addImage({ data: IMG_CAST, x: 3.4, y: 1.22, w: 2.9, h: 3.4 });
s.addText("Stage 2 — Pressure wound after\npoorly padded cast (wrist)\n(Schwartz's Surgery, 11e)", {
x: 3.4, y: 4.62, w: 2.9, h: 0.42, fontSize: 7.5, color: C.grey, fontFace: "Calibri", align: "center", italic: true,
});
}
if (IMG_SACRAL && !IMG_SACRAL.error) {
s.addImage({ data: IMG_SACRAL, x: 6.5, y: 1.22, w: 3.15, h: 3.4 });
s.addText("Stage 4 — Sacral decubitus ulcer,\ndeep tissue exposure\n(Schwartz's Surgery, 11e)", {
x: 6.5, y: 4.62, w: 3.15, h: 0.42, fontSize: 7.5, color: C.grey, fontFace: "Calibri", align: "center", italic: true,
});
}
s.addNotes("The sacrum is the most common site overall. Heels are prone in bed-bound patients. Occiput matters in neonates and ICU patients.");
}
// ══════════════════════════════════════════════════════════════
// SLIDE 9 — Braden Scale / Risk Assessment
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: W, h: H, fill: { color: C.offwhite }, line: { color: C.offwhite, width: 0 } });
addSectionBadge(s, "SLIDE 7 — RISK ASSESSMENT: BRADEN SCALE");
addSlideTitle(s, "Risk Assessment Tools");
addFooter(s, 9);
// Tools comparison table
const toolRows = [
[{ text: "Tool", options: { bold: true, color: C.white } }, { text: "Subscales", options: { bold: true, color: C.white } }, { text: "Range", options: { bold: true, color: C.white } }, { text: "At Risk", options: { bold: true, color: C.white } }],
[{ text: "Braden Scale" }, { text: "Sensory perception, moisture, activity, mobility, nutrition, friction/shear" }, { text: "6–23" }, { text: "≤18" }],
[{ text: "Waterlow Score" }, { text: "Build/weight, skin appearance, mobility, sex/age, appetite, special risks" }, { text: "0–64+" }, { text: "≥10" }],
[{ text: "Norton Scale" }, { text: "Physical condition, mental state, activity, mobility, incontinence" }, { text: "5–20" }, { text: "≤14" }],
];
s.addTable(toolRows, {
x: 0.35, y: 1.25, w: 9.3, h: 0.92,
rowH: 0.23,
fontFace: "Calibri", fontSize: 9.5,
border: { type: "solid", color: "aed6f1", pt: 0.5 },
fill: { color: C.white },
color: C.navy,
colW: [2.1, 4.8, 1.2, 1.2],
});
// Braden detail
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 2.28, w: 9.3, h: 0.3, fill: { color: C.teal }, line: { color: C.teal, width: 0 } });
s.addText("Braden Scale — Subscale Detail", { x: 0.35, y: 2.28, w: 9.3, h: 0.3, fontSize: 11, color: C.white, bold: true, fontFace: "Calibri", align: "center", valign: "middle", margin: 0 });
const bradenRows = [
[{ text: "Subscale", options: { bold: true, color: C.white } }, { text: "Score Range", options: { bold: true, color: C.white } }, { text: "Low Score Indicates", options: { bold: true, color: C.white } }],
[{ text: "Sensory Perception" }, { text: "1–4" }, { text: "Completely limited sensation" }],
[{ text: "Moisture" }, { text: "1–4" }, { text: "Constantly moist (incontinence/sweat)" }],
[{ text: "Activity" }, { text: "1–4" }, { text: "Bedfast — confined to bed" }],
[{ text: "Mobility" }, { text: "1–4" }, { text: "Completely immobile" }],
[{ text: "Nutrition" }, { text: "1–4" }, { text: "Very poor intake — never eats complete meal" }],
[{ text: "Friction & Shear" }, { text: "1–3" }, { text: "Problem — requires maximal assistance with moves" }],
[{ text: "TOTAL SCORE", options: { bold: true } }, { text: "6–23", options: { bold: true } }, { text: "≤18 = at risk | ≤12 = high risk | ≤9 = very high risk", options: { bold: true } }],
];
s.addTable(bradenRows, {
x: 0.35, y: 2.6, w: 9.3, h: 2.3,
rowH: 0.26,
fontFace: "Calibri", fontSize: 9.5,
border: { type: "solid", color: "aed6f1", pt: 0.5 },
fill: { color: C.white },
color: C.navy,
colW: [2.7, 1.5, 5.1],
});
s.addNotes("Braden ≤18 triggers a formal prevention bundle. In most hospitals this is a nursing-driven assessment done on admission and every shift.");
}
// ══════════════════════════════════════════════════════════════
// SLIDE 10 — Complications
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: W, h: H, fill: { color: C.offwhite }, line: { color: C.offwhite, width: 0 } });
addSectionBadge(s, "SLIDE 8 — COMPLICATIONS", C.red);
addSlideTitle(s, "Complications");
addFooter(s, 10);
infoBox(s, 0.35, 1.22, 9.3, 0.5,
"Most Serious: SEPSIS — can be rapidly fatal, especially in immunocompromised/malnourished patients. In-hospital mortality 23–36% when PU present.",
"fdecea", C.red
);
const comps = [
{ c: "Sepsis", d: "Most common cause of death. Infected PU disseminate rapidly. Treat aggressively.", icon: "⚠" },
{ c: "Cellulitis", d: "Local spreading skin/soft tissue infection; often requires systemic antibiotics.", icon: "🔴" },
{ c: "Osteomyelitis", d: "Bone infection from Stage 3–4 ulcers. Rule out with imaging if clinically suspected.", icon: "🦴" },
{ c: "Peritonitis", d: "Deeply undermined sacral/perineal ulcers can penetrate the abdominal cavity.", icon: "⚠" },
{ c: "Antibiotic resistance", d: "PU are nosocomial reservoirs for MRSA, Pseudomonas, and multi-drug-resistant organisms.", icon: "🧪" },
{ c: "Polymicrobial infection", d: "P. aeruginosa, Proteus spp., S. aureus (MRSA), Providencia spp., B. fragilis.", icon: "🦠" },
];
comps.forEach((comp, i) => {
const col = i % 2;
const row = Math.floor(i / 2);
const x = 0.35 + col * 4.8;
const y = 1.85 + row * 1.0;
s.addShape(pres.shapes.RECTANGLE, { x, y, w: 4.5, h: 0.88, fill: { color: i % 2 === 0 ? "fff5f5" : "fff9f9" }, line: { color: "f5b7b1", width: 1 } });
s.addShape(pres.shapes.RECTANGLE, { x, y, w: 2.2, h: 0.28, fill: { color: C.red }, line: { color: C.red, width: 0 } });
s.addText(comp.c, { x, y, w: 2.2, h: 0.28, fontSize: 10, color: C.white, bold: true, fontFace: "Calibri", align: "center", valign: "middle", margin: 0 });
s.addText(comp.d, { x: x + 0.08, y: y + 0.32, w: 4.3, h: 0.5, fontSize: 9.5, color: C.navy, fontFace: "Calibri", valign: "top", wrap: true });
});
s.addNotes("Sepsis is the #1 killer. Osteomyelitis is common in Stage 4 — always probe to bone depth to assess. MRSA is a major concern in nursing home patients.");
}
// ══════════════════════════════════════════════════════════════
// SLIDE 11 — Prevention
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: W, h: H, fill: { color: C.offwhite }, line: { color: C.offwhite, width: 0 } });
addSectionBadge(s, "SLIDE 9 — PREVENTION", C.green);
addSlideTitle(s, "Prevention of Pressure Injuries");
addFooter(s, 11);
infoBox(s, 0.35, 1.22, 9.3, 0.44,
"Core Principle: Pressure injuries are largely PREVENTABLE. Educational programs + multidisciplinary team approach significantly reduce incidence.",
"e8f8e8", C.green
);
const prevItems = [
{ title: "Risk Assessment", detail: "Braden/Waterlow/Norton score ALL patients on admission. Reassess regularly." },
{ title: "Repositioning", detail: "Every 2 hours (high risk). 2–4 hrs (lower risk). Use 30° lateral tilt, not 90°." },
{ title: "Pressure Surfaces", detail: "Static/alternating air, gel, water mattresses. Foam pads are INSUFFICIENT." },
{ title: "Prophylactic Dressings", detail: "Silicone foam dressings on sacrum/heels for at-risk patients." },
{ title: "Skin Care", detail: "Regular inspection over bony prominences. Keep skin clean and dry." },
{ title: "Nutrition", detail: "Protein, Vit C (84% ulcer reduction), zinc, calories. Treat hypoalbuminemia." },
{ title: "Transfer Technique", detail: "Lift — never drag. Lifting devices minimize friction and shear." },
{ title: "Device Checks", detail: "Inspect skin under catheters, ETT, NIV masks, casts regularly." },
];
prevItems.forEach((item, i) => {
const col = i % 2;
const row = Math.floor(i / 2);
const x = 0.35 + col * 4.8;
const y = 1.8 + row * 0.82;
s.addShape(pres.shapes.RECTANGLE, { x, y, w: 1.25, h: 0.68, fill: { color: C.green }, line: { color: C.green, width: 0 } });
s.addText(item.title, { x, y, w: 1.25, h: 0.68, fontSize: 9, color: C.white, bold: true, fontFace: "Calibri", align: "center", valign: "middle", wrap: true, margin: 2 });
s.addShape(pres.shapes.RECTANGLE, { x: x + 1.25, y, w: 3.25, h: 0.68, fill: { color: i % 2 === 0 ? "eaf8ee" : C.white }, line: { color: "a9dfbf", width: 0.5 } });
s.addText(item.detail, { x: x + 1.35, y: y + 0.06, w: 3.05, h: 0.56, fontSize: 9.5, color: C.navy, fontFace: "Calibri", valign: "middle", wrap: true });
});
s.addNotes("Prevention is the highest-yield topic for clinical exams. Care bundles combining all these steps show the strongest evidence (Chaboyer 2024 meta-analysis).");
}
// ══════════════════════════════════════════════════════════════
// SLIDE 12 — Conservative Treatment
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: W, h: H, fill: { color: C.offwhite }, line: { color: C.offwhite, width: 0 } });
addSectionBadge(s, "SLIDE 10 — CONSERVATIVE TREATMENT");
addSlideTitle(s, "Conservative Management");
addFooter(s, 12);
const treatRows = [
[{ text: "Category", options: { bold: true, color: C.white } }, { text: "Approach", options: { bold: true, color: C.white } }],
[{ text: "Pressure Relief" }, { text: "Offload immediately. Pressure-redistributing beds, reposition q2h, early mobilization." }],
[{ text: "Wound Cleaning" }, { text: "Normal saline — agent of choice. AVOID: povidone-iodine, hypochlorite, hydrogen peroxide, acetic acid (cytotoxic)." }],
[{ text: "Debridement" }, { text: "Surgical = most efficient. Wet-to-dry gauze (normal saline). Enzymatic agents until wound bed clean. Hydrophilic polymers for moist/exudative lesions." }],
[{ text: "Dressings" }, { text: "Stage II: occlusive or hydrocolloid (improves healing). Stage III/IV: moist saline gauze. Maintain moist environment once clean." }],
[{ text: "VAC Therapy" }, { text: "Removes interstitial fluid, promotes granulation, reduces bacterial colonization, decreases wound size." }],
[{ text: "Nutrition" }, { text: "Protein optimization. Vitamin C: 84% reduction in ulcer surface area. Treat hypoalbuminemia." }],
[{ text: "Host Optimization" }, { text: "Treat comorbidities (DM, CCF, PVD). Manage incontinence. Pain control." }],
];
s.addTable(treatRows, {
x: 0.35, y: 1.25, w: 9.3, h: 4.0,
rowH: [0.3, 0.44, 0.44, 0.56, 0.56, 0.44, 0.44, 0.44],
fontFace: "Calibri", fontSize: 9.5,
border: { type: "solid", color: "aed6f1", pt: 0.5 },
fill: { color: C.white },
color: C.navy,
colW: [2.0, 7.3],
});
s.addNotes("The key thing to hammer home: NEVER use povidone-iodine or H2O2 on healing wounds — they are cytotoxic to granulation tissue. Normal saline only.");
}
// ══════════════════════════════════════════════════════════════
// SLIDE 13 — Surgical Treatment
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: W, h: H, fill: { color: C.offwhite }, line: { color: C.offwhite, width: 0 } });
addSectionBadge(s, "SLIDE 11 — SURGICAL MANAGEMENT");
addSlideTitle(s, "Surgical Management");
addFooter(s, 13);
infoBox(s, 0.35, 1.22, 9.3, 0.44,
"Surgery is NOT first-line. Stage 3/4 alone is not an automatic indication. Fever in PU patients usually has a urinary or pulmonary source, not the ulcer itself.",
"fef9e7", C.amber
);
s.addText("Goals of Surgical Intervention", { x: 0.35, y: 1.75, w: 4.45, h: 0.3, fontSize: 11, color: C.navy, bold: true, fontFace: "Calibri" });
const goals = [
"Drainage of fluid collections",
"Wide debridement of devitalized/scarred tissue",
"Excision of pseudobursa",
"Osteotomy of involved bone prominences",
"Hemostasis",
"Tension-free closure with vascularized tissue",
];
s.addText(goals.map(g => ({ text: g, options: { bullet: true, breakLine: true } })).concat([{ text: "" }]), {
x: 0.35, y: 2.1, w: 4.45, h: 2.0,
fontSize: 10, color: C.navy, fontFace: "Calibri",
});
s.addText("Flap Options", { x: 5.15, y: 1.75, w: 4.5, h: 0.3, fontSize: 11, color: C.navy, bold: true, fontFace: "Calibri" });
const flapRows = [
[{ text: "Flap Type", options: { bold: true, color: C.white } }, { text: "Use / Notes", options: { bold: true, color: C.white } }],
[{ text: "Musculocutaneous" }, { text: "Preferred for Stage 3–4. Provides bulk vascularized tissue." }],
[{ text: "Fasciocutaneous" }, { text: "Alternative when muscle not required." }],
[{ text: "Primary closure" }, { text: "AVOID — high recurrence from tension." }],
[{ text: "Skin graft alone" }, { text: "AVOID for deep ulcers — insufficient for dead space." }],
];
s.addTable(flapRows, {
x: 5.15, y: 2.1, w: 4.5, h: 1.6,
rowH: [0.28, 0.34, 0.34, 0.34, 0.34],
fontFace: "Calibri", fontSize: 9.5,
border: { type: "solid", color: "aed6f1", pt: 0.5 },
fill: { color: C.white },
color: C.navy,
colW: [1.8, 2.7],
});
infoBox(s, 0.35, 4.18, 9.3, 0.55,
"⚠ Recurrence rates after surgical repair are extremely high. Patient must be well-motivated and fully compliant with postoperative prevention measures.",
"fdecea", C.red
);
s.addNotes("Key point: Musculocutaneous flaps are preferred — muscle provides vascularity and fills dead space. Warn students about the high recurrence rate.");
}
// ══════════════════════════════════════════════════════════════
// SLIDE 14 — Antibiotics
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: W, h: H, fill: { color: C.offwhite }, line: { color: C.offwhite, width: 0 } });
addSectionBadge(s, "SLIDE 12 — ANTIBIOTICS IN INFECTED PRESSURE ULCERS", C.red);
addSlideTitle(s, "Antibiotic Management");
addFooter(s, 14);
infoBox(s, 0.35, 1.22, 9.3, 0.44,
"Microbiology: Infections are POLYMICROBIAL. Key organisms: Pseudomonas aeruginosa, Proteus spp., S. aureus / MRSA, Providencia spp., Bacteroides fragilis.",
"f5eef8", C.navy
);
const abxRows = [
[
{ text: "Severity", options: { bold: true, color: C.white } },
{ text: "Duration", options: { bold: true, color: C.white } },
{ text: "Antibiotic Options", options: { bold: true, color: C.white } },
],
[
{ text: "Mild\n(cellulitis/superficial)" },
{ text: "2 weeks" },
{ text: "Cephalexin OR clindamycin OR amoxicillin/clavulanate\nMRSA: linezolid" },
],
[
{ text: "Moderate\n(deep soft tissue)" },
{ text: "2–4 weeks" },
{ text: "Clindamycin + ciprofloxacin OR ciprofloxacin + ceftriaxone IV\nMRSA: vancomycin IV or linezolid IV" },
],
[
{ text: "Severe\n(bone involvement / sepsis)" },
{ text: "2–12 weeks\n(osteomyelitis)" },
{ text: "Clindamycin + ceftriaxone IV OR pip/tazo IV\nClindamycin + gentamicin IV (monitor renal function!)\nImipenem or meropenem IV\nMRSA: vancomycin IV or linezolid IV" },
],
];
s.addTable(abxRows, {
x: 0.35, y: 1.78, w: 9.3, h: 3.1,
rowH: [0.3, 0.65, 0.65, 0.9],
fontFace: "Calibri", fontSize: 9.5,
border: { type: "solid", color: "f5b7b1", pt: 0.5 },
fill: { color: C.white },
color: C.navy,
colW: [2.1, 1.5, 5.7],
});
s.addNotes("Gentamicin is renally toxic — always monitor. Rule out osteomyelitis in all Stage 3–4; if confirmed, treat for the full bone-infection duration (up to 12 weeks IV).");
}
// ══════════════════════════════════════════════════════════════
// SLIDE 15 — Recent Evidence
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: W, h: H, fill: { color: C.offwhite }, line: { color: C.offwhite, width: 0 } });
addSectionBadge(s, "SLIDE 13 — RECENT EVIDENCE (2023–2026)");
addSlideTitle(s, "Recent Evidence — Systematic Reviews & Meta-Analyses");
addFooter(s, 15);
const evItems = [
{
topic: "Care Bundles Reduce PU Incidence",
ref: "Chaboyer et al., Int J Nurs Stud 2024 (PMID 38642429) — Systematic Review & Meta-analysis",
finding: "Multi-component prevention care bundles (risk assessment + repositioning + skin care + device management) significantly reduce in-hospital PU incidence vs. standard care.",
color: C.teal,
},
{
topic: "Nutritional Supplementation",
ref: "Langer et al., Cochrane Database Syst Rev 2024 (PMID 38345088) — Meta-analysis",
finding: "Protein, vitamin C and zinc supplements may improve healing. Evidence quality: moderate. Routine supplementation for prevention remains uncertain but nutritional optimization is still recommended.",
color: C.green,
},
{
topic: "Pressure-Relieving Cushions",
ref: "Damiao & Gentry, Assist Technol 2024 (PMID 34813723) — Systematic Review",
finding: "Specialized pressure-redistributing seat cushions reduce PU incidence in wheelchair-dependent patients. All at-risk wheelchair users should receive appropriate cushion prescription.",
color: C.navy,
},
{
topic: "NIV Mask-Related Pressure Injuries",
ref: "Emami Zeydi et al., Int Wound J 2024 (PMID 38826030) — Systematic Review",
finding: "NIV masks are an increasingly recognized PU cause. Protective dressings, mask rotation, and regular skin checks are effective preventive strategies.",
color: C.amber,
},
];
evItems.forEach((ev, i) => {
const y = 1.22 + i * 1.0;
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y, w: 0.18, h: 0.82, fill: { color: ev.color }, line: { color: ev.color, width: 0 } });
s.addShape(pres.shapes.RECTANGLE, { x: 0.53, y, w: 9.12, h: 0.82, fill: { color: i % 2 === 0 ? "f0f8ff" : "f8f9fa" }, line: { color: "aed6f1", width: 0.5 } });
s.addText(ev.topic, { x: 0.65, y: y + 0.04, w: 8.9, h: 0.24, fontSize: 11, color: ev.color, bold: true, fontFace: "Calibri" });
s.addText(ev.ref, { x: 0.65, y: y + 0.26, w: 8.9, h: 0.16, fontSize: 7.5, color: C.grey, fontFace: "Calibri", italic: true });
s.addText(ev.finding, { x: 0.65, y: y + 0.42, w: 8.9, h: 0.36, fontSize: 9.5, color: C.navy, fontFace: "Calibri", wrap: true });
});
s.addNotes("These are all 2024 publications. The care bundle meta-analysis (Chaboyer) is the most impactful — it validates bundled prevention protocols at the hospital level.");
}
// ══════════════════════════════════════════════════════════════
// SLIDE 16 — Key Takeaways
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: W, h: H, fill: { color: C.navy }, line: { color: C.navy, width: 0 } });
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 0.18, h: H, fill: { color: C.teal }, line: { color: C.teal, width: 0 } });
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: H - 0.06, w: W, h: 0.06, fill: { color: C.teal }, line: { color: C.teal, width: 0 } });
s.addText("Key Takeaways", { x: 0.4, y: 0.08, w: 9.3, h: 0.52, fontSize: 26, color: C.white, bold: true, fontFace: "Calibri", charSpacing: 2 });
s.addShape(pres.shapes.RECTANGLE, { x: 0.4, y: 0.62, w: 9.3, h: 0.04, fill: { color: C.teal }, line: { color: C.teal, width: 0 } });
const takeaways = [
{ num: "1", text: "Largely PREVENTABLE — a quality-of-care marker. Risk-assess all patients.", color: C.teal },
{ num: "2", text: "4 factors: Pressure, Shear, Friction, Moisture. Capillary BP ≈ 30 mmHg.", color: C.amber },
{ num: "3", text: "NPIAP: 4 Stages + Unstageable + Deep Tissue Injury. Know each stage cold.", color: "3498db" },
{ num: "4", text: "Muscle necrose beneath intact skin — never underestimate depth.", color: C.red },
{ num: "5", text: "Prevention: Braden score + q2h reposition + pressure surfaces + nutrition + silicone dressings.", color: C.green },
{ num: "6", text: "Wound cleaning: Normal saline ONLY. NO povidone-iodine, H₂O₂, hypochlorite.", color: C.amber },
{ num: "7", text: "Sepsis is the #1 killer. Infections are polymicrobial — include MRSA coverage.", color: C.red },
{ num: "8", text: "Surgery = flaps (musculocutaneous preferred). High recurrence rate. Not first-line.", color: "3498db" },
{ num: "9", text: "Care bundles reduce incidence. 2024 evidence supports bundled prevention protocols.", color: C.green },
{ num: "10", text: "Vitamin C supplementation → 84% reduction in ulcer surface area in treated patients.", color: C.teal },
];
const col1 = takeaways.slice(0, 5);
const col2 = takeaways.slice(5);
[col1, col2].forEach((col, ci) => {
col.forEach((tk, i) => {
const x = 0.4 + ci * 4.85;
const y = 0.76 + i * 0.88;
s.addShape(pres.shapes.RECTANGLE, { x, y, w: 0.38, h: 0.62, fill: { color: tk.color }, line: { color: tk.color, width: 0 } });
s.addText(tk.num, { x, y, w: 0.38, h: 0.62, fontSize: 15, color: C.white, bold: true, fontFace: "Calibri", align: "center", valign: "middle", margin: 0 });
s.addShape(pres.shapes.RECTANGLE, { x: x + 0.38, y, w: 4.2, h: 0.62, fill: { color: "1e3a5c" }, line: { color: "2a5278", width: 0.5 } });
s.addText(tk.text, { x: x + 0.48, y: y + 0.04, w: 4.0, h: 0.54, fontSize: 9.5, color: "cce8f4", fontFace: "Calibri", valign: "middle", wrap: true });
});
});
s.addNotes("Summary slide — use this to close the session. Ask students which staging corresponds to bone involvement (Stage 4) and what to avoid in wound cleaning (H2O2, Betadine).");
}
// ══════════════════════════════════════════════════════════════
// SLIDE 17 — References
// ══════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: W, h: H, fill: { color: C.offwhite }, line: { color: C.offwhite, width: 0 } });
addSectionBadge(s, "REFERENCES");
addSlideTitle(s, "References & Sources");
addFooter(s, 17);
s.addShape(pres.shapes.RECTANGLE, { x: 0.35, y: 1.18, w: 9.3, h: 0.04, fill: { color: C.teal }, line: { color: C.teal, width: 0 } });
const refs = [
"1. Schwartz's Principles of Surgery, 11th Edition — Chapter 16: Wound Healing & Pressure Injury",
"2. Bailey and Love's Short Practice of Surgery, 28th Edition — Chapter 3: Wound Care",
"3. Swanson's Family Medicine Review — Pressure Ulcers (Chapter 6)",
"4. Miller's Anesthesia, 10th Edition — Perioperative Complications: Pressure Injuries",
"5. Langer G et al. Nutritional interventions for preventing and treating pressure ulcers. Cochrane Database Syst Rev. 2024 Feb 12. PMID: 38345088",
"6. Chaboyer W et al. The effect of pressure injury prevention care bundles on pressure injuries in hospital patients: A complex intervention systematic review and meta-analysis. Int J Nurs Stud. 2024 Jul. PMID: 38642429",
"7. Damiao J, Gentry T. A systematic review of the effectiveness of pressure relieving cushions in reducing pressure injury. Assist Technol. 2024 Sep. PMID: 34813723",
"8. Emami Zeydi A et al. Mask-related pressure injury prevention associated with non-invasive ventilation: A systematic review. Int Wound J. 2024 Jun. PMID: 38826030",
"9. National Pressure Injury Advisory Panel (NPIAP). Revised Pressure Injury Staging System. J Wound Ostomy Continence Nurs. 2016;43(6):585–597.",
];
s.addText(refs.map((r, i) => ({
text: r,
options: { breakLine: i < refs.length - 1 },
})), {
x: 0.35, y: 1.3, w: 9.3, h: 4.0,
fontSize: 9.5, color: C.navy, fontFace: "Calibri", valign: "top", lineSpacingMultiple: 1.3,
});
}
// ── Write file ────────────────────────────────────────────────
const OUT = "/home/daytona/workspace/bed-sores-presentation/Bed_Sores_Pressure_Injuries.pptx";
pres.writeFile({ fileName: OUT }).then(() => console.log(`✅ PPTX saved: ${OUT}`));
cd /home/daytona/workspace/bed-sores-presentation && node generate_pptx.js 2>&1
cd /home/daytona/workspace/bed-sores-presentation && \ node -e " const {execSync…
~/bed-sores-presentation/generate_pptx.js
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/bed-sores-presentation/generate_pptx.js'
~/bed-sores-presentation/generate_pptx.js
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/bed-sores-presentation/generate_pptx.js'
cd /home/daytona/workspace/bed-sores-presentation && node generate_pptx.js 2>&1
ls -lh /home/daytona/workspace/bed-sores-presentation/Bed_Sores_Pressure_Injurie…
Bed Sores Pressure Injuries
Presentation · PPTX
| Slide | Content | Design Feature |
|---|---|---|
| 1 | Cover | Full dark navy background, large bold title, teal accent bar |
| 2 | Definition & Terminology | Info box + color-coded table showing NPIAP name change |
| 3 | Epidemiology | 4 stat boxes (3M people, $5B, 22-49% ICU, 23-36% mortality) + prevalence table |
| 4 | Pathophysiology — 4 Factors | 2×2 color-coded boxes (pressure/shear/friction/moisture) |
| 5 | Pathophysiologic Sequence | 9-step numbered flow with alternating row colors |
| 6 | Risk Factors | Two-column layout — intrinsic vs. extrinsic factors |
| 7 | NPIAP Staging | 6-cell grid, each stage color-coded (yellow → red → purple → brown) |
| 8 | Common Sites + Clinical Images | Site list + 2 actual textbook photos (Stage 2 wrist, Stage 4 sacral) |
| 9 | Braden Scale | Risk tools comparison + full Braden subscale breakdown |
| 10 | Complications | Card grid with red accents; sepsis highlighted as most serious |
| 11 | Prevention | 8 green-labeled strategy cards |
| 12 | Conservative Treatment | Full 8-row table with wound cleaning rules highlighted |
| 13 | Surgical Management | Goals list + flap options table; recurrence warning in red |
| 14 | Antibiotics | Severity-stratified table (mild/moderate/severe + MRSA) |
| 15 | Recent Evidence | 4 x 2024 systematic reviews with PubMed IDs |
| 16 | Key Takeaways | Dark navy closer slide with 10 numbered points |
| 17 | References | All 9 sources including 4 recent PubMed citations |