mkdir -p /tmp/workspace/exam-notes && python3 << 'EOF'
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table,
TableStyle, HRFlowable, PageBreak, KeepTogether)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus import ListFlowable, ListItem
doc = SimpleDocTemplate(
"/tmp/workspace/exam-notes/Haemorrhage_and_BT_Exam_Notes.pdf",
pagesize=A4,
rightMargin=1.8*cm, leftMargin=1.8*cm,
topMargin=2*cm, bottomMargin=2*cm
)
styles = getSampleStyleSheet()
# Custom styles
title_style = ParagraphStyle('Title', parent=styles['Title'],
fontSize=20, textColor=colors.HexColor('#1a3c6e'),
spaceAfter=6, alignment=TA_CENTER, fontName='Helvetica-Bold')
subtitle_style = ParagraphStyle('Subtitle', parent=styles['Normal'],
fontSize=10, textColor=colors.HexColor('#555555'),
spaceAfter=16, alignment=TA_CENTER)
h1_style = ParagraphStyle('H1', parent=styles['Heading1'],
fontSize=14, textColor=colors.white,
backColor=colors.HexColor('#1a3c6e'),
spaceBefore=14, spaceAfter=6,
fontName='Helvetica-Bold', leftIndent=-5, rightIndent=-5,
borderPad=6)
h2_style = ParagraphStyle('H2', parent=styles['Heading2'],
fontSize=12, textColor=colors.HexColor('#1a3c6e'),
spaceBefore=10, spaceAfter=4,
fontName='Helvetica-Bold',
borderPad=2)
h3_style = ParagraphStyle('H3', parent=styles['Heading3'],
fontSize=10.5, textColor=colors.HexColor('#2e6da4'),
spaceBefore=8, spaceAfter=3,
fontName='Helvetica-Bold')
body_style = ParagraphStyle('Body', parent=styles['Normal'],
fontSize=9.5, leading=14, spaceAfter=3,
textColor=colors.HexColor('#222222'))
bullet_style = ParagraphStyle('Bullet', parent=styles['Normal'],
fontSize=9.5, leading=13, spaceAfter=2,
leftIndent=14, firstLineIndent=-10,
textColor=colors.HexColor('#222222'))
note_style = ParagraphStyle('Note', parent=styles['Normal'],
fontSize=9, leading=12, spaceAfter=4,
textColor=colors.HexColor('#7b2d00'),
backColor=colors.HexColor('#fff3e0'),
borderPad=6, borderColor=colors.HexColor('#ff9800'),
fontName='Helvetica-BoldOblique')
highlight_style = ParagraphStyle('Highlight', parent=styles['Normal'],
fontSize=9.5, leading=13, spaceAfter=2,
textColor=colors.HexColor('#1a3c6e'),
fontName='Helvetica-Bold')
def h1(text):
return Paragraph(f" {text}", h1_style)
def h2(text):
return Paragraph(text, h2_style)
def h3(text):
return Paragraph(text, h3_style)
def body(text):
return Paragraph(text, body_style)
def bullet(text):
return Paragraph(f"β’ {text}", bullet_style)
def note(text):
return Paragraph(f"β {text}", note_style)
def sp(n=6):
return Spacer(1, n)
def hr():
return HRFlowable(width="100%", thickness=0.5, color=colors.HexColor('#cccccc'), spaceAfter=4, spaceBefore=4)
def make_table(headers, rows, col_widths=None):
data = [headers] + rows
if col_widths is None:
n = len(headers)
avail = 17*cm
col_widths = [avail/n]*n
t = Table(data, colWidths=col_widths, repeatRows=1)
style = TableStyle([
('BACKGROUND', (0,0), (-1,0), colors.HexColor('#1a3c6e')),
('TEXTCOLOR', (0,0), (-1,0), colors.white),
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
('FONTSIZE', (0,0), (-1,0), 9),
('FONTSIZE', (0,1), (-1,-1), 8.5),
('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.HexColor('#f0f4fa'), colors.white]),
('GRID', (0,0), (-1,-1), 0.4, colors.HexColor('#aaaaaa')),
('VALIGN', (0,0), (-1,-1), 'TOP'),
('LEFTPADDING', (0,0), (-1,-1), 5),
('RIGHTPADDING', (0,0), (-1,-1), 5),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('WORDWRAP', (0,0), (-1,-1), True),
])
t.setStyle(style)
return t
story = []
# ---- TITLE PAGE ----
story.append(sp(30))
story.append(Paragraph("EXAM NOTES", ParagraphStyle('bigtitle', parent=styles['Normal'],
fontSize=28, textColor=colors.HexColor('#1a3c6e'), alignment=TA_CENTER, fontName='Helvetica-Bold')))
story.append(sp(8))
story.append(Paragraph("Haemorrhage & Blood Transfusion", ParagraphStyle('sub', parent=styles['Normal'],
fontSize=18, textColor=colors.HexColor('#2e6da4'), alignment=TA_CENTER, fontName='Helvetica-Bold')))
story.append(sp(6))
story.append(HRFlowable(width="60%", thickness=2, color=colors.HexColor('#1a3c6e'), hAlign='CENTER'))
story.append(sp(8))
story.append(Paragraph("Based on SRB's Manual of Surgery β Chapter 6", ParagraphStyle('src', parent=styles['Normal'],
fontSize=10, textColor=colors.HexColor('#555555'), alignment=TA_CENTER, fontName='Helvetica-Oblique')))
story.append(sp(4))
story.append(Paragraph("General Surgery", ParagraphStyle('src2', parent=styles['Normal'],
fontSize=10, textColor=colors.HexColor('#888888'), alignment=TA_CENTER)))
story.append(PageBreak())
# ========================================================
# SECTION 1: HAEMORRHAGE
# ========================================================
story.append(h1("1. HAEMORRHAGE"))
story.append(sp(8))
# Classification
story.append(h2("Classification"))
story.append(h3("A. By Source of Bleeding"))
t = make_table(
['Type', 'Features'],
[
['Arterial', 'Bright red, spurting jet along with pulse'],
['Venous', 'Dark red, steady, continuous; can be severe from femoral/jugular/varicose/portal veins'],
['Capillary', 'Rapid, bright red, torrential ooze'],
['Pulmonary arterial', 'Dark red; pulmonary venous = bright red'],
],
col_widths=[4*cm, 13*cm]
)
story.append(t)
story.append(sp(8))
story.append(h3("B. By Time of Onset (Relative to Surgery/Injury)"))
t = make_table(
['Type', 'Timing', 'Common Causes'],
[
['Primary', 'At time of injury/operation', '-'],
['Reactionary', 'Within 24 hrs (usually 4-6 hrs)', 'Rise in BP, restlessness, slipping of ligature, clot dislodgement'],
['Secondary', '7-14 days after surgery', 'Infection (e.g. carotid erosion by cancer), malignancy, pressure by drain'],
],
col_widths=[3.5*cm, 4.5*cm, 9*cm]
)
story.append(t)
story.append(sp(8))
story.append(h3("C. By Revelation"))
t = make_table(
['Type', 'Examples'],
[
['Revealed', 'Visible external haemorrhage'],
['Concealed', 'Internal haemorrhage: liver/spleen injury, fractured femur, ruptured ectopic'],
['Initially concealed, later revealed', 'Haematuria, haematemesis, melaena, haemothorax'],
],
col_widths=[5.5*cm, 11.5*cm]
)
story.append(t)
story.append(sp(8))
story.append(h3("D. By Duration"))
t = make_table(
['Type', 'Features'],
[
['Acute', 'Sudden, severe β after trauma/surgery'],
['Chronic', 'Repeated bleeding (haemorrhoids, peptic ulcer, Ca caecum) β chronic anaemia + hyperdynamic cardiac failure'],
['Acute-on-chronic', 'Most dangerous β patient already hypoxic; worsens faster'],
],
col_widths=[4.5*cm, 12.5*cm]
)
story.append(t)
story.append(sp(8))
story.append(h3("E. By Intervention"))
story.append(bullet("<b>Surgical haemorrhage</b>: Can be corrected by surgical intervention"))
story.append(bullet("<b>Non-surgical haemorrhage</b>: Diffuse ooze due to coagulation abnormalities / DIC"))
story.append(sp(10))
# Pathophysiology
story.append(h2("Pathophysiology of Haemorrhage"))
flow_data = [
['Bleeding β Hypovolaemia β Compensatory hypovolaemic shock'],
['Haemodilution β DIC, activated platelets, clot formation'],
['Progressive circulatory failure β Decompensatory shock β MODS β Death'],
]
ft = Table(flow_data, colWidths=[17*cm])
ft.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), colors.HexColor('#e8f0fe')),
('TEXTCOLOR', (0,0), (-1,-1), colors.HexColor('#1a3c6e')),
('FONTNAME', (0,0), (-1,-1), 'Helvetica-Bold'),
('FONTSIZE', (0,0), (-1,-1), 9.5),
('ALIGN', (0,0), (-1,-1), 'CENTER'),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('BOX', (0,0), (-1,-1), 1, colors.HexColor('#2e6da4')),
('LINEBELOW', (0,0), (-1,-2), 0.5, colors.HexColor('#aaaaaa')),
]))
story.append(ft)
story.append(sp(6))
story.append(bullet("<b>Main worsening factors</b>: DIC + Acidosis + Hypothermia"))
story.append(sp(10))
# TIC
story.append(h2("Trauma-Induced Coagulopathy (TIC)"))
story.append(bullet("<b>TIC</b>: Imbalance between clotting, anticoagulation, and fibrinolysis β from haemorrhage + tissue injury"))
story.append(bullet("<b>ATC (Acute Traumatic Coagulopathy)</b>: Early endogenous coagulopathy driven by tissue injury + shock; associated with increased mortality in polytrauma"))
story.append(bullet("ATC features: bleeding from non-surgical sites (mucosa, serosa) + hypothermia + acidosis + haemodilution"))
story.append(sp(6))
story.append(h3("Risk Factors for Life-Threatening Coagulopathy"))
t = make_table(
['Parameter', 'Threshold'],
[
['Injury Severity Score', '> 25'],
['Systolic BP', '< 70 mmHg'],
['pH', '< 7.10'],
['Body temperature', '< 34Β°C'],
],
col_widths=[8.5*cm, 8.5*cm]
)
story.append(t)
story.append(sp(8))
story.append(h3("Lethal Triad"))
lt_data = [['1. Hypothermia (<36Β°C)', '2. Metabolic Acidosis', '3. Progressive Coagulopathy']]
lt = Table(lt_data, colWidths=[5.67*cm, 5.67*cm, 5.66*cm])
lt.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), colors.HexColor('#c62828')),
('TEXTCOLOR', (0,0), (-1,-1), colors.white),
('FONTNAME', (0,0), (-1,-1), 'Helvetica-Bold'),
('FONTSIZE', (0,0), (-1,-1), 9.5),
('ALIGN', (0,0), (-1,-1), 'CENTER'),
('TOPPADDING', (0,0), (-1,-1), 7),
('BOTTOMPADDING', (0,0), (-1,-1), 7),
('BOX', (0,0), (-1,-1), 1.5, colors.HexColor('#b71c1c')),
('INNERGRID', (0,0), (-1,-1), 0.5, colors.HexColor('#ef9a9a')),
]))
story.append(lt)
story.append(sp(6))
story.append(bullet("Factors fall in order: <b>Fibrinogen β Prothrombin β Factor V β Factor VII β Platelets</b>"))
story.append(bullet("Critical thresholds: Fibrinogen < 1.5-2 g/L | Platelets < 50,000/cumm β increased bleeding"))
story.append(sp(10))
# Clinical Features
story.append(h2("Clinical Features of Haemorrhage"))
story.append(bullet("Pallor, thirst, tachycardia, hypotension, air hunger, nausea"))
story.append(bullet("Cold clammy skin, dry mouth, oliguria/anuria"))
story.append(bullet("Rapid thready pulse"))
story.append(sp(6))
story.append(h3("Signs of Significant Blood Loss (BOX)"))
box_data = [
['BP < 100 mmHg'],
['Pulse > 100/min; Systolic drop > 10 mmHg'],
['Diastolic BP drop on sitting/standing'],
['Shock index (Pulse rate / Blood pressure) > 1'],
]
bxt = Table(box_data, colWidths=[17*cm])
bxt.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), colors.HexColor('#fff8e1')),
('TEXTCOLOR', (0,0), (-1,-1), colors.HexColor('#333333')),
('FONTNAME', (0,0), (-1,-1), 'Helvetica'),
('FONTSIZE', (0,0), (-1,-1), 9.5),
('LEFTPADDING', (0,0), (-1,-1), 10),
('TOPPADDING', (0,0), (-1,-1), 3),
('BOTTOMPADDING', (0,0), (-1,-1), 3),
('BOX', (0,0), (-1,-1), 1, colors.HexColor('#f9a825')),
('LINEBELOW', (0,0), (-1,-2), 0.3, colors.HexColor('#f9a825')),
]))
story.append(bxt)
story.append(sp(4))
story.append(note("Tachycardia is NOT a reliable indicator of haemorrhage alone"))
story.append(sp(10))
# Haemorrhagic Shock Classification
story.append(h2("Classification of Haemorrhagic Shock"))
t = make_table(
['Class', 'Blood Loss', 'Volume', 'Features'],
[
['I', '< 15%', '< 750 mL', 'Normal'],
['II', '15-30%', '750-1500 mL', 'Pallor, thirst, tachycardia, pulse > 100, systolic BP drop'],
['III', '30-40%', '1500-2000 mL', 'Hypotension, tachycardia, oliguria, confusion'],
['IV', '> 40%', '> 2000 mL', 'Rapid pulse, low BP, anuria, unconsciousness, MODS'],
],
col_widths=[1.8*cm, 2.5*cm, 3.2*cm, 9.5*cm]
)
story.append(t)
story.append(sp(10))
# Measurement of Blood Loss
story.append(h2("Measurement of Blood Loss"))
story.append(bullet("Closed tibial fracture: 500 mL"))
story.append(bullet("Closed femoral fracture: 500-2000 mL"))
story.append(bullet("<b>Ragins factor</b>: Swab weight difference Γ 1.5 (small wounds); Γ 2 (large wounds/operations)"))
story.append(bullet("Other: Hb%, PCV, CVP/PCWP, radioiodide technique, microhaematocrit"))
story.append(bullet("Imaging: U/S abdomen, Doppler, angiogram, chest X-ray, CT scan"))
story.append(sp(10))
# Treatment
story.append(h2("Treatment of Haemorrhage"))
story.append(h3("Immediate Resuscitation (ABC)"))
story.append(bullet("Airway / Breathing / Circulation β Oβ 15 L/min"))
story.append(bullet("Two large-bore IV cannulae; blood for grouping and cross-matching"))
story.append(bullet("Warmed fluids: fresh plasma + platelets + blood in <b>1:1:1 ratio</b>"))
story.append(bullet("Warm normal saline / Ringer's lactate until blood ready"))
story.append(sp(5))
story.append(h3("Cautions with IV Fluids"))
story.append(bullet("Crystalloids: dilutional coagulopathy + no Oβ carrying capacity + hyperchloraemic acidosis"))
story.append(bullet("Unwarmed fluids: hypothermia"))
story.append(bullet("Isotonic/hypotonic/colloid solutions: leak into interstitium, only partial stays intravascular"))
story.append(sp(5))
story.append(h3("Intra-Osseous (IO) Access"))
story.append(bullet("Needle perpendicularly into bone under LA; free flow confirms entry"))
story.append(bullet("Can be kept for 48 hours; then safe IV access must be obtained"))
story.append(bullet("Complications: osteomyelitis, extravasation, cellulitis, compartment syndrome, fracture (in children)"))
story.append(sp(5))
story.append(h3("Control of Haemorrhage"))
story.append(bullet("<b>External</b>: Pressure, Packing, Position, Rest; ligation, suturing, vessel anastomosis; topical agents (oxycel, adrenaline-soaked gauze, bone wax, collagen, thrombin)"))
story.append(bullet("<b>Venous</b>: Elevation, ligation, pressure bandaging"))
story.append(bullet("<b>Internal/intra-abdominal</b>: Laparotomy, damage control surgery (especially liver injury), therapeutic embolisation"))
story.append(sp(5))
story.append(h3("On-table Management: HELP Mnemonic"))
help_data = [
['H', 'Haemostasis', 'Pressure, packing'],
['E', 'Exposure', 'Proper dissection, extend incision, convert to open if laparoscopic'],
['L', 'Localize', 'Bleeding point specifically and accurately'],
['P', 'Precisely act', 'Bipolar, clips, suture, glue; Call for HELP'],
]
helpt = Table(help_data, colWidths=[1*cm, 3.5*cm, 12.5*cm])
helpt.setStyle(TableStyle([
('BACKGROUND', (0,0), (0,-1), colors.HexColor('#1a3c6e')),
('TEXTCOLOR', (0,0), (0,-1), colors.white),
('FONTNAME', (0,0), (0,-1), 'Helvetica-Bold'),
('FONTNAME', (0,1), (1,-1), 'Helvetica-Bold'),
('FONTSIZE', (0,0), (-1,-1), 9),
('ROWBACKGROUNDS', (0,0), (-1,-1), [colors.HexColor('#e8f0fe'), colors.HexColor('#f5f8ff')]),
('GRID', (0,0), (-1,-1), 0.4, colors.HexColor('#aaaaaa')),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('ALIGN', (0,0), (0,-1), 'CENTER'),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
]))
story.append(helpt)
story.append(sp(6))
story.append(h3("Additional Therapies"))
story.append(bullet("Cryoprecipitate + Recombinant activated Factor VII"))
story.append(bullet("Prothrombin complex concentrate (PCC) β avoids packed cell and platelet transfusions"))
story.append(bullet("Monitoring: hourly urine output, haemodynamic stability, lactic acid, base deficit, fibrinogen, platelet, INR, APTT, ABG, liver/renal function"))
story.append(note("Blood transfusion only required if Hb < 8 g% (each unit raises Hb by ~1%)"))
story.append(PageBreak())
# ========================================================
# SECTION 2: BLOOD TRANSFUSION
# ========================================================
story.append(h1("2. BLOOD TRANSFUSION"))
story.append(sp(8))
story.append(h2("Indications"))
story.append(bullet("Acute blood loss β₯ 15% of total body volume in healthy individuals (trauma: liver, spleen, kidney, GIT, fractures, haemothorax)"))
story.append(bullet("Major surgeries: APR, thoracic, hepatobiliary"))
story.append(bullet("Burns, septicaemia"))
story.append(bullet("Prophylactic pre-surgery"))
story.append(sp(5))
type_data = [
['Whole blood', 'Acute blood loss'],
['Packed cells', 'Chronic anaemia'],
['Blood fractions', 'ITP, haemophilias'],
]
tt = Table(type_data, colWidths=[5*cm, 12*cm])
tt.setStyle(TableStyle([
('BACKGROUND', (0,0), (0,-1), colors.HexColor('#2e6da4')),
('TEXTCOLOR', (0,0), (0,-1), colors.white),
('FONTNAME', (0,0), (0,-1), 'Helvetica-Bold'),
('FONTNAME', (1,0), (1,-1), 'Helvetica'),
('FONTSIZE', (0,0), (-1,-1), 9.5),
('ROWBACKGROUNDS', (1,0), (1,-1), [colors.HexColor('#e8f4fd'), colors.HexColor('#f5f5f5'), colors.HexColor('#e8f4fd')]),
('GRID', (0,0), (-1,-1), 0.4, colors.HexColor('#aaaaaa')),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 8),
]))
story.append(tt)
story.append(sp(8))
story.append(h2("Donor Criteria"))
story.append(bullet("No serious disease (HIV 1/2, hepatitis, malaria)"))
story.append(bullet("Weight > 45 kg"))
story.append(sp(8))
story.append(h2("Collection & Storage"))
story.append(bullet("Collected in sac with 75 mL CPD (Citrate Phosphate Dextrose) β stored at 4Β°C"))
story.append(bullet("Shelf life: CPD = 3 weeks; <b>CPDA = 5 weeks</b>"))
story.append(bullet("<b>SAG-M</b> (Sodium chloride, Adenine, Glucose anhydrate, Mannitol) = stored at 2-6Β°C for <b>5 weeks</b>"))
story.append(sp(6))
story.append(h3("Changes in Stored Blood"))
t = make_table(
['Component', 'What Happens'],
[
['RBCs', 'Last 3 weeks; lose Oβ-releasing ability after 7 days'],
['WBCs', 'Destroyed rapidly'],
['Platelets', 'Reduced within 24 hours'],
['Clotting factors', 'Labile; fall quickly within 1-2 days'],
],
col_widths=[4*cm, 13*cm]
)
story.append(t)
story.append(sp(6))
story.append(bullet("540 mL transfused in 4 hours (40 drops/min) using filtered drip set"))
story.append(bullet("Iron overload: ~350 mg iron/unit; corrected by <b>desferrioxamine infusion</b>"))
story.append(sp(10))
story.append(h2("Blood Components / Fractions"))
t = make_table(
['Component', 'Preparation/Storage', 'Key Contents', 'Indications & Notes'],
[
['Packed Red Cells', 'Centrifuged whole blood; Hb ~30%, haematocrit ~70%', 'RBCs', 'Chronic anaemia'],
['FFP\n(Fresh Frozen Plasma)', 'Rapidly frozen, stored at -40Β°C; lasts 2 years', 'All coagulation factors', 'Severe liver disease, warfarin reversal, DIC, massive transfusion\nDose: 15 mL/kg'],
['Cryoprecipitate', 'FFP thawed at +4Β°C; stored at -40Β°C for years', 'Factor VIII + Fibrinogen (rich)', 'Low fibrinogen, Factor VIII deficiency, vWF deficiency\nDose: 150 mL'],
['Platelet Concentrate', 'Centrifuge of platelet-rich plasma (1200-1500g, 15-20 min)', 'Platelets', 'Thrombocytopaenia, aspirin/clopidogrel-induced haemorrhage\nDose: 0.1 unit/kg; transfuse when <20,000/cumm or active bleeding\n4Β°C: 48 hrs; Room temp: 5 days; raises count ~10,000/cumm/hr'],
['Single Donor Platelet', 'Apheresis; 3Γ10ΒΉΒΉ platelets in 200 mL plasma', 'Platelets', 'Equivalent to 8 units random donor platelet'],
['PCC\n(Prothrombin Complex)', 'Derived from pooled plasma', 'Factors II, IX, X (+some VII)', 'Uncontrolled warfarin; haemophilia reversal; avoids packed cell + platelet transfusions'],
],
col_widths=[3.3*cm, 4*cm, 3.2*cm, 6.5*cm]
)
story.append(t)
story.append(sp(10))
story.append(h2("SAG-M Blood"))
story.append(bullet("Features: Good RBC viability; useful in anaemias; <b>devoid of proteins</b>"))
story.append(bullet("Every 4 units SAG-M β give 1 whole blood"))
story.append(bullet("Later: every 2 units SAG-M β give 1 unit (400 mL) of 4.5% human albumin"))
story.append(bullet("Check coagulation status and platelet count regularly"))
story.append(sp(10))
story.append(h2("Plasma Expanders"))
t = make_table(
['Agent', 'MW', 'Features'],
[
['Human Albumin (4-4.5%)', '-', '1 g binds 14 mL water; expensive; used in cirrhosis, burns, nephrotic syndrome, ovarian hyperstimulation'],
['Dextran 40 (Rheomacrodex)', '40,000', 'Best for immediate volume; rapidly excreted; prevents renal sludging; short-acting'],
['Dextran 70/110', '70,000-110,000', 'Less effective but longer acting'],
['Gelatin (Haemaccel)', '30,000', '3.4-4% solution; after 4 hrs only 30% intravascular'],
['Hydroxyethyl Starch', '-', 'Good expander; lasts 6 hours'],
],
col_widths=[4.5*cm, 2.5*cm, 10*cm]
)
story.append(t)
story.append(sp(5))
story.append(h3("Precautions with Dextrans"))
story.append(bullet("Take blood sample for group/cross-match <b>BEFORE</b> dextran (interferes with rouleaux formation)"))
story.append(bullet("Interferes with platelet function β may precipitate abnormal bleeding"))
story.append(bullet("Total volume should <b>not exceed 1,000 mL</b>"))
story.append(bullet("Can cause hyperchloraemic acidosis + central pontine myelinolysis"))
story.append(sp(10))
story.append(h2("Complications of Blood Transfusion"))
comp_data = [
['1', 'Incompatibility / transfusion reactions', 'Most feared'],
['2', 'Infection transmission', 'HIV, Hepatitis B/C, malaria, CMV, syphilis'],
['3', 'Iron overload', 'After repeated transfusions; treat with desferrioxamine'],
['4', 'Dilutional coagulopathy', '-'],
['5', 'Hypocalcaemia', 'Citrate binds calcium'],
['6', 'Hyperkalaemia', '-'],
['7', 'Hypothermia', 'Unwarmed blood'],
['8', 'TGVH (Transfusion Graft-vs-Host)', 'Donor lymphocytes vs recipient tissue; common in immunosuppressed; 90% mortality'],
['9', 'ARDS + DIC + Congestive cardiac failure', '-'],
['10', 'Autologous transfusion', 'Patient\'s own blood; avoids most complications; used in elective surgeries'],
]
ct = Table(comp_data, colWidths=[0.8*cm, 6.5*cm, 9.7*cm])
ct.setStyle(TableStyle([
('BACKGROUND', (0,0), (0,-1), colors.HexColor('#c62828')),
('TEXTCOLOR', (0,0), (0,-1), colors.white),
('FONTNAME', (0,0), (0,-1), 'Helvetica-Bold'),
('FONTSIZE', (0,0), (-1,-1), 9),
('ROWBACKGROUNDS', (1,0), (2,-1), [colors.HexColor('#fff5f5'), colors.white]),
('GRID', (0,0), (-1,-1), 0.4, colors.HexColor('#aaaaaa')),
('VALIGN', (0,0), (-1,-1), 'TOP'),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 5),
('ALIGN', (0,0), (0,-1), 'CENTER'),
]))
story.append(ct)
story.append(PageBreak())
# ========================================================
# SECTION 3: TOURNIQUETS
# ========================================================
story.append(h1("3. TOURNIQUETS"))
story.append(sp(8))
story.append(body("<b>Tourner</b> = 'to turn' (Greek). Purpose: Cut off arterial supply temporarily to create a bloodless surgical field."))
story.append(sp(6))
story.append(h2("Types"))
t = make_table(
['Type', 'Description'],
[
['Rubber tourniquet', 'Simple red rubber catheter; used for drawing blood, IV access'],
['Pneumatic tourniquet', 'Used in limbs; gives arterial pressure; most common surgical type'],
['Esmarch rubber bandage', 'Exsanguinates limb before applying tourniquet cuff'],
],
col_widths=[5*cm, 12*cm]
)
story.append(t)
story.append(sp(8))
story.append(h2("Uses"))
story.append(bullet("Surgical bloodless field"))
story.append(bullet("IV access and IV sampling"))
story.append(bullet("Diagnostic tests: varicose veins, ITP, carpal tunnel syndrome, tetany"))
story.append(bullet("First aid in limb bleeding, snakebite (controversial)"))
story.append(bullet("Small procedures in fingers and toes"))
story.append(sp(8))
story.append(h2("Complications"))
story.append(bullet("<b>Tourniquet palsy</b>: Neuropraxia (radial nerve in upper limb most common)"))
story.append(bullet("Crush injury to muscles in thigh"))
story.append(bullet("Reperfusion injury"))
story.append(bullet("Skin blistering, Infection"))
story.append(bullet("Necrosis (if used inappropriately in fingers/toes)"))
story.append(PageBreak())
# ========================================================
# SECTION 4: DIC
# ========================================================
story.append(h1("4. DISSEMINATED INTRAVASCULAR COAGULATION (DIC)"))
story.append(sp(8))
story.append(body("<b>Definition</b>: Widespread intravascular coagulation causing formation and consumption of platelets and clotting factors β thrombosis + breakdown tissue + further bleeding"))
story.append(sp(8))
story.append(h2("Causes"))
t = make_table(
['Category', 'Examples'],
[
['Trauma/Surgery (most common)', 'Major surgery; tissue thromboplastin release'],
['Burns', '-'],
['Infection', 'Meningococcal, malarial, Gram-negative septicaemia, acute pancreatitis'],
['Obstetric', 'Septic abortion, abruption, retained dead foetus, amniotic fluid embolism'],
['Malignancy', 'Ca pancreas, prostate, acute promyelocytic leukaemia'],
],
col_widths=[5.5*cm, 11.5*cm]
)
story.append(t)
story.append(sp(8))
story.append(h2("Management of DIC"))
story.append(bullet("Treat underlying cause"))
story.append(bullet("FFP: replenishes all clotting factors"))
story.append(bullet("Cryoprecipitate: if fibrinogen low"))
story.append(bullet("Platelet transfusion"))
story.append(bullet("<b>Heparin</b>: Controversial; used in chronic DIC, DIC with purpura, obstetric DIC, cancer-induced DIC, acute antiphospholipid antibody syndrome"))
story.append(bullet("EACA (Epsilon aminocaproic acid) and Tranexamic acid: questionable benefits"))
story.append(PageBreak())
# ========================================================
# SECTION 5: COAGULATION
# ========================================================
story.append(h1("5. MECHANISM OF BLOOD COAGULATION (HAEMOSTASIS)"))
story.append(sp(8))
story.append(h2("Primary Haemostasis"))
steps = [
"Vessel injury β Platelet adhesion to injured vessel wall",
"ADP released β More platelet aggregation",
"Activated platelets release Thromboxane Aβ β Further adhesion & aggregation",
"Fibrinogen binds to activated platelet glycoprotein IIb/IIIa receptors",
"Clot retraction β Stable clot",
]
for i, s in enumerate(steps, 1):
story.append(Paragraph(f"<b>{i}.</b> {s}", bullet_style))
story.append(sp(8))
story.append(h2("Coagulation Pathways"))
story.append(bullet("<b>Intrinsic pathway</b> β in vitro; triggered by contact activation"))
story.append(bullet("<b>Extrinsic pathway</b> β in vivo; triggered by tissue damage"))
story.append(bullet("Both converge β Factor X activation β Prothrombin β Thrombin β Fibrinogen β Fibrin β Stable clot"))
story.append(sp(4))
story.append(note("Vitamin K-dependent factors (synthesised in liver): II, VII, IX, X (and Proteins C & S)"))
story.append(sp(8))
story.append(h2("Blood Clotting Factors"))
t = make_table(
['Factor', 'Name'],
[
['I', 'Fibrinogen'],
['II', 'Prothrombin'],
['III', 'Thromboplastin'],
['IV', 'Ionic calcium'],
['V', 'Hereditary labile factor / Proaccelerin'],
['VII', 'Proconvertin / SPCA (Serum Prothrombin Conversion Accelerator)'],
['VIII', 'Antihemophilic factor'],
['IX', 'Plasma thromboplastin component (Christmas factor)'],
['X', 'Stuart-Prower factor'],
['XI', 'Plasma thromboplastin antecedent'],
['XII', 'Hageman factor'],
['XIII', 'Fibrin-stabilising factor'],
['XIV', 'Prekallikrein'],
['XV', 'Kallikrein'],
['XVI', 'Platelet factor'],
],
col_widths=[2*cm, 15*cm]
)
story.append(t)
story.append(PageBreak())
# ========================================================
# SECTION 6: BLEEDING DISORDERS
# ========================================================
story.append(h1("6. BLEEDING DISORDERS"))
story.append(sp(8))
story.append(h2("Haemophilia A"))
t = make_table(
['Feature', 'Detail'],
[
['Deficiency', 'Factor VIII C (antihemophilic factor)'],
['Inheritance', 'X-linked recessive β males and homozygous females'],
['Presentation', 'Recurrent haemarthroses; NO petechiae/ecchymoses'],
['Tests', 'Bleeding time: NORMAL | Coagulation time: PROLONGED'],
['Treatment', 'Replacement of Factor VIII'],
],
col_widths=[4*cm, 13*cm]
)
story.append(t)
story.append(sp(8))
story.append(h2("Von Willebrand Disease"))
t = make_table(
['Feature', 'Detail'],
[
['Deficiency', 'Larger component of Factor VIII (vWF) β 99%'],
['Inheritance', 'Autosomal dominant'],
['Presentation', 'Spontaneous bleeding from mucous membranes, excessive wound bleeding, severe menorrhagia; haemarthroses NOT common'],
['Tests', 'Bleeding time: normal | Platelet count: normal'],
['Treatment', 'Replacement of specific factors'],
],
col_widths=[4*cm, 13*cm]
)
story.append(t)
story.append(sp(8))
story.append(h2("Haemophilia B (Christmas Disease)"))
t = make_table(
['Feature', 'Detail'],
[
['Deficiency', 'Factor IX (Christmas factor)'],
['Inheritance', 'X-linked autosomal recessive'],
],
col_widths=[4*cm, 13*cm]
)
story.append(t)
story.append(sp(8))
story.append(h2("Comparison Table"))
t = make_table(
['Feature', 'Haemophilia A', 'Haemophilia B', 'vWD'],
[
['Factor deficient', 'VIII', 'IX', 'vWF (part of VIII)'],
['Inheritance', 'X-linked recessive', 'X-linked recessive', 'Autosomal dominant'],
['Haemarthroses', 'Common', 'Similar to A', 'NOT common'],
['Bleeding time', 'Normal', 'Normal', 'Normal'],
['Coagulation time', 'Prolonged', 'Prolonged', 'Normal'],
['Petechiae', 'Absent', 'Absent', 'Can be present'],
],
col_widths=[4.5*cm, 4*cm, 4*cm, 4.5*cm]
)
story.append(t)
story.append(PageBreak())
# ========================================================
# SECTION 7: HIGH-YIELD QUICK POINTS
# ========================================================
story.append(h1("7. HIGH-YIELD EXAM QUICK POINTS"))
story.append(sp(8))
qp = [
('Most common cause of DIC', 'Major surgery'),
('Reactionary haemorrhage timing', '4-6 hours post-op'),
('Secondary haemorrhage timing', '7-14 days post-op'),
('Shock index > 1', 'Significant blood loss'),
('Lethal triad', 'Hypothermia + Acidosis + Coagulopathy'),
('Cryoprecipitate rich in', 'Factor VIII + Fibrinogen'),
('FFP contains', 'All coagulation factors'),
('Tourniquet palsy nerve (upper limb)', 'Radial nerve'),
('Haemophilia A', 'Factor VIII deficiency, X-linked recessive'),
('Haemophilia B', 'Factor IX deficiency (Christmas disease)'),
('Von Willebrand disease', 'vWF deficiency, autosomal dominant'),
('Vitamin K-dependent factors', 'II, VII, IX, X'),
('SAG-M devoid of', 'Proteins'),
('Platelets stored at room temp', 'Up to 5 days'),
('Platelets stored at 4Β°C', 'Up to 48 hours'),
('1 platelet concentrate raises count by', '~10,000/cumm per hour'),
('Transfuse blood when Hb', '< 8 g%'),
('Dextran precaution', 'Take blood sample BEFORE giving (interferes with cross-match)'),
('Max dextran volume', '1,000 mL'),
('CPD shelf life', '3 weeks'),
('CPDA shelf life', '5 weeks'),
('SAG-M storage temperature', '2-6Β°C for 5 weeks'),
('IO access can be kept for', '48 hours'),
('Blood transfusion rate', '40 drops/min (540 mL in 4 hours)'),
('On-table haemorrhage mnemonic', 'HELP (Haemostasis, Exposure, Localize, Precisely act)'),
]
rows_per_table = 13
for i in range(0, len(qp), rows_per_table):
chunk = qp[i:i+rows_per_table]
t = Table([[Paragraph(f"<b>{q}</b>", ParagraphStyle('qk', parent=styles['Normal'], fontSize=9, textColor=colors.HexColor('#1a3c6e'))),
Paragraph(a, ParagraphStyle('qa', parent=styles['Normal'], fontSize=9))] for q, a in chunk],
colWidths=[8*cm, 9*cm])
t.setStyle(TableStyle([
('ROWBACKGROUNDS', (0,0), (-1,-1), [colors.HexColor('#e8f0fe'), colors.white]),
('GRID', (0,0), (-1,-1), 0.3, colors.HexColor('#bbbbbb')),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 8),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
]))
story.append(t)
story.append(sp(6))
doc.build(story)
print("PDF created successfully!")
EOF
show command