Make a PowerPoint presentation for JV as jr1

Reading File
Browsing Directory

~/attachments/2b5fc1d8-f941-4310-91b3-99cffec1111e

Running Command

mkdir -p /tmp/workspace/jc_ppt && cd /tmp/workspace/jc_ppt && python3 -c " import pdfplumber path = '/tmp/workspace/attachments/2b5fc1d8-f941-4310-91b3-99cffec1111e/JC Article.pdf' with pdfplumber.open(path) as pdf: print('pages', len(pdf.pages)) text = '' for i, page in enumerate(pdf.pages): t = page.extract_text() or '' text += f'--- PAGE {i+1} ---\n' + t + '\n' with open('extracted.txt', 'w') as f: f.write(text) print(len(text)) "

Reading File
Reading File
Reading File
Running Command

cd /tmp/workspace/jc_ppt && python3 -c " import pdfplumber path = '/tmp/workspace/attachments/2b5fc1d8-f941-4310-91b3-99cffec1111e/JC Article.pdf' with pdfplumber.open(path) as pdf: for i, page in enumerate(pdf.pages): im = page.to_image(resolution=200) im.save(f'page_{i+1}.png') print('saved', i+1, page.width, page.height) " ls -la /tmp/workspace/jc_ppt/

Reading File
Reading File
Reading File
Reading File
Running Command

