Make a differentiate table between boil and abcess in answer format in point wise
| S.No. | Feature | Boil (Furuncle) | Abscess |
|---|---|---|---|
| 1. | Definition | Acute staphylococcal infection of a hair follicle with perifolliculitis, proceeding to suppuration and central necrosis | A collection of pus in the body, forming a cavity lined by pyogenic membrane |
| 2. | Causative Organism | Specifically Staphylococcus (staphylococcal infection) | Pyogenic organisms (varied); also caused by tubercular bacilli in cold abscess |
| 3. | Origin / Pathology | Arises from infection of a single hair follicle | Organisms gain entry by (i) direct infection, (ii) local extension, (iii) lymphatics, (iv) blood stream (haematogenous) |
| 4. | Nature of Lesion | Starts as a painful, indurated swelling; a small pustule forms at summit which bursts, discharging greenish slough | A cavity filled with pus lined by a pyogenic membrane (dead tissue cells + granulation tissue wall) |
| 5. | Size | Small - involves a single hair follicle | Variable - can be large, involving deeper tissue planes |
| 6. | Pus Character | Small amount of greenish slough discharged on spontaneous bursting | Yellow alkaline fluid (pus) containing disintegrating leucocytes, living/dead bacteria |
| 7. | Types | - Boil (common) - Blind boil (subsides without suppuration) - Stye (eyelash follicle) | - Pyogenic abscess - Pyaemic abscess - Cold abscess |
| 8. | Common Sites | Back, neck; external auditory meatus; perianal region | Any part of body; neck, axilla (cold abscess); liver, spleen, brain (pyaemic) |
| 9. | Cardinal Signs of Inflammation | Present - redness, pain, swelling; small pustule on summit | All 5 cardinal signs present: Rubor, Dolor, Calor, Tumor, Functio laesa |
| 10. | Fluctuation Test | Usually negative (too small/tense) | Positive when pus becomes superficial |
| 11. | Constitutional Symptoms | Mild or absent | Present in pyaemic abscess - high fever, rigor, toxaemia |
| 12. | Complications | (a) Cellulitis (b) Hydradenitis (infection of neighbouring follicles - e.g., axilla) (c) Secondary infection of regional lymph nodes | (a) Sinus/fistula formation (b) Spread via blood stream - pyaemia (c) Sinus formation if cold abscess is improperly drained |
| 13. | Special Investigations | Not usually required | CT scan, Ultrasound, Isotope scanning, Conventional radiology to locate and diagnose |
| 14. | Treatment - Conservative | - Improve general health - Touch of iodine on pustule to hasten necrosis - Removal of affected hair to allow pus escape | - Elevation and rest of affected part - Suitable antibiotic in initial (unlocalized) stage |
| 15. | Treatment - Surgical | Incision usually unnecessary; only if pus does not escape spontaneously | Drainage of pus is mandatory once localized: (a) Free/liberal incision (b) Hilton's method (c) Counter-incision if needed |
| 16. | Role of Antibiotics | Usually not required; only if boils are multiple or recurrent | Antibiotic selected by culture and sensitivity test; started immediately after drainage |
| 17. | Post-Treatment Care | - Clean twice with disinfectant (hexachlorophene) - Exclude diabetes if recurrent | - Corrugated rubber drain used - Dressing changed daily - Vitamins C and B complex given - Packing gradually lightened |
| 18. | Healing | Heals by itself after pus/slough discharge; deep cavity lined by granulation tissue heals spontaneously | Pyogenic membrane converts to fibrous tissue; cavity covered by granulation tissue transforming to collagen fibres |
| 19. | Antibioma | Not applicable | Cold, firm lump due to continuous antibiotics - called antibioma; may mimic carcinoma |
| 20. | Recurrence | Recurrent boils - exclude diabetes | Cold abscess - full antitubercular regime needed; never make incision directly on cold abscess |
Make it as short differentiable form only in format of short answer question
| Feature | Boil (Furuncle) | Abscess |
|---|---|---|
| Definition | Acute staphylococcal infection of a hair follicle with perifolliculitis | Collection of pus in the body |
| Organism | Staphylococcus specifically | Pyogenic organisms (varied) |
| Origin | Single hair follicle | Any tissue - by direct infection, lymphatics, or blood stream |
| Size | Small | Variable - can be large |
| Pus | Small, greenish slough | Yellow alkaline fluid (frank pus) |
| Fluctuation | Absent | Present (when superficial) |
| Fever | Mild/absent | Present (high in pyaemic type) |
| Types | Boil, Blind boil, Stye | Pyogenic, Pyaemic, Cold abscess |
| Complications | Cellulitis, Hydradenitis | Sinus/fistula, Pyaemia |
| Investigations | Not required | USG, CT scan, Isotope scan |
| Treatment | Iodine touch on pustule; rarely incision | Mandatory surgical drainage ("where there is pus, let it out") |
| Antibiotics | Usually not required | Required (by culture & sensitivity) |
| Healing | Spontaneous | Requires active management |
Create a comparison poster of Boil vs Abscess
A medical education comparison poster titled "Boil (Furuncle) vs Abscess" split into two columns. Left column header "BOIL (FURUNCLE)" with a red/orange theme, right column header "ABSCESS" with a blue/teal theme. Each column contains labeled sections: Definition, Organism, Origin, Size, Pus, Fluctuation, Fever, Types, Complications, Treatment, Antibiotics, Healing. Left column facts: Definition - acute staphylococcal infection of hair follicle; Organism - Staphylococcus; Origin - single hair follicle; Size - small; Pus - small greenish slough; Fluctuation - absent; Fever - mild or absent; Types - boil, blind boil, stye; Complications - cellulitis, hydradenitis; Treatment - iodine touch, rarely incision; Antibiotics - usually not required; Healing - spontaneous. Right column facts: Definition - collection of pus in the body; Organism - varied pyogenic organisms; Origin - any tissue via direct/lymphatics/blood; Size - variable, can be large; Pus - yellow alkaline frank pus; Fluctuation - present when superficial; Fever - high especially in pyaemic type; Types - pyogenic, pyaemic, cold abscess; Complications - sinus/fistula, pyaemia; Treatment - mandatory surgical drainage; Antibiotics - required by culture and sensitivity; Healing - requires active management. Bottom banner with key note: "Boil = follicular infection, heals spontaneously | Abscess = pus cavity, must be drained". Clean clinical poster style with icons, bold headings, and white background.

