can u help me to prepare for neet mds

Asking for Preferences
Searching the Web

NEET MDS 2026 syllabus exam pattern high yield topics

Searching the Web

NEET MDS preparation strategy study plan best books 2025 2026

Reading Web Page

https://mdsprep.com/blog/the-most-important-topics-for-neet-…

Here is your complete NEET MDS preparation guide, built from scratch:

NEET MDS Complete Preparation Guide (Starting from Zero)


Exam Pattern at a Glance

FeatureDetails
Total Questions240 MCQs
Duration3 hours (2 PM - 5 PM)
Marking+4 correct, -1 wrong
ModeComputer-based
Part A100 questions (Basic Sciences)
Part B140 questions (Clinical / Dental subjects)

Understanding the Syllabus

Part A - Basic Sciences (100 Qs)

  • General Anatomy (including Embryology & Histology)
  • General Human Physiology & Biochemistry
  • Dental Anatomy, Embryology & Oral Histology
  • General Pathology & Microbiology
  • General & Dental Pharmacology & Therapeutics
  • General Medicine
  • General Surgery

Part B - Clinical / Dental Sciences (140 Qs)

  • 10 subjects x ~14 questions each:
    • Dental Materials
    • Oral Pathology & Oral Microbiology
    • Oral Medicine & Radiology (OMDR)
    • Pedodontics & Preventive Dentistry
    • Orthodontics & Dentofacial Orthopedics
    • Periodontology
    • Prosthodontics & Crown & Bridge
    • Conservative Dentistry & Endodontics
    • Oral & Maxillofacial Surgery
    • Public Health Dentistry (PHD)

Subject Priority Framework

PrioritySubjectsReason
High Yield (do first)Oral Pathology, OMDR, Dental Materials, EndodonticsHigh question density; concepts are clear and MCQ-friendly
Rank MakersGeneral Medicine, General Surgery, PharmacologyMany candidates neglect these - doing well here shoots up rank
FoundationAnatomy, Physiology, BiochemistryFocus only on must-know topics (cranial nerves, blood clotting, etc.)
Steady ScorersProsthodontics, Orthodontics, Periodontics, PedodonticsPredictable question patterns; follow PYQs
TrickyPublic Health Dentistry, Dental MaterialsDifficult but high scoring if memorized well

The High-Yield Topic Breakdown (Based on PYQ Trends)

Oral Pathology (Part B - Most Questions)

TopicQuestions Asked Historically
Benign & Malignant Tumours of Oral Cavity28
Diseases of Salivary Glands21
Odontogenic Cysts & Tumours20
Developmental Disturbances20
Diseases of Bones & Joints17
Viral Infections15
Skin & Vesiculobullous Lesions15

Periodontology

TopicQuestions Asked
Implants & Miscellaneous16
Acute Gingival Infections10
Gingiva & Tooth Supporting Structures8
Defense Mechanisms / Host Response7
Periodontal Microbiology7
Patterns of Bone Loss / Occlusal Trauma6

Oral Histology (Part of Dental Anatomy)

TopicQuestions
Salivary Glands7
Enamel7
Oral Mucous Membrane7
Bone, TMJ & Maxillary Sinus4
Dentin4

General Surgery (Rank Maker)

TopicQuestions
Swellings, Ulcers & Tumors of Head & Neck17
Transfusion, Shock, Burns & Wound Healing13
Diseases of Salivary & Thyroid Glands11
Cleft Lip & Palate7
Traumatology7

3-Phase Study Plan (For Beginners)

Phase 1 - Foundation + Heavy Hitters (Weeks 1-5)

