Iliotibial band contracture causes etiology pathology and signs and symptoms deformities formed investigation and treatment explain in detail with appropriate illustrative diagrams and images
iliotibial band contracture etiology pathology signs symptoms deformities treatment orthopedics
| Cause | Mechanism |
|---|---|
| Poliomyelitis | Most classical cause. Muscle spasm during acute/convalescent stages forces the "frog position" (hips and knees flexed, extremities externally rotated). Sustained positioning causes secondary soft-tissue contracture, especially when gluteal muscles are weakened |
| Myelomeningocele | Paralysis of hip abductors and extensors leads to hip abduction contracture |
| Cerebral palsy / upper motor neuron lesions | Spastic posturing causes adaptive ITB shortening |
| Intramuscular injections (in infants) | Repeated gluteal/quadriceps injections can cause fibrosis and secondary ITB/fascia lata contracture |
| Burns and scarring | Lateral thigh burns can cause secondary fascial contracture |
| Prolonged immobilization / bed rest | Sustained frog-leg position without passive range-of-motion exercises |

| Deformity | Mechanism |
|---|---|
| Flexion, abduction, external rotation contracture of the hip | ITB lies lateral and anterior to hip joint; contracture causes flexion and abduction. Hip is externally rotated for comfort; if not corrected, external rotators contract and produce fixed deformity |
| Genu valgum and flexion contracture of the knee | With growth, contracted ITB acts as a taut bowstring across the knee, gradually abducts and flexes the tibia |
| External tibial torsion (with/without knee subluxation) | Because of lateral distal attachment, ITB gradually rotates the tibia and fibula externally on the femur. In extreme cases, lateral tibial condyle subluxates on lateral femoral condyle; head of fibula displaces into popliteal space |
| Limb-length discrepancy | Mechanism not entirely defined; related to neurological/muscle function loss and altered growth |
| Pelvic obliquity | The hip abduction deformity tilts the pelvis obliquely |
| Increased lumbar lordosis | Compensatory for pelvic obliquity and hip flexion deformity |
| Secondary ankle and foot deformities | Due to altered limb alignment (equinovalgus) |


