Stoppa approach step by step
Stoppa approach acetabulum pelvic surgery step by step technique

This split remains extraperitoneal if kept within approximately 10 cm of the pubic symphysis. In the proximal part, take care NOT to incise the peritoneum - the entire approach must stay in the preperitoneal space.

CRITICAL WARNING - Corona Mortis ("Crown of Death"): The obturator artery or vein frequently has an anomalous anastomosis with the external iliac or inferior epigastric vessels. This is the corona mortis, found approximately 4 cm lateral to the midline along the posterior aspect of the superior pubic ramus. If accidentally cut, hemorrhage is very difficult to control. Identify and ligate all corona mortis vessels before proceeding further laterally.

| Structure | Access |
|---|---|
| Pubic body and symphysis | Direct |
| Superior pubic ramus | Direct |
| Pelvic brim / iliopectineal line | Direct along entire length |
| Quadrilateral surface | Direct |
| Medial wall of acetabulum | Direct |
| Posterior column (medial aspect) | Direct |
| Sciatic buttress | Direct |
| Anterior sacroiliac joint | Direct (with lateral extension) |
| Upper ilium / iliac crest | Via lateral window |
| Structure | Risk | Prevention |
|---|---|---|
| Urinary bladder | Retraction/laceration | Foley catheter + wet lap sponge retractor at all times |
| Corona mortis | Torrential hemorrhage | Identify and ligate ~4 cm lateral to midline before lateral dissection |
| External iliac vein | Laceration with posterior Hohmann | Keep retractor tips subperiosteal |
| Obturator neurovascular bundle | Stretch/laceration | Identify early, protect with malleable retractor, limit traction |
| Lumbosacral trunk | Stretch injury | Avoid excessive lateral retraction, keep hip flexed |
| Peritoneum | Inadvertent entry (proximal incision) | Stay within 10 cm of pubis for extraperitoneal plane |
| Femoral nerve | Stretch | Keep hip and knee flexed throughout |
Generate pdf
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "created"
~/stoppa_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus import ListFlowable, ListItem
import urllib.request
import io
from reportlab.platypus import Image as RLImage
OUTPUT = "/tmp/workspace/Stoppa_Approach_Step_by_Step.pdf"
# ── Styles ──────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
BRAND = colors.HexColor("#1B3A5C") # dark navy
ACCENT = colors.HexColor("#2E7DBF") # mid blue
WARN = colors.HexColor("#C0392B") # red for warnings
LIGHT_BG = colors.HexColor("#EEF4FA") # light blue-grey
STEP_BG = colors.HexColor("#FAFAFA")
title_style = ParagraphStyle(
"DocTitle", parent=styles["Title"],
fontSize=22, textColor=BRAND, spaceAfter=4, leading=28,
alignment=TA_CENTER
)
subtitle_style = ParagraphStyle(
"DocSubtitle", parent=styles["Normal"],
fontSize=11, textColor=ACCENT, spaceAfter=2, alignment=TA_CENTER
)
source_style = ParagraphStyle(
"Source", parent=styles["Normal"],
fontSize=8, textColor=colors.grey, alignment=TA_CENTER, spaceAfter=12
)
h1_style = ParagraphStyle(
"H1", parent=styles["Heading1"],
fontSize=14, textColor=colors.white, spaceAfter=4, spaceBefore=14,
leading=18, backColor=BRAND, leftIndent=-12, rightIndent=-12,
borderPad=6
)
h2_style = ParagraphStyle(
"H2", parent=styles["Heading2"],
fontSize=11, textColor=BRAND, spaceAfter=3, spaceBefore=10,
leading=14, borderPad=3
)
step_num_style = ParagraphStyle(
"StepNum", parent=styles["Normal"],
fontSize=13, textColor=colors.white, alignment=TA_CENTER,
leading=16
)
step_title_style = ParagraphStyle(
"StepTitle", parent=styles["Normal"],
fontSize=11, textColor=BRAND, leading=14, fontName="Helvetica-Bold"
)
body_style = ParagraphStyle(
"Body", parent=styles["Normal"],
fontSize=9.5, leading=14, spaceAfter=4, alignment=TA_JUSTIFY,
textColor=colors.HexColor("#222222")
)
bullet_style = ParagraphStyle(
"Bullet", parent=styles["Normal"],
fontSize=9.5, leading=13, leftIndent=14, spaceAfter=2,
textColor=colors.HexColor("#222222")
)
warning_style = ParagraphStyle(
"Warning", parent=styles["Normal"],
fontSize=9.5, leading=13, textColor=WARN,
backColor=colors.HexColor("#FDEDEC"),
borderPad=6, leftIndent=0, fontName="Helvetica-BoldOblique"
)
note_style = ParagraphStyle(
"Note", parent=styles["Normal"],
fontSize=9, leading=13, textColor=colors.HexColor("#555555"),
backColor=colors.HexColor("#FFF9E6"),
borderPad=5, leftIndent=0, fontName="Helvetica-Oblique"
)
footer_style = ParagraphStyle(
"Footer", parent=styles["Normal"],
fontSize=7.5, textColor=colors.grey, alignment=TA_CENTER
)
W, H = A4
MARGIN = 2 * cm
def hr(width=1, color=ACCENT, space_before=4, space_after=4):
return HRFlowable(width="100%", thickness=width, color=color,
spaceAfter=space_after, spaceBefore=space_before)
def h1(text):
return Paragraph(f" {text}", h1_style)
def h2(text):
return Paragraph(text, h2_style)
def body(text):
return Paragraph(text, body_style)
def bullet(items):
return [Paragraph(f"• {i}", bullet_style) for i in items]
def step_block(num, title, content_paras):
"""Returns a KeepTogether block for one surgical step."""
num_cell = Paragraph(str(num), step_num_style)
title_para = Paragraph(title, step_title_style)
content_cell = [title_para, Spacer(1, 3)] + content_paras
t = Table(
[[num_cell, content_cell]],
colWidths=[1.1 * cm, W - 2 * MARGIN - 1.4 * cm]
)
t.setStyle(TableStyle([
("BACKGROUND", (0, 0), (0, 0), ACCENT),
("BACKGROUND", (1, 0), (1, 0), STEP_BG),
("VALIGN", (0, 0), (-1, -1), "TOP"),
("ALIGN", (0, 0), (0, 0), "CENTER"),
("LEFTPADDING", (0, 0), (0, 0), 4),
("RIGHTPADDING", (0, 0), (0, 0), 4),
("TOPPADDING", (0, 0), (-1, -1), 7),
("BOTTOMPADDING", (0, 0), (-1, -1), 7),
("LEFTPADDING", (1, 0), (1, 0), 10),
("RIGHTPADDING", (1, 0), (1, 0), 8),
("BOX", (0, 0), (-1, -1), 0.5, colors.HexColor("#CCCCCC")),
("LINEAFTER", (0, 0), (0, 0), 1, ACCENT),
]))
return KeepTogether([t, Spacer(1, 6)])
def fetch_image(url, width_cm, height_cm):
try:
req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
data = urllib.request.urlopen(req, timeout=10).read()
img = RLImage(io.BytesIO(data), width=width_cm * cm, height=height_cm * cm)
return img
except Exception as e:
return Paragraph(f"[Image not available: {e}]", note_style)
def build_pdf():
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
leftMargin=MARGIN, rightMargin=MARGIN,
topMargin=MARGIN, bottomMargin=MARGIN + 0.5 * cm,
title="Anterior Intrapelvic (Modified Stoppa) Approach",
author="Orris Medical"
)
story = []
# ── Cover / Title ─────────────────────────────────────────────────────
story.append(Spacer(1, 0.6 * cm))
story.append(Paragraph("Anterior Intrapelvic (Modified Stoppa) Approach", title_style))
story.append(Paragraph("Step-by-Step Surgical Technique Guide", subtitle_style))
story.append(Paragraph(
"Source: Campbell's Operative Orthopaedics 15th Ed 2026 (Technique 1.75) & "
"Rockwood and Green's Fractures in Adults 10th Ed 2025", source_style))
story.append(hr(2, BRAND, 2, 10))
# ── Overview ──────────────────────────────────────────────────────────
story.append(h1("Overview"))
story.append(Spacer(1, 6))
story.append(body(
"The <b>Anterior Intrapelvic (AIP) approach</b>, also known as the <b>Modified Stoppa approach</b>, "
"is a retropubic surgical approach performed through a Pfannenstiel or midline incision. "
"It provides direct access to the quadrilateral surface, pelvic brim, and medial posterior column - "
"structures difficult to reach through the traditional ilioinguinal approach. "
"The approach avoids dissection in the inguinal canal and is now widely used for anterior "
"acetabular and pelvic ring fractures."
))
# ── Indications ───────────────────────────────────────────────────────
story.append(Spacer(1, 8))
story.append(h1("Indications"))
story.append(Spacer(1, 6))
ind_data = [
["Fracture Type", "Recommendation"],
["Anterior column fractures", "Preferred"],
["Anterior wall fractures", "Preferred"],
["Transverse (infra/juxtatectal)", "Preferred"],
["T-shaped fractures", "Preferred"],
["Anterior column + posterior hemitransverse", "Preferred"],
["Both-column fractures", "Preferred (± lateral window)"],
["Pelvic ring injuries", "Applicable"],
]
ind_table = Table(ind_data, colWidths=[10 * cm, 6 * cm])
ind_table.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), BRAND),
("TEXTCOLOR", (0, 0), (-1, 0), colors.white),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTSIZE", (0, 0), (-1, -1), 9),
("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, LIGHT_BG]),
("GRID", (0, 0), (-1, -1), 0.4, colors.HexColor("#AAAAAA")),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING",(0, 0), (-1, -1), 5),
("LEFTPADDING", (0, 0), (-1, -1), 8),
]))
story.append(ind_table)
# ── Setup & Positioning ───────────────────────────────────────────────
story.append(Spacer(1, 8))
story.append(h1("Setup & Positioning"))
story.append(Spacer(1, 6))
setup_items = [
"<b>Radiolucent flat-top table</b> - allows intraoperative AP and Judet fluoroscopy",
"Patient in <b>supine</b> position",
"<b>Foley catheter</b> - mandatory; decompresses and protects the bladder, monitors fluid balance",
"Ipsilateral limb <b>draped free</b> into the operative field",
"<b>Hip and knee flexed</b> (sterile bump under knee) - relaxes iliopsoas and external iliac neurovascular bundle",
"<b>Surgeon stands on the contralateral side</b> of the table relative to the fracture",
"Prep from the nipple line to pubic symphysis; include entire ipsilateral limb",
"Prophylactic antibiotics administered",
]
story.extend(bullet(setup_items))
# ── Step-by-Step ──────────────────────────────────────────────────────
story.append(Spacer(1, 8))
story.append(h1("Step-by-Step Technique"))
story.append(Spacer(1, 6))
steps = [
(
"Step 1", "Skin Incision",
[
body("Make a <b>Pfannenstiel (transverse) incision</b> approximately 1-2 cm above the symphysis pubis, "
"extending toward (but not reaching) each external inguinal ring."),
body("Alternatively, a <b>midline vertical incision</b> from 1 cm inferior to the symphysis to "
"2-3 cm inferior to the umbilicus may be used."),
body("Develop a proximal subcutaneous skin flap - this significantly improves access to the fracture site."),
]
),
(
"Step 2", "Divide Subcutaneous Tissue and Expose Fascia",
[
body("Divide subcutaneous tissue in line with the skin incision to expose the fascia "
"overlying both rectus abdominis muscles."),
body("Identify the <b>linea alba</b> using the confluence of fibers from each side as a guide."),
]
),
(
"Step 3", "Split the Linea Alba",
[
body("Incise <b>vertically along the linea alba</b> between the two heads of the rectus abdominis muscle."),
body("Extend the incision proximally then continue distally to the anterior symphysis. "
"Finger palpation of the symphysis confirms central placement."),
Paragraph(
"⚠ Stay EXTRAPERITONEAL - this split remains extraperitoneal within ~10 cm of the pubis. "
"In the proximal portion, do NOT incise the peritoneum.",
warning_style
),
]
),
(
"Step 4", "Enter the Space of Retzius (Retropubic Space)",
[
body("Bluntly dissect into the <b>space of Retzius</b> (retropubic/preperitoneal space)."),
body("Place a wide <b>malleable retractor with a moist laparotomy sponge</b> over the bladder "
"and behind the symphysis to protect the bladder at all times."),
body("Release and tag the <b>pyramidalis muscle</b> (if present) for later repair."),
]
),
(
"Step 5", "Release the Rectus Insertion & Place Hohmann Retractor",
[
body("Release the <b>insertion of the rectus abdominis</b> off the anterior and posterior "
"aspect of the pubic body on each side."),
body("Sharply dissect the thick periosteum from the superior pubic bone."),
body("Place a sharp <b>Hohmann retractor</b> just lateral to the pubic body over the anterior "
"aspect of the superior pubic ramus on the injured side."),
body("This allows the rectus to be retracted anteriorly and superiorly, opening the field."),
]
),
(
"Step 6", "Dissect Along the Pelvic Brim - Identify & Ligate the Corona Mortis",
[
body("Find the upper border of the superior pubic ramus (<b>pecten pubis / pectineal line</b>). "
"Carry the dissection laterally along the pelvic brim with a Cobb elevator."),
Paragraph(
"⚠ CRITICAL - CORONA MORTIS ('Crown of Death'): The obturator artery or vein frequently "
"anastomoses with the external iliac or inferior epigastric vessels approximately 4 cm lateral "
"to the midline along the posterior superior pubic ramus. "
"If cut accidentally, hemorrhage is very difficult to control. "
"IDENTIFY AND LIGATE ALL CORONA MORTIS VESSELS before continuing lateral dissection.",
warning_style
),
]
),
(
"Step 7", "Release the Iliopectineal Fascia",
[
body("Continue subperiosteal dissection laterally toward the <b>iliopectineal eminence</b>."),
body("Detach the <b>iliopectineal fascia</b> from the pelvic brim."),
body("Dissect the beginning of the <b>iliopectineal arch</b> from the bone to allow elevation "
"of the femoral vessels and nerve laterally - this is the key step opening the true pelvis."),
]
),
(
"Step 8", "Elevate Iliopsoas & Retract Neurovascular Structures",
[
body("With the iliopectineal fascia released, subperiosteally elevate the <b>iliopsoas muscle</b> "
"and retract it laterally with the <b>external iliac vessels</b> using a suitable retractor."),
body("The entire <b>pelvic brim</b> should now be visualized."),
body("Keep the hip and knee flexed to maintain relaxation of the neurovascular bundle."),
]
),
(
"Step 9", "Expose the Quadrilateral Surface",
[
body("Use a <b>Cobb elevator</b> to subperiosteally elevate the periosteum and "
"<b>obturator internus muscle</b>, exposing the <b>quadrilateral surface</b> (medial acetabular wall)."),
body("Identify the <b>obturator neurovascular bundle</b> as it crosses the quadrilateral surface. "
"Protect it at all times with a blunt or malleable retractor; mobilize gently only if necessary."),
]
),
(
"Step 10", "Extend Exposure Along the Pelvic Brim to the Sacroiliac Joint",
[
body("Continue subperiosteal dissection laterally along the pelvic brim to fully expose the "
"internal surface of the superior pubic ramus for plate fixation."),
body("Place an additional <b>Hohmann retractor</b> on the posterior top of the acetabulum on "
"the iliac part of the pelvic brim."),
Paragraph(
"⚠ Keep retractor tips strictly subperiosteal - the external iliac vein lies very close "
"to the elevators at this level.",
warning_style
),
body("Dissection can be extended around the pelvic brim all the way to the "
"<b>sacroiliac joint</b> if required."),
]
),
(
"Step 11", "Lateral Window (Optional Extension)",
[
Paragraph(
"Note: Added when access to the iliac wing, iliopectineal eminence, or high anterior column is needed.",
note_style
),
Spacer(1, 4),
body("Make a second incision along the <b>iliac crest</b>, starting ~2 cm posterior to the ASIS "
"and following the crest posteriorly."),
body("Release the external oblique aponeurosis and dissect into the <b>internal iliac fossa</b> "
"by elevating the iliacus muscle."),
body("This combination (modified Stoppa + lateral window) provides exposure equivalent to the "
"ilioinguinal approach, without dissection in the inguinal canal."),
]
),
]
for num_str, title, content in steps:
story.append(step_block(num_str.replace("Step ", ""), title, content))
# ── Structures Exposed ────────────────────────────────────────────────
story.append(h1("Structures Exposed"))
story.append(Spacer(1, 6))
exp_data = [
["Structure", "Access Type"],
["Pubic body and symphysis", "Direct"],
["Superior pubic ramus", "Direct"],
["Pelvic brim / iliopectineal line", "Direct - along entire length"],
["Quadrilateral surface", "Direct"],
["Medial wall of acetabulum", "Direct"],
["Posterior column (medial aspect)", "Direct"],
["Sciatic buttress", "Direct"],
["Anterior sacroiliac joint", "Direct"],
["Upper ilium / iliac crest", "Via lateral window"],
]
exp_table = Table(exp_data, colWidths=[10 * cm, 6 * cm])
exp_table.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), BRAND),
("TEXTCOLOR", (0, 0), (-1, 0), colors.white),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTSIZE", (0, 0), (-1, -1), 9),
("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, LIGHT_BG]),
("GRID", (0, 0), (-1, -1), 0.4, colors.HexColor("#AAAAAA")),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING",(0, 0), (-1, -1), 5),
("LEFTPADDING", (0, 0), (-1, -1), 8),
]))
story.append(exp_table)
# ── Key Hazards ───────────────────────────────────────────────────────
story.append(Spacer(1, 8))
story.append(h1("Key Structures at Risk"))
story.append(Spacer(1, 6))
haz_data = [
["Structure at Risk", "Mechanism of Injury", "Prevention"],
["Urinary bladder", "Retraction / laceration", "Foley catheter + wet lap sponge retractor at all times"],
["Corona mortis vessels", "Unrecognized ligation\n→ torrential hemorrhage", "Identify & ligate ~4 cm lateral to midline before lateral dissection"],
["External iliac vein", "Laceration with Hohmann tip", "Keep all retractors strictly subperiosteal"],
["Obturator nerve & vessels", "Stretch / laceration on quadrilateral surface", "Identify early; protect with malleable retractor; limit traction"],
["Lumbosacral trunk", "Stretch with excessive lateral retraction", "Avoid excess retraction; maintain hip flexion"],
["Peritoneum", "Inadvertent entry (proximal)", "Stay within 10 cm of pubis for extraperitoneal plane"],
["Femoral nerve", "Stretch from hip extension", "Keep hip and knee flexed throughout entire procedure"],
]
haz_table = Table(haz_data, colWidths=[4.2 * cm, 5.3 * cm, 6.5 * cm])
haz_table.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), WARN),
("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.white, colors.HexColor("#FDF2F2")]),
("GRID", (0, 0), (-1, -1), 0.4, colors.HexColor("#CCCCCC")),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING",(0, 0), (-1, -1), 5),
("LEFTPADDING", (0, 0), (-1, -1), 6),
("VALIGN", (0, 0), (-1, -1), "TOP"),
]))
story.append(haz_table)
# ── Closure ───────────────────────────────────────────────────────────
story.append(Spacer(1, 8))
story.append(h1("Closure"))
story.append(Spacer(1, 6))
closure_steps = [
"Repair the <b>periosteum and rectus insertion</b> with nonabsorbable sutures",
"Repair the <b>pyramidalis muscle</b> if tagged at the start",
"Close the <b>linea alba</b> with running or interrupted absorbable sutures",
"Close the <b>subcutaneous layer</b> and skin in standard fashion",
"Remove the <b>Foley catheter</b> when appropriate postoperatively",
]
for i, s in enumerate(closure_steps, 1):
story.append(Paragraph(f"{i}. {s}", bullet_style))
# ── Images ────────────────────────────────────────────────────────────
story.append(Spacer(1, 10))
story.append(h1("Operative Illustrations (Campbell's Operative Orthopaedics)"))
story.append(Spacer(1, 8))
img_urls = [
(
"https://cdn.orris.care/cdss_images/502318892f542116ed900a3208bb51a2851ac71437dcc62be5b68326d2386b8c.png",
"Fig A-B: Left - Pfannenstiel/midline incision landmarks. Right - Linea alba split showing rectus abdominis, "
"transversus abdominis, peritoneum and bladder."
),
(
"https://cdn.orris.care/cdss_images/07dc3a7afcbddd8ae308a975b6773ddb75f8a96281cc171e57e4a1f571199480.png",
"Fig C-D: Left - Bladder protected with wet sponge and catheter in retropubic space. "
"Right - Periosteal dissection from superior pubic bone with Hohmann retractor."
),
(
"https://cdn.orris.care/cdss_images/7f96474fa1e58f2a6dc5d4fac580743a66391ebba9aaec7e078b946759eb00a9.png",
"Fig E: Corona mortis anatomy - anomalous anastomosis between inferior epigastric and obturator vessels "
"shown with ligation points (inset). Must be identified and ligated before lateral dissection."
),
]
for url, caption in img_urls:
img = fetch_image(url, 15, 7.5)
cap = Paragraph(f"<i>{caption}</i>", ParagraphStyle(
"Cap", parent=styles["Normal"], fontSize=8, leading=11,
textColor=colors.HexColor("#555555"), spaceAfter=10, spaceBefore=3,
alignment=TA_CENTER
))
story.append(KeepTogether([img, cap]))
# ── Footer reference ──────────────────────────────────────────────────
story.append(Spacer(1, 10))
story.append(hr(0.5, colors.grey))
story.append(Paragraph(
"Sources: Campbell's Operative Orthopaedics 15th Ed 2026 (Technique 1.75, pp. 90-92) | "
"Rockwood and Green's Fractures in Adults 10th Ed 2025 (Ch. 51, Fig. 51-60) | "
"Generated by Orris Medical AI",
footer_style
))
doc.build(story)
print(f"PDF saved to: {OUTPUT}")
if __name__ == "__main__":
build_pdf()
cd /tmp/workspace && python stoppa_pdf.py 2>&1
ls -lh /tmp/workspace/Stoppa_Approach_Step_by_Step.pdf
Stoppa Approach Step by Step
PDF Document · PDF