Goal: Cover the highest-yield subjects first. Spend 70% theory + 30% MCQs per topic.
WeekFocus
Week 1Oral Pathology (tumours, cysts, infections)
Week 2Oral Pathology (bone diseases, vesiculobullous, salivary glands) + OMDR
Week 3Dental Materials (full subject - it's tricky but scorable)
Week 4Pharmacology (dental + general)
Week 5General Medicine + General Surgery

Phase 2 - Clinical Subjects + PYQ Integration (Weeks 6-10)

Goal: Cover remaining clinical subjects; shift to 50% theory / 50% MCQs.
WeekFocus
Week 6Conservative Dentistry & Endodontics
Week 7Prosthodontics & Crown & Bridge
Week 8Orthodontics + Pedodontics
Week 9Periodontics + Oral Surgery
Week 10Public Health Dentistry + Dental Histology

Phase 3 - Revision + Mock Tests (Weeks 11-14+)

Goal: No new topics. Rapid revision + full-length mocks.
  • Weeks 11-12: Rapid revision using short notes / charts / mnemonics. Focus on classifications (G.V. Black, TNM staging, Miller's classification, Angle's, etc.)
  • Weeks 13-14: One Grand Mock Test every 3 days. Analyze each mock the same day.

Daily Schedule (For Interns / Working Students - 6 Hours)

TimeActivity
6:00 AM - 8:00 AMHigh-yield theory (2 hours)
During breaks20-30 MCQs on phone
Evening 6 PM - 9 PMDeep study + PYQ solving (3 hours)
Night 30 minQuick review of the day's key facts
If you have more time (Full-time prep): Aim for 8-10 hours/day. Add an extra block in the afternoon for mock tests or weak subject revision.

Best Resources

Standard Books (Subject-wise)

SubjectRecommended Book
Oral PathologyShafer's Textbook of Oral Pathology
Oral Medicine & RadiologyBurket's Oral Medicine / Oral Radiology by Rajesh Mallya
Dental MaterialsAnusavice / Craig's Restorative Dental Materials
PeriodontologyCarranza's Clinical Periodontology
ProsthodonticsZarb & Bolender / Fenn, Liddelow & Gimson
OrthodonticsProffit's Contemporary Orthodontics
PharmacologyKD Tripathi (General) + Olak's Pharmacology in Dentistry
Oral SurgeryFragiskos (Oral Surgery) / Pattanaik
AnatomyB.D. Chaurasia (Head & Neck only)

MCQ / Prep Books

  • AIO (All India Oral) series by Thiruvenkadam - best for PYQs
  • MERITERS App - highly rated for question bank + analytics
  • Amit Kohli / KD Tripathi MCQs - for pharmacology

Apps & Online Resources

  • MERITERS - question bank, high-yield notes, mock tests
  • Dental Decks - flashcard-style review
  • Last 5-7 years NEET MDS + INICET + AIIMS PG papers (solve all of them)

The Mistake Notebook Strategy

Every time you get a mock question wrong, do NOT just note the answer. Write down:
  1. The concept behind it
  2. Why you were wrong (lack of knowledge vs. confusion vs. silly mistake)
  3. The classification/value/fact to remember
This notebook becomes your most powerful last-minute revision tool.

Key Things to Memorize (High-Frequency Facts)

  • Classifications - G.V. Black (caries), Angle's (malocclusion), Miller's (recession), Kennedy (partial edentulism), TNM staging
  • Normal values - bone loss rates, pocket depths, normal lab values (Hb, WBC, PT/INR)
  • Drug doses - local anesthetics, antibiotics, emergency drugs
  • Radiographic features - of cysts, tumors, bone diseases
  • Histological features - of various lesions (soap bubble, onion skin, sun-ray appearance)
  • Instruments - names, uses, angulations

Common Mistakes to Avoid

  1. Reading textbooks cover to cover - use synopsis/notes for MCQ prep, not full texts
  2. Ignoring General Medicine & Surgery - these are rank-makers that most students skip
  3. No mock tests until the end - start mocks from Month 2 itself
  4. Not analyzing mocks - solving without review is wasted effort
  5. Spending too much time on low-yield topics - follow the 80/20 rule (80% questions from 20% syllabus)

Quick-Start Checklist (This Week)

  • Get the AIO/PYQ book and start with Oral Pathology
  • Download MERITERS (or similar app) for daily MCQs
  • Set up your Mistake Notebook
  • Collect last 5 years' NEET MDS question papers
  • Block your daily study hours in your calendar

We can now go deeper on any specific subject - I can help you with:
  • High-yield notes & mnemonics for any topic
  • MCQ practice with explanations
  • Subject-specific study plans (e.g., just Oral Path or Pharmacology)
  • Classification charts ready for revision
Just tell me which subject or topic you want to tackle first!

classification charts ready for revise

Asking for Preferences
Reading File
Running Command

mkdir -p /home/daytona/workspace/neet-mds-classifications

Writing File

~/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()
You've run out of free credits. Sign up for a free account to continue using Orris.
This is a shared conversation. Sign in to Orris to start your own chat.