~/neet-mds-classifications/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
PageBreak, HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate
OUTPUT = "/home/daytona/workspace/neet-mds-classifications/NEET_MDS_Classifications.pdf"
# ── Color Palette ──────────────────────────────────────────────────────────────
C_DARK_BLUE = colors.HexColor("#1A237E")
C_MED_BLUE = colors.HexColor("#283593")
C_ACCENT = colors.HexColor("#0D47A1")
C_LIGHT_BLUE = colors.HexColor("#E3F2FD")
C_HEADER_BG = colors.HexColor("#1565C0")
C_ROW_ALT = colors.HexColor("#F0F4FF")
C_ROW_WHITE = colors.white
C_GOLD = colors.HexColor("#F9A825")
C_TEXT = colors.HexColor("#1A1A2E")
C_SUBJ_BG = colors.HexColor("#E8EAF6")
C_SUBJ_TEXT = colors.HexColor("#1A237E")
C_NOTE_BG = colors.HexColor("#FFF8E1")
styles = getSampleStyleSheet()
def sty(name, **kw):
return ParagraphStyle(name, **kw)
TITLE_STYLE = sty("DocTitle",
fontName="Helvetica-Bold", fontSize=26, textColor=colors.white,
alignment=TA_CENTER, spaceAfter=4)
SUBTITLE_STYLE = sty("DocSub",
fontName="Helvetica", fontSize=13, textColor=colors.HexColor("#BBDEFB"),
alignment=TA_CENTER, spaceAfter=2)
SECTION_STYLE = sty("Section",
fontName="Helvetica-Bold", fontSize=15, textColor=C_DARK_BLUE,
spaceBefore=14, spaceAfter=6, borderPad=4)
SUBJ_HEADER_STYLE = sty("SubjHeader",
fontName="Helvetica-Bold", fontSize=11, textColor=C_SUBJ_TEXT,
alignment=TA_CENTER)
BODY_STYLE = sty("Body",
fontName="Helvetica", fontSize=9, textColor=C_TEXT,
leading=13)
NOTE_STYLE = sty("Note",
fontName="Helvetica-Oblique", fontSize=8, textColor=colors.HexColor("#5D4037"),
leading=11)
TH_STYLE = sty("TH",
fontName="Helvetica-Bold", fontSize=9, textColor=colors.white,
alignment=TA_CENTER)
TD_STYLE = sty("TD",
fontName="Helvetica", fontSize=8.5, textColor=C_TEXT, leading=12)
TD_BOLD = sty("TDB",
fontName="Helvetica-Bold", fontSize=8.5, textColor=C_TEXT, leading=12)
PAGE_NUM_STYLE = sty("PN",
fontName="Helvetica", fontSize=8, textColor=colors.HexColor("#78909C"),
alignment=TA_CENTER)
# ── Helpers ────────────────────────────────────────────────────────────────────
def th(text):
return Paragraph(text, TH_STYLE)
def td(text, bold=False):
return Paragraph(str(text), TD_BOLD if bold else TD_STYLE)
def make_table(headers, rows, col_widths=None, zebra=True):
data = [[th(h) for h in headers]] + [
[td(c, bold=(i == 0)) for i, c in enumerate(r)] for r in rows
]
ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), C_HEADER_BG),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 9),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C_ROW_WHITE, C_ROW_ALT] if zebra else [C_ROW_WHITE]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#CFD8DC")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("ROWBACKGROUNDS",(0,0), (-1,0), [C_HEADER_BG]),
])
t = Table(data, colWidths=col_widths, repeatRows=1)
t.setStyle(ts)
return t
def section_title(text, color=C_DARK_BLUE):
return Paragraph(f'<font color="{color.hexval()}">{text}</font>', SECTION_STYLE)
def subject_box(subj_name, color=C_SUBJ_BG):
data = [[Paragraph(f"<b>{subj_name}</b>", SUBJ_HEADER_STYLE)]]
t = Table(data, colWidths=[16.5*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_SUBJ_BG),
("ROWBACKGROUNDS",(0,0),(-1,-1), [C_SUBJ_BG]),
("BOX", (0,0), (-1,-1), 1.2, C_DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
]))
return t
def note(text):
return Paragraph(f"<b>Note:</b> {text}", NOTE_STYLE)
def sp(h=0.2):
return Spacer(1, h*cm)
# ── Page Templates ─────────────────────────────────────────────────────────────
def cover_page(canvas, doc):
canvas.saveState()
W, H = A4
# gradient-like background
canvas.setFillColor(C_DARK_BLUE)
canvas.rect(0, 0, W, H, fill=1, stroke=0)
# gold accent bar
canvas.setFillColor(C_GOLD)
canvas.rect(0, H*0.82, W, 6, fill=1, stroke=0)
canvas.rect(0, H*0.18, W, 6, fill=1, stroke=0)
# decorative circles
canvas.setFillColor(colors.HexColor("#283593"))
canvas.circle(W*0.9, H*0.85, 60, fill=1, stroke=0)
canvas.circle(W*0.1, H*0.15, 40, fill=1, stroke=0)
canvas.restoreState()
def later_page(canvas, doc):
canvas.saveState()
W, H = A4
# top bar
canvas.setFillColor(C_HEADER_BG)
canvas.rect(0, H-1.1*cm, W, 1.1*cm, fill=1, stroke=0)
canvas.setFillColor(C_GOLD)
canvas.rect(0, H-1.15*cm, W, 0.15*cm, fill=1, stroke=0)
# header text
canvas.setFillColor(colors.white)
canvas.setFont("Helvetica-Bold", 9)
canvas.drawString(1.5*cm, H-0.75*cm, "NEET MDS - Complete Classification Charts")
canvas.setFont("Helvetica", 8)
canvas.drawRightString(W-1.5*cm, H-0.75*cm, "For Revision Use Only")
# bottom bar
canvas.setFillColor(C_HEADER_BG)
canvas.rect(0, 0, W, 0.9*cm, fill=1, stroke=0)
canvas.setFillColor(colors.white)
canvas.setFont("Helvetica", 8)
canvas.drawCentredString(W/2, 0.3*cm, f"Page {doc.page}")
canvas.restoreState()
# ── Content Builder ────────────────────────────────────────────────────────────
def build_content():
elems = []
# ─ COVER ──────────────────────────────────────────────────────────────────
elems += [
Spacer(1, 5.5*cm),
Paragraph("NEET MDS", sty("CT1", fontName="Helvetica-Bold", fontSize=44,
textColor=C_GOLD, alignment=TA_CENTER)),
Spacer(1, 0.3*cm),
Paragraph("Complete Classification Charts", sty("CT2", fontName="Helvetica-Bold",
fontSize=22, textColor=colors.white, alignment=TA_CENTER)),
Spacer(1, 0.5*cm),
Paragraph("High-Yield Revision Guide · All Subjects", sty("CT3",
fontName="Helvetica", fontSize=14,
textColor=colors.HexColor("#90CAF9"), alignment=TA_CENTER)),
Spacer(1, 1.5*cm),
Paragraph("Covers: Oral Pathology · Oral Surgery · Dental Materials · Orthodontics",
sty("CT4", fontName="Helvetica", fontSize=11,
textColor=colors.HexColor("#B0BEC5"), alignment=TA_CENTER)),
Paragraph("Periodontics · Prosthodontics · Conservative & Endo · Pedodontics",
sty("CT5", fontName="Helvetica", fontSize=11,
textColor=colors.HexColor("#B0BEC5"), alignment=TA_CENTER)),
Paragraph("Pharmacology · Radiology · Public Health Dentistry · Anatomy",
sty("CT6", fontName="Helvetica", fontSize=11,
textColor=colors.HexColor("#B0BEC5"), alignment=TA_CENTER)),
Spacer(1, 2.5*cm),
Paragraph("Prepared for NEET MDS 2026", sty("CT7", fontName="Helvetica-Oblique",
fontSize=10, textColor=colors.HexColor("#78909C"), alignment=TA_CENTER)),
PageBreak(),
]
# ─ 1. ORAL PATHOLOGY ──────────────────────────────────────────────────────
elems += [sp(0.3), subject_box("1. ORAL PATHOLOGY"), sp(0.3)]
elems += [section_title("1.1 Classification of Odontogenic Cysts")]
elems += [make_table(
["Category", "Type", "Key Feature"],
[
["Developmental", "Dentigerous (Follicular) Cyst", "Encloses crown of unerupted tooth; 2nd most common OD cyst"],
["Developmental", "Eruption Cyst", "Soft tissue variant of dentigerous cyst"],
["Developmental", "Primordial Cyst (OKC)", "Arises from enamel organ before tooth formation; high recurrence"],
["Developmental", "Lateral Periodontal Cyst", "Alongside root; botryoid variant is multilocular"],
["Developmental", "Gingival Cyst of Adults", "Soft tissue; bluish papule on gingiva"],
["Developmental", "Gingival Cyst of Newborn (Epstein pearls)", "Multiple white nodules on alveolar ridge"],
["Developmental", "Glandular Odontogenic Cyst", "Rare; mucous cells lining; high recurrence"],
["Inflammatory", "Periapical (Radicular) Cyst", "Most common cyst in jaw; follows periapical granuloma"],
["Inflammatory", "Residual Cyst", "Periapical cyst remaining after extraction"],
["Inflammatory", "Paradental / Lateral Radicular Cyst", "Related to lateral accessory root canal"],
["Inflammatory", "Buccal Bifurcation Cyst", "Lower first molar; buccal tipping of crown"],
],
col_widths=[3*cm, 6*cm, 7.5*cm]
), sp()]
elems += [section_title("1.2 WHO Classification of Odontogenic Tumours (2022)")]
elems += [make_table(
["Origin", "Tumour", "Key Feature"],
[
["Epithelial", "Ameloblastoma", "Most common OD tumour; multicystic, soap-bubble; locally aggressive"],
["Epithelial", "Squamous Odontogenic Tumour", "Rare; islands of squamous epithelium"],
["Epithelial", "Calcifying Epithelial OD Tumour (CEOT / Pindborg)", "Liesegang rings; amyloid deposits; driven snow X-ray"],
["Epithelial", "Adenomatoid Odontogenic Tumour (AOT)", "Two-thirds rule: ant maxilla, F>M, assoc. canine; 'FOC'"],
["Epithelial", "Keratocystic OD Tumour (OKC)", "Parakeratinised epithelium; daughter cysts; Gorlin syndrome"],
["Mixed (Epi+Mesen)", "Ameloblastic Fibroma", "Young patients; mixed radiolucent; no hard tissue"],
["Mixed (Epi+Mesen)", "Ameloblastic Fibro-odontoma", "Contains dentin + enamel"],
["Mixed (Epi+Mesen)", "Odontoma (Compound)", "Toothlets; anterior maxilla; most common OD tumour overall"],
["Mixed (Epi+Mesen)", "Odontoma (Complex)", "Amorphous calcification; posterior jaw"],
["Mesenchymal", "Odontogenic Fibroma", "Fibrous tissue with OD epithelium rests"],
["Mesenchymal", "Odontogenic Myxoma", "Tennis-racket / soap-bubble X-ray; gelatinous; locally aggressive"],
["Mesenchymal", "Cementoblastoma", "Fused to root apex of mandibular molar; sunburst pattern"],
["Malignant", "Ameloblastic Carcinoma", "Malignant ameloblastoma; metastasizes to lung"],
["Malignant", "Primary Intraosseous Carcinoma", "Arises in jaw de novo or from OD cyst"],
],
col_widths=[3.5*cm, 5.5*cm, 7.5*cm]
), sp()]
elems += [section_title("1.3 Classification of Bone Pathology in Jaws")]
elems += [make_table(
["Condition", "Type", "Classic Radiographic Sign"],
[
["Fibrous Dysplasia", "Monostotic / Polyostotic (McCune-Albright)", "Ground glass / orange peel appearance"],
["Cherubism", "Fibrous replacement of bone; bilateral", "Bilateral multilocular radiolucency; angel face"],
["Paget's Disease", "Osteitis deformans; elderly", "Cotton wool appearance; hypercementosis"],
["Ossifying Fibroma", "Benign fibroosseous lesion", "Mixed radiolucent-radiopaque; well-demarcated"],
["Central Giant Cell Granuloma", "Non-neoplastic; anterior mandible; F>M", "Multilocular; soap-bubble"],
["Aneurysmal Bone Cyst", "Blood-filled spaces; 2nd decade", "Soap-bubble; eggshell expansion"],
["Solitary Bone Cyst", "Simple/traumatic; empty; mandible body", "Scalloping between roots; no epithelial lining"],
["Osteosarcoma", "Most common primary bone malignancy", "Sun-ray/sunburst; Codman's triangle; widenened PDL"],
],
col_widths=[4*cm, 5*cm, 7.5*cm]
), sp()]
elems += [section_title("1.4 Classification of Vesiculobullous Lesions")]
elems += [make_table(
["Level of Split", "Disease", "Key Diagnostic Feature"],
[
["Intraepithelial (Suprabasal)", "Pemphigus Vulgaris", "Acantholysis; Tzanck cells; IgG intercellular; Nikolsky +ve"],
["Intraepithelial (Suprabasal)", "Pemphigus Vegetans", "Variant of PV with warty vegetations"],
["Intraepithelial (Spinous layer)", "Darier's Disease (Keratosis Follicularis)", "Corps ronds and grains"],
["Subepithelial", "Mucous Membrane Pemphigoid (MMP)", "IgG at BMZ; Nikolsky -ve; scarring"],
["Subepithelial", "Bullous Pemphigoid", "IgG + C3 at BMZ; elderly; skin more than oral"],
["Subepithelial", "Epidermolysis Bullosa", "Trauma-induced; hereditary; oral scarring"],
["Subepithelial", "Linear IgA Disease", "IgA at BMZ; dapsone responsive"],
["Subepithelial", "Erythema Multiforme", "Target lesions; lip crusting; herpes/drug triggered"],
["Subepithelial", "Dermatitis Herpetiformis", "IgA at dermal papillae; gluten-sensitive"],
],
col_widths=[4.5*cm, 5*cm, 7*cm]
), sp()]
elems += [section_title("1.5 Classification of Salivary Gland Tumours (WHO)")]
elems += [make_table(
["Type", "Tumour", "Key Feature"],
[
["Benign", "Pleomorphic Adenoma (Mixed Tumour)", "Most common SG tumour; parotid; pseudocapsule; recurs"],
["Benign", "Monomorphic Adenoma", "Warthin's tumour (papillary cystadenoma lymphomatosum)"],
["Benign", "Warthin's Tumour", "M>F; bilateral 10%; smokers; parotid; lymphoid stroma"],
["Benign", "Oncocytoma", "Oncocytes (mitochondria-rich pink cells)"],
["Malignant", "Mucoepidermoid Carcinoma", "Most common malignant SG tumour; mucous + epidermoid cells"],
["Malignant", "Adenoid Cystic Carcinoma", "Cribriform (Swiss cheese) pattern; perineural invasion; slow"],
["Malignant", "Acinic Cell Carcinoma", "Serous acinar cells; parotid; good prognosis"],
["Malignant", "Carcinoma ex Pleomorphic Adenoma", "Malignant transformation of PA; sudden growth increase"],
["Malignant", "Polymorphous Adenocarcinoma", "Minor SG; palate; cytological uniformity, morphological diversity"],
],
col_widths=[3*cm, 5.5*cm, 8*cm]
), sp()]
elems += [section_title("1.6 TNM Staging of Oral Cancer (AJCC 8th Ed.)")]
elems += [make_table(
["Stage", "Criteria"],
[
["T1", "Tumor ≤2 cm, DOI ≤5 mm"],
["T2", "Tumor ≤2 cm, DOI >5 mm but ≤10 mm; OR tumor 2-4 cm, DOI ≤10 mm"],
["T3", "Tumor >4 cm; OR any tumor with DOI >10 mm"],
["T4a", "Moderately advanced: cortical bone, inferior alveolar nerve, floor of mouth, skin"],
["T4b", "Very advanced: masticator space, pterygoid plates, skull base, carotid artery"],
["N0", "No regional lymph node metastasis"],
["N1", "Single ipsilateral node ≤3 cm, ENE-"],
["N2a", "Single ipsilateral node >3 cm but ≤6 cm, ENE-"],
["N2b", "Multiple ipsilateral nodes, none >6 cm, ENE-"],
["N2c", "Bilateral or contralateral nodes, none >6 cm, ENE-"],
["N3a", "Lymph node >6 cm, ENE-"],
["N3b", "Any node, ENE+"],
["M0/M1", "No distant metastasis / Distant metastasis present"],
],
col_widths=[2.5*cm, 14*cm]
), sp()]
elems.append(PageBreak())
# ─ 2. ORAL SURGERY ────────────────────────────────────────────────────────
elems += [sp(0.3), subject_box("2. ORAL & MAXILLOFACIAL SURGERY"), sp(0.3)]
elems += [section_title("2.1 Classification of Cleft Lip & Palate (Veau)")]
elems += [make_table(
["Veau Class", "Description"],
[
["Class I", "Cleft of soft palate only"],
["Class II", "Cleft of soft and hard palate up to incisive foramen"],
["Class III", "Complete unilateral cleft of soft palate, hard palate, and lip (unilateral)"],
["Class IV", "Complete bilateral cleft involving lip and palate bilaterally"],
],
col_widths=[3*cm, 13.5*cm]
), sp()]
elems += [section_title("2.2 Classification of Jaw Fractures")]
elems += [make_table(
["Classification", "Types / Subtypes", "Notes"],
[
["By Cause", "Direct / Indirect / Pathological", "Pathological = pre-existing disease"],
["By Skin/Mucosa", "Simple (Closed) / Compound (Open) / Comminuted", "Compound = communication with external/oral environment"],
["By Displacement", "Favorable / Unfavorable", "Muscle pull determines direction"],
["Rowe & Killey (Mandible)", "Without muscle attachment / With muscle attachment", "Classic surgical classification"],
["Lefort I", "Horizontal fracture above teeth", "Floating palate"],
["Lefort II", "Pyramidal fracture", "Floating maxilla"],
["Lefort III", "Craniofacial dysjunction", "Separation of facial bones from cranium"],
["Condylar (Lindqvist)", "Intracapsular / Subcondylar / Condylar neck", "Based on anatomical level"],
["Zygomatic (Knight & North)", "6 types; Type I-VI", "Based on displacement and comminution"],
],
col_widths=[4*cm, 6.5*cm, 6*cm]
), sp()]
elems += [section_title("2.3 Classification of Impacted Teeth (Pell & Gregory + Winter)")]
elems += [make_table(
["System", "Class / Type", "Description"],
[
["Pell & Gregory - Class", "Class I", "Space between ant. border of ramus & distal of 2nd molar ≥ M-D width of 3rd molar"],
["Pell & Gregory - Class", "Class II", "Space < M-D width of crown of 3rd molar"],
["Pell & Gregory - Class", "Class III", "3rd molar fully within ramus"],
["Pell & Gregory - Depth", "Position A", "Occlusal surface at or above occlusal plane of 2nd molar"],
["Pell & Gregory - Depth", "Position B", "Occlusal surface between occlusal plane and cervical line of 2nd molar"],
["Pell & Gregory - Depth", "Position C", "Occlusal surface below cervical line of 2nd molar"],
["Winter's Classification", "Vertical", "Most common; easiest to remove"],
["Winter's Classification", "Horizontal", "2nd most common; difficult"],
["Winter's Classification", "Mesioangular", "Most common angulation overall; moderate difficulty"],
["Winter's Classification", "Distoangular", "Most difficult; ramus limits access"],
["Winter's Classification", "Transverse", "Horizontal in buccolingual plane"],
["Winter's Classification", "Inverted", "Crown pointing down; rare"],
],
col_widths=[4.5*cm, 3.5*cm, 8.5*cm]
), sp()]
elems += [section_title("2.4 Classification of Neck Dissection (AAO-HNS)")]
elems += [make_table(
["Type", "Lymph Node Levels Removed", "Structures Preserved"],
[
["Radical Neck Dissection (RND)", "Levels I-V", "SCM, IJV, CN XI all removed"],
["Modified Radical (MRND)", "Levels I-V", "One or more of: SCM / IJV / CN XI preserved"],
["Selective Neck Dissection", "Selected levels based on primary site", "SCM, IJV, CN XI all preserved"],
["- Supraomohyoid", "Levels I, II, III", "Oral cavity primary"],
["- Posterolateral", "Levels II, III, IV, V", "Posterior scalp/neck primary"],
["- Lateral", "Levels II, III, IV", "Laryngeal/pharyngeal primary"],
["- Anterior Compartment", "Level VI", "Thyroid, subglottic primary"],
["Extended Neck Dissection", "Levels I-V + additional structures", "Removes structures not in standard RND"],
],
col_widths=[5*cm, 5.5*cm, 6*cm]
), sp()]
elems += [section_title("2.5 Classification of Local Anaesthetics")]
elems += [make_table(
["Class", "Agent", "Key Points"],
[
["Ester (PABA derivatives)", "Procaine (Novocaine)", "First synthetic LA; hydrolysed by plasma pseudocholinesterase"],
["Ester", "Benzocaine", "Used only topically; poor water solubility"],
["Ester", "Tetracaine (Amethocaine)", "High potency; topical + spinal"],
["Amide", "Lidocaine (Lignocaine)", "Most widely used; gold standard; 2% with 1:80,000 adrenaline"],
["Amide", "Bupivacaine", "Longest acting; cardiotoxic; post-op pain control"],
["Amide", "Articaine", "Only amide with thiophene ring; crosses membranes well; popular in dentistry"],
["Amide", "Prilocaine", "Least vasodilatation; methemoglobinemia risk"],
["Amide", "Mepivacaine", "3% plain (no vasoconstrictor); good for hypertensive patients"],
["Amide", "Ropivacaine", "Less cardiotoxic than bupivacaine; long acting"],
],
col_widths=[4*cm, 4*cm, 8.5*cm]
), sp()]
elems.append(PageBreak())
# ─ 3. DENTAL MATERIALS ────────────────────────────────────────────────────
elems += [sp(0.3), subject_box("3. DENTAL MATERIALS"), sp(0.3)]
elems += [section_title("3.1 Classification of Dental Cements")]
elems += [make_table(
["Cement", "Type", "Key Use / Property"],
[
["Zinc Phosphate", "Acid-Base reaction", "Oldest luting cement; exothermic; no adhesion; pulp protection needed"],
["Zinc Oxide Eugenol (ZOE)", "Chelation reaction", "Sedative; antifungal; inhibits composite polymerization"],
["Zinc Polycarboxylate", "Acid-Base + chelation", "First truly adhesive cement; bonds to tooth structure"],
["Glass Ionomer (GIC)", "Acid-Base reaction", "True adhesion; fluoride release; anticariogenic; moisture sensitive"],
["Resin-Modified GIC (RMGIC)", "Dual set: acid-base + light cure", "Better aesthetics; reduced moisture sensitivity"],
["Composite Resin Cement", "Free radical polymerization", "High strength; bonds porcelain/zirconia; needs etching + bonding"],
["Calcium Hydroxide", "Neutralisation", "Indirect/direct pulp capping; bactericidal; promotes secondary dentin"],
["MTA (Mineral Trioxide Aggregate)", "Hydraulic setting", "Pulpotomy; apexification; root perforation repair; biocompatible"],
["Resin-based sealant", "Light-cured resin", "Pit & fissure sealant; flowable BIS-GMA resin"],
],
col_widths=[4*cm, 3.5*cm, 9*cm]
), sp()]
elems += [section_title("3.2 Classification of Dental Impression Materials")]
elems += [make_table(
["Category", "Material", "Key Property"],
[
["Inelastic - Rigid", "Plaster of Paris", "Expansive setting; irreversible; accurate"],
["Inelastic - Rigid", "Zinc Oxide Eugenol Paste", "For edentulous; accurate; dimensionally stable"],
["Inelastic - Rigid", "Impression Compound (Composition)", "Thermoplastic; used for border molding; green stick"],
["Inelastic - Rigid", "Impression Wax", "Used in flasking; inaccurate for fine detail"],
["Inelastic - Non-rigid", "Impression Plaster", "Mucostatic; breaks on removal from undercuts"],
["Elastic - Irreversible", "Alginate (Irreversible Hydrocolloid)", "Most commonly used; poured immediately; syneresis + imbibition"],
["Elastic - Reversible", "Agar (Reversible Hydrocolloid)", "Most accurate elastic; requires special trays; thermoreversible"],
["Elastic - Non-aqueous", "Polysulfide (Mercaptan)", "Longest working time; strong smell; excellent detail"],
["Elastic - Non-aqueous", "Polyether", "Stiff; most hydrophilic; accurate; single-phase possible"],
["Elastic - Non-aqueous", "Polyvinyl Siloxane (PVS / Addition Silicone)", "Best dimensional stability; most popular for crown & bridge"],
["Elastic - Non-aqueous", "Condensation Silicone", "Less accurate than addition; shrinks on storage"],
],
col_widths=[4*cm, 5*cm, 7.5*cm]
), sp()]
elems += [section_title("3.3 Classification of Dental Alloys / Casting Alloys")]
elems += [make_table(
["Class (ADA)", "Gold Content", "Examples / Use"],
[
["Type I (Soft)", ">83% Au equivalent", "Inlays; minimal stress; Class I & II restorations"],
["Type II (Medium)", ">78% Au equivalent", "Inlays & onlays; moderate stress"],
["Type III (Hard)", ">78% Au equivalent", "Crowns, thin castings, clasps"],
["Type IV (Extra Hard)", ">75% Au equivalent", "Partial denture frameworks; max strength needed"],
["Base Metal Alloys", "Ni-Cr, Co-Cr", "Cheaper; harder; higher fusing temp; porcelain-fused-to-metal"],
["Titanium alloys", "Pure Ti / Ti-6Al-4V", "Implants; excellent biocompatibility"],
],
col_widths=[4*cm, 3.5*cm, 9*cm]
), sp()]
elems += [section_title("3.4 Classification of Dental Composites")]
elems += [make_table(
["By Filler Particle Size", "Type", "Use"],
[
["Macrofilled (Traditional)", "Irregular quartz 8-12 µm", "High strength; poor polish; posterior use"],
["Microfilled", "Colloidal silica 0.04 µm", "Excellent polish; anterior aesthetics; low strength"],
["Hybrid", "Mixed filler; 1-10 µm + microfill", "Good strength + aesthetics; most versatile"],
["Microhybrid", "0.4-1.0 µm", "Most popular; good balance"],
["Nanofilled", "5-100 nm particles", "Best polish + strength; universal use"],
["Nanohybrid", "Nano + larger particles", "Universal restoration; current standard"],
["Flowable Composite", "Low filler loading (~50%)", "Liners, pits & fissures, low-stress areas"],
["Packable (Condensable)", "High filler loading (~80%)", "Posterior Class I & II; high viscosity"],
],
col_widths=[5*cm, 5*cm, 6.5*cm]
), sp()]
elems += [section_title("3.5 Classification of Gypsum Products (ADA Spec. No. 25)")]
elems += [make_table(
["ADA Type", "Name", "W:P Ratio", "Compressive Strength", "Use"],
[
["Type I", "Impression Plaster", "0.60", "Low", "Impressions (mucostatic)"],
["Type II", "Model / Laboratory Plaster","0.45-0.50", "Moderate", "Diagnostic / study casts"],
["Type III", "Laboratory Stone (α-hemi)", "0.30", "High", "Working casts"],
["Type IV", "Die Stone (Improved)", "0.22", "Very High", "Die for crown & bridge"],
["Type V", "High-Strength/Expansion Die Stone", "0.18", "Highest", "Precision dies, hi-strength"],
],
col_widths=[2*cm, 5.5*cm, 2*cm, 3*cm, 4*cm]
), sp()]
elems.append(note("α-hemihydrate (stone) = autoclave method; β-hemihydrate (plaster) = open boiling method"))
elems += [section_title("3.6 Classification of Waxes in Dentistry")]
elems += [make_table(
["Category", "Wax", "Use"],
[
["Pattern Wax", "Inlay wax (Type I - hard; Type II - soft)", "Fabricating wax patterns for castings"],
["Pattern Wax", "Casting wax", "Partial denture frameworks"],
["Pattern Wax", "Baseplate wax", "Occlusal rims; record jaw relations"],
["Processing Wax", "Boxing wax", "Boxing impressions before pouring"],
["Processing Wax", "Sticky wax", "Temporary assembly of broken parts"],
["Processing Wax", "Utility wax", "Border molding; tray modification"],
["Impression Wax", "Corrective impression wax", "Wash impression of edentulous ridges"],
],
col_widths=[3.5*cm, 5.5*cm, 7.5*cm]
), sp()]
elems.append(PageBreak())
# ─ 4. ORTHODONTICS ────────────────────────────────────────────────────────
elems += [sp(0.3), subject_box("4. ORTHODONTICS & DENTOFACIAL ORTHOPEDICS"), sp(0.3)]
elems += [section_title("4.1 Angle's Classification of Malocclusion")]
elems += [make_table(
["Class", "Molar Relation", "Description"],
[
["Class I", "Mesial buccal cusp of upper 6 in buccal groove of lower 6", "Normal AP relation; crowding / spacing issues"],
["Class II Div 1","Mesial buccal cusp of upper 6 anterior to buccal groove of lower 6 + proclined upper incisors", "Overjet increased; 'buck teeth'"],
["Class II Div 2","Same molar as Div 1 + retroclined upper centrals; laterals proclined", "Deep overbite; maxillary laterals overlap centrals"],
["Class II Div 2 Sub","Unilateral Class II Div 2", "One side Class II; other side Class I"],
["Class III", "Mesial buccal cusp of upper 6 posterior to buccal groove of lower 6", "Anterior crossbite; mandibular prognathism"],
],
col_widths=[4*cm, 7*cm, 5.5*cm]
), sp()]
elems += [section_title("4.2 Skeletal (Jaw Relation) Classification")]
elems += [make_table(
["Class", "ANB Angle", "Description"],
[
["Skeletal Class I", "0°-4°", "Normal maxillomandibular relation"],
["Skeletal Class II", ">4°", "Maxillary prognathism or mandibular retrognathism"],
["Skeletal Class III", "<0°", "Mandibular prognathism or maxillary retrognathism"],
],
col_widths=[4*cm, 3*cm, 9.5*cm]
), sp()]
elems += [section_title("4.3 Classification of Anchorage (Moyers)")]
elems += [make_table(
["Type", "Description"],
[
["Simple Anchorage", "Force applied to the anchor unit directly"],
["Stationary Anchorage","Bodily movement resisted; most efficient (e.g., Nance, TPA)"],
["Reciprocal Anchorage","Equal and opposite forces; both teeth move equally"],
["Reinforced Anchorage","Additional teeth added to anchor unit"],
["Compound Anchorage", "More than two teeth as anchorage unit"],
["Extra-oral Anchorage","Forces from outside mouth (headgear)"],
["Muscular Anchorage", "Muscle forces used (lip bumper, oral screen)"],
["Cortical Anchorage", "Root moved into cortical bone; more resistance"],
["Skeletal Anchorage", "Miniscrews/miniplates; TADs (Temporary Anchorage Devices)"],
],
col_widths=[5*cm, 11.5*cm]
), sp()]
elems += [section_title("4.4 Classification of Space Analysis")]
elems += [make_table(
["Analysis", "Purpose / Method"],
[
["Moyers Mixed Dentition Analysis", "Uses lower permanent incisors to predict unerupted canine & premolars; 75th percentile used"],
["Tanaka-Johnston Analysis", "Simple formula method: Lower incisors/4 + 10.5 (upper); +11 (lower)"],
["Nance's Leeway Space", "Deciduous C+D+E > permanent 3+4+5; upper = 0.9 mm / side; lower = 1.7 mm / side"],
["Bolton's Analysis", "Tooth size discrepancy; anterior (1-3) and overall (1-6) ratios"],
["Pont's Index", "Relates arch width to sum of upper incisors; premolar and molar widths"],
["Carey's Analysis", "Arch length vs. sum of teeth widths; determines crowding / spacing"],
],
col_widths=[5.5*cm, 11*cm]
), sp()]
elems += [section_title("4.5 Classification of Skeletal Open Bite / Deep Bite")]
elems += [make_table(
["Type", "Class / Feature"],
[
["Anterior Open Bite", "Skeletal: vertical growth pattern; Mandibular plane angle >30°; Anterior-Inferior face height increased"],
["Anterior Open Bite", "Dental: habits (thumb sucking); tongue thrust"],
["Deep Bite", "Skeletal: horizontal growth; decreased LAFH; Class II Div 2 pattern"],
["Deep Bite", "Dental: over-eruption of anteriors or infra-eruption of posteriors"],
],
col_widths=[4*cm, 12.5*cm]
), sp()]
elems += [section_title("4.6 Key Cephalometric Norms (Quick Reference)")]
elems += [make_table(
["Measurement", "Normal Value", "Meaning if Increased / Decreased"],
[
["SNA", "82 ± 2°", "↑ = Maxillary prognathism; ↓ = Retrognathia"],
["SNB", "80 ± 2°", "↑ = Mandibular prognathism; ↓ = Retrognathia"],
["ANB", "2 ± 2°", "↑ = Class II; ↓ or neg = Class III"],
["SN-GoGn (MPA)", "32 ± 2°", "↑ = Hyperdivergent (open bite tendency); ↓ = Hypodivergent"],
["Y-axis", "59-66°", "↑ = Anterior lower face height excess"],
["U1 to NA (angle)", "22 ± 2°", "Upper incisor inclination to NA line"],
["L1 to NB (angle)", "25 ± 2°", "Lower incisor inclination to NB line"],
["Wits appraisal", "-1 to +1 mm", "AO-BO distance on occlusal plane; ↑ = Class II"],
["LAFH (S-Go/N-Me)", "62-65%", "Facial height index; < 62 = horizontal; >65 = vertical pattern"],
],
col_widths=[4*cm, 3*cm, 9.5*cm]
), sp()]
elems.append(PageBreak())
# ─ 5. PERIODONTICS ────────────────────────────────────────────────────────
elems += [sp(0.3), subject_box("5. PERIODONTICS"), sp(0.3)]
elems += [section_title("5.1 AAP/EFP Classification of Periodontal Diseases (2017)")]
elems += [make_table(
["Category", "Condition", "Key Feature"],
[
["Periodontal Health", "Clinical periodontal health", "No BOP, no attachment/bone loss"],
["Gingivitis", "Dental biofilm-induced gingivitis", "BOP present; no attachment loss; reversible"],
["Gingivitis", "Non-biofilm gingivitis (specific conditions)", "Viral, genetic, allergy, trauma-related"],
["Periodontitis", "Stage I (Mild)", "Interdental CAL 1-2 mm; RBL < 15% root; no tooth loss"],
["Periodontitis", "Stage II (Moderate)", "CAL 3-4 mm; RBL 15-33%"],
["Periodontitis", "Stage III (Severe)", "CAL ≥5 mm; RBL ≥33%; tooth loss due to periodontitis"],
["Periodontitis", "Stage IV (Very Severe)", "Stage III + masticatory dysfunction; ≥20 teeth remaining"],
["Periodontitis - Grade", "Grade A (Slow rate)", "No evidence of progression; <0.25 mm bone loss over 5 yrs"],
["Periodontitis - Grade", "Grade B (Moderate rate)", "Evidence of progression; <2.0 mm bone loss over 5 yrs"],
["Periodontitis - Grade", "Grade C (Rapid rate)", "≥2 mm bone loss over 5 yrs; heavy smoker or poorly controlled DM"],
["Necrotizing Diseases", "NUG / NUP / Necrotizing Stomatitis", "Papilla necrosis; pain; halitosis; pseudomembrane"],
["Peri-implant", "Peri-implant mucositis / Peri-implantitis", "Around implants; BOP + bone loss = peri-implantitis"],
],
col_widths=[4*cm, 5*cm, 7.5*cm]
), sp()]
elems += [section_title("5.2 Miller's Classification of Gingival Recession")]
elems += [make_table(
["Class", "Description", "Root Coverage Prognosis"],
[
["Class I", "Marginal tissue recession not extending to MGJ; no loss of interdental bone/tissue", "100% root coverage possible"],
["Class II", "Recession extending to or beyond MGJ; no interdental bone/tissue loss", "100% root coverage possible"],
["Class III", "Recession to or beyond MGJ; interdental bone/tissue loss or tooth malpositioning", "Partial root coverage expected"],
["Class IV", "Recession beyond MGJ; severe interdental bone loss and/or severe malpositioning", "No root coverage possible"],
],
col_widths=[2.5*cm, 9*cm, 5*cm]
), sp()]
elems += [section_title("5.3 Furcation Classification (Glickman / Hamp)")]
elems += [make_table(
["System", "Grade / Class", "Description"],
[
["Glickman", "Grade I", "Incipient; pocket extends into furcation area; no horizontal loss"],
["Glickman", "Grade II", "Cul-de-sac; horizontal bone loss but not through-and-through"],
["Glickman", "Grade III", "Through-and-through furcation involvement; covered by tissue"],
["Glickman", "Grade IV", "Through-and-through; open to clinical view"],
["Hamp et al.", "Class F1", "Horizontal loss <1/3 of tooth width"],
["Hamp et al.", "Class F2", "Horizontal loss >1/3 but not through-and-through"],
["Hamp et al.", "Class F3", "Through-and-through furcation involvement"],
],
col_widths=[3*cm, 2.5*cm, 11*cm]
), sp()]
elems.append(PageBreak())
# ─ 6. CONSERVATIVE DENTISTRY & ENDODONTICS ────────────────────────────────
elems += [sp(0.3), subject_box("6. CONSERVATIVE DENTISTRY & ENDODONTICS"), sp(0.3)]
elems += [section_title("6.1 G.V. Black's Classification of Carious Lesions")]
elems += [make_table(
["Class", "Site of Cavity", "Teeth Involved"],
[
["Class I", "Pits & fissures: occlusal surfaces, buccal/lingual pits", "Posteriors; buccal pit of lower molars; palatal pit of upper molars"],
["Class II", "Proximal surfaces of posterior teeth", "Premolars & Molars"],
["Class III", "Proximal surfaces of anteriors (NOT involving incisal angle)", "Incisors & Canines"],
["Class IV", "Proximal surfaces of anteriors (INCLUDING incisal angle)", "Incisors & Canines"],
["Class V", "Gingival third of facial or lingual surfaces", "All teeth"],
["Class VI", "Incisal edges / cusp tips (not by GV Black; added by Mount)", "All teeth; attrition lesions"],
],
col_widths=[2*cm, 7*cm, 7.5*cm]
), sp()]
elems += [section_title("6.2 Classification of Pulp Diseases (AAE)")]
elems += [make_table(
["Diagnosis", "Symptoms / Features", "Treatment"],
[
["Normal Pulp", "No spontaneous pain; transient mild pain; normal response to tests", "None"],
["Reversible Pulpitis", "Sharp pain; disappears when stimulus removed", "Remove irritant; seal"],
["Irreversible Pulpitis (Symptomatic)", "Lingering pain after stimulus; spontaneous; sharp to dull", "Root canal treatment"],
["Irreversible Pulpitis (Asymptomatic)","No symptoms; detected on X-ray or accidentally", "Root canal treatment"],
["Pulp Necrosis", "Non-responsive to cold; may respond to heat", "Root canal treatment"],
["Previously Treated", "Tooth has RCT; previously treated pulp space", "Assess for re-treatment"],
["Previously Initiated", "Partial RCT done; pulpotomy", "Complete root canal"],
],
col_widths=[4*cm, 6.5*cm, 6*cm]
), sp()]
elems += [section_title("6.3 Classification of Root Resorption (Andreasen)")]
elems += [make_table(
["Type", "Subtype", "Cause / Feature"],
[
["External Resorption", "Surface resorption", "Self-limiting; repairable; minor trauma"],
["External Resorption", "Inflammatory resorption", "Bacteria in canal; progressive; treat RCT"],
["External Resorption", "Replacement resorption (Ankylosis)", "Trauma; PDL lost; bone fuses to root; high metallic percussion"],
["External Resorption", "Cervical resorption (Heithersay)", "Class I-IV; pink tooth; internal bleaching, trauma, ortho"],
["Internal Resorption", "Internal inflammatory", "Infected pulp; pink spot; treat RCT urgently"],
["Internal Resorption", "Internal replacement (substitution)", "Vital pulp replaces dentin with metaplastic bone"],
],
col_widths=[4*cm, 4.5*cm, 8*cm]
), sp()]
elems.append(PageBreak())
# ─ 7. PROSTHODONTICS ──────────────────────────────────────────────────────
elems += [sp(0.3), subject_box("7. PROSTHODONTICS & CROWN & BRIDGE"), sp(0.3)]
elems += [section_title("7.1 Kennedy's Classification of Partially Edentulous Arches")]
elems += [make_table(
["Class", "Description", "Extension Type"],
[
["Class I", "Bilateral edentulous area posterior to remaining teeth", "Bilateral distal extension (free end)"],
["Class II", "Unilateral edentulous area posterior to remaining teeth", "Unilateral distal extension (free end)"],
["Class III", "Unilateral edentulous area with teeth on both sides", "Bounded saddle (tooth-supported)"],
["Class IV", "Single bilateral edentulous area anterior to remaining teeth", "Anterior bounded; cannot have modifications"],
],
col_widths=[2.5*cm, 7.5*cm, 6.5*cm]
), sp()]
elems.append(note("Applegate's rules: Class IV cannot have modifications. Posterior most edentulous area determines class. Modifications are counted by number of additional edentulous areas."))
elems.append(sp())
elems += [section_title("7.2 Angle's Classification of Occlusion (in Prosthodontics context)")]
elems += [make_table(
["Concept", "Description"],
[
["Centric Occlusion (CO)", "Maximum intercuspation of teeth; may not coincide with CR"],
["Centric Relation (CR)", "Most superior-anterior position of condyle in glenoid fossa; reproducible"],
["CR-CO Discrepancy", "Normal: 0-2 mm; clinically significant if >2 mm"],
["Balanced Occlusion", "Simultaneous contacts on both sides in eccentric movements; for complete dentures"],
["Canine-Protected Occlusion", "Canines guide lateral movements; posteriors disclude; natural dentition"],
["Group Function Occlusion", "Multiple posterior teeth share lateral guidance load"],
],
col_widths=[5*cm, 11.5*cm]
), sp()]
elems += [section_title("7.3 Classification of Complete Denture Impression Techniques")]
elems += [make_table(
["Technique", "Concept / Material"],
[
["Mucostatic (Passive)", "Records tissues at rest; plaster of Paris; Boucher's technique"],
["Mucocompressive (Pressure)","Displaces tissues; ZOE; records under function; Applegate"],
["Selective Pressure", "Pressure only on stress-bearing areas; rest areas mucostatically recorded"],
["Functional Impression", "Recorded under function; PVS wash or ZOE in custom tray"],
],
col_widths=[5*cm, 11.5*cm]
), sp()]
elems.append(PageBreak())
# ─ 8. PEDODONTICS ─────────────────────────────────────────────────────────
elems += [sp(0.3), subject_box("8. PEDODONTICS & PREVENTIVE DENTISTRY"), sp(0.3)]
elems += [section_title("8.1 Classification of Dental Caries in Children")]
elems += [make_table(
["System", "Class/Type", "Description"],
[
["ICDAS", "Code 0", "Sound tooth surface"],
["ICDAS", "Code 1", "First visual change in enamel (after air drying)"],
["ICDAS", "Code 2", "Distinct visual change in enamel (wet)"],
["ICDAS", "Code 3", "Localised enamel breakdown, no dentin visible"],
["ICDAS", "Code 4", "Underlying dark shadow from dentin"],
["ICDAS", "Code 5", "Distinct cavity with visible dentin"],
["ICDAS", "Code 6", "Extensive distinct cavity with visible dentin >1/2 surface"],
["ECC", "Early Childhood Caries", "Any carious lesion in child ≤71 months; includes S-ECC (severe ECC)"],
],
col_widths=[3*cm, 2.5*cm, 11*cm]
), sp()]
elems += [section_title("8.2 Eruption Sequence (Primary & Permanent Teeth)")]
elems += [make_table(
["Dentition", "Tooth", "Eruption Age"],
[
["Primary", "Lower central incisor", "6-8 months"],
["Primary", "Upper central incisor", "7-9 months"],
["Primary", "Upper lateral incisor", "8-11 months"],
["Primary", "Lower lateral incisor", "9-13 months"],
["Primary", "Upper & Lower 1st molar", "12-16 months"],
["Primary", "Upper & Lower canine", "16-22 months"],
["Primary", "Upper & Lower 2nd molar", "20-30 months"],
["Permanent", "Lower central incisor", "6-7 years"],
["Permanent", "Upper central incisor", "7-8 years"],
["Permanent", "Lower lateral incisor", "7-8 years"],
["Permanent", "Upper lateral incisor", "8-9 years"],
["Permanent", "Lower canine", "9-10 years"],
["Permanent", "Upper & Lower 1st premolar", "10-11 years"],
["Permanent", "Upper & Lower 2nd premolar", "11-12 years"],
["Permanent", "Upper canine", "11-12 years"],
["Permanent", "Upper & Lower 1st molar", "6-7 years (first permanent tooth)"],
["Permanent", "Upper & Lower 2nd molar", "12-13 years"],
["Permanent", "Third molar", "17-25 years"],
],
col_widths=[2.5*cm, 6.5*cm, 7.5*cm]
), sp()]
elems.append(PageBreak())
# ─ 9. PHARMACOLOGY ────────────────────────────────────────────────────────
elems += [sp(0.3), subject_box("9. PHARMACOLOGY (General & Dental)"), sp(0.3)]
elems += [section_title("9.1 Classification of Antibiotics Used in Dentistry")]
elems += [make_table(
["Class", "Drug", "Use in Dentistry"],
[
["Beta-Lactams - Penicillins", "Amoxicillin 500 mg TDS", "First-line for odontogenic infections; pre-med for IE prophylaxis"],
["Beta-Lactams - Penicillins", "Amoxicillin + Clavulanate", "Beta-lactamase producing organisms; severe infections"],
["Beta-Lactams - Cephalosporins","Cephalexin", "Penicillin allergy (non-anaphylactic); prophylaxis"],
["Nitroimidazoles", "Metronidazole 400 mg TDS", "Anaerobes; NUG; ANUG; combined with amoxicillin"],
["Macrolides", "Azithromycin 500 mg OD", "Penicillin-allergic patients; IE prophylaxis alternative"],
["Macrolides", "Clindamycin 600 mg", "IE prophylaxis in penicillin allergy; anaerobes; bone infections"],
["Tetracyclines", "Doxycycline 100 mg", "Periodontal adjunct; controlled delivery devices; ANUG"],
["Fluoroquinolones", "Ciprofloxacin", "Gram-negative coverage; osteomyelitis adjunct"],
],
col_widths=[4*cm, 4.5*cm, 8*cm]
), sp()]
elems += [section_title("9.2 Classification of NSAIDs")]
elems += [make_table(
["Generation/Class", "Drug", "Key Point"],
[
["Non-selective COX inhibitor", "Aspirin", "Irreversible COX inhibition; anti-platelet; Reye's syndrome in children"],
["Non-selective COX inhibitor", "Ibuprofen", "First-line dental analgesic; 400-600 mg TDS; best GI tolerability"],
["Non-selective COX inhibitor", "Diclofenac", "Good anti-inflammatory; common in dental practice"],
["Non-selective COX inhibitor", "Naproxen", "Long acting; twice daily dosing"],
["Selective COX-2 inhibitor", "Celecoxib", "GI-sparing; less anti-platelet effect"],
["Selective COX-2 inhibitor", "Etoricoxib", "Potent; less GI adverse effects; CV risk"],
["Paracetamol (non-NSAID)", "Paracetamol/Acetaminophen", "Analgesic/antipyretic; no anti-inflammatory; hepatotoxic OD"],
],
col_widths=[4.5*cm, 4*cm, 8*cm]
), sp()]
elems += [section_title("9.3 Emergency Drug Classification")]
elems += [make_table(
["Emergency", "Drug", "Dose / Route"],
[
["Anaphylaxis", "Epinephrine (Adrenaline)", "0.5 mg (0.5 mL of 1:1000) IM into thigh; repeat 5 min"],
["Anaphylaxis adjunct", "Antihistamine (Chlorphenamine)", "10 mg IV/IM after epinephrine"],
["Anaphylaxis adjunct", "Hydrocortisone", "200 mg IV/IM"],
["Angina", "GTN (Glyceryl Trinitrate)", "0.4 mg sublingual spray; repeat × 2 after 5 min"],
["Cardiac Arrest", "Epinephrine", "1 mg IV every 3-5 min during CPR"],
["Hypoglycaemia", "Glucose gel / 50% Dextrose", "Oral glucose gel if conscious; 50 mL 50% Dextrose IV if not"],
["Seizure", "Midazolam (buccal)", "10 mg buccal; diazepam 10 mg IV if available"],
["Asthma attack", "Salbutamol inhaler", "2-10 puffs with spacer; repeat 10-20 min"],
["Syncope (vasovagal)", "Oxygen + Trendelenburg", "Lay supine; elevate legs; no drug usually needed"],
],
col_widths=[4.5*cm, 4*cm, 8*cm]
), sp()]
elems.append(PageBreak())
# ─ 10. PUBLIC HEALTH DENTISTRY ────────────────────────────────────────────
elems += [sp(0.3), subject_box("10. PUBLIC HEALTH DENTISTRY (PHD)"), sp(0.3)]
elems += [section_title("10.1 WHO Oral Health Indices")]
elems += [make_table(
["Index", "Measures", "Formula / Scale"],
[
["DMFT/dmft", "Dental caries (permanent/primary)", "D+M+F teeth; population-level; 0 = best; higher = worse"],
["DMFS/dmfs", "Caries by surface", "D+M+F surfaces; max 128 (permanent)"],
["CPI (CPITN)", "Periodontal status", "0=healthy; 1=bleeding; 2=calculus; 3=4-5mm pocket; 4=≥6mm pocket"],
["OHI-S (Greene-Vermillion)", "Oral hygiene status", "DI-S + CI-S; 0-6 scale; 0 = excellent"],
["PHP (Patient Hygiene Performance)", "Patient plaque", "5 tooth surfaces scored; stained plaque"],
["Plaque Index (Silness & Loe)", "Plaque thickness", "0-3 per surface; 4 teeth assessed"],
["Gingival Index (Loe & Silness)", "Gingival inflammation","0=normal; 1=mild; 2=moderate (bleeding on probing); 3=severe spontaneous bleed"],
["Dean's Fluorosis Index", "Fluorosis severity", "0=normal to 4=severe; Community fluorosis index"],
["SIC Index", "Significant caries", "Average DMFT of the highest-caries third of population"],
],
col_widths=[4.5*cm, 4*cm, 8*cm]
), sp()]
elems += [section_title("10.2 Classification of Prevention Levels")]
elems += [make_table(
["Level", "Term", "Action"],
[
["Primordial Prevention", "Before risk factors develop", "Social/environmental change; healthy public policy"],
["Primary Prevention", "Before disease occurs", "Fluoridation; sealants; oral hygiene education; diet counselling"],
["Secondary Prevention", "Early detection + treatment", "Screening; early restoration; dental checkups"],
["Tertiary Prevention", "Limit disability", "Rehabilitation; dentures; implants after tooth loss"],
],
col_widths=[4.5*cm, 4.5*cm, 7.5*cm]
), sp()]
elems.append(PageBreak())
# ─ 11. GENERAL MEDICINE (Rank Makers) ─────────────────────────────────────
elems += [sp(0.3), subject_box("11. GENERAL MEDICINE - Key Classifications"), sp(0.3)]
elems += [section_title("11.1 WHO Classification of Hypertension (2023)")]
elems += [make_table(
["Category", "Systolic (mmHg)", "Diastolic (mmHg)"],
[
["Normal", "<120", "<80"],
["Elevated (Pre-HT)", "120-129", "<80"],
["Stage 1 Hypertension", "130-139", "80-89"],
["Stage 2 Hypertension", "≥140", "≥90"],
["Hypertensive Crisis", ">180", ">120"],
],
col_widths=[6*cm, 4*cm, 4*cm]
), sp()]
elems += [section_title("11.2 Diabetes Classification & Diagnostic Criteria (ADA)")]
elems += [make_table(
["Test", "Normal", "Pre-Diabetes", "Diabetes"],
[
["Fasting Plasma Glucose", "<100 mg/dL", "100-125 mg/dL", "≥126 mg/dL"],
["2h OGTT (75g)", "<140 mg/dL", "140-199 mg/dL", "≥200 mg/dL"],
["HbA1c", "<5.7%", "5.7-6.4%", "≥6.5%"],
["Random PG (symptomatic)", "-", "-", "≥200 mg/dL"],
],
col_widths=[5.5*cm, 3*cm, 4*cm, 4*cm]
), sp()]
elems += [section_title("11.3 Classification of Anaemia")]
elems += [make_table(
["By MCV", "Type", "Causes"],
[
["Microcytic (MCV<80)", "Iron Deficiency Anaemia", "Most common; angular cheilitis; Plummer-Vinson syndrome; koilonychia"],
["Microcytic (MCV<80)", "Thalassemia", "Genetic; high HbA2; Chipmunk facies"],
["Microcytic (MCV<80)", "Sideroblastic", "Ring sideroblasts; iron in mitochondria"],
["Normocytic (MCV 80-100)", "Aplastic Anaemia", "Pancytopenia; hypocellular marrow; petechiae"],
["Normocytic", "Haemolytic Anaemia", "Increased reticulocytes; elevated bilirubin"],
["Macrocytic (MCV>100)","Vitamin B12 Deficiency", "Glossitis; Hunter's glossitis; neurological symptoms"],
["Macrocytic", "Folate Deficiency", "No neurological signs; pregnancy, malnutrition"],
],
col_widths=[4*cm, 4*cm, 8.5*cm]
), sp()]
elems.append(PageBreak())
# ─ 12. RADIOLOGY ──────────────────────────────────────────────────────────
elems += [sp(0.3), subject_box("12. ORAL MEDICINE & RADIOLOGY"), sp(0.3)]
elems += [section_title("12.1 Classification of Radiographic Appearances of Jaw Lesions")]
elems += [make_table(
["Pattern", "Description", "Classic Lesions"],
[
["Unilocular Radiolucency", "Single well-defined luc area", "Periapical cyst, Dentigerous cyst, AOT"],
["Multilocular Radiolucency", "Multiple compartments; septa", "Ameloblastoma, Odontogenic Myxoma, CGCG, ABC"],
["Soap Bubble", "Large scalloped loculations", "Ameloblastoma, Odontogenic myxoma, CGCG"],
["Honeycomb", "Small loculations; fine trabeculae", "Odontogenic myxoma, Haemangioma"],
["Tennis Racket", "Right angle trabeculae", "Odontogenic Myxoma (pathognomonic)"],
["Ground Glass", "Granular; loss of trabecular pattern", "Fibrous Dysplasia"],
["Cotton Wool", "Mixed radiopaque fluffy masses", "Paget's Disease, Cemento-osseous dysplasia"],
["Sunburst / Sun-Ray", "Radiating spicules from bone", "Osteosarcoma"],
["Onion Skin", "Layered periosteal reaction", "Ewing's Sarcoma"],
["Codman's Triangle", "Elevated periosteum at tumour edge", "Osteosarcoma"],
["Driven Snow", "Calc. deposits scattered throughout", "CEOT (Pindborg tumour)"],
],
col_widths=[4.5*cm, 5*cm, 7*cm]
), sp()]
elems += [section_title("12.2 Angell's White Lesion Classification (WHO Modified)")]
elems += [make_table(
["Lesion", "Risk of Malignancy", "Key Feature"],
[
["Leukoplakia", "~5-17%", "White patch; cannot be scraped; not attributable to other cause"],
["Erythroplakia", "~51%", "Velvety red patch; highest malignant potential"],
["Erythroleukoplakia", ">30%", "Mixed red and white; speckled leukoplakia"],
["Oral Submucous Fibrosis", "~7-12%", "Fibrosis; trismus; burning; betel nut habit; India"],
["Oral Lichen Planus", "~1%", "Wickham's striae; reticular most common; erosive most symptomatic"],
["Actinic Cheilitis", "10-20%", "Lower lip; solar damage; dry scaly lip"],
],
col_widths=[4.5*cm, 3*cm, 9*cm]
), sp()]
elems.append(PageBreak())
# ─ 13. GENERAL ANATOMY ────────────────────────────────────────────────────
elems += [sp(0.3), subject_box("13. GENERAL ANATOMY - High Yield Classifications"), sp(0.3)]
elems += [section_title("13.1 Classification of Cranial Nerves")]
elems += [make_table(
["CN", "Name", "Type", "Key Function / Dental Relevance"],
[
["I", "Olfactory", "Sensory", "Smell"],
["II", "Optic", "Sensory", "Vision"],
["III", "Oculomotor", "Motor + Parasym", "Eye movement; pupil constriction"],
["IV", "Trochlear", "Motor", "Superior oblique (intorsion)"],
["V", "Trigeminal", "Mixed", "Main sensory nerve of face; motor to muscles of mastication"],
["V1", "Ophthalmic", "Sensory", "Forehead, cornea, nose"],
["V2", "Maxillary", "Sensory", "Maxillary teeth, palate, cheek"],
["V3", "Mandibular", "Mixed", "Mandibular teeth; tongue sensation; muscles of mastication"],
["VI", "Abducens", "Motor", "Lateral rectus"],
["VII", "Facial", "Mixed", "Motor to facial muscles; taste ant 2/3 tongue; submandibular + sublingual glands"],
["VIII","Vestibulocochlear","Sensory", "Hearing & balance"],
["IX", "Glossopharyngeal","Mixed", "Taste post 1/3 tongue; parotid gland; carotid sinus"],
["X", "Vagus", "Mixed", "Pharynx, larynx, viscera; depresses HR"],
["XI", "Accessory", "Motor", "SCM & trapezius"],
["XII", "Hypoglossal", "Motor", "All intrinsic + extrinsic tongue muscles (except palatoglossus = CN X)"],
],
col_widths=[1*cm, 4*cm, 2.5*cm, 9*cm]
), sp()]
elems += [section_title("13.2 Waldeyer's Ring - Components")]
elems += [make_table(
["Component", "Location"],
[
["Pharyngeal tonsil (Adenoids)", "Roof of nasopharynx"],
["Tubal tonsils (×2)", "Around Eustachian tube openings"],
["Palatine tonsils (×2)", "Between palatoglossal and palatopharyngeal arches (tonsillar fossa)"],
["Lingual tonsil", "Posterior dorsal surface of tongue (sulcus terminalis to epiglottis)"],
],
col_widths=[5.5*cm, 11*cm]
), sp()]
# ─ FINAL BACK PAGE / CLOSING ──────────────────────────────────────────────
elems.append(PageBreak())
elems += [
Spacer(1, 4*cm),
Paragraph("All the Best for NEET MDS!", sty("End1",
fontName="Helvetica-Bold", fontSize=28,
textColor=C_DARK_BLUE, alignment=TA_CENTER)),
Spacer(1, 0.5*cm),
Paragraph(
"This booklet covers 13 subjects with 40+ classification charts. "
"Revise one subject per day. Focus on bolded terms in each chart.",
sty("End2", fontName="Helvetica", fontSize=12,
textColor=C_TEXT, alignment=TA_CENTER, leading=18)),
Spacer(1, 1*cm),
HRFlowable(width="80%", thickness=1.5, color=C_GOLD, spaceAfter=10),
Paragraph(
"Tip: Cover the 'Description' column with a card and test yourself on each classification.",
sty("Tip", fontName="Helvetica-Oblique", fontSize=11,
textColor=C_ACCENT, alignment=TA_CENTER)),
]
return elems
# ── Document Build ─────────────────────────────────────────────────────────────
def main():
doc = BaseDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=1.5*cm, rightMargin=1.5*cm,
topMargin=1.5*cm, bottomMargin=1.2*cm,
title="NEET MDS Classification Charts",
author="Orris AI",
subject="NEET MDS Revision",
)
cover_frame = Frame(0, 0, A4[0], A4[1], id="cover")
body_frame = Frame(
doc.leftMargin, doc.bottomMargin + 0.6*cm,
doc.width, doc.height - 1.2*cm, id="body"
)
doc.addPageTemplates([
PageTemplate(id="Cover", frames=[cover_frame], onPage=cover_page),
PageTemplate(id="Body", frames=[body_frame], onPage=later_page),
])
story = build_content()
# Force switch to Body template after page 1
from reportlab.platypus import NextPageTemplate
story.insert(story.index(next(e for e in story if isinstance(e, PageBreak))), NextPageTemplate("Body"))
doc.build(story)
print(f"PDF saved to: {OUTPUT}")
if __name__ == "__main__":
main()