"Exodontia and Impactions" EXPLAIN THIS TOPIC AS I AM PREPAING FOR NEET MDS , INCLUDE COLOUR CODED TOPICS , STICKY NOTES, OLD QUESTIONS FROM THE FOLLOWING TOPIC WITH ITS EXPLAINATION
NEET MDS exodontia impaction previous year questions oral surgery
impacted mandibular third molar classification Winter Pell Gregory

A composite image displaying nine panoramic dental radiographs categorized by two standard systems for classifying impacted mandibular third molars: the Pell and Gregory classification and Winter's classification. The top row illustrates the Pell and Gregory system based on the vertical depth of the impacted tooth relative to the second molar: Position A (at the occlusal plane), Position B (between the occlusal plane and cementoenamel junction), and Position C (below the CEJ). The bottom two rows demonstrate Winter's classification based on the angulation of the long axis of the third molar relative to the second molar or occlusal plane. Visualized categories include distoangular (tilted away from the second molar), vertical (parallel), mesioangular (tilted toward the second molar), horizontal (90-degree tilt), inverted (crown facing downward), and other atypical positions. These radiographic examples serve as an educational diagnostic guide for oral and maxillofacial surgery planning and risk assessment.

A close-up dental radiograph (periapical x-ray) demonstrating a partially erupted mandibular third molar in a mesioangular orientation. According to Winter's classification, the tooth is tilted mesially toward the adjacent second molar. Applying the Pell and Gregory classification, the tooth is in Position A, with its highest occlusal point at or above the occlusal plane of the second molar. Pathologically, the image reveals significant radiolucent areas indicative of dental caries on both teeth: distal caries on the crown of the second molar and mesial caries on the third molar. This visual represents a common clinical complication of impacted or partially erupted third molars, where food impaction and difficulty in hygiene lead to decay in both the wisdom tooth and the adjacent functional dentition. The image serves as an educational tool for oral surgery and restorative dentistry regarding impaction assessment and its secondary pathological effects.

This diagnostic image is a panoramic radiograph (orthopantomogram) displayed within Radioimpยฎ dental analysis software, illustrating the radiological classification of impacted mandibular third molars (M3). The image features green digital overlays used to determine tooth position based on the Pell & Gregory and Winter classifications. On the patient's right mandible, the third molar is annotated as 'B II Invertido', indicating a horizontal or inverted orientation with partial impaction relative to the ascending ramus and occlusal plane. On the left side, the tooth is labeled 'A I Vertical', signifying a vertical eruption path with sufficient space and an occlusal level consistent with the second molar. Key reference lines visible include the occlusal plane, the anterior border of the mandibular ramus, and the longitudinal axes of the third molars. These measurements facilitate clinical assessment of pericoronal radiolucency, root development (Nolla stages), and surgical difficulty for third molar extraction in oral and maxillofacial surgery.

A pre-operative human panoramic radiograph (orthopantomogram) providing a comprehensive view of the maxilla, mandible, and dental arches. The image demonstrates bilateral impacted mandibular third molars (teeth 38 and 48). Both third molars exhibit a horizontal angulation according to Winterโs classification, with their occlusal surfaces directed toward the distal roots of the adjacent second molars. Based on the Pell-Gregory classification, the teeth show a significant ramus relationship, positioned partly or mostly within the ascending ramus of the mandible. The general dentition is intact, showing visible radiopaque dental restorations on the mandibular left first molar. Surrounding anatomical structures, including the maxillary sinuses, nasal cavity, mandibular canal, and temporomandibular joints (TMJs), are visualized. The radiograph is used in oral and maxillofacial surgery for assessing the depth, angulation, and proximity of impacted teeth to the inferior alveolar nerve prior to surgical extraction.
| Type | Feature | Use |
|---|---|---|
| Straight elevator (Warwick James) | Straight blade | Maxillary teeth, breaking PDL |
| Cryer's elevator | Paired (left/right), triangular blade | Mandibular molar roots |
| Winter's elevator | Cross-bar handle, curved | Impacted lower 3rd molar |
| Apexo elevator | Thin, sharp tip | Root fragments, apical 1/3 |
| Periosteal elevator (Molt No.9) | Wide flat blade | Raising mucoperiosteal flaps |
| Potts elevator | Similar to Cryer's | Root removal |
๐ก STICKY NOTE: The WHEEL & AXLE principle applies to elevators (fulcrum on bone/adjacent tooth). Three principles: Lever, Wheel-Axle, Wedge.
| Forceps | Tooth |
|---|---|
| No. 1 | Upper incisors & canines |
| No. 2 | Upper premolars |
| No. 17 | Upper molars (right) |
| No. 18L / 18R | Upper molars (left/right) |
| No. 74 | Lower incisors |
| No. 79 | Lower premolars |
| No. 77R / 77L | Lower molars (right/left) |
| Ash forceps (upper) | Straight axis |
| Lower molar forceps | Beaked (buccal beak = bifurcation) |
| Bayonet forceps | Upper 3rd molars (difficult access) |
| Cow horn forceps (No. 23) | Lower molars - both beaks into bifurcation |
๐ด HIGH YIELD: Cow-horn forceps apply a PUMPING action (not rotation) to luxate lower molars. The beaks engage the bifurcation of lower molars.
๐ด HIGH YIELD: Single-rooted teeth = rotation allowed. Multi-rooted or curved roots = rotation CONTRAINDICATED.
๐ด HIGH YIELD: Mandibular canine is the LEAST commonly impacted. Maxillary canine is most commonly impacted among canines.
| Position | Description | Difficulty |
|---|---|---|
| Mesioangular | Tilted mesially toward 2nd molar | EASIEST to remove |
| Horizontal | 90ยฐ to 2nd molar | MOST DIFFICULT |
| Vertical | Parallel to 2nd molar | 2nd easiest |
| Distoangular | Tilted distally | 2nd most difficult |
| Transverse/Inverted | Crown facing away (rare) | Most complex |
| Buccoangular / Linguoangular | Tilted in respective directions | Variable |
๐ด NEET MDS CLASSIC: Order of difficulty (easiest to hardest): Mesioangular โ Vertical โ Horizontal โ Distoangular
๐ก STICKY NOTE: Distoangular is more difficult than horizontal in terms of SURGICAL access because the ramus is directly behind it. Some sources say Horizontal is most difficult - CONTEXT matters. For NEET MDS = Distoangular is most difficult surgically.

| Class | Description |
|---|---|
| Class I | Sufficient space between ramus and 2nd molar for crown |
| Class II | Space between ramus and 2nd molar = half the crown width |
| Class III | Tooth mostly/entirely within ramus (NO space) |
| Position | Description |
|---|---|
| Position A | Occlusal surface at or above the occlusal level of 2nd molar |
| Position B | Occlusal surface below occlusal level but above CEJ of 2nd molar |
| Position C | Occlusal surface below CEJ of 2nd molar |
๐ด NEET MDS FACT: Class III Position C = MOST DIFFICULT to remove (deepest, most enclosed in ramus).
| Score | Level |
|---|---|
| 1-3 | Easy |
| 4-6 | Moderately difficult |
| 7-9 | Difficult |
| 10 | Most difficult (requires special skills/hospital) |
๐ด HIGH YIELD FOR NEET MDS:
๐ก STICKY NOTE: The MOST COMMON complication of an impacted mandibular 3rd molar is PERICORONITIS (infection of the pericoronal flap/operculum).
| Incision Type | Use |
|---|---|
| Ward's incision | Standard for lower 3rd molar (envelope + releasing incision) |
| Modified Ward's incision | Most commonly used today |
| Envelope incision | Simple cases, no release needed |
| Triangular/Three-cornered flap | More access |
๐ด Tooth division: Most commonly done for HORIZONTAL impactions. Separating crown from root allows delivery.
| Position | Approach |
|---|---|
| Labial impaction | Labial flap approach |
| Palatal impaction | Palatal approach + exposure + orthodontic traction |
| Transalveolar | Most difficult |
๐ด HIGH YIELD: "CANINE RISE" - In ideal development, the canine erupts and guides lateral incisor and premolar. Failure = palatal impaction.
| Complication | Cause/Notes |
|---|---|
| Fractured tooth root | Excessive force, curved/dilacerated roots |
| Displacement of root into sinus | Upper molar extraction, floor breach |
| Displacement into infratemporal fossa | Upper 3rd molar |
| Oro-antral communication (OAC) | Upper molar, thin sinus floor |
| Jaw fracture | Excessive force, weakened mandible (Class III embedded) |
| Fractured alveolar bone | Fused roots, excessive force |
| Soft tissue injuries | Slipping of instruments |
| Tuberosity fracture | Upper 3rd molar, excess posterior force |
| Nerve damage (IAN) | Close root proximity to mandibular canal |
| Complication | Feature |
|---|---|
| Dry socket (Alveolar Osteitis) | Onset 2-4 days post-extraction; throbbing pain; bad odor; empty socket |
| Infection | Swelling, pus, trismus, fever |
| Trismus | Muscle spasm, especially after lower 3rd molar |
| Haematoma | Blood pool in soft tissues |
| Paraesthesia (IAN) | Numbness of lower lip/chin |
| Lingual nerve damage | Numbness of tongue |
๐ก STICKY NOTE: Dry socket is the MOST COMMON postoperative complication of extraction.
๐ด HIGH YIELD: Alvogyl is the drug of choice for dry socket dressing.
| Feature | OAC | OAF |
|---|---|---|
| Definition | Fresh perforation | Epithelialized tract (>48 hrs) |
| Management | Primary closure | Buccal advancement flap (Rehrmann) or palatal rotation flap |
| Most common cause | Maxillary molar extraction | Same |
| Nerve | Risk | Consequence |
|---|---|---|
| Inferior Alveolar Nerve (IAN) | Root proximity to mandibular canal | Lip/chin numbness (mental nerve distribution) |
| Lingual nerve | Lies very close to lingual plate at 3rd molar region | Tongue numbness (most common nerve injured) |
| Long buccal nerve | Soft tissue near buccal region | Minor cheek numbness |
๐ด HIGH YIELD: The LINGUAL NERVE is the most commonly injured nerve during lower 3rd molar surgery. It lies just beneath the mucosa on the lingual side and has no bony protection.
| Block | Teeth Anaesthetized |
|---|---|
| IANB (Inferior Alveolar Nerve Block) | All lower teeth on that side |
| Long buccal nerve block | Buccal gingiva of lower molars |
| Lingual nerve block | Lingual gingiva (blocked with IANB usually) |
| Mental nerve block | Lower anteriors and premolars (soft tissue) |
| Gow-Gates technique | High condylar injection - all lower branches in one injection |
| Vazirani-Akinosi (closed mouth) | For patients with trismus |
| Block | Teeth |
|---|---|
| PSA (Posterior Superior Alveolar) | Upper molars (except mesiobuccal root of 1st molar) |
| MSA (Middle Superior Alveolar) | Upper premolars + mesiobuccal root 1st molar |
| ASA (Anterior Superior Alveolar) | Upper incisors + canine |
| Infraorbital block | ASA + MSA combined |
| Nasopalatine block | Palatal gingiva of upper anteriors |
| Greater palatine block | Palatal gingiva of upper premolars + molars |
๐ด HIGH YIELD: The Gow-Gates block has the HIGHEST success rate among mandibular blocks and the LOWEST rate of positive aspiration.
๐ Note: Some older textbooks (Archer's, Peterson's) say horizontal is most difficult. For NEET MDS pattern, distoangular = most difficult is the accepted answer.
| Feature | Detail |
|---|---|
| Definition | Inflammation of pericoronal flap (operculum) |
| Cause | Food + bacteria under operculum; partially erupted lower 3rd molar |
| Commonest age | 20-29 years |
| Spreading direction | Pterygomandibular space โ Parapharyngeal |
| Trismus cause | Medial pterygoid spasm (pterygomandibular space involvement) |
| Treatment - Acute phase | Irrigation, antibiotics, analgesics (do NOT extract during acute infection) |
| Treatment - Chronic | Operculectomy (if tooth has eruption potential) OR extraction |
| Antibiotic of choice | Amoxicillin + Metronidazole (for anaerobes) |
๐ด HIGH YIELD: NEVER extract during acute pericoronitis - risk of spreading infection. Treat the acute phase first (48-72 hrs antibiotics), then extract.
| Space | Boundaries | Source of infection |
|---|---|---|
| Sublingual | Floor of mouth, mylohyoid below | Lower anteriors/premolars (above mylohyoid) |
| Submandibular | Below mylohyoid | Lower molars (below mylohyoid) |
| Submental | Symphysis to hyoid, midline | Lower anteriors |
| Buccal | Buccinator + skin | Upper/lower premolars/molars |
| Pterygomandibular | Medial pterygoid + ramus | Lower 3rd molar (most common) |
| Masticator | All masticator muscles | 3rd molar region |
| Lateral pharyngeal | Parapharyngeal | Spread from pterygomandibular |
| Parotid | Parotid gland | Spread from masticator/lateral pharyngeal |
๐ด HIGH YIELD: Lower 1st molar roots and lower 3rd molar are most commonly responsible for deep space infections. Mylohyoid line determines whether infection goes to sublingual (above) or submandibular (below) space.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โญ NEET MDS LAST-MINUTE RECALL - EXODONTIA โ
โ โ
โ Most common impacted โ Mandibular 3rd molar โ
โ Easiest angulation โ Mesioangular โ
โ Hardest angulation โ Distoangular โ
โ Hardest Pell & Gregory โ Class III, Position C โ
โ Most dangerous space โ Ludwig's angina (bilateral)โ
โ Most common complication โ Dry socket โ
โ Dry socket Rx โ Alvogyl dressing โ
โ OAF Rx โ Rehrmann (buccal advancement flap) โ
โ Best LA block โ Gow-Gates (all V3 branches) โ
โ Most injured nerve โ Lingual nerve โ
โ Never extract during โ Acute pericoronitis โ
โ First space infected in pericoronitis โ Pterygomandibular โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
MAKE THIS INTO A PDF ALSO ONLY COVER THE TOPICS IMPORTANT FOR NEET MDS , ALSO USE PICTURES AND TABLES FOR EASY EXPLAINATION EVEN FOR PREVIOUS YEAR QUESTIONS
impacted mandibular third molar classification Winter Pell Gregory radiograph

