Makes notes for my surgery revision for neet pg it should contain all important information to complete my full surgery revision in 2 days plus I will be able to do all surgery question with easygoing like surgery on my finger tip make a pdf it should also have pyq frequently asked question important topic marked etc
NEET PG surgery most frequently asked topics PYQ high yield 2024 2025
https://www.diginerve.com/blogs/surgery-rapid-revision-neet-…
mkdir -p /home/daytona/workspace/surgery-neet-pg && ls /home/daytona/workspace/
Show the pdf
Show the pdf
mkdir -p /home/daytona/workspace/surgery-neet-pg && python3 -c "import reportlab…
~/surgery-neet-pg/generate_surgery_pdf.py
#!/usr/bin/env python3
"""NEET PG Surgery Rapid Revision PDF Generator"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import mm, cm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import ListFlowable, ListItem
OUTPUT = "/home/daytona/workspace/surgery-neet-pg/NEET_PG_Surgery_Revision.pdf"
# ── Colour palette ──────────────────────────────────────────────────────────
C_NAVY = colors.HexColor("#1a2e5a")
C_TEAL = colors.HexColor("#0d7377")
C_ORANGE = colors.HexColor("#e07b3a")
C_RED = colors.HexColor("#c0392b")
C_GREEN = colors.HexColor("#1e8449")
C_YELLOW = colors.HexColor("#f4d03f")
C_LIGHT = colors.HexColor("#eaf4fb")
C_LGREEN = colors.HexColor("#eafaf1")
C_LRED = colors.HexColor("#fdf2f2")
C_LYELLOW= colors.HexColor("#fefde7")
C_LGREY = colors.HexColor("#f8f9fa")
C_WHITE = colors.white
# ── Styles ───────────────────────────────────────────────────────────────────
base = getSampleStyleSheet()
def S(name, parent="Normal", **kw):
s = ParagraphStyle(name, parent=base[parent], **kw)
return s
COVER_TITLE = S("CoverTitle", fontSize=32, textColor=C_WHITE,
alignment=TA_CENTER, spaceAfter=6, fontName="Helvetica-Bold")
COVER_SUB = S("CoverSub", fontSize=16, textColor=C_YELLOW,
alignment=TA_CENTER, spaceAfter=4, fontName="Helvetica-Bold")
COVER_INFO = S("CoverInfo", fontSize=11, textColor=C_WHITE,
alignment=TA_CENTER, spaceAfter=3)
CH_TITLE = S("ChTitle", fontSize=20, textColor=C_WHITE,
fontName="Helvetica-Bold", alignment=TA_LEFT,
spaceAfter=4, spaceBefore=2)
CH_SUB = S("ChSub", fontSize=13, textColor=C_TEAL,
fontName="Helvetica-Bold", spaceBefore=10, spaceAfter=3)
CH_SUB2 = S("ChSub2", fontSize=11, textColor=C_NAVY,
fontName="Helvetica-Bold", spaceBefore=6, spaceAfter=2)
BODY = S("Body", fontSize=9.5, leading=14, spaceAfter=3, alignment=TA_JUSTIFY)
BULLET = S("Bullet", fontSize=9.5, leading=14, leftIndent=14, spaceAfter=2,
bulletIndent=4)
PYQ_S = S("PYQ", fontSize=9, textColor=C_NAVY, leading=13,
leftIndent=8, fontName="Helvetica-Oblique")
IMP_S = S("ImpBox", fontSize=9, textColor=C_RED, leading=13,
fontName="Helvetica-Bold", leftIndent=8)
TIP_S = S("Tip", fontSize=9, textColor=C_GREEN, leading=13,
leftIndent=8, fontName="Helvetica-Bold")
BOLD_S = S("BoldS", fontSize=9.5, fontName="Helvetica-Bold", leading=14)
TOC_S = S("TOC", fontSize=11, leading=18, leftIndent=10)
def header_table(text, bg=C_NAVY, fg=C_WHITE, fontsize=16):
"""Full-width coloured header band."""
st = ParagraphStyle("ht", fontSize=fontsize, textColor=fg,
fontName="Helvetica-Bold", alignment=TA_LEFT, leading=fontsize+4)
t = Table([[Paragraph(text, st)]], colWidths=[170*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 6),
]))
return t
def box_table(rows_data, bg=C_LIGHT, border_color=C_TEAL, col_widths=None):
"""Simple info box."""
if col_widths is None:
col_widths = [170*mm]
t = Table(rows_data, colWidths=col_widths)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 1.5, border_color),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
return t
def pyq_box(questions):
"""Orange-bordered PYQ box."""
rows = []
rows.append([Paragraph("★ PYQ / FREQUENTLY ASKED", S("ph", fontSize=9,
fontName="Helvetica-Bold", textColor=C_ORANGE))])
for q in questions:
rows.append([Paragraph("• " + q, PYQ_S)])
t = Table(rows, colWidths=[170*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_LYELLOW),
("BOX", (0,0), (-1,-1), 2, C_ORANGE),
("LINEBELOW", (0,0), (0,0), 0.5, C_ORANGE),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
]))
return t
def imp_box(points):
"""Red high-importance box."""
rows = [[Paragraph("🔴 HIGH YIELD / REMEMBER", S("rh", fontSize=9,
fontName="Helvetica-Bold", textColor=C_RED))]]
for p in points:
rows.append([Paragraph("► " + p, IMP_S)])
t = Table(rows, colWidths=[170*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_LRED),
("BOX", (0,0), (-1,-1), 2, C_RED),
("LINEBELOW", (0,0), (0,0), 0.5, C_RED),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
]))
return t
def tip_box(points):
"""Green mnemonic/tip box."""
rows = [[Paragraph("💡 MNEMONIC / TIP", S("gh", fontSize=9,
fontName="Helvetica-Bold", textColor=C_GREEN))]]
for p in points:
rows.append([Paragraph("✓ " + p, TIP_S)])
t = Table(rows, colWidths=[170*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_LGREEN),
("BOX", (0,0), (-1,-1), 2, C_GREEN),
("LINEBELOW", (0,0), (0,0), 0.5, C_GREEN),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
]))
return t
def two_col_table(left_data, right_data, header_left="", header_right=""):
"""Two-column comparison table."""
col_w = [83*mm, 83*mm]
rows = []
if header_left or header_right:
hs = S("th", fontSize=9, fontName="Helvetica-Bold",
textColor=C_WHITE, alignment=TA_CENTER)
rows.append([Paragraph(header_left, hs), Paragraph(header_right, hs)])
max_len = max(len(left_data), len(right_data))
for i in range(max_len):
l = Paragraph("• " + left_data[i], BULLET) if i < len(left_data) else Paragraph("", BODY)
r = Paragraph("• " + right_data[i], BULLET) if i < len(right_data) else Paragraph("", BODY)
rows.append([l, r])
style = [
("BACKGROUND", (0,0), (-1,-1), C_LGREY),
("BOX", (0,0), (-1,-1), 1, C_TEAL),
("INNERGRID", (0,0), (-1,-1), 0.5, colors.HexColor("#b0bec5")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]
if header_left or header_right:
style += [("BACKGROUND", (0,0), (1,0), C_NAVY),
("FONTNAME", (0,0), (1,0), "Helvetica-Bold")]
t = Table(rows, colWidths=col_w)
t.setStyle(TableStyle(style))
return t
def data_table(header_row, data_rows, col_widths=None):
"""Generic data table with header."""
if col_widths is None:
n = len(header_row)
col_widths = [170*mm/n]*n
hs = S("dth", fontSize=9, fontName="Helvetica-Bold", textColor=C_WHITE, alignment=TA_CENTER)
rows = [[Paragraph(h, hs) for h in header_row]]
bs = S("dtr", fontSize=9, leading=13)
for row in data_rows:
rows.append([Paragraph(str(c), bs) for c in row])
style = [
("BACKGROUND", (0,0), (-1,0), C_NAVY),
("BACKGROUND", (0,1), (-1,-1), C_LGREY),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C_WHITE, C_LGREY]),
("BOX", (0,0), (-1,-1), 1, C_NAVY),
("INNERGRID", (0,0), (-1,-1), 0.5, colors.HexColor("#b0bec5")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]
t = Table(rows, colWidths=col_widths)
t.setStyle(TableStyle(style))
return t
sp = lambda h=6: Spacer(1, h)
hr = lambda: HRFlowable(width="100%", thickness=0.5, color=C_TEAL, spaceAfter=4, spaceBefore=4)
# ════════════════════════════════════════════════════════════════════════════
# CONTENT BUILDER
# ════════════════════════════════════════════════════════════════════════════
def build_story():
story = []
# ── COVER PAGE ────────────────────────────────────────────────────────
cover_bg = Table(
[[Paragraph("NEET PG", COVER_TITLE)],
[Paragraph("SURGERY", S("cs2", fontSize=44, textColor=C_YELLOW,
fontName="Helvetica-Bold", alignment=TA_CENTER))],
[Paragraph("RAPID REVISION NOTES", COVER_SUB)],
[sp(8)],
[Paragraph("2-Day Complete Surgery Revision", COVER_INFO)],
[Paragraph("High-Yield • PYQs • Mnemonics • Clinical Algorithms", COVER_INFO)],
[sp(4)],
[Paragraph("Topics: General Surgery • Trauma • GI • Hepatobiliary • Breast • Thyroid •", COVER_INFO)],
[Paragraph("Hernia • Urology • Burns • Vascular • Paediatric Surgery • Oncology", COVER_INFO)],
[sp(20)],
[Paragraph("Prepared for NEET PG / INI-CET / FMGE | July 2026", COVER_INFO)],
],
colWidths=[190*mm]
)
cover_bg.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_NAVY),
("TOPPADDING", (0,0), (-1,-1), 12),
("BOTTOMPADDING", (0,0), (-1,-1), 12),
("LEFTPADDING", (0,0), (-1,-1), 20),
("RIGHTPADDING", (0,0), (-1,-1), 20),
]))
story.append(cover_bg)
story.append(PageBreak())
# ── TABLE OF CONTENTS ─────────────────────────────────────────────────
story.append(header_table(" TABLE OF CONTENTS", C_TEAL))
story.append(sp(6))
toc_items = [
("1", "General Surgery Principles", "Wound Healing • Shock • Fluids • Sterilisation • Sutures"),
("2", "Trauma & Emergency Surgery", "ATLS • Burns • Head Injury • Abdominal Trauma"),
("3", "Gastrointestinal Surgery", "Appendicitis • Peptic Ulcer • Intestinal Obstruction • GI Cancers"),
("4", "Hepatobiliary & Pancreas", "Gallstones • Pancreatitis • Liver Abscess • Jaundice"),
("5", "Breast Surgery", "Breast Lumps • Carcinoma • Staging • Operations"),
("6", "Thyroid & Parathyroid", "Goitre • Carcinoma • Hyperthyroidism • Parathyroid"),
("7", "Hernia", "Inguinal • Femoral • Special Hernias • Complications"),
("8", "Urology", "Renal Stones • BPH • Bladder CA • Testicular Torsion"),
("9", "Vascular Surgery", "AAA • DVT • Varicose Veins • Peripheral Vascular Disease"),
("10","Paediatric Surgery", "Pyloric Stenosis • Intussusception • Hirschsprung • CDH"),
("11","Surgical Oncology", "Staging • TNM • Tumour Markers • Biopsy Types"),
("12","Surgical Instruments & Procedures", "Key Instruments • Drains • Anastomosis • Laparoscopy"),
]
for num, title, subtopics in toc_items:
row = [[Paragraph(f"<b>{num}.</b> <b>{title}</b>", TOC_S),
Paragraph(f"<i>{subtopics}</i>", S("ts", fontSize=9, textColor=colors.grey, leading=14))]]
t = Table(row, colWidths=[65*mm, 105*mm])
t.setStyle(TableStyle([
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 4),
("LINEBELOW", (0,0), (-1,-1), 0.3, colors.HexColor("#cfd8dc")),
]))
story.append(t)
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════
# CHAPTER 1 - GENERAL SURGERY PRINCIPLES
# ════════════════════════════════════════════════════════════════════════
story.append(header_table(" CHAPTER 1 - GENERAL SURGERY PRINCIPLES"))
story.append(sp(8))
story.append(Paragraph("1.1 WOUND HEALING", CH_SUB))
story.append(data_table(
["Type", "Definition", "Examples", "Healing Time"],
[
["Primary (1st) Intention", "Clean wound closed within 6-8 hrs; edges approximated", "Surgical incisions, sutured lacerations", "7-10 days"],
["Secondary (2nd) Intention", "Wound left open; heals by granulation, contraction, epithelialisation", "Infected wounds, ulcers, abscesses", "Weeks-months"],
["Tertiary (3rd) Intention\n(Delayed 1st)", "Wound initially left open; closed later after infection controlled", "Contaminated wounds", "Variable"],
],
col_widths=[38*mm, 48*mm, 52*mm, 30*mm]
))
story.append(sp(6))
story.append(Paragraph("Phases of Wound Healing", CH_SUB2))
story.append(data_table(
["Phase", "Timing", "Key Events", "Cells Involved"],
[
["Haemostasis", "Immediate (0-hrs)", "Vasoconstriction, platelet plug, clot formation, fibrin mesh", "Platelets"],
["Inflammation", "Day 1-4", "Vasodilation, WBC migration, phagocytosis, debridement", "Neutrophils (1st 48h), then Macrophages"],
["Proliferation", "Day 4 - 3 weeks", "Fibroblast migration, collagen synthesis (Type III first), angiogenesis, granulation tissue", "Fibroblasts, Endothelial cells"],
["Remodelling/Maturation", "3 wks - 2 yrs", "Type III collagen replaced by Type I, wound contracts, scar matures. Max tensile strength 80% at 3 months", "Myofibroblasts"],
],
col_widths=[36*mm, 28*mm, 72*mm, 34*mm]
))
story.append(sp(4))
story.append(imp_box([
"Collagen TYPE III produced first in granulation tissue -> replaced by Type I in remodelling",
"Max wound tensile strength = 80% of normal (never 100%) - reached at ~3 months",
"MACROPHAGES are the most important cells for wound healing overall",
"Neutrophils dominate in first 48 hours; Macrophages take over after 48-72 hours",
"Vitamin C deficiency -> poor collagen synthesis -> wound dehiscence (scurvy)",
"Zinc deficiency -> impaired wound healing; Zinc is cofactor for DNA polymerase",
]))
story.append(sp(4))
story.append(pyq_box([
"Q: Which type of collagen is first synthesised during wound healing? Ans: Type III (later replaced by Type I)",
"Q: Maximum tensile strength of a healed wound is? Ans: 80% of original tissue strength",
"Q: Most important cell in wound healing? Ans: Macrophage",
"Q: Which vitamin is essential for collagen cross-linking in wound healing? Ans: Vitamin C (ascorbic acid)",
"Q: Wound contraction is mediated by? Ans: Myofibroblasts",
]))
story.append(sp(6))
story.append(Paragraph("1.2 SHOCK", CH_SUB))
story.append(data_table(
["Class", "Blood Loss", "% Blood Vol", "HR", "BP", "RR", "Urine Output", "Mental Status"],
[
["Class I", "<750 mL", "<15%", "<100", "Normal", "14-20", ">30 mL/hr", "Normal/anxious"],
["Class II", "750-1500", "15-30%", "100-120","Normal","20-30", "20-30 mL/hr","Anxious"],
["Class III", "1500-2000", "30-40%", "120-140","Decreased","30-40","5-15 mL/hr","Confused"],
["Class IV", ">2000 mL", ">40%", ">140", "Very low"," >35", "<5 mL/hr", "Lethargic/comatose"],
],
col_widths=[18*mm,22*mm,18*mm,18*mm,22*mm,16*mm,22*mm,32*mm]
))
story.append(sp(4))
story.append(tip_box([
"MNEMONIC for Shock Types: H-D-N-S = Hypovolaemic, Distributive (Septic/Anaphylactic/Neurogenic), Neurogenic, Spinal",
"Obstructive shock: Tension pneumothorax, cardiac tamponade, massive PE",
"Neurogenic shock: Bradycardia + Hypotension (unlike other shock types with tachycardia)",
"First line for hypovolaemic shock: IV crystalloid (Ringer's Lactate) - 2 large bore cannulae",
]))
story.append(sp(4))
story.append(pyq_box([
"Q: Neurogenic shock is characterised by? Ans: Bradycardia + hypotension (warm peripheries)",
"Q: Best initial fluid for haemorrhagic shock? Ans: Ringer's Lactate (Hartmann's solution)",
"Q: Urine output of <0.5 mL/kg/hr indicates? Ans: Inadequate tissue perfusion / shock",
"Q: Beck's triad in cardiac tamponade? Ans: Hypotension, JVD (raised JVP), muffled heart sounds",
]))
story.append(PageBreak())
story.append(Paragraph("1.3 SURGICAL SITE INFECTION (SSI) & WOUND CLASSIFICATION", CH_SUB))
story.append(data_table(
["Wound Class", "Definition", "Infection Risk"],
[
["Class I - Clean", "Elective, no GI/GU/Respiratory tract entered, no inflammation", "1-5%"],
["Class II - Clean-Contaminated", "GI/GU/Respiratory entered under controlled conditions", "5-15%"],
["Class III - Contaminated", "Open fresh traumatic wound, gross spillage from GI tract", "15-30%"],
["Class IV - Dirty/Infected", "Old traumatic wound, perforated viscus, clinical infection present", ">30%"],
],
col_widths=[52*mm, 88*mm, 28*mm]
))
story.append(sp(4))
story.append(pyq_box([
"Q: Appendicectomy for non-perforated appendicitis = which wound class? Ans: Class II (Clean-Contaminated)",
"Q: Elective cholecystectomy wound class? Ans: Class II",
"Q: Prophylactic antibiotic for clean surgery? Ans: Not required routinely (Class I)",
"Q: Most common organism in SSI? Ans: Staphylococcus aureus",
]))
story.append(Paragraph("1.4 SUTURES & SURGICAL MATERIALS", CH_SUB))
story.append(data_table(
["Suture", "Type", "Uses", "Absorption"],
[
["Catgut (Plain)", "Absorbable, natural", "Mucosa, ligation", "10-14 days"],
["Chromic Catgut", "Absorbable, natural", "GI, GU tracts", "21-28 days"],
["Vicryl (Polyglactin)", "Absorbable, synthetic","Fascial closure, subcutaneous","56-70 days"],
["PDS (Polydioxanone)","Absorbable, synthetic", "Abdominal wall, tendon repair", "180+ days"],
["Prolene (Polypropylene)","Non-absorbable, synthetic","Vascular anastomosis, hernia","Permanent"],
["Nylon (Ethilon)", "Non-absorbable, synthetic","Skin closure, tendons", "Permanent"],
["Silk", "Non-absorbable, natural","Ligation, skin", "Permanent (but degrades)"],
],
col_widths=[42*mm, 40*mm, 55*mm, 31*mm]
))
story.append(sp(4))
story.append(imp_box([
"Strongest suture per diameter: Prolene > Nylon > Silk",
"Best suture for vascular anastomosis: Prolene (monofilament, non-thrombogenic)",
"Absorbable suture NOT to use in infected field: Catgut (rapid degradation)",
"DELAYED ABSORBABLE sutures (PDS, Maxon) preferred for abdominal wall closure",
]))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════
# CHAPTER 2 - TRAUMA & BURNS
# ════════════════════════════════════════════════════════════════════════
story.append(header_table(" CHAPTER 2 - TRAUMA & EMERGENCY SURGERY"))
story.append(sp(8))
story.append(Paragraph("2.1 BURNS", CH_SUB))
story.append(Paragraph("Rule of Nines (Wallace's Rule) - Adult", CH_SUB2))
story.append(data_table(
["Body Region", "% TBSA", "Notes"],
[
["Head + Neck", "9%", "Head 7% + Neck 2%"],
["Each Upper Limb","9% each (18% total)", "Arm 4% + Forearm 3% + Hand 2%"],
["Anterior Trunk", "18%", "Chest 9% + Abdomen 9%"],
["Posterior Trunk","18%", "Upper back 9% + Lower back 9%"],
["Each Lower Limb","18% each (36% total)","Thigh 9% + Leg 6% + Foot 3%"],
["Perineum/Genitalia","1%",""],
["TOTAL", "100%", ""],
],
col_widths=[55*mm, 60*mm, 55*mm]
))
story.append(sp(4))
story.append(tip_box([
"Lund & Browder Chart: MORE ACCURATE than Rule of Nines, especially in CHILDREN",
"Palmar method: Patient's palm (fingers included) = 1% TBSA - useful for patchy burns",
"CHILDREN: Head proportionally larger (18% at birth) -> Berkow formula / Lund-Browder",
]))
story.append(sp(4))
story.append(Paragraph("Burns Depth Classification", CH_SUB2))
story.append(data_table(
["Degree", "Depth", "Appearance", "Sensation", "Healing", "Treatment"],
[
["1st Degree\n(Superficial)", "Epidermis only", "Red, dry, no blisters", "Painful", "3-5 days", "Conservative"],
["2nd Degree Superficial\n(Partial thickness)", "Epidermis + Superficial dermis", "Blisters, moist, pink", "Very painful", "14-21 days", "Dressings"],
["2nd Degree Deep\n(Deep partial thickness)", "Epidermis + Deep dermis", "Pale/mottled, less moist", "Reduced pain", "21-35 days, may need graft", "Grafting"],
["3rd Degree\n(Full thickness)", "All skin layers", "White/charred/leathery", "Painless", "No self-healing", "Excision + Grafting"],
["4th Degree", "Skin + subcutaneous tissue, muscle, bone", "Charred, eschar", "Painless", "Amputation/major reconstruction", "Surgical"],
],
col_widths=[30*mm, 32*mm, 32*mm, 24*mm, 28*mm, 24*mm]
))
story.append(sp(4))
story.append(Paragraph("Fluid Resuscitation in Burns", CH_SUB2))
story.append(box_table([
[Paragraph("<b>Parkland Formula (Most used in India/NEET PG):</b>", BOLD_S)],
[Paragraph("Total fluid in 24 hrs = 4 mL x Weight (kg) x % TBSA burn (2nd + 3rd degree only)", BODY)],
[Paragraph("• Give HALF in first 8 hours (from time of burn, not from hospital arrival)", BODY)],
[Paragraph("• Give REMAINING HALF over next 16 hours", BODY)],
[Paragraph("• Fluid: Ringer's Lactate (Hartmann's solution)", BODY)],
[Paragraph("<b>Muir & Barclay Formula:</b> (UK/older)", BOLD_S)],
[Paragraph("= Weight (kg) x % TBSA / 2 = per period (6 periods: 4h, 4h, 4h, 6h, 6h, 12h)", BODY)],
[Paragraph("• Fluid: Colloid (Human Albumin Solution / FFP)", BODY)],
]))
story.append(sp(4))
story.append(imp_box([
"Parkland formula - fluid: Ringer's Lactate; Muir-Barclay formula - fluid: Colloid",
"Children: Add maintenance fluid (dextrose saline) to Parkland formula",
"Target urine output: Adult = 0.5-1 mL/kg/hr; Children = 1 mL/kg/hr",
"Burns >15% TBSA in adults / >10% in children = MAJOR BURN requiring IV resuscitation",
"Smoke inhalation injury = strong indication for early intubation",
"Circumferential full-thickness burns -> ESCHAROTOMY to prevent compartment syndrome",
]))
story.append(sp(4))
story.append(pyq_box([
"Q: Parkland formula for burn resuscitation? Ans: 4 mL x kg x % TBSA; half in first 8 hrs, RL solution",
"Q: Rule of nines - TBSA of lower limb in adult? Ans: 18% each (9% thigh + 9% leg/foot)",
"Q: Most accurate method for calculating burns in children? Ans: Lund and Browder Chart",
"Q: Which type of burn is PAINLESS? Ans: Full thickness (3rd degree) - nerve endings destroyed",
"Q: Earliest sign of adequate fluid resuscitation in burns? Ans: Adequate urine output (0.5 mL/kg/hr)",
"Q: Escharotomy is done for? Ans: Circumferential full-thickness burns - to prevent compartment syndrome",
]))
story.append(PageBreak())
story.append(Paragraph("2.2 ATLS PRIMARY SURVEY (ABCDE)", CH_SUB))
story.append(data_table(
["Step", "Stands For", "Action", "Key Points"],
[
["A", "Airway + C-spine", "Clear airway, chin lift/jaw thrust, C-spine immobilisation", "Assume C-spine injury in all blunt trauma until proven otherwise"],
["B", "Breathing + Ventilation", "Look-listen-feel, O2, treat pneumothorax", "Life threats: Tension PTX, Open PTX, Haemothorax, Flail chest"],
["C", "Circulation + Haemorrhage", "2 large bore IVs, fluid resuscitation, control external bleeding", "FAST exam, pelvic binder if pelvic fracture"],
["D", "Disability (Neuro)", "GCS, pupils, glucose, AVPU scale", "GCS <8 -> intubate; unilateral dilated pupil = herniation"],
["E", "Exposure + Environment", "Undress patient, prevent hypothermia", "Log roll, check back and perineum"],
],
col_widths=[12*mm, 38*mm, 62*mm, 58*mm]
))
story.append(sp(4))
story.append(Paragraph("2.3 TENSION PNEUMOTHORAX vs CARDIAC TAMPONADE", CH_SUB))
story.append(two_col_table(
["Tracheal deviation AWAY from affected side",
"Absent breath sounds on affected side",
"Hypotension + tachycardia",
"JVP raised",
"Treatment: Immediate needle decompression (2nd ICS MCL), then chest drain"],
["Tracheal deviation - midline (no deviation)",
"Heart sounds muffled",
"Hypotension + tachycardia",
"JVP raised (Beck's triad)",
"Treatment: Pericardiocentesis (emergent), pericardial window"],
"Tension Pneumothorax", "Cardiac Tamponade"
))
story.append(sp(4))
story.append(pyq_box([
"Q: Triad of cardiac tamponade (Beck's triad)? Ans: Hypotension, raised JVP, muffled heart sounds",
"Q: Kussmaul's sign is seen in? Ans: Cardiac tamponade (JVP rises on inspiration)",
"Q: Treatment of tension pneumothorax? Ans: Immediate needle decompression - 2nd ICS midclavicular line",
"Q: Most common cause of haemothorax in trauma? Ans: Intercostal vessel injury",
"Q: Flail chest definition? Ans: 3+ consecutive ribs fractured at 2+ sites each - paradoxical movement",
]))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════
# CHAPTER 3 - GI SURGERY
# ════════════════════════════════════════════════════════════════════════
story.append(header_table(" CHAPTER 3 - GASTROINTESTINAL SURGERY"))
story.append(sp(8))
story.append(Paragraph("3.1 ACUTE APPENDICITIS", CH_SUB))
story.append(box_table([
[Paragraph("<b>Classic Presentation:</b> Central colicky pain -> shifting to RIF (McBurney's point) + fever + nausea/vomiting", BODY)],
[Paragraph("<b>McBurney's Point:</b> Junction of lateral 1/3 and medial 2/3 of line joining ASIS to umbilicus", BODY)],
[Paragraph("<b>Rovsing's Sign:</b> Pressure on LIF causes pain in RIF (peritoneal irritation)", BODY)],
[Paragraph("<b>Psoas Sign:</b> Pain on extending right hip (retrocaecal appendix)", BODY)],
[Paragraph("<b>Obturator Sign:</b> Pain on internal rotation of flexed right hip (pelvic appendix)", BODY)],
], bg=C_LIGHT))
story.append(sp(4))
story.append(Paragraph("Alvarado Score (MANTRELS)", CH_SUB2))
story.append(data_table(
["Criterion", "Score"],
[
["Migration of pain to RIF", "1"],
["Anorexia", "1"],
["Nausea/Vomiting", "1"],
["Tenderness in RIF", "2"],
["Rebound tenderness", "1"],
["Elevated temperature (>37.3°C)", "1"],
["Leukocytosis (WBC >10,000)", "2"],
["Shift to left (neutrophilia)", "1"],
["TOTAL", "10"],
],
col_widths=[130*mm, 38*mm]
))
story.append(sp(4))
story.append(tip_box([
"MANTRELS mnemonic: Migration, Anorexia, Nausea, Tenderness RIF, Rebound, Elevated Temp, Leukocytosis, Shift left",
"Score 7-10 = High probability -> Surgery; Score 5-6 = Observe; Score <5 = Low probability",
"Score of 2 each for: RIF Tenderness + Leukocytosis (highest weighted criteria)",
]))
story.append(sp(4))
story.append(imp_box([
"Best investigation for appendicitis: CT scan (most accurate 94-98% sensitivity)",
"Preferred in children/pregnancy: Ultrasound first (no radiation), then MRI",
"Position of appendix most common: Retrocaecal (65%)",
"Pelvic appendix -> Dysuria, frequency (mimics UTI)",
"Perforation risk increases dramatically after 24-36 hours",
"Laparoscopic appendicectomy = gold standard (less infection, faster recovery)",
]))
story.append(sp(4))
story.append(pyq_box([
"Q: Most common position of appendix? Ans: Retrocaecal (65%)",
"Q: Best investigation for appendicitis? Ans: CT scan (most accurate); USG first in children/pregnant",
"Q: Alvarado score of 7-10 indicates? Ans: High probability appendicitis - proceed to surgery",
"Q: Rovsing's sign is? Ans: Pressure on LIF causes pain in RIF",
"Q: Appendicectomy incision? Ans: Grid-iron incision (Lanz incision for cosmesis)",
]))
story.append(sp(6))
story.append(Paragraph("3.2 INTESTINAL OBSTRUCTION", CH_SUB))
story.append(two_col_table(
["Most common cause adult small bowel: Adhesions (post-op)",
"Most common cause large bowel: Carcinoma",
"Features: Colicky pain, vomiting, distension, constipation",
"High obstruction: Vomiting early, distension mild",
"Low obstruction: Vomiting late/feculent, distension marked",
"X-ray: Dilated loops, air-fluid levels, step-ladder pattern",
"Small bowel: Valvulae conniventes (cross whole width)",
"Large bowel: Haustra (partial width)",
"Treatment: NBM, NGT, IV fluids, then surgery if needed"],
["Strangulation signs: Continuous pain (not colicky), fever, peritonism",
"Closed loop obstruction: Most dangerous - rapid vascular compromise",
"Volvulus: Sigmoid (most common) or Caecal",
"Sigmoid volvulus X-ray: Coffee bean/bent inner tube sign",
"Caecal volvulus X-ray: Kidney bean sign",
"Intussusception: Children 6mo-2yr, currant jelly stools",
"Richter's hernia: Knuckle of bowel - no complete obstruction",
"Gallstone ileus: Air in biliary tree (pneumobilia)",
"Ogilvie's syndrome: Pseudo-obstruction of colon (no mechanical cause)"],
"Mechanical Obstruction Features", "Important Subtypes"
))
story.append(sp(4))
story.append(pyq_box([
"Q: Most common cause of small bowel obstruction in adults? Ans: Adhesions (post-operative)",
"Q: Most common cause of large bowel obstruction? Ans: Carcinoma of colon",
"Q: Currant jelly stools in a child suggests? Ans: Intussusception",
"Q: Coffee bean sign on X-ray? Ans: Sigmoid volvulus",
"Q: Gallstone ileus - pathognomonic finding on X-ray? Ans: Air in biliary tree (pneumobilia / Rigler's triad)",
"Q: Intussusception treatment in children? Ans: Air/hydrostatic enema reduction (first line); Surgery if failed/peritonitis",
]))
story.append(PageBreak())
story.append(Paragraph("3.3 PEPTIC ULCER DISEASE", CH_SUB))
story.append(two_col_table(
["DU: Pain relieved by food (Hunger pain)",
"DU: Hypersecretory state",
"DU: More common (4x than GU)",
"DU: Posterior DU -> bleeds from Gastroduodenal artery",
"DU: Anterior DU -> perforates (peritonitis)",
"DU: H. pylori in 95-100%",
"DU: Rarely malignant"],
["GU: Pain WORSENED by food (Fear of food)",
"GU: Normal/hypo secretory state",
"GU: Less common, but ALWAYS exclude malignancy",
"GU: Posterior GU -> bleeds from Left Gastric artery",
"GU: Lesser curve most common site",
"GU: H. pylori in 70-80%",
"GU: 5% risk of malignancy - always biopsy"],
"Duodenal Ulcer (DU)", "Gastric Ulcer (GU)"
))
story.append(sp(4))
story.append(pyq_box([
"Q: Artery eroded in bleeding posterior DU? Ans: Gastroduodenal artery",
"Q: Artery eroded in bleeding lesser curve GU? Ans: Left gastric artery",
"Q: Most common complication of peptic ulcer? Ans: Bleeding (haemorrhage)",
"Q: Most common site of perforation in PUD? Ans: Anterior wall of first part of duodenum",
"Q: H. pylori eradication regimen (Triple therapy)? Ans: PPI + Amoxicillin + Clarithromycin x 7-14 days",
]))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════
# CHAPTER 4 - HEPATOBILIARY
# ════════════════════════════════════════════════════════════════════════
story.append(header_table(" CHAPTER 4 - HEPATOBILIARY & PANCREATIC SURGERY"))
story.append(sp(8))
story.append(Paragraph("4.1 GALLSTONES (CHOLELITHIASIS)", CH_SUB))
story.append(data_table(
["Type", "Composition", "Association", "X-ray Visible?"],
[
["Cholesterol stones", "Cholesterol >50%", "Obesity, OCP, Pregnancy, Female, 40yr (5 F's)", "No (80% radiolucent)"],
["Pigment - Black stones", "Calcium bilirubinate", "Haemolytic anaemia, Cirrhosis", "Yes (radio-opaque)"],
["Pigment - Brown stones", "Calcium bilirubinate + fatty acids", "Bacterial/parasitic infection, bile stasis", "Partially"],
["Mixed stones", "Cholesterol + Pigment", "Most common type (80%)", "Variable"],
],
col_widths=[40*mm, 42*mm, 56*mm, 32*mm]
))
story.append(sp(4))
story.append(tip_box([
"5 F's of cholesterol gallstones: Fat, Female, Fertile, Forty, Fair (Caucasian)",
"Charcot's triad of cholangitis: Fever + Jaundice + RUQ Pain",
"Reynold's pentad: Charcot's triad + Hypotension + Confusion (severe cholangitis/sepsis)",
"Courvoisier's Law: Palpable GB + painless jaundice = NOT gallstones (= periampullary malignancy)",
"Murphy's sign: Cessation of inspiration on deep palpation of RUQ (acute cholecystitis)",
]))
story.append(sp(4))
story.append(pyq_box([
"Q: Charcot's triad of cholangitis? Ans: Fever, Jaundice, RUQ Pain",
"Q: Courvoisier's law? Ans: Palpable GB + painless jaundice usually NOT due to stones (implies malignancy)",
"Q: Best investigation for gallstones? Ans: Ultrasound (USG) - gold standard",
"Q: Treatment of choice for symptomatic gallstones? Ans: Laparoscopic cholecystectomy",
"Q: ERCP is done for? Ans: Common bile duct stones (CBD stones), before/after cholecystectomy",
"Q: Mirizzi syndrome? Ans: External compression of CHD by stone in cystic duct/Hartmann's pouch -> jaundice",
]))
story.append(sp(6))
story.append(Paragraph("4.2 ACUTE PANCREATITIS", CH_SUB))
story.append(box_table([
[Paragraph("<b>Common causes (GET SMASHED):</b> Gallstones (40%), Ethanol (35%), Trauma, Steroids, Mumps/Autoimmune, Scorpion/Spider venom, Hyperlipidaemia/Hypercalcaemia, ERCP/Emboli, Drugs (azathioprine, thiazides)", BODY)],
], bg=C_LYELLOW, border_color=C_ORANGE))
story.append(sp(4))
story.append(Paragraph("Ranson's Criteria (prognostic scoring)", CH_SUB2))
story.append(data_table(
["At Admission", "At 48 Hours"],
[
["Age >55 years", "Haematocrit fall >10%"],
["WBC >16,000/mm3", "BUN rise >5 mg/dL"],
["Blood glucose >200 mg/dL", "Serum Ca <8 mg/dL"],
["LDH >350 IU/L", "PaO2 <60 mmHg"],
["AST >250 IU/L", "Base deficit >4 mEq/L"],
["", "Fluid sequestration >6 L"],
],
col_widths=[85*mm, 85*mm]
))
story.append(sp(4))
story.append(imp_box([
"Ranson score: <3 = mild; 3-5 = moderate; >5 = severe (>6 = near 100% mortality)",
"Best imaging for pancreatitis complications: CT scan (CECT abdomen)",
"CT Severity Index (Balthazar score): Grade A-E based on CT findings",
"Cullen's sign: Periumbilical bruising (haemorrhagic pancreatitis - retroperitoneal bleed)",
"Grey-Turner's sign: Flank bruising (same significance)",
"Amylase vs Lipase: Lipase is MORE SPECIFIC for acute pancreatitis",
"Pancreatic necrosis + infection -> Infected necrotising pancreatitis -> Surgery / Drainage",
]))
story.append(sp(4))
story.append(pyq_box([
"Q: Most common cause of acute pancreatitis in India? Ans: Gallstones",
"Q: Most specific enzyme for pancreatitis? Ans: Lipase (more specific than amylase)",
"Q: Cullen's sign is seen in? Ans: Haemorrhagic pancreatitis (periumbilical bruising)",
"Q: Ranson score >5 suggests? Ans: Severe pancreatitis with high mortality",
"Q: Most common complication of acute pancreatitis? Ans: Pancreatic pseudocyst",
"Q: Pseudocyst management if >6cm and persistent >6wks? Ans: Internal drainage (cystogastrostomy)",
]))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════
# CHAPTER 5 - BREAST SURGERY
# ════════════════════════════════════════════════════════════════════════
story.append(header_table(" CHAPTER 5 - BREAST SURGERY"))
story.append(sp(8))
story.append(Paragraph("5.1 BREAST LUMPS - DIFFERENTIAL DIAGNOSIS", CH_SUB))
story.append(data_table(
["Condition", "Age", "Features", "Consistency"],
[
["Fibroadenoma", "15-30 yrs", "'Breast mouse' - mobile, smooth, well-defined, non-tender, no skin changes", "Firm, rubbery"],
["Fibrocystic disease\n(ANDI)", "30-50 yrs", "Cyclical pain/tenderness, multiple lumps, worse pre-menstrual, bilateral", "Nodular"],
["Breast Cyst", "35-55 yrs", "Smooth, well-defined, tense, transilluminates, aspirated", "Cystic/firm"],
["Carcinoma", ">40 yrs", "Hard, irregular, poorly defined, skin tethering, nipple retraction, LN involved", "Hard, stony"],
["Abscess/Mastitis", "Lactating women", "Red, hot, tender, fluctuant, fever, WBC raised", "Fluctuant"],
["Fat Necrosis", "Any age (trauma)", "History of trauma, hard lump, skin retraction - mimics CA", "Hard"],
],
col_widths=[38*mm, 26*mm, 72*mm, 32*mm]
))
story.append(sp(4))
story.append(Paragraph("5.2 BREAST CARCINOMA", CH_SUB))
story.append(imp_box([
"Most common breast cancer histological type: Invasive Ductal Carcinoma (IDC) - 75-80%",
"Most common site: Upper outer quadrant (50%)",
"Inflammatory breast cancer: Peau d'orange skin (dermal lymphatic invasion), worst prognosis",
"BRCA1 mutation: Breast + Ovarian cancer risk; BRCA2: Breast + Pancreatic/Prostate cancer",
"Triple assessment for breast lump: Clinical examination + Imaging (USG/Mammography) + FNAC/Biopsy",
"Sentinel lymph node biopsy: First node to drain tumour - if negative, avoids axillary dissection",
]))
story.append(sp(4))
story.append(Paragraph("Breast Cancer Staging (TNM Summary)", CH_SUB2))
story.append(data_table(
["Stage", "TNM", "Features", "5-yr Survival"],
[
["Stage I", "T1, N0, M0", "Tumour <2cm, no node involvement, no mets", "~95%"],
["Stage IIA", "T0-2, N1, M0 or T2N0", "Mobile ipsilateral axillary nodes or T2 no nodes", "~85%"],
["Stage IIB", "T2N1 or T3N0", "T2 + mobile nodes, or T3 no nodes", "~70%"],
["Stage IIIA", "T0-3, N2, M0 or T3N1", "Fixed axillary nodes", "~55%"],
["Stage IIIB", "T4, any N, M0", "Chest wall/skin involvement (incl inflammatory)", "~40%"],
["Stage IV", "Any T, Any N, M1", "Distant metastases", "~25%"],
],
col_widths=[20*mm, 38*mm, 72*mm, 28*mm]
))
story.append(sp(4))
story.append(pyq_box([
"Q: Most common type of breast cancer? Ans: Invasive Ductal Carcinoma (IDC)",
"Q: Most common site of breast cancer? Ans: Upper outer quadrant",
"Q: Paget's disease of nipple is associated with? Ans: Underlying intraductal carcinoma",
"Q: Triple assessment of breast lump? Ans: Clinical exam + Imaging + Pathology (FNAC/Biopsy)",
"Q: Sentinel lymph node drainage site for breast? Ans: Axillary nodes (level I first)",
"Q: Tamoxifen is used in? Ans: ER/PR positive breast cancer (pre and post-menopausal); SERM",
]))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════
# CHAPTER 6 - THYROID & PARATHYROID
# ════════════════════════════════════════════════════════════════════════
story.append(header_table(" CHAPTER 6 - THYROID & PARATHYROID SURGERY"))
story.append(sp(8))
story.append(Paragraph("6.1 THYROID CANCER - TYPES & FEATURES", CH_SUB))
story.append(data_table(
["Type", "Incidence", "Age/Sex", "Spread", "Prognosis", "Special Features"],
[
["Papillary", "70-80% (most common)", "Young females", "Lymphatic (LN)", "Excellent (>95% 10yr)", "Psammoma bodies, Orphan Annie eye nuclei, Intranuclear inclusions"],
["Follicular", "15-20%", "Middle age", "Haematogenous (lung, bone)", "Good", "Vascular invasion diagnostic; not diagnose by FNAC (capsule needed)"],
["Medullary", "5%", "Familial (MEN 2A/2B)", "Both LN + haematogenous", "Moderate", "Calcitonin as tumour marker; amyloid deposits; RET proto-oncogene"],
["Anaplastic", "<5% (rarest)", "Elderly", "Local invasion + widespread", "Very poor (<6 months)", "Most aggressive; radio-resistant; airway compromise"],
],
col_widths=[26*mm, 28*mm, 26*mm, 30*mm, 26*mm, 32*mm]
))
story.append(sp(4))
story.append(imp_box([
"Most common thyroid cancer: Papillary (70-80%)",
"Best prognosis: Papillary > Follicular > Medullary > Anaplastic (worst)",
"Psammoma bodies seen in: Papillary thyroid CA, Meningioma, Serous papillary ovarian CA",
"MEN 2A: Medullary thyroid CA + Phaeochromocytoma + Primary hyperparathyroidism",
"MEN 2B: Medullary thyroid CA + Phaeochromocytoma + Mucosal neuromas + Marfanoid habitus",
"Calcitonin = tumour marker for Medullary thyroid carcinoma",
"Recurrent laryngeal nerve (RLN) injury during thyroid surgery -> hoarseness",
"Bilateral RLN injury -> stridor, respiratory distress - EMERGENCY tracheotomy needed",
]))
story.append(sp(4))
story.append(pyq_box([
"Q: Most common thyroid cancer? Ans: Papillary carcinoma",
"Q: Psammoma bodies are seen in which thyroid cancer? Ans: Papillary carcinoma",
"Q: Tumour marker for medullary thyroid cancer? Ans: Calcitonin",
"Q: Follicular carcinoma is diagnosed by? Ans: Histopathology (capsular/vascular invasion) - NOT by FNAC",
"Q: Most aggressive thyroid cancer? Ans: Anaplastic (undifferentiated) carcinoma",
"Q: MEN 2A components? Ans: Medullary thyroid CA + Phaeochromocytoma + Hyperparathyroidism",
]))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════
# CHAPTER 7 - HERNIA
# ════════════════════════════════════════════════════════════════════════
story.append(header_table(" CHAPTER 7 - HERNIA"))
story.append(sp(8))
story.append(Paragraph("7.1 INGUINAL HERNIA - INDIRECT vs DIRECT", CH_SUB))
story.append(two_col_table(
["Through deep inguinal ring -> inguinal canal -> superficial ring",
"Younger age group (congenital persistent processus vaginalis)",
"More common overall (3:1 ratio over direct)",
"Lateral to inferior epigastric vessels",
"Covered by all three layers of spermatic cord",
"Can descend into scrotum",
"Higher risk of strangulation",
"Hesselbach's triangle: Lateral border"],
["Through Hesselbach's triangle (posterior wall weakness)",
"Older age (acquired - weakness of transversalis fascia)",
"Less common than indirect",
"Medial to inferior epigastric vessels",
"Not covered by internal spermatic fascia",
"Rarely descends into scrotum",
"Lower risk of strangulation",
"Hesselbach's triangle: Medial border"],
"INDIRECT Inguinal Hernia", "DIRECT Inguinal Hernia"
))
story.append(sp(4))
story.append(box_table([
[Paragraph("<b>Hesselbach's Triangle boundaries:</b> Medial = Lateral border of rectus abdominis | Lateral = Inferior epigastric vessels | Inferior = Inguinal ligament", BODY)],
[Paragraph("<b>Inguinal canal boundaries:</b> Anterior wall = External oblique aponeurosis | Posterior wall = Transversalis fascia (+ conjoined tendon medially) | Roof = Transversus + internal oblique | Floor = Inguinal ligament", BODY)],
]))
story.append(sp(4))
story.append(Paragraph("7.2 FEMORAL HERNIA", CH_SUB))
story.append(box_table([
[Paragraph("<b>Site:</b> Through femoral ring, femoral canal - BELOW and LATERAL to pubic tubercle", BODY)],
[Paragraph("<b>Demographics:</b> More common in women (due to wider pelvis) but inguinal hernia is STILL more common in women overall", BODY)],
[Paragraph("<b>Neck of femoral ring boundaries:</b> Medially = Lacunar ligament | Laterally = Femoral vein | Anteriorly = Inguinal ligament | Posteriorly = Pectineal ligament (Cooper's ligament)", BODY)],
[Paragraph("<b>High strangulation risk</b> due to narrow, unyielding neck (lacunar ligament medially)", BODY)],
]))
story.append(sp(4))
story.append(Paragraph("7.3 SPECIAL HERNIAS (HIGH YIELD!)", CH_SUB))
story.append(data_table(
["Type", "Definition", "Clinical Significance"],
[
["Richter's Hernia", "Only antimesenteric wall of bowel in sac (knuckle) - NO complete obstruction", "Can strangulate WITHOUT obstruction - DANGEROUS, easily missed"],
["Littre's Hernia", "Meckel's diverticulum in hernial sac", "Diverticulum strangulates"],
["Maydl's Hernia\n(W hernia)", "Two loops of bowel in sac forming W shape - middle loop inside abdomen strangulates", "Dangerous - intraabdominal loop strangulates unnoticed"],
["Spigelian Hernia", "Through spigelian fascia (lateral border of rectus, at linea semilunaris)", "Interparietal hernia - difficult to detect clinically"],
["Obturator Hernia", "Through obturator foramen - elderly thin women", "Howship-Romberg sign: medial thigh pain radiating on hip movement"],
["Sliding Hernia\n(en Glissade)", "Wall of viscus forms part of the sac", "Sigmoid colon (left) or caecum (right) most common"],
["Pantaloon Hernia", "Combined direct + indirect hernia straddling inferior epigastric vessels", "Both medial and lateral components"],
],
col_widths=[38*mm, 72*mm, 58*mm]
))
story.append(sp(4))
story.append(pyq_box([
"Q: Which hernia can strangulate without obstruction? Ans: Richter's hernia",
"Q: Littre's hernia contains? Ans: Meckel's diverticulum",
"Q: Howship-Romberg sign is seen in? Ans: Obturator hernia",
"Q: Femoral hernia passes below which landmark? Ans: Below and lateral to pubic tubercle",
"Q: Inguinal hernia passes above which landmark? Ans: Above and medial to pubic tubercle",
"Q: Most common type of hernia in females? Ans: Inguinal hernia (indirect) - inguinal > femoral in females too",
]))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════
# CHAPTER 8 - UROLOGY
# ════════════════════════════════════════════════════════════════════════
story.append(header_table(" CHAPTER 8 - UROLOGY"))
story.append(sp(8))
story.append(Paragraph("8.1 URINARY STONES (UROLITHIASIS)", CH_SUB))
story.append(data_table(
["Stone Type", "% of Stones", "Radio-opacity", "Associations", "Urine pH"],
[
["Calcium Oxalate\n(most common)", "70-80%", "Radio-opaque", "Hypercalciuria, hyperoxaluria, Crohn's disease", "Acidic"],
["Uric Acid", "5-10%", "Radiolucent (pure)", "Gout, dehydration, high purine diet, myeloproliferative", "Acidic (<5.5)"],
["Struvite (triple phosphate)", "10-15%", "Radio-opaque (staghorn)", "Urease-producing organisms (Proteus, Klebsiella)", "Alkaline (>7)"],
["Cystine", "1-3%", "Faintly opaque", "Cystinuria (AR) - defective tubular reabsorption", "Acidic"],
["Calcium Phosphate", "5-10%", "Radio-opaque", "Hyperparathyroidism, RTA type I", "Alkaline"],
],
col_widths=[32*mm, 20*mm, 28*mm, 58*mm, 26*mm]
))
story.append(sp(4))
story.append(tip_box([
"Most radio-opaque: Calcium oxalate > Calcium phosphate > Struvite > Cystine > Uric acid (radiolucent)",
"Staghorn calculi = Struvite stones (fill renal pelvis + calyces)",
"Treatment of uric acid stones: Urinary alkalinisation (potassium citrate) + hydration",
"First-line investigation: KUB X-ray + USG; CT-KUB (non-contrast) = gold standard",
"ESWL (Extracorporeal Shock Wave Lithotripsy): Best for stones <2cm in renal pelvis",
"PCNL (Percutaneous Nephrolithotomy): Stones >2cm or staghorn calculi",
]))
story.append(sp(4))
story.append(pyq_box([
"Q: Most common renal stone? Ans: Calcium oxalate (70-80%)",
"Q: Only radiolucent stone on plain X-ray? Ans: Uric acid stone",
"Q: Staghorn calculus is composed of? Ans: Struvite (magnesium ammonium phosphate - triple phosphate)",
"Q: Organism causing struvite stones? Ans: Proteus mirabilis (urease-producing)",
"Q: ESWL is suitable for stones of what size? Ans: <2 cm in renal pelvis",
"Q: Investigation of choice for ureteric colic? Ans: Non-contrast CT-KUB (NCCT abdomen)",
]))
story.append(sp(6))
story.append(Paragraph("8.2 BPH (BENIGN PROSTATIC HYPERPLASIA)", CH_SUB))
story.append(box_table([
[Paragraph("<b>Zone affected:</b> Transitional zone (central) | Prostate CA affects Peripheral zone", BODY)],
[Paragraph("<b>Features - LUTS:</b> Frequency, urgency, nocturia, poor stream, hesitancy, terminal dribbling, incomplete emptying", BODY)],
[Paragraph("<b>PSA:</b> Raised (but not diagnostic of CA alone - also raised in BPH, prostatitis, UTI)", BODY)],
[Paragraph("<b>Rectal exam:</b> Enlarged, smooth, firm, non-tender, median groove preserved (vs CA: hard, irregular, nodular)", BODY)],
[Paragraph("<b>Treatment:</b> Alpha-blockers (tamsulosin, alfuzosin) first line for symptoms | 5-alpha reductase inhibitors (finasteride) for large glands | TURP (gold standard surgical treatment)", BODY)],
]))
story.append(sp(4))
story.append(pyq_box([
"Q: Zone of prostate affected in BPH? Ans: Transitional (central) zone",
"Q: Zone affected in prostate carcinoma? Ans: Peripheral zone",
"Q: Gold standard surgical treatment of BPH? Ans: TURP (TransUrethral Resection of Prostate)",
"Q: TUR syndrome is caused by? Ans: Absorption of hypotonic irrigation fluid -> dilutional hyponatraemia",
"Q: First line medical treatment of BPH? Ans: Alpha-1 blockers (tamsulosin, alfuzosin)",
]))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════
# CHAPTER 9 - VASCULAR SURGERY
# ════════════════════════════════════════════════════════════════════════
story.append(header_table(" CHAPTER 9 - VASCULAR SURGERY"))
story.append(sp(8))
story.append(Paragraph("9.1 ABDOMINAL AORTIC ANEURYSM (AAA)", CH_SUB))
story.append(box_table([
[Paragraph("<b>Definition:</b> Dilatation of aorta >3 cm (normal <2.5cm) | TRUE aneurysm involves all 3 layers", BODY)],
[Paragraph("<b>Risk factors:</b> Atherosclerosis, Smoking (strongest RF), Male, Age >65, Hypertension, Family history", BODY)],
[Paragraph("<b>Most common site:</b> Infrarenal aorta (90%)", BODY)],
[Paragraph("<b>Indications for surgery:</b> >5.5 cm | Rapidly expanding (>1 cm/year) | Symptomatic | Ruptured", BODY)],
[Paragraph("<b>Ruptured AAA triad:</b> Sudden severe back/flank pain + Hypotension + Pulsatile abdominal mass", BODY)],
[Paragraph("<b>Treatment:</b> EVAR (Endovascular Aneurysm Repair) preferred if anatomy suitable; Open repair alternatively", BODY)],
]))
story.append(sp(4))
story.append(pyq_box([
"Q: Most common site of AAA? Ans: Infrarenal aorta",
"Q: When is elective AAA repair indicated? Ans: Diameter >5.5 cm or expanding >1 cm/year",
"Q: Classical triad of ruptured AAA? Ans: Sudden back pain + Hypotension + Pulsatile abdominal mass",
"Q: Most common cause of AAA? Ans: Atherosclerosis",
]))
story.append(sp(6))
story.append(Paragraph("9.2 DEEP VEIN THROMBOSIS (DVT) & PULMONARY EMBOLISM", CH_SUB))
story.append(data_table(
["Feature", "DVT", "Pulmonary Embolism"],
[
["Presentation", "Unilateral leg swelling, pain, warmth, Homan's sign (unreliable)", "Dyspnoea, pleuritic chest pain, haemoptysis, tachycardia"],
["Investigation", "Doppler USG (first line); D-dimer screening", "CTPA (gold standard); V/Q scan; ECG: S1Q3T3"],
["Treatment", "LMWH/Heparin -> Warfarin/DOAC for 3-6 months; compression stockings", "Anticoagulation; Thrombolysis if haemodynamically unstable; IVC filter"],
["Prophylaxis", "LMWH, early mobilisation, compression stockings, hydration", "Same as DVT prophylaxis"],
],
col_widths=[28*mm, 70*mm, 70*mm]
))
story.append(sp(4))
story.append(pyq_box([
"Q: ECG finding in massive PE? Ans: S1Q3T3 pattern (S wave in lead I, Q wave and T inversion in lead III)",
"Q: Gold standard investigation for PE? Ans: CT Pulmonary Angiography (CTPA)",
"Q: Virchow's triad for DVT? Ans: Stasis + Endothelial injury + Hypercoagulability",
"Q: Most common source of pulmonary embolism? Ans: DVT of lower limb (femoral/iliac veins)",
]))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════
# CHAPTER 10 - PAEDIATRIC SURGERY
# ════════════════════════════════════════════════════════════════════════
story.append(header_table(" CHAPTER 10 - PAEDIATRIC SURGERY"))
story.append(sp(8))
story.append(data_table(
["Condition", "Age", "Presentation", "Investigation", "Treatment"],
[
["Pyloric Stenosis", "2-6 weeks (M>F 4:1)", "Projectile non-bilious vomiting, 'olive' mass, hungry baby", "USG (pyloric muscle thickness >4mm, length >16mm); Metabolic alkalosis", "Ramstedt's pyloromyotomy (after correction of electrolytes)"],
["Intussusception", "6 months-2 years", "Colicky pain, vomiting, currant jelly stools, sausage mass in RUQ", "USG: Target sign / Doughnut sign", "Air/hydrostatic enema (first line); Surgery if failed or peritonitis"],
["Hirschsprung's Disease", "Neonates/infants", "Delayed meconium passage (>48hrs), abdominal distension, ribbon stools", "Rectal biopsy (gold standard): absence of ganglion cells; Anorectal manometry", "Surgical pull-through procedure (Swenson/Duhamel/Soave)"],
["Congenital Diaphragmatic Hernia (CDH)", "Neonate", "Respiratory distress, scaphoid abdomen, bowel sounds in chest", "CXR: bowel in chest", "Stabilise first, then surgical repair; Left side more common (Bochdalek)"],
["Tracheo-Oesophageal Fistula (TOF)", "Neonate", "Coughing/choking on feeding, respiratory distress, copious secretions", "NGT coiling on CXR; H-type detected by contrast study", "Surgical repair; most common type C (blind upper pouch + fistula lower)"],
["Meckel's Diverticulum", "Any age (usually 2 yrs)", "Rule of 2s: 2% pop, 2 inches long, 2 feet from ileocaecal valve, 2x more in males", "Tc-99m pertechnetate scan (ectopic gastric mucosa)", "Surgical excision if symptomatic"],
],
col_widths=[36*mm, 24*mm, 44*mm, 36*mm, 38*mm]
))
story.append(sp(4))
story.append(imp_box([
"Pyloric stenosis: Metabolic alkalosis with hypochloraemia and hypokalaemia - correct BEFORE surgery",
"Hirschsprung's disease: Absent ganglion cells in Meissner's and Auerbach's plexuses (gold standard = rectal biopsy)",
"Meckel's Rule of 2s: 2% population, 2 inches, 2 feet from ileocaecal valve, presents before age 2",
"Most common site for ectopic tissue in Meckel's: Gastric mucosa (causes bleeding)",
"Most common type of TOF: Type C (85%) - proximal oesophageal atresia + distal tracheo-oesophageal fistula",
]))
story.append(sp(4))
story.append(pyq_box([
"Q: Meckel's diverticulum - rule of 2s? Ans: 2% population, 2 inches, 2 feet from IC valve, M:F = 2:1",
"Q: Diagnosis of Hirschsprung's disease? Ans: Rectal biopsy showing absent ganglion cells",
"Q: Currant jelly stools are characteristic of? Ans: Intussusception",
"Q: Investigation for pyloric stenosis? Ans: USG (muscle thickness >4mm); Metabolic alkalosis on bloods",
"Q: Technetium scan is used for? Ans: Meckel's diverticulum (ectopic gastric mucosa)",
]))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════
# CHAPTER 11 - ONCOLOGY
# ════════════════════════════════════════════════════════════════════════
story.append(header_table(" CHAPTER 11 - SURGICAL ONCOLOGY"))
story.append(sp(8))
story.append(Paragraph("11.1 TUMOUR MARKERS", CH_SUB))
story.append(data_table(
["Tumour Marker", "Associated Tumour", "Notes"],
[
["CEA (Carcinoembryonic Antigen)", "Colorectal CA (primary monitoring)", "Also: gastric, pancreatic, breast, lung CA; smokers"],
["AFP (Alpha-fetoprotein)", "Hepatocellular CA, Germ cell tumours (non-seminoma)", "Also elevated in pregnancy, liver disease"],
["PSA (Prostate Specific Antigen)", "Prostate carcinoma", "Also raised in BPH, prostatitis; organ-specific not cancer-specific"],
["CA 19-9", "Pancreatic CA (primary), biliary CA", "Best tumour marker for pancreatic CA monitoring"],
["CA 125", "Ovarian CA (epithelial)", "Also in endometriosis, fibroids, pelvic inflammation"],
["CA 15-3", "Breast carcinoma", "Used for monitoring, not screening"],
["Calcitonin", "Medullary thyroid carcinoma", "Also used to screen family members (MEN 2)"],
["Beta-hCG", "Choriocarcinoma, Gestational trophoblastic disease, Testicular CA (non-seminoma)", ""],
["LDH", "Seminoma, Lymphoma, Ewing's sarcoma", "Non-specific marker"],
["S-100", "Melanoma, Schwannoma, Astrocytoma", "Neural crest cell tumours"],
],
col_widths=[48*mm, 72*mm, 48*mm]
))
story.append(sp(4))
story.append(pyq_box([
"Q: Tumour marker for pancreatic carcinoma? Ans: CA 19-9",
"Q: Tumour marker for hepatocellular carcinoma? Ans: AFP (alpha-fetoprotein)",
"Q: Best marker for monitoring colorectal cancer? Ans: CEA",
"Q: Tumour marker for medullary thyroid cancer? Ans: Calcitonin",
"Q: Which tumour marker is raised in seminoma? Ans: LDH (AFP and beta-hCG typically negative in pure seminoma)",
]))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════
# CHAPTER 12 - INSTRUMENTS & PROCEDURES
# ════════════════════════════════════════════════════════════════════════
story.append(header_table(" CHAPTER 12 - SURGICAL INSTRUMENTS & PROCEDURES"))
story.append(sp(8))
story.append(Paragraph("12.1 KEY SURGICAL DRAINS", CH_SUB))
story.append(data_table(
["Drain", "Type", "Uses"],
[
["Corrugated rubber drain", "Passive, open", "Superficial wounds, subcutaneous drains"],
["Robinson drain (straight tube)", "Active closed (suction)", "Post-op abdominal, orthopaedic surgery"],
["Jackson-Pratt (JP)", "Active closed (bulb suction)", "After mastectomy, neck dissection, TRAM flap"],
["Blake drain", "Active closed", "Thoracic, cardiac surgery"],
["Chest drain (intercostal)", "Water-seal or Heimlich valve", "Haemothorax, pneumothorax, pleural effusion"],
["Sump drain (double lumen)", "Active irrigation + drainage", "Subphrenic abscess, bile leaks"],
["T-tube drain", "Passive", "CBD after choledochotomy for stones"],
],
col_widths=[48*mm, 45*mm, 75*mm]
))
story.append(sp(4))
story.append(pyq_box([
"Q: T-tube drain is used after? Ans: Choledochotomy (CBD exploration for stones) - maintains bile drainage",
"Q: Drain used after mastectomy? Ans: Jackson-Pratt drain (closed suction)",
"Q: Chest drain goes through which space? Ans: 5th ICS, midaxillary line (safe triangle)",
]))
story.append(sp(6))
story.append(Paragraph("12.2 STERILISATION METHODS", CH_SUB))
story.append(data_table(
["Method", "Temperature", "Best For", "Cannot Use For"],
[
["Autoclave (Steam sterilisation)", "121°C/15 psi x 15 min or 134°C x 3 min", "Metal instruments, drapes, gowns, glass, rubber", "Heat-sensitive equipment"],
["Dry Heat (hot air oven)", "160°C x 1hr or 180°C x 30min", "Glassware, oils, powders, sharp instruments (no steam blunting)", "Rubber, plastics, paper"],
["Ethylene Oxide (EO)", "50-60°C", "Endoscopes, plastics, rubber, electronics - heat sensitive", "Prolonged aeration needed (toxic residue)"],
["Glutaraldehyde (2%)", "Room temp", "Endoscopes (high-level disinfection)", "Not true sterilisation"],
["Gamma Radiation", "Room temp", "Disposables, sutures, packaged sterile items", "Industrial use; not bedside"],
["Plasma/Hydrogen peroxide", "50°C", "Delicate instruments, fibre optics", "Cellulose, linens"],
],
col_widths=[42*mm, 36*mm, 52*mm, 38*mm]
))
story.append(sp(4))
story.append(imp_box([
"Autoclave = moist heat = most reliable, most common method for surgical instruments",
"Prions (CJD) are resistant to standard autoclaving - require 134°C x 18 min extended cycle or incineration",
"Ethylene oxide: Toxic, carcinogenic, long aeration time (8-12 hrs) needed",
"Best method for sharp instruments (to prevent blunting): Dry heat or Ethylene oxide",
]))
story.append(sp(4))
story.append(pyq_box([
"Q: Most reliable method of sterilisation? Ans: Autoclave (moist heat under pressure)",
"Q: Sterilisation of laparoscopes/endoscopes? Ans: Glutaraldehyde (2%) for high-level disinfection; EO for sterilisation",
"Q: Which organisms are most resistant to sterilisation? Ans: Prions > Bacterial spores > Mycobacteria > Fungi > Viruses > Vegetative bacteria",
]))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════
# QUICK REFERENCE - LAST MINUTE REVISION
# ════════════════════════════════════════════════════════════════════════
story.append(header_table(" QUICK REFERENCE - LAST MINUTE HIGH-YIELD FACTS", C_RED))
story.append(sp(8))
story.append(Paragraph("MUST-KNOW MNEMONICS", CH_SUB))
story.append(data_table(
["Mnemonic", "Stands For", "Topic"],
[
["MANTRELS", "Migration, Anorexia, Nausea, Tenderness RIF, Rebound, Elevated Temp, Leukocytosis, Shift left", "Alvarado Score for Appendicitis"],
["GET SMASHED", "Gallstones, Ethanol, Trauma, Steroids, Mumps, Autoimmune, Scorpion, Hyperlipidaemia, ERCP, Drugs", "Causes of Acute Pancreatitis"],
["5 F's", "Fat, Female, Fertile, Forty, Fair", "Risk factors for Cholesterol Gallstones"],
["AMPLE", "Allergies, Medications, Past history, Last meal, Events leading to injury", "ATLS History Taking"],
["Rule of 2s", "2% pop, 2 inches, 2 feet from IC valve, 2 yr age, 2:1 M:F", "Meckel's Diverticulum"],
["ABCDE", "Airway, Breathing, Circulation, Disability, Exposure", "Primary Survey in Trauma (ATLS)"],
["Virchow's Triad", "Stasis + Endothelial injury + Hypercoagulability", "DVT Formation"],
["Beck's Triad", "Hypotension + Muffled heart sounds + Raised JVP", "Cardiac Tamponade"],
["Charcot's Triad", "Fever + Jaundice + RUQ Pain", "Acute Cholangitis"],
["Reynolds Pentad", "Charcot's Triad + Hypotension + Confusion", "Severe/Suppurative Cholangitis"],
],
col_widths=[32*mm, 90*mm, 46*mm]
))
story.append(sp(6))
story.append(Paragraph("TOP 30 MOST REPEATED SURGERY PYQs IN NEET PG", CH_SUB))
pyq_final = [
"1. Most common position of appendix: RETROCAECAL (65%)",
"2. Most common cause of intestinal obstruction in adults: ADHESIONS (post-op) for SB; CARCINOMA for LB",
"3. Rule of nines: Lower limb = 18%, Upper limb = 9%, Head = 9%, Trunk (ant+post) = 36%",
"4. Parkland formula: 4 x kg x %TBSA in RL; half in first 8 hours",
"5. Most common thyroid cancer: Papillary (psammoma bodies, lymphatic spread, best prognosis)",
"6. Charcot's triad: Fever + Jaundice + RUQ pain = Cholangitis",
"7. Courvoisier's law: Palpable GB + painless jaundice = malignancy (NOT stones)",
"8. Beck's triad (cardiac tamponade): Hypotension + muffled sounds + raised JVP",
"9. Most common type of hernia (overall): INDIRECT inguinal hernia",
"10. Richter's hernia: Strangulates WITHOUT complete obstruction (knuckle of bowel wall)",
"11. Best prognosis thyroid cancer: Papillary; Worst: Anaplastic",
"12. Tumour marker: Pancreatic CA = CA 19-9; Hepatoma = AFP; Medullary thyroid = Calcitonin",
"13. Meckel's diverticulum rule of 2s - Tc-99m pertechnetate scan for diagnosis",
"14. Hirschsprung's disease: Absent ganglion cells on rectal biopsy (gold standard)",
"15. Intussusception: Currant jelly stools + sausage mass + USG target sign",
"16. Most common type of wound healing: PRIMARY intention (clean surgical wound)",
"17. Collagen type first in wound healing: Type III -> replaced by Type I",
"18. Maximum tensile strength of healed wound: 80% (at 3 months)",
"19. Most important cell in wound healing: MACROPHAGE",
"20. Most common cause of SSI: Staphylococcus aureus",
"21. TURP syndrome: Dilutional hyponatraemia from hypotonic irrigation fluid absorption",
"22. Most common renal stone: Calcium oxalate (70-80%); Only radiolucent: Uric acid",
"23. Struvite (staghorn) stone organism: Proteus mirabilis (urease-producing)",
"24. Ranson score >5 = severe pancreatitis; Cullen's sign = periumbilical bruising",
"25. Lithotripsy (ESWL) best for: Stones <2 cm in renal pelvis",
"26. Sentinel lymph node biopsy: First line axillary staging for early breast cancer",
"27. MEN 2A: Medullary thyroid CA + Pheochromocytoma + Hyperparathyroidism",
"28. Best investigation for gallstones: Ultrasound (USG) - gold standard",
"29. S1Q3T3 on ECG = Pulmonary Embolism; CTPA = gold standard investigation",
"30. Tension pneumothorax: Immediate needle decompression at 2nd ICS midclavicular line",
]
for q in pyq_final:
story.append(Paragraph(q, BULLET))
story.append(sp(4))
# ── FINAL PAGE ──────────────────────────────────────────────────────────
story.append(PageBreak())
footer_table = Table(
[[Paragraph("ALL THE BEST FOR NEET PG!", S("ft", fontSize=22,
textColor=C_WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER))],
[Paragraph("You've got this! Revise smart, not hard.", S("fs", fontSize=13,
textColor=C_YELLOW, alignment=TA_CENTER))],
[sp(10)],
[Paragraph("Sources: Bailey & Love 28e | Schwartz's Surgery 11e | Current Surgical Therapy 14e | Sabiston Surgery | Tintinalli Emergency Medicine | Maingot's Abdominal Operations", S("fsrc", fontSize=8, textColor=C_WHITE, alignment=TA_CENTER))],
],
colWidths=[190*mm]
)
footer_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_NAVY),
("TOPPADDING", (0,0), (-1,-1), 14),
("BOTTOMPADDING", (0,0), (-1,-1), 14),
("LEFTPADDING", (0,0), (-1,-1), 20),
]))
story.append(footer_table)
return story
# ── Page Template (header + footer) ─────────────────────────────────────────
from reportlab.platypus import Frame, PageTemplate
from reportlab.platypus.doctemplate import BaseDocTemplate
class SurgeryDoc(BaseDocTemplate):
def __init__(self, filename, **kwargs):
super().__init__(filename, **kwargs)
frame = Frame(self.leftMargin, self.bottomMargin,
self.width, self.height, id='main')
template = PageTemplate(id='main', frames=[frame],
onPage=self._add_page_decor)
self.addPageTemplates([template])
def _add_page_decor(self, canvas, doc):
canvas.saveState()
# Top thin stripe
canvas.setFillColor(C_TEAL)
canvas.rect(0, A4[1]-8, A4[0], 8, fill=1, stroke=0)
# Bottom thin stripe
canvas.setFillColor(C_NAVY)
canvas.rect(0, 0, A4[0], 20, fill=1, stroke=0)
# Footer text
canvas.setFillColor(C_WHITE)
canvas.setFont("Helvetica", 7)
canvas.drawString(15*mm, 7, "NEET PG Surgery Rapid Revision Notes | 2-Day Complete Revision")
canvas.drawRightString(A4[0]-15*mm, 7, f"Page {doc.page}")
canvas.restoreState()
def main():
doc = SurgeryDoc(
OUTPUT,
pagesize=A4,
leftMargin=18*mm, rightMargin=18*mm,
topMargin=16*mm, bottomMargin=22*mm,
title="NEET PG Surgery Rapid Revision Notes",
author="Orris AI",
)
story = build_story()
doc.build(story)
print(f"PDF generated: {OUTPUT}")
if __name__ == "__main__":
main()
cd /home/daytona/workspace/surgery-neet-pg && python3 generate_surgery_pdf.py 2>…
ls -lh /home/daytona/workspace/surgery-neet-pg/NEET_PG_Surgery_Revision.pdf
NEET PG Surgery Revision
PDF Document · PDF
| # | Chapter | Key Content |
|---|---|---|
| 1 | General Surgery Principles | Wound healing phases, collagen types, shock classification (Class I-IV), SSI wound classes, sutures |
| 2 | Trauma & Emergency Surgery | Burns (Rule of Nines table, depth classification, Parkland formula), ATLS ABCDE, Tension PTX vs Tamponade |
| 3 | GI Surgery | Appendicitis + Alvarado (MANTRELS) score, Intestinal obstruction, PUD - DU vs GU comparison |
| 4 | Hepatobiliary & Pancreas | Gallstone types, Charcot's/Reynold's triad, Ranson's criteria, Pancreatitis (GET SMASHED) |
| 5 | Breast Surgery | Breast lump DDx table, Carcinoma staging (TNM), Triple assessment, Sentinel node biopsy |
| 6 | Thyroid & Parathyroid | All 4 cancer types compared, psammoma bodies, MEN 2A/2B, calcitonin, RLN injury |
| 7 | Hernia | Direct vs Indirect inguinal, Hesselbach's triangle, Femoral hernia, 7 special hernias (Richter's, Littre's, Maydl's etc.) |
| 8 | Urology | Stone types (radio-opacity, pH, organisms), BPH vs CA zones, TURP, ESWL/PCNL criteria |
| 9 | Vascular Surgery | AAA, DVT/PE, Virchow's triad, S1Q3T3, CTPA |
| 10 | Paediatric Surgery | Pyloric stenosis, Intussusception, Hirschsprung's, TOF types, Meckel's Rule of 2s |
| 11 | Surgical Oncology | Complete tumour markers table (AFP, CA19-9, CEA, Calcitonin, PSA etc.) |
| 12 | Instruments & Procedures | Surgical drains, Sterilisation methods, laparoscopy |