Post nephrectomy care and management
post nephrectomy care and management clinical guidelines 2024
nephrectomy postoperative management outcomes
| Modality | Details |
|---|---|
| Epidural analgesia | Preferred for open flank/retroperitoneal approaches; provides excellent pain relief and reduces systemic opioid requirement |
| Thoracic paravertebral block | Alternative to epidural for open surgery |
| Spinal analgesia | For select cases |
| IV opioids (PCA) | Standard adjunct; titrate carefully given reduced renal clearance |
| Non-opioid adjuncts | Paracetamol (acetaminophen), gabapentinoids; avoid NSAIDs given single-kidney physiology |
| Local infiltration | Wound infiltration with bupivacaine at port sites (laparoscopic) |
| Complication | Notes |
|---|---|
| Hemorrhage | Most common major complication; may require transfusion or re-exploration. More common after partial nephrectomy (18.6%) than radical (15.1%) |
| Ileus | Most common complication after donor nephrectomy; manage conservatively |
| Wound infection | Superficial or deep; more risk with obesity (BMI >30) |
| Atelectasis | Early mobilization and physiotherapy essential |
| Pneumothorax | After open flank approaches; chest X-ray if suspected |
| Urinary leak/urinoma | Especially after partial nephrectomy; drain creatinine >2x serum creatinine confirms |
| DVT/PE | Early mobilization + pharmacological prophylaxis mandatory |
| Adjacent organ injury | Bowel, spleen, liver, diaphragm, pancreas injuries can complicate radical nephrectomy |
| Parameter | Frequency |
|---|---|
| Serum creatinine + eGFR | Every 3-6 months for first year, then annually |
| Urinalysis / urine protein:creatinine ratio | Annually; proteinuria is an early marker of glomerular stress |
| Blood pressure | Every visit; hypertension accelerates CKD progression |
| Electrolytes | Annually |
| Site | Median Time to Recurrence |
|---|---|
| Lung | 67 months |
| Liver | 97 months |
| Bone | 144 months |
| Timeframe | Key Actions |
|---|---|
| Day 0-1 | Vitals monitoring, fluid balance, analgesia, early mobilization, VTE prophylaxis |
| Day 1-2 | Resume oral diet, remove NG/nasogastric if present, ambulate |
| Day 2-3 (lap) / Day 4-7 (open) | Discharge if criteria met |
| 2-4 weeks | Wound review, suture removal, activity restriction |
| 3 months | First oncologic imaging (CT abdomen); renal function check |
| 6 months | Renal function (creatinine/eGFR/urinalysis), BP check |
| Annually | Renal function panel, BP, urinalysis, surveillance imaging per stage |
| Long-term | Nephrology referral if eGFR <45 or proteinuria; lifelong BP optimization |
Generate pdf of post radical nephrectomy management and care
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "created"
mkdir -p /tmp/workspace/nephrectomy-pdf && cat > /tmp/workspace/nephrectomy-pdf/generate_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 cm, mm from reportlab.platypus import ( SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, KeepTogether ) from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY from reportlab.platypus import PageBreak OUTPUT = "/tmp/workspace/nephrectomy-pdf/Post_Radical_Nephrectomy_Management.pdf" # ── Page setup ────────────────────────────────────────────────────────────── doc = SimpleDocTemplate( OUTPUT, pagesize=A4, leftMargin=2*cm, rightMargin=2*cm, topMargin=2.5*cm, bottomMargin=2.5*cm, title="Post Radical Nephrectomy Management and Care", author="Orris Medical Reference", ) W, H = A4 CONTENT_W = W - 4*cm # ── Colour palette ─────────────────────────────────────────────────────────── TEAL = colors.HexColor("#1A6B6B") TEAL_LIGHT = colors.HexColor("#E6F2F2") TEAL_MID = colors.HexColor("#4EAAA5") AMBER = colors.HexColor("#D97706") AMBER_LIGHT= colors.HexColor("#FEF3C7") SLATE = colors.HexColor("#334155") SLATE_LIGHT= colors.HexColor("#F1F5F9") WHITE = colors.white GREY_LINE = colors.HexColor("#CBD5E1") RED_LIGHT = colors.HexColor("#FEE2E2") RED = colors.HexColor("#DC2626") GREEN_LIGHT= colors.HexColor("#DCFCE7") GREEN = colors.HexColor("#16A34A") # ── Styles ─────────────────────────────────────────────────────────────────── styles = getSampleStyleSheet() def make_style(name, parent="Normal", **kw): s = ParagraphStyle(name, parent=styles[parent], **kw) styles.add(s) return s # Title / header styles TITLE = make_style("DocTitle", fontSize=22, fontName="Helvetica-Bold", textColor=WHITE, alignment=TA_CENTER, leading=28, spaceAfter=4) SUBTITLE = make_style("DocSubtitle", fontSize=11, fontName="Helvetica", textColor=colors.HexColor("#B2DFDB"), alignment=TA_CENTER, leading=16) # Section heading SEC = make_style("Section", fontSize=13, fontName="Helvetica-Bold", textColor=WHITE, leading=18, spaceBefore=6, spaceAfter=4) # Sub-section SUBSEC = make_style("SubSection", fontSize=11, fontName="Helvetica-Bold", textColor=TEAL, leading=15, spaceBefore=8, spaceAfter=3) # Body text BODY = make_style("Body", fontSize=9.5, fontName="Helvetica", textColor=SLATE, leading=14, spaceAfter=4, alignment=TA_JUSTIFY) BODY_B = make_style("BodyBold", parent="Body", fontName="Helvetica-Bold", textColor=SLATE) # Bullet BULLET = make_style("Bullet", fontSize=9.5, fontName="Helvetica", textColor=SLATE, leading=13, leftIndent=14, firstLineIndent=-10, spaceAfter=2) # Small caption / footnote CAPTION = make_style("Caption", fontSize=8, fontName="Helvetica-Oblique", textColor=colors.HexColor("#64748B"), alignment=TA_CENTER) # Warning box text WARN = make_style("Warn", fontSize=9.5, fontName="Helvetica-Bold", textColor=RED, leading=13) NOTE = make_style("Note", fontSize=9.5, fontName="Helvetica", textColor=colors.HexColor("#92400E"), leading=13) # ── Helper functions ───────────────────────────────────────────────────────── def section_header(text, number=None): label = f"{number}. {text}" if number else text tbl = Table([[Paragraph(label, SEC)]], colWidths=[CONTENT_W]) tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), TEAL), ("ROUNDEDCORNERS", [4,4,4,4]), ("TOPPADDING", (0,0), (-1,-1), 6), ("BOTTOMPADDING",(0,0),(-1,-1), 6), ("LEFTPADDING", (0,0), (-1,-1), 10), ])) return tbl def callout(text, style="info"): bg = AMBER_LIGHT if style == "warn" else TEAL_LIGHT border = AMBER if style == "warn" else TEAL_MID p = Paragraph(text, NOTE if style == "warn" else BODY) tbl = Table([[p]], colWidths=[CONTENT_W-4]) tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0),(-1,-1), bg), ("LINECOLOR", (0,0),(-1,-1), border), # keep for reference ("BOX", (0,0),(-1,-1), 1.2, border), ("LEFTPADDING", (0,0),(-1,-1), 10), ("RIGHTPADDING", (0,0),(-1,-1), 10), ("TOPPADDING", (0,0),(-1,-1), 7), ("BOTTOMPADDING",(0,0),(-1,-1), 7), ])) return tbl def two_col(left_items, right_items, header_left="", header_right=""): """Two-column info box.""" lp = [Paragraph(f"• {i}", BULLET) for i in left_items] rp = [Paragraph(f"• {i}", BULLET) for i in right_items] # pad to equal length diff = len(lp) - len(rp) if diff > 0: rp += [Spacer(1,1)]*diff else: lp += [Spacer(1,1)]*(-diff) col_w = (CONTENT_W-6)/2 data = [[Paragraph(header_left, SUBSEC), Paragraph(header_right, SUBSEC)]] for l, r in zip(lp, rp): data.append([l, r]) tbl = Table(data, colWidths=[col_w, col_w], hAlign="LEFT") tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0),(1,0), TEAL_LIGHT), ("BACKGROUND", (0,1),(1,-1), SLATE_LIGHT), ("LINEBELOW", (0,0),(1,0), 1, TEAL), ("LINEAFTER", (0,0),(0,-1), 0.5, GREY_LINE), ("TOPPADDING", (0,0),(-1,-1), 4), ("BOTTOMPADDING", (0,0),(-1,-1), 4), ("LEFTPADDING", (0,0),(-1,-1), 6), ("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, SLATE_LIGHT]), ])) return tbl def data_table(headers, rows, col_widths=None, row_colors=True): if col_widths is None: n = len(headers) col_widths = [CONTENT_W/n]*n data = [[Paragraph(str(h), make_style(f"th_{h}", fontSize=9, fontName="Helvetica-Bold", textColor=WHITE, leading=12)) for h in headers]] for row in rows: data.append([Paragraph(str(c), BODY) for c in row]) tbl = Table(data, colWidths=col_widths, hAlign="LEFT", repeatRows=1) ts = [ ("BACKGROUND", (0,0),(-1,0), TEAL), ("GRID", (0,0),(-1,-1), 0.4, GREY_LINE), ("TOPPADDING", (0,0),(-1,-1), 5), ("BOTTOMPADDING",(0,0),(-1,-1),5), ("LEFTPADDING",(0,0),(-1,-1),6), ("VALIGN", (0,0),(-1,-1),"TOP"), ] if row_colors: for i in range(1, len(data)): bg = WHITE if i % 2 else SLATE_LIGHT ts.append(("BACKGROUND", (0,i),(-1,i), bg)) tbl.setStyle(TableStyle(ts)) return tbl def hr(): return HRFlowable(width=CONTENT_W, thickness=0.5, color=GREY_LINE, spaceAfter=4, spaceBefore=4) def sp(h=6): return Spacer(1, h) def b(text): return f"<b>{text}</b>" def bullet(items, bold_first=None): """Return list of Paragraph bullets.""" out = [] for item in items: if bold_first and item.startswith(bold_first): txt = f"<b>{item}</b>" else: txt = item out.append(Paragraph(f"• {txt}", BULLET)) return out # ── Cover page builder ──────────────────────────────────────────────────────── def cover_page(canvas, doc): canvas.saveState() # Full-width teal banner canvas.setFillColor(TEAL) canvas.rect(0, H-9*cm, W, 9*cm, fill=1, stroke=0) # Accent stripe canvas.setFillColor(TEAL_MID) canvas.rect(0, H-9*cm-0.5*cm, W, 0.5*cm, fill=1, stroke=0) # Bottom bar canvas.setFillColor(SLATE) canvas.rect(0, 0, W, 2*cm, fill=1, stroke=0) # Footer text canvas.setFillColor(GREY_LINE) canvas.setFont("Helvetica", 8) canvas.drawCentredString(W/2, 0.8*cm, "Orris Medical Reference | Post Radical Nephrectomy Management | July 2026") canvas.restoreState() def later_pages(canvas, doc): canvas.saveState() # Header line canvas.setFillColor(TEAL) canvas.rect(0, H-1.5*cm, W, 1.5*cm, fill=1, stroke=0) canvas.setFillColor(WHITE) canvas.setFont("Helvetica-Bold", 9) canvas.drawString(2*cm, H-0.9*cm, "Post Radical Nephrectomy — Management & Care") canvas.setFont("Helvetica", 9) canvas.drawRightString(W-2*cm, H-0.9*cm, f"Page {doc.page}") # Footer canvas.setFillColor(TEAL) canvas.rect(0, 0, W, 0.8*cm, fill=1, stroke=0) canvas.setFillColor(GREY_LINE) canvas.setFont("Helvetica", 7.5) canvas.drawCentredString(W/2, 0.26*cm, "Orris Medical Reference | For educational use only | July 2026") canvas.restoreState() # ═══════════════════════════════════════════════════════════════════════════════ # STORY # ═══════════════════════════════════════════════════════════════════════════════ story = [] # ── Cover content (first page uses cover_page template) ─────────────────────── story.append(sp(110)) # push below header banner story.append(Paragraph("Post Radical Nephrectomy", TITLE)) story.append(Paragraph("Management and Care", TITLE)) story.append(sp(8)) story.append(Paragraph("A Clinical Reference Guide", SUBTITLE)) story.append(sp(6)) story.append(Paragraph("Urology · Nephrology · Perioperative Medicine", SUBTITLE)) story.append(sp(80)) # Summary box on cover cover_info = [ ["Scope", "Immediate postoperative through long-term oncologic surveillance"], ["Applies to", "Radical nephrectomy (open & laparoscopic/robotic)"], ["Key domains", "Monitoring · Analgesia · ERAS · Complications · Renal function · Surveillance"], ["Guidelines", "NCCN 2025 · EAU · AUA · Campbell-Walsh Urology · Brenner & Rector's Kidney"], ["Updated", "July 2026"], ] tbl_cover = Table(cover_info, colWidths=[4*cm, CONTENT_W-4*cm]) tbl_cover.setStyle(TableStyle([ ("BACKGROUND", (0,0),(0,-1), TEAL_LIGHT), ("BACKGROUND", (1,0),(1,-1), SLATE_LIGHT), ("GRID", (0,0),(-1,-1), 0.4, GREY_LINE), ("FONTNAME", (0,0),(0,-1), "Helvetica-Bold"), ("FONTSIZE", (0,0),(-1,-1), 9), ("TEXTCOLOR", (0,0),(0,-1), TEAL), ("TOPPADDING", (0,0),(-1,-1), 6), ("BOTTOMPADDING", (0,0),(-1,-1), 6), ("LEFTPADDING", (0,0),(-1,-1), 8), ])) story.append(tbl_cover) story.append(PageBreak()) # ═══════════════════════════════════════════════════════════════════════════════ # SECTION 1 – Immediate Postoperative Care # ═══════════════════════════════════════════════════════════════════════════════ story.append(section_header("IMMEDIATE POSTOPERATIVE CARE", "1")) story.append(sp(6)) story.append(Paragraph("1.1 Monitoring Parameters", SUBSEC)) mon_headers = ["Parameter", "Target / Action", "Frequency"] mon_rows = [ ["Vital signs", "HR, BP, SpO₂, Temperature", "Every 30–60 min (ICU); every 2 hr (ward)"], ["Urine output", ">0.5 mL/kg/hr; alert if <0.3 mL/kg/hr for 2 hrs", "Hourly via urinary catheter"], ["Drain output", "Serosanguinous normal; bright red >200 mL/hr → urgent review", "Every shift"], ["Hemoglobin / Hct", "Transfuse if Hb <7 g/dL (symptomatic) or <8 g/dL (cardiac risk)", "At 6 h, 24 h, then PRN"], ["Serum creatinine / eGFR", "Expect ~25% rise vs. baseline (compensatory adaptation)", "6 h, 24 h, 48 h post-op"], ["Electrolytes (K⁺, Na⁺)", "Correct hyperkalaemia promptly", "6 h, then daily"], ["Chest X-ray", "Rule out haemothorax / pneumothorax (especially open flank)", "Day 0 or Day 1"], ] story.append(data_table(mon_headers, mon_rows, col_widths=[3.5*cm, 7*cm, 5.5*cm])) story.append(sp(6)) story.append(Paragraph("1.2 Fluid Management", SUBSEC)) story += bullet([ "Use <b>goal-directed fluid therapy</b>; target euvolemia — avoid both hypovolaemia and fluid overload.", "Anticipate a modest ~25% GFR decline (remaining kidney compensates via hypertrophy/hyperfiltration — not the expected 50% loss).", "Adjust drug dosing for reduced GFR immediately post-op (opioids, antibiotics, contrast agents).", "IV crystalloids: Balanced salt solutions (PlasmaLyte / Hartmann's) preferred over 0.9% NaCl to minimise hyperchloraemic acidosis.", ]) story.append(sp(4)) story.append(callout( "⚠ Avoid nephrotoxins: NSAIDs, aminoglycosides, IV iodinated contrast without adequate hydration, " "and ACE inhibitors/ARBs in the immediate postoperative period (risk of AKI in a single-kidney state).", style="warn")) story.append(sp(8)) story.append(Paragraph("1.3 Respiratory Care", SUBSEC)) story += bullet([ "Incentive spirometry every 1–2 hours while awake — reduces atelectasis risk.", "Chest physiotherapy for open flank incisions.", "Early ambulation (Day 0 or 1) — best single intervention to prevent pulmonary complications.", "If pleural entry was made intraoperatively: monitor for pneumothorax; chest drain only if significant.", ]) story.append(sp(4)) story.append(hr()) # ═══════════════════════════════════════════════════════════════════════════════ # SECTION 2 – Pain Management # ═══════════════════════════════════════════════════════════════════════════════ story.append(sp(4)) story.append(section_header("PAIN MANAGEMENT", "2")) story.append(sp(6)) story.append(Paragraph( "Pain after radical nephrectomy — open or laparoscopic — is significant and requires a <b>multimodal strategy</b> " "to minimise systemic opioid use and facilitate early recovery.", BODY)) story.append(sp(6)) pain_headers = ["Modality", "Technique / Drug", "Notes"] pain_rows = [ ["Thoracic Epidural", "T8–T10 insertion; local anaesthetic ± opioid infusion", "Preferred for open flank; superior analgesia, reduces opioid need"], ["Paravertebral Block", "Unilateral multi-level or single injection", "Alternative to epidural; lower hypotension risk"], ["Wound / Port Infiltration", "Bupivacaine 0.25–0.5% at incision/port sites", "Effective for laparoscopic approach"], ["IV PCA (Opioids)", "Morphine or Fentanyl PCA", "Titrate carefully — reduced renal clearance; avoid NSAIDs"], ["Paracetamol (Acetaminophen)", "1 g IV/oral every 6 hours", "Safe opioid-sparing agent; use routinely"], ["Gabapentinoids", "Gabapentin 300 mg or Pregabalin 75 mg pre- and post-op", "Reduces opioid consumption; caution in elderly"], ["Diaphragm Irritation (lap)", "Shoulder pain from residual CO₂", "Reassure; resolves with ambulation; analgesics PRN"], ] story.append(data_table(pain_headers, pain_rows, col_widths=[3.8*cm, 5.5*cm, 6.7*cm])) story.append(sp(6)) story.append(callout( "🚫 <b>NSAIDs are contraindicated</b> post-nephrectomy — prostaglandin inhibition impairs renal autoregulation " "in the remaining solitary kidney, risking acute kidney injury.", style="warn")) story.append(sp(4)) story.append(hr()) # ═══════════════════════════════════════════════════════════════════════════════ # SECTION 3 – ERAS Protocol # ═══════════════════════════════════════════════════════════════════════════════ story.append(PageBreak()) story.append(section_header("ENHANCED RECOVERY AFTER SURGERY (ERAS)", "3")) story.append(sp(6)) story.append(Paragraph( "ERAS protocols reduce hospital stay, complication rates, and time to return of gastrointestinal function. " "Laparoscopic/robotic radical nephrectomy is associated with a <b>29% lower complication rate</b> vs open approach.", BODY)) story.append(sp(8)) eras_data = [ ["PREOPERATIVE", "INTRAOPERATIVE", "POSTOPERATIVE"], ["• Patient counselling & education\n• Carbohydrate loading up to 2 h pre-op\n• Light meal up to 6 h pre-op\n• No prolonged mechanical bowel prep\n• Subcutaneous heparin (VTE prophylaxis)\n• Multimodal analgesic pre-medication\n• Prehabilitation (optimise fitness)", "• Minimally invasive approach (lap/robotic)\n• Goal-directed fluid management\n• Thoracic epidural or truncal block\n• Avoid hypothermia (warming blanket)\n• Minimise surgical stress response\n• Short-acting anaesthetic agents", "• Remove NGT immediately if used\n• Oral fluids Day 0; diet by Day 1\n• Mobilise Day 0 or Day 1\n• No routine urinary catheter beyond Day 2\n• Remove drain when <50 mL/24 h\n• Target discharge Day 2–3 (laparoscopic)\n• Discharge Day 4–7 (open)"], ] eras_tbl = Table(eras_data, colWidths=[(CONTENT_W)/3]*3) eras_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0),(-1,0), TEAL), ("TEXTCOLOR", (0,0),(-1,0), WHITE), ("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"), ("FONTSIZE", (0,0),(-1,-1), 8.5), ("BACKGROUND", (0,1),(0,1), TEAL_LIGHT), ("BACKGROUND", (1,1),(1,1), SLATE_LIGHT), ("BACKGROUND", (2,1),(2,1), colors.HexColor("#F0FDF4")), ("GRID", (0,0),(-1,-1), 0.4, GREY_LINE), ("VALIGN", (0,0),(-1,-1), "TOP"), ("TOPPADDING", (0,0),(-1,-1), 7), ("BOTTOMPADDING", (0,0),(-1,-1), 7), ("LEFTPADDING", (0,0),(-1,-1), 6), ("ALIGN", (0,0),(-1,0), "CENTER"), ("FONTSIZE", (0,0),(-1,0), 9.5), ])) story.append(eras_tbl) story.append(sp(4)) story.append(hr()) # ═══════════════════════════════════════════════════════════════════════════════ # SECTION 4 – Postoperative Complications # ═══════════════════════════════════════════════════════════════════════════════ story.append(sp(4)) story.append(section_header("POSTOPERATIVE COMPLICATIONS", "4")) story.append(sp(6)) story.append(Paragraph("4.1 Early Complications (within 30 days)", SUBSEC)) early_headers = ["Complication", "Incidence", "Management"] early_rows = [ ["Haemorrhage", "Most common major complication", "Transfuse if Hb <7–8; interventional radiology / re-exploration if haemodynamically unstable"], ["Ileus", "Most common after donor nephrectomy; ~11% radical nephrectomy", "Conservative: NBM, IV fluids, early mobilisation, NG decompression if persistent"], ["Atelectasis / Pneumonia", "~1.2% laparoscopic series", "Incentive spirometry, early mobilisation, physiotherapy, antibiotics if pneumonia confirmed"], ["Wound Infection", "~1.4% laparoscopic; higher open", "Wound care, oral/IV antibiotics; higher risk BMI >30"], ["Pneumothorax", "Open flank approach risk", "CXR; drain if >20% or symptomatic; otherwise observe"], ["Urinary Leak / Urinoma", "Rare after radical nephrectomy", "Drain creatinine >2× serum creatinine confirms; percutaneous drainage"], ["DVT / PE", "Major risk without prophylaxis", "LMWH started 6–12 h postop + graduated compression stockings; early ambulation"], ["Adjacent Organ Injury", "Bowel, spleen, liver, diaphragm, pancreas", "Intraoperative repair; delayed recognition may need re-exploration"], ["Acute Kidney Injury", "Risk in pre-existing CKD, DM, hypertension", "Avoid nephrotoxins; optimise volume; nephrology consult if creatinine doubles"], ] story.append(data_table(early_headers, early_rows, col_widths=[3.8*cm, 4*cm, 8.2*cm])) story.append(sp(8)) story.append(Paragraph("4.2 Late Complications (>30 days)", SUBSEC)) late_headers = ["Complication", "Notes"] late_rows = [ ["Incisional Hernia", "More common open approach; repair if symptomatic or large"], ["Chronic Kidney Disease", "Dominant long-term concern — see Section 6"], ["Hypertension", "May worsen post-nephrectomy; requires drug optimisation"], ["Lymphocele", "After extensive LN dissection; symptomatic → percutaneous drainage"], ["Tumour Recurrence", "Managed per oncologic surveillance protocol — Section 7"], ] story.append(data_table(late_headers, late_rows, col_widths=[5*cm, 11*cm])) story.append(sp(4)) story.append(hr()) # ═══════════════════════════════════════════════════════════════════════════════ # SECTION 5 – Discharge Criteria & Instructions # ═══════════════════════════════════════════════════════════════════════════════ story.append(PageBreak()) story.append(section_header("DISCHARGE CRITERIA AND INSTRUCTIONS", "5")) story.append(sp(6)) story.append(Paragraph("5.1 Discharge Criteria", SUBSEC)) dc_left = [ "Adequate pain control on oral analgesia", "Tolerating oral diet and fluids", "Passing flatus / bowel open", "Ambulating independently", ] dc_right = [ "Afebrile >24 h; stable haemoglobin", "No evidence of active bleeding", "Wound clean and dry", "Creatinine stable or improving", ] story.append(two_col(dc_left, dc_right, "Clinical Criteria (Left)", "Clinical Criteria (Right)")) story.append(sp(6)) story.append(Paragraph("5.2 Expected Discharge Timing", SUBSEC)) disc_tbl = data_table( ["Approach", "Expected Discharge"], [["Laparoscopic / Robotic radical nephrectomy", "Day 2–3"], ["Open (flank / midline) radical nephrectomy", "Day 4–7"], ["Open with vena cava thrombectomy", "Day 5–10 (ICU Day 1–2)"]], col_widths=[10*cm, 6*cm] ) story.append(disc_tbl) story.append(sp(6)) story.append(Paragraph("5.3 Patient Discharge Instructions", SUBSEC)) disc_instruct = [ ["Activity restriction", "No heavy lifting >5 kg for 4–6 weeks; avoid strenuous exercise for 6 weeks"], ["Driving", "Avoid for 2–4 weeks (laparoscopic) or 4–6 weeks (open); check with insurer"], ["Return to work", "Desk work: 2–4 weeks (lap), 4–6 weeks (open); manual labour: 6–8 weeks"], ["Sexual activity", "Resume at 4–6 weeks or when comfortable"], ["Wound care", "Keep dry for 48 h; non-absorbable sutures/staples removed at 10–14 days"], ["Medications", "Continue BP medications; avoid NSAIDs; do not restart anticoagulants without GP/surgeon advice"], ["Hydration", "Drink ≥2 L water/day to support remaining kidney"], ["Return to ED if…", "Fever >38°C, heavy bleeding, no urine for 8 h, severe uncontrolled pain, leg swelling"], ] d_tbl = Table(disc_instruct, colWidths=[4.5*cm, 11.5*cm]) d_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0),(0,-1), TEAL_LIGHT), ("FONTNAME", (0,0),(0,-1), "Helvetica-Bold"), ("FONTSIZE", (0,0),(-1,-1), 9), ("TEXTCOLOR", (0,0),(0,-1), TEAL), ("GRID", (0,0),(-1,-1), 0.3, GREY_LINE), ("TOPPADDING", (0,0),(-1,-1), 5), ("BOTTOMPADDING", (0,0),(-1,-1), 5), ("LEFTPADDING", (0,0),(-1,-1), 6), ("VALIGN", (0,0),(-1,-1), "TOP"), ("ROWBACKGROUNDS",(0,0),(-1,-1),[WHITE, SLATE_LIGHT]), ])) story.append(d_tbl) story.append(sp(4)) story.append(hr()) # ═══════════════════════════════════════════════════════════════════════════════ # SECTION 6 – Renal Function Management # ═══════════════════════════════════════════════════════════════════════════════ story.append(sp(4)) story.append(section_header("LONG-TERM RENAL FUNCTION MANAGEMENT", "6")) story.append(sp(6)) story.append(Paragraph("6.1 Physiological Basis", SUBSEC)) story.append(Paragraph( "After unilateral nephrectomy, the remaining kidney undergoes <b>compensatory hypertrophy and hyperfiltration</b>. " "GFR typically recovers to 70–75% of the original two-kidney GFR (a ~25% net decline, not the expected 50%). " "This sustained hyperfiltration, while adaptive, predisposes to long-term glomerular stress, proteinuria, " "and progressive CKD — particularly in patients with pre-existing diabetes, hypertension, or contralateral disease.", BODY)) story.append(sp(6)) story.append(Paragraph("6.2 Monitoring Schedule", SUBSEC)) mon2_headers = ["Parameter", "Timing"] mon2_rows = [ ["Serum creatinine + eGFR", "3 months, 6 months, then annually (or every 6 months if CKD)"], ["Urinalysis + urine protein:creatinine ratio (UPCR)", "Annually; earlier if symptoms or high-risk"], ["Blood pressure", "Every clinical visit; target <130/80 mmHg"], ["Electrolytes (K⁺, Na⁺, HCO₃⁻)", "Annually (or more frequently if eGFR <45)"], ["Lipid profile + HbA1c", "Annually (CKD risk factors)"], ] story.append(data_table(mon2_headers, mon2_rows, col_widths=[6.5*cm, 9.5*cm])) story.append(sp(6)) story.append(Paragraph("6.3 Management of CKD Post-Nephrectomy", SUBSEC)) ckd_rows = [ ["BP Control", "Target <130/80 mmHg\n• ACE inhibitor or ARB: first-line (antiproteinuric + reno-protective)\n• Add CCB or thiazide if not controlled"], ["Proteinuria", "ACE inhibitor / ARB if UPCR >0.1 g/mmol\nRepeat UPCR in 3 months to confirm response"], ["Nephrotoxin Avoidance", "NSAIDs, aminoglycosides, IV contrast (pre-hydrate if essential), high-dose diuretics"], ["Diet", "Moderate protein: 0.8 g/kg/day; low sodium (<2 g/day); high fluid intake ≥2 L/day"], ["Diabetes Management", "Tight glycaemic control (HbA1c <53 mmol/mol); SGLT-2 inhibitors have additional nephroprotective effect"], ["Nephrology Referral", "eGFR <45 mL/min/1.73m² or persistent proteinuria (UPCR >0.1) or rapidly declining GFR (>5 mL/yr)"], ["Anaemia", "If Hb <10 g/dL and eGFR <45: check iron stores; EPO-stimulating agents if iron-replete"], ] ckd_tbl = Table(ckd_rows, colWidths=[4*cm, 12*cm]) ckd_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0),(0,-1), TEAL_LIGHT), ("FONTNAME", (0,0),(0,-1), "Helvetica-Bold"), ("FONTSIZE", (0,0),(-1,-1), 9), ("TEXTCOLOR", (0,0),(0,-1), TEAL), ("GRID", (0,0),(-1,-1), 0.3, GREY_LINE), ("ROWBACKGROUNDS",(0,0),(-1,-1),[WHITE, SLATE_LIGHT]), ("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(ckd_tbl) story.append(sp(4)) story.append(hr()) # ═══════════════════════════════════════════════════════════════════════════════ # SECTION 7 – Oncologic Surveillance # ═══════════════════════════════════════════════════════════════════════════════ story.append(PageBreak()) story.append(section_header("ONCOLOGIC SURVEILLANCE AFTER RADICAL NEPHRECTOMY FOR RCC", "7")) story.append(sp(6)) story.append(Paragraph( "Surveillance schedule is stratified by pathologic stage, based on <b>NCCN Kidney Cancer Guidelines v1.2025</b> " "and EAU/AUA recommendations. Recurrence can occur years to decades after surgery; adherence to protocol is essential.", BODY)) story.append(sp(6)) story.append(Paragraph("7.1 Surveillance by Stage", SUBSEC)) surv_headers = ["Stage", "History & Exam", "Labs (CMP, eGFR)", "Chest Imaging", "Abdominal CT/MRI"] surv_rows = [ ["Stage I (pT1)", "6-monthly ×2 yr,\nthen annually", "Annually", "CXR annually", "CT/MRI at 3–12 months post-op,\nthen annually ×5 yr"], ["Stage II (pT2)", "6-monthly ×2 yr,\nthen annually", "Annually", "CXR every 6 months ×2 yr", "CT/MRI every 6 months ×2 yr,\nthen annually ×5 yr"], ["Stage III (pT3–T4 / N+)", "Every 3–4 months ×3 yr,\nthen 6-monthly", "Every 6 months", "CT chest every 3–6 months ×3 yr", "CT abdomen/pelvis every\n3–6 months ×3 yr, then annually"], ["M1 NED (post-cytoreductive NX)", "Every 3 months ×2 yr", "Every 3 months", "CT chest every 3 months", "CT abdomen/pelvis every\n3–6 months"], ] story.append(data_table(surv_headers, surv_rows, col_widths=[2.5*cm, 3*cm, 2.5*cm, 3.5*cm, 4.5*cm])) story.append(sp(6)) story.append(Paragraph("7.2 Common Sites of Metastatic Recurrence", SUBSEC)) met_tbl = data_table( ["Site", "Median Time to Recurrence", "Surveillance Implication"], [ ["Lung (most common)", "~67 months", "Routine chest imaging at each visit"], ["Liver", "~97 months", "Abdominal CT includes liver windows"], ["Bone", "~144 months", "Bone scan / MRI spine only if symptomatic"], ["Brain", "Late; uncommon", "MRI brain only if neurological symptoms"], ["Local (renal fossa)", "Variable; early", "Abdominal CT protocol covers renal fossa"], ], col_widths=[3.5*cm, 4.5*cm, 8*cm] ) story.append(met_tbl) story.append(sp(6)) story.append(Paragraph("7.3 Adjuvant Systemic Therapy Considerations", SUBSEC)) story.append(callout( "🔹 <b>Adjuvant Pembrolizumab (KEYNOTE-564)</b> — FDA approved for high-risk clear cell RCC after radical nephrectomy:\n" "Indications: pT2 G4, pT3 any G, pT4 any G, or M1 NED (resected metastases). " "1-year course of pembrolizumab improves disease-free survival (31.4 vs 25.2 months vs placebo). " "Discuss with patients meeting criteria within 3 months of surgery.", style="info")) story.append(sp(4)) story.append(Paragraph( "Sunitinib-based adjuvant therapy is not routinely recommended due to toxicity without consistent OS benefit. " "For metastatic RCC, cytoreductive nephrectomy decisions should be made in multidisciplinary tumour board — " "role is being re-evaluated in the immunotherapy era (NORDIC-SUN, PROBE trials ongoing).", BODY)) story.append(sp(4)) story.append(hr()) # ═══════════════════════════════════════════════════════════════════════════════ # SECTION 8 – Follow-up Timeline Summary # ═══════════════════════════════════════════════════════════════════════════════ story.append(sp(4)) story.append(section_header("FOLLOW-UP CARE TIMELINE SUMMARY", "8")) story.append(sp(6)) timeline_headers = ["Timeframe", "Key Actions"] timeline_rows = [ ["Day 0–1\n(ICU/Ward)", "Vitals + urine output monitoring, haemoglobin check, IV analgesia, VTE prophylaxis, incentive spirometry, mobilise"], ["Day 1–2", "Resume oral diet, remove NGT, step down analgesia to oral, ambulate TID, remove urinary catheter"], ["Day 2–3 (lap)\nDay 4–7 (open)", "Discharge if criteria met; patient education, wound care instructions, discharge medications"], ["2 weeks", "GP review: wound inspection, suture removal (if non-absorbable), blood pressure check, creatinine"], ["6–12 weeks", "Surgeon review, baseline abdominal CT/MRI (post-nephrectomy for RCC stage I); renal function panel"], ["3 months", "Oncology visit: labs + imaging per stage; assess for adjuvant pembrolizumab eligibility"], ["6 months", "Renal function (eGFR, UPCR, electrolytes), BP check, surveillance imaging per stage"], ["Annually", "Creatinine/eGFR, urinalysis/UPCR, BP, lipids, HbA1c; chest X-ray ± CT; nephrology if eGFR <45"], ["Long-term\n(>5 years)", "Annual creatinine + BP for life; continued oncologic surveillance per clinician judgement; nephrology co-management if CKD"], ] story.append(data_table(timeline_headers, timeline_rows, col_widths=[3.5*cm, 12.5*cm])) story.append(sp(6)) # ═══════════════════════════════════════════════════════════════════════════════ # SECTION 9 – Special Considerations # ═══════════════════════════════════════════════════════════════════════════════ story.append(sp(4)) story.append(section_header("SPECIAL CONSIDERATIONS", "9")) story.append(sp(6)) spec_data = [ ["HYPERTENSION POST-NEPHRECTOMY", "DIABETES AND CKD RISK", "ELDERLY PATIENTS"], ["• Up to 86% of patients with renovascular hypertension improve after nephrectomy\n" "• Continue antihypertensives post-op; titrate down as BP allows\n" "• First-line: ACE inhibitor / ARB if proteinuria present\n" "• Target <130/80 mmHg\n" "• Aldosterone antagonists (spironolactone) in resistant hypertension", "• Diabetic patients: highest risk of progressive CKD after nephrectomy\n" "• SGLT-2 inhibitors: reno-protective + cardiometabolic benefit; use if eGFR ≥25\n" "• Tight glycaemic control (HbA1c <53 mmol/mol)\n" "• GLP-1 agonists if obese + diabetic\n" "• Avoid metformin if eGFR <30", "• Higher complication rates post-operatively\n" "• More aggressive VTE prophylaxis\n" "• CKD progression faster with age-related nephron loss\n" "• Consider dose adjustment for all renally-cleared drugs\n" "• Falls risk: avoid sedating medications\n" "• Geriatric review if frail"], ] spec_tbl = Table(spec_data, colWidths=[(CONTENT_W)/3]*3) spec_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0),(-1,0), TEAL), ("TEXTCOLOR", (0,0),(-1,0), WHITE), ("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"), ("FONTSIZE", (0,0),(-1,-1), 8.5), ("BACKGROUND", (0,1),(0,1), TEAL_LIGHT), ("BACKGROUND", (1,1),(1,1), AMBER_LIGHT), ("BACKGROUND", (2,1),(2,1), SLATE_LIGHT), ("GRID", (0,0),(-1,-1), 0.4, GREY_LINE), ("VALIGN", (0,0),(-1,-1), "TOP"), ("TOPPADDING", (0,0),(-1,-1), 7), ("BOTTOMPADDING", (0,0),(-1,-1), 7), ("LEFTPADDING", (0,0),(-1,-1), 6), ("ALIGN", (0,0),(-1,0), "CENTER"), ("FONTSIZE", (0,0),(-1,0), 9.5), ])) story.append(spec_tbl) story.append(sp(8)) # ═══════════════════════════════════════════════════════════════════════════════ # SECTION 10 – References # ═══════════════════════════════════════════════════════════════════════════════ story.append(hr()) story.append(sp(4)) story.append(Paragraph("REFERENCES AND SOURCES", SUBSEC)) story.append(sp(4)) refs = [ "Barash, Cullen & Stoelting's Clinical Anesthesia, 9th Edition — Postoperative Considerations (Nephrectomy), p.4284–4285", "Campbell-Walsh-Wein Urology, 3-Volume Set — Complications of Laparoscopic Renal Surgery", "Sabiston Textbook of Surgery — Donor Nephrectomy Postoperative Course", "Brenner and Rector's The Kidney, 2-Volume Set — Compensatory Hypertrophy and CKD After Nephrectomy", "Comprehensive Clinical Nephrology, 7th Edition — Partial vs Radical Nephrectomy and Renal Function", "NCCN Clinical Practice Guidelines in Oncology: Kidney Cancer v1.2025 (updated July 2024)", "Cobb JK et al. Management and optimization of chronic renal insufficiency in kidney cancer. Int Braz J Urol. 2025 [PMID: 40658472]", "Liu Y et al. Perioperative, functional, and oncological outcomes after cryoablation or partial nephrectomy for small renal masses. BMC Urol. 2024 [PMID: 38268005]", "Follow-up guidelines after radical or partial nephrectomy for localized RCC. PMC2645874", ] for i, r in enumerate(refs, 1): story.append(Paragraph(f"{i}. {r}", make_style(f"Ref{i}", fontSize=8.5, fontName="Helvetica", textColor=SLATE, leading=12, leftIndent=12, firstLineIndent=-12, spaceAfter=4))) story.append(sp(6)) story.append(callout( "This document is intended for educational and reference purposes only. " "Clinical decisions should always be made in the context of individual patient presentation, " "local institutional protocols, and current specialist guidelines.", style="info")) # ── Build ───────────────────────────────────────────────────────────────────── doc.build(story, onFirstPage=cover_page, onLaterPages=later_pages) print(f"PDF generated: {OUTPUT}") PYEOF echo "Script written successfully"
cd /tmp/workspace/nephrectomy-pdf && python generate_pdf.py 2>&1
~/nephrectomy-pdf/generate_pdf.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/nephrectomy-pdf/generate_pdf.py'
cd /tmp/workspace/nephrectomy-pdf && python generate_pdf.py 2>&1
~/nephrectomy-pdf/generate_pdf.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/nephrectomy-pdf/generate_pdf.py'
cd /tmp/workspace/nephrectomy-pdf && python generate_pdf.py 2>&1
ls -lh /tmp/workspace/nephrectomy-pdf/Post_Radical_Nephrectomy_Management.pdf
Post Radical Nephrectomy Management
PDF Document · PDF
| Section | Content |
|---|---|
| Cover page | Title banner with scope, guidelines, and date |
| 1. Immediate Postoperative Care | Monitoring table (vitals, UO, drain, labs), fluid management, respiratory care |
| 2. Pain Management | Multimodal analgesia table (epidural, PCA, paracetamol, gabapentinoids); NSAID contraindication callout |
| 3. ERAS Protocol | Three-column pre/intra/post-operative ERAS actions |
| 4. Complications | Early and late complications with incidence and management |
| 5. Discharge | Discharge criteria, timing (lap vs open), and patient instructions |
| 6. Renal Function | Physiology of compensatory hypertrophy, monitoring schedule, CKD management table |
| 7. Oncologic Surveillance | NCCN stage-based imaging schedule, metastatic sites table, adjuvant pembrolizumab |
| 8. Timeline Summary | Day 0 through long-term follow-up at a glance |
| 9. Special Considerations | Hypertension, diabetes/CKD risk, elderly patients |
| References | 9 cited sources (textbooks + PubMed) |