Stoppa approach step by step

Reading File
Finding Sources
Finding Sources
Searching the Web

Stoppa approach acetabulum pelvic surgery step by step technique

Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Loading Image
Loading Image
Loading Image
I have all the information needed for a thorough step-by-step answer. Here is the complete guide:

Anterior Intrapelvic (Modified Stoppa) Approach - Step by Step

Also called the AIP approach, this is an anterior retropubic approach that provides direct access to the quadrilateral surface, posterior column, pelvic brim, and anterior sacroiliac joint - structures that are difficult to reach through the traditional ilioinguinal middle window. It is now a mainstay approach for many acetabular and pelvic ring fractures.

Indications

  • Anterior column and anterior wall fractures
  • Transverse fractures (infra- and juxtatectal)
  • T-shaped fractures
  • Associated anterior column + posterior hemitransverse fractures
  • Both-column fractures
  • Pelvic ring injuries
From Rockwood & Green's Fractures in Adults 10th ed, Table 51-5

Setup & Positioning

  • Radiolucent flat-top table (allows intraoperative fluoroscopy - AP and Judet views)
  • Patient supine
  • Foley catheter inserted - mandatory for bladder decompression, protection, and fluid monitoring
  • Ipsilateral limb draped free into the field
  • Hip and knee flexed (place a sterile bump under the knee) - this relaxes the iliopsoas muscle and the external iliac neurovascular bundle
  • Surgeon stands on the contralateral side of the table to the fracture
  • Prep from the nipple line to the pubic symphysis; include the entire ipsilateral limb

