~/clavicle-study-guide/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import BaseDocTemplate, PageTemplate, Frame
from reportlab.pdfgen import canvas
from reportlab.lib.colors import HexColor
import datetime
OUTPUT = "/tmp/workspace/clavicle-study-guide/Clavicle_Fractures_Study_Guide_AIIMS_Gorakhpur.pdf"
# ββ Colour palette ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
NAVY = HexColor("#1B2A4A")
TEAL = HexColor("#0D6E7A")
LIGHT_BG = HexColor("#EAF4F7")
YELLOW_HL = HexColor("#FFF3CD")
RED_HL = HexColor("#FDECEA")
GREEN_HL = HexColor("#E8F5E9")
WHITE = colors.white
GREY_LINE = HexColor("#B0BEC5")
TABLE_HDR = HexColor("#0D6E7A")
TABLE_ALT = HexColor("#F0F8FA")
# ββ Page numbering βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def add_page_number(canvas_obj, doc):
canvas_obj.saveState()
canvas_obj.setFont("Helvetica", 8)
canvas_obj.setFillColor(HexColor("#607D8B"))
canvas_obj.drawString(2*cm, 1.2*cm,
"AIIMS Gorakhpur β Orthopaedics Fracture Clinic Study Guide")
canvas_obj.drawRightString(19*cm, 1.2*cm,
f"Page {doc.page} | Clavicle Fractures")
canvas_obj.setStrokeColor(GREY_LINE)
canvas_obj.setLineWidth(0.5)
canvas_obj.line(2*cm, 1.6*cm, 19*cm, 1.6*cm)
canvas_obj.restoreState()
# ββ Styles βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
styles = getSampleStyleSheet()
def S(name, **kw):
"""Create a named ParagraphStyle from getSampleStyleSheet base."""
base = styles["Normal"]
return ParagraphStyle(name, parent=base, **kw)
TITLE_STYLE = S("MyTitle",
fontSize=26, textColor=WHITE, alignment=TA_CENTER,
fontName="Helvetica-Bold", spaceAfter=4)
SUBTITLE_STYLE = S("MySubtitle",
fontSize=13, textColor=HexColor("#B2EBF2"), alignment=TA_CENTER,
fontName="Helvetica", spaceAfter=2)
INST_STYLE = S("MyInst",
fontSize=10, textColor=HexColor("#E0F7FA"), alignment=TA_CENTER,
fontName="Helvetica-Oblique")
H1 = S("H1",
fontSize=15, textColor=WHITE, fontName="Helvetica-Bold",
backColor=NAVY, borderPad=6, leading=20, spaceAfter=8, spaceBefore=16)
H2 = S("H2",
fontSize=12, textColor=TEAL, fontName="Helvetica-Bold",
spaceAfter=5, spaceBefore=10, borderPadding=(0, 0, 2, 0))
H3 = S("H3",
fontSize=10.5, textColor=NAVY, fontName="Helvetica-Bold",
spaceAfter=3, spaceBefore=6)
BODY = S("Body",
fontSize=9.5, leading=14, textColor=HexColor("#212121"),
spaceAfter=4, alignment=TA_JUSTIFY)
BULLET = S("Bullet",
fontSize=9.5, leading=13, textColor=HexColor("#212121"),
leftIndent=14, bulletIndent=4, spaceAfter=2)
PEARL = S("Pearl",
fontSize=9, leading=13, textColor=HexColor("#1A237E"),
backColor=LIGHT_BG, borderPad=6, spaceAfter=4,
leftIndent=8, rightIndent=8, fontName="Helvetica-Oblique")
WARNING = S("Warning",
fontSize=9, leading=13, textColor=HexColor("#B71C1C"),
backColor=RED_HL, borderPad=6, spaceAfter=4,
leftIndent=8, rightIndent=8, fontName="Helvetica-Bold")
TH = S("TH", fontSize=9, textColor=WHITE, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=12)
TD = S("TD", fontSize=8.5, textColor=HexColor("#212121"), leading=12,
alignment=TA_LEFT)
TDC = S("TDC", fontSize=8.5, textColor=HexColor("#212121"), leading=12,
alignment=TA_CENTER)
# ββ Table helper βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def make_table(headers, rows, col_widths, zebra=True):
data = [[Paragraph(h, TH) for h in headers]]
for i, row in enumerate(rows):
bg = TABLE_ALT if (zebra and i % 2 == 1) else WHITE
data.append([Paragraph(str(c), TDC if j > 0 else TD)
for j, c in enumerate(row)])
ts = TableStyle([
("BACKGROUND", (0, 0), (-1, 0), TABLE_HDR),
("ROWBACKGROUNDS", (0, 1), (-1, -1), [WHITE, TABLE_ALT]),
("GRID", (0, 0), (-1, -1), 0.4, GREY_LINE),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
("TOPPADDING", (0, 0), (-1, -1), 4),
("BOTTOMPADDING", (0, 0), (-1, -1), 4),
("LEFTPADDING", (0, 0), (-1, -1), 5),
("RIGHTPADDING", (0, 0), (-1, -1), 5),
("ROWBACKGROUNDS", (0, 0), (-1, 0), [TABLE_HDR]),
])
return Table(data, colWidths=col_widths, style=ts, repeatRows=1)
def section_rule():
return HRFlowable(width="100%", thickness=1, color=TEAL,
spaceAfter=4, spaceBefore=4)
def bullet(text):
return Paragraph(f"β’ {text}", BULLET)
def subbullet(text):
s = S("SB", fontSize=9, leading=12, textColor=HexColor("#424242"),
leftIndent=28, bulletIndent=18, spaceAfter=1)
return Paragraph(f"β {text}", s)
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# BUILD STORY
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story = []
# ββ COVER PAGE βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def cover_page(canvas_obj, doc):
add_page_number(canvas_obj, doc)
w, h = A4
canvas_obj.setFillColor(NAVY)
canvas_obj.rect(0, h - 12*cm, w, 12*cm, fill=1, stroke=0)
canvas_obj.setFillColor(TEAL)
canvas_obj.rect(0, h - 12.4*cm, w, 0.4*cm, fill=1, stroke=0)
canvas_obj.setFillColor(HexColor("#E8F5E9"))
canvas_obj.rect(0, 0, w, 3.5*cm, fill=1, stroke=0)
story.append(Spacer(1, 3.5*cm))
story.append(Paragraph("CLAVICLE FRACTURES", TITLE_STYLE))
story.append(Paragraph("Comprehensive Resident Study Guide", SUBTITLE_STYLE))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
"Based on Rockwood & Green's Fractures in Adults 10th Ed (2025) "
"and Campbell's Operative Orthopaedics 15th Ed (2026)",
INST_STYLE))
story.append(Spacer(1, 0.4*cm))
story.append(Paragraph(
"Department of Orthopaedics & Trauma | AIIMS Gorakhpur",
INST_STYLE))
story.append(Spacer(1, 0.2*cm))
today = datetime.date.today().strftime("%B %Y")
story.append(Paragraph(f"Fracture Clinic Series | {today}", INST_STYLE))
story.append(Spacer(1, 5.5*cm))
# Quick-ref box on cover
cov_data = [
[Paragraph("Topics Covered", TH)],
[Paragraph("Anatomy & Biomechanics β’ Incidence & Mechanism", TD)],
[Paragraph("Allman / Neer / Robinson / AO-OTA Classifications", TD)],
[Paragraph("Conservative vs Operative Management", TD)],
[Paragraph("Surgical Techniques: Plates, Hook Plate, Endobutton", TD)],
[Paragraph("Non-union: Definition, Types, Management", TD)],
[Paragraph("Floating Shoulder β’ Complications", TD)],
[Paragraph("Rehabilitation Protocol β’ Exam Pearls & Traps", TD)],
]
cov_ts = TableStyle([
("BACKGROUND", (0, 0), (-1, 0), TABLE_HDR),
("BACKGROUND", (0, 1), (-1, -1), LIGHT_BG),
("GRID", (0, 0), (-1, -1), 0.4, GREY_LINE),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING", (0, 0), (-1, -1), 5),
("LEFTPADDING", (0, 0), (-1, -1), 10),
])
story.append(Table(cov_data, colWidths=[15*cm], style=cov_ts))
story.append(PageBreak())
# ββ SECTION 1: ANATOMY βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(Paragraph(" 1. ANATOMY & BIOMECHANICS", H1))
story.append(section_rule())
story.append(Paragraph("Key Anatomical Facts", H2))
story.append(bullet("Only true bony link between the axial skeleton and the upper limb"))
story.append(bullet("First bone to ossify (5β6 weeks gestation); last to complete ossification (~27 years)"))
story.append(bullet("S-shaped: medial end convex anteriorly, lateral end concave anteriorly"))
story.append(bullet("Widest at medial (sternal) and lateral (acromial) ends"))
story.append(bullet("Narrowest and thinnest at the junction of medial two-thirds and lateral third β the commonest fracture site"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Muscular Attachments (Deforming Forces)", H2))
story.append(make_table(
["Muscle", "Attachment", "Effect on Fracture"],
[
["Sternocleidomastoid (SCM)", "Medial clavicle (superior surface)", "Pulls proximal fragment UP and medially"],
["Pectoralis major", "Anterior clavicle (medial 50%)", "Pulls distal fragment DOWN and anteriorly"],
["Deltoid", "Lateral clavicle (anterior 40%)", "Depresses distal fragment"],
["Trapezius", "Posterior clavicle (lateral 40%)", "Contributes to superior migration"],
["Subclavius", "Inferior groove (middle third)", "Depresses clavicle; protective role"],
],
[5*cm, 5.5*cm, 6*cm]
))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Coracoclavicular (CC) Ligaments β Must Know", H2))
story.append(make_table(
["Ligament", "Position", "Origin", "Insertion", "Primary Function"],
[
["Trapezoid", "Anterolateral", "Anterior-superior coracoid", "Trapezoid ridge, inferior clavicle", "Resists anterior displacement & axial compression"],
["Conoid", "Posteromedial", "Base/posterior coracoid", "Conoid tubercle, inferior clavicle", "Resists SUPERIOR & posterior displacement"],
],
[2.5*cm, 2.5*cm, 3.5*cm, 3.5*cm, 4.5*cm]
))
story.append(bullet("Normal CC distance: 11β13 mm"))
story.append(bullet(">5 mm difference vs contralateral side = significant CC ligament disruption"))
story.append(bullet("Stress views: 2.5β5 kg weights from wrist; Zanca view: 15Β° cephalic tilt AP (50% penetration)"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Neurovascular Structures at Risk", H2))
story.append(bullet("Subclavian artery and vein β directly posterior and inferior to midshaft"))
story.append(bullet("Brachial plexus β posterior and inferior, especially with displaced fractures"))
story.append(bullet("Supraclavicular nerve (C3/C4) β crosses the clavicle; most commonly injured; purely sensory"))
story.append(bullet("Lung apex β directly inferior; at risk of pneumothorax with drill plunge during superior plating"))
story.append(PageBreak())
# ββ SECTION 2: EPIDEMIOLOGY ββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(Paragraph(" 2. EPIDEMIOLOGY & MECHANISM", H1))
story.append(section_rule())
story.append(Paragraph("Incidence", H2))
story.append(make_table(
["Region", "Incidence", "Notes"],
[
["All clavicle fractures", "2.6β4% of all adult fractures", "One of the most common fractures"],
["Middle third (Group I)", "69β82%", "Most common; commonest site for non-union"],
["Lateral third (Group II)", "21β28%", "Highest non-union risk when displaced"],
["Medial third (Group III)", "2β3%", "Rarest; beware posterior dislocation"],
],
[4*cm, 5*cm, 7.5*cm]
))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Mechanism of Injury", H2))
story.append(bullet("Most common: Direct fall onto the lateral shoulder (FOOSH is less common than classically taught)"))
story.append(bullet("High-energy: RTA, sports, direct blow"))
story.append(bullet("Indirect: Fall on outstretched hand (FOOSH) β axial loading through humerus"))
story.append(bullet("Perinatal: Birth trauma β greenstick fractures, usually heal uneventfully"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Non-union Risk Estimation (Campbell's Ready Reckoner)", H2))
story.append(make_table(
["Displacement", "Non-comminuted, Non-smoker", "Comminuted, Non-smoker", "Non-comminuted, Smoker", "Comminuted, Smoker"],
[
["10 mm", "2%", "3%", "6%", "10%"],
["20 mm", "7%", "12%", "23%", "34%"],
["30 mm", "26%", "39%", "57%", "70%"],
["40 mm", "62%", "74%", "86%", "92%"],
],
[3.5*cm, 3.5*cm, 3.5*cm, 3.5*cm, 3.5*cm]
))
story.append(Paragraph(
"β Clinical Trap: A 40 mm displaced, comminuted clavicle fracture in a smoker carries a 92% non-union risk conservatively β virtually a mandatory surgical case.",
WARNING))
story.append(PageBreak())
# ββ SECTION 3: CLASSIFICATION ββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(Paragraph(" 3. CLASSIFICATION SYSTEMS", H1))
story.append(section_rule())
story.append(Paragraph("3.1 Allman Classification (1967) β Basic", H2))
story.append(make_table(
["Group", "Location", "Incidence"],
[
["Group I", "Middle third", "69β82%"],
["Group II", "Lateral (distal) third", "21β28%"],
["Group III", "Medial (proximal) third", "2β3%"],
],
[3*cm, 8*cm, 5.5*cm]
))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("3.2 Neer Classification β Distal Clavicle (Most Important Clinically)", H2))
story.append(make_table(
["Type", "Description", "CC Ligaments", "Non-union Risk"],
[
["Type I", "Lateral to CC ligaments; AC joint intact", "BOTH intact", "Low (~3%)"],
["Type IIA", "Fracture medial to both CC ligaments", "BOTH intact", "High"],
["Type IIB", "Fracture between CC ligaments", "Conoid TORN; Trapezoid intact", "VERY HIGH (22β33%)"],
["Type III", "Extends into AC joint articular surface", "Intact", "Low (arthrosis risk)"],
["Type IV", "Physeal fracture β children", "Intact periosteal sleeve", "Heals well"],
["Type V", "Comminuted β CC attached to inferior fragment", "Partially disrupted", "High"],
],
[2*cm, 5.5*cm, 4.5*cm, 4.5*cm]
))
story.append(Paragraph(
"Pearl: In Neer Type IIB β the CONOID is torn (superior displacement unchecked); "
"the TRAPEZOID remains attached to the distal fragment with the acromion.",
PEARL))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("3.3 Robinson (Edinburgh) Classification (1998) β Evidence-Based", H2))
story.append(BODY.__class__("BodyX", parent=BODY,
fontSize=9))
story.append(Paragraph(
"Based on prospective analysis of >1,000 clavicle fractures. Divides clavicle into fifths. "
"Preferred for research as it incorporates prognostic variables (displacement, comminution, intra-articular extension).",
BODY))
story.append(make_table(
["Group", "Location", "Subtype A", "Subtype B"],
[
["1", "Medial fifth", "1A β undisplaced / minimally displaced", "1B β displaced"],
["2", "Middle three-fifths (shaft)", "2A β cortical alignment maintained", "2B β displaced / comminuted"],
["3", "Lateral fifth", "3A β extra-articular", "3B β intra-articular (AC joint)"],
],
[2*cm, 4.5*cm, 5*cm, 5*cm]
))
story.append(Paragraph(
"β NUMBERING TRAP: Robinson calls distal fractures 'Type 3'; Neer calls them 'Type II'. "
"These are frequently confused in exams and clinical discussions.",
WARNING))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("3.4 AO/OTA Classification (2018 Update)", H2))
story.append(make_table(
["Code", "Segment", "Types"],
[
["15.1", "Proximal (medial) end", "15.1A, 15.1B, 15.1C"],
["15.2", "Diaphysis (shaft)", "15.2A β simple; 15.2B β wedge; 15.2C β multifragmentary"],
["15.3", "Distal (lateral) end", "15.3A β extra-articular; 15.3B β partial articular; 15.3C β complete articular"],
],
[2.5*cm, 4.5*cm, 9.5*cm]
))
story.append(Paragraph(
"AO Qualifier: (a) CC ligament complex intact; (b) partial disruption; (c) complete disruption",
PEARL))
story.append(PageBreak())
# ββ SECTION 4: CLINICAL ASSESSMENT ββββββββββββββββββββββββββββββββββββββββββ
story.append(Paragraph(" 4. CLINICAL ASSESSMENT & IMAGING", H1))
story.append(section_rule())
story.append(Paragraph("Clinical Features", H2))
story.append(bullet("Pain, swelling, deformity over the clavicle"))
story.append(bullet("Arm held adducted and internally rotated; supported by the other hand"))
story.append(bullet("'Step deformity' β proximal fragment tenting skin superiorly"))
story.append(bullet("Skin tenting / impending open fracture β surgical emergency"))
story.append(bullet("Always examine: neurovascular status of the arm (radial pulse, grip strength, sensation)"))
story.append(bullet("Always examine: ipsilateral lung (auscultate β pneumothorax?)"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Imaging Protocol", H2))
story.append(make_table(
["View", "Technique", "Purpose"],
[
["Standard AP", "Standing, arm by side", "Initial fracture identification"],
["Zanca view", "AP with 15Β° cephalic tilt, 50% exposure", "Best view for distal clavicle; removes rib overlap"],
["Serendipity view", "40Β° cephalic tilt, centred on manubrium", "Medial clavicle / SC joint fractures"],
["Stress views", "AP with 2.5β5 kg from wrist", "Assess CC ligament integrity"],
["CT scan", "With 3D reconstruction", "Medial fractures, intra-articular extension, non-union planning"],
],
[3*cm, 5*cm, 8.5*cm]
))
story.append(Paragraph(
"Pearl: Supine trauma radiographs underestimate displacement. Repeat upright clavicle views as soon as patient condition allows β Backus et al. found 89% increase in displacement in upright vs supine films.",
PEARL))
story.append(PageBreak())
# ββ SECTION 5: MANAGEMENT ββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(Paragraph(" 5. MANAGEMENT", H1))
story.append(section_rule())
story.append(Paragraph("5.1 Middle Third (Shaft) Fractures", H2))
story.append(Paragraph("Conservative Management β First Line for Most", H3))
story.append(bullet("Broad arm sling for 4β6 weeks"))
story.append(bullet("Fracture clinic review at 2 weeks β reassess displacement"))
story.append(bullet("Non-union rate with conservative management: <1% for undisplaced; rises sharply with displacement"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Indications for ORIF β Midshaft (Campbell's Box 62.1)", H3))
story.append(make_table(
["Category", "Indication"],
[
["Fracture-specific", "Displacement >2 cm; shortening >2 cm; >3 fragments (comminuted); segmental fracture; open fracture; impending open / skin tenting"],
["Patient-specific", "Polytrauma; floating shoulder; bilateral clavicle fractures; dominant arm in high-demand worker; patient preference"],
["Associated injuries", "Vascular injury requiring repair; brachial plexus injury; ipsilateral upper limb fractures"],
],
[4*cm, 12.5*cm]
))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("5.2 Distal Third (Neer Type II) Fractures", H2))
story.append(Paragraph(
"Neer Type IIA and IIB with displacement in active patients: SURGERY IS INDICATED. "
"Conservative non-union rate = 22β33% (Rockwood & Green).",
BODY))
story.append(Spacer(1, 0.1*cm))
story.append(Paragraph("Surgical Options β Distal Clavicle", H3))
story.append(make_table(
["Technique", "Pros", "Cons"],
[
["Hook Plate (AO)", "Strong fixation; controls superior displacement", "MANDATORY removal 3β6 months; subacromial impingement; rotator cuff erosion if not removed"],
["Anatomic Distal Locking Plate", "Permanent; multiple fixed-angle screws in small distal fragment; no second surgery", "Cannot hold very distal tiny fragments; needs bone stock"],
["K-wire + tension band", "Simple, cheap, universally available", "Pin migration (fatal cases reported); rotation control poor; needs removal"],
["Bosworth CC screw", "Reduces CC interval directly", "Thread pullout; screw breakage; mandatory removal"],
["Endobutton / TightRope", "Minimally invasive; no second surgery; reconstructs CC", "Learning curve; anchor pullout; loop failure"],
["Plate + CC augmentation (FiberTape)", "Addresses both fracture AND torn conoid β best for IIB", "More complex; higher cost"],
],
[4*cm, 5.5*cm, 7*cm]
))
story.append(Paragraph(
"Pearl: Hook plate insertion β a small defect is made in the posterolateral AC capsule; the hook is placed in the posterior subacromial space under the acromion. "
"If NOT removed, consequences include: subacromial impingement, rotator cuff erosion, acromial stress fracture, shoulder stiffness.",
PEARL))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("5.3 Plate Position β Superior vs Anteroinferior", H2))
story.append(make_table(
["Feature", "Superior", "Anteroinferior"],
[
["Dissection required", "Less", "More"],
["Screw trajectory", "Superior β inferior (risky β lung below)", "Anterior β posterior (safer)"],
["Hardware prominence", "Higher", "Lower"],
["Plate removal rate", "11%", "5% (p=0.008)"],
["Post-op X-ray", "Fracture clearly visible", "Plate obscures fracture site"],
["Clinical outcomes", "Equivalent", "Equivalent"],
],
[5.5*cm, 5*cm, 6*cm]
))
story.append(Paragraph(
"Rockwood & Green (p.1113): 'All clinical studies comparing anteroinferior and superior plating agree that results are similar in terms of union, plate failure, and functional scores.' The meta-analysis trend favours anteroinferior for hardware comfort.",
PEARL))
story.append(PageBreak())
# ββ SECTION 6: AO PRINCIPLES βββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(Paragraph(" 6. AO PRINCIPLES APPLIED TO CLAVICLE FIXATION", H1))
story.append(section_rule())
story.append(make_table(
["AO Principle", "Application to Clavicle ORIF", "Challenge"],
[
["1. Anatomic reduction", "Restore length, alignment, and rotation", "Comminuted fractures β reduce indirectly; avoid stripping periosteum"],
["2. Stable fixation", "3 bicortical screws each side (6 cortices per side); locking screws for distal fragment", "Distal fragment too small β weak link; use anatomic locking plate + CC augmentation"],
["3. Preserve blood supply", "Minimise soft tissue stripping; indirect reduction; preserve periosteal sleeve", "Overzealous dissection increases non-union risk"],
["4. Early mobilisation", "Pendulum exercises day 1β2 post-op; graduated rehab protocol", "Balance early movement vs risk of hardware failure in small distal fragment"],
],
[4*cm, 6.5*cm, 6*cm]
))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Screw specifications β Superior plating: screw length typically 14β16 mm females; 16β18 mm males "
"(clavicle is narrow in superoinferior dimension). Anteroinferior plating allows longer screws in the wider AP dimension.",
PEARL))
story.append(PageBreak())
# ββ SECTION 7: NON-UNION βββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(Paragraph(" 7. NON-UNION", H1))
story.append(section_rule())
story.append(Paragraph("Definition", H2))
story.append(bullet("FDA definition: Fracture not healed by 9 months AND no radiographic progression for 3 consecutive months"))
story.append(bullet("For clavicle: non-union suspected if no union by 4β6 months; confirmed if no progression over 3 months"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Weber-Cech / Paley Classification of Non-union", H2))
story.append(make_table(
["Type", "Radiographic Appearance", "Vascularity", "Management"],
[
["Hypertrophic", "Elephant foot / horse hoof callus β abundant callus, no bridging", "Good", "Rigid fixation alone β adequate biology, mechanical failure"],
["Oligotrophic", "Minimal callus", "Moderate", "Fixation + biological stimulus (decortication, PRP)"],
["Atrophic", "No callus; osteopenic rounded ends; gap", "Poor", "Fixation + BONE GRAFT mandatory + biological augmentation"],
],
[2.5*cm, 5*cm, 2.5*cm, 6.5*cm]
))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Risk Factors for Non-union", H2))
story.append(make_table(
["Factor", "Effect"],
[
["Smoking", "Dramatically increases risk (see Ready Reckoner table β Section 2)"],
["Displacement >20 mm", "Major independent predictor"],
["Comminution", "Multiplicative effect with displacement"],
["Female sex / older age", "Hormonal and biological factors"],
["NSAIDs / steroids", "Impair fracture healing"],
["Malnutrition / low vitamin D", "Impair callus formation"],
["Infection", "Prevents biological healing"],
],
[5*cm, 11.5*cm]
))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Management of Established Non-union", H2))
story.append(bullet("CT scan to characterise non-union type and hardware status"))
story.append(bullet("Bloods: FBC, ESR, CRP, serum protein, vitamin D β rule out infection and metabolic cause"))
story.append(bullet("If infected: wound swab, deep cultures, organism-specific antibiotics; RETAIN stable plate if fracture ununited"))
story.append(bullet("Surgical revision: anatomic locking plate + autologous iliac crest bone graft (ICBG) for atrophic non-union"))
story.append(bullet("Biological adjuncts: PRP, BMP-2 (off-label), periosteal grafts"))
story.append(Paragraph(
"Golden rule: 'A stable implant holding an ununited fracture should NEVER be removed β it is doing the work the bone cannot yet do.'",
WARNING))
story.append(PageBreak())
# ββ SECTION 8: FLOATING SHOULDER βββββββββββββββββββββββββββββββββββββββββββββ
story.append(Paragraph(" 8. FLOATING SHOULDER", H1))
story.append(section_rule())
story.append(Paragraph("Definition", H2))
story.append(Paragraph(
"Ipsilateral fracture of the CLAVICLE and SCAPULAR NECK β the entire shoulder girdle (glenoid + proximal humerus) "
"is disconnected from the axial skeleton at two points, creating a 'floating' segment. "
"This is a disruption of the Superior Shoulder Suspensory Complex (SSSC).",
BODY))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Management", H2))
story.append(make_table(
["Displacement", "Management"],
[
["Minimally displaced", "Conservative management acceptable β good outcomes (Campbell's 15th Ed)"],
["Significantly displaced", "ORIF clavicle first β restores SSSC and often indirectly reduces scapular neck fracture"],
["Scapula requires fixation", "Fix if: lateral border offset >15β20 mm; body angulation >40Β°; glenopolar angle <20Β° or >60Β°; translation >100%"],
],
[4.5*cm, 12*cm]
))
story.append(Paragraph(
"Campbell's (p.3570): 'Nonoperative management of floating shoulder injuries may yield good outcomes in minimally displaced fractures. "
"Fixation of the clavicle and/or scapula should be considered in those with greater displacements.'",
PEARL))
story.append(PageBreak())
# ββ SECTION 9: COMPLICATIONS βββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(Paragraph(" 9. COMPLICATIONS", H1))
story.append(section_rule())
story.append(make_table(
["Category", "Complication", "Notes / Management"],
[
["Fracture", "Non-union", "22β33% distal (Neer II) conservative; <1% midshaft conservative; 5β10% post-op"],
["Fracture", "Malunion", "Shortening, step deformity; significant if >2 cm shortening (shoulder drooping, strength deficit)"],
["Fracture", "Post-traumatic AC arthrosis", "Especially Neer Type III (intra-articular)"],
["Implant", "Hook plate β rotator cuff erosion", "If not removed by 3β6 months"],
["Implant", "K-wire migration", "Fatal cases of migration into great vessels, heart, trachea β always remove K-wires"],
["Implant", "Screw back-out", "Especially short distal fragment; revise to locking plate + CC augmentation"],
["Implant", "Plate breakage", "Usually at fracture site; indicates failure of fixation β revise"],
["Neurological", "Supraclavicular nerve injury", "Most common; C3/C4 dermatome; anterior chest and shoulder numbness; usually recovers"],
["Neurological", "Brachial plexus traction", "Rare; significant displacement; urgent assessment"],
["Pulmonary", "Pneumothorax", "Drill plunge with superior plating; also from fracture displacement; CXR + chest drain if large"],
["Vascular", "Subclavian vessel injury", "Rare; massive displacement; ATLS protocol; surgical control"],
["Wound", "Infection", "Superficial or deep; cultures, antibiotics, retain stable plate if fracture ununited"],
["Wound", "Hardware prominence", "Very common β thin skin over clavicle; elective removal if symptomatic"],
],
[3*cm, 4.5*cm, 9*cm]
))
story.append(PageBreak())
# ββ SECTION 10: REHABILITATION βββββββββββββββββββββββββββββββββββββββββββββββ
story.append(Paragraph("10. REHABILITATION PROTOCOL", H1))
story.append(section_rule())
story.append(Paragraph("Post-ORIF Rehabilitation (Distal Clavicle)", H2))
story.append(make_table(
["Phase", "Timeframe", "Activity Permitted", "Restrictions"],
[
["Phase 1 β Passive", "0β2 weeks", "Sling immobilisation; pendulum exercises; elbow/wrist/hand active ROM", "No active shoulder movement; no lifting"],
["Phase 2 β Active-assisted", "2β6 weeks", "Active-assisted shoulder elevation; passive forward flexion; sling off by week 4", "No elevation >90Β°; no lifting"],
["Phase 3 β Active", "6β10 weeks", "Full active ROM exercises; gentle rotator cuff strengthening", "No heavy lifting; confirm union on X-ray first"],
["Phase 4 β Strengthening", "10β12 weeks", "Progressive resistance; scapular stabiliser exercises; proprioception", "No contact sport"],
["Phase 5 β Return to sport", "3β4 months", "Return to manual work, sport, contact activities", "Confirmed union on X-ray MANDATORY"],
],
[3.5*cm, 3*cm, 5.5*cm, 4.5*cm]
))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Rockwood & Green: Functional outcome (DASH/Constant score) does not change appreciably after 1 year post-clavicle fracture β "
"this is the research endpoint and counselling benchmark.",
PEARL))
story.append(PageBreak())
# ββ SECTION 11: EXAM PEARLS ββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(Paragraph("11. EXAM PEARLS, TRAPS & VIVA GOLD", H1))
story.append(section_rule())
story.append(Paragraph("Must-Know Numbers", H2))
story.append(make_table(
["Parameter", "Value"],
[
["Clavicle fractures as % of all fractures", "2.6β4%"],
["Middle third incidence", "69β82%"],
["Lateral third incidence", "21β28%"],
["Neer Type II conservative non-union", "22β33%"],
["Middle third conservative non-union", "<1%"],
["Normal CC distance", "11β13 mm"],
["Significant CC disruption", ">5 mm difference vs contralateral"],
["Stress view weight", "2.5β5 kg"],
["Zanca view tilt", "15Β° cephalic, 50% exposure"],
["Hook plate MANDATORY removal", "3β6 months after confirmed union"],
["Superior plating hardware removal rate", "11%"],
["Anteroinferior plating hardware removal rate", "5% (p=0.008)"],
["Minimum screws per side (ideal)", "3 bicortical = 6 cortices"],
["Functional outcome plateau", "1 year post-injury"],
],
[9*cm, 7.5*cm]
))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Classic Exam Traps", H2))
story.append(Paragraph(
"TRAP 1 β NUMBERING CONFUSION: Robinson (Edinburgh) calls distal fractures 'Type 3'; Neer calls them 'Type II'. Distinguish clearly in viva.",
WARNING))
story.append(Paragraph(
"TRAP 2 β HOOK PLATE NOT REMOVED: Always ask in post-op cases whether hook plate has been removed. If left in = rotator cuff erosion, impingement, acromial erosion.",
WARNING))
story.append(Paragraph(
"TRAP 3 β TRIVIAL MECHANISM IN MIDDLE-AGED WOMAN: Always consider pathological fracture β multiple myeloma, metastatic bone disease. Order SPEP, skeletal survey, DEXA.",
WARNING))
story.append(Paragraph(
"TRAP 4 β REMOVING A STABLE PLATE FROM AN UNUNITED FRACTURE: Never remove a stable plate from an ununited fracture β it is maintaining alignment. Treat infection around it; revise only if mechanically failed.",
WARNING))
story.append(Paragraph(
"TRAP 5 β SUPINE TRAUMA CXR: Always repeat upright clavicle X-rays. Backus et al. showed 89% increase in measured displacement upright vs supine β this can change operative decision.",
WARNING))
story.append(Paragraph(
"TRAP 6 β K-WIRE MIGRATION: Never leave K-wires unattended for long periods. Fatal migration into great vessels and cardiac chambers is well documented in literature.",
WARNING))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Informed Consent Checklist (8 Points)", H2))
story.append(make_table(
["#", "Consent Point"],
[
["1", "Non-union (~5β10% operative risk vs 22β33% conservative for Neer II)"],
["2", "Infection β superficial and deep; may need plate removal"],
["3", "Hardware prominence β plate palpable through thin clavicular skin; may need removal"],
["4", "Hook plate mandatory removal (if used) β to prevent rotator cuff damage"],
["5", "Supraclavicular nerve numbness β most common; usually temporary"],
["6", "Pneumothorax β drill plunge risk with superior plating"],
["7", "Implant failure β screw back-out or plate breakage requiring revision"],
["8", "Need for second surgery β planned or unplanned plate removal"],
],
[1*cm, 15.5*cm]
))
story.append(PageBreak())
# ββ SECTION 12: QUICK REFERENCE CARD βββββββββββββββββββββββββββββββββββββββββ
story.append(Paragraph("12. QUICK REFERENCE CARD", H1))
story.append(section_rule())
story.append(Paragraph("Fracture Clinic Decision Aid β Print and Keep", H2))
story.append(make_table(
["Clinical Scenario", "Decision"],
[
["Midshaft clavicle, undisplaced, any age", "Sling 4β6 weeks; fracture clinic review"],
["Midshaft, displaced <2 cm, non-smoker, low demand", "Conservative β sling; counsel on non-union risk"],
["Midshaft, displaced >2 cm OR comminuted OR shortening >2 cm", "ORIF β anteroinferior locking plate preferred"],
["Neer Type I distal clavicle", "Conservative β sling; low non-union risk"],
["Neer Type IIA β undisplaced, elderly, low demand", "Conservative acceptable"],
["Neer Type IIB β displaced, young active patient", "ORIF β anatomic distal locking plate + CC augmentation"],
["Neer Type III β intra-articular", "Conservative if undisplaced; ORIF if step >2 mm or symptomatic"],
["Post-ORIF, screws backed out, fracture NOT united", "Revise to anatomic locking plate + ICBG if gap"],
["Post-op infection, plate stable, fracture NOT united", "RETAIN plate; aggressive debridement; IV antibiotics"],
["Floating shoulder β minimally displaced", "Conservative acceptable"],
["Floating shoulder β significantly displaced", "ORIF clavicle first; assess scapula"],
["Trivial mechanism fracture in >50 female", "Rule out pathological fracture: SPEP, skeletal survey, DEXA"],
["Hook plate at 3β6 months post-op, fracture united", "REMOVE hook plate β mandatory"],
],
[7.5*cm, 9*cm]
))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
"Department of Orthopaedics & Trauma | AIIMS Gorakhpur | "
"Compiled for Fracture Clinic Resident Education | "
"Sources: Rockwood & Green's Fractures in Adults 10th Ed (2025); "
"Campbell's Operative Orthopaedics 15th Ed (2026)",
S("footer", fontSize=7.5, textColor=HexColor("#607D8B"), alignment=TA_CENTER,
fontName="Helvetica-Oblique")))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# BUILD PDF
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2*cm, bottomMargin=2.5*cm,
title="Clavicle Fractures β Resident Study Guide",
author="AIIMS Gorakhpur, Dept of Orthopaedics",
subject="Orthopaedics Fracture Clinic Education"
)
doc.build(story, onFirstPage=cover_page, onLaterPages=add_page_number)
print("PDF generated:", OUTPUT)