IJV anatomy ,methods of cannulation , and it’s complications 20 marks ,PDF format short note,MD anaesthesia exams
mkdir -p /home/daytona/workspace/ijv-note && ls /home/daytona/workspace/ijv-note…
~/ijv-note/generate_ijv_pdf.py
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, KeepTogether
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
import os
OUTPUT = "/home/daytona/workspace/ijv-note/IJV_Cannulation_MD_Anaesthesia.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.8*cm, leftMargin=1.8*cm,
topMargin=1.8*cm, bottomMargin=1.8*cm
)
W, H = A4
styles = getSampleStyleSheet()
# ── Custom styles ────────────────────────────────────────────────
title_style = ParagraphStyle(
"TitleCustom",
parent=styles["Title"],
fontSize=16,
leading=20,
textColor=colors.HexColor("#1a3a5c"),
spaceAfter=4,
alignment=TA_CENTER,
)
subtitle_style = ParagraphStyle(
"SubTitle",
parent=styles["Normal"],
fontSize=9,
textColor=colors.HexColor("#555555"),
alignment=TA_CENTER,
spaceAfter=2,
)
h1_style = ParagraphStyle(
"H1",
parent=styles["Heading1"],
fontSize=12,
leading=15,
textColor=colors.white,
backColor=colors.HexColor("#1a3a5c"),
spaceBefore=10,
spaceAfter=4,
leftIndent=-4,
rightIndent=-4,
borderPad=4,
)
h2_style = ParagraphStyle(
"H2",
parent=styles["Heading2"],
fontSize=10.5,
leading=13,
textColor=colors.HexColor("#1a3a5c"),
spaceBefore=7,
spaceAfter=3,
borderPad=2,
)
h3_style = ParagraphStyle(
"H3",
parent=styles["Heading3"],
fontSize=9.5,
leading=12,
textColor=colors.HexColor("#c0392b"),
spaceBefore=5,
spaceAfter=2,
)
body_style = ParagraphStyle(
"Body",
parent=styles["Normal"],
fontSize=9,
leading=13,
alignment=TA_JUSTIFY,
spaceAfter=3,
)
bullet_style = ParagraphStyle(
"Bullet",
parent=styles["Normal"],
fontSize=9,
leading=12,
leftIndent=14,
bulletIndent=4,
spaceAfter=1,
)
sub_bullet_style = ParagraphStyle(
"SubBullet",
parent=styles["Normal"],
fontSize=8.5,
leading=11.5,
leftIndent=26,
bulletIndent=14,
spaceAfter=1,
)
key_style = ParagraphStyle(
"Key",
parent=styles["Normal"],
fontSize=8.5,
leading=11,
textColor=colors.HexColor("#7d1111"),
backColor=colors.HexColor("#fff3f3"),
leftIndent=6,
rightIndent=6,
borderPad=3,
spaceAfter=2,
)
footer_style = ParagraphStyle(
"Footer",
parent=styles["Normal"],
fontSize=7.5,
textColor=colors.HexColor("#888888"),
alignment=TA_CENTER,
)
def section(title):
return [
Spacer(1, 4),
Paragraph(f" {title}", h1_style),
]
def h2(text):
return Paragraph(text, h2_style)
def h3(text):
return Paragraph(text, h3_style)
def p(text):
return Paragraph(text, body_style)
def b(text):
return Paragraph(f"• {text}", bullet_style)
def sb(text):
return Paragraph(f"◦ {text}", sub_bullet_style)
def sp(n=4):
return Spacer(1, n)
def hr():
return HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#cccccc"), spaceAfter=3)
def key_point(text):
return Paragraph(f"<b>KEY:</b> {text}", key_style)
# ════════════════════════════════════════════════════════════════
story = []
# ── TITLE BLOCK ─────────────────────────────────────────────────
story.append(Spacer(1, 6))
story.append(Paragraph("INTERNAL JUGULAR VEIN (IJV)", title_style))
story.append(Paragraph("Anatomy | Methods of Cannulation | Complications", subtitle_style))
story.append(Paragraph("Short Note — MD Anaesthesia Examination (20 Marks)", subtitle_style))
story.append(HRFlowable(width="100%", thickness=2, color=colors.HexColor("#1a3a5c"), spaceAfter=6))
story.append(sp(2))
# ═══════════════════════════════════════════════════════════════
# SECTION 1: ANATOMY
# ═══════════════════════════════════════════════════════════════
story += section("1. ANATOMY OF THE INTERNAL JUGULAR VEIN")
story.append(sp(2))
story.append(h2("1.1 Origin and Course"))
story += [
p("The IJV is the largest vein draining the head and neck. It is a continuation of the "
"<b>sigmoid sinus</b> and begins at the <b>jugular foramen</b> at the base of the skull. "
"It descends within the <b>carotid sheath</b> alongside the common carotid artery (medially) "
"and the vagus nerve (posteriorly), terminating by joining the <b>subclavian vein</b> behind "
"the sternoclavicular joint to form the <b>brachiocephalic (innominate) vein</b>."),
sp(2),
p("The right IJV has a <b>shorter, straighter course</b> to the superior vena cava (SVC) and "
"right atrium, making it the preferred cannulation site. The left IJV joins the left subclavian "
"vein, increasing the risk of thoracic duct injury and pleural effusion."),
]
story.append(h2("1.2 Surface Anatomy & Relations"))
anatomy_data = [
["Relation", "Structure"],
["Anterior/Medial", "Common carotid artery (CCA)"],
["Posterior", "Vagus nerve; anterior scalene muscle; dome of pleura (left > right)"],
["Lateral", "Sternocleidomastoid (SCM) muscle"],
["Medial (lower)", "Thyroid gland; trachea; oesophagus"],
["Posterior (root of neck)", "Phrenic nerve on anterior scalene; subclavian artery"],
["Left side only", "Thoracic duct (enters junction of L IJV and L subclavian vein)"],
]
t_anatomy = Table(anatomy_data, colWidths=[5.5*cm, 10.5*cm])
t_anatomy.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a3a5c")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#f0f4f8"), colors.white]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aaaaaa")),
("LEFTPADDING", (0,0), (-1,-1), 5),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(t_anatomy)
story.append(sp(4))
story.append(h2("1.3 The SCM Triangle (Key Landmark)"))
story += [
p("The <b>two heads of the SCM muscle</b> (sternal and clavicular) and the <b>clavicle</b> "
"form a triangle. The apex of this triangle is the primary landmark for IJV cannulation. "
"The IJV lies just <b>deep to the apex</b>, lateral to the carotid pulse, and medial to "
"the lateral (clavicular) head of SCM."),
b("<b>Size:</b> diameter approximately 1.5–2.5 cm in an adult; distends in Trendelenburg position"),
b("The vein is <b>compressible</b> on ultrasound — key to distinguishing it from the carotid artery"),
b("Normally lies <b>antero-lateral</b> to the carotid artery in the lower neck"),
]
story.append(key_point("Right IJV preferred: Right IJV + right innominate vein + SVC = nearly straight line to right atrium. Avoids thoracic duct. Lower complication rate."))
story.append(sp(3))
# ═══════════════════════════════════════════════════════════════
# SECTION 2: INDICATIONS & CONTRAINDICATIONS
# ═══════════════════════════════════════════════════════════════
story += section("2. INDICATIONS & CONTRAINDICATIONS")
story.append(sp(2))
ind_contra = [
["INDICATIONS", "CONTRAINDICATIONS / PRECAUTIONS"],
[
"CVP monitoring\nInfusion of vasoactive / caustic drugs\nTotal parenteral nutrition (TPN)\nPoor peripheral venous access\nRapid fluid resuscitation (large-bore)\nTranscutaneous pacing / PA catheter insertion\nAspiration of venous air embolism\nScvO2 monitoring (sepsis bundles)\nECMO cannulation (R IJV - double lumen)",
"Local infection / cellulitis at site\nIpsilateral carotid endarterectomy\nCoagulopathy (relative — use R IJV, compressible)\nRecent neck surgery / irradiation\nContralateral pneumothorax (use same side)\nCervical spine immobilisation\nKnown SVC thrombosis\nTumour / AV fistula in neck\nSevere thrombocytopaenia (relative)"
],
]
t_ic = Table(ind_contra, colWidths=[8*cm, 8*cm])
t_ic.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a3a5c")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#f0f4f8"), colors.white]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aaaaaa")),
("LEFTPADDING", (0,0), (-1,-1), 5),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(t_ic)
story.append(sp(4))
# ═══════════════════════════════════════════════════════════════
# SECTION 3: METHODS OF CANNULATION
# ═══════════════════════════════════════════════════════════════
story += section("3. METHODS OF CANNULATION")
story.append(sp(2))
story.append(h2("3.1 Pre-Procedure Preparation"))
story += [
b("Informed consent; time-out protocol (right patient, right side)"),
b("Position: <b>Trendelenburg 15°</b> — distends IJV, reduces air embolism risk"),
b("Head turned <b>30° to the contralateral side</b> (over-rotation collapses IJV)"),
b("Full aseptic technique: sterile gloves, gown, mask, cap; chlorhexidine-alcohol skin prep; large sterile drape"),
b("Equipment: central line kit (18G introducer needle, J-wire, dilator, triple/quadruple lumen catheter), 10 mL syringe, 1% lidocaine, USG machine"),
b("<b>Ultrasound guidance is standard of care</b> — mandated by most institutions for IJV cannulation"),
]
story.append(sp(3))
story.append(h2("3.2 Three Landmark Approaches"))
story.append(p("All three approaches target the IJV as it lies beneath the SCM triangle. "
"The <b>central (median) approach</b> is most widely used in anaesthesia."))
story.append(sp(3))
# Approaches table
approaches = [
["Approach", "Needle Entry Point", "Direction", "Advantages / Notes"],
[
"Central\n(Median)\n★ MOST USED",
"Apex of SCM triangle\n(junction of sternal &\nclavicular heads)",
"30-45° to skin;\naim toward ipsilateral\nnipple; lateral to\ncarotid pulse",
"Highest success rate\nLow pneumothorax risk\nCarotid haematoma\neasily compressible\nBest for beginners"
],
[
"Anterior",
"Medial border of SCM,\nat the level of thyroid\ncartilage",
"30-45° to skin;\naim toward ipsilateral\nnipple; lateral to\ncarotid artery",
"Good visualisation of\ncarotid\nHigher accidental\ncarotid puncture risk"
],
[
"Posterior",
"Posterior border of SCM,\n5 cm above clavicle\n(junction of external\njugular & SCM)",
"Needle passes beneath\nSCM; directed toward\nsternal notch",
"Avoids carotid artery\nMore difficult to perform\nHigher pneumothorax\nrisk; for experienced\noperators"
],
]
t_app = Table(approaches, colWidths=[3.2*cm, 4.3*cm, 4.3*cm, 4.2*cm])
t_app.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a3a5c")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#eaf0fb"), colors.HexColor("#f9f9f9")]),
("BACKGROUND", (0,1), (0,1), colors.HexColor("#d4edda")), # highlight central approach
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aaaaaa")),
("LEFTPADDING", (0,0), (-1,-1), 4),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(t_app)
story.append(sp(4))
story.append(h2("3.3 Seldinger Technique (Step-by-Step)"))
story.append(p("The <b>Seldinger (catheter over guidewire) technique</b> is used for the "
"overwhelming majority of central lines. Steps:"))
story.append(sp(2))
steps = [
("1", "Infiltrate skin/subcutaneous tissue with 1–2% lidocaine at insertion site."),
("2", "Locate IJV with <b>USG (short-axis/in-plane view)</b> or anatomical landmarks."),
("3", "Insert 22G finder needle at 30–45° toward ipsilateral nipple; aspirate gently — "
"dark (venous) blood confirms entry. <i>(Optional step — skip with USG)</i>"),
("4", "Insert 18G introducer needle along same path. Confirm free venous blood aspiration "
"in 10 mL syringe. USG confirms needle tip in IJV (not carotid)."),
("5", "Stabilise needle. Disconnect syringe; occlude hub with thumb to prevent air entry."),
("6", "Advance <b>J-tipped guidewire</b> through needle — should pass with ZERO resistance. "
"ECG monitoring: PVCs indicate wire in RV — withdraw slightly."),
("7", "<b>Never let go of the guidewire.</b> Confirm wire position with USG or fluoroscopy."),
("8", "Withdraw needle over wire. Nick skin with No. 11 blade alongside wire."),
("9", "Advance dilator over wire with a gentle twisting motion. Remove dilator."),
("10", "Thread central venous catheter (CVC) over wire. Target depth: R IJV 12–14 cm "
"(tip at SVC-RA junction)."),
("11", "Remove wire. Aspirate and flush all ports. Confirm blood return."),
("12", "Secure catheter with suture. Apply sterile occlusive dressing."),
("13", "<b>Confirm position with chest X-ray</b> (tip at carina level) and <b>rule out "
"pneumothorax</b>."),
]
sdata = [["Step", "Action"]] + [[s, Paragraph(d, body_style)] for s, d in steps]
t_steps = Table(sdata, colWidths=[1.2*cm, 14.8*cm])
t_steps.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#2c6e8a")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (0,-1), 8.5),
("ALIGN", (0,0), (0,-1), "CENTER"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#eef6fa"), colors.white]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aaaaaa")),
("LEFTPADDING", (0,0), (-1,-1), 4),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(t_steps)
story.append(sp(4))
story.append(h2("3.4 Ultrasound Guidance"))
story += [
p("<b>USG is now the standard of care</b> for IJV cannulation "
"(Barash Clinical Anaesthesia, 9e; Morgan & Mikhail, 7e). "
"Real-time USG reduces failed attempts, arterial puncture, haematoma, and time to cannulation."),
sp(2),
]
usg_data = [
["Technique", "Description"],
["Short-axis\n(out-of-plane)", "Transverse view: IJV appears as compressible circle, "
"CCA as pulsatile non-compressible circle. Needle visualised as hyperechoic dot. "
"Risk: needle may be anterior to transducer (anterior wall puncture without posterior wall seen)."],
["Long-axis\n(in-plane)", "Needle visualised along its entire length. "
"Allows confirmation of wire placement in real time. Technically more demanding but reduces complications."],
["Dynamic vs static", "Dynamic (real-time) guidance preferred over static (pre-cannulation marking) — "
"significantly reduces failure and complications."],
]
t_usg = Table(usg_data, colWidths=[3*cm, 13*cm])
t_usg.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#2c6e8a")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#eef6fa"), colors.white]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aaaaaa")),
("LEFTPADDING", (0,0), (-1,-1), 4),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(t_usg)
story.append(sp(4))
# ═══════════════════════════════════════════════════════════════
# SECTION 4: COMPLICATIONS
# ═══════════════════════════════════════════════════════════════
story += section("4. COMPLICATIONS")
story.append(sp(2))
story.append(h2("4.1 Classification of Complications"))
story.append(p("Complications are classified by <b>timing</b> (immediate / early / late) "
"and <b>mechanism</b> (mechanical / thromboembolic / infectious)."))
story.append(sp(3))
comp_data = [
["Category", "Complication", "Notes / Incidence"],
# MECHANICAL - IMMEDIATE
["MECHANICAL\n(Immediate)", "Arterial puncture\n(Carotid artery)",
"Most common serious complication. Incidence ~3–5% (landmark), <1% (USG).\nManagement: Remove needle; apply firm direct pressure for 5–10 min.\nIf unrecognised arterial dilation/catheter placed: do NOT remove — seek vascular surgical help. Risk: haematoma, airway compression, stroke, death."],
["", "Pneumothorax",
"Incidence: ~0.5% (IJV) vs 1.5–3% (subclavian). Lower with USG.\nPresents: decreased breath sounds, hypoxia, CXR confirms.\nTreatment: needle decompression / chest drain if significant."],
["", "Air embolism",
"Prevented by Trendelenburg position & occluding needle hub.\nTreatment: Durant's manoeuvre (L lateral decubitus + Trendelenburg), 100% O2, aspirate via CVC."],
["", "Arrhythmias",
"Guidewire or catheter tip in RV/RA. Prevented by not inserting wire >20 cm.\nSelf-limiting once wire repositioned."],
["", "Haematoma / haemothorax",
"More common with coagulopathy. IJV preferred over subclavian in coagulopathic patients (direct compression possible)."],
# MECHANICAL - EARLY
["MECHANICAL\n(Early)", "Malposition of catheter tip",
"Tip in R atrium (arrhythmias, tamponade), SVC (poor CVP reading), IJV ascending (rare).\nConfirm tip position by CXR — tip should lie at the carina level (SVC-RA junction)."],
["", "Cardiac tamponade",
"Due to cardiac perforation by guidewire or stiff catheter tip. Life-threatening — pericardiocentesis required."],
["", "Nerve injury",
"Brachial plexus, phrenic nerve, vagus, recurrent laryngeal nerve, stellate ganglion (Horner syndrome), accessory nerve. More common with posterior approach."],
["", "Thoracic duct injury (L side)",
"Chylothorax. Occurs with left IJV cannulation. Avoided by preferring right side."],
["", "Guidewire / catheter embolism",
"Never let go of the wire. If lost: immediate CXR; interventional radiology retrieval."],
# THROMBOEMBOLIC
["THROMBOEMBOLIC\n(Late)", "Venous thrombosis",
"CVC-related DVT. IJV < subclavian < femoral. Long-term catheters increase risk.\nClinical: arm oedema, SVC syndrome.\nManagement: anticoagulation, line removal."],
["", "Pulmonary embolism",
"Can arise from catheter tip thrombus. Potentially fatal."],
# INFECTIOUS
["INFECTIOUS\n(Late)", "CLABSI (Central Line-\nAssociated Bloodstream\nInfection)",
"Rate: ~1–2 per 1000 catheter-days (IJV > subclavian for infection risk).\nPrevention: maximal sterile barrier, chlorhexidine prep, early removal when no longer needed, daily review.\nTreatment: remove line, blood cultures, antibiotics."],
["", "Exit site / tunnel infection",
"Erythema, pus at insertion site. Change line if persistent."],
# MISCELLANEOUS
["MISCELLANEOUS", "Hydrothorax",
"Inadvertent IV fluid infusion into pleural space from malpositioned catheter.\nDiagnosis: pleural fluid glucose = serum glucose."],
["", "Chylothorax (L side)",
"Thoracic duct injury. Milky pleural fluid; high triglycerides."],
["", "AV fistula (rare)",
"Carotid artery-IJV fistula — rare complication of cannulation."],
]
# Build complication table rows with merged cells
comp_style_data = [
["Category", "Complication", "Notes / Incidence"],
]
for row in comp_data[1:]:
comp_style_data.append([
Paragraph(f"<b>{row[0]}</b>", ParagraphStyle("tc", fontSize=8, leading=10)),
Paragraph(f"<b>{row[1]}</b>", ParagraphStyle("tc2", fontSize=8, leading=10)),
Paragraph(row[2], ParagraphStyle("tc3", fontSize=7.8, leading=10.5))
])
t_comp = Table(comp_style_data, colWidths=[3.2*cm, 3.8*cm, 9*cm])
t_comp.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a3a5c")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#fef9f0"), colors.white]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aaaaaa")),
("LEFTPADDING", (0,0), (-1,-1), 4),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("VALIGN", (0,0), (-1,-1), "TOP"),
# Colour category rows
("BACKGROUND", (0,1), (0,5), colors.HexColor("#fde8e8")),
("BACKGROUND", (0,6), (0,10), colors.HexColor("#fff3cd")),
("BACKGROUND", (0,11), (0,12), colors.HexColor("#d4edda")),
("BACKGROUND", (0,13), (0,14), colors.HexColor("#d1ecf1")),
("BACKGROUND", (0,15), (0,17), colors.HexColor("#f3e8ff")),
]))
story.append(t_comp)
story.append(sp(4))
story.append(h2("4.2 Prevention Strategies"))
prev_data = [
["Prevention Bundle", "Rationale"],
["Ultrasound guidance (real-time)", "Reduces arterial puncture, pneumothorax, failed attempts"],
["Trendelenburg positioning", "Distends IJV; reduces air embolism risk"],
["Maximal sterile barrier precautions", "Reduces CLABSI (sterile gown, gloves, mask, cap, full drape)"],
["Chlorhexidine-alcohol skin antisepsis", "Superior to povidone-iodine for infection prevention"],
["Right IJV preference", "Straight path to SVC-RA; avoids thoracic duct"],
["Confirm guidewire with USG / fluoroscopy", "Prevents inadvertent arterial dilation"],
["Daily catheter necessity review", "Early removal = fewer infections"],
["Post-insertion chest X-ray", "Confirms tip position; rules out pneumothorax"],
]
t_prev = Table(prev_data, colWidths=[7*cm, 9*cm])
t_prev.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#2c6e8a")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#eef6fa"), colors.white]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aaaaaa")),
("LEFTPADDING", (0,0), (-1,-1), 5),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(t_prev)
story.append(sp(4))
# ═══════════════════════════════════════════════════════════════
# SECTION 5: HIGH-YIELD EXAM POINTS
# ═══════════════════════════════════════════════════════════════
story += section("5. HIGH-YIELD EXAM POINTS (MD ANAESTHESIA)")
story.append(sp(3))
high_yield = [
("Why right IJV?", "Straight course: R IJV → R innominate vein → SVC → RA. "
"Avoids thoracic duct. Lower complication rate. CVC tip at correct position easier to achieve."),
("Trendelenburg position", "Distends IJV (increases calibre), reduces risk of air embolism. "
"15° head-down is optimal. Over-rotation of head (>45°) may collapse the IJV."),
("Catheter tip ideal position", "SVC-RA junction — at or just above the level of the carina on CXR. "
"Too deep → arrhythmias, cardiac perforation; too high → inaccurate CVP."),
("Carotid artery puncture", "Most common serious complication. Remove needle, apply pressure. "
"NEVER dilate if artery inadvertently cannulated without vascular surgical backup."),
("Air embolism prevention", "Trendelenburg; occlude needle hub; guidewire inserted during expiration "
"or positive pressure breath."),
("CLABSI prevention", "Maximal sterile barrier + chlorhexidine + daily review for removal = central "
"line bundle. CLABSI is higher with IJV vs subclavian — femoral is highest risk."),
("USG guidance", "Standard of care. Reduces arterial puncture (3–5% → <0.5%), improves first-pass "
"success. Short-axis most used; long-axis gives better needle visualisation."),
("Guidewire rule", "NEVER release the guidewire. PVCs on ECG during wire insertion = wire in RV — withdraw."),
("Left IJV risks", "Thoracic duct injury → chylothorax; more tortuous path; higher pleural effusion risk."),
("Depth of insertion", "Right IJV: 12–14 cm to SVC-RA junction. Left IJV: ~16 cm."),
]
hy_rows = [["Point", "Answer"]] + [[Paragraph(f"<b>{k}</b>", ParagraphStyle("k", fontSize=8, leading=10)),
Paragraph(v, ParagraphStyle("v", fontSize=8, leading=10.5))]
for k, v in high_yield]
t_hy = Table(hy_rows, colWidths=[4.5*cm, 11.5*cm])
t_hy.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a3a5c")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#f5f0ff"), colors.white]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aaaaaa")),
("LEFTPADDING", (0,0), (-1,-1), 5),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(t_hy)
story.append(sp(5))
# ── FOOTER / REFERENCES ─────────────────────────────────────────
story.append(HRFlowable(width="100%", thickness=1, color=colors.HexColor("#1a3a5c"), spaceAfter=4))
story.append(Paragraph(
"<b>References:</b> Morgan & Mikhail's Clinical Anaesthesiology 7e (Ch.5) | "
"Miller's Anaesthesia 10e | Barash Clinical Anaesthesia 9e | "
"Tintinalli's Emergency Medicine | Roberts & Hedges' Clinical Procedures | "
"Pfenninger & Fowler's Procedures for Primary Care",
footer_style
))
story.append(Paragraph(
"Prepared for MD Anaesthesia Examination | Orris Medical AI | July 2026",
footer_style
))
# ── BUILD PDF ───────────────────────────────────────────────────
doc.build(story)
print(f"PDF generated: {OUTPUT}")
cd /home/daytona/workspace/ijv-note && python generate_ijv_pdf.py 2>&1
ls -lh /home/daytona/workspace/ijv-note/IJV_Cannulation_MD_Anaesthesia.pdf
python3 -c " from pypdf import PdfReader r = PdfReader('/home/daytona/workspace/…
IJV Cannulation MD Anaesthesia
PDF Document · PDF
| Approach | Entry Point | Direction |
|---|---|---|
| Central (most used) | Apex of SCM triangle | 30-45° toward ipsilateral nipple |
| Anterior | Medial border SCM at thyroid cartilage | 30-45° toward ipsilateral nipple |
| Posterior | Posterior border SCM, 5 cm above clavicle | Toward sternal notch |