A composite image displaying nine panoramic dental radiographs categorized by two standard systems for classifying impacted mandibular third molars: the Pell and Gregory classification and Winter's classification. The top row illustrates the Pell and Gregory system based on the vertical depth of the impacted tooth relative to the second molar: Position A (at the occlusal plane), Position B (between the occlusal plane and cementoenamel junction), and Position C (below the CEJ). The bottom two rows demonstrate Winter's classification based on the angulation of the long axis of the third molar relative to the second molar or occlusal plane. Visualized categories include distoangular (tilted away from the second molar), vertical (parallel), mesioangular (tilted toward the second molar), horizontal (90-degree tilt), inverted (crown facing downward), and other atypical positions. These radiographic examples serve as an educational diagnostic guide for oral and maxillofacial surgery planning and risk assessment.

A close-up dental radiograph (periapical x-ray) demonstrating a partially erupted mandibular third molar in a mesioangular orientation. According to Winter's classification, the tooth is tilted mesially toward the adjacent second molar. Applying the Pell and Gregory classification, the tooth is in Position A, with its highest occlusal point at or above the occlusal plane of the second molar. Pathologically, the image reveals significant radiolucent areas indicative of dental caries on both teeth: distal caries on the crown of the second molar and mesial caries on the third molar. This visual represents a common clinical complication of impacted or partially erupted third molars, where food impaction and difficulty in hygiene lead to decay in both the wisdom tooth and the adjacent functional dentition. The image serves as an educational tool for oral surgery and restorative dentistry regarding impaction assessment and its secondary pathological effects.

A pre-operative human panoramic radiograph (orthopantomogram) providing a comprehensive view of the maxilla, mandible, and dental arches. The image demonstrates bilateral impacted mandibular third molars (teeth 38 and 48). Both third molars exhibit a horizontal angulation according to Winterโs classification, with their occlusal surfaces directed toward the distal roots of the adjacent second molars. Based on the Pell-Gregory classification, the teeth show a significant ramus relationship, positioned partly or mostly within the ascending ramus of the mandible. The general dentition is intact, showing visible radiopaque dental restorations on the mandibular left first molar. Surrounding anatomical structures, including the maxillary sinuses, nasal cavity, mandibular canal, and temporomandibular joints (TMJs), are visualized. The radiograph is used in oral and maxillofacial surgery for assessing the depth, angulation, and proximity of impacted teeth to the inferior alveolar nerve prior to surgical extraction.
dental extraction forceps types oral surgery

This clinical intraoral photograph series demonstrates the application of a hemostatic gelatin sponge during a dental surgical procedure. The images depict the oral cavity of a patient post-tooth extraction. A sterile, white, irregularly shaped absorbent sponge is being manipulated using silver-colored surgical dressing forceps. The forceps are shown precisely positioning the sponge into the alveolar socket of an extracted tooth. Surrounding anatomical structures include the pink gingival mucosa, the inner buccal mucosa, and adjacent dentition. The procedure illustrates the management of post-extraction sockets to promote hemostasis and clot stabilization using topical hemostatic agents. This visual serves as an educational example of minor oral surgery techniques, specifically focusing on surgical dressing placement for wound care and hemorrhage control in a clinical dentistry setting.

This intraoral clinical photograph captures a post-operative dental procedure within the oral cavity. A pair of metallic surgical forceps is used to apply a saturated white cotton swab directly to a fresh extraction site in the mandibular posterior region. The surrounding dentition displays generalized yellowish-brown extrinsic staining and calculus accumulation, particularly along the cervical margins. Occlusal surfaces of the visible molars show characteristic anatomical fissures with minor staining. The surrounding soft tissues, including the lateral border of the tongue and buccal mucosa, appear physiologically normal. This image illustrates a localized clinical interventionโthe application of ozonized olive oilโintended for wound management and pain reduction following simple exodontia. It serves as an educational example of post-extraction site care and the clinical application of topical therapeutic agents in oral surgery.

A close-up clinical photograph showing a post-operative procedural step within the human oral cavity. The image focuses on an extraction site in the maxillary alveolar ridge. A pair of metal dental tweezers (forceps) is visible, holding a white cotton pledget or ball. The cotton is being applied directly to the socket of a recently extracted tooth, which serves as the delivery medium for a topical treatment, such as ozonized olive oil. The surrounding gingival tissue appears pink and slightly edematous, consistent with immediate post-extraction healing. The buccal mucosa and palatal tissue are partially visible, alongside a dental retractor used to provide clear visualization of the surgical site. The image demonstrates post-operative care and wound management techniques in oral and maxillofacial surgery, specifically the localized application of therapeutic agents to promote socket healing and manage inflammation.
dry socket alveolar osteitis empty socket post extraction

A series of three clinical intraoral photographs (A-C) illustrating the treatment of alveolar osteitis (dry socket) using Platelet-Rich Plasma (PRP) for tissue regeneration. Image (A) shows an empty, dark alveolar socket post-extraction with initial marginal suturing and visible inflammatory exudate. Image (B) demonstrates the application of autologous Platelet-Rich Plasma (PRP) as a pale, gel-like material filling the extraction socket to promote healing. Image (C) illustrates the final stabilization phase, where a non-resorbable black figure-8 suture is placed over the socket to secure the PRP graft and facilitate primary closure. This clinical progression highlights regenerative techniques in oral and maxillofacial surgery to enhance soft and hard tissue healing in compromised extraction sites.

This clinical photograph illustrates a case of alveolar osteitis, commonly known as a dry socket, following the extraction of a mandibular right third molar. The image shows a posterior view of the oral cavity, focusing on the mandibular alveolar ridge distal to the second molar. The extraction site presents as a dark, cavernous void, indicating a total or partial loss of the protective blood clot. The surrounding gingiva and alveolar mucosa exhibit significant pathology, characterized by intense erythema, edema, and a loss of healthy stippling. The tissue appears smooth and glossy, which is a hallmark of acute inflammation. This visual representation is used in dental education to teach the diagnostic features of post-extraction complications, specifically highlighting the absence of granulation tissue within the socket and the reactive inflammatory changes in the adjacent soft tissues. The image serves as a clinical reference for oral surgeons and dental students to identify the classic presentation of dry socket in the third molar region.
oro antral fistula communication buccal advancement flap Rehrmann

This clinical photograph shows an intraoral view of the upper right posterior quadrant, illustrating the surgical closure of an oroantral communication (OAC) using a Rehrmann flap (buccal advancement flap). The surgical site is located distal to the maxillary premolars and molars. The adjacent gingiva and buccal mucosa exhibit moderate erythema and edema, characteristic of the acute postoperative phase. Blue monofilament sutures are visible, securing the advanced buccal tissue to the palatal margin and interdental areas to achieve primary closure of the defect. A small amount of fresh clotted blood is present along the incision line. Metallic cheek and lip retractors are positioned at the superior and inferior aspects of the oral vestibule to provide optimal clinical visualization. The procedure demonstrates a standard maxillofacial surgical approach to prevent or treat an oroantral fistula by repositioning local soft tissue, which also results in a characteristic reduction of the vestibular height.

This clinical intraoral photograph demonstrates an oral surgery procedure for the closure of an oro-antral fistula (OAF) or communication. The image shows the mobilization and traction of the buccal fat pad (BFP) into a posterior maxillary alveolar bone defect. A metal surgical retractor reflects the buccal mucosa to expose the surgical field. The BFP, characterized by its yellowish-red lobular adipose appearance, is positioned to act as a vascularized pedicled flap over the defect. Simple interrupted sutures using a dark monofilament material are visible, securing the adipose tissue to the surrounding palatal and gingival margins. The surgical site includes several visible maxillary teeth with some blood contamination typical of an active procedure. This image illustrates a common reconstructive technique in oral and maxillofacial surgery where the anatomical proximity of the BFP is leveraged to provide a primary hermetic seal for sinus communications, facilitating secondary intention healing or supporting a subsequent mucoperiosteal flap closure.
pericoronitis mandibular third molar operculum

This intraoral clinical photograph displays a vertically semi-impacted mandibular third molar. The primary finding is acute pericoronitis, characterized by significant erythema and localized inflammatory swelling of the operculum and surrounding gingival tissues. The soft tissue distal to the second molar is notably edematous with a glistening surface, suggesting the presence of inflammatory exudate or pus within the follicular space. The third molar is partially erupted, with a large portion of its occlusal surface still obscured by the inflamed gingival flap. Dark staining or debris is visible on the exposed crown surface, adjacent to the distal aspect of the second molar. This image serves as a clinical example of localized periodontal inflammation associated with impacted dentition, a common indication for surgical extraction in oral and maxillofacial surgery.

