post operative antibiotics given in head and neck oncology
"head and neck" AND "postoperative antibiotics" AND surgery
"head neck cancer" AND "antibiotic" AND "surgical site infection"
postoperative antibiotics head and neck oncology surgery guidelines 2023 2024
https://pmc.ncbi.nlm.nih.gov/articles/PMC12649332
"head neck" AND "antibiotic" AND "flap reconstruction" AND "prophylaxis"
| Procedure Type | Recommended PAP Duration |
|---|---|
| Clean head and neck (thyroidectomy, parotidectomy - no mucosal entry) | None postoperatively |
| Clean-contaminated (mucosal entry, primary closure) | 24 hours |
| Major oncologic resection with soft-tissue free flap reconstruction | 24-48 hours |
| Major oncologic resection with bony free flap reconstruction (mandibulectomy, maxillectomy with osteosynthetic hardware) | Up to 72 hours |
| Historically practiced (now discouraged) | 5-7 days |
give protocals in india according to Tata Memorial Oncology.
Tata Memorial Hospital Mumbai postoperative antibiotic protocol head neck oncology surgery
Tata Memorial Centre antibiotic prophylaxis head neck cancer surgery protocol India
TMH Tata Memorial Hospital "ampicillin sulbactam" OR "amoxicillin clavulanate" head neck surgery protocol SSI India
India head neck oncology postoperative antibiotic protocol "cefazolin metronidazole" OR "amoxicillin clavulanate" SSI prevention 2022 2023 2024
"head neck" AND "antibiotic" AND "surgical site infection" AND India
PMID: 36452549
https://strathprints.strath.ac.uk/65964/1/Haque_etal_ERACT_2…
| Wound Type | Regimen | Duration |
|---|---|---|
| Clean head and neck surgery (thyroidectomy, parotidectomy) | Amoxicillin-Clavulanate single dose | Single perioperative dose only |
| Clean-contaminated (oral cavity, oropharynx, larynx - mucosal entry) | Amoxicillin-Clavulanate + Metronidazole | 3 times daily for 3 days postoperatively |
| Factor | Implication |
|---|---|
| High Gram-negative burden | Need agents covering GNBs (Clavulanate, Metronidazole, or Ciprofloxacin) |
| High MDR organism prevalence | Clindamycin resistance is common; avoid as monotherapy |
| Tobacco/betel nut chewing | Altered oral flora, higher anaerobic load - metronidazole essential |
| Malnutrition (low albumin) | Higher SSI risk; some extend antibiotics beyond 48h |
| Prior chemoradiotherapy | Impaired healing, microvascular changes - extended coverage often used |
| High MRSA rates in hospitals | Vancomycin / Teicoplanin reserved for documented MRSA cases |
| Cost constraints | Oral Amoxicillin-Clavulanate step-down used widely |
PRE-OPERATIVE (30-60 min before incision):
Inj. Amoxicillin-Clavulanate 1.2 g IV (slow infusion)
Inj. Metronidazole 500 mg IV (over 20 min)
INTRAOPERATIVE REDOSING (if surgery >3 hours):
Repeat Amoxicillin-Clavulanate 1.2 g IV
POST-OPERATIVE:
Inj. Amoxicillin-Clavulanate 1.2 g IV Q8H
Inj. Metronidazole 500 mg IV Q8H
DURATION:
Standard clean-contaminated (primary closure): 48 hours
Free flap (soft tissue): 48-72 hours
Free flap (bony/fibula): 72 hours - 5 days*
Post-chemoradiation / high risk: 5-7 days* (*institutional practice,
not evidence-based)
ORAL STEP-DOWN (when tolerating orally):
Tab. Amoxicillin-Clavulanate 625 mg BD/TDS
Tab. Metronidazole 400 mg TDS
For 3-5 days (completing total course)
PENICILLIN ALLERGY ALTERNATIVE:
Inj. Clindamycin 600 mg IV Q8H
+ Inj. Ciprofloxacin 400 mg IV Q12H
Generate a quick reference PDF for postoperative antibiotic management in Indian H&N oncology
ls /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or not found"
mkdir -p /home/daytona/workspace/hn-antibiotics && python3 -c "from reportlab.lib import colors; print('reportlab ok')" && python3 -c "from reportlab.platypus import SimpleDocTemplate; print('platypus ok')"
~/hn-antibiotics/generate_pdf.py
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 = "/home/daytona/workspace/hn-antibiotics/HN_Oncology_Antibiotic_QuickRef.pdf"
# ── Colour Palette ──────────────────────────────────────────────────────────
TEAL = colors.HexColor("#005f73")
TEAL_LIGHT = colors.HexColor("#94d2bd")
TEAL_PALE = colors.HexColor("#e9f5f7")
ORANGE = colors.HexColor("#ee9b00")
ORANGE_PALE = colors.HexColor("#fff3cd")
RED = colors.HexColor("#ae2012")
RED_PALE = colors.HexColor("#fde8e6")
GREEN = colors.HexColor("#2a7c3f")
GREEN_PALE = colors.HexColor("#e8f5e9")
GREY_DARK = colors.HexColor("#2b2d42")
GREY_MED = colors.HexColor("#6c757d")
GREY_LIGHT = colors.HexColor("#f8f9fa")
WHITE = colors.white
PAGE_W, PAGE_H = A4
def build_styles():
base = getSampleStyleSheet()
s = {}
s["doc_title"] = ParagraphStyle(
"doc_title", parent=base["Normal"],
fontSize=18, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_CENTER,
spaceAfter=2, spaceBefore=2
)
s["doc_subtitle"] = ParagraphStyle(
"doc_subtitle", parent=base["Normal"],
fontSize=10, fontName="Helvetica",
textColor=TEAL_LIGHT, alignment=TA_CENTER,
spaceAfter=2
)
s["section_head"] = ParagraphStyle(
"section_head", parent=base["Normal"],
fontSize=11, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_LEFT,
leftIndent=4, spaceAfter=2, spaceBefore=2
)
s["body"] = ParagraphStyle(
"body", parent=base["Normal"],
fontSize=9, fontName="Helvetica",
textColor=GREY_DARK, leading=13, spaceAfter=3
)
s["body_bold"] = ParagraphStyle(
"body_bold", parent=base["Normal"],
fontSize=9, fontName="Helvetica-Bold",
textColor=GREY_DARK, leading=13
)
s["small"] = ParagraphStyle(
"small", parent=base["Normal"],
fontSize=7.5, fontName="Helvetica",
textColor=GREY_MED, leading=10
)
s["drug_name"] = ParagraphStyle(
"drug_name", parent=base["Normal"],
fontSize=9.5, fontName="Helvetica-Bold",
textColor=TEAL, leading=12
)
s["dose"] = ParagraphStyle(
"dose", parent=base["Normal"],
fontSize=9, fontName="Helvetica",
textColor=GREY_DARK, leading=12
)
s["warning"] = ParagraphStyle(
"warning", parent=base["Normal"],
fontSize=8.5, fontName="Helvetica-Bold",
textColor=RED, leading=11
)
s["note"] = ParagraphStyle(
"note", parent=base["Normal"],
fontSize=8, fontName="Helvetica-Oblique",
textColor=GREY_MED, leading=11
)
s["table_head"] = ParagraphStyle(
"table_head", parent=base["Normal"],
fontSize=8.5, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_CENTER, leading=11
)
s["table_cell"] = ParagraphStyle(
"table_cell", parent=base["Normal"],
fontSize=8.5, fontName="Helvetica",
textColor=GREY_DARK, leading=11
)
s["table_cell_bold"] = ParagraphStyle(
"table_cell_bold", parent=base["Normal"],
fontSize=8.5, fontName="Helvetica-Bold",
textColor=GREY_DARK, leading=11
)
s["table_cell_teal"] = ParagraphStyle(
"table_cell_teal", parent=base["Normal"],
fontSize=8.5, fontName="Helvetica-Bold",
textColor=TEAL, leading=11
)
s["footer"] = ParagraphStyle(
"footer", parent=base["Normal"],
fontSize=7, fontName="Helvetica-Oblique",
textColor=GREY_MED, alignment=TA_CENTER
)
return s
# ── Helper: coloured section header row ─────────────────────────────────────
def section_header(text, styles, bg=TEAL):
p = Paragraph(text, styles["section_head"])
t = Table([[p]], colWidths=[PAGE_W - 3*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("ROUNDEDCORNERS", [4, 4, 4, 4]),
]))
return t
def build_document():
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
leftMargin=1.5*cm, rightMargin=1.5*cm,
topMargin=1.5*cm, bottomMargin=1.5*cm,
title="HN Oncology Postoperative Antibiotic Quick Reference",
author="Orris Clinical Reference"
)
styles = build_styles()
story = []
# ── HEADER BANNER ────────────────────────────────────────────────────────
header_text = [
[Paragraph("POSTOPERATIVE ANTIBIOTIC MANAGEMENT", styles["doc_title"])],
[Paragraph("Head & Neck Oncology Surgery | Indian Tertiary Centre Reference | 2025–26", styles["doc_subtitle"])],
]
header_table = Table(header_text, colWidths=[PAGE_W - 3*cm])
header_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), TEAL),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING", (0,0), (-1,-1), 10),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
]))
story.append(header_table)
story.append(Spacer(1, 0.3*cm))
# ── WOUND CLASSIFICATION REMINDER ────────────────────────────────────────
story.append(section_header("WOUND CLASSIFICATION — Head & Neck", styles))
story.append(Spacer(1, 0.2*cm))
wc_data = [
[
Paragraph("CLASS", styles["table_head"]),
Paragraph("PROCEDURE", styles["table_head"]),
Paragraph("PROPHYLAXIS REQUIRED?", styles["table_head"]),
],
[
Paragraph("CLEAN", styles["table_cell_teal"]),
Paragraph("Thyroidectomy, Parathyroidectomy, Parotidectomy (ext. approach), Lateral neck dissection only", styles["table_cell"]),
Paragraph("NO postoperative antibiotics", styles["table_cell"]),
],
[
Paragraph("CLEAN-CONTAMINATED", styles["table_cell_teal"]),
Paragraph("Oral cavity / oropharyngeal / laryngeal / hypopharyngeal resection, Total laryngectomy, Composite resection, Free flap with mucosal entry", styles["table_cell"]),
Paragraph("YES — perioperative + postoperative", styles["table_cell_bold"]),
],
[
Paragraph("CONTAMINATED / DIRTY", styles["table_cell_teal"]),
Paragraph("Infected tumour, Pharyngocutaneous fistula repair, Re-exploration infected wound", styles["table_cell"]),
Paragraph("TREATMENT dose antibiotics (not prophylaxis)", styles["table_cell_bold"]),
],
]
wc_col_widths = [3.5*cm, 9*cm, 5.5*cm]
wc_table = Table(wc_data, colWidths=wc_col_widths, repeatRows=1)
wc_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL),
("BACKGROUND", (0,1), (-1,1), GREEN_PALE),
("BACKGROUND", (0,2), (-1,2), ORANGE_PALE),
("BACKGROUND", (0,3), (-1,3), RED_PALE),
("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),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(wc_table)
story.append(Spacer(1, 0.35*cm))
# ── STANDARD REGIMEN ─────────────────────────────────────────────────────
story.append(section_header("STANDARD PERIOPERATIVE REGIMEN (No Penicillin Allergy)", styles))
story.append(Spacer(1, 0.2*cm))
reg_data = [
[
Paragraph("TIMING", styles["table_head"]),
Paragraph("DRUG", styles["table_head"]),
Paragraph("DOSE & ROUTE", styles["table_head"]),
Paragraph("FREQUENCY", styles["table_head"]),
],
[
Paragraph("Pre-op\n(30–60 min before incision)", styles["table_cell_bold"]),
Paragraph("Inj. Amoxicillin-Clavulanate", styles["drug_name"]),
Paragraph("1.2 g IV slow infusion", styles["dose"]),
Paragraph("Single dose", styles["table_cell"]),
],
[
Paragraph("", styles["table_cell"]),
Paragraph("Inj. Metronidazole", styles["drug_name"]),
Paragraph("500 mg IV over 20 min", styles["dose"]),
Paragraph("Single dose", styles["table_cell"]),
],
[
Paragraph("Intra-op\n(redose if surgery >3 h or blood loss >1500 mL)", styles["table_cell_bold"]),
Paragraph("Inj. Amoxicillin-Clavulanate", styles["drug_name"]),
Paragraph("1.2 g IV", styles["dose"]),
Paragraph("Once (at 3 h mark)", styles["table_cell"]),
],
[
Paragraph("Post-op\n(continue as per duration table)", styles["table_cell_bold"]),
Paragraph("Inj. Amoxicillin-Clavulanate", styles["drug_name"]),
Paragraph("1.2 g IV", styles["dose"]),
Paragraph("Every 8 hours", styles["table_cell"]),
],
[
Paragraph("", styles["table_cell"]),
Paragraph("Inj. Metronidazole", styles["drug_name"]),
Paragraph("500 mg IV", styles["dose"]),
Paragraph("Every 8 hours", styles["table_cell"]),
],
[
Paragraph("Oral step-down\n(when tolerating orally)", styles["table_cell_bold"]),
Paragraph("Tab. Amoxicillin-Clavulanate", styles["drug_name"]),
Paragraph("625 mg oral", styles["dose"]),
Paragraph("BD or TDS", styles["table_cell"]),
],
[
Paragraph("", styles["table_cell"]),
Paragraph("Tab. Metronidazole", styles["drug_name"]),
Paragraph("400 mg oral", styles["dose"]),
Paragraph("TDS", styles["table_cell"]),
],
]
reg_col = [4*cm, 5.5*cm, 4*cm, 4.5*cm]
reg_table = Table(reg_data, colWidths=reg_col, repeatRows=1)
reg_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL),
("BACKGROUND", (0,1), (-1,2), TEAL_PALE),
("BACKGROUND", (0,3), (-1,3), colors.HexColor("#fff8e1")),
("BACKGROUND", (0,4), (-1,5), GREY_LIGHT),
("BACKGROUND", (0,6), (-1,7), GREEN_PALE),
("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),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("SPAN", (0,1), (0,2)),
("SPAN", (0,4), (0,5)),
("SPAN", (0,6), (0,7)),
]))
story.append(reg_table)
story.append(Spacer(1, 0.35*cm))
# ── DURATION TABLE ───────────────────────────────────────────────────────
story.append(section_header("DURATION OF POSTOPERATIVE ANTIBIOTICS (Evidence-Based vs Indian Practice)", styles))
story.append(Spacer(1, 0.2*cm))
dur_data = [
[
Paragraph("PROCEDURE / SCENARIO", styles["table_head"]),
Paragraph("EVIDENCE-BASED DURATION", styles["table_head"]),
Paragraph("COMMON INDIAN PRACTICE", styles["table_head"]),
],
[
Paragraph("Clean surgery (thyroidectomy, parotidectomy — no mucosal entry)", styles["table_cell"]),
Paragraph("None post-op", styles["table_cell_teal"]),
Paragraph("None / single pre-op dose", styles["table_cell"]),
],
[
Paragraph("Clean-contaminated — primary closure, no flap", styles["table_cell"]),
Paragraph("24 hours", styles["table_cell_teal"]),
Paragraph("48–72 hours IV, then oral", styles["table_cell"]),
],
[
Paragraph("Composite resection with pedicled flap (PMMC, DP)", styles["table_cell"]),
Paragraph("24–48 hours", styles["table_cell_teal"]),
Paragraph("48–72 hours IV + 3–5 days oral", styles["table_cell"]),
],
[
Paragraph("Free flap — soft tissue only (ALT, RFFF, RFAF)", styles["table_cell"]),
Paragraph("24–48 hours", styles["table_cell_teal"]),
Paragraph("48–72 hours IV + 3–5 days oral", styles["table_cell"]),
],
[
Paragraph("Free flap — bony reconstruction (Fibula, Iliac crest) with osteosynthetic hardware", styles["table_cell"]),
Paragraph("Up to 72 hours", styles["table_cell_teal"]),
Paragraph("72 h IV + 5–7 days oral", styles["table_cell"]),
],
[
Paragraph("Total laryngectomy (high pharyngocutaneous fistula risk)", styles["table_cell"]),
Paragraph("48–72 hours", styles["table_cell_teal"]),
Paragraph("5–7 days (institutional practice)", styles["table_cell"]),
],
[
Paragraph("Prior chemoradiotherapy to field (impaired healing)", styles["table_cell_bold"]),
Paragraph("48–72 hours (no RCT evidence for extension)", styles["table_cell"]),
Paragraph("5–7 days common (no evidence base)", styles["table_cell_bold"]),
],
]
dur_col = [6.5*cm, 5*cm, 6.5*cm]
dur_table = Table(dur_data, colWidths=dur_col, repeatRows=1)
dur_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL),
("BACKGROUND", (0,1), (-1,1), GREEN_PALE),
("ROWBACKGROUNDS",(0,2), (-1,-1), [WHITE, GREY_LIGHT]),
("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),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("BACKGROUND", (0,7), (-1,7), ORANGE_PALE),
]))
story.append(dur_table)
story.append(Spacer(1, 0.35*cm))
# ── PENICILLIN ALLERGY ───────────────────────────────────────────────────
story.append(section_header("PENICILLIN ALLERGY ALTERNATIVE REGIMEN", styles, bg=ORANGE))
story.append(Spacer(1, 0.2*cm))
allergy_data = [
[
Paragraph("TIMING", styles["table_head"]),
Paragraph("DRUG", styles["table_head"]),
Paragraph("DOSE & ROUTE", styles["table_head"]),
Paragraph("FREQUENCY", styles["table_head"]),
],
[
Paragraph("Pre-op & Post-op", styles["table_cell_bold"]),
Paragraph("Inj. Clindamycin", styles["drug_name"]),
Paragraph("600 mg IV (900 mg if >70 kg)", styles["dose"]),
Paragraph("Q8H", styles["table_cell"]),
],
[
Paragraph("", styles["table_cell"]),
Paragraph("Inj. Ciprofloxacin", styles["drug_name"]),
Paragraph("400 mg IV", styles["dose"]),
Paragraph("Q12H (for GN coverage)", styles["table_cell"]),
],
[
Paragraph("Oral step-down", styles["table_cell_bold"]),
Paragraph("Cap. Clindamycin", styles["drug_name"]),
Paragraph("300 mg oral", styles["dose"]),
Paragraph("Q8H", styles["table_cell"]),
],
[
Paragraph("", styles["table_cell"]),
Paragraph("Tab. Ciprofloxacin", styles["drug_name"]),
Paragraph("500 mg oral", styles["dose"]),
Paragraph("BD", styles["table_cell"]),
],
]
allergy_col = [4*cm, 5.5*cm, 4*cm, 4.5*cm]
allergy_table = Table(allergy_data, colWidths=allergy_col, repeatRows=1)
allergy_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), ORANGE),
("BACKGROUND", (0,1), (-1,4), ORANGE_PALE),
("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),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("SPAN", (0,1), (0,2)),
("SPAN", (0,3), (0,4)),
]))
story.append(allergy_table)
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph(
"* Avoid Clindamycin monotherapy — high Gram-negative burden in Indian oral cancer patients means Gram-negative coverage (Ciprofloxacin) is essential.",
styles["note"]
))
story.append(Spacer(1, 0.35*cm))
# ── MICROBIOLOGY IN INDIAN CONTEXT ───────────────────────────────────────
story.append(section_header("INDIAN MICROBIOLOGY CONTEXT (Tertiary Oncology Centre)", styles, bg=GREY_DARK))
story.append(Spacer(1, 0.2*cm))
micro_col = [(PAGE_W - 3*cm) / 2, (PAGE_W - 3*cm) / 2]
left_data = [
[Paragraph("COMMON ORGANISMS IN SSI (Indian data)", styles["table_head"])],
[Paragraph("Gram-NEGATIVE (70.5% of isolates)*\n"
" • Pseudomonas aeruginosa\n"
" • Klebsiella pneumoniae\n"
" • Escherichia coli\n"
" • Acinetobacter baumannii (MDR)", styles["table_cell"])],
[Paragraph("Gram-POSITIVE (27%)*\n"
" • Staphylococcus aureus (incl. MRSA 38%)\n"
" • Streptococcus spp.\n"
" • Enterococcus spp.", styles["table_cell"])],
[Paragraph("Anaerobes\n"
" • Bacteroides spp., Fusobacterium\n"
" • Peptostreptococcus", styles["table_cell"])],
[Paragraph("Polymicrobial: 41.6% of infected wounds*", styles["table_cell_bold"])],
]
right_data = [
[Paragraph("EFFECTIVE AGENTS (Indian sensitivity data)", styles["table_head"])],
[Paragraph("For Gram-NEGATIVE bacilli:\n"
" • Amikacin (best GN coverage: 93%)\n"
" • Piperacillin-Tazobactam (72%)\n"
" • Imipenem (81%, reserve)\n"
" • Gentamicin (73%)", styles["table_cell"])],
[Paragraph("For Gram-POSITIVE cocci:\n"
" • Chloramphenicol (97.6%)\n"
" • Amikacin (97.3%)\n"
" • Piperacillin-Tazobactam (88.2%)\n"
" • Vancomycin (MRSA, reserve)", styles["table_cell"])],
[Paragraph("For Anaerobes:\n"
" • Metronidazole (first choice)\n"
" • Amoxicillin-Clavulanate\n"
" • Clindamycin (resistance rising)", styles["table_cell"])],
[Paragraph("MDR organisms — early culture & de-escalation\nessential per antimicrobial stewardship", styles["table_cell_bold"])],
]
left_tbl = Table(left_data, colWidths=[(PAGE_W-3*cm)/2 - 0.3*cm])
left_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), GREY_DARK),
("BACKGROUND", (0,1), (-1,-1), GREY_LIGHT),
("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),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
right_tbl = Table(right_data, colWidths=[(PAGE_W-3*cm)/2 - 0.3*cm])
right_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), GREY_DARK),
("BACKGROUND", (0,1), (-1,-1), GREY_LIGHT),
("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),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
micro_outer = Table([[left_tbl, right_tbl]], colWidths=[(PAGE_W-3*cm)/2, (PAGE_W-3*cm)/2])
micro_outer.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0), (-1,-1), 0),
("RIGHTPADDING", (0,0), (-1,-1), 0),
("TOPPADDING", (0,0), (-1,-1), 0),
("BOTTOMPADDING",(0,0), (-1,-1), 0),
]))
story.append(micro_outer)
story.append(Paragraph(
"* Balagopal PG et al. Pattern of Post-Operative Infections Among Oral Cavity Cancer Patients in a Tertiary Care Cancer Centre. "
"Indian J Otolaryngol Head Neck Surg. 2022. PMID: 36452549",
styles["note"]
))
story.append(Spacer(1, 0.35*cm))
# ── RISK FACTORS & SSI PREVENTION ────────────────────────────────────────
story.append(section_header("RISK FACTORS FOR SSI — Indian H&N Oncology Context", styles))
story.append(Spacer(1, 0.2*cm))
risk_data = [
[
Paragraph("PATIENT FACTORS", styles["table_head"]),
Paragraph("DISEASE FACTORS", styles["table_head"]),
Paragraph("SURGICAL FACTORS", styles["table_head"]),
],
[
Paragraph(
" • Tobacco / betel nut use (altered oral flora)\n"
" • Malnutrition / serum albumin <3.5 g/dL\n"
" • Diabetes mellitus\n"
" • BMI <18 or >30\n"
" • Anaemia (Hb <10 g/dL)\n"
" • Age >65 years\n"
" • Immunosuppression\n"
" • Alcohol excess",
styles["table_cell"]
),
Paragraph(
" • Stage III–IV disease\n"
" • Prior radiotherapy to field\n"
" • Prior chemotherapy\n"
" • Tracheostomy (GN colonisation)\n"
" • Tumour necrosis / infection\n"
" • Previous neck surgery",
styles["table_cell"]
),
Paragraph(
" • Surgery >6 hours\n"
" • Blood loss >1500 mL\n"
" • Free flap reconstruction\n"
" • Bony reconstruction + hardware\n"
" • Inadequate pre-op antibiotic timing\n"
" • Emergency / unplanned surgery\n"
" • Pharyngeal / oesophageal entry",
styles["table_cell"]
),
],
]
risk_col = [(PAGE_W-3*cm)/3]*3
risk_table = Table(risk_data, colWidths=risk_col, repeatRows=1)
risk_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL),
("BACKGROUND", (0,1), (-1,1), TEAL_PALE),
("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),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(risk_table)
story.append(Spacer(1, 0.35*cm))
# ── ESCALATION — WHEN TO SUSPECT SSI ─────────────────────────────────────
story.append(section_header("WHEN TO SUSPECT SSI & ESCALATE ANTIBIOTICS", styles, bg=RED))
story.append(Spacer(1, 0.2*cm))
esc_data = [
[
Paragraph("CLINICAL SIGNS", styles["table_head"]),
Paragraph("ACTION", styles["table_head"]),
Paragraph("ANTIBIOTIC ESCALATION", styles["table_head"]),
],
[
Paragraph(
" • Fever >38.5°C beyond POD 3\n"
" • Wound erythema / induration / discharge\n"
" • Rising WBC / CRP after initial fall\n"
" • Flap discolouration / venous congestion",
styles["table_cell"]
),
Paragraph(
" • Wound swab for C/S (aerobic + anaerobic)\n"
" • Blood cultures if septic\n"
" • Surgical review — explore/drain\n"
" • CT neck if deep space infection suspected",
styles["table_cell"]
),
Paragraph(
" • Switch to Piperacillin-Tazobactam 4.5 g IV Q6H\n"
" • Add Vancomycin 15 mg/kg IV Q12H if MRSA risk\n"
" • De-escalate once C/S results available\n"
" • Infectious Disease consult for MDR organisms",
styles["table_cell"]
),
],
]
esc_col = [(PAGE_W-3*cm)/3]*3
esc_table = Table(esc_data, colWidths=esc_col, repeatRows=1)
esc_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), RED),
("BACKGROUND", (0,1), (-1,1), RED_PALE),
("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),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(esc_table)
story.append(Spacer(1, 0.35*cm))
# ── KEY CLINICAL PEARLS ───────────────────────────────────────────────────
story.append(section_header("KEY CLINICAL PEARLS — Indian Context", styles, bg=GREEN))
story.append(Spacer(1, 0.2*cm))
pearls = [
("<b>1. Gram-negative coverage is non-negotiable</b> — Indian H&N oncology SSIs are dominated by GNBs (70.5%). "
"Clindamycin monotherapy is <b>inadequate</b> and associated with higher SSI rates in Indian studies."),
("<b>2. Ampicillin-Sulbactam / Amoxicillin-Clavulanate is the backbone</b> — covers GPC, anaerobes, and most GNBs. "
"Superior to Clindamycin in multiple Indian and international series."),
("<b>3. Metronidazole is essential</b> — tobacco/betel nut users have a heavy anaerobic oral burden; "
"Metronidazole uniquely penetrates abscess cavities and augments anaerobic coverage."),
("<b>4. Evidence supports ≤48 hours</b> — most international data shows no benefit beyond 24–48 h. "
"Indian practice of 5–7 days <b>is not evidence-based</b> and promotes AMR."),
("<b>5. Pre-op timing matters most</b> — the most important determinant of SSI prevention "
"is antibiotic administration <b>within 60 minutes before incision</b>."),
("<b>6. Culture-guided de-escalation</b> — send wound swabs at the first sign of infection; "
"MDR organisms are common. Early ID consult for Pseudomonas, MRSA, or Acinetobacter."),
("<b>7. Nutritional optimisation</b> — correct albumin, Hb, and blood sugar pre-operatively; "
"these non-antibiotic factors have equal or greater impact on SSI rates."),
]
pearl_rows = [[Paragraph(p, styles["body"])] for p in pearls]
pearl_table = Table(pearl_rows, colWidths=[PAGE_W - 3*cm])
pearl_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), GREEN_PALE),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("LINEBELOW", (0,0), (-1,-2), 0.3, colors.HexColor("#c8e6c9")),
]))
story.append(pearl_table)
story.append(Spacer(1, 0.35*cm))
# ── ANTIMICROBIAL STEWARDSHIP REMINDER ───────────────────────────────────
warn_data = [[
Paragraph(
"ANTIMICROBIAL STEWARDSHIP: "
"Extending prophylaxis beyond 72 hours is NOT recommended except for established infection. "
"Prolonged prophylaxis INCREASES antimicrobial resistance, C. difficile risk, and drug costs "
"without reducing SSI rates. Adopt culture-guided therapy and de-escalate early.",
styles["warning"]
)
]]
warn_table = Table(warn_data, colWidths=[PAGE_W - 3*cm])
warn_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), RED_PALE),
("BOX", (0,0), (-1,-1), 1.5, RED),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
]))
story.append(warn_table)
story.append(Spacer(1, 0.35*cm))
# ── FOOTER ────────────────────────────────────────────────────────────────
HRFlowable(width="100%", thickness=0.5, color=TEAL)
footer_text = (
"References: Balagopal PG et al. Indian J Otolaryngol HNS 2022 (PMID 36452549) | "
"Haque R et al. Initiatives to Reduce SSI of the Head, Strathprints 2018 | "
"PMC12649332 (2025 Free Flap PAP Review) | "
"Iowa HN Protocols 2023 | MD Anderson Surgical Antibiotic Prophylaxis v11, 2024\n"
"This quick reference is for educational use. Clinical decisions must incorporate local antibiogram, patient-specific factors, and institutional policy. "
"Generated June 2026."
)
story.append(HRFlowable(width="100%", thickness=0.5, color=TEAL))
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph(footer_text, styles["footer"]))
doc.build(story)
print(f"PDF created: {OUTPUT}")
if __name__ == "__main__":
build_document()
cd /home/daytona/workspace/hn-antibiotics && python3 generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/hn-antibiotics/HN_Oncology_Antibiotic_QuickRef.pdf
HN Oncology Antibiotic QuickRef
PDF Document · PDF
| Section | Content |
|---|---|
| Wound Classification | Clean / Clean-contaminated / Dirty with procedure examples and colour coding |
| Standard Regimen | Amoxicillin-Clavulanate + Metronidazole - pre-op, intra-op, post-op, oral step-down doses |
| Duration Table | Evidence-based vs Indian practice duration for each procedure type (thyroidectomy to fibula flap) |
| Penicillin Allergy Alternative | Clindamycin + Ciprofloxacin regimen with doses |
| Indian Microbiology | Two-column table - common organisms (70.5% GNB) + effective agents from Indian sensitivity data |
| SSI Risk Factors | Patient / Disease / Surgical factors specific to Indian H&N oncology |
| Escalation Guide | When to suspect SSI, when to send cultures, what to escalate to (Pip-Tazo, Vancomycin) |
| 7 Clinical Pearls | Key takeaways including why Clindamycin monotherapy is inadequate in India |
| AMR Warning Box | Stewardship reminder - no prophylaxis beyond 72 h without evidence |
| References | PMID 36452549, Iowa HN Protocols, MD Anderson 2024, PMC 2025 review |