cd /tmp/workspace/jc_ppt && python3 -c " from PIL import Image for i in range(1,5): im = Image.open(f'page_{i}.png') im = im.convert('RGB') im.save(f'page_{i}_sm.jpg', quality=60) print(i, im.size) " ls -la /tmp/workspace/jc_ppt/*.jpg

Running Command

cd /tmp/workspace/jc_ppt && python3 -c " from PIL import Image for i in range(1,5): im = Image.open(f'page_{i}.png').convert('RGB') im = im.resize((900, 1275)) im.save(f'page_{i}_sm.jpg', quality=55) " ls -la /tmp/workspace/jc_ppt/*.jpg

Reading File
Reading File
Reading File
Writing File

~/jc_ppt/build_ppt.py

from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE

NAVY = RGBColor(0x0B, 0x2E, 0x4E)
BLUE = RGBColor(0x1F, 0x6F, 0xA8)
LIGHT = RGBColor(0xF2, 0xF6, 0xF9)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
GRAY = RGBColor(0x4A, 0x4A, 0x4A)
ACCENT = RGBColor(0xE8, 0x8A, 0x2E)

prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
BLANK = prs.slide_layouts[6]
SW, SH = prs.slide_width, prs.slide_height

def add_slide():
    return prs.slides.add_slide(BLANK)

def bg(slide, color=WHITE):
    slide.background.fill.solid()
    slide.background.fill.fore_color.rgb = color

def add_bar(slide, y=Inches(0), height=Inches(1.15), color=NAVY):
    shp = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, y, SW, height)
    shp.fill.solid(); shp.fill.fore_color.rgb = color
    shp.line.fill.background()
    return shp

def add_text(slide, x, y, w, h, text, size=18, color=GRAY, bold=False, italic=False,
             align=PP_ALIGN.LEFT, font="Calibri", anchor=None, line_spacing=1.0):
    tb = slide.shapes.add_textbox(x, y, w, h)
    tf = tb.text_frame
    tf.word_wrap = True
    if anchor:
        tf.vertical_anchor = anchor
    lines = text.split("\n")
    for i, line in enumerate(lines):
        p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
        p.text = line
        p.alignment = align
        p.line_spacing = line_spacing
        for r in p.runs:
            r.font.size = Pt(size)
            r.font.color.rgb = color
            r.font.bold = bold
            r.font.italic = italic
            r.font.name = font
    return tb

def add_bullets(slide, x, y, w, h, items, size=16, color=GRAY, bold_first=False,
                 font="Calibri", space_after=8, line_spacing=1.05, bullet_color=None):
    tb = slide.shapes.add_textbox(x, y, w, h)
    tf = tb.text_frame
    tf.word_wrap = True
    bc = bullet_color or BLUE
    for i, item in enumerate(items):
        if isinstance(item, tuple):
            txt, lvl = item
        else:
            txt, lvl = item, 0
        p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
        p.line_spacing = line_spacing
        p.space_after = Pt(space_after)
        prefix = ("•  " if lvl == 0 else "-  ")
        p.text = prefix + txt
        for r in p.runs:
            r.font.size = Pt(size - (2 if lvl else 0))
            r.font.color.rgb = color
            r.font.name = font
        p.level = 0
        tb.text_frame.paragraphs[i].alignment = PP_ALIGN.LEFT
    return tb

def footer(slide, page_num):
    add_text(slide, Inches(0.5), Inches(7.15), Inches(6), Inches(0.3),
              "Journal Club  |  Presenter: Dr. JV (JR-1)", size=10, color=RGBColor(0x9A,0x9A,0x9A))
    add_text(slide, Inches(12.3), Inches(7.15), Inches(0.6), Inches(0.3),
              str(page_num), size=10, color=RGBColor(0x9A,0x9A,0x9A), align=PP_ALIGN.RIGHT)

def title_header(slide, title, subtitle=None):
    add_bar(slide, y=0, height=Inches(1.1), color=NAVY)
    add_text(slide, Inches(0.55), Inches(0.18), Inches(12), Inches(0.7), title,
              size=28, color=WHITE, bold=True)
    if subtitle:
        add_text(slide, Inches(0.55), Inches(0.7), Inches(12), Inches(0.4), subtitle,
                  size=14, color=RGBColor(0xBF,0xD7,0xEA), italic=True)
    line = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, Inches(0.55), Inches(1.18), Inches(1.3), Pt(4))
    line.fill.solid(); line.fill.fore_color.rgb = ACCENT
    line.line.fill.background()

# ---------------- SLIDE 1: TITLE ----------------
s = add_slide(); bg(s, NAVY)
band = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, Inches(5.6), SW, Inches(1.9))
band.fill.solid(); band.fill.fore_color.rgb = RGBColor(0x08,0x22,0x3A); band.line.fill.background()
accent = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, Inches(2.55), Inches(0.18), Inches(1.6))
accent.fill.solid(); accent.fill.fore_color.rgb = ACCENT; accent.line.fill.background()
add_text(s, Inches(0.6), Inches(1.0), Inches(11), Inches(0.5), "JOURNAL CLUB", size=20, color=RGBColor(0x9A,0xC6,0xE8), bold=True)
add_text(s, Inches(0.55), Inches(2.3), Inches(12.2), Inches(2.0),
          "Prophylactic Ureteral Stent Placement by General\nSurgeons is Safe and Feasible",
          size=34, color=WHITE, bold=True, line_spacing=1.05)
add_text(s, Inches(0.6), Inches(4.15), Inches(12), Inches(0.6),
          "Implementation of a Training and Credentialing Program for Non-Urologic Surgeons",
          size=18, color=RGBColor(0xBF,0xD7,0xEA), italic=True)
add_text(s, Inches(0.6), Inches(4.85), Inches(12), Inches(0.5),
          "Tamashiro K-K, Wilkins CJ, Maron A, et al.  |  The American Journal of Surgery 250 (2025) 116474",
          size=13, color=RGBColor(0x9A,0xA9,0xB8))
add_text(s, Inches(0.6), Inches(5.85), Inches(6), Inches(0.5), "Presented by: Dr. JV", size=20, color=WHITE, bold=True)
add_text(s, Inches(0.6), Inches(6.3), Inches(6), Inches(0.5), "Junior Resident 1 (JR-1)", size=16, color=RGBColor(0xBF,0xD7,0xEA))
add_text(s, Inches(9.2), Inches(6.0), Inches(3.5), Inches(0.5), "Journal Club Presentation", size=13, color=RGBColor(0x9A,0xA9,0xB8), align=PP_ALIGN.RIGHT)

# ---------------- SLIDE 2: OUTLINE ----------------
s = add_slide(); bg(s)
title_header(s, "Outline")
items = ["Background & Rationale","Study Objective","Methods: Design & Training Program",
         "Results: Patient Demographics","Results: Complications & Cannulation Outcomes",
         "Risk Factors & Diagnosis-Specific Findings","Discussion & Comparison with Literature",
         "Limitations","Conclusions & Take-Home Points"]
add_bullets(s, Inches(0.9), Inches(1.7), Inches(10.5), Inches(5), items, size=20, space_after=16, color=NAVY)
footer(s,2)

# ---------------- SLIDE 3: BACKGROUND ----------------
s = add_slide(); bg(s)
title_header(s, "Background & Rationale")
add_bullets(s, Inches(0.6), Inches(1.5), Inches(12.1), Inches(5.2), [
    "Ureteral injury is a rare but serious complication of pelvic surgery (colorectal & gynecologic), incidence 0.2-10%",
    "Associated with significant short- and long-term morbidity",
    "Strategies to mitigate injury:",
    ("Prophylactic ureteral stenting (via rigid cystoscopy before abdominal incision)", 1),
    ("Intraureteral indocyanine green (ICG) injection for intraoperative fluorescence guidance", 1),
    "Traditionally performed by urologists - requires coordination between operating and urology teams",
    "At community-based institutions, urology coverage may not be consistently available",
    "Reported complication rate of prophylactic stenting by urologists in literature: 2.37-12.1%",
], size=18, space_after=14)
footer(s,3)

# ---------------- SLIDE 4: OBJECTIVE ----------------
s = add_slide(); bg(s)
title_header(s, "Study Objective")
box = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, Inches(1.2), Inches(2.4), Inches(10.9), Inches(2.6))
box.fill.solid(); box.fill.fore_color.rgb = LIGHT
box.line.color.rgb = BLUE; box.line.width = Pt(1.5)
tf = box.text_frame; tf.word_wrap = True; tf.vertical_anchor = MSO_ANCHOR.MIDDLE
tf.margin_left = Inches(0.4); tf.margin_right = Inches(0.4)
p = tf.paragraphs[0]
p.text = "To establish the safety and feasibility of non-urologic surgeons (general surgery, colorectal, obstetrics & gynecology) performing cystoscopy and prophylactic ureteral stent placement, after completing a structured training and credentialing program addressing limited urologic coverage."
p.alignment = PP_ALIGN.CENTER
for r in p.runs:
    r.font.size = Pt(22); r.font.color.rgb = NAVY; r.font.bold = True
footer(s,4)

# ---------------- SLIDE 5: METHODS - DESIGN ----------------
s = add_slide(); bg(s)
title_header(s, "Methods: Study Design")
add_bullets(s, Inches(0.6), Inches(1.5), Inches(12.1), Inches(5.2), [
    "Retrospective review, single institution (Community Medical Centers, Fresno, CA)",
    "Study period: July 2017 - July 2024",
    "Population: Adults (>=18 yrs) undergoing cystoscopy +/- prophylactic ureteral stent placement and/or ureteral cannulation with ICG injection, performed by the PRIMARY OPERATING SURGEON",
    "Excluded: stent placement by urologists; patients with pre-op AKI, UTI, or indwelling urinary catheters",
    "Data collected: demographics, service/indication for surgery, surgical approach (open vs robotic vs laparoscopic), laterality (unilateral vs bilateral), indwelling vs ICG-alone, and complications",
    "Complications assessed (within 30 days): gross hematuria >=3 days, AKI (KDIGO criteria), urinary retention, UTI, urethral injury, ureteral injury",
    "Statistics: chi-square/Fisher's exact, Bonferroni post-hoc, binary logistic regression; significance p<0.05 (SPSS v29)",
], size=16.5, space_after=11)
footer(s,5)

# ---------------- SLIDE 6: TRAINING PROGRAM ----------------
s = add_slide(); bg(s)
title_header(s, "Methods: Training & Credentialing Program")
add_bullets(s, Inches(0.6), Inches(1.45), Inches(12.1), Inches(5.4), [
    "Structured in-house course for surgeons without prior ureteral stent experience",
    "Step 1 - Didactic session: stent types, indications, placement/removal technique, management of complications, and criteria for urology consultation",
    "Step 2 - Simulation: hands-on practice on a custom bladder model (suction cups simulating ureteral orifices) - minimum of 4 sets of bilateral stents placed",
    "Step 3 - Supervised clinical practice: 6 proctored ureteral stent placements under an experienced surgeon before independent privileges granted",
    "Maintenance of privileges: minimum 2 procedures/year required",
    "Since 2017, 23 providers across general surgery, colorectal surgery, and OB/GYN obtained credentialing",
], size=17, space_after=13)
footer(s,6)

# ---------------- SLIDE 7: RESULTS - DEMOGRAPHICS ----------------
s = add_slide(); bg(s)
title_header(s, "Results: Patient Demographics (Table 1)")
add_text(s, Inches(0.6), Inches(1.35), Inches(12), Inches(0.4),
          "748 cases included (of 834 screened) | Mean age 54.6 +/- 15.7 yrs | 482 female (64.4%)", size=16, color=NAVY, bold=True)

rows = [
    ("Service performed by", "Colorectal 504 (67.4%)  |  General Surgery 68 (9.1%)  |  Gynecology 112 (15.0%)  |  Obstetrics 64 (8.6%)"),
    ("Pre-op diagnosis", "Benign colorectal 364 (48.7%)  |  Colorectal cancer 206 (27.5%)  |  Gynecologic 122 (16.3%)  |  Obstetric 64 (8.6%)"),
    ("Surgical approach", "Robotic-assisted 478 (63.9%)  |  Open 239 (32.0%)  |  Laparoscopic 31 (4.1%)"),
    ("Complications", "70 cases (9.4%)"),
    ("Inability to cannulate ureter", "17 cases (2.3%)"),
]
y = Inches(2.0)
for label, val in rows:
    r = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, Inches(0.6), y, Inches(3.3), Inches(0.85))
    r.fill.solid(); r.fill.fore_color.rgb = NAVY; r.line.fill.background()
    tf = r.text_frame; tf.word_wrap = True; tf.vertical_anchor = MSO_ANCHOR.MIDDLE
    p = tf.paragraphs[0]; p.text = label; p.alignment = PP_ALIGN.CENTER
    for run in p.runs: run.font.size = Pt(13); run.font.bold = True; run.font.color.rgb = WHITE
    r2 = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, Inches(3.95), y, Inches(8.75), Inches(0.85))
    r2.fill.solid(); r2.fill.fore_color.rgb = LIGHT; r2.line.color.rgb = RGBColor(0xD8,0xD8,0xD8); r2.line.width=Pt(0.75)
    tf2 = r2.text_frame; tf2.word_wrap = True; tf2.vertical_anchor = MSO_ANCHOR.MIDDLE
    tf2.margin_left = Inches(0.15); tf2.margin_right = Inches(0.1)
    p2 = tf2.paragraphs[0]; p2.text = val; p2.alignment = PP_ALIGN.LEFT
    for run in p2.runs: run.font.size = Pt(13); run.font.color.rgb = GRAY
    y += Inches(0.95)
footer(s,7)

# ---------------- SLIDE 8: RESULTS - COMPLICATIONS ----------------
s = add_slide(); bg(s)
title_header(s, "Results: Complications & Cannulation Success")
add_text(s, Inches(0.6), Inches(1.35), Inches(12), Inches(0.4),
          "Overall complication rate: 9.4%  |  Successful ureter cannulation rate: 97.7%", size=18, color=NAVY, bold=True)

comp_data = [("AKI","4.4%"),("Urinary retention","3.3%"),("UTI","2.7%"),
             ("Hematuria >=3 days","0.9%"),("Ureteral injury","0.5%"),("Urethral injury","0.4%")]
x0 = Inches(0.7); w = Inches(1.95); gap = Inches(0.15); y0 = Inches(2.2); maxh = Inches(3.6)
maxval = 4.4
for i,(label,val) in enumerate(comp_data):
    v = float(val.strip('%').replace('>=',''))
    h = Inches(0.3 + (v/maxval)*3.0)
    x = Inches(0.7 + i*(1.95+0.15))
    bar = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, x, Inches(2.2)+ (maxh-h), w, h)
    bar.fill.solid(); bar.fill.fore_color.rgb = BLUE if val!="0.5%" and val!="0.4%" else ACCENT
    bar.line.fill.background()
    add_text(s, x, Inches(2.2)+(maxh-h)-Inches(0.35), w, Inches(0.35), val, size=15, bold=True, color=NAVY, align=PP_ALIGN.CENTER)
    add_text(s, x-Inches(0.05), Inches(2.2)+maxh+Inches(0.08), w+Inches(0.1), Inches(0.6), label, size=12, color=GRAY, align=PP_ALIGN.CENTER)

add_bullets(s, Inches(0.6), Inches(6.25), Inches(12.1), Inches(1.1), [
    "No significant difference in complications by surgical service (p=0.193), approach (p=0.648), unilateral stent (p=0.768), bilateral stents (p=0.801), or ICG alone (p=0.596)",
    "4 ureteral injuries occurred; none attributed to cystoscopy/stent placement itself",
], size=13.5, space_after=6)
footer(s,8)

# ---------------- SLIDE 9: RISK FACTORS ----------------
s = add_slide(); bg(s)
title_header(s, "Risk Factors for Complications")
add_bullets(s, Inches(0.6), Inches(1.55), Inches(12.1), Inches(3.0), [
    "Increasing age significantly associated with higher odds of complication (p < 0.001)",
    "Male sex significantly associated with complications (p = 0.036)",
    "Colorectal cancer as surgical indication significantly associated with complications (p < 0.001)",
    "Specific associations:",
    ("Age -> predictor of AKI (p<0.001), urinary retention (p<0.001), UTI (p=0.008)", 1),
    ("Male sex -> predictor of hematuria (p=0.010) and urethral injury (p=0.045)", 1),
], size=17, space_after=10)

box = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, Inches(0.6), Inches(5.1), Inches(12.1), Inches(1.7))
box.fill.solid(); box.fill.fore_color.rgb = LIGHT; box.line.color.rgb=BLUE; box.line.width=Pt(1)
tf = box.text_frame; tf.word_wrap=True; tf.vertical_anchor=MSO_ANCHOR.MIDDLE
tf.margin_left=Inches(0.3); tf.margin_right=Inches(0.3)
p = tf.paragraphs[0]
p.text = "Table 2 (diagnosis-specific): Colorectal cancer -> higher AKI (p<0.001) & urinary retention (p<0.001); Benign colorectal -> higher urinary retention (p<0.001) & UTI (p=0.038); Obstetrics -> higher ureteral injury (p=0.015)"
p.alignment = PP_ALIGN.LEFT
for r in p.runs: r.font.size=Pt(15); r.font.color.rgb=NAVY; r.font.italic=True
footer(s,9)

# ---------------- SLIDE 10: DISCUSSION ----------------
s = add_slide(); bg(s)
title_header(s, "Discussion: Comparison with Literature")
add_bullets(s, Inches(0.6), Inches(1.5), Inches(12.1), Inches(5.2), [
    "Non-urologic surgeon complication rate (9.4%) comparable to published urologist rates (2.7-12.1%)",
    "Cannulation success (97.2%) comparable to urologist rates (90-98%)",
    "No incidence of acute renal failure requiring dialysis; no complications requiring subsequent urologic intervention",
    "Prior work (Rizvi et al.) showed general surgeons can safely place emergency ureteral stents for obstructive uropathy - this study extends that to elective prophylactic placement",
    "First study to assess non-urologic surgeon performance specifically for prophylactic cystoscopic stenting and ICG use",
    "Clinical implication: allows flexibility in OR scheduling and reduces burden on urology services, especially where urology coverage is limited (rural/community hospitals)",
], size=16.5, space_after=12)
footer(s,10)

# ---------------- SLIDE 11: LIMITATIONS ----------------
s = add_slide(); bg(s)
title_header(s, "Limitations")
add_bullets(s, Inches(0.6), Inches(1.6), Inches(12.1), Inches(4.8), [
    "Observational, retrospective design",
    "Single institution - may limit generalizability (most applicable to rural/smaller hospital systems with limited urology access)",
    "Multiple providers performed procedures - potential technique variability",
    "Female predominance due to inclusion of OB/GYN cases (inherently all-female)",
    "Potential selection bias: patients with known urologic pathology or difficult anatomy had stenting performed by a urologist and were excluded",
], size=18, space_after=16)
footer(s,11)

# ---------------- SLIDE 12: CONCLUSION ----------------
s = add_slide(); bg(s)
title_header(s, "Conclusions")
box = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, Inches(1.0), Inches(1.9), Inches(11.3), Inches(2.2))
box.fill.solid(); box.fill.fore_color.rgb = NAVY; box.line.fill.background()
tf = box.text_frame; tf.word_wrap=True; tf.vertical_anchor=MSO_ANCHOR.MIDDLE
tf.margin_left=Inches(0.4); tf.margin_right=Inches(0.4)
p = tf.paragraphs[0]
p.text = "Cystoscopy with prophylactic ureteral stent placement can be safely performed by non-urologic surgeons, with complication and cannulation rates comparable to urologists."
p.alignment=PP_ALIGN.CENTER
for r in p.runs: r.font.size=Pt(22); r.font.bold=True; r.font.color.rgb=WHITE

add_bullets(s, Inches(1.0), Inches(4.4), Inches(11.3), Inches(2.2), [
    "In regions where urology coverage is scarce, enabling the primary operating team to place prophylactic ureteral stents is invaluable",
    "Supports wider adoption of structured training/credentialing programs for non-urologic surgeons",
], size=18, space_after=14)
footer(s,12)

# ---------------- SLIDE 13: TAKE-HOME POINTS ----------------
s = add_slide(); bg(s)
title_header(s, "Take-Home Points")
pts = [
    "Ureteral injury is rare (0.2-10%) but serious; prophylactic stenting aids identification during pelvic surgery",
    "A structured didactic + simulation + proctored-case training program can safely credential non-urologic surgeons",
    "748 cases: 9.4% complication rate, 97.7% cannulation success - on par with urologist-performed benchmarks",
    "Older age, male sex, and colorectal cancer as indication were independent risk factors for complications",
    "This approach reduces reliance on urology availability and improves OR scheduling flexibility",
]
for i, pt in enumerate(pts):
    y = Inches(1.55 + i*1.05)
    num = s.shapes.add_shape(MSO_SHAPE.OVAL, Inches(0.7), y, Inches(0.55), Inches(0.55))
    num.fill.solid(); num.fill.fore_color.rgb = ACCENT; num.line.fill.background()
    tf = num.text_frame; tf.vertical_anchor = MSO_ANCHOR.MIDDLE
    p = tf.paragraphs[0]; p.text = str(i+1); p.alignment = PP_ALIGN.CENTER
    for r in p.runs: r.font.size=Pt(20); r.font.bold=True; r.font.color.rgb=WHITE
    add_text(s, Inches(1.5), y, Inches(11.0), Inches(0.9), pt, size=16.5, color=GRAY, anchor=MSO_ANCHOR.MIDDLE)
footer(s,13)

# ---------------- SLIDE 14: THANK YOU / CITATION ----------------
s = add_slide(); bg(s, NAVY)
add_text(s, Inches(0.6), Inches(2.6), Inches(12), Inches(1.2), "Thank You", size=48, color=WHITE, bold=True, align=PP_ALIGN.CENTER)
add_text(s, Inches(0.6), Inches(3.9), Inches(12), Inches(0.5), "Questions & Discussion", size=20, color=RGBColor(0xBF,0xD7,0xEA), align=PP_ALIGN.CENTER, italic=True)
add_text(s, Inches(1.0), Inches(5.4), Inches(11.3), Inches(1.0),
          "Reference: Tamashiro K-K, Wilkins CJ, Maron A, et al. Prophylactic ureteral stent placement by "
          "general surgeons is safe and feasible: implementation of a training and credentialing program for "
          "non-urologic surgeons. Am J Surg. 2025;250:116474.",
          size=12, color=RGBColor(0x9A,0xA9,0xB8), align=PP_ALIGN.CENTER)
add_text(s, Inches(0.6), Inches(6.8), Inches(12), Inches(0.4), "Presented by Dr. JV (JR-1)", size=13, color=WHITE, align=PP_ALIGN.CENTER)

prs.save("/tmp/workspace/jc_ppt/Journal_Club_Ureteral_Stent_JV_JR1.pptx")
print("saved")
Running Command

cd /tmp/workspace/jc_ppt && python3 build_ppt.py

Running Command

cd /tmp/workspace/jc_ppt && python3 -c " from pptx import Presentation prs = Presentation('Journal_Club_Ureteral_Stent_JV_JR1.pptx') print('slides:', len(prs.slides)) " && ls -la Journal_Club_Ureteral_Stent_JV_JR1.pptx

The journal club presentation is ready.

Journal Club Ureteral Stent JV JR1

Presentation · PPTX

It covers the article "Prophylactic ureteral stent placement by general surgeons is safe and Feasible: Implementation of a training and credentialing program for non-urologic surgeons" (Tamashiro et al., Am J Surg 2025) across 14 slides:
  1. Title slide - Presenter: Dr. JV, JR-1
  2. Outline
  3. Background & Rationale
  4. Study Objective
  5. Methods: Study Design
  6. Methods: Training & Credentialing Program
  7. Results: Patient Demographics (Table 1)
  8. Results: Complications & Cannulation Success (with a visual bar chart)
  9. Risk Factors for Complications
  10. Discussion: Comparison with Literature
  11. Limitations
  12. Conclusions
  13. Take-Home Points
  14. Thank You / Reference
Key data points included: 748 cases, 9.4% overall complication rate, 97.7% successful ureter cannulation, and the finding that age, male sex, and colorectal cancer indication were significant predictors of complications — all benchmarked against published urologist outcomes (2.7–12.1% complications, 90–98% cannulation success).
Let me know if you'd like the slide count trimmed for time, speaker notes added, or the design theme changed.
This is a shared conversation. Sign in to Orris to start your own chat.