I want to make a presentation ppt on topic mentioned below. Take reference from baile & pove and SRB book of surgery. Add diagrams, illustrations wherever necessary. Make ppt. Topic : Introduction to blood and blood products, indications and appropriate use, blood transfusion and precautions and complications of blood transfusion, prevention and management
mkdir -p /tmp/workspace/blood-transfusion-ppt && ls /tmp/workspace/blood-transfusion-ppt/
~/blood-transfusion-ppt/create_ppt.py
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.util import Inches, Pt
import subprocess, json, base64
from io import BytesIO
# ─── Colour palette ───────────────────────────────────────────────────────────
DARK_RED = RGBColor(0xB0, 0x1C, 0x1C) # header bars / title
MED_RED = RGBColor(0xCC, 0x3A, 0x3A)
LIGHT_RED = RGBColor(0xF9, 0xD0, 0xD0) # slide background tint
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK_GRAY = RGBColor(0x23, 0x23, 0x23)
MID_GRAY = RGBColor(0x55, 0x55, 0x55)
LIGHT_GRAY = RGBColor(0xF2, 0xF2, 0xF2)
GOLD = RGBColor(0xF5, 0xA6, 0x23)
TEAL = RGBColor(0x1A, 0x7A, 0x8A)
LIGHT_TEAL = RGBColor(0xD4, 0xF0, 0xF4)
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
blank = prs.slide_layouts[6] # fully blank
# ─── Helper utilities ─────────────────────────────────────────────────────────
def add_rect(slide, x, y, w, h, fill_color=None, border_color=None, border_pt=0):
shape = slide.shapes.add_shape(1, Inches(x), Inches(y), Inches(w), Inches(h))
shape.line.width = Pt(border_pt)
if fill_color:
shape.fill.solid()
shape.fill.fore_color.rgb = fill_color
else:
shape.fill.background()
if border_color and border_pt > 0:
shape.line.color.rgb = border_color
else:
shape.line.fill.background()
return shape
def add_text(slide, text, x, y, w, h,
font_size=18, bold=False, color=DARK_GRAY, align=PP_ALIGN.LEFT,
italic=False, wrap=True, v_anchor=MSO_ANCHOR.TOP):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = wrap
tf.vertical_anchor = v_anchor
tf.margin_left = Pt(4)
tf.margin_right = Pt(4)
tf.margin_top = Pt(2)
tf.margin_bottom = Pt(2)
p = tf.paragraphs[0]
p.alignment = align
run = p.add_run()
run.text = text
run.font.size = Pt(font_size)
run.font.bold = bold
run.font.italic = italic
run.font.color.rgb = color
run.font.name = "Calibri"
return tf
def add_multi_para(slide, bullets, x, y, w, h,
font_size=15, color=DARK_GRAY, bullet_char="●",
bold_first=False):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = Pt(4)
tf.margin_right = Pt(4)
tf.margin_top = Pt(2)
tf.margin_bottom = Pt(2)
first = True
for i, b in enumerate(bullets):
if i == 0:
p = tf.paragraphs[0]
else:
p = tf.add_paragraph()
p.space_before = Pt(3)
if isinstance(b, tuple):
label, rest = b
run = p.add_run()
run.text = f"{bullet_char} {label}"
run.font.bold = True
run.font.size = Pt(font_size)
run.font.color.rgb = DARK_RED
run.font.name = "Calibri"
run2 = p.add_run()
run2.text = f" {rest}"
run2.font.bold = False
run2.font.size = Pt(font_size)
run2.font.color.rgb = color
run2.font.name = "Calibri"
else:
run = p.add_run()
run.text = f"{bullet_char} {b}"
run.font.bold = bold_first and first
run.font.size = Pt(font_size)
run.font.color.rgb = color
run.font.name = "Calibri"
first = False
return tf
def section_header(slide, title, subtitle=""):
"""Full-width red header bar at top."""
add_rect(slide, 0, 0, 13.333, 1.1, fill_color=DARK_RED)
add_text(slide, title, 0.3, 0.05, 12.7, 0.9,
font_size=34, bold=True, color=WHITE, align=PP_ALIGN.LEFT,
v_anchor=MSO_ANCHOR.MIDDLE)
if subtitle:
add_rect(slide, 0, 1.1, 13.333, 0.35, fill_color=MED_RED)
add_text(slide, subtitle, 0.3, 1.1, 12.7, 0.35,
font_size=14, bold=False, color=WHITE, align=PP_ALIGN.LEFT,
v_anchor=MSO_ANCHOR.MIDDLE)
def content_header(slide, title):
add_rect(slide, 0, 0, 13.333, 0.75, fill_color=DARK_RED)
add_text(slide, title, 0.3, 0, 12.7, 0.75,
font_size=26, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
# thin gold underline
add_rect(slide, 0, 0.75, 13.333, 0.06, fill_color=GOLD)
def footer(slide, text="Bailey & Love's Surgery, 28th Ed | Pye's Surgical Handicraft, 22nd Ed"):
add_rect(slide, 0, 7.25, 13.333, 0.25, fill_color=DARK_RED)
add_text(slide, text, 0.3, 7.25, 12.7, 0.25,
font_size=9, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
def light_bg(slide):
add_rect(slide, 0, 0, 13.333, 7.5, fill_color=LIGHT_GRAY)
def add_info_box(slide, title, bullets, x, y, w, h,
header_color=TEAL, body_color=LIGHT_TEAL):
add_rect(slide, x, y, w, 0.45, fill_color=header_color)
add_text(slide, title, x+0.1, y, w-0.15, 0.45,
font_size=14, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, x, y+0.45, w, h-0.45, fill_color=body_color,
border_color=header_color, border_pt=1)
add_multi_para(slide, bullets, x+0.1, y+0.5, w-0.2, h-0.6,
font_size=13, color=DARK_GRAY)
def draw_table(slide, headers, rows, x, y, col_widths, row_height=0.42):
col_x = x
for i, h in enumerate(headers):
add_rect(slide, col_x, y, col_widths[i], row_height, fill_color=DARK_RED,
border_color=WHITE, border_pt=0.5)
add_text(slide, h, col_x+0.05, y+0.03, col_widths[i]-0.1, row_height-0.06,
font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
v_anchor=MSO_ANCHOR.MIDDLE)
col_x += col_widths[i]
for ri, row in enumerate(rows):
row_y = y + row_height*(ri+1)
fill = LIGHT_GRAY if ri % 2 == 0 else WHITE
col_x = x
for ci, cell in enumerate(row):
add_rect(slide, col_x, row_y, col_widths[ci], row_height,
fill_color=fill, border_color=MID_GRAY, border_pt=0.3)
add_text(slide, cell, col_x+0.05, row_y+0.03,
col_widths[ci]-0.1, row_height-0.06,
font_size=12, color=DARK_GRAY,
align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE)
col_x += col_widths[ci]
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 1 ─ Title slide
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
# Deep red full background
add_rect(slide, 0, 0, 13.333, 7.5, fill_color=DARK_RED)
# Decorative white band
add_rect(slide, 0, 5.6, 13.333, 0.08, fill_color=WHITE)
add_rect(slide, 0, 5.72, 13.333, 0.08, fill_color=GOLD)
# Blood drop SVG-like circle decoration (red circle with lighter fill)
add_rect(slide, 10.8, 0.8, 1.8, 2.8, fill_color=MED_RED)
add_text(slide, "BLOOD & BLOOD PRODUCTS", 0.6, 0.9, 10.0, 1.2,
font_size=42, bold=True, color=WHITE, align=PP_ALIGN.LEFT)
add_text(slide, "Transfusion Medicine in Surgical Practice",
0.6, 2.15, 10.0, 0.7, font_size=24, bold=False, color=GOLD,
align=PP_ALIGN.LEFT)
add_rect(slide, 0.6, 3.0, 8.5, 0.05, fill_color=WHITE)
topics = [
"Introduction to Blood & Blood Products",
"Indications & Appropriate Use",
"Blood Transfusion Procedure & Precautions",
"Complications of Blood Transfusion",
"Prevention & Management of Complications"
]
for i, t in enumerate(topics):
add_text(slide, f" {i+1}. {t}", 0.6, 3.2 + i*0.45, 9.5, 0.45,
font_size=15, color=WHITE)
add_text(slide, "Reference: Bailey & Love's Short Practice of Surgery, 28th Ed\n"
" Pye's Surgical Handicraft, 22nd Ed",
0.6, 5.85, 10.0, 0.9, font_size=12, color=LIGHT_RED, italic=True)
footer(slide, "Blood Transfusion in Surgery | Bailey & Love 28e | Pye's Surgical Handicraft 22e")
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 2 ─ History of Blood Transfusion
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
light_bg(slide)
content_header(slide, "History of Blood Transfusion")
history_data = [
("1492", "Pope Innocent VIII – first recorded transfusion (sheep blood); fatal"),
("1665", "Richard Lower – first successful canine-to-canine transfusion (Oxford)"),
("1667", "Jean-Baptiste Denis – successful sheep-to-human transfusion"),
("1818", "James Blundell – first successful human-to-human transfusion (postpartum haemorrhage)"),
("1901", "Karl Landsteiner – discovery of the ABO blood group system"),
("1914", "Albert Hustin – first non-direct transfusion using sodium citrate anticoagulant"),
("1926", "British Red Cross – instituted the world's first Blood Transfusion Service"),
("1939", "Rhesus system identified – recognized as major cause of transfusion reactions"),
]
# Timeline strip
add_rect(slide, 0.5, 1.0, 0.12, 6.0, fill_color=DARK_RED)
for i, (yr, desc) in enumerate(history_data):
yy = 1.05 + i * 0.72
# dot
add_rect(slide, 0.38, yy + 0.08, 0.35, 0.35, fill_color=GOLD,
border_color=DARK_RED, border_pt=1)
add_text(slide, yr, 0.38, yy+0.02, 0.35, 0.4,
font_size=11, bold=True, color=DARK_RED, align=PP_ALIGN.CENTER,
v_anchor=MSO_ANCHOR.MIDDLE)
add_text(slide, desc, 0.88, yy, 11.8, 0.65,
font_size=14, color=DARK_GRAY, wrap=True)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 3 ─ Blood Collection & Screening
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
light_bg(slide)
content_header(slide, "Blood Collection & Screening")
add_rect(slide, 0.3, 0.9, 12.7, 0.45, fill_color=MED_RED)
add_text(slide, "Every unit of donated blood undergoes rigorous testing before use (Bailey & Love, 28th Ed)",
0.4, 0.9, 12.5, 0.45, font_size=13, color=WHITE, italic=True,
v_anchor=MSO_ANCHOR.MIDDLE)
# Left column - donation details
add_info_box(slide, "Donation Standards (UK)",
["Up to 450 mL drawn per session",
"Maximum 3 times per year per donor",
"Donors pre-screened to protect both donor & recipient",
"All units leukodepleted (precaution against vCJD; also reduces immunogenicity)"],
0.3, 1.5, 6.0, 2.4)
# Right column - testing
add_info_box(slide, "Mandatory Testing per Unit",
["Hepatitis B surface antigen (HBsAg)",
"Hepatitis C antibody (anti-HCV)",
"HIV-1 & HIV-2 antibodies",
"Syphilis serology",
"ABO & Rhesus D blood grouping",
"Irregular red cell antibody screen"],
6.5, 1.5, 6.5, 2.4)
# Processing flow diagram
add_rect(slide, 0.3, 4.05, 12.7, 0.38, fill_color=DARK_RED)
add_text(slide, "Processing of Donated Blood into Components", 0.4, 4.05, 12.5, 0.38,
font_size=14, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
boxes = [
("Whole Blood\n(450 mL)", 0.35, 4.5),
("Centrifuge", 2.55, 4.5),
("Red Cell\nConcentrate", 4.75, 4.5),
("Platelet\nConcentrate", 6.95, 4.5),
("Fresh Frozen\nPlasma (FFP)", 9.15, 4.5),
("Cryoprecipitate", 11.35, 4.5),
]
colors = [MED_RED, TEAL, DARK_RED, RGBColor(0x8A,0x1A,0x6E),
RGBColor(0x1A,0x6E,0x3A), TEAL]
for (label, bx, by), col in zip(boxes, colors):
add_rect(slide, bx, by, 1.9, 1.0, fill_color=col,
border_color=WHITE, border_pt=1)
add_text(slide, label, bx+0.05, by+0.05, 1.8, 0.9,
font_size=12, bold=True, color=WHITE,
align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE)
if bx < 11.35:
add_text(slide, "→", bx+1.93, by+0.3, 0.45, 0.4,
font_size=16, bold=True, color=DARK_RED, align=PP_ALIGN.CENTER)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 4 ─ Blood Products: Types & Uses
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
light_bg(slide)
content_header(slide, "Blood Products – Types & Key Features")
product_data = [
("Whole Blood", "Rarely used in civilian practice\nContains all components incl. clotting factors\nAdvantage if fresh: coagulation factor-rich\nIndication: massive haemorrhage, military/trauma settings"),
("Packed Red Blood Cells\n(pRBC)", "Most commonly transfused product\nHaematocrit ≈ 55–75%\nStored up to 35 days at 2–6 °C\nIndication: symptomatic anaemia, periop blood loss"),
("Fresh Frozen Plasma\n(FFP)", "Contains all coagulation factors\nUsed within 4 h of thawing\nIndications: coagulopathy, liver failure, massive transfusion\nDose: 10–15 mL/kg"),
("Platelet Concentrate", "1 unit raises count by ≈ 5–10 × 10⁹/L\nPool of 4–6 donor units or single-donor apheresis\nIndications: thrombocytopenia, platelet dysfunction\nTransfuse when count < 50 × 10⁹/L (surgery)"),
("Cryoprecipitate", "Rich in fibrinogen, Factor VIII, vWF, Factor XIII\nUsed in: hypofibrinogenaemia, DIC, haemophilia A\nCritical in: massive haemorrhage with low fibrinogen"),
("Albumin & Colloids", "4.5–5% albumin: volume expansion\n20–25% albumin: hypoalbuminaemia\nNo coagulation factors; infection-free"),
]
cols = 3
rows_n = 2
card_w = 4.2
card_h = 2.7
start_x = 0.3
start_y = 0.95
for idx, (name, text) in enumerate(product_data):
col_i = idx % cols
row_i = idx // cols
cx = start_x + col_i * (card_w + 0.12)
cy = start_y + row_i * (card_h + 0.12)
add_rect(slide, cx, cy, card_w, 0.42, fill_color=TEAL)
add_text(slide, name, cx+0.08, cy, card_w-0.1, 0.42,
font_size=13, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, cx, cy+0.42, card_w, card_h-0.42, fill_color=LIGHT_TEAL,
border_color=TEAL, border_pt=0.5)
add_text(slide, text, cx+0.1, cy+0.48, card_w-0.2, card_h-0.55,
font_size=12, color=DARK_GRAY, wrap=True)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 5 ─ ABO & Rhesus Blood Groups
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
light_bg(slide)
content_header(slide, "ABO & Rhesus Blood Group Systems")
# ABO table
abo_headers = ["Blood Group", "Antigens on RBC", "Antibodies in Serum", "Can Donate to", "Can Receive from"]
abo_rows = [
["A", "A", "Anti-B", "A, AB", "A, O"],
["B", "B", "Anti-A", "B, AB", "B, O"],
["AB", "A & B", "None", "AB only", "All groups"],
["O", "None", "Anti-A, Anti-B", "All groups","O only"],
]
draw_table(slide, abo_headers, abo_rows, 0.3, 0.95,
[1.4, 1.8, 2.2, 2.2, 2.2], row_height=0.48)
add_rect(slide, 0.3, 3.3, 12.7, 0.38, fill_color=MED_RED)
add_text(slide, "Rhesus (Rh) System", 0.4, 3.3, 12.5, 0.38,
font_size=16, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
rh_bullets = [
"Rh+ (D antigen present): 85% of population",
"Rh- individuals do NOT have anti-D naturally - sensitisation occurs on first exposure",
"Rh- women of childbearing age: must receive Rh- blood to prevent haemolytic disease of the newborn (HDN)",
"Anti-D immunoglobulin given within 72h after sensitising event (miscarriage, ectopic pregnancy, delivery)",
"Cross-matching performed before every transfusion to detect incompatibilities",
]
add_multi_para(slide, rh_bullets, 0.4, 3.75, 12.4, 2.4, font_size=14)
add_rect(slide, 0.3, 6.2, 12.7, 0.62, fill_color=LIGHT_RED,
border_color=DARK_RED, border_pt=1)
add_text(slide, "⚠ Universal Donor (O-): can donate to ALL | Universal Recipient (AB+): can receive from ALL\n"
" Cross-matching must ALWAYS be performed even in emergency where group-specific blood is used",
0.45, 6.22, 12.4, 0.6, font_size=13, bold=True, color=DARK_RED)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 6 ─ Cross-Matching & Compatibility Testing
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
light_bg(slide)
content_header(slide, "Cross-Matching & Compatibility Testing")
steps = [
("1", "SAMPLE COLLECTION", "Patient blood sample clearly labelled with: Name, DOB, Hospital No., Date & Time, Signature of collector"),
("2", "BLOOD GROUPING", "ABO and Rh D typing of patient sample\nForward & reverse grouping performed"),
("3", "ANTIBODY SCREEN", "Indirect antiglobulin test (IAT) to detect irregular antibodies in patient serum"),
("4", "CROSS-MATCH", "Donor RBCs incubated with patient serum\nElectronic XM or serological XM performed\nFull compatibility confirmed before issue"),
("5", "ISSUE & LABELLING", "Blood issued with compatibility label\nMust match patient ID exactly before transfusion"),
]
for i, (num, title, desc) in enumerate(steps):
bx = 0.3 + i * 2.56
add_rect(slide, bx, 0.95, 2.4, 0.6, fill_color=DARK_RED,
border_color=WHITE, border_pt=1)
add_text(slide, f"Step {num}", bx+0.05, 0.95, 2.3, 0.3,
font_size=11, bold=True, color=GOLD, align=PP_ALIGN.CENTER)
add_text(slide, title, bx+0.05, 1.25, 2.3, 0.3,
font_size=11, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_rect(slide, bx, 1.55, 2.4, 2.4, fill_color=LIGHT_TEAL,
border_color=TEAL, border_pt=0.5)
add_text(slide, desc, bx+0.1, 1.6, 2.2, 2.3,
font_size=12, color=DARK_GRAY, wrap=True)
if i < 4:
add_text(slide, "▶", bx+2.42, 1.65, 0.22, 0.4,
font_size=16, bold=True, color=DARK_RED, align=PP_ALIGN.CENTER)
# Emergency protocols
add_rect(slide, 0.3, 4.15, 12.7, 0.42, fill_color=MED_RED)
add_text(slide, "Emergency Blood Protocols", 0.4, 4.15, 12.5, 0.42,
font_size=15, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
em_boxes = [
("Group-Specific\n(10 min)", "ABO & RhD compatible but not fully cross-matched\nUsed when patient bleeding severely"),
("Type & Screen\n(30 min)", "Full ABO/Rh + antibody screen\nNo donor blood pre-selected until needed"),
("O Negative\n(Immediate)", "Universal donor RBCs\nFor immediate life-threatening haemorrhage\nSwitched to patient-specific blood as soon as available"),
("Full X-Match\n(45–60 min)", "Complete serological compatibility test\nGold standard in elective/semi-elective setting"),
]
for i, (em_title, em_desc) in enumerate(em_boxes):
ex = 0.35 + i * 3.22
add_rect(slide, ex, 4.65, 3.0, 0.45, fill_color=TEAL)
add_text(slide, em_title, ex+0.05, 4.65, 2.9, 0.45,
font_size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, ex, 5.1, 3.0, 1.8, fill_color=WHITE,
border_color=TEAL, border_pt=0.5)
add_text(slide, em_desc, ex+0.1, 5.15, 2.8, 1.7,
font_size=12, color=DARK_GRAY, wrap=True)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 7 ─ Indications for Blood Transfusion
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
light_bg(slide)
content_header(slide, "Indications for Blood Transfusion")
add_rect(slide, 0.3, 0.9, 12.7, 0.42, fill_color=TEAL)
add_text(slide, "\"Blood transfusions should be avoided if possible\" — Bailey & Love 28th Ed",
0.4, 0.9, 12.5, 0.42, font_size=13, bold=False, italic=True,
color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
# Three main indication boxes
ind_data = [
("1. ACUTE BLOOD LOSS",
["Replace circulating volume & maintain oxygen delivery",
"Haemorrhage from trauma, surgery or GI bleeding",
"Target: restore haemodynamic stability",
"Initial crystalloid/colloid resuscitation may precede transfusion",
"Examples: ruptured AAA (up to 9 units), major trauma, GI bleed"],
DARK_RED),
("2. PERIOPERATIVE ANAEMIA",
["Ensure adequate O₂ delivery during surgery & recovery",
"Pre-operative Hb optimisation preferred (IV iron/EPO)",
"Intraoperative: triggered by Hb <7 g/dL or haemodynamic compromise",
"Cell saver use reduces allogeneic transfusion",
"Examples: colorectal resection, orthopaedic procedures"],
TEAL),
("3. SYMPTOMATIC CHRONIC ANAEMIA",
["Without haemorrhage or impending surgery",
"Anaemia of chronic disease (e.g. Crohn's, malignancy)",
"Chronic bleeding: iron deficiency from Ca. caecum",
"Only transfuse if symptomatic (SOB, chest pain, fatigue)",
"Special: pre-renal transplant to enhance graft survival (immune modulation)"],
RGBColor(0x1A, 0x6E, 0x3A)),
]
for i, (title, bullets, col) in enumerate(ind_data):
bx = 0.3 + i * 4.35
add_rect(slide, bx, 1.45, 4.15, 0.5, fill_color=col)
add_text(slide, title, bx+0.1, 1.45, 4.0, 0.5,
font_size=13, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, bx, 1.95, 4.15, 3.6, fill_color=WHITE,
border_color=col, border_pt=1)
add_multi_para(slide, bullets, bx+0.15, 2.0, 3.9, 3.5,
font_size=13, color=DARK_GRAY)
# Transfusion trigger box at bottom
add_rect(slide, 0.3, 5.65, 12.7, 0.38, fill_color=DARK_RED)
add_text(slide, "Transfusion Trigger (Bailey & Love Table 2.6)", 0.4, 5.65, 12.5, 0.38,
font_size=15, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
draw_table(slide,
["Haemoglobin (g/dL)", "Clinical Indication", "Action"],
[["< 6", "All patients", "Transfuse – will likely benefit"],
["6 – 8", "No bleeding or surgery", "Transfusion unlikely beneficial unless symptomatic"],
["> 8", "No risk factors", "No indication for transfusion"]],
0.3, 6.05, [2.5, 5.5, 4.7], row_height=0.37)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 8 ─ Appropriate Use / Patient Blood Management
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
light_bg(slide)
content_header(slide, "Appropriate Use of Blood – Patient Blood Management (PBM)")
add_text(slide, "PBM is an evidence-based approach to optimise the use of blood and minimise transfusion.",
0.4, 0.9, 12.5, 0.45, font_size=15, bold=True, italic=True, color=DARK_RED)
# Three pillars
pillar_data = [
("PILLAR 1\nOptimise Haemopoiesis",
["Detect & treat anaemia preoperatively",
"IV/oral iron supplementation",
"Erythropoiesis-stimulating agents (EPO) if indicated",
"Treat nutritional deficiencies (B12, folate)",
"Aim: Hb ≥ 13 g/dL before elective surgery"],
DARK_RED),
("PILLAR 2\nMinimise Blood Loss",
["Meticulous haemostatic surgical technique",
"Cell salvage (intra- & post-operative)",
"Autologous pre-donation",
"Antifibrinolytics: tranexamic acid (TXA)",
"Topical haemostatics (fibrin sealants)",
"Avoid NSAIDs / antiplatelet agents pre-op"],
TEAL),
("PILLAR 3\nOptimise Anaemia Tolerance",
["Permissive anaemia: Hb trigger ≥ 6 g/dL in stable pts",
"High flow oxygen therapy to maximise O₂ delivery",
"Haemodynamic optimisation (fluids, vasopressors)",
"Normovolaemia maintenance",
"Avoid unnecessary phlebotomy",
"Iron supplementation post-op"],
RGBColor(0x5A, 0x22, 0x8A)),
]
for i, (title, bullets, col) in enumerate(pillar_data):
bx = 0.3 + i * 4.35
add_rect(slide, bx, 1.45, 4.15, 0.7, fill_color=col)
add_text(slide, title, bx+0.1, 1.45, 4.0, 0.7,
font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, bx, 2.15, 4.15, 3.75, fill_color=WHITE,
border_color=col, border_pt=1)
add_multi_para(slide, bullets, bx+0.15, 2.2, 3.9, 3.65,
font_size=13, color=DARK_GRAY)
add_rect(slide, 0.3, 6.05, 12.7, 0.42, fill_color=LIGHT_RED,
border_color=DARK_RED, border_pt=1)
add_text(slide, "Key principle: A unit of blood not transfused is the safest unit of blood. "
"Transfusion is associated with immunosuppression, increased morbidity & reduced survival in some groups (trauma, malignancy)",
0.45, 6.07, 12.3, 0.4, font_size=12, italic=True, color=DARK_RED)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 9 ─ Blood Transfusion Procedure & Precautions
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
light_bg(slide)
content_header(slide, "Blood Transfusion Procedure & Precautions")
# Left: Pre-transfusion checks
add_info_box(slide, "Pre-Transfusion Checks (MANDATORY)",
["Confirm patient identity (2 identifiers: name + DOB + hospital no.)",
"Check blood product label matches request form & patient ID",
"Verify: blood group, unit number, expiry date",
"Inspect bag: any discolouration, clots or leaks?",
"Ensure informed consent documented",
"Baseline observations: temp, BP, HR, RR, SpO₂"],
0.3, 0.95, 6.1, 3.2, header_color=DARK_RED, body_color=LIGHT_RED)
# Right: Administration protocol
add_info_box(slide, "Administration Protocol",
["Use a sterile blood giving set with 170–200 μm filter",
"Do NOT add drugs to blood bag",
"Large bore IV cannula (≥18G) preferred",
"Warm blood if large volumes or hypothermia risk (use blood warmer)",
"Each unit: run over 90–120 min (max 4 h from removal from fridge)",
"Discard if not used within 4 hours of removing from cold storage"],
6.5, 0.95, 6.5, 3.2)
# Monitoring during transfusion
add_rect(slide, 0.3, 4.25, 12.7, 0.42, fill_color=TEAL)
add_text(slide, "Monitoring During Transfusion", 0.4, 4.25, 12.5, 0.42,
font_size=15, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
monitoring_data = [
"0 min: Start infusion – observe patient for first 5–10 min",
"15 min: Repeat observations (temp, BP, HR, SpO₂)",
"60 min: Mid-transfusion observations",
"End: Final observations at completion",
"Any adverse sign → STOP transfusion immediately, check identity, call medical team",
]
add_multi_para(slide, monitoring_data, 0.4, 4.75, 12.3, 1.8,
font_size=14, color=DARK_GRAY)
add_rect(slide, 0.3, 6.62, 12.7, 0.42, fill_color=LIGHT_RED,
border_color=DARK_RED, border_pt=1)
add_text(slide, "⚠ MOST transfusion errors are due to WRONG BLOOD IN TUBE (WBIT) or patient misidentification. "
"CHECK IDENTITY AT EVERY STEP.",
0.45, 6.63, 12.3, 0.4, font_size=13, bold=True, color=DARK_RED)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 10 ─ Complications Overview Diagram
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
light_bg(slide)
content_header(slide, "Complications of Blood Transfusion – Overview")
# Central box
add_rect(slide, 5.1, 3.1, 3.1, 0.9, fill_color=DARK_RED,
border_color=WHITE, border_pt=1)
add_text(slide, "BLOOD\nTRANSFUSION\nCOMPLICATIONS", 5.1, 3.1, 3.1, 0.9,
font_size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
v_anchor=MSO_ANCHOR.MIDDLE)
# Surrounding boxes
comp_boxes = [
("Immunological\nReactions", 0.3, 1.2, MED_RED,
["• Acute haemolytic (ABO incompatibility)",
"• Febrile non-haemolytic (FNHTR)",
"• Allergic / Urticarial",
"• Anaphylaxis",
"• TRALI"]),
("Infectious\nComplications", 0.3, 4.3, TEAL,
["• Bacterial contamination (storage fault)",
"• Hepatitis B / C",
"• HIV-1, HIV-2",
"• Malaria, CMV, EBV",
"• vCJD (theoretical risk)"]),
("Massive Transfusion\nComplications", 9.7, 1.2, RGBColor(0x5A,0x22,0x8A),
["• Dilutional coagulopathy",
"• Hypocalcaemia (citrate toxicity)",
"• Hyperkalaemia (stored blood)",
"• Hypothermia",
"• Metabolic acidosis"]),
("Technical &\nMiscellaneous", 9.7, 4.3, RGBColor(0x1A,0x6E,0x3A),
["• Air embolism",
"• Thrombophlebitis",
"• Circulatory overload (TACO)",
"• Iron overload (repeated transfusion)",
"• Haemosiderosis (thalassaemia)"]),
]
for (label, bx, by, col, desc_list) in comp_boxes:
add_rect(slide, bx, by, 3.2, 0.55, fill_color=col)
add_text(slide, label, bx+0.08, by, 3.1, 0.55,
font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, bx, by+0.55, 3.2, 2.0, fill_color=WHITE,
border_color=col, border_pt=0.5)
add_multi_para(slide, desc_list, bx+0.1, by+0.6, 3.0, 1.9,
font_size=12, bullet_char="")
# arrows toward centre
arrows = [
(3.5, 1.85, "→"),
(3.5, 4.75, "→"),
(9.25, 1.85, "←"),
(9.25, 4.75, "←"),
]
for (ax, ay, ar) in arrows:
add_text(slide, ar, ax, ay, 0.5, 0.4,
font_size=20, bold=True, color=DARK_RED, align=PP_ALIGN.CENTER)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 11 ─ Acute Haemolytic Transfusion Reaction
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
light_bg(slide)
content_header(slide, "Acute Haemolytic Transfusion Reaction (AHTR)")
add_rect(slide, 0.3, 0.88, 12.7, 0.42, fill_color=MED_RED)
add_text(slide, "Most serious transfusion complication | Usually due to ABO incompatibility | Often caused by clerical/identification error",
0.4, 0.88, 12.5, 0.42, font_size=13, italic=True, color=WHITE,
v_anchor=MSO_ANCHOR.MIDDLE)
# Mechanism
add_info_box(slide, "Mechanism",
["Recipient pre-formed antibodies (IgM anti-A or anti-B) react with donor RBC antigens",
"Complement activation → intravascular haemolysis",
"Cytokine release → fever, hypotension, shock",
"Haemoglobinuria → acute tubular necrosis → renal failure",
"DIC may develop in severe cases"],
0.3, 1.4, 6.1, 2.5)
# Clinical features
add_info_box(slide, "Clinical Features (may start within minutes)",
["Anxiety, agitation, restlessness",
"Fever with rigors",
"Hypotension, tachycardia",
"Loin/back pain (flank pain)",
"Chest pain, dyspnoea",
"Haemoglobinuria (dark red/brown urine)",
"In anaesthetised patients: unexplained bleeding, hypotension"],
6.5, 1.4, 6.5, 2.5)
# Management
add_rect(slide, 0.3, 4.0, 12.7, 0.38, fill_color=DARK_RED)
add_text(slide, "Management of AHTR", 0.4, 4.0, 12.5, 0.38,
font_size=15, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
mgmt = [
("STOP transfusion immediately", "Disconnect giving set, keep IV access open"),
("Notify blood bank / haematology", "Send: patient sample, donor bag & giving set to lab"),
("Resuscitate", "IV fluids (0.9% saline) to maintain BP & urinary output > 0.5 mL/kg/h"),
("Monitor", "Urinary catheter, hourly urine output, U&Es, FBC, coagulation screen, LFT"),
("Treat DIC if present", "FFP, platelets, cryoprecipitate as indicated; haematology review"),
]
for i, (step, detail) in enumerate(mgmt):
ry = 4.45 + i * 0.52
add_rect(slide, 0.3, ry, 3.5, 0.47, fill_color=LIGHT_RED,
border_color=DARK_RED, border_pt=0.5)
add_text(slide, step, 0.38, ry+0.03, 3.35, 0.41,
font_size=12, bold=True, color=DARK_RED, v_anchor=MSO_ANCHOR.MIDDLE)
add_text(slide, detail, 3.9, ry+0.03, 9.1, 0.41,
font_size=12, color=DARK_GRAY, v_anchor=MSO_ANCHOR.MIDDLE)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 12 ─ Other Acute Reactions
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
light_bg(slide)
content_header(slide, "Other Acute Transfusion Reactions")
reactions = [
("Febrile Non-Haemolytic\nTransfusion Reaction\n(FNHTR)",
"Cytokine release from leukocytes in stored blood\nMost common transfusion reaction",
"Fever (≥1°C rise), chills, rigors\nNo haemolysis",
"Slow/stop transfusion, paracetamol\nLeukodepletion prevents most cases",
MED_RED),
("Allergic Reaction\n(Urticarial)",
"IgE-mediated reaction to plasma proteins in donor blood",
"Urticaria, pruritus, flushing\nMild anaphylaxis (wheeze, angioedema)",
"Stop transfusion (temp), antihistamine IV\nRestart if symptoms resolve",
TEAL),
("Anaphylaxis",
"Usually in IgA-deficient patients with anti-IgA antibodies",
"Bronchospasm, hypotension, angioedema\nCardiovascular collapse",
"STOP transfusion, adrenaline 0.5 mg IM\nAirway management, IV fluids, steroids",
DARK_RED),
("TRALI\n(Transfusion-Related\nAcute Lung Injury)",
"Donor antibodies activate recipient neutrophils in pulmonary vasculature\nMost often from FFP or platelets",
"Acute hypoxia within 6h\nBilateral pulmonary infiltrates, no LV failure\nRespiratory failure",
"Supportive: O₂, ventilatory support\nDiuretics NOT indicated\nReport to haematology & blood bank",
RGBColor(0x5A,0x22,0x8A)),
("TACO\n(Transfusion-Associated\nCirculatory Overload)",
"Excess volume causing cardiac failure\nElderly, pre-existing LV dysfunction",
"Dyspnoea, hypertension, tachycardia\nPulmonary oedema within 12h\nRaised JVP, bilateral crackles",
"Slow infusion rate, sit patient upright\nFurosemide IV, O₂ therapy\nPrevention: slow transfusion ≤1 unit/4h",
RGBColor(0x1A,0x6E,0x3A)),
]
card_w = 2.52
for i, (name, cause, features, mgmt, col) in enumerate(reactions):
bx = 0.2 + i * 2.59
add_rect(slide, bx, 0.9, card_w, 0.85, fill_color=col)
add_text(slide, name, bx+0.07, 0.9, card_w-0.1, 0.85,
font_size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
v_anchor=MSO_ANCHOR.MIDDLE)
for ji, (sub_label, sub_text, sub_color) in enumerate([
("Cause", cause, RGBColor(0xFF,0xF0,0xF0)),
("Features", features, LIGHT_TEAL),
("Management", mgmt, LIGHT_GRAY)]):
sy = 1.75 + ji * 1.65
add_rect(slide, bx, sy, card_w, 0.3, fill_color=col)
add_text(slide, sub_label, bx+0.05, sy, card_w-0.1, 0.3,
font_size=11, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, bx, sy+0.3, card_w, 1.32, fill_color=sub_color,
border_color=col, border_pt=0.3)
add_text(slide, sub_text, bx+0.07, sy+0.33, card_w-0.12, 1.27,
font_size=11, color=DARK_GRAY, wrap=True)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 13 ─ Massive Transfusion & Complications
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
light_bg(slide)
content_header(slide, "Massive Transfusion – Definition & Complications")
add_rect(slide, 0.3, 0.9, 12.7, 0.42, fill_color=TEAL)
add_text(slide, "Massive Transfusion = ≥10 units pRBC in 24h | OR replacement of entire blood volume | OR >4 units in 1h with ongoing bleeding",
0.4, 0.9, 12.5, 0.42, font_size=13, bold=True, color=WHITE,
v_anchor=MSO_ANCHOR.MIDDLE)
comp_left = [
("Dilutional Coagulopathy",
["RBC transfusion without FFP/platelets dilutes clotting factors",
"Use 1:1:1 ratio: pRBC:FFP:Platelets (damage control resuscitation)",
"Give tranexamic acid (TXA) EARLY (within 3h)",
"Monitor: PT, APTT, fibrinogen, TEG/ROTEM"]),
("Hypocalcaemia",
["Citrate preservative chelates calcium",
"Causes: prolonged QT, tetany, cardiac depression",
"Treatment: IV calcium gluconate (10%) or calcium chloride",
"Monitor ionised calcium during massive transfusion"]),
("Hyperkalaemia",
["Stored RBCs leak K⁺ over time (stored blood K⁺ up to 30 mmol/L)",
"Causes: arrhythmias, cardiac arrest",
"Monitor ECG and electrolytes during massive transfusion",
"Use freshest available blood in at-risk patients"]),
]
comp_right = [
("Hypothermia",
["Cold stored blood (2–6 °C) drops core temperature",
"Hypothermia impairs coagulation, causes arrhythmias",
"Prevention: use blood warmer for all rapid transfusions",
"Target: maintain core temp > 36 °C"]),
("Hypokalaemia",
["May occur as cells take up K⁺ post-transfusion",
"Particularly relevant in neonates and infants",
"Monitor K⁺ at intervals during and after massive transfusion"]),
("Iron Overload\n(Chronic/Repeated Transfusion)",
["Each unit pRBC ≈ 250 mg elemental iron",
"Chronic: thalassaemia, sickle cell, myelodysplasia",
"Leads to haemosiderosis: liver, heart, endocrine",
"Treatment: chelation therapy (desferrioxamine, deferasirox)"]),
]
for i, (title, bullets) in enumerate(comp_left):
by = 1.45 + i * 1.88
add_rect(slide, 0.3, by, 6.2, 0.42, fill_color=DARK_RED)
add_text(slide, title, 0.38, by, 6.1, 0.42,
font_size=13, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, 0.3, by+0.42, 6.2, 1.43, fill_color=WHITE,
border_color=DARK_RED, border_pt=0.5)
add_multi_para(slide, bullets, 0.4, by+0.47, 6.0, 1.35,
font_size=12, color=DARK_GRAY)
for i, (title, bullets) in enumerate(comp_right):
by = 1.45 + i * 1.88
add_rect(slide, 6.8, by, 6.2, 0.42, fill_color=TEAL)
add_text(slide, title, 6.88, by, 6.1, 0.42,
font_size=13, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, 6.8, by+0.42, 6.2, 1.43, fill_color=WHITE,
border_color=TEAL, border_pt=0.5)
add_multi_para(slide, bullets, 6.9, by+0.47, 6.0, 1.35,
font_size=12, color=DARK_GRAY)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 14 ─ Management of Coagulopathy (Damage Control Resuscitation)
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
light_bg(slide)
content_header(slide, "Management of Coagulopathy & Damage Control Resuscitation")
add_rect(slide, 0.3, 0.88, 12.7, 0.38, fill_color=MED_RED)
add_text(slide, "Prevention of dilutional coagulopathy is central to Damage Control Resuscitation — Bailey & Love 28th Ed",
0.4, 0.88, 12.5, 0.38, font_size=13, italic=True, color=WHITE,
v_anchor=MSO_ANCHOR.MIDDLE)
# 1:1:1 ratio visual
add_rect(slide, 0.3, 1.35, 12.7, 0.4, fill_color=DARK_RED)
add_text(slide, "The 1:1:1 Balanced Transfusion Protocol (approximates whole blood)", 0.4, 1.35, 12.5, 0.4,
font_size=15, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
ratio_items = [
("pRBC", "Packed Red Blood Cells\nOxygen carrying capacity\nReplaces lost RBCs", MED_RED),
(":", "For every unit of\neach component", DARK_GRAY),
("FFP", "Fresh Frozen Plasma\nAll coagulation factors\nPrevents dilutional coagulopathy", TEAL),
(":", "Give in matched\n1:1:1 ratio", DARK_GRAY),
("PLT", "Platelet Concentrate\nHaemostatic plug\nPrevents platelet dilution", RGBColor(0x1A,0x6E,0x3A)),
]
for i, (label, desc, col) in enumerate(ratio_items):
bx = 1.0 + i * 2.3
if label == ":":
add_text(slide, ":", bx+0.5, 1.85, 0.5, 1.2,
font_size=48, bold=True, color=DARK_RED, align=PP_ALIGN.CENTER)
add_text(slide, desc, bx+0.2, 3.1, 1.2, 0.6,
font_size=11, italic=True, color=MID_GRAY, align=PP_ALIGN.CENTER)
else:
add_rect(slide, bx, 1.85, 1.9, 1.2, fill_color=col,
border_color=WHITE, border_pt=1)
add_text(slide, label, bx+0.05, 1.85, 1.8, 0.6,
font_size=28, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(slide, desc, bx+0.05, 2.45, 1.8, 0.6,
font_size=11, color=WHITE, align=PP_ALIGN.CENTER)
# Additional interventions
add_rect(slide, 0.3, 3.85, 12.7, 0.42, fill_color=TEAL)
add_text(slide, "Additional Haemostatic Interventions", 0.4, 3.85, 12.5, 0.42,
font_size=15, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
haemo_items = [
("Tranexamic Acid\n(TXA)", "Antifibrinolytic\nGive ASAP (within 3h of injury)\n1g IV loading, 1g over 8h", DARK_RED),
("Cryoprecipitate", "Rich in fibrinogen, Factor VIII, vWF\nFor fibrinogen < 1.5 g/L\n2 pools (10 units) typical dose", TEAL),
("Fibrinogen\nConcentrate", "Purified fibrinogen\nAlternative to cryoprecipitate\nTarget fibrinogen > 2 g/L", MED_RED),
("Prothrombin\nComplex Conc.", "For warfarin reversal\nContains factors II, VII, IX, X\nActed in 10–15 min", RGBColor(0x5A,0x22,0x8A)),
("Factor VIIa\n(rFVIIa)", "Recombinant activated factor VII\nSalvage therapy for refractory bleeding\nHigh cost, thrombotic risk", RGBColor(0x1A,0x6E,0x3A)),
]
for i, (label, desc, col) in enumerate(haemo_items):
bx = 0.35 + i * 2.55
add_rect(slide, bx, 4.35, 2.35, 0.42, fill_color=col)
add_text(slide, label, bx+0.05, 4.35, 2.25, 0.42,
font_size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, bx, 4.77, 2.35, 1.55, fill_color=WHITE,
border_color=col, border_pt=0.5)
add_text(slide, desc, bx+0.08, 4.82, 2.2, 1.45,
font_size=12, color=DARK_GRAY, wrap=True)
add_rect(slide, 0.3, 6.42, 12.7, 0.38, fill_color=LIGHT_RED,
border_color=DARK_RED, border_pt=1)
add_text(slide, "Avoid crystalloids/colloids in massive haemorrhage | Hypothermia + Acidosis + Coagulopathy = LETHAL TRIAD – prevent aggressively",
0.45, 6.43, 12.3, 0.37, font_size=12, bold=True, color=DARK_RED)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 15 ─ Infectious Complications
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
light_bg(slide)
content_header(slide, "Infectious Complications of Blood Transfusion")
add_rect(slide, 0.3, 0.88, 12.7, 0.38, fill_color=TEAL)
add_text(slide, "Screening has dramatically reduced risk — but residual risk remains for all pathogens",
0.4, 0.88, 12.5, 0.38, font_size=13, italic=True, color=WHITE,
v_anchor=MSO_ANCHOR.MIDDLE)
inf_headers = ["Pathogen", "Route", "Residual Risk (per unit)", "Prevention"]
inf_rows = [
["HIV-1 / HIV-2", "Blood/plasma", "~1 in 4–5 million", "NAT testing, donor exclusion"],
["Hepatitis C (HCV)", "Blood/plasma", "~1 in 1–2 million", "Anti-HCV + NAT testing"],
["Hepatitis B (HBV)", "Blood", "~1 in 500,000", "HBsAg + anti-HBc + NAT testing"],
["Bacterial contamination", "Platelets (stored 22°C)", "~1 in 5,000 units", "Bacterial culture of platelet units"],
["Malaria", "RBCs", "Very rare in UK (donor travel screening)", "Donor deferral, geographic screening"],
["CMV / EBV", "Leukocytes", "Common — usually subclinical", "CMV-negative or leukodepleted blood for at-risk"],
["vCJD / prions", "Blood/plasma", "Theoretical risk", "Universal leukodepletion (UK since 1999)"],
]
draw_table(slide, inf_headers, inf_rows, 0.3, 1.35,
[2.0, 2.0, 2.8, 5.5], row_height=0.45)
add_rect(slide, 0.3, 6.6, 12.7, 0.42, fill_color=LIGHT_RED,
border_color=DARK_RED, border_pt=1)
add_text(slide, "UK Blood Safety: Donations tested for HBV, HCV, HIV-1/2, HTLV, Syphilis, and leukodepleted since 1999. "
"Bacterial contamination of platelets remains the highest infectious risk today.",
0.45, 6.61, 12.3, 0.42, font_size=12, italic=True, color=DARK_RED)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 16 ─ Prevention of Transfusion Complications
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
light_bg(slide)
content_header(slide, "Prevention of Transfusion Complications")
prev_sections = [
("Administrative & Identification Safeguards",
["Positive patient ID at every step: sampling, collection, bedside check",
"WBIT (Wrong Blood In Tube) prevention: one patient at a time",
"Electronic blood tracking systems",
"Informed consent documentation",
"Trained staff: only trained personnel to administer blood"],
0.3, 1.0, 6.1, 2.7, DARK_RED),
("Blood Product Safeguards",
["Pre-donation screening of all donors",
"Mandatory serological and NAT testing of every unit",
"Universal leukodepletion (UK)",
"Strict cold chain maintenance (2–6 °C for RBCs)",
"Short storage time for platelets (5–7 days)",
"Single-donor apheresis preferred over pooled platelets"],
6.5, 1.0, 6.5, 2.7, TEAL),
("Clinical Best Practices",
["Adopt restrictive transfusion strategy (trigger Hb < 7–8 g/dL)",
"Patient Blood Management programme",
"Autologous options: cell salvage, pre-donation",
"Routine antifibrinolytics in high-risk surgical cases",
"Pre-op iron/EPO optimisation",
"Avoid unnecessary or prophylactic transfusions"],
0.3, 3.85, 6.1, 2.7, MED_RED),
("Special Population Precautions",
["Neonates & immunocompromised: use irradiated blood",
"CMV-seronegative: use CMV-negative or leukodepleted units",
"Thalassaemia / sickle cell: extended antigen matching",
"Elderly: slow rate (≤1 unit/4h), furosemide cover if TACO risk",
"Renal failure: avoid hyperkalaemia (use washed RBCs)",
"Pregnant women: Rh-matched blood essential"],
6.5, 3.85, 6.5, 2.7, RGBColor(0x1A,0x6E,0x3A)),
]
for (title, bullets, bx, by, bw, bh, col) in prev_sections:
add_rect(slide, bx, by, bw, 0.42, fill_color=col)
add_text(slide, title, bx+0.1, by, bw-0.15, 0.42,
font_size=13, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, bx, by+0.42, bw, bh-0.42, fill_color=WHITE,
border_color=col, border_pt=0.5)
add_multi_para(slide, bullets, bx+0.12, by+0.48, bw-0.22, bh-0.55,
font_size=12.5, color=DARK_GRAY)
add_rect(slide, 0.3, 6.65, 12.7, 0.42, fill_color=LIGHT_RED,
border_color=DARK_RED, border_pt=1)
add_text(slide, "\"The safest transfusion is one that is not given\" — Patient Blood Management principle",
0.45, 6.66, 12.3, 0.42, font_size=13, bold=True, italic=True, color=DARK_RED,
align=PP_ALIGN.CENTER)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 17 ─ Autologous Blood Transfusion
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
light_bg(slide)
content_header(slide, "Autologous Blood Transfusion")
add_rect(slide, 0.3, 0.88, 12.7, 0.38, fill_color=TEAL)
add_text(slide, "Transfusion of a patient's own blood — eliminates alloimmune reactions and reduces infectious risk",
0.4, 0.88, 12.5, 0.38, font_size=13, italic=True, color=WHITE,
v_anchor=MSO_ANCHOR.MIDDLE)
auto_methods = [
("Pre-operative\nAutologous Donation\n(PAD)",
["Patient donates own blood 2–4 weeks before elective surgery",
"Up to 3 units collected (must be Hb > 11 g/dL)",
"Blood stored, returned during/after surgery",
"Limitations: anaemia pre-op, logistics, waste if unused",
"Suitable for: elective orthopaedic, cardiac, vascular surgery"],
DARK_RED),
("Intraoperative\nCell Salvage (ICS)",
["Blood aspirated from surgical field during operation",
"Washed, filtered and re-infused via cell saver",
"Reduces allogeneic transfusion by 40–60%",
"Contraindicated: bowel surgery contamination, malignancy (relative CI)",
"Standard in cardiac, orthopaedic, vascular surgery"],
TEAL),
("Postoperative\nCell Salvage",
["Collects wound drainage blood (e.g. after arthroplasty)",
"Re-infused within 6h via filter",
"Particularly useful in: total knee/hip replacement",
"Reduces need for allogeneic transfusion"],
MED_RED),
("Acute Normovolaemic\nHaemodilution (ANH)",
["1–3 units blood removed at start of surgery",
"Volume replaced with colloid/crystalloid",
"Blood returned at end of surgery or when needed",
"Patient bleeds diluted blood intraoperatively",
"Restores Hb at end; minimises donor exposure"],
RGBColor(0x1A,0x6E,0x3A)),
]
card_w = 3.1
for i, (name, bullets, col) in enumerate(auto_methods):
bx = 0.3 + i * 3.25
add_rect(slide, bx, 1.38, card_w, 0.65, fill_color=col)
add_text(slide, name, bx+0.08, 1.38, card_w-0.12, 0.65,
font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, bx, 2.03, card_w, 4.48, fill_color=WHITE,
border_color=col, border_pt=0.5)
add_multi_para(slide, bullets, bx+0.1, 2.1, card_w-0.2, 4.35,
font_size=13, color=DARK_GRAY)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 18 ─ Summary Flowchart
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
light_bg(slide)
content_header(slide, "Clinical Decision Algorithm – Blood Transfusion")
# Flowchart using boxes and arrows
flow_steps = [
(5.2, 1.0, 2.9, 0.55, "Patient requires blood transfusion?", DARK_RED, WHITE),
(5.2, 1.8, 2.9, 0.55, "Indication confirmed?\n(Hb <7 g/dL or acute loss/symptomatic)", TEAL, WHITE),
(5.2, 2.6, 2.9, 0.55, "Autologous option available?\n(Cell salvage / PAD)", MED_RED, WHITE),
(1.5, 3.5, 2.9, 0.55, "Use autologous blood\n(ICS / PAD / ANH)", RGBColor(0x1A,0x6E,0x3A), WHITE),
(8.0, 3.5, 2.9, 0.55, "Request allogeneic blood\nSend group & X-match", DARK_RED, WHITE),
(5.2, 4.4, 2.9, 0.55, "Pre-transfusion identity\nchecks COMPLETED?", TEAL, WHITE),
(5.2, 5.2, 2.9, 0.55, "Administer blood with\nmonitoring & observations", RGBColor(0x1A,0x6E,0x3A), WHITE),
(5.2, 6.05, 2.9, 0.55, "Adverse reaction?\nSTOP + manage per protocol", MED_RED, WHITE),
]
for (bx, by, bw, bh, label, bg_col, txt_col) in flow_steps:
add_rect(slide, bx, by, bw, bh, fill_color=bg_col,
border_color=WHITE, border_pt=1)
add_text(slide, label, bx+0.08, by+0.03, bw-0.12, bh-0.06,
font_size=12, bold=True, color=txt_col, align=PP_ALIGN.CENTER,
v_anchor=MSO_ANCHOR.MIDDLE)
# Arrow connectors (simplified)
arrow_pairs = [
(6.65, 1.57, 6.65, 1.8), # 1→2
(6.65, 2.37, 6.65, 2.6), # 2→3
(5.2, 2.87, 2.9, 3.5), # 3→Yes (auto)
(8.1, 2.87, 9.45, 3.5), # 3→No (allogeneic)
(4.4, 3.78, 6.7, 4.4), # auto→check
(9.45, 3.78, 7.55, 4.4), # allogenic→check
(6.65, 4.97, 6.65, 5.2), # 5→6
(6.65, 5.77, 6.65, 6.05), # 6→7
]
for (x1, y1, x2, y2) in arrow_pairs:
# draw simple line
tb = slide.shapes.add_textbox(Inches(x1), Inches(y1), Inches(0.01), Inches(y2-y1+0.01))
# Just add an arrow symbol
pass # skip actual line drawing; use text arrows instead
# YES / NO labels
add_text(slide, "YES", 2.7, 3.25, 0.8, 0.25, font_size=11, bold=True, color=RGBColor(0x1A,0x6E,0x3A))
add_text(slide, "NO", 9.0, 3.25, 0.8, 0.25, font_size=11, bold=True, color=DARK_RED)
add_text(slide, "↓", 6.55, 1.55, 0.5, 0.28, font_size=18, bold=True, color=DARK_RED, align=PP_ALIGN.CENTER)
add_text(slide, "↓", 6.55, 2.35, 0.5, 0.28, font_size=18, bold=True, color=DARK_RED, align=PP_ALIGN.CENTER)
add_text(slide, "↙", 5.8, 3.1, 0.7, 0.4, font_size=22, bold=True, color=RGBColor(0x1A,0x6E,0x3A), align=PP_ALIGN.CENTER)
add_text(slide, "↘", 7.2, 3.1, 0.7, 0.4, font_size=22, bold=True, color=DARK_RED, align=PP_ALIGN.CENTER)
add_text(slide, "↓", 6.55, 4.95, 0.5, 0.28, font_size=18, bold=True, color=DARK_RED, align=PP_ALIGN.CENTER)
add_text(slide, "↓", 6.55, 5.75, 0.5, 0.28, font_size=18, bold=True, color=DARK_RED, align=PP_ALIGN.CENTER)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 19 ─ Key Points / Summary
# ══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_color=DARK_RED)
add_rect(slide, 0, 5.7, 13.333, 0.07, fill_color=WHITE)
add_rect(slide, 0, 5.79, 13.333, 0.07, fill_color=GOLD)
add_text(slide, "KEY TAKE-HOME POINTS", 0.5, 0.2, 12.3, 0.85,
font_size=34, bold=True, color=WHITE)
add_rect(slide, 0.5, 1.05, 11.8, 0.06, fill_color=GOLD)
key_points = [
"Blood & blood products must be used judiciously – unnecessary transfusion carries immunological and infectious risks.",
"Transfusion trigger: Hb < 7 g/dL (stable patients); higher threshold for patients with cardiovascular disease or active bleeding.",
"ABO incompatibility is most often caused by patient misidentification errors – strict identity checks are mandatory at every step.",
"Massive transfusion: use 1:1:1 (pRBC:FFP:Platelets) + early tranexamic acid + prevent lethal triad (hypothermia, acidosis, coagulopathy).",
"STOP transfusion immediately at first sign of any adverse reaction; keep IV access, send samples, call medical team.",
"Patient Blood Management (PBM) is the gold standard: optimise haemopoiesis → minimise blood loss → optimise anaemia tolerance.",
"Autologous blood (cell salvage, PAD, ANH) is the safest option when available – eliminates alloimmune & infectious risk.",
"Special populations: irradiated blood for neonates/immunocompromised; Rh-negative blood for women of childbearing age; CMV-negative for at-risk patients.",
]
for i, pt in enumerate(key_points):
add_rect(slide, 0.5, 1.2 + i * 0.72, 0.45, 0.45,
fill_color=GOLD, border_color=WHITE, border_pt=0.5)
add_text(slide, str(i+1), 0.5, 1.22 + i * 0.72, 0.45, 0.43,
font_size=14, bold=True, color=DARK_RED, align=PP_ALIGN.CENTER,
v_anchor=MSO_ANCHOR.MIDDLE)
add_text(slide, pt, 1.05, 1.2 + i * 0.72, 11.7, 0.68,
font_size=14, color=WHITE, wrap=True)
add_text(slide, "Reference: Bailey & Love's Short Practice of Surgery, 28th Ed | Pye's Surgical Handicraft, 22nd Ed",
0.5, 6.0, 12.3, 0.45, font_size=11, color=LIGHT_RED, italic=True)
footer(slide)
# ══════════════════════════════════════════════════════════════════════════════
# SAVE
# ══════════════════════════════════════════════════════════════════════════════
out_path = "/tmp/workspace/blood-transfusion-ppt/Blood_Transfusion_Surgery.pptx"
prs.save(out_path)
print(f"Saved: {out_path}")
print(f"Total slides: {len(prs.slides)}")
cd /tmp/workspace/blood-transfusion-ppt && python create_ppt.py 2>&1
ls -lh /tmp/workspace/blood-transfusion-ppt/
python3 -c " from pptx import Presentation prs = Presentation('/tmp/workspace/blood-transfusion-ppt/Blood_Transfusion_Surgery.pptx') for i, slide in enumerate(prs.slides, 1): texts = [s.text_frame.text.strip()[:60] for s in slide.shapes if s.has_text_frame and s.text_frame.text.strip()] if texts: print(f'Slide {i:02d}: {texts[0]}') "
Blood Transfusion Surgery
Presentation · PPTX
| # | Slide Title | Key Content |
|---|---|---|
| 1 | Title Slide | Topic overview, references listed |
| 2 | History of Blood Transfusion | Timeline diagram: 1492 → 1939, key milestones (Bailey & Love Table 2.5) |
| 3 | Blood Collection & Screening | Donor standards, mandatory testing, component processing flow diagram |
| 4 | Blood Products – Types & Key Features | 6-card grid: Whole blood, pRBC, FFP, Platelets, Cryoprecipitate, Albumin |
| 5 | ABO & Rhesus Systems | Full compatibility table, Rh system, universal donor/recipient callout |
| 6 | Cross-Matching & Compatibility | 5-step flowchart + 4 emergency protocols (O-neg → full X-match) |
| 7 | Indications for Blood Transfusion | 3 main indications + Transfusion Trigger table (Bailey & Love Table 2.6) |
| 8 | Patient Blood Management (PBM) | 3 Pillars diagram: Optimise haemopoiesis / Minimise blood loss / Optimise anaemia tolerance |
| 9 | Procedure & Precautions | Pre-transfusion checklist, administration protocol, monitoring schedule |
| 10 | Complications Overview | Spoke diagram: 4 quadrants - Immunological, Infectious, Massive transfusion, Miscellaneous |
| 11 | Acute Haemolytic Reaction (AHTR) | Mechanism, clinical features, step-by-step management |
| 12 | Other Acute Reactions | 5-card layout: FNHTR, Allergic, Anaphylaxis, TRALI, TACO |
| 13 | Massive Transfusion Complications | Dilutional coagulopathy, hypocalcaemia, hyperkalaemia, hypothermia, iron overload |
| 14 | Damage Control Resuscitation | 1:1:1 ratio visual + 5 haemostatic agents (TXA, cryoprecipitate, rFVIIa, etc.) |
| 15 | Infectious Complications | Risk table per pathogen with residual risk rates and prevention methods |
| 16 | Prevention of Complications | 4-quadrant grid: Admin safeguards, product safety, clinical best practice, special populations |
| 17 | Autologous Transfusion | PAD, Intraoperative Cell Salvage, Postoperative salvage, ANH |
| 18 | Clinical Decision Algorithm | Transfusion decision flowchart |
| 19 | Key Take-Home Points | 8 numbered summary points on dark red background |