| Investigation | Findings |
|---|---|
| Plain X-ray (AP pelvis, hip, knee) | Pelvic obliquity, hip subluxation/dislocation, genu valgum, tibial torsion, degenerative changes. AP pelvis requires symmetrical iliac wings and obturator foramina |
| Standing long-leg X-ray | Assess overall limb alignment, leg length discrepancy, mechanical axis deviation |
| MRI of hip/knee | Assesses the ITB itself for thickening/fibrosis, bursitis (trochanteric bursitis), labral pathology, articular cartilage |
| Ultrasound | Dynamic assessment of the snapping ITB over the greater trochanter; confirms trochanteric bursitis |
| CT scan | Assesses bony deformities, rotational profile (tibial torsion, femoral anteversion) |
"Secondary adaptive changes occur soon after the iliotibial band contracts, and the resulting deformity, regardless of its duration or the patient's age, cannot be corrected by non-operative measures; attempts at correction with traction only increase the obliquity and hyperextension of the pelvis." - Campbell's Operative Orthopaedics 15th Ed
| Severity | Treatment |
|---|---|
| 15-20 degrees or less (young children) | Posterior hamstring lengthening and capsulotomy |
| Moderate contracture | Supracondylar extension osteotomy of the femur |
| More than 70 degrees | Division of ITB, hamstring tendons, combined with posterior capsulotomy; skeletal traction (distal tibial pin); second-stage supracondylar osteotomy near skeletal maturity |
| Feature | Details |
|---|---|
| Definition | Fibrotic shortening of the fascia lata/ITB complex causing deformities at hip, knee, and tibia |
| Classic etiology | Poliomyelitis (sustained frog-leg posture); also myelomeningocele, CP, injections, burns |
| Key pathology | ITB acts as a taut lateral bowstring; secondary adaptive changes are irreversible without surgery |
| Signature deformity at hip | Flexion + abduction + external rotation |
| Signature deformity at knee | Flexion contracture + genu valgum + external tibial torsion |
| Key clinical test | Positive Ober test (leg fails to adduct to table level) |
| Investigations | Clinical + X-ray series; MRI/US for soft tissue; EMG in paralytic cases |
| Minor contracture Rx | Simple fasciotomy (high recurrence) |
| Moderate-severe Rx | Ober-Yount procedure (hip and distal ITB release) |
| Severe Rx | Campbell technique (full iliac wing release); supracondylar osteotomy for knee |
Give me pdf download link
mkdir -p /home/daytona/workspace/itb-contracture && ls /home/daytona/workspace/i…
~/itb-contracture/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, Image, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus.flowables import HRFlowable
import urllib.request
import os
OUTPUT = "/home/daytona/workspace/itb-contracture/ITB_Contracture.pdf"
# Download images
img_urls = {
"hip_release.png": "https://cdn.orris.care/cdss_images/87bebd5f74c03d1a33011950fcbba1768cca1b228a23e208afd95eb81a79174f.png",
"knee_osteotomy.png": "https://cdn.orris.care/cdss_images/72ee2556f5f728cfcf170c0a5282f5f9cd96e7fe69c1a119898234592eebcd4b.png",
"ober_test.png": "https://cdn.orris.care/cdss_images/20f8e7bfb844262b54cd352cbe5ad8c59e18b3dfd83e23e4ae13bd6794d92f3d.png",
"faber_test.png": "https://cdn.orris.care/cdss_images/0a583710823b4e33d14b21b3053ae8456c9385935e0b1fd416aa0e63472419d8.png",
}
img_dir = "/home/daytona/workspace/itb-contracture/"
for fname, url in img_urls.items():
fpath = img_dir + fname
if not os.path.exists(fpath):
try:
urllib.request.urlretrieve(url, fpath)
print(f"Downloaded {fname}")
except Exception as e:
print(f"Failed {fname}: {e}")
# Styles
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2.2*cm, bottomMargin=2.2*cm
)
styles = getSampleStyleSheet()
NAVY = colors.HexColor("#1a3560")
TEAL = colors.HexColor("#1e7a8c")
LIGHT_BLUE = colors.HexColor("#dbeeff")
LIGHT_GRAY = colors.HexColor("#f5f5f5")
ORANGE = colors.HexColor("#d4620a")
WHITE = colors.white
title_style = ParagraphStyle("Title", parent=styles["Title"],
fontSize=22, textColor=WHITE, alignment=TA_CENTER,
spaceAfter=4, fontName="Helvetica-Bold")
subtitle_style = ParagraphStyle("Subtitle", parent=styles["Normal"],
fontSize=11, textColor=colors.HexColor("#cce4ff"), alignment=TA_CENTER,
spaceAfter=2, fontName="Helvetica")
h1_style = ParagraphStyle("H1", parent=styles["Heading1"],
fontSize=14, textColor=WHITE, fontName="Helvetica-Bold",
spaceBefore=14, spaceAfter=4, leftIndent=0, borderPad=4)
h2_style = ParagraphStyle("H2", parent=styles["Heading2"],
fontSize=12, textColor=NAVY, fontName="Helvetica-Bold",
spaceBefore=10, spaceAfter=3, leftIndent=0)
h3_style = ParagraphStyle("H3", parent=styles["Heading3"],
fontSize=10.5, textColor=TEAL, fontName="Helvetica-Bold",
spaceBefore=7, spaceAfter=2)
body_style = ParagraphStyle("Body", parent=styles["Normal"],
fontSize=9.5, leading=14, textColor=colors.HexColor("#222222"),
alignment=TA_JUSTIFY, fontName="Helvetica", spaceAfter=5)
bullet_style = ParagraphStyle("Bullet", parent=body_style,
leftIndent=14, bulletIndent=4, spaceAfter=3,
bulletText="\u2022")
note_style = ParagraphStyle("Note", parent=body_style,
fontSize=8.5, textColor=colors.HexColor("#555555"),
fontName="Helvetica-Oblique", alignment=TA_CENTER, spaceAfter=3)
caption_style = ParagraphStyle("Caption", parent=styles["Normal"],
fontSize=8, textColor=colors.HexColor("#444444"),
fontName="Helvetica-Oblique", alignment=TA_CENTER, spaceAfter=8)
def section_header(text, num):
data = [[Paragraph(f"{num}. {text}", h1_style)]]
t = Table(data, colWidths=[17*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("ROUNDEDCORNERS", [4,4,4,4]),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 10),
]))
return t
def sub_header(text):
return Paragraph(text, h2_style)
def sub_sub_header(text):
return Paragraph(text, h3_style)
def body(text):
return Paragraph(text, body_style)
def bullet(text):
return Paragraph(f"\u2022 {text}", bullet_style)
def spacer(h=6):
return Spacer(1, h)
def hr():
return HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#cccccc"), spaceAfter=4, spaceBefore=4)
def img_block(path, w, caption):
elems = []
if os.path.exists(path):
im = Image(path, width=w, height=None)
im.hAlign = "CENTER"
elems.append(im)
elems.append(Paragraph(caption, caption_style))
return elems
def make_table(headers, rows, col_widths=None):
data = [headers] + rows
if col_widths is None:
col_widths = [17*cm / len(headers)] * len(headers)
t = Table(data, colWidths=col_widths, repeatRows=1)
style = [
("BACKGROUND", (0,0), (-1,0), NAVY),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 9),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_GRAY]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#bbbbbb")),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("WORDWRAP", (0,0), (-1,-1), True),
]
t.setStyle(TableStyle(style))
return t
def highlight_box(text):
data = [[Paragraph(text, ParagraphStyle("hi", parent=body_style,
textColor=NAVY, fontName="Helvetica-BoldOblique", fontSize=9.5))]]
t = Table(data, colWidths=[17*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_BLUE),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("BOX", (0,0), (-1,-1), 1.5, TEAL),
]))
return t
# ─── Cover Page ───────────────────────────────────────────────────────────────
story = []
cover_data = [[Paragraph("ILIOTIBIAL BAND CONTRACTURE", title_style)],
[Paragraph("Etiology | Pathology | Signs & Symptoms | Deformities | Investigations | Treatment", subtitle_style)],
[Paragraph("A Comprehensive Orthopaedic Review", subtitle_style)],
[Spacer(1, 6)],
[Paragraph("Based on Campbell's Operative Orthopaedics 15th Ed 2026 & authoritative orthopaedic textbooks", note_style)],
]
cover_t = Table(cover_data, colWidths=[17*cm])
cover_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("TOPPADDING", (0,0), (-1,-1), 14),
("BOTTOMPADDING", (0,0), (-1,-1), 14),
("LEFTPADDING", (0,0), (-1,-1), 20),
("RIGHTPADDING", (0,0), (-1,-1), 20),
]))
story.append(cover_t)
story.append(spacer(18))
# ─── Section 1: Anatomy ───────────────────────────────────────────────────────
story.append(section_header("Anatomy of the Iliotibial Band", 1))
story.append(spacer(6))
story.append(body(
"The iliotibial band (ITB) is a dense fibrous condensation of the fascia lata running along the "
"lateral thigh. The fascia lata arises proximally from the coccyx, sacrum, iliac crest, inguinal "
"ligament, and pubic arch, investing all muscles of the thigh and buttock. Both the superficial "
"and deep layers attach to the gluteus maximus and the entire tensor fasciae latae muscle. All "
"these fascial attachments converge to form the iliotibial band on the lateral thigh."
))
story.append(sub_header("Distal Attachments"))
for b in [
"Lateral epicondyle of the femur (proximal insertion)",
"Gerdy's tubercle on the lateral tibial plateau (distal insertion)",
"Iliopatellar band — anterior extension to the lateral patella",
]:
story.append(bullet(b))
story.append(spacer(4))
story.append(sub_header("Three Layers of the Distal ITB"))
t = make_table(
[Paragraph("Layer", styles["Normal"]), Paragraph("Description", styles["Normal"])],
[
[Paragraph("Superficial", body_style), Paragraph("Main fascial band coursing along lateral thigh", body_style)],
[Paragraph("Deep (Kaplan fibers)", body_style), Paragraph("Begins 6 cm proximal to lateral femoral epicondyle; connects to lateral intermuscular septum; restrains internal tibial rotation (especially in ACL-deficient knee)", body_style)],
[Paragraph("Capsule-osseous layer", body_style), Paragraph("Creates sling over lateral femoral condyle; blends with short head of biceps femoris; inserts posterior to Gerdy's tubercle", body_style)],
],
col_widths=[4*cm, 13*cm]
)
story.append(t)
story.append(spacer(6))
story.append(body(
"The ITB moves forward in extension and backward in flexion but remains tense in both positions. "
"During flexion, the ITB, popliteal tendon, and LCL cross each other — all serving to enhance "
"lateral stability of the knee."
))
# ─── Section 2: Etiology ──────────────────────────────────────────────────────
story.append(spacer(10))
story.append(section_header("Etiology", 2))
story.append(spacer(6))
story.append(body(
"ITB contracture is most classically described in paralytic conditions, though it may occur "
"whenever sustained abnormal posturing leads to fascial shortening."
))
t = make_table(
[Paragraph("Cause", styles["Normal"]), Paragraph("Mechanism", styles["Normal"])],
[
[Paragraph("Poliomyelitis (classic)", body_style),
Paragraph("Acute muscle spasm forces 'frog position' (hips and knees flexed, externally rotated). "
"Sustained positioning causes secondary soft-tissue contracture, especially when gluteal muscles are weakened.", body_style)],
[Paragraph("Myelomeningocele", body_style),
Paragraph("Paralysis of hip abductors/extensors leads to hip abduction contracture; ITB tethers laterally.", body_style)],
[Paragraph("Cerebral palsy / UMN lesions", body_style),
Paragraph("Spastic posturing causes adaptive ITB shortening over time.", body_style)],
[Paragraph("Intramuscular injections (infants)", body_style),
Paragraph("Repeated gluteal/quadriceps injections cause fibrosis and secondary fascia lata contracture.", body_style)],
[Paragraph("Burns and lateral thigh scarring", body_style),
Paragraph("Scar contracture secondarily tightens the overlying fascia lata/ITB.", body_style)],
[Paragraph("Prolonged immobilization", body_style),
Paragraph("Sustained frog-leg position without passive ROM exercises allows progressive shortening.", body_style)],
],
col_widths=[4.5*cm, 12.5*cm]
)
story.append(t)
# ─── Section 3: Pathology ─────────────────────────────────────────────────────
story.append(spacer(10))
story.append(section_header("Pathology", 3))
story.append(spacer(6))
story.append(highlight_box(
'"Secondary adaptive changes occur soon after the iliotibial band contracts, and the resulting '
'deformity, regardless of its duration or of the patient\'s age, cannot be corrected by non-operative '
'measures; on the contrary, attempts at correction with traction only increase the obliquity and '
'hyperextension of the pelvis." — Campbell\'s Operative Orthopaedics 15th Ed 2026'
))
story.append(spacer(6))
for b in [
"<b>Fascial fibrosis:</b> Progressive shortening and fibrosis of the fascia lata/ITB complex — the core pathological process.",
"<b>Lateral bowstring effect:</b> With growth, the contracted ITB acts as a taut bowstring along the lateral limb, gradually abducting and flexing the tibia on the femur.",
"<b>Hip position effect:</b> The ITB lies lateral and anterior to the hip joint; contracture forces flexion AND abduction. The hip adopts external rotation for comfort.",
"<b>Progressive external rotator contracture:</b> If hip external rotation is not corrected, the external rotators themselves contract, contributing to fixed rotational deformity.",
"<b>Knee subluxation (severe):</b> The ITB's lateral distal attachment gradually rotates the tibia externally. In extreme cases, the lateral tibial condyle subluxates on the lateral femoral condyle, and the fibular head displaces into the popliteal space.",
"<b>Growth failure of contracted tissues:</b> In children, contracted soft tissues fail to keep pace with bone growth — deformity progressively worsens without treatment.",
]:
story.append(bullet(b))
# ─── Section 4: Signs & Symptoms ─────────────────────────────────────────────
story.append(spacer(10))
story.append(section_header("Signs and Symptoms", 4))
story.append(spacer(6))
story.append(sub_header("Symptoms"))
for b in [
"Difficulty walking — antalgic or Trendelenburg gait",
"Inability to bring knees together (hip held in abduction)",
"Lateral hip and knee pain",
"Snapping sensation over the greater trochanter (external coxa saltans) — ITB snapping over the trochanter",
"Visible progressive limb deformity",
"Pelvic tilt and low back pain (due to pelvic obliquity)",
]:
story.append(bullet(b))
story.append(spacer(4))
story.append(sub_header("Signs"))
t = make_table(
[Paragraph("Sign", styles["Normal"]), Paragraph("Description", styles["Normal"])],
[
[Paragraph("Hip abduction + flexion + ER", body_style), Paragraph("Classic triad at the hip — the limb is held in abduction, flexion, and external rotation", body_style)],
[Paragraph("Pelvic obliquity", body_style), Paragraph("Pelvis tilts toward the contracted side; apparent limb-length discrepancy", body_style)],
[Paragraph("Genu valgum", body_style), Paragraph("Knee pushed laterally as ITB bowstrings from lateral ilium to Gerdy's tubercle", body_style)],
[Paragraph("Knee flexion contracture", body_style), Paragraph("ITB prevents full knee extension; may be associated with posterior knee subluxation", body_style)],
[Paragraph("External tibial torsion", body_style), Paragraph("Tibia rotated outward; in severe cases, knee joint subluxation", body_style)],
[Paragraph("Limb-length discrepancy", body_style), Paragraph("True shortening from altered growth; apparent from pelvic obliquity", body_style)],
[Paragraph("Lumbar lordosis", body_style), Paragraph("Compensatory increase in lumbar lordosis for hip flexion deformity", body_style)],
[Paragraph("Ankle/foot deformities", body_style), Paragraph("Secondary equinovalgus from altered limb alignment", body_style)],
],
col_widths=[5*cm, 12*cm]
)
story.append(t)
story.append(spacer(8))
story.append(sub_header("Ober Test — Key Clinical Diagnostic Test"))
story.append(body(
"The Ober test is the gold-standard clinical test for ITB contracture:"
))
for b in [
"Patient lies in <b>lateral decubitus</b> position; lower leg flexed at hip and knee for stability",
"Examiner <b>abducts and extends</b> the upper (affected) leg with knee flexed at 90°",
"Hips slightly extended to allow the ITB to pass over the greater trochanter",
"Examiner slowly <b>lowers the limb</b> with the muscles relaxed",
"<b>Positive test:</b> The leg fails to fall back to the level of the tabletop — confirms ITB contracture",
"Positive with <b>hip extended past neutral</b> → ITB tightness",
"Positive with <b>hip in neutral</b> → Gluteus medius contracture/tendinopathy",
]:
story.append(bullet(b))
story.append(spacer(8))
# Images side by side
img1_path = img_dir + "ober_test.png"
img2_path = img_dir + "faber_test.png"
img_row = []
if os.path.exists(img1_path):
img_row.append([Image(img1_path, width=7.5*cm, height=8*cm), Image(img2_path, width=7.5*cm, height=8*cm)])
img_t = Table(img_row, colWidths=[8.5*cm, 8.5*cm])
img_t.setStyle(TableStyle([("ALIGN", (0,0), (-1,-1), "CENTER"), ("VALIGN", (0,0), (-1,-1), "MIDDLE")]))
story.append(img_t)
story.append(Paragraph(
"Left: Hip examination (lateral decubitus) used in Ober test technique. "
"Right: FABER test — also performed in lateral position for hip assessment.",
caption_style
))
# ─── Section 5: Deformities ───────────────────────────────────────────────────
story.append(spacer(10))
story.append(section_header("Deformities Formed", 5))
story.append(spacer(6))
story.append(body(
"ITB contracture produces a predictable cascade of deformities at the hip, knee, and distally — "
"collectively described in eBox 36.2 of Campbell's Operative Orthopaedics:"
))
t = make_table(
[Paragraph("Deformity", styles["Normal"]),
Paragraph("Mechanism", styles["Normal"]),
Paragraph("Key Features", styles["Normal"])],
[
[Paragraph("Flexion + Abduction + External Rotation of Hip", body_style),
Paragraph("ITB lies lateral and anterior to hip joint; shortening pulls hip into flexion and abduction", body_style),
Paragraph("Hip held in 'frog' position; external rotators secondarily contract", body_style)],
[Paragraph("Genu Valgum + Knee Flexion Contracture", body_style),
Paragraph("Contracted ITB bowstrings across lateral knee, abducting and flexing the tibia", body_style),
Paragraph("With growth, worsens progressively; >70° flexion deforms articular surfaces", body_style)],
[Paragraph("External Tibial Torsion ± Knee Subluxation", body_style),
Paragraph("Lateral distal attachment of ITB rotates tibia/fibula externally on femur", body_style),
Paragraph("Extreme: lateral tibial condyle subluxates; fibular head displaces into popliteal space", body_style)],
[Paragraph("Limb-Length Discrepancy", body_style),
Paragraph("Altered growth from neurological loss and mechanical factors", body_style),
Paragraph("May be considerable after years of growth", body_style)],
[Paragraph("Pelvic Obliquity", body_style),
Paragraph("Hip abduction contracture tilts pelvis", body_style),
Paragraph("Can cause compensatory scoliosis", body_style)],
[Paragraph("Increased Lumbar Lordosis", body_style),
Paragraph("Compensatory for hip flexion deformity and pelvic tilt", body_style),
Paragraph("Contributes to chronic low back pain", body_style)],
[Paragraph("Secondary Foot/Ankle Deformities", body_style),
Paragraph("Altered limb alignment and muscle imbalance", body_style),
Paragraph("Equinovalgus most common", body_style)],
],
col_widths=[4.5*cm, 7*cm, 5.5*cm]
)
story.append(t)
story.append(spacer(8))
# Images
hip_img_path = img_dir + "hip_release.png"
knee_img_path = img_dir + "knee_osteotomy.png"
if os.path.exists(hip_img_path) and os.path.exists(knee_img_path):
img_row2 = [[Image(hip_img_path, width=7.5*cm, height=9*cm),
Image(knee_img_path, width=7*cm, height=9*cm)]]
img_t2 = Table(img_row2, colWidths=[8.5*cm, 8.5*cm])
img_t2.setStyle(TableStyle([("ALIGN", (0,0), (-1,-1), "CENTER"), ("VALIGN", (0,0), (-1,-1), "MIDDLE")]))
story.append(img_t2)
story.append(Paragraph(
"Left: Surgical anatomy showing complete release of flexion-abduction-external rotation "
"contracture of hip (Campbell's eFig. 36.15). "
"Right: Supracondylar extension osteotomy of femur for knee flexion contracture.",
caption_style
))
# ─── Section 6: Investigations ────────────────────────────────────────────────
story.append(PageBreak())
story.append(section_header("Investigations", 6))
story.append(spacer(6))
story.append(sub_header("Clinical Assessment (Primary)"))
for b in [
"<b>Full gait analysis</b> — Trendelenburg gait, abductor lurch, knee valgus in stance",
"<b>Ober test</b> — gold standard for ITB contracture",
"<b>Thomas test</b> — quantifies hip flexion contracture",
"<b>Range of motion assessment</b> — hip, knee, and ankle in all planes",
"<b>Limb length measurement</b> — true vs. apparent discrepancy",
"<b>Neurological assessment</b> — muscle power grading, sensation (for paralytic causes)",
]:
story.append(bullet(b))
story.append(spacer(6))
story.append(sub_header("Radiological Investigations"))
t = make_table(
[Paragraph("Investigation", styles["Normal"]), Paragraph("Findings / Purpose", styles["Normal"])],
[
[Paragraph("Plain X-ray (AP Pelvis, Hip, Knee)", body_style),
Paragraph("Pelvic obliquity, hip subluxation/dislocation, genu valgum, tibial torsion, "
"degenerative changes. AP pelvis requires symmetrical iliac wings and obturator foramina.", body_style)],
[Paragraph("Standing Long-leg X-ray", body_style),
Paragraph("Overall limb alignment, leg-length discrepancy, mechanical axis deviation, "
"assessment of genu valgum magnitude.", body_style)],
[Paragraph("MRI Hip/Knee/Thigh", body_style),
Paragraph("ITB thickening and fibrosis, trochanteric bursitis, labral pathology, "
"articular cartilage assessment, muscle wasting.", body_style)],
[Paragraph("Ultrasound", body_style),
Paragraph("Dynamic assessment of snapping ITB over greater trochanter; "
"trochanteric bursitis confirmation; guided injection planning.", body_style)],
[Paragraph("CT Scan", body_style),
Paragraph("Bony deformities, rotational profile (tibial torsion, femoral anteversion), "
"pre-operative planning for osteotomy.", body_style)],
],
col_widths=[5*cm, 12*cm]
)
story.append(t)
story.append(spacer(6))
story.append(sub_header("Electrodiagnostic Studies"))
story.append(body(
"EMG and nerve conduction studies are indicated when the underlying cause is a paralytic condition "
"(poliomyelitis, spina bifida, cerebral palsy). They assess residual muscle function and guide "
"tendon transfer planning."
))
# ─── Section 7: Treatment ─────────────────────────────────────────────────────
story.append(spacer(10))
story.append(section_header("Treatment", 7))
story.append(spacer(6))
story.append(highlight_box(
"Fundamental Principle: Once ITB contracture is established, it CANNOT be corrected by "
"non-operative measures. Traction attempts only worsen pelvic obliquity. Surgical release is required."
))
story.append(spacer(8))
story.append(sub_header("7A. Prevention (Paralytic Conditions)"))
for b in [
"Position patient in <b>neutral rotation, slight abduction, no flexion</b>",
"Full <b>passive range of motion</b> of all joints, multiple times daily",
"Hips stretched in extension, adduction, and internal rotation",
"Denis Browne-type bar clipped to shoes to hold feet in slight internal rotation",
"Contracture must be corrected <b>before ambulation is allowed</b>",
]:
story.append(bullet(b))
story.append(spacer(6))
story.append(sub_header("7B. Non-Operative Treatment (Mild / ITB Syndrome)"))
t = make_table(
[Paragraph("Modality", styles["Normal"]), Paragraph("Details", styles["Normal"])],
[
[Paragraph("Physical therapy", body_style), Paragraph("ITB stretching program, hip abductor and gluteal strengthening, gait retraining", body_style)],
[Paragraph("Foam rolling / myofascial release", body_style), Paragraph("Reduces tightness in mild/early contracture and overuse presentations", body_style)],
[Paragraph("Orthoses / bracing", body_style), Paragraph("Long leg brace with pelvic band to maintain post-surgical correction", body_style)],
[Paragraph("Serial casting", body_style), Paragraph("For very mild contractures in young children; also used for recurvatum prevention", body_style)],
[Paragraph("Corticosteroid injection", body_style), Paragraph("Into trochanteric bursa for associated bursitis pain relief", body_style)],
[Paragraph("NSAIDs", body_style), Paragraph("Symptomatic relief in overuse/ITB syndrome presentations", body_style)],
],
col_widths=[5*cm, 12*cm]
)
story.append(t)
story.append(spacer(8))
story.append(sub_header("7C. Operative Treatment"))
story.append(sub_sub_header("Minor Contracture — Simple Fasciotomy"))
story.append(body(
"Division of the iliotibial band and fascia lata around the hip and knee. Simple fasciotomies "
"may correct a minor contracture, but recurrence is common and they do not correct severe contractures."
))
story.append(sub_sub_header("Moderate Contracture — Ober-Yount Procedure"))
story.append(body(
"<b>Indication:</b> Abduction and external rotation contractures of the hip. "
"Also used in myelomeningocele: proximal division of tensor fasciae latae + distal ITB release."
))
steps = [
"Patient in lateral position; transverse incision medial and distal to the ASIS, extending laterally above the greater trochanter",
"Divide the <b>iliopsoas tendon</b> distally; excise 1 cm",
"Detach the <b>sartorius</b> from ASIS; detach <b>rectus femoris</b> from AIIS; divide <b>tensor fasciae latae</b> from its anterior border completely posteriorly",
"Detach <b>gluteus medius and minimus</b> and short external rotators from trochanteric insertions",
"Retract sciatic nerve posteriorly; open hip capsule parallel to acetabular labrum",
"<b>Yount distal release:</b> Lateral longitudinal incision proximal to femoral condyle; divide ITB and fascia lata from biceps tendon to midline, 2.5 cm proximal to patella",
"<b>Excise</b> a 5–8 cm segment of ITB and lateral intermuscular septum",
"Confirm by palpation all tight bands are divided",
"<b>Post-op:</b> Hip spica cast — full extension, 10° abduction, internal rotation if possible; cast off at 2 weeks; long leg brace with pelvic band",
]
for i, s in enumerate(steps, 1):
story.append(Paragraph(f"<b>{i}.</b> {s}", bullet_style))
story.append(spacer(6))
story.append(sub_sub_header("Severe Deformity — Campbell Technique"))
story.append(body(
"Complete release of all muscles from the iliac wing with transfer of the crest of the ilium. "
"Indicated for the most severe deformities where simpler releases are insufficient."
))
story.append(spacer(6))
story.append(sub_sub_header("Knee Flexion Contracture — Graded Approach"))
t = make_table(
[Paragraph("Severity", styles["Normal"]), Paragraph("Surgical Treatment", styles["Normal"])],
[
[Paragraph("≤15–20° (young children)", body_style), Paragraph("Posterior hamstring lengthening + capsulotomy", body_style)],
[Paragraph("Moderate contracture", body_style), Paragraph("Supracondylar extension osteotomy of the femur", body_style)],
[Paragraph(">70° contracture", body_style), Paragraph("Division of ITB + hamstring tendons + posterior capsulotomy; skeletal traction via distal tibial pin; second-stage supracondylar osteotomy near skeletal maturity", body_style)],
],
col_widths=[5*cm, 12*cm]
)
story.append(t)
# ─── Section 8: Summary ───────────────────────────────────────────────────────
story.append(spacer(10))
story.append(section_header("Summary", 8))
story.append(spacer(6))
t = make_table(
[Paragraph("Feature", styles["Normal"]), Paragraph("Details", styles["Normal"])],
[
[Paragraph("Definition", body_style), Paragraph("Fibrotic shortening of fascia lata/ITB complex causing deformities at hip, knee, and tibia", body_style)],
[Paragraph("Classic etiology", body_style), Paragraph("Poliomyelitis (sustained frog-leg posture); also myelomeningocele, CP, injections, burns", body_style)],
[Paragraph("Key pathology", body_style), Paragraph("ITB acts as taut lateral bowstring; secondary adaptive changes are irreversible without surgery", body_style)],
[Paragraph("Hip deformity", body_style), Paragraph("Flexion + abduction + external rotation", body_style)],
[Paragraph("Knee deformity", body_style), Paragraph("Flexion contracture + genu valgum + external tibial torsion ± subluxation", body_style)],
[Paragraph("Key clinical test", body_style), Paragraph("Positive Ober test (leg fails to adduct to table level)", body_style)],
[Paragraph("Investigations", body_style), Paragraph("Clinical + X-ray series; MRI/US for soft tissue; EMG in paralytic cases; CT for rotational profile", body_style)],
[Paragraph("Minor contracture Rx", body_style), Paragraph("Simple fasciotomy (high recurrence)", body_style)],
[Paragraph("Moderate-severe Rx", body_style), Paragraph("Ober-Yount procedure (hip + distal ITB release)", body_style)],
[Paragraph("Severe Rx", body_style), Paragraph("Campbell technique (full iliac wing release); supracondylar osteotomy for knee", body_style)],
],
col_widths=[4.5*cm, 12.5*cm]
)
story.append(t)
story.append(spacer(14))
story.append(HRFlowable(width="100%", thickness=1, color=NAVY))
story.append(spacer(4))
story.append(Paragraph(
"Sources: Campbell's Operative Orthopaedics 15th Ed 2026 | Firestein & Kelley's Textbook of Rheumatology | "
"Miller's Review of Orthopaedics 9th Ed | Goldman-Cecil Medicine",
ParagraphStyle("src", parent=body_style, fontSize=8, textColor=colors.HexColor("#666666"),
alignment=TA_CENTER)
))
# Build PDF
doc.build(story)
print("PDF generated:", OUTPUT)
cd /home/daytona/workspace/itb-contracture && python generate_pdf.py 2>&1