Make a short note on abscess
| Sign | Meaning |
|---|---|
| Rubor | Redness due to hyperaemia |
| Dolor | Throbbing pain |
| Calor | Heat due to hyperaemia |
| Tumor | Swelling due to pus |
| Functio Laesa | Impaired function |
Most important signs: Pain, Redness, Heat
"The basic principle of abscess treatment is - drain the pus, send for culture, give proper antibiotic."
Also include it's type also to make it as full answer
| Sign | Detail |
|---|---|
| Rubor (Redness) | Due to hyperaemia; present before localization |
| Dolor (Pain) | Throbbing pain - characteristic of pus |
| Calor (Heat) | Due to hyperaemia (absent in cold abscess) |
| Tumor (Swelling) | Due to pus inside cavity |
| Functio Laesa | Impaired function; obvious near joints |
Most important: Pain, Redness, Heat
| Investigation | Use |
|---|---|
| X-ray | Fluid levels if air/gas with pus (subphrenic, lung abscess) |
| Isotope scan | Brain, hepatic abscess, osteomyelitis; pelvic, perinephric abscess |
| Ultrasound | Liver, spleen abscess; gallbladder empyema |
| CT scan | Distinguishes abscess from tumour; locates abdominal/brain abscess |
"Where there is pus, let it out"
| Term | Meaning |
|---|---|
| Bacteraemia | Bacteria circulating in blood stream (transient, little significance) |
| Septicaemia | Bacteria + clinical manifestations (pyrexia, rigors, hypotension, DIC, petechial haemorrhages) |
| Toxaemia | Toxins (chemical/bacterial) circulating in blood stream |
⚠️ GOLDEN WARNING: "An incision should NEVER be made on a cold abscess for drainage" - it almost always invites secondary infection and forms a persistent sinus.
| Feature | Pyogenic | Pyaemic | Cold |
|---|---|---|---|
| Number | Single | Multiple | Single/Multiple |
| Heat/Pain | Present | Absent | Absent |
| Cause | Pyogenic organisms | Septic emboli | Tuberculosis |
| Fever | Moderate | Very high + rigors | Absent |
| Plane | Any | Subfascial | Lymph nodes/bone |
| Treatment | Drain + antibiotics | Parenteral antibiotics + drain | Anti-TB drugs + aspiration |
| Special rule | Drain pus | Find source of infection | Never incise |
Key Line: "The basic principle of abscess treatment - drain the pus, send for culture, give proper antibiotic."
Generate a quick reference PDF on abscess types
mkdir -p /tmp/workspace/abscess-pdf && ls /tmp/workspace/
~/abscess-pdf/generate_abscess_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 = "/tmp/workspace/abscess-pdf/Abscess_Quick_Reference.pdf"
# ── Colour palette ──────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1a3a5c")
MID_BLUE = colors.HexColor("#2e6da4")
LIGHT_BLUE = colors.HexColor("#d6e8fa")
RED = colors.HexColor("#c0392b")
ORANGE = colors.HexColor("#e67e22")
GREEN = colors.HexColor("#1e8449")
TEAL = colors.HexColor("#117a65")
LIGHT_GREY = colors.HexColor("#f4f6f8")
MID_GREY = colors.HexColor("#bdc3c7")
WHITE = colors.white
YELLOW_BG = colors.HexColor("#fef9e7")
WARN_ORANGE = colors.HexColor("#fff3cd")
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.5*cm, leftMargin=1.5*cm,
topMargin=1.5*cm, bottomMargin=1.5*cm
)
styles = getSampleStyleSheet()
# Custom styles
def S(name, **kw):
return ParagraphStyle(name, **kw)
title_style = S("Title2", fontSize=22, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER, spaceAfter=4)
subtitle_style = S("Sub", fontSize=11, textColor=LIGHT_BLUE,
fontName="Helvetica", alignment=TA_CENTER, spaceAfter=2)
sec_hd = S("SecHd", fontSize=13, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER,
spaceBefore=6, spaceAfter=4)
body = S("Body2", fontSize=9, textColor=colors.black,
fontName="Helvetica", spaceAfter=3, leading=13)
bold_body = S("BoldBody", fontSize=9, textColor=DARK_BLUE,
fontName="Helvetica-Bold", spaceAfter=2)
warn = S("Warn", fontSize=9, textColor=RED,
fontName="Helvetica-BoldOblique", spaceAfter=4, leading=13)
key_line = S("KeyLine", fontSize=10, textColor=DARK_BLUE,
fontName="Helvetica-BoldOblique", alignment=TA_CENTER,
spaceBefore=4, spaceAfter=4)
bullet = S("Bullet", fontSize=9, textColor=colors.black,
fontName="Helvetica", leftIndent=14, spaceAfter=2, leading=13,
bulletIndent=4)
def section_header(text, bg_color):
tbl = Table([[Paragraph(text, sec_hd)]], colWidths=[17.5*cm])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg_color),
("ROUNDEDCORNERS", [6,6,6,6]),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
]))
return tbl
def two_col_table(rows, col1_w=5*cm, col2_w=12*cm, header=None):
data = []
if header:
data.append([Paragraph(f"<b>{header[0]}</b>", bold_body),
Paragraph(f"<b>{header[1]}</b>", bold_body)])
for r in rows:
data.append([Paragraph(str(r[0]), bold_body),
Paragraph(str(r[1]), body)])
tbl = Table(data, colWidths=[col1_w, col2_w])
style = [
("BACKGROUND", (0,0), (-1,0), LIGHT_BLUE if header else LIGHT_GREY),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING",(0,0), (-1,-1), 6),
]
if header:
style += [("FONTNAME",(0,0),(-1,0),"Helvetica-Bold"),
("BACKGROUND",(0,0),(-1,0), MID_BLUE),
("TEXTCOLOR",(0,0),(-1,0), WHITE)]
tbl.setStyle(TableStyle(style))
return tbl
def highlight_box(text, bg=YELLOW_BG, text_color=DARK_BLUE):
p = Paragraph(text, S("hb", fontSize=9, textColor=text_color,
fontName="Helvetica-BoldOblique", alignment=TA_CENTER,
leading=13))
t = Table([[p]], colWidths=[17.5*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("BOX", (0,0),(-1,-1), 1, RED if bg==WARN_ORANGE else MID_BLUE),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
]))
return t
# ── Build story ──────────────────────────────────────────────────────────────
story = []
# ── TITLE BANNER ─────────────────────────────────────────────────────────────
title_data = [[Paragraph("ABSCESS", title_style)],
[Paragraph("Quick Reference Guide | Surgery", subtitle_style)],
[Paragraph("A Concise Textbook of Surgery", subtitle_style)]]
title_tbl = Table(title_data, colWidths=[17.5*cm])
title_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), DARK_BLUE),
("TOPPADDING", (0,0),(-1,-1), 10),
("BOTTOMPADDING", (0,0),(-1,-1), 10),
]))
story += [title_tbl, Spacer(1, 8)]
# ── DEFINITION ───────────────────────────────────────────────────────────────
story += [
section_header("DEFINITION", MID_BLUE), Spacer(1,4),
Paragraph("An <b>abscess</b> is a <b>collection of pus in the body</b>.", body),
Paragraph("Three surgical varieties:", body),
Paragraph("• <b>1. Pyogenic Abscess</b> - commonest type", bullet),
Paragraph("• <b>2. Pyaemic Abscess</b> - multiple, from infected emboli", bullet),
Paragraph("• <b>3. Cold Abscess</b> - non-reactive, tubercular origin", bullet),
Spacer(1,6),
]
# ── TYPE 1: PYOGENIC ──────────────────────────────────────────────────────────
story += [section_header("TYPE 1: PYOGENIC ABSCESS (Commonest)", colors.HexColor("#1e8449")), Spacer(1,4)]
story += [Paragraph("<b>Routes of Entry of Organisms:</b>", bold_body)]
entry_rows = [
("(i)", "Direct infection from penetrating wounds"),
("(ii)", "Local extension from adjacent focus of infection"),
("(iii)", "Lymphatics"),
("(iv)", "Blood stream (haematogenous)"),
]
story += [two_col_table(entry_rows, col1_w=1.5*cm, col2_w=16*cm), Spacer(1,5)]
story += [Paragraph("<b>Pathology:</b>", bold_body),
Paragraph("• Suppurative infection causes cell death and <b>liquefaction</b>", bullet),
Paragraph("• Proteolytic enzymes from dead PMN leucocytes liquefy dead tissue", bullet),
Paragraph("• Resulting fluid = <b>PUS</b> (yellow, alkaline, contains disintegrating + living leucocytes + living + dead bacteria)", bullet),
Paragraph("• Cavity lined by <b>Pyogenic membrane</b> (dead tissue cells + granulation tissue of phagocytic histiocytes)", bullet),
Paragraph("• Recovery: pyogenic membrane → fibrous tissue → collagen fibres", bullet),
Spacer(1,5)]
story += [Paragraph("<b>Clinical Features (5 Cardinal Signs):</b>", bold_body)]
cardinal = [
["Sign", "Meaning"],
["Rubor (Redness)", "Due to hyperaemia; present before localization"],
["Dolor (Pain)", "Throbbing pain - characteristic of pus"],
["Calor (Heat)", "Due to hyperaemia (absent in cold abscess)"],
["Tumor (Swelling)", "Due to pus inside cavity"],
["Functio Laesa", "Impaired function; obvious near joints"],
]
card_tbl = Table(cardinal, colWidths=[5*cm, 12*cm])
card_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), MID_BLUE),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("BACKGROUND", (0,1),(-1,-1), LIGHT_GREY),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, LIGHT_GREY]),
("GRID", (0,0),(-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 6),
("FONTSIZE", (0,0),(-1,-1), 9),
]))
story += [card_tbl, Spacer(1,3)]
story += [highlight_box("Most important signs: Pain (Dolor), Redness (Rubor), Heat (Calor)"), Spacer(1,5)]
story += [Paragraph("<b>Detection of Pus:</b>", bold_body),
Paragraph("(i) Temperature becomes elevated", bullet),
Paragraph("(ii) Brawny oedema with induration - deep abscess (breast, parotid, ischiorectal)", bullet),
Paragraph("(iii) <b>Positive fluctuation test</b> - when pus becomes superficial", bullet),
Spacer(1,5)]
story += [Paragraph("<b>Special Investigations:</b>", bold_body)]
inv_rows = [
["Investigation", "Use"],
["X-ray (Radiology)", "Fluid levels if air/gas present - subphrenic, lung abscess; opacity in nasal antrum, pleural cavity"],
["Isotope Scan", "Brain abscess, hepatic abscess, osteomyelitis; pelvic, perinephric, mediastinal abscess"],
["Ultrasound", "Liver & spleen abscess; gallbladder empyema"],
["CT Scan", "Distinguishes abscess from tumour (necrotic centre); locates abdominal and brain abscess"],
]
inv_tbl = Table(inv_rows, colWidths=[4*cm, 13*cm])
inv_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), MID_BLUE),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, LIGHT_GREY]),
("GRID", (0,0),(-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 6),
("FONTSIZE", (0,0),(-1,-1), 9),
("VALIGN", (0,0),(-1,-1), "TOP"),
]))
story += [inv_tbl, Spacer(1,5)]
story += [Paragraph("<b>Treatment:</b>", bold_body),
Paragraph("<b>Stage 1 - Conservative (unlocalized):</b> Elevation + rest + antibiotic", bullet),
Paragraph("<b>Stage 2 - Surgical (once localized):</b>", bullet)]
story += [highlight_box('"Where there is pus, let it out" | Drain + Culture & Sensitivity + Proper Antibiotic'), Spacer(1,4)]
drain_rows = [
["Method", "Details"],
["(a) Free/Liberal Incision",
"Made on most prominent + dependent part. Adequate size for complete drainage. Muscle incised along fibre lines. If nerves/vessels nearby - incision parallel to them."],
["(b) Hilton's Method",
"Used near nerves/vessels (neck, axilla, groin). Skin incised; artery/sinus forceps pushed through deep fascia. Blades opened to extrude pus. Finger inserted to break all loculi."],
["(c) Counter-incision",
"When prominent part is NOT the dependent part. Second incision at most dependent part. Sinus forceps passed from first incision; knife makes fresh cut between forceps tips."],
]
drain_tbl = Table(drain_rows, colWidths=[4.5*cm, 13*cm])
drain_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), colors.HexColor("#1e8449")),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, colors.HexColor("#eafaf1")]),
("GRID", (0,0),(-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 6),
("FONTSIZE", (0,0),(-1,-1), 9),
("VALIGN", (0,0),(-1,-1), "TOP"),
]))
story += [drain_tbl, Spacer(1,4)]
story += [Paragraph("<b>Post-operative Care:</b>", bold_body),
Paragraph("• Corrugated rubber drain (extends incision to counter-incision if used)", bullet),
Paragraph("• Dressing changed daily - acriflavine lotion + sterile gauze", bullet),
Paragraph("• Packing gradually lightened to allow healing", bullet),
Paragraph("• Vitamin <b>C</b> (wound healing) + Vitamin <b>B complex</b> (when tetracycline used)", bullet),
Paragraph("• Antibiotics by culture & sensitivity started immediately", bullet),
Spacer(1,4)]
story += [highlight_box("ANTIBIOMA: Continuous antibiotics without drainage → firm, sterile lump → may mimic carcinoma", WARN_ORANGE, RED), Spacer(1,8)]
# ── TYPE 2: PYAEMIC ───────────────────────────────────────────────────────────
story += [section_header("TYPE 2: PYAEMIC ABSCESS", colors.HexColor("#7d3c98")), Spacer(1,4)]
story += [
Paragraph("<b>Definition:</b> Multiple abscesses from <b>infected emboli in pyaemia</b> (septic emboli = clump of organisms + infected clot/vagitation from broken infected thrombus).", body),
Spacer(1,3),
Paragraph("<b>Associated conditions:</b> Acute osteomyelitis, Intracranial sinus inflammation, Bacterial endocarditis, Portal pyaemia (appendicitis → liver abscesses)", body),
Spacer(1,4),
]
story += [Paragraph("<b>Three Key Terms:</b>", bold_body)]
terms = [
["Term", "Definition"],
["Bacteraemia", "Bacteria circulating in blood stream. Transient, little clinical significance. Occurs after tooth extraction, infections, etc."],
["Septicaemia", "Bacteria + clinical manifestations from bacterial toxins: pyrexia, rigors, hypotension, DIC, petechial haemorrhages. Treated with IV antibiotics (aminoglycoside + metronidazole) + blood transfusion."],
["Toxaemia", "Toxins (chemical/bacterial) circulating in blood stream, producing toxaemic symptoms."],
]
terms_tbl = Table(terms, colWidths=[3.5*cm, 14*cm])
terms_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), colors.HexColor("#7d3c98")),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, colors.HexColor("#f9ebff")]),
("GRID", (0,0),(-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 6),
("FONTSIZE", (0,0),(-1,-1), 9),
("VALIGN", (0,0),(-1,-1), "TOP"),
]))
story += [terms_tbl, Spacer(1,4)]
story += [Paragraph("<b>Features of Pyaemic Abscess:</b>", bold_body),
Paragraph("(a) Generally <b>multiple</b>", bullet),
Paragraph("(b) Occur in <b>subfascial plane</b>", bullet),
Paragraph("(c) <b>Non-reacting</b> - calor, rubor, dolor are ABSENT", bullet),
Paragraph("(d) Tremendous constitutional disturbances - <b>high fever, rigor, toxaemia</b>", bullet),
Paragraph("(e) May occur in viscera (spleen, kidneys); <b>death</b> may result from brain/heart abscess", bullet),
Spacer(1,4)]
story += [Paragraph("<b>Treatment:</b>", bold_body),
Paragraph("• Parenteral antibiotic ASAP (by culture & sensitivity of pus)", bullet),
Paragraph("• Drain superficial abscesses", bullet),
Paragraph("• <b>Locate and treat the source of infection</b>", bullet),
Spacer(1,8)]
# ── TYPE 3: COLD ABSCESS ──────────────────────────────────────────────────────
story += [section_header("TYPE 3: COLD ABSCESS", colors.HexColor("#2e86c1")), Spacer(1,4)]
story += [
Paragraph("<b>Definition:</b> A <b>non-reactive abscess</b> - does not produce hot, painful features. Caused almost always by <b>tuberculosis</b>.", body),
Spacer(1,3),
]
story += [Paragraph("<b>Features:</b>", bold_body),
Paragraph("• <b>No heat, no pain, no tenderness</b> - conspicuous by their absence", bullet),
Paragraph("• Brawny induration and oedema are absent", bullet),
Paragraph("• A few acute features may appear only with secondary infection", bullet),
Paragraph("• Caseation of lymph nodes forms the cold abscess", bullet),
Paragraph("• On palpation: <b>soft and matted nodes</b>", bullet),
Spacer(1,4)]
story += [Paragraph("<b>Common Sites:</b>", bold_body)]
sites = [
["(i)", "Neck and axilla (commonest)"],
["(ii)", "Loin - from caries spine"],
["(iii)", "Side of chest wall - from tuberculosis of ribs"],
["(iv)", "Back/side of chest wall - along intercostal/cutaneous nerve from posterior mediastinal lymph nodes (may travel long distance)"],
["(v)", "Near ends of long bones and joints - from bone/joint tuberculosis"],
]
story += [two_col_table(sites, col1_w=1.5*cm, col2_w=16*cm), Spacer(1,5)]
story += [Paragraph("<b>Treatment:</b>", bold_body),
Paragraph("1. Start <b>full antitubercular regime</b> once diagnosis confirmed", bullet),
Paragraph("2. Aspiration obliquely through <b>NORMAL surrounding skin</b> (NOT through most prominent/dependent part - to avoid sinus formation)", bullet),
Paragraph("3. Followed by local instillation of <b>I.N.H. solution</b>", bullet),
Paragraph("4. If abscess persists - excise the <b>affected lymph node group as a whole</b>", bullet),
Spacer(1,4)]
story += [highlight_box(
"⚠ GOLDEN WARNING: NEVER make an incision on a cold abscess for drainage!\n"
"It almost always invites secondary infection and forms a PERSISTENT SINUS.",
WARN_ORANGE, RED), Spacer(1,8)]
# ── SUMMARY COMPARISON TABLE ─────────────────────────────────────────────────
story += [section_header("SUMMARY: Comparison of All Three Types", DARK_BLUE), Spacer(1,4)]
comp = [
["Feature", "Pyogenic", "Pyaemic", "Cold"],
["Number", "Single", "Multiple", "Single/Multiple"],
["Heat/Pain", "Present", "Absent", "Absent"],
["Cause", "Pyogenic organisms","Septic emboli", "Tuberculosis"],
["Fever", "Moderate", "Very high + rigors", "Absent"],
["Plane", "Any tissue", "Subfascial", "Lymph nodes/bone"],
["Fluctuation", "Present", "May be absent", "Present (soft)"],
["Treatment", "Drain + antibiotics","Parenteral AB + drain", "Anti-TB + aspiration"],
["Special rule", "Drain pus", "Find infection source", "NEVER incise"],
]
comp_tbl = Table(comp, colWidths=[4*cm, 4.5*cm, 4.5*cm, 4.5*cm])
comp_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("BACKGROUND", (0,1), (0,-1), LIGHT_BLUE),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("ROWBACKGROUNDS",(1,1), (-1,-1), [WHITE, LIGHT_GREY]),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ALIGN", (1,0), (-1,-1), "CENTER"),
]))
story += [comp_tbl, Spacer(1,8)]
# ── KEY LINE ──────────────────────────────────────────────────────────────────
story += [
HRFlowable(width="100%", thickness=1.5, color=MID_BLUE),
Spacer(1,4),
highlight_box(
'"The basic principle of abscess treatment — drain the pus, send for culture & sensitivity, give proper antibiotic."',
LIGHT_BLUE, DARK_BLUE
),
Spacer(1,4),
HRFlowable(width="100%", thickness=1.5, color=MID_BLUE),
Spacer(1,4),
Paragraph("Source: A Concise Textbook of Surgery | Quick Reference Guide",
S("foot", fontSize=8, textColor=MID_GREY, alignment=TA_CENTER)),
]
# ── Build ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved to: {OUTPUT}")
cd /tmp/workspace/abscess-pdf && python generate_abscess_pdf.py
Abscess Quick Reference
PDF Document · PDF
| Section | Content |
|---|---|
| Title Banner | Dark blue header with title and source |
| Definition | All 3 types listed |
| Type 1: Pyogenic | Routes of entry, Pathology, 5 Cardinal Signs table, Pus detection, Investigations table, Treatment (Conservative + Surgical drainage methods), Post-op care, Antibioma warning |
| Type 2: Pyaemic | Definition, Bacteraemia/Septicaemia/Toxaemia table, Features, Treatment |
| Type 3: Cold | Definition, Features, Sites table, Treatment, ⚠ Golden Warning box |
| Summary Table | All 3 types compared across 9 features side by side |
| Key Line | Golden rule of abscess treatment |
Make a differentiable table on types of abcess in simple short answer question
| Feature | Pyogenic Abscess | Pyaemic Abscess | Cold Abscess |
|---|---|---|---|
| Definition | Collection of pus caused by pyogenic organisms | Multiple abscesses from infected emboli in pyaemia | Non-reactive abscess; no hot/painful features |
| Cause | Pyogenic organisms | Septic emboli from infected thrombus | Tuberculosis (almost always) |
| Number | Single | Multiple | Single or multiple |
| Nature | Reactive (hot, painful) | Non-reacting | Non-reacting (cold) |
| Heat & Pain | Present | Absent | Absent |
| Redness | Present | Absent | Absent |
| Fever | Moderate | Very high with rigors and toxaemia | Absent |
| Plane | Any tissue plane | Subfascial plane | Lymph nodes, bone, joint |
| Fluctuation | Present (when superficial) | May be absent | Present (soft, matted) |
| Common Sites | Any part of body | Spleen, kidneys, brain, liver | Neck, axilla, loin, chest wall, near joints |
| Pus character | Yellow, alkaline, frank pus | Sterile/thin | Caseous material |
| Constitutional symptoms | Mild to moderate | Severe - high fever, rigors, toxaemia; death may occur | Absent |
| Special feature | Antibioma if untreated with drainage | Portal pyaemia - multiple liver abscesses | Travels along anatomical planes (e.g. from spine to loin) |
| Investigations | USG, CT scan | Blood culture, USG | X-ray spine, Mantoux, USG |
| Treatment | Drain pus + antibiotics by C&S | Parenteral antibiotics ASAP + drain superficial abscesses | Full antitubercular regime + aspiration through normal skin + INH instillation |
| Drainage | Mandatory - free incision / Hilton's method | Drain only superficial ones | NEVER incise - causes persistent sinus |
| Special rule | "Where there is pus, let it out" | Find and treat the source of infection | Aspiration through normal surrounding skin only |
Make a differentiate table on type of abcess under headings like definition, it's cause, it's pathology, it's site, it's clinical feature, complications, treatment.
| Pyogenic Abscess | Pyaemic Abscess | Cold Abscess |
|---|---|---|
| Collection of pus in body caused by pyogenic organisms | Multiple abscesses developing from infected emboli in pyaemia | Non-reactive abscess which does not produce hot and painful features |
| Pyogenic Abscess | Pyaemic Abscess | Cold Abscess |
|---|---|---|
| Pyogenic organisms gain entry by: (i) Direct infection from wounds (ii) Local extension from adjacent focus (iii) Lymphatics (iv) Blood stream (haematogenous) | Septic emboli (clump of organisms + infected clot) formed by breaking up of an infected thrombus lodge in various body parts | Almost always a sequel of tubercular infection - commonly in lymph nodes, bone and joint |
| Pyogenic Abscess | Pyaemic Abscess | Cold Abscess |
|---|---|---|
| Suppurative infection → cell death → liquefaction by proteolytic enzymes of dead PMN leucocytes → pus (yellow, alkaline fluid) → cavity lined by pyogenic membrane (dead cells + granulation tissue). Recovery: pyogenic membrane → fibrous tissue → collagen fibres | Septic emboli lodge in subfascial plane → non-reacting suppuration. Associated with acute osteomyelitis, bacterial endocarditis, intracranial sinus inflammation. Portal pyaemia → multiple liver abscesses | Caseation of lymph nodes/bone → forms cold abscess. No acute inflammatory reaction. Only when secondary infection occurs do a few acute features appear |
| Pyogenic Abscess | Pyaemic Abscess | Cold Abscess |
|---|---|---|
| Any part of body | (i) Subfascial plane (ii) Viscera - spleen, kidneys (iii) Brain, heart (fatal) (iv) Liver - portal pyaemia | (i) Neck and axilla - commonest (ii) Loin - from caries spine (iii) Side of chest wall - from rib TB (iv) Back/side of chest - along intercostal/cutaneous nerve (v) Near ends of long bones and joints - from bone/joint TB |
| Feature | Pyogenic Abscess | Pyaemic Abscess | Cold Abscess |
|---|---|---|---|
| Number | Single | Multiple | Single or multiple |
| Heat | Present (Calor) | Absent | Absent |
| Pain | Throbbing (Dolor) | Absent | Absent |
| Redness | Present (Rubor) | Absent | Absent |
| Swelling | Present (Tumor) | May be present | Present (soft, matted nodes) |
| Function | Impaired (Functio Laesa) | Impaired | Mildly affected |
| Fever | Moderate | Very high with rigors + toxaemia | Absent |
| Fluctuation | Positive (superficial) | May be absent | Positive (soft) |
| Nature | Reactive - hot, tender | Non-reacting | Non-reacting - cold |
| Pyogenic Abscess | Pyaemic Abscess | Cold Abscess |
|---|---|---|
| (i) Sinus or fistula formation if inadequately drained (ii) Spread to adjacent structures (iii) Antibioma - firm sterile lump if antibiotics given without drainage; may mimic carcinoma (iv) Chronicity if loculi not broken | (i) Death - if abscess occurs in brain or heart (ii) Septicaemia and multiorgan failure (iii) Involvement of viscera - spleen, kidneys (iv) Portal pyaemia - multiple liver abscesses | (i) Persistent sinus - if incision made directly (most important) (ii) Secondary pyogenic infection (iii) Spread along anatomical planes to distant sites (iv) Chronic discharging sinus |
| Aspect | Pyogenic Abscess | Pyaemic Abscess | Cold Abscess |
|---|---|---|---|
| Conservative | Elevation + rest + antibiotic (unlocalized stage) | Parenteral antibiotic ASAP by culture & sensitivity | Full antitubercular regime started immediately |
| Surgical | Mandatory drainage once localized: (a) Free/liberal incision (b) Hilton's method (c) Counter-incision | Drain only superficial abscesses; find + treat source of infection | Aspiration obliquely through normal surrounding skin + instil INH solution locally |
| Drainage rule | "Where there is pus, let it out" | Drain superficial ones only | NEVER incise - forms persistent sinus |
| Follow-up | Corrugated drain + daily dressing + Vit C + Vit B complex | Blood transfusion + plasma expanders if needed | Excise lymph node group if abscess persists |
| Special rule | Send pus for culture & sensitivity; give proper antibiotic | Find and treat the source of infection | Incision is absolutely contraindicated |
Memory Aid:
- Pyogenic = ONE abscess, HOT & PAINFUL → DRAIN IT
- Pyaemic = MANY abscesses, NO SIGNS, HIGH FEVER → FIND THE SOURCE
- Cold = TB origin, COLD & SOFT → ASPIRATE, NEVER INCISE
Create a summary document of all abscess types for quick revision
~/abscess-pdf/generate_abscess_summary.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, PageBreak
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY, TA_RIGHT
OUTPUT = "/tmp/workspace/abscess-pdf/Abscess_Types_Summary.pdf"
# Colour palette
C = {
"dark_blue": colors.HexColor("#1a3a5c"),
"mid_blue": colors.HexColor("#2e6da4"),
"light_blue": colors.HexColor("#d6e8fa"),
"green": colors.HexColor("#1e8449"),
"light_green": colors.HexColor("#d5f5e3"),
"purple": colors.HexColor("#6c3483"),
"light_purple":colors.HexColor("#e8daef"),
"teal": colors.HexColor("#117a65"),
"light_teal": colors.HexColor("#d0ece7"),
"red": colors.HexColor("#c0392b"),
"orange": colors.HexColor("#e67e22"),
"warn_bg": colors.HexColor("#fff3cd"),
"warn_border": colors.HexColor("#e67e22"),
"light_grey": colors.HexColor("#f4f6f8"),
"mid_grey": colors.HexColor("#bdc3c7"),
"dark_grey": colors.HexColor("#5d6d7e"),
"white": colors.white,
"black": colors.black,
"gold": colors.HexColor("#f0b429"),
"light_gold": colors.HexColor("#fffbe6"),
}
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
rightMargin=1.4*cm, leftMargin=1.4*cm,
topMargin=1.3*cm, bottomMargin=1.3*cm
)
W = 18.2*cm # usable width
def style(name, **kw):
return ParagraphStyle(name, **kw)
# Paragraph styles
ST = {
"title": style("title", fontSize=24, textColor=C["white"], fontName="Helvetica-Bold", alignment=TA_CENTER, spaceAfter=3, leading=28),
"subtitle": style("sub", fontSize=10, textColor=C["light_blue"], fontName="Helvetica", alignment=TA_CENTER, spaceAfter=2),
"pg_title": style("pg_title", fontSize=14, textColor=C["white"], fontName="Helvetica-Bold", alignment=TA_CENTER, spaceAfter=4, spaceBefore=4),
"sec_hd": style("sec_hd", fontSize=11, textColor=C["white"], fontName="Helvetica-Bold", alignment=TA_LEFT, spaceAfter=3, spaceBefore=3),
"body": style("body", fontSize=8.5,textColor=C["black"], fontName="Helvetica", spaceAfter=2, leading=12),
"bold": style("bold", fontSize=8.5,textColor=C["dark_blue"], fontName="Helvetica-Bold", spaceAfter=2),
"bullet": style("bullet", fontSize=8.5,textColor=C["black"], fontName="Helvetica", leftIndent=12, spaceAfter=2, leading=12),
"warn": style("warn", fontSize=9, textColor=C["red"], fontName="Helvetica-BoldOblique", spaceAfter=3, leading=13, alignment=TA_CENTER),
"key": style("key", fontSize=9.5,textColor=C["dark_blue"], fontName="Helvetica-BoldOblique", alignment=TA_CENTER, leading=14),
"footer": style("footer", fontSize=7.5,textColor=C["mid_grey"], fontName="Helvetica", alignment=TA_CENTER),
"memory": style("memory", fontSize=9, textColor=C["dark_blue"], fontName="Helvetica-Bold", alignment=TA_CENTER, leading=14),
}
def banner(text, sub, bg=C["dark_blue"]):
rows = [[Paragraph(text, ST["title"])], [Paragraph(sub, ST["subtitle"])]]
t = Table(rows, colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("TOPPADDING", (0,0),(-1,-1), 12),
("BOTTOMPADDING", (0,0),(-1,-1), 10),
]))
return t
def page_header(text, bg):
t = Table([[Paragraph(text, ST["pg_title"])]], colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("TOPPADDING", (0,0),(-1,-1), 7),
("BOTTOMPADDING", (0,0),(-1,-1), 7),
("LEFTPADDING", (0,0),(-1,-1), 10),
]))
return t
def section_bar(text, bg):
t = Table([[Paragraph(text, ST["sec_hd"])]], colWidths=[W])
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),
]))
return t
def make_table(rows, col_widths, header_bg, row_bgs=None):
if row_bgs is None:
row_bgs = [C["white"], C["light_grey"]]
t = Table(rows, colWidths=col_widths)
style_cmds = [
("BACKGROUND", (0,0),(-1,0), header_bg),
("TEXTCOLOR", (0,0),(-1,0), C["white"]),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,-1), 8.5),
("ROWBACKGROUNDS",(0,1),(-1,-1), row_bgs),
("GRID", (0,0),(-1,-1), 0.35, C["mid_grey"]),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 5),
("VALIGN", (0,0),(-1,-1), "TOP"),
]
t.setStyle(TableStyle(style_cmds))
return t
def info_box(text, bg, border_color, txt_style="warn"):
p = Paragraph(text, ST[txt_style])
t = Table([[p]], colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("BOX", (0,0),(-1,-1), 1.2, border_color),
("TOPPADDING", (0,0),(-1,-1), 7),
("BOTTOMPADDING", (0,0),(-1,-1), 7),
("LEFTPADDING", (0,0),(-1,-1), 10),
("RIGHTPADDING", (0,0),(-1,-1), 10),
]))
return t
def P(text, s="body"): return Paragraph(text, ST[s])
def B(text): return Paragraph(text, ST["bullet"])
def SP(h=4): return Spacer(1, h)
def HR(): return HRFlowable(width="100%", thickness=0.8, color=C["mid_grey"])
# ─────────────────────────────────────────────────────────────────
story = []
# ══════════════════════════════════════════
# COVER / TITLE PAGE
# ══════════════════════════════════════════
story += [
banner("ABSCESS", "Types, Pathology, Clinical Features & Treatment | Quick Revision Summary"),
SP(10),
]
# Index boxes
idx_data = [
[P("<b>PAGE 1</b>", "bold"), P("<b>PAGE 2</b>", "bold"), P("<b>PAGE 3</b>", "bold")],
[P("Pyogenic Abscess\nDefinition, Pathology,\nClinical Features,\nInvestigations, Treatment", "body"),
P("Pyaemic Abscess\nDefinition, Pathology,\nKey Terms, Features,\nComplications, Treatment", "body"),
P("Cold Abscess\nDefinition, Pathology,\nSites, Features,\nComplications, Treatment", "body")],
[P("<b>PAGE 4</b>", "bold"), P("<b>PAGE 5</b>", "bold"), P("<b>PAGE 6</b>", "bold")],
[P("Master Comparison\nTable across all\n7 headings", "body"),
P("Memory Aids &\nKey Lines\nGolden Rules", "body"),
P("Drainage Methods\nPost-op Care\nAntibioma", "body")],
]
idx_tbl = Table(idx_data, colWidths=[W/3]*3)
idx_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(2,0), C["mid_blue"]),
("BACKGROUND", (0,2),(2,2), C["dark_blue"]),
("TEXTCOLOR", (0,0),(2,0), C["white"]),
("TEXTCOLOR", (0,2),(2,2), C["white"]),
("FONTNAME", (0,0),(2,0), "Helvetica-Bold"),
("FONTNAME", (0,2),(2,2), "Helvetica-Bold"),
("BACKGROUND", (0,1),(2,1), C["light_blue"]),
("BACKGROUND", (0,3),(2,3), C["light_grey"]),
("GRID", (0,0),(-1,-1), 0.5, C["mid_grey"]),
("TOPPADDING", (0,0),(-1,-1), 8),
("BOTTOMPADDING", (0,0),(-1,-1), 8),
("LEFTPADDING", (0,0),(-1,-1), 8),
("ALIGN", (0,0),(-1,-1), "CENTER"),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("FONTSIZE", (0,0),(-1,-1), 8.5),
]))
story += [P("CONTENTS AT A GLANCE", "bold"), SP(4), idx_tbl, SP(8)]
story += [
info_box(
'"An abscess is a collection of pus in the body."\n'
'Three types: 1. Pyogenic | 2. Pyaemic | 3. Cold',
C["light_blue"], C["mid_blue"], "key"
),
SP(8),
P("Source: A Concise Textbook of Surgery", "footer"),
PageBreak()
]
# ══════════════════════════════════════════
# PAGE 1 — PYOGENIC ABSCESS
# ══════════════════════════════════════════
story += [page_header("PAGE 1: PYOGENIC ABSCESS (Commonest Type)", C["green"]), SP(5)]
# Definition
story += [section_bar("DEFINITION", C["green"]), SP(3),
P("Commonest variety of abscess. Organisms gain entry and cause suppurative infection leading to "
"cell death, liquefaction and pus formation inside a cavity lined by a <b>pyogenic membrane</b>."),
SP(5)]
# Cause
story += [section_bar("CAUSE - Routes of Entry", C["green"]), SP(3)]
entry = [["Route", "Details"],
["(i) Direct", "Penetrating wounds"],
["(ii) Local extension", "From adjacent focus of infection"],
["(iii) Lymphatics", "Via lymphatic channels"],
["(iv) Haematogenous", "Via blood stream"],
]
story += [make_table(entry, [3*cm, 15*cm], C["green"], [C["white"], C["light_green"]]), SP(5)]
# Pathology
story += [section_bar("PATHOLOGY", C["green"]), SP(3),
B("Suppurative infection kills tissue cells and exudate cells"),
B("Proteolytic enzymes from dead PMN leucocytes liquefy dead tissue"),
B("<b>PUS</b> = yellow, alkaline fluid with disintegrating + living leucocytes + living + dead bacteria"),
B("Cavity lined by <b>Pyogenic membrane</b> = dead tissue cells + granulation tissue of phagocytic histiocytes"),
B("Recovery: pyogenic membrane → fibrous tissue → granulation tissue → collagen fibres"),
B("<b>Antibioma</b>: continuous antibiotics without drainage → firm, sterile lump → may mimic carcinoma"),
SP(5)]
# Clinical Features
story += [section_bar("CLINICAL FEATURES (5 Cardinal Signs)", C["green"]), SP(3)]
cardinal = [
["Sign", "Feature", "Detail"],
["Rubor", "Redness", "Due to hyperaemia; present before localization"],
["Dolor", "Pain", "Throbbing pain - characteristic of pus presence"],
["Calor", "Heat", "Due to hyperaemia (absent in cold abscess)"],
["Tumor", "Swelling", "Due to pus inside cavity"],
["Functio Laesa", "Impaired function", "Obvious near joints; patient avoids movement"],
]
story += [make_table(cardinal, [3*cm, 3.5*cm, 11.5*cm], C["green"], [C["white"], C["light_green"]]), SP(3)]
story += [P("<b>Detection of pus:</b>"), SP(2),
B("(i) Elevated temperature"),
B("(ii) Brawny oedema + induration (deep - breast, parotid, ischiorectal)"),
B("(iii) <b>Positive fluctuation test</b> when pus becomes superficial"),
SP(5)]
# Investigations
story += [section_bar("SPECIAL INVESTIGATIONS", C["green"]), SP(3)]
inv = [["Investigation", "Use"],
["X-ray", "Fluid levels with air/gas (subphrenic, lung abscess); opacity in nasal antrum, pleural cavity"],
["Isotope scan", "Brain, hepatic, osteomyelitis, pelvic, perinephric, mediastinal abscess"],
["Ultrasound", "Liver & spleen abscess; gallbladder empyema"],
["CT scan", "Distinguishes abscess from tumour (necrotic centre); locates abdominal & brain abscess"],
]
story += [make_table(inv, [3.5*cm, 14.5*cm], C["green"], [C["white"], C["light_green"]]), SP(5)]
# Treatment
story += [section_bar("TREATMENT", C["green"]), SP(3),
P("<b>Stage 1 - Conservative (unlocalized):</b> Elevation + rest + suitable antibiotic"),
SP(3)]
story += [info_box('"Where there is pus, let it out" — Drain + Culture & Sensitivity + Proper Antibiotic',
C["light_green"], C["green"], "key"), SP(4)]
drain = [["Method", "Details"],
["(a) Free / Liberal Incision",
"Made on most prominent + most dependent part. Adequate (liberal) size. Muscle incised along fibres. Near nerves/vessels - incision parallel to them."],
["(b) Hilton's Method",
"Used near nerves/vessels (neck, axilla, groin). Skin incised; artery/sinus forceps pushed through deep fascia into cavity. Blades opened to extrude pus. Finger explores and breaks all loculi."],
["(c) Counter-incision",
"When prominent part is not the dependent part. Second incision at most dependent site for gravity drainage. Sinus forceps passed from first incision; knife makes fresh incision between forceps tips."],
]
story += [make_table(drain, [4.5*cm, 13.5*cm], C["teal"], [C["white"], C["light_teal"]]), SP(4),
P("<b>Post-op care:</b>"), SP(2),
B("Corrugated rubber drain (from incision to counter-incision)"),
B("Daily dressing - acriflavine lotion + sterile gauze; packing gradually lightened"),
B("Vitamin C (wound healing) + Vitamin B complex (if tetracycline used)"),
B("Antibiotics by culture & sensitivity started immediately"),
PageBreak()]
# ══════════════════════════════════════════
# PAGE 2 — PYAEMIC ABSCESS
# ══════════════════════════════════════════
story += [page_header("PAGE 2: PYAEMIC ABSCESS", C["purple"]), SP(5)]
story += [section_bar("DEFINITION", C["purple"]), SP(3),
P("Multiple abscesses developing from <b>infected emboli in pyaemia</b>. Septic emboli = clump of organisms + infected clot (vagitation) formed by breaking up of an infected thrombus."),
SP(5)]
story += [section_bar("CAUSE & PATHOLOGY", C["purple"]), SP(3),
B("Septic emboli lodge in various body parts (subfascial plane, viscera)"),
B("Associated with: acute osteomyelitis, intracranial sinus inflammation, bacterial endocarditis"),
B("<b>Portal pyaemia:</b> infective emboli pass into portal venous system → multiple pyaemic liver abscesses (e.g. acute appendicitis)"),
SP(5)]
story += [section_bar("THREE KEY TERMS", C["purple"]), SP(3)]
terms = [["Term", "Definition", "Treatment"],
["Bacteraemia", "Bacteria circulating in blood. Transient, little clinical significance. Occurs after tooth extraction etc.",
"Usually self-limiting"],
["Septicaemia", "Bacteria + clinical manifestations from toxins: pyrexia, rigors, hypotension, DIC, petechial haemorrhages.",
"IV aminoglycoside + metronidazole + blood transfusion + plasma expanders + hydrocortisone"],
["Toxaemia", "Toxins (chemical/bacterial) circulating in blood, producing toxaemic symptoms.",
"Treat underlying cause"],
]
story += [make_table(terms, [3*cm, 8*cm, 7*cm], C["purple"],
[C["white"], C["light_purple"]]), SP(5)]
story += [section_bar("CLINICAL FEATURES", C["purple"]), SP(3)]
pya_feat = [["Feature", "Detail"],
["Number", "Multiple"],
["Plane", "Subfascial"],
["Nature", "Non-reacting (calor, rubor, dolor ABSENT)"],
["Constitutional", "Tremendous - high fever, rigor, toxaemia"],
["Visceral", "May involve spleen, kidneys; DEATH from brain/heart abscess"],
]
story += [make_table(pya_feat, [4*cm, 14*cm], C["purple"],
[C["white"], C["light_purple"]]), SP(5)]
story += [section_bar("COMPLICATIONS", C["purple"]), SP(3),
B("Death - if abscess in brain or heart"),
B("Septicaemia and multi-organ failure"),
B("Portal pyaemia - multiple liver abscesses"),
B("Visceral involvement - spleen, kidneys"),
SP(5)]
story += [section_bar("TREATMENT", C["purple"]), SP(3),
B("Parenteral antibiotic ASAP - chosen by culture & sensitivity of pus"),
B("Drain superficial abscesses"),
B("<b>Locate and treat the SOURCE of infection</b>"),
SP(4)]
story += [info_box("Key Rule: Find the source of infection and treat it",
C["light_purple"], C["purple"], "key"), SP(4), PageBreak()]
# ══════════════════════════════════════════
# PAGE 3 — COLD ABSCESS
# ══════════════════════════════════════════
story += [page_header("PAGE 3: COLD ABSCESS", C["mid_blue"]), SP(5)]
story += [section_bar("DEFINITION", C["mid_blue"]), SP(3),
P("A <b>non-reactive abscess</b> which does not produce hot and painful features as seen in pyogenic abscess. Almost always a sequel of <b>tubercular infection</b> anywhere in the body - commonly lymph nodes, bone and joint."),
SP(5)]
story += [section_bar("CAUSE & PATHOLOGY", C["mid_blue"]), SP(3),
B("Caseation of lymph nodes forms the cold abscess"),
B("Commonly from TB of lymph nodes, bone (caries spine), joints, ribs"),
B("<b>No acute inflammatory reaction</b> - hence 'cold'"),
B("Secondary infection - a few acute features may then appear"),
B("On palpation: <b>soft and matted nodes</b>"),
SP(5)]
story += [section_bar("COMMON SITES", C["mid_blue"]), SP(3)]
sites = [["#", "Site", "Origin"],
["(i)", "Neck and axilla", "Commonest sites"],
["(ii)", "Loin", "From caries spine (TB of vertebrae)"],
["(iii)", "Side of chest wall", "From tuberculosis of ribs"],
["(iv)", "Back/side of chest wall", "Along intercostal/cutaneous nerve from posterior mediastinal lymph nodes; may travel long distance along anatomical plane"],
["(v)", "Near ends of long bones and joints", "From bone/joint tuberculosis"],
]
story += [make_table(sites, [1.5*cm, 5.5*cm, 11*cm], C["mid_blue"],
[C["white"], C["light_blue"]]), SP(5)]
story += [section_bar("CLINICAL FEATURES", C["mid_blue"]), SP(3)]
cold_feat = [["Feature", "Detail"],
["Heat", "ABSENT"],
["Pain", "ABSENT"],
["Tenderness", "ABSENT"],
["Redness", "ABSENT"],
["Oedema", "Brawny induration and oedema ABSENT"],
["Swelling", "Present - soft, fluctuant, matted nodes"],
["Fever", "Absent (unless secondary infection)"],
["Nature", "Cold, non-reacting"],
]
story += [make_table(cold_feat, [4*cm, 14*cm], C["mid_blue"],
[C["white"], C["light_blue"]]), SP(5)]
story += [section_bar("COMPLICATIONS", C["mid_blue"]), SP(3),
B("<b>Persistent sinus</b> - if incision made directly (most important complication)"),
B("Secondary pyogenic infection - if improperly handled"),
B("Spread along anatomical planes to distant sites"),
B("Chronic discharging sinus"),
SP(5)]
story += [section_bar("TREATMENT", C["mid_blue"]), SP(3),
B("1. Start <b>full antitubercular regime</b> immediately on diagnosis"),
B("2. Aspiration obliquely through <b>NORMAL surrounding skin</b> (NOT most prominent/dependent part)"),
B("3. Aspiration followed by local instillation of <b>I.N.H. solution</b>"),
B("4. If abscess persists - <b>excise affected lymph node group as a whole</b>"),
SP(4)]
story += [
info_box(
"GOLDEN WARNING: NEVER make an incision on a cold abscess for drainage!\n"
"It almost always invites secondary infection and forms a PERSISTENT SINUS.",
C["warn_bg"], C["red"], "warn"
),
SP(4), PageBreak()
]
# ══════════════════════════════════════════
# PAGE 4 — MASTER COMPARISON TABLE
# ══════════════════════════════════════════
story += [page_header("PAGE 4: MASTER COMPARISON TABLE", C["dark_blue"]), SP(5)]
comp_data = [
["Heading", "Pyogenic", "Pyaemic", "Cold"],
["Definition",
"Collection of pus from pyogenic organisms",
"Multiple abscesses from infected emboli in pyaemia",
"Non-reactive abscess from tuberculosis"],
["Cause",
"Pyogenic organisms (direct/lymphatics/blood)",
"Septic emboli from infected thrombus",
"Tubercular infection (lymph nodes, bone, joint)"],
["Pathology",
"Liquefaction of tissue → pus → pyogenic membrane cavity",
"Emboli lodge in subfascial plane → non-reacting suppuration",
"Caseation of lymph nodes; no acute reaction"],
["Number",
"Single",
"Multiple",
"Single or multiple"],
["Site",
"Any tissue plane",
"Subfascial; viscera (liver, spleen, brain)",
"Neck, axilla, loin, chest wall, near joints/bones"],
["Heat & Pain",
"Present (hot, tender, throbbing)",
"ABSENT",
"ABSENT"],
["Fever",
"Moderate",
"Very high with rigors + toxaemia",
"Absent"],
["Fluctuation",
"Present when superficial",
"May be absent",
"Present (soft, matted)"],
["Complications",
"Sinus/fistula, antibioma, chronicity",
"Death (brain/heart), multi-organ failure",
"Persistent sinus if incised, secondary infection"],
["Treatment",
"Drain + C&S + antibiotics",
"Parenteral AB + drain superficial + find source",
"Anti-TB regime + aspiration + INH instillation"],
["Drainage",
"Mandatory (free incision/Hilton's/counter)",
"Superficial only",
"NEVER incise - aspiration only"],
["Special rule",
'"Where there is pus, let it out"',
"Find and treat the source of infection",
"NEVER make incision - causes persistent sinus"],
]
comp_tbl = Table(comp_data, colWidths=[3.5*cm, 4.9*cm, 4.9*cm, 4.9*cm])
comp_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C["dark_blue"]),
("TEXTCOLOR", (0,0), (-1,0), C["white"]),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("BACKGROUND", (0,1), (0,-1), C["light_blue"]),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0,1), (0,-1), C["dark_blue"]),
("ROWBACKGROUNDS",(1,1), (-1,-1), [C["white"], C["light_grey"]]),
("GRID", (0,0), (-1,-1), 0.4, C["mid_grey"]),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("FONTSIZE", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story += [comp_tbl, SP(4), PageBreak()]
# ══════════════════════════════════════════
# PAGE 5 — MEMORY AIDS & KEY LINES
# ══════════════════════════════════════════
story += [page_header("PAGE 5: MEMORY AIDS, KEY LINES & GOLDEN RULES", C["orange"]), SP(5)]
# Memory aid boxes
mem_data = [
[P("<b>PYOGENIC</b>", "bold"),
P("<b>PYAEMIC</b>", "bold"),
P("<b>COLD</b>", "bold")],
[P("ONE abscess\nHOT & PAINFUL\nDRAIN IT", "body"),
P("MANY abscesses\nNO SIGNS\nHIGH FEVER\nFIND THE SOURCE", "body"),
P("TB origin\nCOLD & SOFT\nASPIRATE\nNEVER INCISE", "body")],
]
mem_tbl = Table(mem_data, colWidths=[W/3]*3)
mem_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(0,0), C["green"]),
("BACKGROUND", (1,0),(1,0), C["purple"]),
("BACKGROUND", (2,0),(2,0), C["mid_blue"]),
("TEXTCOLOR", (0,0),(-1,0), C["white"]),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("BACKGROUND", (0,1),(0,1), C["light_green"]),
("BACKGROUND", (1,1),(1,1), C["light_purple"]),
("BACKGROUND", (2,1),(2,1), C["light_blue"]),
("GRID", (0,0),(-1,-1), 0.5, C["mid_grey"]),
("TOPPADDING", (0,0),(-1,-1), 8),
("BOTTOMPADDING", (0,0),(-1,-1), 8),
("LEFTPADDING", (0,0),(-1,-1), 8),
("ALIGN", (0,0),(-1,-1), "CENTER"),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("FONTSIZE", (0,0),(-1,-1), 9),
]))
story += [mem_tbl, SP(8)]
# Golden rules
story += [section_bar("GOLDEN RULES", colors.HexColor("#b7950b")), SP(4)]
rules = [
["#", "Golden Rule"],
["1", '"Where there is pus, let it out" - Drainage is mandatory in pyogenic abscess once localized'],
["2", "Send pus for culture & sensitivity and give proper antibiotic"],
["3", "NEVER incise a cold abscess - always aspirate through normal surrounding skin"],
["4", "Aspirate cold abscess obliquely - NOT through most prominent/dependent part (sinus will form)"],
["5", "Antibioma = continuous antibiotics without drainage → firm lump mimicking carcinoma"],
["6", "In pyaemic abscess - FIND and TREAT the source of infection"],
["7", "Full antitubercular regime MUST be started for cold abscess"],
["8", "Hilton's method - used near nerves/vessels (neck, axilla, groin) to avoid injury"],
["9", "Counter-incision - when prominent part is not dependent; gravity aids drainage"],
["10","Portal pyaemia - infected emboli from portal system → multiple liver abscesses (e.g. appendicitis)"],
]
rules_tbl = Table(rules, colWidths=[1*cm, 17.2*cm])
rules_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), colors.HexColor("#b7950b")),
("TEXTCOLOR", (0,0),(-1,0), C["white"]),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [C["light_gold"], C["white"]]),
("GRID", (0,0),(-1,-1), 0.35, C["mid_grey"]),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 5),
("FONTSIZE", (0,0),(-1,-1), 8.5),
("VALIGN", (0,0),(-1,-1), "TOP"),
("ALIGN", (0,0),(0,-1), "CENTER"),
]))
story += [rules_tbl, SP(6)]
# Three key terms
story += [section_bar("THREE KEY TERMS IN PYAEMIA", C["purple"]), SP(4)]
terms2 = [["Term", "Definition"],
["Bacteraemia", "Bacteria in blood stream - transient, little significance, occurs after tooth extraction"],
["Septicaemia", "Bacteria + clinical signs from toxins (pyrexia, rigors, hypotension, DIC, petechiae)"],
["Toxaemia", "Toxins (chemical/bacterial) circulating in blood producing toxaemic symptoms"],
]
story += [make_table(terms2, [3.5*cm, 14.5*cm], C["purple"],
[C["white"], C["light_purple"]]), SP(4), PageBreak()]
# ══════════════════════════════════════════
# PAGE 6 — DRAINAGE METHODS & POST-OP CARE
# ══════════════════════════════════════════
story += [page_header("PAGE 6: DRAINAGE METHODS, POST-OP CARE & ANTIBIOMA", C["teal"]), SP(5)]
story += [section_bar("DRAINAGE METHODS IN DETAIL", C["teal"]), SP(4)]
drain2 = [["Method", "When Used", "Technique"],
["Free / Liberal\nIncision",
"Standard pyogenic abscess",
"Liberal incision on most prominent + dependent part. Adequate size for drainage. Muscle along fibres. Parallel to nerves/vessels if nearby."],
["Hilton's\nMethod",
"Near nerves/vessels:\nneck, axilla, groin",
"Skin + subcutaneous tissue incised. Artery forceps through deep fascia. Blades opened to extrude pus. Finger breaks all loculi. Exploration mandatory."],
["Counter-\nincision",
"Prominent part NOT\ndependent part",
"First incision at prominent part. Second (counter) incision at most dependent part. Sinus forceps passed between. Gravity aids drainage via lower opening."],
]
story += [make_table(drain2, [3*cm, 4*cm, 11*cm], C["teal"],
[C["white"], C["light_teal"]]), SP(6)]
story += [section_bar("POST-OPERATIVE CARE", C["teal"]), SP(4)]
postop = [["Step", "Action"],
["Drain", "Corrugated rubber drain (extends from incision to counter-incision if used)"],
["Granulation", "If granulation tissue bleeds too much - roller gauze packing for 48 hrs; some surgeons instil local antibiotic"],
["Rest", "Very important post-op measure; expedites healing"],
["Dressing", "Daily dressing with acriflavine lotion + sterile gauze; packing gradually lightened"],
["Antibiotics", "Proper antibiotic by culture & sensitivity started immediately"],
["Vitamins", "Vitamin C - wound healing; Vitamin B complex - when tetracycline used as antibiotic"],
["Follow-up", "Drain/dressing removed after 48 hrs; cavity healed by gradual lightening of packing"],
]
story += [make_table(postop, [3.5*cm, 14.5*cm], C["teal"],
[C["white"], C["light_teal"]]), SP(6)]
story += [section_bar("ANTIBIOMA", C["red"]), SP(4),
B("Occurs when continuous antibiotics are given WITHOUT adequate drainage"),
B("Abscess becomes <b>firm, hard and sterile</b>"),
B("Due to <b>thickness of the wall</b>"),
B("Lump may even be <b>hard</b> - mimics a carcinomatous lump"),
B("Correct management: stop antibiotics, aspirate/drain, culture & sensitivity"),
SP(4)]
story += [info_box(
"ANTIBIOMA = Antibiotics + Abscess without drainage\n"
"Firm, sterile lump that mimics carcinoma",
C["warn_bg"], C["orange"], "warn"), SP(6)]
# Final key line
story += [
HRFlowable(width="100%", thickness=1.5, color=C["dark_blue"]),
SP(5),
info_box(
'"The basic principle of abscess treatment —\n'
'Drain the pus | Send for culture & sensitivity | Give proper antibiotic"',
C["light_blue"], C["dark_blue"], "key"
),
SP(5),
HRFlowable(width="100%", thickness=1.5, color=C["dark_blue"]),
SP(4),
P("Quick Revision Summary | Source: A Concise Textbook of Surgery | Page 78-83", "footer"),
]
doc.build(story)
print(f"PDF saved to: {OUTPUT}")