Paramedical emergency medical technician completed anatomy
| Term | Meaning |
|---|---|
| Superior / Cranial | Toward the head |
| Inferior / Caudal | Toward the feet |
| Anterior / Ventral | Front of the body |
| Posterior / Dorsal | Back of the body |
| Medial | Toward the midline |
| Lateral | Away from the midline |
| Proximal | Closer to the point of origin/trunk |
| Distal | Further from the point of origin/trunk |
| Superficial | Closer to the surface |
| Deep | Further from the surface |
| Feature | Skeletal | Cardiac | Smooth |
|---|---|---|---|
| Location | Attached to bones | Heart wall | Walls of hollow organs |
| Control | Voluntary | Involuntary | Involuntary |
| Appearance | Striated | Striated | Non-striated |
| Cell shape | Long cylindrical fibers | Branched, intercalated discs | Spindle-shaped |
| Vessel | Wall | Function |
|---|---|---|
| Arteries | Thick, elastic, muscular | Carry blood away from heart (usually oxygenated) |
| Arterioles | Thin | Regulate blood flow to capillaries |
| Capillaries | One cell thick (endothelium) | Exchange O2, CO2, nutrients, waste |
| Venules | Thin | Collect from capillaries |
| Veins | Thin wall, valves | Return blood to heart; contain 60-70% blood volume |
| Gland | Location | Key Hormones | Actions |
|---|---|---|---|
| Hypothalamus | Brain | Releasing/inhibiting hormones, ADH, Oxytocin | Controls pituitary; water balance; uterine contractions |
| Anterior Pituitary | Base of brain | GH, TSH, ACTH, FSH, LH, Prolactin | Controls other glands; growth; reproduction |
| Posterior Pituitary | Base of brain | ADH, Oxytocin | Water reabsorption; contractions |
| Thyroid | Neck | T3, T4 (metabolism), Calcitonin (↓Ca²+) | Metabolic rate; growth; Ca²+ regulation |
| Parathyroid (4) | Posterior thyroid | PTH | ↑Ca²+ in blood (↑bone resorption, ↑renal reabsorption) |
| Adrenal cortex | Above kidneys | Cortisol (stress), Aldosterone (Na/K), Androgens | Stress response; electrolyte balance |
| Adrenal medulla | Above kidneys | Epinephrine, Norepinephrine | Fight or flight (↑HR, ↑BP, bronchodilation) |
| Pancreas | Abdomen | Insulin (↓glucose), Glucagon (↑glucose) | Blood glucose regulation |
| Gonads | Pelvis | Estrogen, Progesterone, Testosterone | Sex characteristics; reproduction |
| Pineal gland | Brain | Melatonin | Sleep-wake cycles |
| # | Name | Type | Function |
|---|---|---|---|
| I | Olfactory | Sensory | Smell |
| II | Optic | Sensory | Vision |
| III | Oculomotor | Motor | Most eye movements; pupillary constriction |
| IV | Trochlear | Motor | Superior oblique (eye down-in movement) |
| V | Trigeminal | Mixed | Face sensation; mastication |
| VI | Abducens | Motor | Lateral rectus (eye abduction) |
| VII | Facial | Mixed | Facial expression; taste (anterior 2/3 tongue); lacrimal/salivary glands |
| VIII | Vestibulocochlear | Sensory | Hearing + balance |
| IX | Glossopharyngeal | Mixed | Taste (posterior 1/3); swallowing; parotid gland |
| X | Vagus | Mixed | Parasympathetic to thorax/abdomen; swallowing/speech |
| XI | Accessory | Motor | SCM and trapezius |
| XII | Hypoglossal | Motor | Tongue movement |
Make a quick reference PDF poster of vital structures and landmarks
mkdir -p /tmp/workspace/emt-anatomy-poster && ls /tmp/workspace/
~/emt-anatomy-poster/create_poster.py
from reportlab.lib.pagesizes import A1, landscape
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer,
HRFlowable, KeepTogether
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from reportlab.platypus import Frame, PageTemplate
from reportlab.pdfgen import canvas
from reportlab.platypus.doctemplate import BaseDocTemplate, PageTemplate
from reportlab.platypus import Frame
import os
OUTPUT = "/tmp/workspace/emt-anatomy-poster/EMT_Anatomy_Quick_Reference.pdf"
# ── Colour palette ───────────────────────────────────────────────────────────
C_HEADER = colors.HexColor("#1B3A6B") # deep navy
C_RED = colors.HexColor("#C0392B") # danger red
C_ORANGE = colors.HexColor("#D35400") # warning orange
C_GREEN = colors.HexColor("#1A7A4A") # clinical green
C_BLUE = colors.HexColor("#1F6BAE") # mid blue
C_PURPLE = colors.HexColor("#6C3483") # purple
C_TEAL = colors.HexColor("#148F77") # teal
C_DARK_GRAY = colors.HexColor("#2C3E50")
C_MID_GRAY = colors.HexColor("#7F8C8D")
C_LIGHT_BG = colors.HexColor("#EAF2FB") # very light blue bg
C_YELLOW_BG = colors.HexColor("#FEF9E7")
C_GREEN_BG = colors.HexColor("#EAFAF1")
C_RED_BG = colors.HexColor("#FDEDEC")
C_WHITE = colors.white
C_ROW_ALT = colors.HexColor("#F2F3F4")
PAGE_W, PAGE_H = landscape(A1) # ~1189 x 841 pt
MARGIN = 0.8*cm
# ── Style helpers ─────────────────────────────────────────────────────────────
def make_styles():
base = getSampleStyleSheet()
def ps(name, parent="Normal", **kw):
return ParagraphStyle(name, parent=base[parent], **kw)
title = ps("PTitle", fontSize=28, textColor=C_WHITE, alignment=TA_CENTER,
fontName="Helvetica-Bold", leading=34, spaceAfter=2)
sub = ps("PSub", fontSize=11, textColor=C_WHITE, alignment=TA_CENTER,
fontName="Helvetica", leading=14)
sh = ps("SH", fontSize=9, textColor=C_WHITE, alignment=TA_CENTER,
fontName="Helvetica-Bold", leading=11)
cell = ps("Cell", fontSize=7.5, textColor=C_DARK_GRAY,
fontName="Helvetica", leading=10, spaceAfter=0)
cellb = ps("CellB", fontSize=7.5, textColor=C_DARK_GRAY,
fontName="Helvetica-Bold", leading=10)
warn = ps("Warn", fontSize=7.5, textColor=C_RED,
fontName="Helvetica-Bold", leading=10)
small = ps("Small", fontSize=6.8, textColor=C_MID_GRAY,
fontName="Helvetica", leading=9)
footer = ps("Footer", fontSize=7, textColor=C_WHITE, alignment=TA_CENTER,
fontName="Helvetica", leading=9)
return dict(title=title, sub=sub, sh=sh, cell=cell, cellb=cellb,
warn=warn, small=small, footer=footer)
S = make_styles()
def hdr(text, bg=C_HEADER):
return Paragraph(text, S["sh"])
def cell(text, bold=False, warn=False, color=None):
style = S["warn"] if warn else (S["cellb"] if bold else S["cell"])
if color:
style = ParagraphStyle("tmp", parent=style, textColor=color)
return Paragraph(text, style)
def small(text):
return Paragraph(text, S["small"])
# ── Table builders ────────────────────────────────────────────────────────────
def section_style(header_bg=C_HEADER, row_bg=C_WHITE, alt_bg=C_ROW_ALT):
return TableStyle([
("BACKGROUND", (0,0), (-1,0), header_bg),
("TEXTCOLOR", (0,0), (-1,0), C_WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 7.5),
("ALIGN", (0,0), (-1,0), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [row_bg, alt_bg]),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 7),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BDC3C7")),
("TOPPADDING", (0,0), (-1,-1), 2.5),
("BOTTOMPADDING",(0,0),(-1,-1), 2.5),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING",(0,0), (-1,-1), 4),
("ROWSPAN", (0,0), (-1,0), 1),
])
# ════════════════════════════════════════════════════════════════════════
# SECTION BUILDERS (each returns a KeepTogether flowable)
# ════════════════════════════════════════════════════════════════════════
def make_airway(w):
data = [
[cell("Structure", bold=True), cell("Location / Note", bold=True), cell("EMT Significance", bold=True)],
[cell("Epiglottis"), cell("Base of tongue / larynx"), cell("Covers trachea during swallowing; visualised in laryngoscopy")],
[cell("Thyroid cartilage"), cell("Anterior neck (Adam's apple)"),cell("Landmark for cricothyroid membrane below it")],
[cell("Cricoid cartilage"), cell("Below thyroid cartilage"), cell("Only complete ring; Sellick's manoeuvre applied here")],
[cell("Cricothyroid membrane"), cell("Between thyroid & cricoid"), cell("Emergency surgical airway site (cric)", warn=True)],
[cell("Trachea"), cell("C6 to T4–5; ~12 cm"), cell("C-rings open posteriorly; carina at T4–5")],
[cell("Carina"), cell("Tracheal bifurcation at T4–5"), cell("Right mainstem bronchus more vertical → FB/tube migration")],
[cell("Right bronchus"), cell("Shorter, wider, steeper"), cell("Endobronchial intubation risk; FB aspiration site")],
[cell("Alveoli"), cell("~300 million; type I & II cells"),cell("Gas exchange; surfactant prevents collapse (type II)")],
]
t = Table(data, colWidths=[w*0.22, w*0.35, w*0.43])
style = section_style(C_BLUE, C_WHITE, C_LIGHT_BG)
style.add("BACKGROUND", (0,4), (-1,4), colors.HexColor("#FADBD8"))
t.setStyle(style)
return KeepTogether([
Table([[cell("AIRWAY ANATOMY & LANDMARKS", bold=True, color=C_WHITE)]],
colWidths=[w], style=TableStyle([("BACKGROUND",(0,0),(-1,-1),C_BLUE),
("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4)])),
t])
def make_cardio(w):
data = [
[cell("Chamber/Valve", bold=True), cell("Connects", bold=True), cell("Key Point", bold=True)],
[cell("Right Atrium"), cell("Receives SVC + IVC"), cell("Contains SA node; receives deoxygenated blood")],
[cell("Tricuspid valve"),cell("RA → RV"), cell("3 cusps; held by chordae tendineae")],
[cell("Right Ventricle"),cell("Pumps → pulmonary artery"), cell("Pulmonary circulation (low pressure)")],
[cell("Left Atrium"), cell("Receives 4 pulmonary veins"), cell("Oxygenated blood from lungs")],
[cell("Mitral valve"), cell("LA → LV"), cell("2 cusps (bicuspid); most common valve diseased")],
[cell("Left Ventricle"), cell("Pumps → Aorta"), cell("Thickest wall; systemic circulation (high pressure)")],
[cell("SA Node"), cell("Right atrium wall"), cell("Primary pacemaker: 60–100 bpm", warn=True)],
[cell("AV Node"), cell("Atrio-ventricular junction"), cell("Delays impulse 0.1 s; backup 40–60 bpm")],
[cell("Bundle of His / BB"), cell("IVS → Purkinje fibers"), cell("Rapid conduction; backup 20–40 bpm")],
]
t = Table(data, colWidths=[w*0.25, w*0.32, w*0.43])
t.setStyle(section_style(C_RED, C_WHITE, C_RED_BG))
return KeepTogether([
Table([[cell("CARDIOVASCULAR: CHAMBERS, VALVES & CONDUCTION", bold=True, color=C_WHITE)]],
colWidths=[w], style=TableStyle([("BACKGROUND",(0,0),(-1,-1),C_RED),
("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4)])),
t])
def make_pulse_shock(w):
left_data = [
[cell("Pulse Site", bold=True), cell("Location", bold=True), cell("Use", bold=True)],
[cell("Radial"), cell("Wrist, lateral"), cell("Routine; absent → SBP < 80 mmHg", warn=True)],
[cell("Brachial"), cell("Antecubital fossa"), cell("BP in children; absent → SBP < 70 mmHg")],
[cell("Carotid"), cell("Lateral to trachea, neck"), cell("CPR check; absent → SBP < 60 mmHg", warn=True)],
[cell("Femoral"), cell("Inguinal crease, midpoint"), cell("Large bore IV; absent → SBP < 70 mmHg")],
[cell("Popliteal"), cell("Posterior knee"), cell("Lower limb perfusion")],
[cell("Dorsalis pedis"), cell("Dorsum of foot"), cell("Distal perfusion check")],
[cell("Post. tibial"), cell("Posterior medial malleolus"), cell("Distal perfusion check")],
]
lt = Table(left_data, colWidths=[w*0.22, w*0.35, w*0.43])
lt.setStyle(section_style(C_RED, C_WHITE, C_RED_BG))
right_data = [
[cell("Shock Type", bold=True), cell("Mechanism", bold=True), cell("Signs", bold=True)],
[cell("Hypovolaemic"), cell("↓ blood/fluid volume"), cell("↑HR, ↓BP, cool/pale/clammy skin")],
[cell("Cardiogenic"), cell("Heart pump failure"), cell("↑HR, ↓BP, crackles, JVD, oedema")],
[cell("Distributive"), cell("Vasodilation (sepsis/anaphylaxis/neuro)"), cell("Warm flushed skin (early sepsis/anaphylaxis)")],
[cell("Neurogenic"), cell("T1–T4 SCI; sympathetic loss"), cell("Bradycardia + hypotension (warm skin)", warn=True)],
[cell("Obstructive"), cell("PE, tamponade, tension PTX"), cell("JVD + ↓BP; tension → tracheal deviation")],
]
rt = Table(right_data, colWidths=[w*0.22, w*0.38, w*0.40])
rt.setStyle(section_style(C_ORANGE, C_WHITE, C_YELLOW_BG))
return KeepTogether([
Table([[
Table([[cell("PULSE SITES & SHOCK THRESHOLDS", bold=True, color=C_WHITE)]],
colWidths=[w*0.5-3], style=TableStyle([("BACKGROUND",(0,0),(-1,-1),C_RED),
("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4)])),
Table([[cell("SHOCK CLASSIFICATION", bold=True, color=C_WHITE)]],
colWidths=[w*0.5-3], style=TableStyle([("BACKGROUND",(0,0),(-1,-1),C_ORANGE),
("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4)])),
]], colWidths=[w*0.5, w*0.5],
style=TableStyle([("TOPPADDING",(0,0),(-1,-1),0),("BOTTOMPADDING",(0,0),(-1,-1),0),
("LEFTPADDING",(0,0),(-1,-1),0),("RIGHTPADDING",(0,0),(-1,-1),0)])),
Table([[lt, rt]], colWidths=[w*0.5, w*0.5],
style=TableStyle([("VALIGN",(0,0),(-1,-1),"TOP"),
("TOPPADDING",(0,0),(-1,-1),0),("BOTTOMPADDING",(0,0),(-1,-1),0),
("LEFTPADDING",(0,0),(-1,-1),0),("RIGHTPADDING",(0,0),(-1,-1),2)])),
])
def make_spinal(w):
data = [
[cell("Level", bold=True), cell("Structures Supplied", bold=True), cell("Injury Consequence", bold=True)],
[cell("C3–C5"), cell("Phrenic nerve → Diaphragm"), cell("Respiratory arrest ('C3,4,5 keeps diaphragm alive')", warn=True)],
[cell("C5–C6"), cell("Deltoid, biceps, wrist extensors"), cell("Arm weakness; some hand function lost")],
[cell("C7–C8"), cell("Triceps, finger flexors/extensors"), cell("Hand function impaired")],
[cell("T1–T4"), cell("Sympathetic chain, upper limbs"), cell("Neurogenic shock (brady + hypotension)", warn=True)],
[cell("T4"), cell("Nipple line dermatome"), cell("Sensory level reference landmark")],
[cell("T10"), cell("Umbilicus dermatome"), cell("Sensory level reference landmark")],
[cell("L1"), cell("Inguinal region"), cell("Sensory level reference")],
[cell("L2–L4"), cell("Quadriceps, hip flexors"), cell("Walking impaired; bowel/bladder intact")],
[cell("S2–S4"), cell("Perineum, bladder, bowel"), cell("Cauda equina → bowel/bladder dysfunction", warn=True)],
]
t = Table(data, colWidths=[w*0.15, w*0.40, w*0.45])
style = section_style(C_PURPLE, C_WHITE, colors.HexColor("#F5EEF8"))
style.add("BACKGROUND", (0,1), (-1,1), colors.HexColor("#FADBD8"))
style.add("BACKGROUND", (0,2), (-1,2), colors.HexColor("#F5EEF8"))
style.add("BACKGROUND", (0,8), (-1,8), colors.HexColor("#FDEDEC"))
t.setStyle(style)
return KeepTogether([
Table([[cell("SPINAL CORD LEVELS & CLINICAL CONSEQUENCES", bold=True, color=C_WHITE)]],
colWidths=[w], style=TableStyle([("BACKGROUND",(0,0),(-1,-1),C_PURPLE),
("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4)])),
t])
def make_burns(w):
left_data = [
[cell("Degree", bold=True), cell("Layers", bold=True), cell("Appearance", bold=True), cell("Pain", bold=True)],
[cell("1st (Superficial)"), cell("Epidermis only"), cell("Red, dry"), cell("Painful")],
[cell("2nd (Partial thickness)"),cell("Epidermis + part dermis"), cell("Blisters, moist"), cell("Very painful", warn=True)],
[cell("3rd (Full thickness)"), cell("All dermis + epidermis"), cell("White/leathery/charred"), cell("Painless (nerve loss)", color=C_MID_GRAY)],
]
lt = Table(left_data, colWidths=[w*0.30, w*0.26, w*0.24, w*0.20])
lt.setStyle(section_style(C_ORANGE, C_WHITE, C_YELLOW_BG))
right_data = [
[cell("Region", bold=True), cell("% BSA", bold=True)],
[cell("Head + Neck"), cell("9%")],
[cell("Each Arm"), cell("9% (each)")],
[cell("Chest (anterior)"), cell("9%")],
[cell("Abdomen (anterior)"), cell("9%")],
[cell("Upper back"), cell("9%")],
[cell("Lower back"), cell("9%")],
[cell("Each Thigh"), cell("9% (each)")],
[cell("Each Lower Leg+Foot"),cell("9% (each)")],
[cell("Perineum"), cell("1%", bold=True)],
[cell("TOTAL"), cell("100%", bold=True)],
]
rt = Table(right_data, colWidths=[w*0.55, w*0.45])
rt.setStyle(section_style(C_ORANGE, C_WHITE, C_YELLOW_BG))
return KeepTogether([
Table([[
Table([[cell("BURNS CLASSIFICATION", bold=True, color=C_WHITE)]],
colWidths=[w*0.5-3], style=TableStyle([("BACKGROUND",(0,0),(-1,-1),C_ORANGE),
("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4)])),
Table([[cell("RULE OF NINES", bold=True, color=C_WHITE)]],
colWidths=[w*0.5-3], style=TableStyle([("BACKGROUND",(0,0),(-1,-1),C_ORANGE),
("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4)])),
]], colWidths=[w*0.5, w*0.5],
style=TableStyle([("TOPPADDING",(0,0),(-1,-1),0),("BOTTOMPADDING",(0,0),(-1,-1),0),
("LEFTPADDING",(0,0),(-1,-1),0),("RIGHTPADDING",(0,0),(-1,-1),0)])),
Table([[lt, rt]], colWidths=[w*0.5, w*0.5],
style=TableStyle([("VALIGN",(0,0),(-1,-1),"TOP"),
("TOPPADDING",(0,0),(-1,-1),0),("BOTTOMPADDING",(0,0),(-1,-1),0),
("LEFTPADDING",(0,0),(-1,-1),0),("RIGHTPADDING",(0,0),(-1,-1),2)])),
])
def make_abdomen(w):
data = [
[cell("Quadrant", bold=True), cell("Key Organs", bold=True), cell("Clinical Alert", bold=True)],
[cell("RUQ"), cell("Liver, gallbladder, right kidney, hepatic flexure"), cell("Hepatic injury → massive haemorrhage; Murphy's sign (cholecystitis)")],
[cell("LUQ"), cell("Stomach, spleen, left kidney, splenic flexure"), cell("Splenic rupture → haemorrhagic shock; Kehr's sign (referred L shoulder pain)")],
[cell("RLQ"), cell("Appendix, cecum, right ovary/tube, right ureter"), cell("McBurney's point tenderness → appendicitis")],
[cell("LLQ"), cell("Sigmoid colon, left ovary/tube, left ureter"), cell("Diverticulitis, ectopic pregnancy, AAA may radiate here")],
[cell("Epigastric"), cell("Stomach, pancreas, aorta"), cell("AAA pulsatile mass; gastric ulcer; pancreatitis radiates to back", warn=True)],
[cell("Periumbilical"),cell("Small bowel, aorta"), cell("Early appendicitis (migrates to RLQ); mesenteric ischaemia")],
]
t = Table(data, colWidths=[w*0.18, w*0.40, w*0.42])
t.setStyle(section_style(C_GREEN, C_WHITE, C_GREEN_BG))
return KeepTogether([
Table([[cell("ABDOMINAL QUADRANTS & CLINICAL ALERTS", bold=True, color=C_WHITE)]],
colWidths=[w], style=TableStyle([("BACKGROUND",(0,0),(-1,-1),C_GREEN),
("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4)])),
t])
def make_cranial_nerves(w):
data = [
[cell("CN#", bold=True), cell("Name", bold=True), cell("Type", bold=True), cell("Function / EMT Use", bold=True)],
[cell("I"), cell("Olfactory"), cell("S"), cell("Smell")],
[cell("II"), cell("Optic"), cell("S"), cell("Vision; pupil afferent")],
[cell("III"), cell("Oculomotor"), cell("M"), cell("Eye movement (most); pupil constriction — blown pupil = uncal herniation", warn=True)],
[cell("IV"), cell("Trochlear"), cell("M"), cell("Eye down-and-in")],
[cell("V"), cell("Trigeminal"), cell("B"), cell("Face sensation; corneal reflex afferent; mastication")],
[cell("VI"), cell("Abducens"), cell("M"), cell("Lateral eye movement")],
[cell("VII"), cell("Facial"), cell("B"), cell("Facial expression; taste anterior 2/3 tongue")],
[cell("VIII"),cell("Vestibulocochlear"), cell("S"), cell("Hearing + balance")],
[cell("IX"), cell("Glossopharyngeal"), cell("B"), cell("Gag reflex (afferent); swallowing; taste posterior 1/3")],
[cell("X"), cell("Vagus"), cell("B"), cell("Parasympathetic heart/gut; ↓HR; gag reflex efferent; vasovagal syncope", warn=True)],
[cell("XI"), cell("Accessory"), cell("M"), cell("SCM + trapezius")],
[cell("XII"), cell("Hypoglossal"), cell("M"), cell("Tongue movement; deviation → lesion side")],
]
t = Table(data, colWidths=[w*0.07, w*0.22, w*0.08, w*0.63])
style = section_style(C_TEAL, C_WHITE, colors.HexColor("#E8F8F5"))
style.add("BACKGROUND", (0,4), (-1,4), colors.HexColor("#FADBD8"))
style.add("BACKGROUND", (0,11), (-1,11), colors.HexColor("#FADBD8"))
t.setStyle(style)
return KeepTogether([
Table([[cell("CRANIAL NERVES (S=Sensory M=Motor B=Both)", bold=True, color=C_WHITE)]],
colWidths=[w], style=TableStyle([("BACKGROUND",(0,0),(-1,-1),C_TEAL),
("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4)])),
t])
def make_vital_signs(w):
data = [
[cell("Parameter", bold=True), cell("Adult Normal", bold=True), cell("Child (1–10 yr)", bold=True), cell("Infant (<1 yr)", bold=True), cell("Critical Alert", bold=True)],
[cell("HR"), cell("60–100 bpm"), cell("70–120 bpm"), cell("100–160 bpm"), cell("< 50 or > 150 adult = emergency", warn=True)],
[cell("RR"), cell("12–20 /min"), cell("20–30 /min"), cell("30–60 /min"), cell("< 8 or > 30 adult = respiratory distress", warn=True)],
[cell("SBP"), cell("90–140 mmHg"), cell("80–110 mmHg"), cell("70–90 mmHg"), cell("SBP < 90 = hypotension; < 60 = no carotid pulse")],
[cell("SpO2"), cell(">= 95%"), cell(">= 95%"), cell(">= 95%"), cell("< 90% = hypoxia; < 85% = severe hypoxia", warn=True)],
[cell("Temp"), cell("36.5–37.5 °C"),cell("36.5–37.5 °C"),cell("36.5–37.5 °C"),cell("< 35 °C = hypothermia; > 38.5 °C = fever")],
[cell("GCS"), cell("15 (normal)"), cell("15 (normal)"), cell("Modified scale"),cell("< 8 = severe TBI; consider airway", warn=True)],
[cell("Glucose"), cell("4–7 mmol/L"), cell("4–7 mmol/L"), cell("3–6 mmol/L"), cell("< 3 = hypoglycaemia; > 15 = hyperglycaemia")],
]
t = Table(data, colWidths=[w*0.14, w*0.18, w*0.18, w*0.18, w*0.32])
t.setStyle(section_style(C_DARK_GRAY, C_WHITE, C_LIGHT_BG))
return KeepTogether([
Table([[cell("VITAL SIGNS REFERENCE", bold=True, color=C_WHITE)]],
colWidths=[w], style=TableStyle([("BACKGROUND",(0,0),(-1,-1),C_DARK_GRAY),
("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4)])),
t])
def make_body_cavities(w):
data = [
[cell("Cavity", bold=True), cell("Contents", bold=True), cell("Dividing Structure", bold=True)],
[cell("Cranial"), cell("Brain, cranial nerves, CSF"), cell("Foramen magnum (↔ spinal canal)")],
[cell("Spinal"), cell("Spinal cord, nerve roots, CSF"), cell("Vertebral column")],
[cell("Thoracic"), cell("Heart (mediastinum), lungs, great vessels, oesophagus, trachea"), cell("Diaphragm (↕ abdominal)")],
[cell("Abdominal"), cell("Stomach, liver, spleen, SI, LI, kidneys, pancreas, aorta"), cell("Pelvic inlet (↕ pelvic)")],
[cell("Pelvic"), cell("Bladder, rectum, uterus/ovaries (F), prostate (M)"), cell("Pelvic floor muscles")],
[cell("Pleural (x2)"), cell("Lung + pleural fluid; potential space"), cell("Mediastinum (separates left/right)")],
[cell("Pericardial"), cell("Heart + pericardial fluid"), cell("Fibrous pericardium")],
]
t = Table(data, colWidths=[w*0.20, w*0.48, w*0.32])
t.setStyle(section_style(C_HEADER, C_WHITE, C_LIGHT_BG))
return KeepTogether([
Table([[cell("BODY CAVITIES & CONTENTS", bold=True, color=C_WHITE)]],
colWidths=[w], style=TableStyle([("BACKGROUND",(0,0),(-1,-1),C_HEADER),
("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4)])),
t])
def make_bones(w):
left_data = [
[cell("Bone Count", bold=True), cell("Value", bold=True)],
[cell("Total adult bones"), cell("206")],
[cell("Axial skeleton"), cell("80 bones")],
[cell("Appendicular"), cell("126 bones")],
[cell("Cervical vertebrae"), cell("7 (C1=Atlas, C2=Axis)")],
[cell("Thoracic vertebrae"), cell("12 (with ribs)")],
[cell("Lumbar vertebrae"), cell("5 (largest)")],
[cell("Ribs"), cell("12 pairs: True 1-7 / False 8-10 / Floating 11-12")],
[cell("Carpal bones"), cell("8 (Scaphoid most fractured)")],
[cell("Tarsal bones"), cell("7 (Calcaneus = heel, largest)")],
]
lt = Table(left_data, colWidths=[w*0.55, w*0.45])
lt.setStyle(section_style(C_HEADER, C_WHITE, C_LIGHT_BG))
right_data = [
[cell("Joint Type", bold=True), cell("Example", bold=True), cell("Motion", bold=True)],
[cell("Ball & socket"), cell("Hip, shoulder"), cell("Multiaxial")],
[cell("Hinge"), cell("Elbow, knee, ankle"),cell("Uniaxial (flex/ext)")],
[cell("Pivot"), cell("C1–C2, radioulnar"), cell("Rotation only")],
[cell("Condyloid"), cell("Wrist"), cell("Biaxial")],
[cell("Saddle"), cell("Thumb CMC"), cell("Biaxial")],
[cell("Gliding/Plane"), cell("Intercarpal"), cell("Non-axial glide")],
]
rt = Table(right_data, colWidths=[w*0.33, w*0.35, w*0.32])
rt.setStyle(section_style(C_HEADER, C_WHITE, C_LIGHT_BG))
return KeepTogether([
Table([[
Table([[cell("SKELETAL LANDMARKS", bold=True, color=C_WHITE)]],
colWidths=[w*0.4-3], style=TableStyle([("BACKGROUND",(0,0),(-1,-1),C_HEADER),
("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4)])),
Table([[cell("JOINT TYPES", bold=True, color=C_WHITE)]],
colWidths=[w*0.6-3], style=TableStyle([("BACKGROUND",(0,0),(-1,-1),C_HEADER),
("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4)])),
]], colWidths=[w*0.4, w*0.6],
style=TableStyle([("TOPPADDING",(0,0),(-1,-1),0),("BOTTOMPADDING",(0,0),(-1,-1),0),
("LEFTPADDING",(0,0),(-1,-1),0),("RIGHTPADDING",(0,0),(-1,-1),0)])),
Table([[lt, rt]], colWidths=[w*0.4, w*0.6],
style=TableStyle([("VALIGN",(0,0),(-1,-1),"TOP"),
("TOPPADDING",(0,0),(-1,-1),0),("BOTTOMPADDING",(0,0),(-1,-1),0),
("LEFTPADDING",(0,0),(-1,-1),0),("RIGHTPADDING",(0,0),(-1,-1),2)])),
])
# ════════════════════════════════════════════════════════════════════════
# PAGE BACKGROUND + HEADER using canvas
# ════════════════════════════════════════════════════════════════════════
HEADER_HEIGHT = 2.0*cm
def draw_background(c, doc):
w, h = PAGE_W, PAGE_H
# dark navy header band
c.setFillColor(C_HEADER)
c.rect(0, h - HEADER_HEIGHT, w, HEADER_HEIGHT, fill=1, stroke=0)
# red accent stripe
c.setFillColor(C_RED)
c.rect(0, h - HEADER_HEIGHT - 3, w, 3, fill=1, stroke=0)
# title
c.setFillColor(C_WHITE)
c.setFont("Helvetica-Bold", 22)
c.drawCentredString(w/2, h - 1.4*cm, "PARAMEDICAL EMT - ANATOMY QUICK REFERENCE POSTER")
c.setFont("Helvetica", 10)
c.drawCentredString(w/2, h - 1.85*cm,
"Vital Structures, Landmarks & Clinical Decision Points | All Systems Overview")
# footer band
c.setFillColor(C_HEADER)
c.rect(0, 0, w, 0.65*cm, fill=1, stroke=0)
c.setFillColor(C_WHITE)
c.setFont("Helvetica", 7)
c.drawCentredString(w/2, 0.2*cm,
"For educational use only | Paramedical EMT Anatomy | "
"Red = Critical Action | Always follow local protocols")
# subtle side borders
c.setStrokeColor(C_RED)
c.setLineWidth(3)
c.line(MARGIN*0.4, HEADER_HEIGHT + 3, MARGIN*0.4, 0.65*cm)
c.line(w - MARGIN*0.4, HEADER_HEIGHT + 3, w - MARGIN*0.4, 0.65*cm)
# ════════════════════════════════════════════════════════════════════════
# MAIN BUILD
# ════════════════════════════════════════════════════════════════════════
def build():
doc = BaseDocTemplate(
OUTPUT,
pagesize=landscape(A1),
leftMargin=MARGIN, rightMargin=MARGIN,
topMargin=HEADER_HEIGHT + 0.5*cm + 3,
bottomMargin=0.75*cm,
)
usable_w = PAGE_W - 2*MARGIN
col_gap = 0.35*cm
# 3-column layout
n_cols = 3
col_w = (usable_w - (n_cols-1)*col_gap) / n_cols
frames = [
Frame(MARGIN + i*(col_w + col_gap),
doc.bottomMargin,
col_w,
PAGE_H - doc.topMargin - doc.bottomMargin,
leftPadding=0, rightPadding=0, topPadding=0, bottomPadding=0,
showBoundary=0)
for i in range(n_cols)
]
doc.addPageTemplates([PageTemplate(id="poster", frames=frames,
onPage=draw_background)])
# ── Content ordering ─────────────────────────────────────────────
gap = Spacer(1, 0.22*cm)
story = []
# Column 1
story.append(make_airway(col_w))
story.append(gap)
story.append(make_cardio(col_w))
story.append(gap)
story.append(make_pulse_shock(col_w))
# Column 2
story.append(make_spinal(col_w))
story.append(gap)
story.append(make_burns(col_w))
story.append(gap)
story.append(make_abdomen(col_w))
story.append(gap)
story.append(make_vital_signs(col_w))
# Column 3
story.append(make_cranial_nerves(col_w))
story.append(gap)
story.append(make_body_cavities(col_w))
story.append(gap)
story.append(make_bones(col_w))
doc.build(story)
print(f"PDF created: {OUTPUT}")
build()
cd /tmp/workspace/emt-anatomy-poster && python create_poster.py 2>&1
ls -lh /tmp/workspace/emt-anatomy-poster/
EMT Anatomy Quick Reference
PDF Document · PDF