UTI treatment in adults
"urinary tract infection" AND treatment AND adults
UTI treatment adults guidelines 2025 antibiotics uncomplicated complicated
https://www.emdocs.net/guideline-update-2025-idsa-management…
PMID: 39495518
| Agent | Dose & Duration |
|---|---|
| Nitrofurantoin monohydrate/macrocrystals | 100 mg twice daily x 5 days |
| TMP-SMX DS (160/800 mg) | 1 tab twice daily x 3 days (avoid if local resistance >20%) |
| Fosfomycin trometamol | 3 g single dose (resistance rate ~2%) |
| Pivmecillinam | 400 mg twice daily x 3-7 days (available in some regions) |
| Route | Agent |
|---|---|
| IV | Fluoroquinolone (ciprofloxacin 400 mg q12h or levofloxacin 500 mg q24h) |
| IV | Ceftriaxone 1-2 g q24h |
| IV | Piperacillin-tazobactam 3.375 g q6h or 4.5 g q8h |
| IV | Gentamicin (if susceptibility confirmed) |
| Oral step-down | Ciprofloxacin 500 mg q12h or levofloxacin 750 mg q24h |
| Oral step-down | TMP-SMX DS (if susceptible) |
| Scenario | Duration |
|---|---|
| Uncomplicated cystitis (women) | 3-5 days (agent-dependent) |
| Uncomplicated cystitis (men) | 7 days |
| Complicated UTI / pyelonephritis (improving, fluoroquinolone) | 5-7 days |
| Complicated UTI / pyelonephritis (improving, non-fluoroquinolone) | 7 days |
| cUTI with gram-negative bacteremia (improving) | 7 days |
| Suspected bacterial prostatitis | 10-14 days |
Key update: The 2025 IDSA guidelines recommend shorter courses (5-7 days) over 10-14 days for pyelonephritis and cUTI in patients who are clinically improving. Duration counts from the first day of effective therapy. This is supported by the 2025 meta-analysis (Zahavi et al., Clin Microbiol Infect 2025) showing no inferiority of shorter courses.
| Population | Consideration |
|---|---|
| Pregnancy | TMP-SMX and tetracyclines contraindicated in early pregnancy (birth defects). Nitrofurantoin avoidance near term. Follow-up culture 2 weeks post-treatment is required. Fosfomycin single dose acceptable. |
| Renal failure | Nitrofurantoin contraindicated (inadequate urine levels + toxicity); dose-adjust fluoroquinolones/TMP-SMX. Fosfomycin may be used but prolonged time to negative cultures in impaired renal function. |
| ESBL-producing E. coli | Nitrofurantoin (6% resistance) and fosfomycin (3% resistance) are oral options. Carbapenems for severe cases. |
| Men with febrile UTI | Imaging (CT or US) recommended to evaluate for obstruction/abnormality. Consider prostatitis (10-14 day course with fluoroquinolone or TMP-SMX for prostatic penetration). |
| Catheter-associated UTI (CAUTI) | Remove/replace catheter when feasible. Treat symptomatically only - pyuria/bacteriuria alone do NOT diagnose UTI in catheterized patients. |
Note on recent evidence: A 2024 WikiGuidelines systematic review (PMID 39495518) found that the majority of UTI management topics still lack high-quality prospective data - clear evidence-based recommendations could only be made for 6 of 37 questions. Gepotidacin (FDA-approved March 2025) is a notable new addition to the uncomplicated UTI armamentarium.
Create a quick reference PDF comparing first-line UTI antibiotics with dosing & duration
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "workspace ready"
mkdir -p /tmp/workspace/uti-pdf && cat > /tmp/workspace/uti-pdf/generate_uti_pdf.py << 'PYEOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import mm, cm from reportlab.platypus import ( SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer, HRFlowable, KeepTogether ) from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT from reportlab.platypus import BaseDocTemplate, PageTemplate, Frame OUTPUT = "/tmp/workspace/uti-pdf/UTI_Antibiotic_Quick_Reference.pdf" # ── Colour palette ────────────────────────────────────────────────── TEAL = colors.HexColor("#007C7C") TEAL_LITE = colors.HexColor("#E0F4F4") BLUE = colors.HexColor("#1A4F8A") BLUE_LITE = colors.HexColor("#EBF2FB") RED_LITE = colors.HexColor("#FFF0F0") RED = colors.HexColor("#C0392B") GOLD = colors.HexColor("#D4A017") GOLD_LITE = colors.HexColor("#FFF8E7") GREEN = colors.HexColor("#1A7A4A") GREEN_LITE= colors.HexColor("#E8F8EE") GRAY_HDR = colors.HexColor("#2C3E50") GRAY_ROW = colors.HexColor("#F7F9FB") WHITE = colors.white BLACK = colors.HexColor("#1A1A1A") W, H = A4 # 595 x 842 pt # ── Page template with header/footer ──────────────────────────────── def on_page(canvas, doc): canvas.saveState() # Top banner canvas.setFillColor(TEAL) canvas.rect(0, H - 38, W, 38, fill=1, stroke=0) canvas.setFillColor(WHITE) canvas.setFont("Helvetica-Bold", 14) canvas.drawCentredString(W/2, H - 25, "UTI ANTIBIOTIC QUICK REFERENCE | Adult Treatment Guide") # Bottom footer canvas.setFillColor(GRAY_HDR) canvas.rect(0, 0, W, 22, fill=1, stroke=0) canvas.setFillColor(WHITE) canvas.setFont("Helvetica", 7.5) canvas.drawString(18, 7, "Based on IDSA 2025 Guidelines, Harrison's 22E & Tintinalli's EM. For clinical decision support only — always verify local resistance patterns.") canvas.drawRightString(W - 18, 7, f"Page {doc.page}") canvas.restoreState() def build_pdf(): doc = BaseDocTemplate( OUTPUT, pagesize=A4, leftMargin=18*mm, rightMargin=18*mm, topMargin=46*mm, bottomMargin=28*mm, ) frame = Frame(doc.leftMargin, doc.bottomMargin, doc.width, doc.height, id='main') doc.addPageTemplates([PageTemplate(id='main', frames=frame, onPage=on_page)]) styles = getSampleStyleSheet() story = [] def h1(txt): return Paragraph(txt, ParagraphStyle('h1', fontName='Helvetica-Bold', fontSize=10, textColor=WHITE, backColor=GRAY_HDR, spaceAfter=0, spaceBefore=6, leftIndent=6, leading=15)) def h2(txt, bg=TEAL): return Paragraph(txt, ParagraphStyle('h2', fontName='Helvetica-Bold', fontSize=9, textColor=WHITE, backColor=bg, spaceAfter=0, spaceBefore=4, leftIndent=6, leading=13)) def note(txt, color=BLACK): return Paragraph(txt, ParagraphStyle('note', fontName='Helvetica', fontSize=7.5, textColor=color, spaceAfter=2, leading=10, leftIndent=4)) def bold_note(txt, color=BLACK): return Paragraph(f"<b>{txt}</b>", ParagraphStyle('bnote', fontName='Helvetica-Bold', fontSize=8, textColor=color, spaceAfter=3, leading=11, leftIndent=4)) col_w = doc.width / 5 # base column unit # ──────────────────────────────────────────────────────────────── # SECTION 1 – UNCOMPLICATED CYSTITIS (Women) # ──────────────────────────────────────────────────────────────── story.append(h1(" 1. UNCOMPLICATED CYSTITIS — WOMEN (No fever / no systemic signs)")) story.append(Spacer(1, 3)) hdr = ['Agent', 'Dose', 'Duration', 'Notes / Stewardship'] rows_women = [ ['Nitrofurantoin\n(monohydrate/macrocrystals)', '100 mg PO BID', '5 days', '1st-line. Avoid if CrCl <30. Do NOT use in pyelonephritis.'], ['TMP-SMX DS\n(160/800 mg)', '1 tab PO BID', '3 days', '1st-line if local resistance <20%. Check local antibiogram.'], ['Fosfomycin\ntrometamol', '3 g PO', 'Single dose', '1st-line. Resistance ~2%. Good for ESBL E. coli (3% resistance).'], ['Pivmecillinam', '400 mg PO BID', '3–7 days', 'Available in some regions. Useful when MDR a concern.'], ['Gepotidacin ★ NEW', 'Per label', '3 days', 'FDA-approved Mar 2025. Dual topoisomerase inhibitor. Active against resistant strains.'], ['Ciprofloxacin\n(FQ — avoid routinely)', '250 mg PO BID', '3 days', 'Reserve for complicated UTI. Collateral damage; resistance risk.'], ] col_ws_main = [col_w*1.3, col_w*0.85, col_w*0.65, col_w*2.2] data = [hdr] + rows_women t = Table(data, colWidths=col_ws_main, repeatRows=1) ts = TableStyle([ ('BACKGROUND', (0,0), (-1,0), TEAL), ('TEXTCOLOR', (0,0), (-1,0), WHITE), ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'), ('FONTSIZE', (0,0), (-1,0), 8), ('ALIGN', (0,0), (-1,0), 'CENTER'), ('ROWBACKGROUNDS',(0,1),(-1,-1), [GRAY_ROW, WHITE]), ('FONTNAME', (0,1), (-1,-1), 'Helvetica'), ('FONTSIZE', (0,1), (-1,-1), 7.5), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('GRID', (0,0), (-1,-1), 0.4, colors.HexColor("#CCCCCC")), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING',(0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), # Highlight gepotidacin row ('BACKGROUND', (0,5), (-1,5), GOLD_LITE), ('TEXTCOLOR', (0,5), (0,5), GOLD), ('FONTNAME', (0,5), (0,5), 'Helvetica-Bold'), # Grey out FQ row ('BACKGROUND', (0,6), (-1,6), RED_LITE), ('TEXTCOLOR', (0,6), (0,6), RED), ('FONTNAME', (0,6), (0,6), 'Helvetica-BoldOblique'), ]) t.setStyle(ts) story.append(t) story.append(Spacer(1, 4)) story.append(note("★ Do NOT use nitrofurantoin or fosfomycin for pyelonephritis — inadequate renal tissue levels.", RED)) story.append(note("★ Fosfomycin and nitrofurantoin are preferred oral agents for ESBL-producing E. coli.")) # ──────────────────────────────────────────────────────────────── # SECTION 2 – UNCOMPLICATED CYSTITIS (Men) # ──────────────────────────────────────────────────────────────── story.append(Spacer(1, 6)) story.append(h1(" 2. UNCOMPLICATED CYSTITIS — MEN")) story.append(Spacer(1, 3)) rows_men = [ ['TMP-SMX DS\n(160/800 mg)', '1 tab PO BID', '7 days', 'Culture urine in all men. Longer course than women.'], ['Ciprofloxacin', '500 mg PO BID', '7 days', 'Good prostatic penetration if prostatitis suspected.'], ['Nitrofurantoin\n(monohydrate/macrocrystals)', '100 mg PO BID', '7 days', 'If lower tract only (no prostatitis suspected), adequate for 7 days.'], ] data_men = [hdr] + rows_men t2 = Table(data_men, colWidths=col_ws_main, repeatRows=1) t2.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), BLUE), ('TEXTCOLOR', (0,0), (-1,0), WHITE), ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'), ('FONTSIZE', (0,0), (-1,0), 8), ('ALIGN', (0,0), (-1,0), 'CENTER'), ('ROWBACKGROUNDS',(0,1),(-1,-1), [BLUE_LITE, WHITE]), ('FONTNAME', (0,1), (-1,-1), 'Helvetica'), ('FONTSIZE', (0,1), (-1,-1), 7.5), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('GRID', (0,0), (-1,-1), 0.4, colors.HexColor("#CCCCCC")), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING',(0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), ])) story.append(t2) story.append(Spacer(1, 2)) story.append(note("Men with febrile UTI: obtain imaging (CT or ultrasound). Consider prostatic involvement — use fluoroquinolone or TMP-SMX for 10–14 days if prostatitis suspected.")) # ──────────────────────────────────────────────────────────────── # SECTION 3 – PYELONEPHRITIS & COMPLICATED UTI # ──────────────────────────────────────────────────────────────── story.append(Spacer(1, 6)) story.append(h1(" 3. PYELONEPHRITIS & COMPLICATED UTI (Fever / systemic signs / structural abnormality)")) story.append(Spacer(1, 3)) hdr3 = ['Agent', 'Route', 'Dose', 'Duration', 'Notes'] cw3 = [col_w*1.2, col_w*0.5, col_w*1.1, col_w*0.75, col_w*1.45] rows3 = [ ['Ciprofloxacin', 'PO / IV', '500 mg BID (PO)\n400 mg q12h (IV)', '5–7 days FQ\nor 7 days non-FQ', 'Step down to oral when tolerating & improving.'], ['Levofloxacin', 'PO / IV', '750 mg q24h', '5–7 days FQ', 'Once-daily dosing. Step down to oral ASAP.'], ['Ceftriaxone', 'IV', '1–2 g q24h', '7 days', 'Good gram-negative coverage. Step down when able.'], ['Cefepime', 'IV', '1–2 g q8–12h','7 days', 'For Pseudomonas risk or healthcare-associated UTI.'], ['Pip-Tazo', 'IV', '3.375 g q6h\nor 4.5 g q8h', '7 days', 'Broad-spectrum. Reserve; anti-Pseudomonal coverage.'], ['TMP-SMX DS', 'PO', '1 tab BID', '7 days', 'Only if susceptibility confirmed. NOT for empiric Rx.'], ['Ertapenem', 'IV', '1 g q24h', '7 days', 'For ESBL / MDR organisms. Carbapenem — reserve.'], ['Meropenem', 'IV', '1 g q8h', '7–10 days', 'Sepsis / XDR organisms. Escalate to ID if needed.'], ] data3 = [hdr3] + rows3 t3 = Table(data3, colWidths=cw3, repeatRows=1) ts3 = TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor("#5D3FD3")), ('TEXTCOLOR', (0,0), (-1,0), WHITE), ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'), ('FONTSIZE', (0,0), (-1,0), 8), ('ALIGN', (0,0), (-1,0), 'CENTER'), ('ROWBACKGROUNDS',(0,1),(-1,-1), [colors.HexColor("#F5F0FF"), WHITE]), ('FONTNAME', (0,1), (-1,-1), 'Helvetica'), ('FONTSIZE', (0,1), (-1,-1), 7.5), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('GRID', (0,0), (-1,-1), 0.4, colors.HexColor("#CCCCCC")), ('TOPPADDING', (0,0), (-1,-1), 3), ('BOTTOMPADDING',(0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 5), # Carbapenem rows highlighted ('BACKGROUND', (0,7), (-1,8), RED_LITE), ]) t3.setStyle(ts3) story.append(t3) story.append(Spacer(1, 3)) story.append(note("2025 IDSA: Shorter courses (5–7 days FQ, 7 days non-FQ) are recommended over 10–14 days for clinically improving patients. Duration counts from first day of EFFECTIVE therapy.", RED)) story.append(note("cUTI with gram-negative bacteremia (improving): treat 7 days total. IV-to-oral switch is safe when patient is tolerating PO and an effective oral option is available.")) story.append(note("Avoid nitrofurantoin and oral fosfomycin in cUTI/pyelonephritis — do not achieve adequate renal parenchymal levels.")) # ──────────────────────────────────────────────────────────────── # SECTION 4 – DURATION SUMMARY BOX # ──────────────────────────────────────────────────────────────── story.append(Spacer(1, 6)) story.append(h1(" 4. TREATMENT DURATION SUMMARY (2025 IDSA)")) story.append(Spacer(1, 3)) dur_hdr = ['Clinical Scenario', 'Recommended Duration'] dur_rows = [ ['Uncomplicated cystitis — women (nitrofurantoin)', '5 days'], ['Uncomplicated cystitis — women (TMP-SMX)', '3 days'], ['Uncomplicated cystitis — women (fosfomycin)', 'Single dose'], ['Uncomplicated cystitis — men', '7 days'], ['Pyelonephritis / cUTI — fluoroquinolone, clinically improving', '5–7 days ✓ NEW'], ['Pyelonephritis / cUTI — non-fluoroquinolone, clinically improving', '7 days ✓ NEW'], ['cUTI with gram-negative bacteremia, clinically improving', '7 days ✓ NEW'], ['Suspected acute bacterial prostatitis', '10–14 days'], ['Catheter-associated UTI (CAUTI)', '7 days (after catheter removal/change)'], ] cw_dur = [doc.width * 0.72, doc.width * 0.28] data_dur = [dur_hdr] + dur_rows t4 = Table(data_dur, colWidths=cw_dur, repeatRows=1) ts4 = TableStyle([ ('BACKGROUND', (0,0), (-1,0), GREEN), ('TEXTCOLOR', (0,0), (-1,0), WHITE), ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'), ('FONTSIZE', (0,0), (-1,0), 8), ('ALIGN', (0,0), (-1,0), 'CENTER'), ('ALIGN', (1,1), (1,-1), 'CENTER'), ('ROWBACKGROUNDS',(0,1),(-1,-1), [GREEN_LITE, WHITE]), ('FONTNAME', (0,1), (-1,-1), 'Helvetica'), ('FONTSIZE', (0,1), (-1,-1), 7.5), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('GRID', (0,0), (-1,-1), 0.4, colors.HexColor("#CCCCCC")), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING',(0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), # Highlight new 2025 rows ('FONTNAME', (1,5), (1,7), 'Helvetica-Bold'), ('TEXTCOLOR', (1,5), (1,7), GREEN), ]) t4.setStyle(ts4) story.append(t4) # ──────────────────────────────────────────────────────────────── # SECTION 5 – SPECIAL POPULATIONS # ──────────────────────────────────────────────────────────────── story.append(Spacer(1, 6)) story.append(h1(" 5. SPECIAL POPULATIONS & CONSIDERATIONS")) story.append(Spacer(1, 3)) sp_hdr = ['Population', 'Avoid', 'Preferred / Notes'] sp_rows = [ ['Pregnancy', 'TMP-SMX (1st tri: neural tube defects; 3rd tri: kernicterus)\nNitrofurantoin (avoid at term: hemolytic anemia)\nFluoroquinolones', 'Amoxicillin-clavulanate, cephalexin, or nitrofurantoin (2nd tri only)\nFollow-up culture 2 weeks post-treatment mandatory'], ['CrCl < 30 mL/min', 'Nitrofurantoin (inadequate urine levels + pulmonary toxicity risk)\nFosfomycin (prolonged time to clearance)', 'Beta-lactams or fosfomycin (if carefully monitored)\nDose-adjust TMP-SMX and fluoroquinolones'], ['ESBL-producing E. coli', 'Cephalosporins (most)\nAmoxicillin-clavulanate\nFluoroquinolones (often co-resistant)', 'Nitrofurantoin (6% resistance) for lower UTI\nFosfomycin (3% resistance) for lower UTI\nErtapenem / meropenem for systemic/pyelonephritis'], ['Recurrent UTI (women)', 'Avoid prolonged broad-spectrum antibiotics', 'Post-coital prophylaxis, self-start therapy, or daily low-dose nitrofurantoin/TMP-SMX\nConsider D-mannose, methenamine hippurate (non-antibiotic prophylaxis)'], ['Catheter-associated UTI\n(CAUTI)', 'Treat asymptomatic bacteriuria ONLY in pregnancy or pre-urologic procedure', 'Remove/exchange catheter. 7-day course once symptoms confirmed.\nPyuria + bacteriuria alone ≠ CAUTI diagnosis in catheterized patients.'], ] cw_sp = [col_w*0.95, col_w*1.4, col_w*2.65] data_sp = [sp_hdr] + sp_rows t5 = Table(data_sp, colWidths=cw_sp, repeatRows=1) ts5 = TableStyle([ ('BACKGROUND', (0,0), (-1,0), GOLD), ('TEXTCOLOR', (0,0), (-1,0), WHITE), ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'), ('FONTSIZE', (0,0), (-1,0), 8), ('ALIGN', (0,0), (-1,0), 'CENTER'), ('ROWBACKGROUNDS',(0,1),(-1,-1), [GOLD_LITE, WHITE]), ('FONTNAME', (0,1), (-1,-1), 'Helvetica'), ('FONTSIZE', (0,1), (-1,-1), 7.2), ('VALIGN', (0,0), (-1,-1), 'TOP'), ('GRID', (0,0), (-1,-1), 0.4, colors.HexColor("#CCCCCC")), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING',(0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), ('FONTNAME', (1,1), (1,-1), 'Helvetica-Oblique'), ('TEXTCOLOR', (1,1), (1,-1), RED), ]) t5.setStyle(ts5) story.append(t5) # ──────────────────────────────────────────────────────────────── # SECTION 6 – DIAGNOSIS PEARLS # ──────────────────────────────────────────────────────────────── story.append(Spacer(1, 6)) story.append(h1(" 6. RAPID DIAGNOSIS PEARLS")) story.append(Spacer(1, 3)) dx_hdr = ['Test', 'Finding', 'Interpretation'] dx_rows = [ ['Urine dipstick', 'Nitrite (+) + LE (+)', 'Highly suggestive of UTI (Enterobacterales). Start empiric Rx.'], ['Urine dipstick', 'Nitrite (−) + LE (−)', 'UTI unlikely — consider other diagnoses. Not adequate to rule out in pregnancy.'], ['Urine microscopy', '>10 WBC/HPF', 'Pyuria — standard threshold for UTI. >250 WBC/HPF better correlates with symptoms in older women.'], ['Urine microscopy', 'Hematuria', 'Present in ~30% of cystitis cases.'], ['Urine culture', '>10² CFU/mL', 'Diagnostic threshold for acute cystitis (more sensitive than 10⁵ CFU/mL).'], ['Urine culture', 'Any growth in catheterized patient without symptoms', 'Treat as asymptomatic bacteriuria (ASB) — do NOT treat unless pregnant or pre-procedure.'], ] cw_dx = [col_w*0.85, col_w*1.2, col_w*3.0] data_dx = [dx_hdr] + dx_rows t6 = Table(data_dx, colWidths=cw_dx, repeatRows=1) ts6 = TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor("#5D3FD3")), ('TEXTCOLOR', (0,0), (-1,0), WHITE), ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'), ('FONTSIZE', (0,0), (-1,0), 8), ('ALIGN', (0,0), (-1,0), 'CENTER'), ('ROWBACKGROUNDS',(0,1),(-1,-1), [colors.HexColor("#F5F0FF"), WHITE]), ('FONTNAME', (0,1), (-1,-1), 'Helvetica'), ('FONTSIZE', (0,1), (-1,-1), 7.5), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('GRID', (0,0), (-1,-1), 0.4, colors.HexColor("#CCCCCC")), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING',(0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), ]) t6.setStyle(ts6) story.append(t6) # ──────────────────────────────────────────────────────────────── # Footer citation note # ──────────────────────────────────────────────────────────────── story.append(Spacer(1, 8)) story.append(HRFlowable(width="100%", thickness=0.5, color=TEAL)) story.append(Spacer(1, 3)) story.append(note( "Sources: IDSA 2025 Complicated UTI Guidelines (Jul 2025) · AUA/CUA/SUFU 2025 rUTI Guideline Update · " "Harrison's Principles of Internal Medicine 22E (2025) · Tintinalli's Emergency Medicine · " "Nelson Z et al. JAMA Netw Open 2024 (PMID 39495518) · Zahavi I et al. Clin Microbiol Infect 2025 (PMID 40228579). " "★ Gepotidacin FDA-approved March 2025 — first new antibiotic class for uncomplicated UTI in ~30 years.", color=colors.HexColor("#555555") )) doc.build(story) print(f"PDF created: {OUTPUT}") build_pdf() PYEOF python /tmp/workspace/uti-pdf/generate_uti_pdf.py
ls -lh /tmp/workspace/uti-pdf/UTI_Antibiotic_Quick_Reference.pdf
UTI Antibiotic Quick Reference
PDF Document · PDF