Step-by-Step Technique (Campbell's Operative Orthopaedics, Technique 1.75)

Step 1 - Skin Incision

Make a Pfannenstiel (transverse) incision approximately 1-2 cm above the symphysis pubis, extending toward (but not reaching) each external inguinal ring. Alternatively, a midline vertical skin incision can be made from 1 cm inferior to the symphysis to 2-3 cm inferior to the umbilicus.
Develop a proximal subcutaneous skin flap - this greatly improves access to the fracture site.
Incision - Pfannenstiel/midline with linea alba and bladder visible

Step 2 - Divide Subcutaneous Tissue and Fascia

Divide subcutaneous tissue in line with the skin incision to expose the fascia overlying both rectus abdominis muscles. Identify the linea alba by using the confluence of fibers from each side as a guide.

Step 3 - Split the Linea Alba

Incise vertically along the linea alba between the two heads of rectus abdominis. Extend the incision proximally and then continue distally until you are anterior to the symphysis pubis. Finger palpation of the symphysis distally helps confirm you are in the central midline plane.
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.

Step 4 - Enter the Space of Retzius (Retropubic Space)

Bluntly dissect into the space of Retzius (retropubic/preperitoneal space). Once this is complete, place a wide malleable retractor with a moist laparotomy sponge over the bladder and behind the symphysis to protect the bladder at all times throughout the procedure.
The pyramidalis muscle (if present) is released and tagged for later repair.
Bladder protection with wet sponge and catheter visible; periosteal dissection of superior pubic bone

Step 5 - Release the Rectus Insertion and Place Hohmann Retractor

Release the origin/insertion of the rectus abdominis off the posterior and anterior aspect of the pubic body on each side (ipsilateral side more extensively). Sharply dissect the thick periosteum from the superior pubic bone.
Place a sharp Hohmann retractor just lateral to the pubic body, over the anterior aspect of the superior pubic ramus on the injured side. This allows the rectus to be retracted anteriorly and superiorly, improving exposure.

Step 6 - Dissect Along the Pelvic Brim / Identify the Corona Mortis

Find the upper border of the superior pubic ramus (pecten pubis / pectineal line) and carry the dissection laterally along the pelvic brim, elevating away from the periosteum with a Cobb elevator.
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.
Corona mortis anatomy - anastomosis between inferior epigastric and obturator vessels, ligated inset

Step 7 - Release the Iliopectineal Fascia

Continue subperiosteal dissection laterally along the superior pubic ramus toward the iliopectineal eminence. Detach the iliopectineal fascia from the pelvic brim.
Dissect the beginning of the iliopectineal arch from the bone to allow elevation of the femoral vessels and nerve laterally. This is the key step that opens up the true pelvis.

Step 8 - Elevate Iliopsoas and Retract Neurovascular Structures

With the iliopectineal fascia released, the iliopsoas muscle and the external iliac vessels can now be subperiosteally elevated and retracted laterally and anteriorly using a suitable retractor. The entire pelvic brim should now be visualized.
At this point, ensure the hip and knee remain flexed to keep the neurovascular bundle relaxed.

Step 9 - Expose the Quadrilateral Surface

Use a Cobb elevator to subperiosteally elevate the periosteum and obturator internus muscle to expose the quadrilateral surface (medial wall of the acetabulum).
The obturator neurovascular bundle crosses the quadrilateral surface - identify it, protect it with a blunt or malleable retractor at all times, and mobilize it gently if needed for adequate exposure.

Step 10 - Extend Exposure Along the Pelvic Brim

Continue subperiosteal dissection more laterally along the pelvic brim to fully expose the internal surface of the superior pubic ramus adequate for plate fixation.
Place an additional Hohmann retractor on the posterior top of the acetabulum on the iliac part of the pelvic brim. Take care not to injure the external iliac vein, which lies close to the elevators at this level.
Dissection can be carried around the pelvic brim all the way to the sacroiliac joint if needed.

Step 11 - "Lateral Window" (Optional Extension)

For additional access to the iliac wing, iliopectineal eminence, or high anterior column fractures, a lateral window can be added:
  • Make a second incision along the iliac crest, starting ~2 cm posterior to the ASIS and following the crest posteriorly
  • The external oblique aponeurosis is released, and dissection proceeds into the internal iliac fossa by elevating the iliacus muscle
This combination (modified Stoppa + lateral window) provides access comparable to the ilioinguinal approach but without inguinal canal dissection.

Structures Exposed

StructureAccess
Pubic body and symphysisDirect
Superior pubic ramusDirect
Pelvic brim / iliopectineal lineDirect along entire length
Quadrilateral surfaceDirect
Medial wall of acetabulumDirect
Posterior column (medial aspect)Direct
Sciatic buttressDirect
Anterior sacroiliac jointDirect (with lateral extension)
Upper ilium / iliac crestVia lateral window

Key Hazards to Protect

StructureRiskPrevention
Urinary bladderRetraction/lacerationFoley catheter + wet lap sponge retractor at all times
Corona mortisTorrential hemorrhageIdentify and ligate ~4 cm lateral to midline before lateral dissection
External iliac veinLaceration with posterior HohmannKeep retractor tips subperiosteal
Obturator neurovascular bundleStretch/lacerationIdentify early, protect with malleable retractor, limit traction
Lumbosacral trunkStretch injuryAvoid excessive lateral retraction, keep hip flexed
PeritoneumInadvertent entry (proximal incision)Stay within 10 cm of pubis for extraperitoneal plane
Femoral nerveStretchKeep hip and knee flexed throughout

Closure

  1. Repair the periosteum/rectus insertion with nonabsorbable sutures
  2. Repair the pyramidalis if tagged at start
  3. Close the linea alba with running or interrupted absorbable sutures
  4. Close subcutaneous layer and skin in standard fashion
  5. Remove Foley catheter when appropriate postoperatively

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)

Generate pdf

Reading File
Running Command

ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "created"

Writing File

~/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}. &nbsp;{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()
Running Command

cd /tmp/workspace && python stoppa_pdf.py 2>&1

Running Command

ls -lh /tmp/workspace/Stoppa_Approach_Step_by_Step.pdf

Your PDF is ready. Here's the download link:

Stoppa Approach Step by Step

PDF Document · PDF

What's included (15 MB):
  • Title page with source attribution
  • Indications table
  • Setup & positioning checklist
  • All 11 surgical steps in numbered step-blocks with highlighted warnings (corona mortis, peritoneum, external iliac vein)
  • Structures exposed table
  • Key structures at risk table (with mechanism + prevention)
  • Closure steps
  • 3 full-color operative illustrations from Campbell's Operative Orthopaedics 15th Ed 2026
This is a shared conversation. Sign in to Orris to start your own chat.