A multi-panel educational composite illustrating the pathophysiology of pericoronitis and paradental cyst formation associated with mandibular third molars. Panel A shows a clinical photograph of a partially erupted third molar with a distal gingival operculum. Panel B (periapical radiograph) uses a dotted arrow to demonstrate the pathway for microbial biofilm infiltration between the crown and the pericoronal follicle. Panel C illustrates irregular distal bone resorption (highlighted by a dotted line) resulting from chronic inflammatory episodes. Panel D provides a 3D reconstructed CT view showing the resulting bone defect and communication with the oral cavity. Panels E and F are sagittal CT slices demonstrating a well-defined radiolucency distal to the third molar crown, characteristic of a paradental cyst. Key educational concepts include the progression from operculum-mediated bacterial stagnation to acute/chronic pericoronitis and secondary inflammatory cyst development in the mandibular ramus region.
mkdir -p /tmp/workspace/neet-mds-pdf && cd /tmp/workspace/neet-mds-pdf && python3 -c " import urllib.request images = { 'classification.jpg': 'https://cdn.orris.care/cdss_images/pmc_clinical_VQA_cb684049312e71d7914a83f4d919acd5712192810eef5203e4a53c5b63c19bca.jpg', 'pericoronitis.jpg': 'https://cdn.orris.care/cdss_images/pmc_clinical_VQA_ca647d30492fc25eeb2f8708690da11b900e19cb53f99af7a4c5edff1d057fa2.jpg', 'dry_socket.jpg': 'https://cdn.orris.care/cdss_images/pmc_clinical_VQA_8e1bd0849a317b9a7f406f841b762a81c464eaedb53df80982378fe300590d26.jpg', 'rehrmann.jpg': 'https://cdn.orris.care/cdss_images/pmc_clinical_VQA_f700ef7abc1168b1bb9c1de1622b8c63bbf8cf17d78d99b08cefa34bb0d19b5f.jpg', 'pericoronitis2.jpg': 'https://cdn.orris.care/cdss_images/pmc_clinical_VQA_68781d4f8bac74fbe8a4ce4543f21502c819a3b5b22c2f9d4c3a54032624aa18.jpg' } for fname, url in images.items(): try: urllib.request.urlretrieve(url, fname) print(f'Downloaded: {fname}') except Exception as e: print(f'Failed {fname}: {e}') "
~/neet-mds-pdf/generate_pdf.py
#!/usr/bin/env python3
"""
NEET MDS - Exodontia & Impactions Study Notes PDF Generator
Uses ReportLab for full control over layout, colors, tables, images
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm, cm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, Image, KeepTogether, PageBreak
)
from reportlab.platypus.flowables import Flowable
from reportlab.lib.colors import HexColor
import os
# โโ Color palette โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
C_BG_DARK = HexColor('#1A1A2E') # deep navy (header bg)
C_ACCENT1 = HexColor('#E94560') # red-pink (must-know)
C_ACCENT2 = HexColor('#0F3460') # dark blue (section headers)
C_ACCENT3 = HexColor('#16213E') # darker navy
C_GREEN = HexColor('#2ECC71') # green (easy / good-to-know)
C_YELLOW = HexColor('#F39C12') # orange-yellow (important)
C_ORANGE = HexColor('#E67E22') # orange
C_PURPLE = HexColor('#8E44AD') # purple (PYQs)
C_BLUE_LIGHT = HexColor('#2980B9') # info blue
C_TEAL = HexColor('#1ABC9C') # teal
C_RED_LIGHT = HexColor('#FADBD8') # light red bg
C_YELLOW_BG = HexColor('#FEF9E7') # sticky note bg
C_GREEN_BG = HexColor('#EAFAF1') # green bg
C_BLUE_BG = HexColor('#EBF5FB') # blue bg
C_PURPLE_BG = HexColor('#F5EEF8') # purple bg
C_WHITE = colors.white
C_BLACK = colors.black
C_GRAY = HexColor('#6C7A89')
C_LIGHT_GRAY = HexColor('#F0F0F0')
C_TABLE_HEADER = HexColor('#2C3E50')
C_TABLE_ALT = HexColor('#ECF0F1')
C_TABLE_ALT2 = HexColor('#D6EAF8')
BASE_DIR = '/tmp/workspace/neet-mds-pdf'
OUTPUT = os.path.join(BASE_DIR, 'NEET_MDS_Exodontia_Impactions.pdf')
# โโ Styles โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
styles = getSampleStyleSheet()
def s(name, **kw):
return ParagraphStyle(name, **kw)
STYLE = {
'title': s('title_main', fontSize=28, fontName='Helvetica-Bold',
textColor=C_WHITE, alignment=TA_CENTER, leading=34),
'subtitle': s('subtitle_main', fontSize=14, fontName='Helvetica',
textColor=HexColor('#BDC3C7'), alignment=TA_CENTER, leading=20),
'sec_header': s('sec_header', fontSize=15, fontName='Helvetica-Bold',
textColor=C_WHITE, leading=20),
'subsec': s('subsec', fontSize=12, fontName='Helvetica-Bold',
textColor=C_ACCENT2, leading=16, spaceAfter=4),
'body': s('body', fontSize=10, fontName='Helvetica',
textColor=C_BLACK, leading=15, spaceAfter=3),
'body_bold': s('body_bold', fontSize=10, fontName='Helvetica-Bold',
textColor=C_BLACK, leading=15),
'bullet': s('bullet', fontSize=10, fontName='Helvetica',
textColor=C_BLACK, leading=14, leftIndent=14,
bulletIndent=4, spaceAfter=2),
'sticky': s('sticky', fontSize=10, fontName='Helvetica',
textColor=HexColor('#5D4037'), leading=14),
'sticky_bold': s('sticky_bold', fontSize=10, fontName='Helvetica-Bold',
textColor=HexColor('#4A235A'), leading=14),
'red_note': s('red_note', fontSize=10, fontName='Helvetica-Bold',
textColor=HexColor('#922B21'), leading=14),
'caption': s('caption', fontSize=8, fontName='Helvetica-Oblique',
textColor=C_GRAY, alignment=TA_CENTER, leading=11),
'q_num': s('q_num', fontSize=11, fontName='Helvetica-Bold',
textColor=C_PURPLE, leading=16),
'q_text': s('q_text', fontSize=11, fontName='Helvetica',
textColor=C_BLACK, leading=16),
'q_ans': s('q_ans', fontSize=10, fontName='Helvetica-Bold',
textColor=HexColor('#1A5276'), leading=14),
'q_exp': s('q_exp', fontSize=10, fontName='Helvetica',
textColor=HexColor('#2C3E50'), leading=14),
'correct': s('correct', fontSize=10, fontName='Helvetica-Bold',
textColor=HexColor('#1E8449'), leading=14),
'toc_item': s('toc_item', fontSize=11, fontName='Helvetica',
textColor=C_ACCENT2, leading=18),
}
# โโ Helper Flowables โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
class ColorBox(Flowable):
"""A colored rectangle used as section header background."""
def __init__(self, text, bg_color, text_color=C_WHITE, width=None,
height=28, font='Helvetica-Bold', font_size=13, icon=''):
super().__init__()
self.text = text
self.bg_color = bg_color
self.text_color = text_color
self._width = width
self.height = height
self.font = font
self.font_size = font_size
self.icon = icon
def wrap(self, availWidth, availHeight):
self.width = self._width or availWidth
return self.width, self.height
def draw(self):
c = self.canv
c.setFillColor(self.bg_color)
c.roundRect(0, 0, self.width, self.height, 6, fill=1, stroke=0)
c.setFillColor(self.text_color)
c.setFont(self.font, self.font_size)
label = f" {self.icon} {self.text}" if self.icon else f" {self.text}"
c.drawString(10, (self.height - self.font_size) / 2 + 2, label)
class StickyNote(Flowable):
"""Yellow sticky note style box."""
def __init__(self, content_lines, bg=C_YELLOW_BG, border=C_YELLOW,
width=None, icon='๐'):
super().__init__()
self.content_lines = content_lines
self.bg = bg
self.border = border
self._width = width
self.icon = icon
def wrap(self, availWidth, availHeight):
self.width = self._width or availWidth
line_h = 16
self.height = 14 + len(self.content_lines) * line_h + 10
return self.width, self.height
def draw(self):
c = self.canv
c.setFillColor(self.bg)
c.setStrokeColor(self.border)
c.setLineWidth(2)
c.roundRect(0, 0, self.width, self.height, 8, fill=1, stroke=1)
c.setFont('Helvetica-Bold', 10)
c.setFillColor(HexColor('#5D4037'))
y = self.height - 16
c.drawString(10, y, f"{self.icon} STICKY NOTE")
c.setFont('Helvetica', 9.5)
c.setFillColor(HexColor('#4A235A'))
for line in self.content_lines:
y -= 16
c.drawString(14, y, line)
class RedBox(Flowable):
"""High-yield red alert box."""
def __init__(self, lines, width=None):
super().__init__()
self.lines = lines
self._width = width
def wrap(self, availWidth, availHeight):
self.width = self._width or availWidth
self.height = 16 + len(self.lines) * 16 + 10
return self.width, self.height
def draw(self):
c = self.canv
c.setFillColor(C_RED_LIGHT)
c.setStrokeColor(C_ACCENT1)
c.setLineWidth(2.5)
c.roundRect(0, 0, self.width, self.height, 6, fill=1, stroke=1)
y = self.height - 16
c.setFont('Helvetica-Bold', 10)
c.setFillColor(HexColor('#922B21'))
c.drawString(10, y, "๐ด HIGH YIELD โ NEET MDS")
c.setFont('Helvetica', 9.5)
c.setFillColor(HexColor('#641E16'))
for line in self.lines:
y -= 16
c.drawString(14, y, f" โข {line}")
def section_header(text, color=C_ACCENT2, icon=''):
return [
Spacer(1, 8),
ColorBox(text, color, icon=icon),
Spacer(1, 6),
]
def subsection(text):
return [Paragraph(text, STYLE['subsec']), Spacer(1, 3)]
def body(text):
return Paragraph(text, STYLE['body'])
def bullet(text):
return Paragraph(f"โข {text}", STYLE['bullet'])
def sp(n=6):
return Spacer(1, n)
def hr():
return HRFlowable(width='100%', thickness=0.5, color=C_LIGHT_GRAY, spaceAfter=4)
def make_table(header_row, data_rows, col_widths=None, alt_color=C_TABLE_ALT,
header_bg=C_TABLE_HEADER):
all_rows = [header_row] + data_rows
tbl = Table(all_rows, colWidths=col_widths, repeatRows=1)
style_cmds = [
('BACKGROUND', (0, 0), (-1, 0), header_bg),
('TEXTCOLOR', (0, 0), (-1, 0), C_WHITE),
('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
('FONTSIZE', (0, 0), (-1, 0), 10),
('ALIGN', (0, 0), (-1, -1), 'LEFT'),
('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
('FONTNAME', (0, 1), (-1, -1), 'Helvetica'),
('FONTSIZE', (0, 1), (-1, -1), 9.5),
('ROWBACKGROUNDS', (0, 1), (-1, -1), [C_WHITE, alt_color]),
('GRID', (0, 0), (-1, -1), 0.4, HexColor('#BDC3C7')),
('TOPPADDING', (0, 0), (-1, -1), 5),
('BOTTOMPADDING', (0, 0), (-1, -1), 5),
('LEFTPADDING', (0, 0), (-1, -1), 7),
('RIGHTPADDING', (0, 0), (-1, -1), 7),
]
tbl.setStyle(TableStyle(style_cmds))
return tbl
def img_with_caption(path, caption, max_w=14*cm, max_h=8*cm):
items = []
try:
from PIL import Image as PILImage
with PILImage.open(path) as im:
w, h = im.size
ratio = w / h
disp_w = min(max_w, ratio * max_h)
disp_h = disp_w / ratio
items.append(Image(path, width=disp_w, height=disp_h))
items.append(Paragraph(caption, STYLE['caption']))
except Exception as e:
items.append(Paragraph(f"[Image: {caption}]", STYLE['caption']))
return items
def pyq_block(num, question, options, correct_idx, explanation):
"""
Build a PYQ card with colored background.
correct_idx: 0-based index of correct answer in options list
"""
W = 16.5 * cm
rows = []
# Q row
rows.append([Paragraph(f"Q{num}.", STYLE['q_num']),
Paragraph(question, STYLE['q_text'])])
# Option rows
for i, opt in enumerate(options):
letter = chr(65 + i)
if i == correct_idx:
style = ParagraphStyle('opt_correct', fontSize=10,
fontName='Helvetica-Bold',
textColor=HexColor('#1A5276'), leading=14)
prefix = f"โ
{letter})"
else:
style = ParagraphStyle('opt_norm', fontSize=10,
fontName='Helvetica', textColor=C_BLACK,
leading=14)
prefix = f" {letter})"
rows.append(['', Paragraph(f"{prefix} {opt}", style)])
# Explanation row
rows.append(['', Paragraph(
f"<b>Explanation:</b> {explanation}",
ParagraphStyle('exp', fontSize=9.5, fontName='Helvetica',
textColor=HexColor('#1B2631'), leading=14,
backColor=C_PURPLE_BG)
)])
col_w = [1.0 * cm, W - 1.0 * cm]
tbl = Table(rows, colWidths=col_w)
tbl.setStyle(TableStyle([
('BACKGROUND', (0, 0), (-1, -1), C_PURPLE_BG),
('TOPPADDING', (0, 0), (-1, -1), 4),
('BOTTOMPADDING', (0, 0), (-1, -1), 4),
('LEFTPADDING', (0, 0), (-1, -1), 5),
('RIGHTPADDING', (0, 0), (-1, -1), 5),
('LINEBELOW', (0, -1), (-1, -1), 1, C_PURPLE),
('ROUNDEDCORNERS', [6]),
('VALIGN', (0, 0), (-1, -1), 'TOP'),
]))
return [KeepTogether([tbl, sp(6)])]
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# BUILD DOCUMENT
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
def build_pdf():
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=18*mm, leftMargin=18*mm,
topMargin=18*mm, bottomMargin=18*mm,
title='NEET MDS - Exodontia & Impactions',
author='Orris AI',
)
story = []
PW = A4[0] - 36*mm # printable width
# โโ COVER PAGE โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story += [sp(30)]
# Dark header banner
story.append(ColorBox(
'NEET MDS | ORAL SURGERY',
C_BG_DARK, C_WHITE, width=PW, height=50, font='Helvetica-Bold', font_size=18
))
story += [sp(10)]
story.append(ColorBox(
'EXODONTIA & IMPACTIONS',
C_ACCENT1, C_WHITE, width=PW, height=60, font='Helvetica-Bold', font_size=22
))
story += [sp(10)]
story.append(Paragraph(
'High-Yield Master Notes โข Previous Year Questions โข Colour-Coded Review',
STYLE['subtitle']
))
story += [sp(20)]
# Cover image
story += img_with_caption(
os.path.join(BASE_DIR, 'classification.jpg'),
'Fig 1. Winter\'s & Pell-Gregory Classification of Impacted Mandibular Third Molars (OPG)',
max_w=PW, max_h=9*cm
)
story += [sp(20)]
story.append(Paragraph(
'Prepared for NEET MDS Aspirants โข Oral & Maxillofacial Surgery',
STYLE['caption']
))
story.append(PageBreak())
# โโ TABLE OF CONTENTS โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story += section_header('TABLE OF CONTENTS', C_BG_DARK)
toc_items = [
('1', 'Exodontia - Armamentarium & Principles', 'Elevators, Forceps, Movements'),
('2', 'Impacted Teeth - Overview & Classification', 'Winter\'s, Pell & Gregory'),
('3', 'Indications & Contraindications', 'For removal of impacted teeth'),
('4', 'Surgical Technique', 'Steps, Incisions, Flap design'),
('5', 'Complications', 'Intraoperative & Postoperative'),
('6', 'Dry Socket (Alveolar Osteitis)', 'NEET MDS favourite topic'),
('7', 'Oro-Antral Communication & Fistula', 'OAC, OAF, Rehrmann flap'),
('8', 'Pericoronitis & Space Infections', 'Spread, Ludwig\'s angina'),
('9', 'Local Anaesthesia for Extraction', 'Blocks, Gow-Gates, Akinosi'),
('10', 'Previous Year Questions (PYQs)', '15 fully solved questions'),
('11', 'Quick Recall Sticky Notes', 'Last-minute revision'),
]
toc_data = [[Paragraph(f"<b>{n}</b>", STYLE['toc_item']),
Paragraph(f"<b>{t}</b><br/><font size=9 color='grey'>{sub}</font>",
STYLE['toc_item'])]
for n, t, sub in toc_items]
toc_tbl = Table(toc_data, colWidths=[1.2*cm, PW-1.2*cm])
toc_tbl.setStyle(TableStyle([
('ROWBACKGROUNDS', (0, 0), (-1, -1), [C_WHITE, C_BLUE_BG]),
('TOPPADDING', (0, 0), (-1, -1), 6),
('BOTTOMPADDING', (0, 0), (-1, -1), 6),
('LEFTPADDING', (0, 0), (-1, -1), 8),
('GRID', (0, 0), (-1, -1), 0.3, HexColor('#D5D8DC')),
]))
story.append(toc_tbl)
story.append(PageBreak())
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# SECTION 1: EXODONTIA
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story += section_header('1. EXODONTIA โ ARMAMENTARIUM & PRINCIPLES', C_ACCENT2, '๐ง')
story += subsection('A. ELEVATORS')
story.append(body(
'Elevators work on 3 mechanical principles: <b>Lever, Wheel & Axle, Wedge</b>. '
'They disrupt the PDL and expand the socket before forceps are applied.'
))
story += [sp(6)]
elev_data = [
['Elevator', 'Key Feature', 'Primary Use'],
['Straight (Warwick James)', 'Straight blade', 'Maxillary teeth, PDL disruption'],
["Cryer's (L & R)", 'Paired, triangular blade', 'Mandibular molar ROOTS'],
["Winter's cross-bar", 'Cross-bar handle, curved', 'Impacted lower 3rd molar'],
['Apexo elevator', 'Thin sharp tip', 'Root fragments, apical 1/3'],
["Molt's periosteal (No.9)", 'Wide flat blade', 'Raising mucoperiosteal flaps'],
["Potts elevator", 'Similar to Cryer', 'Root removal'],
]
story.append(make_table(
elev_data[0], elev_data[1:],
col_widths=[5.5*cm, 5*cm, 6*cm],
header_bg=C_ACCENT2
))
story += [sp(8)]
story.append(RedBox([
"Winter's elevator = used for Winter's (cross-bar handle) impactions โ easy mnemonic!",
"Cryer's elevator = ALWAYS used in PAIRS (left + right) for lower molar roots",
"Molt No. 9 = periosteal elevator for flap raising in surgical extractions",
]))
story += [sp(10)]
story += subsection('B. EXTRACTION FORCEPS')
forceps_data = [
['Forceps No.', 'Tooth / Region', 'Special Feature'],
['No. 1', 'Upper incisors & canines', 'Straight axis'],
['No. 2 / 2A', 'Upper premolars', 'Slight angulation'],
['No. 17', 'Upper right molars', 'Right-angled beaks'],
['No. 18L / 18R', 'Upper left / right molars', 'Paired set'],
['Bayonet (No.67)', 'Upper 3rd molars', 'Offset handles for access'],
['No. 74 (lower)', 'Lower incisors', 'Straight, thin beaks'],
['No. 79 (lower)', 'Lower premolars', 'Narrow beaks'],
['No. 77R / 77L', 'Lower right / left molars', 'Beaked for bifurcation'],
['No. 23 (Cow Horn)', 'Lower molars', 'Both beaks into bifurcation'],
]
story.append(make_table(
forceps_data[0], forceps_data[1:],
col_widths=[4*cm, 6*cm, 6.5*cm],
header_bg=C_TEAL
))
story += [sp(8)]
story.append(StickyNote([
"Cow-horn forceps apply a PUMPING action (not rotation) into the bifurcation of lower molars.",
"Bayonet forceps = upper 3rd molars (offset handles give access to posterior maxilla).",
"Lower molar forceps beaks are POINTED โ engage bifurcation buccally and lingually.",
], bg=C_YELLOW_BG, border=C_YELLOW))
story += [sp(10)]
story += subsection('C. MOVEMENTS DURING EXTRACTION')
story.append(body('<b>Key principle:</b> Single-rooted teeth = rotation allowed. Multi-rooted or curved roots = rotation CONTRAINDICATED.'))
story += [sp(6)]
mov_data = [
['Tooth', 'Movements Applied', 'Notes'],
['Maxillary anteriors', 'Labial + Palatal + Rotation', 'Conical single root โ rotation OK'],
['Maxillary premolars', 'Buccal + Palatal (NO rotation)', 'Two roots โ diverge, no rotation'],
['Maxillary 1st molar', 'Buccal > Palatal + figure-of-8', 'Three roots, buccal bone thin'],
['Mandibular anteriors', 'Labial + Lingual + Rotation', 'Single root, rotation OK'],
['Mandibular premolars', 'Buccal + Lingual ยฑ Rotation', 'Usually single root'],
['Mandibular molars', 'Figure-of-8 (buccal + lingual)', 'NO rotation โ two roots'],
]
story.append(make_table(
mov_data[0], mov_data[1:],
col_widths=[5*cm, 6*cm, 5.5*cm],
header_bg=C_ORANGE
))
story.append(PageBreak())
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# SECTION 2: IMPACTED TEETH
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story += section_header('2. IMPACTED TEETH โ CLASSIFICATION', C_ACCENT2, '๐ฆท')
story.append(body(
'<b>Definition:</b> An impacted tooth is one that is completely or partially unerupted and '
'positioned against another tooth, bone, or soft tissue so that further eruption is unlikely.'
))
story += [sp(8)]
# Frequency table
story += subsection('ORDER OF FREQUENCY OF IMPACTION')
freq_data = [
['Rank', 'Tooth', 'Notes'],
['1st (Most Common)', 'Mandibular 3rd Molar', 'Due to retromolar space deficiency'],
['2nd', 'Maxillary 3rd Molar', 'Less frequent than lower'],
['3rd', 'Maxillary Canine', 'Most common impacted canine'],
['4th', 'Mandibular 2nd Premolar', 'Least common after canines'],
['Least Common Canine', 'Mandibular Canine', 'Rarely impacted'],
]
story.append(make_table(
freq_data[0], freq_data[1:],
col_widths=[5*cm, 6*cm, 5.5*cm],
header_bg=C_ACCENT1
))
story += [sp(8)]
story.append(RedBox([
"Most commonly impacted tooth OVERALL = Mandibular 3rd molar",
"Most commonly impacted CANINE = Maxillary canine (palatal impaction, 2:1 ratio)",
"LEAST commonly impacted = Mandibular canine",
]))
story += [sp(10)]
story += subsection("A. WINTER'S CLASSIFICATION (Angulation)")
story.append(body(
"Based on the angulation of the long axis of the impacted tooth relative to "
"the long axis of the adjacent 2nd molar."
))
story += [sp(6)]
winter_data = [
['Angulation', 'Description', 'Surgical Difficulty'],
['Mesioangular', 'Tilted mesially toward 2nd molar', 'โญ EASIEST'],
['Vertical', 'Parallel to 2nd molar', 'โญโญ Easy-Moderate'],
['Horizontal', '90ยฐ โ perpendicular to 2nd molar', 'โญโญโญ Difficult'],
['Distoangular', 'Tilted distally toward ramus', 'โญโญโญโญ MOST DIFFICULT'],
['Buccoangular', 'Tilted buccally', 'Variable'],
['Linguoangular', 'Tilted lingually', 'Variable'],
['Transverse/Inverted', 'Crown facing downward', 'Most complex (rare)'],
]
story.append(make_table(
winter_data[0], winter_data[1:],
col_widths=[5*cm, 7*cm, 4.5*cm],
header_bg=HexColor('#1A5276')
))
story += [sp(8)]
# Winter's image
story += img_with_caption(
os.path.join(BASE_DIR, 'classification.jpg'),
'Fig 2. Winter\'s Angulation Classification + Pell-Gregory Depth Classification (OPG examples)',
max_w=PW, max_h=8.5*cm
)
story += [sp(8)]
story.append(StickyNote([
"NEET MDS order (easiest โ hardest): Mesioangular โ Vertical โ Horizontal โ Distoangular",
"Distoangular = MOST DIFFICULT because the ascending ramus directly blocks delivery.",
"Horizontal = requires mandatory tooth sectioning (odontectomy) but once cut, easier to deliver.",
], bg=HexColor('#FEF9E7'), border=C_YELLOW))
story += [sp(10)]
story += subsection('B. PELL & GREGORY CLASSIFICATION')
story.append(body(
'Two independent parameters โ <b>Class</b> (ramus relationship) and <b>Position</b> (depth).'
))
story += [sp(6)]
pg_class_data = [
['Class', 'Ramus Relationship', 'Clinical Meaning'],
['Class I', 'Sufficient space between ramus & 2nd molar', 'Adequate room โ easier'],
['Class II', 'Space = only HALF the crown width', 'Partial ramus coverage'],
['Class III', 'Tooth mostly/entirely within ramus', 'NO space โ most difficult'],
]
story.append(make_table(
pg_class_data[0], pg_class_data[1:],
col_widths=[2.5*cm, 8*cm, 6*cm],
header_bg=HexColor('#154360')
))
story += [sp(8)]
pg_pos_data = [
['Position', 'Depth Relative to 2nd Molar', 'Clinical Meaning'],
['Position A', 'Occlusal surface AT or ABOVE occlusal plane of 2nd molar', 'Shallowest'],
['Position B', 'Between occlusal plane and CEJ of 2nd molar', 'Moderate depth'],
['Position C', 'Occlusal surface BELOW CEJ of 2nd molar', 'Deepest โ hardest'],
]
story.append(make_table(
pg_pos_data[0], pg_pos_data[1:],
col_widths=[2.5*cm, 8.5*cm, 5.5*cm],
header_bg=HexColor('#154360')
))
story += [sp(8)]
story.append(RedBox([
"Class III + Position C = MOST DIFFICULT combination (deepest, ramus-enclosed)",
"Pell & Gregory = RAMUS relationship (Class) + DEPTH (Position) โ two separate parameters",
"Class I Position A = closest to surface, easiest access",
]))
story.append(PageBreak())
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# SECTION 3: INDICATIONS & CONTRAINDICATIONS
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story += section_header('3. INDICATIONS FOR REMOVAL', C_TEAL, 'โ
')
ind_data = [
['Indication', 'Notes / Details'],
['Pericoronitis (recurrent)', 'MOST COMMON indication โ infection under operculum'],
['Caries', 'In impacted tooth OR distal surface of 2nd molar'],
['Periodontal disease', 'Pocketing distal to 2nd molar'],
['Dentigerous cyst', 'Most common associated cyst โ follicular epithelium'],
['Root resorption', 'Pressure on adjacent 2nd molar roots'],
['Neuralgia / referred pain', 'IAN compression, trigeminal neuralgia'],
['Orthodontic preparation', 'Before bracket placement, prevent crowding relapse'],
['Fracture through impacted tooth', 'Risk of osteomyelitis in fracture line'],
['Tumour involvement', 'KCOT, ameloblastoma, odontoma'],
['Prosthetic reasons', 'Tooth under planned denture base'],
]
story.append(make_table(
ind_data[0], ind_data[1:],
col_widths=[6*cm, 10.5*cm],
header_bg=C_TEAL
))
story += [sp(8)]
story.append(StickyNote([
"MOST COMMON indication = Pericoronitis (recurrent episodes, not single episode).",
"NEVER extract during ACUTE pericoronitis โ treat first (48-72 hrs antibiotics).",
"Dentigerous cyst = crown inside cyst lumen, attaches at CEJ of impacted tooth.",
], bg=C_GREEN_BG, border=C_GREEN, icon='โ
'))
story += [sp(10)]
story += section_header('4. SURGICAL TECHNIQUE', C_ACCENT2, '๐ฌ')
story += subsection('INCISIONS USED FOR LOWER 3rd MOLAR')
incision_data = [
['Incision', 'Description', 'Use'],
["Ward's incision", 'Horizontal + vertical releasing arm', 'Standard โ most common'],
["Modified Ward's", 'Modified to preserve papilla', 'Most commonly used TODAY'],
['Envelope incision', 'Horizontal only, no vertical', 'Simple cases, good access'],
['Triangular flap', 'Two vertical + horizontal', 'Maximum access needed'],
]
story.append(make_table(
incision_data[0], incision_data[1:],
col_widths=[4*cm, 6.5*cm, 6*cm],
header_bg=C_ACCENT2
))
story += [sp(8)]
story += subsection('STEPS OF SURGICAL REMOVAL')
steps = [
('Step 1', 'Incision', "Ward's / Modified Ward's incision", C_BLUE_BG),
('Step 2', 'Flap elevation', 'Mucoperiosteal flap โ Molt No.9 periosteal elevator', C_YELLOW_BG),
('Step 3', 'Bone removal', 'Bur + handpiece (preferred) OR chisel + mallet', C_GREEN_BG),
('Step 4', 'Tooth sectioning', 'Crown-root separation for horizontal impactions', C_RED_LIGHT),
('Step 5', 'Elevation & delivery', "Winter's / Cryer's elevator; then forceps", C_BLUE_BG),
('Step 6', 'Socket curettage', 'Remove follicle, granulation tissue, debris', C_YELLOW_BG),
('Step 7', 'Irrigation', 'Saline lavage โ remove bone chips', C_GREEN_BG),
('Step 8', 'Wound closure', 'Interrupted sutures (3-0 black silk / Vicryl)', C_BLUE_BG),
]
step_rows = [[Paragraph(f"<b>{s}</b>", STYLE['body_bold']),
Paragraph(f"<b>{t}</b>", STYLE['body_bold']),
Paragraph(d, STYLE['body'])]
for s, t, d, _ in steps]
step_tbl = Table(step_rows, colWidths=[2.2*cm, 4.5*cm, 9.8*cm])
bg_colors = [('BACKGROUND', (0, i), (-1, i), c) for i, (_, _, _, c) in enumerate(steps)]
step_tbl.setStyle(TableStyle([
('GRID', (0, 0), (-1, -1), 0.4, HexColor('#BDC3C7')),
('TOPPADDING', (0, 0), (-1, -1), 5),
('BOTTOMPADDING',(0, 0), (-1, -1), 5),
('LEFTPADDING', (0, 0), (-1, -1), 7),
('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
] + bg_colors))
story.append(step_tbl)
story.append(PageBreak())
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# SECTION 5: COMPLICATIONS
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story += section_header('5. COMPLICATIONS OF EXTRACTION', C_ACCENT1, 'โ ๏ธ')
story += subsection('INTRAOPERATIVE COMPLICATIONS')
intra_data = [
['Complication', 'Cause', 'Management'],
['Root fracture', 'Excessive force, curved/hypercementosed roots', 'Apexo elevator, sectioning'],
['Root into sinus', 'Upper molar, thin sinus floor breach', 'Sinus washout, Caldwell-Luc'],
['Root โ infratemporal fossa', 'Upper 3rd molar displaced posteriorly', 'Imaging, retrieve separately'],
['Oro-antral communication', 'Upper molar, sinus floor perforation', 'Primary closure if small (<5mm)'],
['Jaw fracture', 'Excessive force, embedded Class III', 'IMF / plating'],
['Tuberosity fracture', 'Upper 3rd molar, excess posterior force', 'Preserve, delay if vascular'],
['IAN injury', 'Root close to mandibular canal', 'Monitor; steroids if acute'],
['Soft tissue injury', 'Slipping instruments', 'Suture lacerations'],
]
story.append(make_table(
intra_data[0], intra_data[1:],
col_widths=[4.5*cm, 6*cm, 6*cm],
header_bg=C_ACCENT1
))
story += [sp(8)]
story += subsection('POSTOPERATIVE COMPLICATIONS')
post_data = [
['Complication', 'Onset', 'Key Features'],
['Dry Socket (Alveolar Osteitis)', 'Day 2โ4', 'Empty socket, throbbing pain, bad odour'],
['Wound infection', 'Day 3โ7', 'Swelling, pus, fever, trismus'],
['Trismus', 'Day 1โ3', 'Medial pterygoid spasm; limits mouth opening'],
['Haematoma', 'Hours', 'Blood in soft tissue; usually self-limiting'],
['Paraesthesia (IAN)', 'Immediate / Days', 'Lower lip / chin numbness'],
['Lingual nerve injury', 'Immediate', 'Tongue numbness / taste alteration'],
['Osteomyelitis', 'Weeks', 'Persistent pain, exposed bone, fever'],
['BRONJ/MRONJ', 'Variable', 'In patients on bisphosphonates / anti-angiogenics'],
]
story.append(make_table(
post_data[0], post_data[1:],
col_widths=[5.5*cm, 3*cm, 8*cm],
header_bg=C_ORANGE
))
story.append(PageBreak())
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# SECTION 6: DRY SOCKET
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story += section_header('6. DRY SOCKET (ALVEOLAR OSTEITIS)', C_ACCENT1, '๐ฅ')
story.append(RedBox([
"MOST COMMON post-extraction complication overall",
"Most common site: Mandibular 3rd molar socket",
"Treatment drug of choice: ALVOGYL dressing",
]))
story += [sp(8)]
ds_data = [
['Feature', 'Details'],
['Onset', 'Day 2โ4 after extraction'],
['Mechanism', 'Premature loss/disintegration of blood clot โ exposed bone โ severe pain'],
['Pain character', 'Severe THROBBING; radiates to ear, temple, eye; NOT relieved by analgesics'],
['Incidence', '2โ5% routine extractions; 20โ30% impacted lower 3rd molar'],
['Most common site', 'Mandibular 3rd molar > mandibular 1st molar'],
['Smell', 'Fetid halitosis (bare exposed bone with necrotic debris)'],
]
story.append(make_table(
ds_data[0], ds_data[1:],
col_widths=[4.5*cm, 12*cm],
header_bg=C_ACCENT1
))
story += [sp(8)]
story += subsection('RISK FACTORS')
rf_data = [
['Risk Factor', 'Mechanism'],
['SMOKING', 'Vasoconstriction + sucking action dislodges clot (most important)'],
['Oral contraceptives', 'Elevated oestrogen โ increased fibrinolysis'],
['Traumatic extraction', 'Thermal/physical damage to socket'],
['Female sex', 'Hormonal influence on fibrinolysis'],
['Poor oral hygiene', 'Bacterial contamination promotes clot lysis'],
['Previous pericoronitis', 'Pre-existing infection impairs healing'],
]
story.append(make_table(
rf_data[0], rf_data[1:],
col_widths=[5*cm, 11.5*cm],
header_bg=C_ORANGE
))
story += [sp(8)]
story += subsection('TREATMENT')
treatment_steps = [
'1. Gentle irrigation with WARM SALINE (remove debris โ do NOT curette)',
'2. Apply ALVOGYL dressing (iodoform + eugenol + butamben) into socket',
'3. Change dressing every 3โ5 days until granulation tissue forms',
'4. Systemic analgesics (NSAIDs preferred)',
'5. Antibiotics only if secondary infection present',
]
for t in treatment_steps:
story.append(bullet(t))
story += [sp(8)]
story += img_with_caption(
os.path.join(BASE_DIR, 'dry_socket.jpg'),
'Fig 3. Clinical appearance of dry socket (alveolar osteitis) โ empty dark socket with absent blood clot and inflamed surrounding mucosa',
max_w=PW, max_h=7*cm
)
story += [sp(8)]
story.append(StickyNote([
"Alvogyl contents: Iodoform (antiseptic) + Eugenol (obtundent) + Butamben (local anaesthetic).",
"Do NOT over-irrigate or curette โ this can damage forming granulation tissue.",
"Smoking is the SINGLE MOST IMPORTANT risk factor for dry socket.",
], bg=C_YELLOW_BG, border=C_YELLOW))
story.append(PageBreak())
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# SECTION 7: OAC & OAF
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story += section_header('7. ORO-ANTRAL COMMUNICATION & FISTULA', C_BLUE_LIGHT, '๐')
oac_data = [
['Feature', 'OAC (Communication)', 'OAF (Fistula)'],
['Definition', 'Fresh perforation into maxillary sinus', 'Epithelialized tract (>48โ72 hrs)'],
['Lining', 'None (raw edges)', 'Epithelial lining present'],
['Most common cause', 'Upper 1st/2nd molar extraction', 'Same โ unrepaired OAC'],
['Diagnosis', 'Nose-blow test, mirror, probe', 'Clinical + CT sinus'],
['Small (<5mm)', 'Primary closure ยฑ figure-8 suture', 'Excise tract + flap'],
['Large (>5mm)', 'Surgical flap closure required', 'Rehrmann (buccal) flap'],
]
story.append(make_table(
oac_data[0], oac_data[1:],
col_widths=[4*cm, 6.5*cm, 6*cm],
header_bg=C_BLUE_LIGHT
))
story += [sp(8)]
story += subsection('FLAP TECHNIQUES FOR OAF CLOSURE')
flap_data = [
['Technique', 'Type', 'Key Feature'],
['Rehrmann flap', 'Buccal advancement flap', 'MOST COMMON โ trapezoidal flap with periosteal release'],
['Henderson flap', 'Palatal rotation flap', 'Based on greater palatine artery; used if buccal fails'],
['Buccal fat pad flap', 'Pedicled adipose', 'For large defects; secondary epithelialization'],
['Tongue flap', 'Pedicled from tongue', 'Large posterior defects; requires second surgery'],
]
story.append(make_table(
flap_data[0], flap_data[1:],
col_widths=[4.5*cm, 5*cm, 7*cm],
header_bg=C_ACCENT2
))
story += [sp(8)]
story += img_with_caption(
os.path.join(BASE_DIR, 'rehrmann.jpg'),
'Fig 4. Rehrmann buccal advancement flap for OAF closure โ blue sutures securing trapezoidal mucoperiosteal flap over the communication',
max_w=PW, max_h=7*cm
)
story += [sp(6)]
story.append(StickyNote([
"Rehrmann = FIRST CHOICE for OAF. Periosteal releasing incision = tension-free advancement.",
"OAC becomes OAF after 48โ72 hours (epithelialization of tract).",
"Henderson palatal flap = based on GREATER PALATINE ARTERY (never cut this!)",
], bg=C_BLUE_BG, border=C_BLUE_LIGHT, icon='๐'))
story.append(PageBreak())
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# SECTION 8: PERICORONITIS & SPACE INFECTIONS
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story += section_header('8. PERICORONITIS & DEEP SPACE INFECTIONS', C_ORANGE, '๐ฆ ')
story += subsection('PERICORONITIS โ RAPID REVIEW')
peri_data = [
['Feature', 'Details'],
['Definition', 'Inflammation of pericoronal flap (operculum) of partially erupted tooth'],
['Commonest tooth', 'Mandibular 3rd molar (almost always)'],
['Commonest age group', '20โ29 years'],
['Cause', 'Food + bacteria trapped under operculum โ infection'],
['Primary spread', 'Pterygomandibular space (FIRST space)'],
['Trismus cause', 'Medial pterygoid muscle spasm (pterygomandibular space)'],
['Antibiotic of choice', 'Amoxicillin + Metronidazole (for anaerobes)'],
['Acute treatment', 'Irrigation + antibiotics + analgesics; NO extraction'],
['Definitive treatment', 'Extraction (after acute resolves) OR operculectomy'],
]
story.append(make_table(
peri_data[0], peri_data[1:],
col_widths=[5*cm, 11.5*cm],
header_bg=C_ORANGE
))
story += [sp(8)]
story += img_with_caption(
os.path.join(BASE_DIR, 'pericoronitis.jpg'),
'Fig 5. Acute pericoronitis โ erythematous edematous operculum over partially erupted mandibular 3rd molar',
max_w=PW*0.6, max_h=6*cm
)
story += [sp(8)]
story.append(RedBox([
"NEVER extract during acute pericoronitis โ wait 48-72 hours on antibiotics first",
"First space to be infected = PTERYGOMANDIBULAR space",
"Trismus = medial pterygoid spasm due to pterygomandibular space involvement",
]))
story += [sp(10)]
story += subsection('SPREAD OF INFECTION โ DEEP SPACES')
space_data = [
['Space', 'Key Boundary', 'Infection Source'],
['Pterygomandibular', 'Medial pterygoid + ramus', 'Lower 3rd molar (FIRST)'],
['Masticator', 'All masticatory muscles + ramus', '3rd molar region'],
['Sublingual', 'Above mylohyoid, floor of mouth', 'Lower anteriors/premolars'],
['Submandibular', 'Below mylohyoid', 'Lower molars (below mylohyoid)'],
['Submental', 'Symphysis to hyoid, midline', 'Lower anteriors'],
['Buccal', 'Buccinator + overlying skin', 'Upper/lower premolars & molars'],
['Lateral pharyngeal', 'Parapharyngeal region', 'Spread from pterygomandibular'],
['Retropharyngeal', 'Behind pharynx', 'Spread from lateral pharyngeal'],
]
story.append(make_table(
space_data[0], space_data[1:],
col_widths=[4.5*cm, 6*cm, 6*cm],
header_bg=C_ACCENT1
))
story += [sp(8)]
story += subsection("LUDWIG'S ANGINA")
story.append(body(
'<b>Definition:</b> Rapidly spreading bilateral cellulitis of the floor of the mouth involving '
'<b>BILATERAL sublingual + bilateral submandibular + submental spaces</b> simultaneously.'
))
story += [sp(4)]
ludwig_features = [
'Potentially LIFE-THREATENING โ airway compromise is the main danger',
'Most common origin: Mandibular 2nd or 3rd molar infection (below mylohyoid)',
'Hallmark: Bilateral brawny indurated swelling of floor of mouth, elevated tongue',
'Treatment: Airway management FIRST (intubation / tracheostomy) + IV antibiotics + I&D',
'Organisms: Mixed flora โ viridans streptococci + anaerobes (Bacteroides)',
]
for f in ludwig_features:
story.append(bullet(f))
story.append(PageBreak())
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# SECTION 9: LOCAL ANAESTHESIA
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story += section_header('9. LOCAL ANAESTHESIA FOR EXTRACTION', C_TEAL, '๐')
story += subsection('MANDIBULAR NERVE BLOCKS')
la_mand_data = [
['Block', 'Technique', 'Teeth / Region Anaesthetised'],
['IANB (Inferior Alveolar NB)', 'Pterygomandibular triangle', 'All ipsilateral lower teeth'],
['Long Buccal NB', 'Buccal fold, distal to 3rd molar', 'Buccal gingiva of lower molars'],
['Mental NB', 'Mental foramen (premolar area)', 'Lower anterior soft tissue'],
['Incisive NB', 'Mental foramen, inject & wait', 'Lower anteriors + premolars (pulp)'],
['Gow-Gates', 'High condylar injection (neck of condyle)', 'ALL branches of V3 (highest success)'],
['Vazirani-Akinosi', 'Closed-mouth technique (trismus)', 'IAN + Lingual (for trismus patients)'],
]
story.append(make_table(
la_mand_data[0], la_mand_data[1:],
col_widths=[4.5*cm, 5.5*cm, 6.5*cm],
header_bg=C_TEAL
))
story += [sp(8)]
story += subsection('MAXILLARY NERVE BLOCKS')
la_max_data = [
['Block', 'Teeth Anaesthetised', 'Notes'],
['PSA (Posterior Superior Alveolar)', 'Upper molars (except MB root of 1st)', 'Risk: Haematoma in pterygoid plexus'],
['MSA (Middle Superior Alveolar)', 'Upper premolars + MB root of 1st molar', 'Absent in ~28% โ then ASA covers'],
['ASA (Anterior Superior Alveolar)', 'Upper canine + incisors (pulp)', 'Via infraorbital approach'],
['Infraorbital block', 'ASA + MSA combined', 'One injection for anteriors + premolars'],
['Greater palatine block', 'Palatal gingiva โ premolars & molars', 'Near greater palatine foramen'],
['Nasopalatine block', 'Palatal gingiva โ upper anteriors', 'Behind incisive papilla'],
]
story.append(make_table(
la_max_data[0], la_max_data[1:],
col_widths=[5*cm, 6*cm, 5.5*cm],
header_bg=HexColor('#117A65')
))
story += [sp(8)]
story.append(RedBox([
"Gow-Gates = HIGHEST success rate (~95%) + LOWEST positive aspiration rate among mandibular blocks",
"Vazirani-Akinosi = for TRISMUS patients (closed-mouth technique)",
"PSA block risk = haematoma (pterygoid venous plexus) โ keep needle at 45 degrees",
]))
story.append(PageBreak())
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# SECTION 10: PYQs
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story += section_header('10. PREVIOUS YEAR QUESTIONS (PYQs)', C_PURPLE, '๐')
story += [sp(4)]
pyqs = [
(1, "The most commonly impacted tooth is:",
["Maxillary canine", "Mandibular 3rd molar", "Maxillary 3rd molar", "Mandibular 2nd premolar"],
1,
"Mandibular 3rd molar is the most commonly impacted tooth due to insufficient retromolar space "
"from evolutionary jaw size reduction. Maxillary canine is the most common impacted CANINE only."),
(2, "According to Winter's classification, which impaction is EASIEST to remove?",
["Horizontal", "Distoangular", "Mesioangular", "Vertical"],
2,
"Mesioangular impaction โ the long axis tilts mesially, allowing a purchase point distally on the "
"crown for elevator application. The crown can be elevated mesially in a natural arch. "
"Order: Mesioangular (easiest) โ Vertical โ Horizontal โ Distoangular (hardest)."),
(3, "The MOST DIFFICULT impaction to remove surgically is:",
["Mesioangular", "Vertical", "Horizontal", "Distoangular"],
3,
"Distoangular is the most difficult because the ascending ramus blocks the path of delivery posteriorly. "
"Bone must be removed from the ramus to create space. Note: horizontal requires sectioning but delivery "
"is easier once cut. Distoangular has no escape route."),
(4, "Pell & Gregory Class III, Position C indicates:",
["Easy extraction, tooth at occlusal level", "Moderate depth, partial ramus",
"Deepest impaction, completely within ramus", "Tooth above CEJ with sufficient space"],
2,
"Class III = no space between ramus and 2nd molar (completely within ramus). "
"Position C = occlusal surface below CEJ of 2nd molar (deepest). "
"Combined = most difficult extraction โ hardest access, requires maximum bone removal."),
(5, "Most common complication after surgical removal of impacted mandibular 3rd molar:",
["IAN paresthesia", "Oro-antral fistula", "Dry socket (alveolar osteitis)", "Osteomyelitis"],
2,
"Dry socket occurs in 20-30% of impacted lower 3rd molar extractions (vs 2-5% routine). "
"It results from premature clot dissolution exposing bare bone, causing severe throbbing pain "
"radiating to the ear, onset day 2-4."),
(6, "Which nerve is MOST COMMONLY injured during lower 3rd molar surgery?",
["Inferior alveolar nerve", "Lingual nerve", "Long buccal nerve", "Facial nerve"],
1,
"The lingual nerve lies immediately beneath the mucosa on the lingual aspect of the mandible "
"at the 3rd molar region โ no bony protection. Temporary injury ~10%; permanent <1%. "
"IAN is deep in the mandibular canal and less frequently injured."),
(7, "Drug of choice for dressing dry socket is:",
["Zinc oxide eugenol paste", "Chlorhexidine gel", "Alvogyl", "Bismuth iodoform paraffin paste (BIPP)"],
2,
"Alvogyl contains iodoform (antiseptic/deodorizing) + eugenol (obtundent/analgesic) + butamben "
"(local anaesthetic). It is the gold standard for dry socket management. Changed every 3-5 days."),
(8, "The Rehrmann flap procedure is used for:",
["Dry socket treatment", "Closure of oro-antral fistula",
"Pericoronitis operculectomy", "Dentigerous cyst marsupialization"],
1,
"Rehrmann buccal advancement flap is the FIRST-CHOICE technique for OAF closure. "
"It involves a trapezoidal mucoperiosteal flap raised on the buccal side with a periosteal "
"releasing incision for tension-free advancement over the fistula opening."),
(9, "Standard incision for surgical removal of impacted mandibular 3rd molar:",
["Semilunar incision", "Envelope incision", "Modified Ward's incision", "Linear incision"],
2,
"Modified Ward's incision is the standard โ horizontal component along gingival sulcus of "
"2nd molar + vertical releasing incision anteriorly. Provides adequate access while "
"preserving interdental papilla. Pure envelope = good access but less retraction."),
(10, "Gow-Gates technique of mandibular nerve block anaesthetises:",
["Inferior alveolar nerve only", "IAN + lingual nerve only",
"All branches of mandibular nerve (V3)", "IAN + long buccal nerve only"],
2,
"Gow-Gates is a HIGH CONDYLAR injection directed to the neck of the condyle near the "
"mandibular nerve trunk. Anaesthetises ALL V3 branches: IAN, lingual, long buccal, "
"mylohyoid, mental, incisive. Highest success rate (~95%)."),
(11, "Pericoronitis MOST COMMONLY involves which tooth?",
["Maxillary 3rd molar", "Maxillary canine",
"Mandibular 3rd molar", "Mandibular 2nd premolar"],
2,
"Mandibular 3rd molar โ partially erupted with an operculum where food and bacteria accumulate. "
"The upper teeth are less prone due to different eruption patterns and the opposing tooth "
"trauma from the upper 3rd molar can also contribute."),
(12, "Most common CYST associated with an impacted tooth is:",
["Radicular cyst", "Lateral periodontal cyst", "Dentigerous cyst", "Keratocystic odontogenic tumour"],
2,
"Dentigerous (follicular) cyst develops from reduced enamel epithelium of an unerupted/impacted tooth. "
"Crown lies INSIDE the cyst lumen; cyst attaches at CEJ. It is the most common developmental "
"odontogenic cyst. KCOT can also be associated but is less common than dentigerous."),
(13, "Ludwig's angina primarily involves:",
["Parotid + masticator spaces bilaterally",
"Bilateral sublingual + bilateral submandibular + submental spaces",
"Pterygomandibular space bilaterally", "Buccal space bilaterally"],
1,
"Ludwig's angina = bilateral sublingual + bilateral submandibular + submental spaces. "
"Most dangerous for airway. Floor of mouth becomes board-like and elevated, pushing tongue upward. "
"Origin: usually mandibular 2nd/3rd molar below mylohyoid โ submandibular โ spreads."),
(14, "Cow-horn forceps (No.23) works by which mechanism?",
["Rotation of the tooth", "Pumping action engaging the bifurcation",
"Simple traction", "Rotational + traction combined"],
1,
"Cow-horn (No.23) forceps have pointed beaks that engage the BIFURCATION of lower molars "
"buccally and lingually. Application of a PUMPING (up-down) force wedges beaks into the "
"bifurcation, expanding the socket and luxating the tooth. No rotation is used."),
(15, "The technique of choice for trismus patients requiring mandibular nerve block is:",
["Gow-Gates technique", "Standard IANB", "Vazirani-Akinosi technique", "Mental nerve block"],
2,
"Vazirani-Akinosi (closed-mouth) technique is specifically designed for patients with trismus "
"who cannot open their mouth for standard IANB. Needle is inserted near the coronoid notch "
"with the mouth CLOSED, anaesthetising IAN and lingual nerve."),
]
for q in pyqs:
story += pyq_block(*q)
story.append(PageBreak())
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# SECTION 11: QUICK RECALL STICKY NOTES
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story += section_header('11. QUICK RECALL โ LAST MINUTE REVISION', HexColor('#1A5276'), 'โญ')
# Two-column layout for sticky notes
left_notes = [
RedBox([
"Most common impacted tooth: Mandibular 3rd molar",
"Most common impacted canine: Maxillary canine (palatal)",
"Least commonly impacted: Mandibular canine",
"Easiest angulation (Winter's): Mesioangular",
"Most difficult (Winter's): Distoangular",
"Most difficult (Pell & Gregory): Class III Position C",
]),
sp(8),
StickyNote([
"Dry socket onset: Day 2-4 post extraction",
"Dry socket Rx: Alvogyl dressing",
"Dry socket risk #1: Smoking",
"Dry socket incidence in 3rd molar: 20-30%",
"OAF repair: Rehrmann (buccal advancement flap)",
"OAC โ OAF: after 48-72 hrs epithelialization",
], bg=C_YELLOW_BG, border=C_YELLOW),
]
right_notes = [
StickyNote([
"Gow-Gates = highest success rate LA block",
"Vazirani-Akinosi = closed mouth (trismus)",
"Most injured nerve = Lingual nerve",
"IAN injury = lip/chin numbness",
"Never extract in ACUTE pericoronitis",
"First space infected = Pterygomandibular",
], bg=C_GREEN_BG, border=C_GREEN, icon='๐'),
sp(8),
StickyNote([
"Dentigerous cyst = most common cyst of impacted tooth",
"Crown inside cyst lumen; attaches at CEJ",
"Ludwig's angina = bilateral sublingual +",
" submandibular + submental spaces",
"Cow-horn forceps = pumping into bifurcation",
"Modified Ward's = standard 3rd molar incision",
], bg=C_BLUE_BG, border=C_BLUE_LIGHT, icon='๐'),
]
left_col = [item for item in left_notes]
right_col = [item for item in right_notes]
# Flatten into two-column table
left_items = [l for l in left_notes]
right_items = [l for l in right_notes]
two_col = Table(
[[left_items, right_items]],
colWidths=[PW/2 - 5, PW/2 - 5],
style=TableStyle([
('VALIGN', (0, 0), (-1, -1), 'TOP'),
('LEFTPADDING', (0, 0), (-1, -1), 3),
('RIGHTPADDING', (0, 0), (-1, -1), 3),
])
)
story.append(two_col)
story += [sp(16)]
# Final summary table
story += subsection('MASTER RECALL TABLE โ ALL KEY FACTS')
master_data = [
['Topic', 'Answer'],
['Most common impacted tooth', 'Mandibular 3rd molar'],
['Most common impacted canine', 'Maxillary canine (palatal 2:1)'],
["Easiest (Winter's)", 'Mesioangular'],
["Most difficult (Winter's)", 'Distoangular'],
['Most difficult (Pell & Gregory)', 'Class III, Position C'],
['Most common post-extraction complication', 'Dry socket (alveolar osteitis)'],
['Dry socket treatment', 'Alvogyl dressing (iodoform + eugenol + butamben)'],
['Most common nerve injured in 3rd molar surgery', 'Lingual nerve'],
['OAF repair (1st choice)', 'Rehrmann buccal advancement flap'],
['OAC โ OAF conversion time', '48โ72 hours (epithelialization)'],
['Best success mandibular LA block', 'Gow-Gates (~95% success)'],
['LA for trismus', 'Vazirani-Akinosi (closed-mouth)'],
['Pericoronitis first space', 'Pterygomandibular space'],
['Ludwig\'s angina spaces', 'Bilateral sublingual + submandibular + submental'],
['Most common cyst of impacted tooth', 'Dentigerous (follicular) cyst'],
['Standard 3rd molar incision', "Modified Ward's incision"],
['Cow-horn forceps mechanism', 'Pumping action into bifurcation'],
['NEVER do in acute pericoronitis', 'Extraction (risk of spreading infection)'],
]
story.append(make_table(
master_data[0], master_data[1:],
col_widths=[8.5*cm, 8*cm],
header_bg=C_BG_DARK,
alt_color=C_TABLE_ALT2
))
story += [sp(16)]
story.append(ColorBox(
'All the best for NEET MDS! Master these key facts and you are set.',
C_ACCENT1, C_WHITE, width=PW, height=35, font='Helvetica-Bold', font_size=13
))
# โโ Build โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
doc.build(story)
print(f"PDF created: {OUTPUT}")
if __name__ == '__main__':
build_pdf()
cd /tmp/workspace/neet-mds-pdf && python3 generate_pdf.py 2>&1
ls -lh /tmp/workspace/neet-mds-pdf/NEET_MDS_Exodontia_Impactions.pdf && python3 -c " from pypdf import PdfReader r = PdfReader('/tmp/workspace/neet-mds-pdf/NEET_MDS_Exodontia_Impactions.pdf') print(f'Pages: {len(r.pages)}') print(f'Title: {r.metadata.title}') "
NEET MDS Exodontia Impactions
PDF Document ยท PDF
| Section | Content |
|---|---|
| Cover Page | Full OPG image of Winter's + Pell-Gregory classification |
| Table of Contents | Colour-coded, easy navigation |
| Elevators & Forceps | Colour-coded tables with types & uses |
| Extraction Movements | Table by tooth type โ rotation rules |
| Impacted Teeth | Frequency order + full Winter's + Pell & Gregory tables with radiograph image |
| Indications | Colour table with clinical notes |
| Surgical Steps | Step-by-step alternating colour table |
| Complications | Intra + post-operative colour tables |
| Dry Socket | Red HIGH-YIELD box + clinical image + Alvogyl facts |
| OAC & OAF | Comparison table + Rehrmann flap image |
| Pericoronitis | Table + clinical image + space infection spread |
| Ludwig's Angina | Bullet summary |
| Local Anaesthesia | Mandibular + Maxillary block tables |
| 15 PYQs | Each with all options, โ correct answer highlighted, full explanation in purple box |
| Quick Recall | Two-column sticky notes + MASTER recall table |
Generate a quick reference cheat sheet in PDF format
ls /tmp/workspace/neet-mds-pdf/
~/neet-mds-pdf/cheatsheet.py
#!/usr/bin/env python3
"""
NEET MDS โ Exodontia & Impactions | Quick Reference Cheat Sheet
Single A3 landscape page โ dense grid layout using ReportLab canvas directly
"""
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A3, landscape
from reportlab.lib.units import mm, cm
from reportlab.lib.colors import HexColor, white, black
from reportlab.platypus import Table, TableStyle, Paragraph, SimpleDocTemplate, Spacer, Image
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT
import os
BASE = '/tmp/workspace/neet-mds-pdf'
OUT = os.path.join(BASE, 'NEET_MDS_CheatSheet.pdf')
# โโ Palette โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
NAVY = HexColor('#0D1B2A')
RED = HexColor('#C0392B')
ORANGE = HexColor('#E67E22')
GREEN = HexColor('#1E8449')
BLUE = HexColor('#1A5276')
PURPLE = HexColor('#6C3483')
TEAL = HexColor('#117A65')
YELLOW = HexColor('#D4AC0D')
DKGRAY = HexColor('#2C3E50')
LTGRAY = HexColor('#F2F3F4')
LTBLUE = HexColor('#D6EAF8')
LTYELL = HexColor('#FEF9E7')
LTGRN = HexColor('#EAFAF1')
LTRED = HexColor('#FADBD8')
LTPUR = HexColor('#F5EEF8')
LTTEAL = HexColor('#D1F2EB')
W, H = landscape(A3) # 420 x 297 mm
M = 8 * mm # margin
def draw_rounded_rect(c, x, y, w, h, r=4, fill_color=None, stroke_color=None, lw=0.5):
if fill_color:
c.setFillColor(fill_color)
if stroke_color:
c.setStrokeColor(stroke_color)
c.setLineWidth(lw)
c.roundRect(x, y, w, h, r,
fill=1 if fill_color else 0,
stroke=1 if stroke_color else 0)
def header_band(c, x, y, w, h, bg, text, text_color=white, font='Helvetica-Bold', fsize=9):
draw_rounded_rect(c, x, y, w, h, r=3, fill_color=bg)
c.setFillColor(text_color)
c.setFont(font, fsize)
c.drawString(x + 5, y + (h - fsize) / 2 + 1.5, text)
def cell_text(c, x, y, w, h, text, font='Helvetica', fsize=7.5,
color=black, bg=None, bold_first=False, center=False):
if bg:
draw_rounded_rect(c, x, y, w, h, r=2, fill_color=bg)
c.setFillColor(color)
if center:
c.setFont(font + '-Bold' if bold_first else font, fsize)
c.drawCentredString(x + w / 2, y + (h - fsize) / 2 + 1, text)
else:
c.setFont('Helvetica-Bold' if bold_first else font, fsize)
c.drawString(x + 4, y + (h - fsize) / 2 + 1, text)
def mini_table(c, x, y, col_widths, rows, row_h=13,
header_bg=NAVY, header_fg=white,
alt1=white, alt2=LTBLUE, font_size=7.2):
"""Draw a mini table at (x,y) going upward (y is bottom)."""
total_h = len(rows) * row_h
current_y = y + total_h # start from top
for ri, row in enumerate(rows):
current_y -= row_h
bg = header_bg if ri == 0 else (alt1 if ri % 2 == 1 else alt2)
fg = header_fg if ri == 0 else black
rx = x
for ci, (cell, cw) in enumerate(zip(row, col_widths)):
draw_rounded_rect(c, rx, current_y, cw, row_h, r=0,
fill_color=bg, stroke_color=HexColor('#BDC3C7'), lw=0.3)
c.setFillColor(fg)
fn = 'Helvetica-Bold' if ri == 0 or (ci == 0 and ri > 0) else 'Helvetica'
c.setFont(fn, font_size)
# clip text to cell width
c.drawString(rx + 3, current_y + (row_h - font_size) / 2 + 1, str(cell))
rx += cw
return total_h
def dot_bullet(c, x, y, text, color=NAVY, fsize=7.2, dot_color=None):
c.setFillColor(dot_color or color)
c.circle(x + 3, y + fsize / 2, 2, fill=1, stroke=0)
c.setFillColor(color)
c.setFont('Helvetica', fsize)
c.drawString(x + 8, y, text)
def badge(c, x, y, text, bg, fg=white, w=None, h=11, fsize=7):
tw = c.stringWidth(text, 'Helvetica-Bold', fsize)
bw = w or tw + 10
draw_rounded_rect(c, x, y, bw, h, r=3, fill_color=bg)
c.setFillColor(fg)
c.setFont('Helvetica-Bold', fsize)
c.drawCentredString(x + bw / 2, y + (h - fsize) / 2 + 1, text)
return bw + 3
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
def build():
c = canvas.Canvas(OUT, pagesize=landscape(A3))
c.setTitle('NEET MDS Cheat Sheet โ Exodontia & Impactions')
# โโ BACKGROUND โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
c.setFillColor(HexColor('#F8F9FA'))
c.rect(0, 0, W, H, fill=1, stroke=0)
# โโ TITLE BAR โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
c.setFillColor(NAVY)
c.rect(0, H - 22*mm, W, 22*mm, fill=1, stroke=0)
c.setFillColor(RED)
c.rect(0, H - 26*mm, W, 4*mm, fill=1, stroke=0)
c.setFillColor(white)
c.setFont('Helvetica-Bold', 18)
c.drawString(M, H - 15*mm, '๐ฆท NEET MDS | EXODONTIA & IMPACTIONS โ QUICK REFERENCE CHEAT SHEET')
c.setFont('Helvetica', 8)
c.setFillColor(HexColor('#BDC3C7'))
c.drawRightString(W - M, H - 15*mm, 'Oral & Maxillofacial Surgery โข High-Yield Only')
# Content area starts below title
TOP = H - 28*mm
BOT = M + 6*mm
CHEIGHT = TOP - BOT # ~249 mm usable
# โโ GRID: 5 columns โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
GAP = 3 * mm
NCOL = 5
CW = (W - 2*M - (NCOL-1)*GAP) / NCOL # ~77 mm each
def col_x(n): # n = 0..4
return M + n * (CW + GAP)
def col_rect(n, y_bot, height, bg=white, stroke=None):
draw_rounded_rect(c, col_x(n), y_bot, CW, height, r=5,
fill_color=bg, stroke_color=stroke or HexColor('#D5D8DC'), lw=0.6)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# COL 0 โ ELEVATORS + FORCEPS MNEMONICS
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
cx = col_x(0)
cy = TOP
# Panel: Elevators
panel_h = 72 * mm
col_rect(0, cy - panel_h, panel_h, bg=LTBLUE)
header_band(c, cx, cy - 11*mm, CW, 11*mm, BLUE, '๐ง ELEVATORS', fsize=8.5)
elev_rows = [
['Elevator', 'Use'],
['Warwick James (straight)', 'Upper teeth / PDL disruption'],
["Cryer's (L+R paired)", 'Lower molar ROOTS'],
["Winter's cross-bar", 'Impacted lower 3rd molar'],
['Apexo (thin tip)', 'Root fragments / apical 1/3'],
["Molt No.9 (periosteal)", 'Raise mucoperiosteal flap'],
]
mini_table(c, cx + 2, cy - panel_h + 2, [37*mm, CW - 41*mm], elev_rows,
row_h=12, header_bg=BLUE, alt1=white, alt2=LTBLUE, font_size=6.8)
# Principles badge row
by = cy - panel_h + 3*mm
bx = cx + 3
bx += badge(c, bx, by, 'LEVER', HexColor('#1A5276'))
bx += badge(c, bx, by, 'WHEEL-AXLE', HexColor('#117A65'))
bx += badge(c, bx, by, 'WEDGE', HexColor('#6C3483'))
cy -= panel_h + GAP
# Panel: Key Forceps
panel_h2 = 72 * mm
col_rect(0, cy - panel_h2, panel_h2, bg=LTTEAL)
header_band(c, cx, cy - 11*mm, CW, 11*mm, TEAL, '๐ฆท KEY FORCEPS', fsize=8.5)
forc_rows = [
['No.', 'Tooth'],
['1', 'Upper incisors & canines'],
['2 / 2A', 'Upper premolars'],
['17 / 18L/R', 'Upper molars'],
['Bayonet 67', 'Upper 3rd molar (access)'],
['74', 'Lower incisors'],
['77R / 77L', 'Lower right / left molars'],
['23 (Cow-Horn)', 'Lower molar bifurcation'],
]
mini_table(c, cx + 2, cy - panel_h2 + 2, [18*mm, CW - 22*mm], forc_rows,
row_h=11, header_bg=TEAL, alt1=white, alt2=LTTEAL, font_size=6.8)
cy -= panel_h2 + GAP
# Panel: Movements
panel_h3 = TOP - panel_h - panel_h2 - 2*GAP - BOT
col_rect(0, BOT, panel_h3, bg=LTYELL)
header_band(c, cx, BOT + panel_h3 - 11*mm, CW, 11*mm, ORANGE, 'โ EXTRACTION MOVEMENTS', fsize=8.5)
mov_rows = [
['Tooth', 'Movement'],
['Upper anteriors', 'Lab+Pal+ROTATION'],
['Upper premolars', 'Lab+Pal NO rotation'],
['Upper molars', 'Fig-8 (buc+pal)'],
['Lower anteriors', 'Lab+Lin+ROTATION'],
['Lower premolars', 'Buc+Lin ยฑ rotation'],
['Lower molars', 'Fig-8 NO rotation'],
]
mini_table(c, cx + 2, BOT + 2, [30*mm, CW - 34*mm], mov_rows,
row_h=11, header_bg=ORANGE, alt1=white, alt2=LTYELL, font_size=6.8)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# COL 1 โ IMPACTION CLASSIFICATIONS
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
cx = col_x(1)
cy = TOP
# Image strip
img_h = 42 * mm
try:
from PIL import Image as PILImage
with PILImage.open(os.path.join(BASE, 'classification.jpg')) as im:
iw, ih = im.size
ratio = iw / ih
disp_w = CW - 4
disp_h = disp_w / ratio
if disp_h > img_h:
disp_h = img_h
disp_w = disp_h * ratio
img_x = cx + (CW - disp_w) / 2
c.drawImage(os.path.join(BASE, 'classification.jpg'),
img_x, TOP - img_h, width=disp_w, height=disp_h,
preserveAspectRatio=True)
c.setFillColor(HexColor('#7F8C8D'))
c.setFont('Helvetica-Oblique', 6)
c.drawCentredString(cx + CW/2, TOP - img_h - 5, "Fig: Winter's + Pell-Gregory OPG")
except:
pass
cy = TOP - img_h - 8*mm
# Winter's classification
panel_h = 58 * mm
col_rect(1, cy - panel_h, panel_h, bg=LTRED)
header_band(c, cx, cy - 11*mm, CW, 11*mm, RED, "โ WINTER'S CLASSIFICATION", fsize=8)
winter_rows = [
['Angulation', 'Difficulty'],
['Mesioangular', 'โญ EASIEST'],
['Vertical', 'โญโญ Easy-Mod'],
['Horizontal', 'โญโญโญ Difficult'],
['Distoangular', 'โญโญโญโญ HARDEST'],
['Bucco/Linguoangular', 'Variable'],
]
mini_table(c, cx+2, cy - panel_h + 10*mm, [38*mm, CW-42*mm], winter_rows,
row_h=11, header_bg=RED, alt1=white, alt2=LTRED, font_size=7)
# Red badge
c.setFillColor(RED)
c.setFont('Helvetica-Bold', 7)
c.drawString(cx+4, cy - panel_h + 5, '๐ด Distoangular = MOST DIFFICULT (ramus blocks delivery)')
cy -= panel_h + GAP
# Pell & Gregory
panel_h = 62 * mm
col_rect(1, cy - panel_h, panel_h, bg=LTBLUE)
header_band(c, cx, cy - 11*mm, CW, 11*mm, BLUE, '๐ PELL & GREGORY', fsize=8.5)
pg_rows = [
['Class', 'Ramus Space'],
['Class I', 'Full crown width'],
['Class II', 'Half crown width'],
['Class III', 'NO space (in ramus)'],
]
mini_table(c, cx+2, cy - panel_h + 34*mm, [22*mm, CW-26*mm], pg_rows,
row_h=11, header_bg=BLUE, alt1=white, alt2=LTBLUE, font_size=7)
pos_rows = [
['Pos', 'Depth vs 2nd Molar'],
['A', 'At/above occlusal plane'],
['B', 'Below occlusal, above CEJ'],
['C', 'Below CEJ โ DEEPEST'],
]
mini_table(c, cx+2, cy - panel_h + 4, [14*mm, CW-18*mm], pos_rows,
row_h=10, header_bg=BLUE, alt1=white, alt2=LTBLUE, font_size=7)
# Hardest badge
c.setFillColor(RED)
c.setFont('Helvetica-Bold', 7.5)
c.drawString(cx+4, cy - panel_h + 34*mm - 10, '๐ด Class III + Position C = MOST DIFFICULT')
cy -= panel_h + GAP
# Frequency panel
panel_h = TOP - 42*mm - 58*mm - 62*mm - 3*GAP - BOT
col_rect(1, BOT, panel_h, bg=LTGRN)
header_band(c, cx, BOT + panel_h - 11*mm, CW, 11*mm, GREEN, '๐ IMPACTION FREQUENCY', fsize=8.5)
freq_rows = [
['Rank', 'Tooth'],
['1st', 'Mand 3rd molar โ MOST COMMON'],
['2nd', 'Max 3rd molar'],
['3rd', 'Max canine (palatal 2:1)'],
['4th', 'Mand 2nd premolar'],
['Least', 'Mand canine'],
]
mini_table(c, cx+2, BOT+2, [14*mm, CW-18*mm], freq_rows,
row_h=11, header_bg=GREEN, alt1=white, alt2=LTGRN, font_size=7)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# COL 2 โ DRY SOCKET + OAC/OAF
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
cx = col_x(2)
cy = TOP
# Dry socket image
ds_img_h = 36 * mm
try:
c.drawImage(os.path.join(BASE, 'dry_socket.jpg'),
cx, cy - ds_img_h, width=CW, height=ds_img_h,
preserveAspectRatio=True, anchor='n')
c.setFillColor(HexColor('#7F8C8D'))
c.setFont('Helvetica-Oblique', 6)
c.drawCentredString(cx + CW/2, cy - ds_img_h - 4, 'Fig: Dry socket โ empty socket, inflamed gingiva')
except:
pass
cy = cy - ds_img_h - 7*mm
# Dry socket panel
panel_h = 82 * mm
col_rect(2, cy - panel_h, panel_h, bg=LTRED)
header_band(c, cx, cy - 11*mm, CW, 11*mm, RED, '๐ฅ DRY SOCKET (ALVEOLAR OSTEITIS)', fsize=7.8)
ds_rows = [
['Feature', 'Detail'],
['Onset', 'Day 2โ4 post extraction'],
['Mechanism', 'Clot loss โ exposed bone'],
['Pain', 'Throbbing, radiates to ear'],
['Incidence', '2-5% routine; 20-30% 3rd molar'],
['Most common site', 'Mand 3rd molar socket'],
]
mini_table(c, cx+2, cy - panel_h + 38*mm, [26*mm, CW-30*mm], ds_rows,
row_h=11, header_bg=RED, alt1=white, alt2=LTRED, font_size=6.8)
# Risk factors
c.setFillColor(ORANGE)
c.setFont('Helvetica-Bold', 7.5)
c.drawString(cx+4, cy - panel_h + 37*mm, 'Risk Factors:')
risks = ['Smoking (No.1)', 'OCP (oestrogen)', 'Traumatic extraction', 'Female sex', 'Poor OHI']
ry = cy - panel_h + 26*mm
for r_ in risks:
dot_bullet(c, cx+4, ry, r_, color=HexColor('#7B241C'), dot_color=RED, fsize=7)
ry -= 9
# Treatment
c.setFillColor(GREEN)
c.setFont('Helvetica-Bold', 7.5)
c.drawString(cx+4, cy - panel_h + 4, 'Treatment: โบ Alvogyl dressing (change q3-5 days) โบWarm saline irrigation')
cy -= panel_h + GAP
# OAC/OAF panel
panel_h2 = TOP - ds_img_h - 7*mm - 82*mm - 2*GAP - BOT
col_rect(2, BOT, panel_h2, bg=LTBLUE)
header_band(c, cx, BOT + panel_h2 - 11*mm, CW, 11*mm, BLUE, '๐ OAC & OAF', fsize=8.5)
oac_rows = [
['', 'OAC', 'OAF'],
['Time', 'Fresh (<48h)', '>48h (epithelialized)'],
['Rx small', 'Primary suture', 'Excise + flap'],
['Rx large', 'Flap closure', 'Rehrmann flap'],
]
mini_table(c, cx+2, BOT + 18*mm, [14*mm, 27*mm, CW-45*mm], oac_rows,
row_h=11, header_bg=BLUE, alt1=white, alt2=LTBLUE, font_size=6.5)
# Rehrmann image
try:
c.drawImage(os.path.join(BASE, 'rehrmann.jpg'),
cx, BOT + 2, width=CW, height=17*mm,
preserveAspectRatio=True, anchor='s')
except:
pass
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# COL 3 โ PERICORONITIS + SPACES + NERVE INJURIES
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
cx = col_x(3)
cy = TOP
# Pericoronitis image
pc_img_h = 32 * mm
try:
c.drawImage(os.path.join(BASE, 'pericoronitis.jpg'),
cx, cy - pc_img_h, width=CW, height=pc_img_h,
preserveAspectRatio=True)
c.setFillColor(HexColor('#7F8C8D'))
c.setFont('Helvetica-Oblique', 6)
c.drawCentredString(cx+CW/2, cy - pc_img_h - 4, 'Fig: Acute pericoronitis โ inflamed operculum')
except:
pass
cy = cy - pc_img_h - 7*mm
# Pericoronitis panel
panel_h = 68 * mm
col_rect(3, cy - panel_h, panel_h, bg=LTYELL)
header_band(c, cx, cy - 11*mm, CW, 11*mm, ORANGE, '๐ฆ PERICORONITIS', fsize=8.5)
pc_rows = [
['Feature', 'Detail'],
['Tooth', 'Mand 3rd molar (almost always)'],
['Age', '20โ29 years'],
['First space', 'Pterygomandibular'],
['Trismus cause', 'Medial pterygoid spasm'],
['Antibiotics', 'Amox + Metronidazole'],
['Acute Rx', 'Irrigate + Abx (NO extraction)'],
['Def. Rx', 'Extraction / Operculectomy'],
]
mini_table(c, cx+2, cy - panel_h + 2, [24*mm, CW-28*mm], pc_rows,
row_h=10.5, header_bg=ORANGE, alt1=white, alt2=LTYELL, font_size=6.8)
cy -= panel_h + GAP
# Space infections panel
panel_h2 = 50 * mm
col_rect(3, cy - panel_h2, panel_h2, bg=LTRED)
header_band(c, cx, cy - 11*mm, CW, 11*mm, RED, 'โ SPACE INFECTIONS', fsize=8.5)
spc_rows = [
['Space', 'Source'],
['Pterygomandibular', 'Lower 3rd molar (FIRST)'],
['Submandibular', 'Lower molars (below mylohyoid)'],
['Sublingual', 'Lower ant/premolar (above)'],
['Buccal', 'Upper/lower premolars'],
['Lateral pharyngeal', 'Spread from pterygomand.'],
]
mini_table(c, cx+2, cy - panel_h2 + 10*mm, [30*mm, CW-34*mm], spc_rows,
row_h=10, header_bg=RED, alt1=white, alt2=LTRED, font_size=6.8)
# Ludwig badge
draw_rounded_rect(c, cx+2, cy - panel_h2 + 2, CW-4, 9*mm, r=3,
fill_color=NAVY, stroke_color=RED, lw=1)
c.setFillColor(white)
c.setFont('Helvetica-Bold', 7)
c.drawString(cx+5, cy - panel_h2 + 5, "Ludwig's = Bilateral sublingual + submandibular + submental โ AIRWAY RISK")
cy -= panel_h2 + GAP
# Nerve injuries panel
panel_h3 = TOP - pc_img_h - 7*mm - 68*mm - 50*mm - 3*GAP - BOT
col_rect(3, BOT, panel_h3, bg=LTPUR)
header_band(c, cx, BOT + panel_h3 - 11*mm, CW, 11*mm, PURPLE, '๐ NERVE INJURIES (3rd Molar)', fsize=8)
nerve_rows = [
['Nerve', 'Consequence'],
['Lingual (MOST COMMON)', 'Tongue numbness/dysgeusia'],
['Inferior Alveolar (IAN)', 'Lip + chin numbness'],
['Long buccal', 'Minor cheek numbness'],
['Facial (VII)', 'Rare โ parotid surgery risk'],
]
mini_table(c, cx+2, BOT+2, [30*mm, CW-34*mm], nerve_rows,
row_h=11, header_bg=PURPLE, alt1=white, alt2=LTPUR, font_size=6.8)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# COL 4 โ LA BLOCKS + RED HIGH-YIELD FACTS + PYQ ANSWERS
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
cx = col_x(4)
cy = TOP
# LA panel
panel_h = 70 * mm
col_rect(4, cy - panel_h, panel_h, bg=LTTEAL)
header_band(c, cx, cy - 11*mm, CW, 11*mm, TEAL, '๐ LOCAL ANAESTHESIA', fsize=8.5)
la_rows = [
['Block', 'Anaesthetises'],
['IANB', 'All ipsilateral lower teeth'],
['Long buccal NB', 'Buccal gingiva lower molars'],
['Mental NB', 'Lower ant. soft tissue'],
['Gow-Gates', 'ALL V3 branches (best success)'],
['Vazirani-Akinosi', 'IAN+Lingual (closed mouth)'],
['PSA', 'Upper molars (not MB of 1st)'],
['Infraorbital', 'ASA + MSA combined'],
['Greater palatine', 'Palatal premolar + molar'],
['Nasopalatine', 'Palatal upper anteriors'],
]
mini_table(c, cx+2, cy - panel_h + 2, [30*mm, CW-34*mm], la_rows,
row_h=9.5, header_bg=TEAL, alt1=white, alt2=LTTEAL, font_size=6.5)
cy -= panel_h + GAP
# Master High-Yield panel
panel_h2 = 92 * mm
col_rect(4, cy - panel_h2, panel_h2, bg=LTRED)
header_band(c, cx, cy - 11*mm, CW, 11*mm, RED, '๐ด MUST-KNOW HIGH-YIELD FACTS', fsize=8)
hy_facts = [
('Most common impacted tooth:', 'Mandibular 3rd molar', RED),
('Most common impacted canine:', 'Maxillary canine (palatal)', RED),
('Least commonly impacted:', 'Mandibular canine', DKGRAY),
("Easiest (Winter's):", 'Mesioangular', GREEN),
("Hardest (Winter's):", 'Distoangular', RED),
('Hardest (P&G):', 'Class III Position C', RED),
('Most common complication:', 'Dry socket', ORANGE),
('Dry socket Rx:', 'Alvogyl dressing', GREEN),
('Dry socket risk #1:', 'Smoking', ORANGE),
('Most injured nerve:', 'Lingual nerve', PURPLE),
('OAF repair (1st choice):', 'Rehrmann (buccal) flap', BLUE),
('Best LA block (mand):', 'Gow-Gates (~95% success)', TEAL),
('Trismus LA technique:', 'Vazirani-Akinosi', TEAL),
('First space in pericoronitis:', 'Pterygomandibular space', ORANGE),
("Cyst of impacted tooth:", 'Dentigerous (follicular) cyst', BLUE),
('Standard 3rd molar incision:', "Modified Ward's", DKGRAY),
('OAC โ OAF time:', '48โ72 hrs (epithelialization)', DKGRAY),
('NEVER do in acute pericoronitis:', 'Extract the tooth!', RED),
]
hy_y = cy - panel_h2 + 3
line_h = (panel_h2 - 14*mm) / len(hy_facts)
for label, val, col in reversed(hy_facts):
c.setFont('Helvetica-Bold', 6.5)
c.setFillColor(DKGRAY)
c.drawString(cx+4, hy_y + 1.5, label)
c.setFont('Helvetica-Bold', 6.5)
c.setFillColor(col)
c.drawString(cx + 4 + c.stringWidth(label, 'Helvetica-Bold', 6.5) + 2, hy_y + 1.5, val)
hy_y += line_h
cy -= panel_h2 + GAP
# Complications quick panel
panel_h3 = TOP - 70*mm - 92*mm - 2*GAP - BOT
col_rect(4, BOT, panel_h3, bg=LTYELL)
header_band(c, cx, BOT + panel_h3 - 11*mm, CW, 11*mm, ORANGE, 'โ QUICK COMPLICATIONS', fsize=8.5)
comp_rows = [
['Complication', 'Key Point'],
['Dry socket', 'Day 2-4; Alvogyl Rx'],
['OAC', 'Upper molar; <5mm โ suture'],
['IAN damage', 'Root in canal; lip numb'],
['Trismus', 'Medial pterygoid spasm'],
['Ludwig angina', 'Airway first! IV abx + I&D'],
]
mini_table(c, cx+2, BOT+2, [28*mm, CW-32*mm], comp_rows,
row_h=11, header_bg=ORANGE, alt1=white, alt2=LTYELL, font_size=6.8)
# โโ FOOTER โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
c.setFillColor(NAVY)
c.rect(0, 0, W, 6*mm, fill=1, stroke=0)
c.setFillColor(white)
c.setFont('Helvetica-Bold', 7)
c.drawCentredString(W/2, 2*mm,
'NEET MDS Quick Reference โข Exodontia & Impactions โข Oral & Maxillofacial Surgery โข Orris AI')
c.save()
print(f"Cheat sheet saved: {OUT}")
build()
cd /tmp/workspace/neet-mds-pdf && python3 cheatsheet.py 2>&1