Study guide detailed !! Put dr. Shreya chindak below title
cd /tmp/workspace/attachments/4dae1eec-150f-428d-8745-8a9985798085/ && python3 -c " import pdfplumber with pdfplumber.open('139.pdf') as pdf: print(f'Total pages: {len(pdf.pages)}') for i, page in enumerate(pdf.pages[:3]): print(f'--- Page {i+1} ---') print(page.extract_text()[:2000]) print() "
python3 -c " import pdfplumber with pdfplumber.open('/tmp/workspace/attachments/4dae1eec-150f-428d-8745-8a9985798085/139.pdf') as pdf: all_text = '' for i, page in enumerate(pdf.pages): t = page.extract_text() if t: all_text += f'\n\n=== PAGE {i+1} ===\n' + t print(all_text) " > /tmp/workspace/139_full_text.txt 2>&1 wc -l /tmp/workspace/139_full_text.txt
cat /tmp/workspace/139_full_text.txt
mkdir -p /tmp/workspace/study-guide && python3 << 'PYEOF' from pptx import Presentation from pptx.util import Inches, Pt, Emu from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN, MSO_ANCHOR from pptx.util import Inches, Pt import copy prs = Presentation() prs.slide_width = Inches(13.333) prs.slide_height = Inches(7.5) blank_layout = prs.slide_layouts[6] # Color scheme DARK_BLUE = RGBColor(0x0D, 0x2B, 0x55) # deep navy MID_BLUE = RGBColor(0x15, 0x57, 0x9A) # medium blue ACCENT = RGBColor(0x00, 0xA8, 0xE8) # bright teal/blue GOLD = RGBColor(0xF0, 0xA5, 0x00) # gold accent WHITE = RGBColor(0xFF, 0xFF, 0xFF) LIGHT_GRAY= RGBColor(0xF2, 0xF5, 0xFA) TEXT_DARK = RGBColor(0x1A, 0x1A, 0x2E) SUBTITLE_COLOR = RGBColor(0xCC, 0xE5, 0xFF) def add_rect(slide, l, t, w, h, color, transparency=0): from pptx.util import Emu shape = slide.shapes.add_shape(1, Inches(l), Inches(t), Inches(w), Inches(h)) shape.fill.solid() shape.fill.fore_color.rgb = color shape.line.fill.background() return shape def add_textbox(slide, text, l, t, w, h, size, bold=False, color=WHITE, align=PP_ALIGN.LEFT, italic=False, wrap=True, font="Calibri"): tb = slide.shapes.add_textbox(Inches(l), Inches(t), Inches(w), Inches(h)) tf = tb.text_frame tf.word_wrap = wrap tf.margin_left = Pt(2) tf.margin_right = Pt(2) tf.margin_top = Pt(2) tf.margin_bottom = Pt(2) p = tf.paragraphs[0] p.alignment = align r = p.add_run() r.text = text r.font.name = font r.font.size = Pt(size) r.font.bold = bold r.font.italic = italic r.font.color.rgb = color return tb def add_multiline_textbox(slide, lines, l, t, w, h, size, color=TEXT_DARK, bold_first=False, font="Calibri", line_spacing=1.15): from pptx.util import Pt as Ptt from pptx.oxml.ns import qn import lxml.etree as etree tb = slide.shapes.add_textbox(Inches(l), Inches(t), Inches(w), Inches(h)) tf = tb.text_frame tf.word_wrap = True tf.margin_left = Pt(4) tf.margin_right = Pt(4) tf.margin_top = Pt(3) tf.margin_bottom = Pt(3) for idx, line in enumerate(lines): if idx == 0: p = tf.paragraphs[0] else: p = tf.add_paragraph() p.alignment = PP_ALIGN.LEFT r = p.add_run() r.text = line r.font.name = font r.font.size = Pt(size) r.font.color.rgb = color if bold_first and idx == 0: r.font.bold = True else: r.font.bold = False return tb # ============================================================ # SLIDE 1: TITLE SLIDE # ============================================================ slide = prs.slides.add_slide(blank_layout) # Background gradient (dark navy full) add_rect(slide, 0, 0, 13.333, 7.5, DARK_BLUE) # Accent bar top add_rect(slide, 0, 0, 13.333, 0.12, ACCENT) # Accent bar bottom add_rect(slide, 0, 7.38, 13.333, 0.12, ACCENT) # Decorative side accent add_rect(slide, 0, 0, 0.08, 7.5, ACCENT) # Gold horizontal divider add_rect(slide, 1.2, 3.55, 10.9, 0.06, GOLD) # Title add_textbox(slide, "Surgical Guidelines for Dental Implant Placement", 1.2, 1.3, 10.9, 1.7, 38, bold=True, color=WHITE, align=PP_ALIGN.CENTER, font="Calibri") # Subtitle add_textbox(slide, "A Comprehensive Study Guide", 1.2, 3.0, 10.9, 0.55, 20, bold=False, color=ACCENT, align=PP_ALIGN.CENTER, font="Calibri") # Author Credit add_textbox(slide, "Dr. Shreya Chindak", 1.2, 3.75, 10.9, 0.55, 18, bold=True, color=GOLD, align=PP_ALIGN.CENTER, font="Calibri") # Source note add_textbox(slide, "Based on: Handelsman M. | British Dental Journal 2006; 201: 139–152", 1.2, 4.4, 10.9, 0.5, 12, bold=False, color=SUBTITLE_COLOR, align=PP_ALIGN.CENTER, font="Calibri") # Topic list topics = [ "• Rationale & Treatment Planning", "• Diagnosis & Bone Classification", "• Surgical Techniques & Flap Design", "• Deficient Ridge Management", "• Bone Grafting & Sinus Lift", "• Loading Protocols & Complications", ] add_textbox(slide, " ".join(topics[:3]), 1.0, 5.1, 11.3, 0.5, 12, bold=False, color=SUBTITLE_COLOR, align=PP_ALIGN.CENTER, font="Calibri") add_textbox(slide, " ".join(topics[3:]), 1.0, 5.6, 11.3, 0.5, 12, bold=False, color=SUBTITLE_COLOR, align=PP_ALIGN.CENTER, font="Calibri") # ============================================================ # SLIDE 2: KEY PRINCIPLES (IN BRIEF) # ============================================================ slide = prs.slides.add_slide(blank_layout) add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GRAY) add_rect(slide, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(slide, 0, 1.1, 0.07, 6.4, ACCENT) add_rect(slide, 0, 1.1, 13.333, 0.06, ACCENT) add_textbox(slide, "Key Principles — IN BRIEF", 0.25, 0.18, 12.8, 0.75, 28, bold=True, color=WHITE, align=PP_ALIGN.LEFT) add_textbox(slide, "Dr. Shreya Chindak", 0.25, 0.78, 12.8, 0.32, 12, bold=False, color=ACCENT, align=PP_ALIGN.LEFT) principles = [ ("1", "Restorative-Driven Treatment Planning", "Visualisation of the final restorative result is MANDATORY before beginning any treatment. The goal is optimal aesthetics AND function. Work backwards from the diagnostic wax-up."), ("2", "Biologically AND Restoratively Driven", "Implant placement must satisfy both biological requirements (bone quality/quantity, tissue biotype) and restorative needs (emergence, angulation, space). Neither can be sacrificed."), ("3", "Comprehensive Examination First", "Dental implants should ONLY be placed following a complete periodontal, occlusal, endodontic, restorative, orthodontic, and radiographic examination with accurate diagnosis."), ("4", "Reconstruct Before Implanting", "The deficient osseous ridge MUST be reconstructed prior to implant placement. Never place implants into compromised bone without first addressing the deficiency."), ("5", "Team Approach", "Successful outcomes require a multidisciplinary team: restorative dentist, periodontist, oral surgeon, orthodontist, and endodontist — all coordinating before treatment begins."), ("6", "Manage Patient Expectations", "Effective communication is critical. The patient must understand realistic expectations, treatment steps, risks, financial obligations, and aesthetic goals before any procedure."), ] cols = [(0.3, 4.1), (4.5, 4.1), (8.7, 4.1)] rows = [(1.25, 2.75), (4.1, 2.75)] for i, (num, title, body) in enumerate(principles): col_idx = i % 3 row_idx = i // 3 x = cols[col_idx][0] y = rows[row_idx][0] w = cols[col_idx][1] h = rows[row_idx][1] # Card background add_rect(slide, x, y, w, h - 0.05, WHITE) # Number accent bar add_rect(slide, x, y, 0.35, h - 0.05, MID_BLUE) # Number add_textbox(slide, num, x, y + 0.6, 0.35, 0.6, 20, bold=True, color=WHITE, align=PP_ALIGN.CENTER) # Title add_textbox(slide, title, x + 0.4, y + 0.05, w - 0.5, 0.55, 13, bold=True, color=DARK_BLUE, align=PP_ALIGN.LEFT) # Body add_textbox(slide, body, x + 0.4, y + 0.6, w - 0.5, h - 0.75, 11, color=TEXT_DARK, align=PP_ALIGN.LEFT, wrap=True, font="Calibri") # ============================================================ # SLIDE 3: DIAGNOSIS — PERIODONTAL & TISSUE BIOTYPE # ============================================================ slide = prs.slides.add_slide(blank_layout) add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GRAY) add_rect(slide, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(slide, 0, 1.1, 13.333, 0.06, ACCENT) add_rect(slide, 0, 1.1, 0.07, 6.4, ACCENT) add_textbox(slide, "Diagnosis — Periodontal Examination & Tissue Biotype", 0.25, 0.18, 12.8, 0.75, 26, bold=True, color=WHITE, align=PP_ALIGN.LEFT) add_textbox(slide, "Dr. Shreya Chindak", 0.25, 0.78, 5.0, 0.32, 12, bold=False, color=ACCENT, align=PP_ALIGN.LEFT) # Left column add_rect(slide, 0.3, 1.25, 6.0, 5.9, WHITE) add_rect(slide, 0.3, 1.25, 6.0, 0.45, MID_BLUE) add_textbox(slide, "Tissue Biotype Classification (Becker & Ochenbein)", 0.35, 1.28, 5.9, 0.4, 12, bold=True, color=WHITE, align=PP_ALIGN.LEFT) biotype_text = [ "THIN PERIODONTIUM (Pronounced Scalloped)", "• Scalloped or pronounced scalloped gingival architecture", "• Root dehiscence and fenestrations even in healthy tissue", "• Higher risk of recession and collapse after tooth loss", "• Thin buccal/lingual alveolar plates", "", "THICK PERIODONTIUM (Flat)", "• Flat gingival architecture", "• Supported by thick buccal and lingual plates", "• More forgiving; easier to manipulate surgically", "• More predictable aesthetic outcomes post-extraction", "", "KOIS CREST CLASSIFICATION", "• High Crest: Bone at CEJ level (delayed passive eruption)", "• Normal Crest: Bone 2 mm apical to CEJ", "• Low Crest: Recession with attachment loss", "", "KEY: Sound to bone (bone sounding) is the best clinical", "parameter to identify attachment level in aesthetic zone." ] for idx, line in enumerate(biotype_text): y_pos = 1.8 + idx * 0.26 sz = 10 if not line.isupper() and line != "" else 11 bold = line.isupper() or line.startswith("KEY:") color = MID_BLUE if (line.isupper() or line.startswith("KEY:")) else TEXT_DARK if line: add_textbox(slide, line, 0.4, y_pos, 5.8, 0.28, sz, bold=bold, color=color, align=PP_ALIGN.LEFT, wrap=True) # Right column add_rect(slide, 6.7, 1.25, 6.3, 5.9, WHITE) add_rect(slide, 6.7, 1.25, 6.3, 0.45, MID_BLUE) add_textbox(slide, "Siebert Classification — Ridge Collapse", 6.75, 1.28, 6.2, 0.4, 12, bold=True, color=WHITE, align=PP_ALIGN.LEFT) siebert = [ ("Type I", "Horizontal bone loss only (normal height preserved)"), ("Type II", "Vertical bone loss only (normal width preserved)"), ("Type III", "Combination of horizontal AND vertical bone loss"), ] for i, (t, d) in enumerate(siebert): y = 1.82 + i * 0.52 add_rect(slide, 6.75, y, 1.1, 0.42, ACCENT) add_textbox(slide, t, 6.75, y + 0.05, 1.1, 0.35, 11, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_textbox(slide, d, 7.92, y + 0.05, 4.9, 0.42, 11, color=TEXT_DARK, align=PP_ALIGN.LEFT, wrap=True) add_rect(slide, 6.7, 3.4, 6.3, 0.45, MID_BLUE) add_textbox(slide, "Lekholm & Zarb — Bone Quality (Types 1–4)", 6.75, 3.43, 6.2, 0.4, 12, bold=True, color=WHITE, align=PP_ALIGN.LEFT) lz_qual = [ ("Type 1", "Almost entire jaw = homogenous compact bone (densest)"), ("Type 2", "Thick compact bone surrounds dense trabecular core"), ("Type 3", "Thin cortical bone + dense trabecular bone of favourable strength"), ("Type 4", "Thin cortical bone + core of LOW DENSITY trabecular bone (softest)"), ] for i, (t, d) in enumerate(lz_qual): y = 3.95 + i * 0.52 add_rect(slide, 6.75, y, 1.1, 0.42, GOLD) add_textbox(slide, t, 6.75, y + 0.05, 1.1, 0.35, 11, bold=True, color=DARK_BLUE, align=PP_ALIGN.CENTER) add_textbox(slide, d, 7.92, y + 0.05, 4.9, 0.42, 11, color=TEXT_DARK, align=PP_ALIGN.LEFT, wrap=True) # ============================================================ # SLIDE 4: DIAGNOSIS — 5 EXAMINATIONS # ============================================================ slide = prs.slides.add_slide(blank_layout) add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GRAY) add_rect(slide, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(slide, 0, 1.1, 13.333, 0.06, ACCENT) add_rect(slide, 0, 1.1, 0.07, 6.4, ACCENT) add_textbox(slide, "Pre-Implant Diagnosis — Five Key Examinations", 0.25, 0.18, 12.8, 0.75, 26, bold=True, color=WHITE, align=PP_ALIGN.LEFT) add_textbox(slide, "Dr. Shreya Chindak", 0.25, 0.78, 5.0, 0.32, 12, bold=False, color=ACCENT, align=PP_ALIGN.LEFT) exams = [ ("A. Periodontal", MID_BLUE, [ "• Soft and hard supporting tissues of dentition", "• Tissue biotype: thin vs thick periodontium", "• Probing depths + gingival recession measurement", "• Crestal alveolar bone level (bone sounding)", "• Mucogingival problems, furcation involvement", "• Ridge collapse: horizontal + vertical (Siebert I, II, III)", ]), ("B. Occlusal", ACCENT, [ "• Identify parafunctional habits (bruxism, clenching)", "• Opposing occlusion and restorative material selection", "• Mounted diagnostic casts evaluation", "• Vertical and horizontal overlap assessment", "• Restorative space — lack of space = mechanical failure", "• Over-erupted teeth causing occlusal interferences", ]), ("C. Endodontic", MID_BLUE, [ "• Vitality of remaining dentition", "• Periapical lesions and incomplete root canals", "• Poor endodontic prognosis = risk assessment required", "• Protect future implant sites from pathology", ]), ("D. Restorative", ACCENT, [ "• Margin integrity of existing restorations", "• Biologic width violations requiring crown lengthening", "• Strategic value of each compromised tooth", "• Sequential extraction for phased implant healing", "• Teeth with poor prognosis may support interim prosthesis", ]), ("E. Orthodontic", MID_BLUE, [ "• Restorative space analysis (M-D root positions)", "• Root angulation and tipping affect implant space", "• Complete ortho BEFORE implant placement in aesthetics", "• Provisional implants can provide anchorage", "• Final implants placed only after ortho wax-up confirms", ]), ] positions = [ (0.25, 1.22, 3.85), (4.22, 1.22, 3.85), (8.2, 1.22, 4.9), (0.25, 4.15, 3.85), (4.22, 4.15, 8.85), ] heights = [2.75, 2.75, 2.75, 3.1, 3.1] for i, (title, color, bullets) in enumerate(exams): x, y, w = positions[i] h = heights[i] add_rect(slide, x, y, w, h, WHITE) add_rect(slide, x, y, w, 0.42, color) add_textbox(slide, title, x + 0.08, y + 0.05, w - 0.15, 0.35, 12, bold=True, color=WHITE, align=PP_ALIGN.LEFT) for j, bullet in enumerate(bullets): yb = y + 0.55 + j * 0.36 add_textbox(slide, bullet, x + 0.1, yb, w - 0.2, 0.35, 10, color=TEXT_DARK, align=PP_ALIGN.LEFT, wrap=True) # F. Radiographic add_rect(slide, 8.2, 4.15, 4.9, 3.1, WHITE) add_rect(slide, 8.2, 4.15, 4.9, 0.42, DARK_BLUE) add_textbox(slide, "F. Radiographic Examination", 8.28, 4.18, 4.75, 0.35, 12, bold=True, color=WHITE, align=PP_ALIGN.LEFT) rad_bullets = [ "• Full-mouth periapical + bitewing X-rays", "• Panorex (limited compared to CT scan)", "• 3D CT scan — GOLD STANDARD", " - Diagnostic wax-up → radiographic guide", " - Radiographic guide in mouth during CT", " - Measures H & V bone loss accurately", " - CAD-CAM virtual planning (Nobel ARK, Simplant)", ] for j, bullet in enumerate(rad_bullets): yb = 4.68 + j * 0.35 add_textbox(slide, bullet, 8.28, yb, 4.75, 0.33, 10, color=TEXT_DARK, align=PP_ALIGN.LEFT, wrap=True) # ============================================================ # SLIDE 5: LEKHOLM & ZARB BONE QUANTITY + SURGICAL OVERVIEW # ============================================================ slide = prs.slides.add_slide(blank_layout) add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GRAY) add_rect(slide, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(slide, 0, 1.1, 13.333, 0.06, ACCENT) add_rect(slide, 0, 1.1, 0.07, 6.4, ACCENT) add_textbox(slide, "Bone Classification & Surgical Pre-Planning", 0.25, 0.18, 12.8, 0.75, 28, bold=True, color=WHITE, align=PP_ALIGN.LEFT) add_textbox(slide, "Dr. Shreya Chindak", 0.25, 0.78, 5.0, 0.32, 12, bold=False, color=ACCENT, align=PP_ALIGN.LEFT) # Left: Quantity add_rect(slide, 0.25, 1.22, 6.1, 5.95, WHITE) add_rect(slide, 0.25, 1.22, 6.1, 0.45, MID_BLUE) add_textbox(slide, "Lekholm & Zarb — Ridge Quantity (Shapes a–e)", 0.32, 1.25, 5.95, 0.38, 12, bold=True, color=WHITE) shapes_data = [ ("Shape a", "No bone resorption — ideal ridge form"), ("Shape b", "Slight resorption — minimal volume loss"), ("Shape c", "Moderate resorption — adequate bone remains"), ("Shape d", "Advanced resorption — compromised"), ("Shape e", "Extreme resorption — very challenging"), ] for i, (s, d) in enumerate(shapes_data): y = 1.8 + i * 0.52 add_rect(slide, 0.3, y, 1.3, 0.42, ACCENT) add_textbox(slide, s, 0.3, y + 0.06, 1.3, 0.3, 11, bold=True, color=DARK_BLUE, align=PP_ALIGN.CENTER) add_textbox(slide, d, 1.68, y + 0.06, 4.5, 0.38, 11, color=TEXT_DARK) add_rect(slide, 0.25, 4.45, 6.1, 0.45, MID_BLUE) add_textbox(slide, "Resorption Patterns", 0.32, 4.48, 5.95, 0.38, 12, bold=True, color=WHITE) resorption_notes = [ "• Anterior Maxilla: Resorbs posteriorly & superiorly", " → affects aesthetic zone and lip support", "• Posterior Ridges: Resorbs buccally", " → affects occlusion and horizontal overlap", "• Buccal collapse → implants placed more lingually", " → buccal over-contouring; unfavourable loading", ] for j, line in enumerate(resorption_notes): add_textbox(slide, line, 0.32, 5.0 + j * 0.33, 5.9, 0.32, 11, color=TEXT_DARK, wrap=True) # Right: Pre-surgical Planning add_rect(slide, 6.7, 1.22, 6.3, 5.95, WHITE) add_rect(slide, 6.7, 1.22, 6.3, 0.45, DARK_BLUE) add_textbox(slide, "Pre-Surgical Planning Steps", 6.78, 1.25, 6.15, 0.38, 12, bold=True, color=WHITE) planning = [ ("STEP 1", "CT Scan + Radiographic Guide", "Diagnostic wax-up → radiographic guide fabricated → guide placed in mouth during CT scan"), ("STEP 2", "CT Cross-sectional Analysis", "Review cross-sectional reformatted images: bone quantity AND quality at each planned implant site"), ("STEP 3", "Surgical Guide Fabrication", "Radiographic guide adapted into surgical guide. CAD-CAM technology allows virtual planning (Nobel Biocare ARK, Simplant)"), ("STEP 4", "Team Treatment Planning", "All treating doctors review plan together. Financial, consent, and aesthetic goals finalised BEFORE any surgery"), ("STEP 5", "Implant Component Selection", "All team members agree on: screw vs cement retained, implant system, dimensions. Affects surgical angulation decisions"), ] for i, (step, title, body) in enumerate(planning): y = 1.8 + i * 1.08 add_rect(slide, 6.75, y, 1.1, 0.9, GOLD) add_textbox(slide, step, 6.75, y + 0.2, 1.1, 0.5, 10, bold=True, color=DARK_BLUE, align=PP_ALIGN.CENTER) add_textbox(slide, title, 7.92, y, 4.9, 0.38, 11, bold=True, color=DARK_BLUE, align=PP_ALIGN.LEFT) add_textbox(slide, body, 7.92, y + 0.38, 4.9, 0.55, 10, color=TEXT_DARK, align=PP_ALIGN.LEFT, wrap=True) # ============================================================ # SLIDE 6: FLAP DESIGN & IMPLANT POSITION # ============================================================ slide = prs.slides.add_slide(blank_layout) add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GRAY) add_rect(slide, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(slide, 0, 1.1, 13.333, 0.06, ACCENT) add_rect(slide, 0, 1.1, 0.07, 6.4, ACCENT) add_textbox(slide, "Flap Design, Surgical Protocols & Implant Positioning", 0.25, 0.18, 12.8, 0.75, 26, bold=True, color=WHITE, align=PP_ALIGN.LEFT) add_textbox(slide, "Dr. Shreya Chindak", 0.25, 0.78, 5.0, 0.32, 12, bold=False, color=ACCENT, align=PP_ALIGN.LEFT) # Protocols add_rect(slide, 0.25, 1.22, 5.8, 2.85, WHITE) add_rect(slide, 0.25, 1.22, 5.8, 0.42, MID_BLUE) add_textbox(slide, "Surgical Protocol Evolution", 0.32, 1.24, 5.7, 0.38, 12, bold=True, color=WHITE) protocols = [ ("Brånemark (Original)", "2-stage: buried implant → 3–6 months healing → second stage surgery to connect abutment. Vestibular flap."), ("ITI One-Stage Protocol", "Implant extends through soft tissue during healing. Crestal incision or flapless approach. Requires adequate keratinised tissue."), ("Modern Standard", "One-stage protocol most common. Roughened implant surface allows faster osseointegration. Immediate loading now popular."), ] for i, (t, d) in enumerate(protocols): y = 1.75 + i * 0.77 add_rect(slide, 0.3, y, 2.0, 0.65, ACCENT if i % 2 == 0 else GOLD) add_textbox(slide, t, 0.3, y + 0.1, 2.0, 0.45, 10, bold=True, color=DARK_BLUE if i % 2 != 0 else WHITE, align=PP_ALIGN.CENTER, wrap=True) add_textbox(slide, d, 2.38, y + 0.05, 3.5, 0.62, 10, color=TEXT_DARK, wrap=True) # Flap design add_rect(slide, 0.25, 4.2, 5.8, 2.97, WHITE) add_rect(slide, 0.25, 4.2, 5.8, 0.42, DARK_BLUE) add_textbox(slide, "Flapless Technique — Indications & Cautions", 0.32, 4.22, 5.7, 0.38, 12, bold=True, color=WHITE) flapless = [ "IDEAL CANDIDATE: Adequate bone width + plenty of keratinised tissue", "RISK: Compromised visibility during drilling", "AESTHETIC ZONE: Needs adequate buccal thickness for long-term ST stability", "L. Abrams Roll Technique: Transfer crestal thick tissue to buccal (additive)", "Punch technique = subtractive — not preferred in aesthetic zone", "Two-stage protocol in aesthetic zone allows 2nd surgical correction opportunity", ] for j, line in enumerate(flapless): bold = line.startswith("IDEAL") or line.startswith("RISK") or line.startswith("AESTHETIC") color = MID_BLUE if bold else TEXT_DARK add_textbox(slide, line, 0.32, 4.72 + j * 0.38, 5.65, 0.36, 10, bold=bold, color=color, wrap=True) # Positioning add_rect(slide, 6.35, 1.22, 6.7, 5.95, WHITE) add_rect(slide, 6.35, 1.22, 6.7, 0.42, MID_BLUE) add_textbox(slide, "Implant Position & Angulation — Critical Dimensions", 6.42, 1.24, 6.6, 0.38, 12, bold=True, color=WHITE) pos_data = [ ("Subgingival Depth", "3–4 mm subgingival placement of implant platform in aesthetic zone"), ("Buccal Position", "Buccal aspect of implant platform ≥ 1 mm palatal/lingual to future buccal gingival margin"), ("Wide Platform", "Provides smoother gingival-restorative interface but greater risk of apical tissue migration"), ("Platform Switching", "Narrower restorative component on wider implant platform (eg 3i) — helps preserve crestal bone and supports soft tissue. Needs more research."), ("Surgical Guide Use", "Round bur starting point can be adjusted; angulation tipped to avoid dehiscence/fenestration"), ("Countersinking", "Usually restorative-driven for aesthetics/emergence. In soft bone — AVOID countersinking; keep platform at crest or supra-crestal."), ("Inter-implant Distance", ">3 mm between fixtures for preservation of interproximal bone and papilla"), ] for i, (t, d) in enumerate(pos_data): y = 1.78 + i * 0.76 add_rect(slide, 6.4, y, 2.2, 0.65, ACCENT if i % 2 == 0 else RGBColor(0xE8, 0xF4, 0xFF)) add_textbox(slide, t, 6.4, y + 0.08, 2.2, 0.5, 10, bold=True, color=DARK_BLUE if i % 2 != 0 else WHITE, align=PP_ALIGN.CENTER, wrap=True) add_textbox(slide, d, 8.68, y + 0.05, 4.2, 0.65, 10, color=TEXT_DARK, wrap=True) # ============================================================ # SLIDE 7: DRILLING PROTOCOL — BONE TYPES # ============================================================ slide = prs.slides.add_slide(blank_layout) add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GRAY) add_rect(slide, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(slide, 0, 1.1, 13.333, 0.06, ACCENT) add_rect(slide, 0, 1.1, 0.07, 6.4, ACCENT) add_textbox(slide, "Drilling Protocols — Dense vs Soft Bone", 0.25, 0.18, 12.8, 0.75, 28, bold=True, color=WHITE, align=PP_ALIGN.LEFT) add_textbox(slide, "Dr. Shreya Chindak", 0.25, 0.78, 5.0, 0.32, 12, bold=False, color=ACCENT, align=PP_ALIGN.LEFT) # Dense bone add_rect(slide, 0.25, 1.22, 6.1, 5.95, WHITE) add_rect(slide, 0.25, 1.22, 6.1, 0.45, MID_BLUE) add_textbox(slide, "DENSE BONE — Types 1 & 2", 0.32, 1.25, 5.95, 0.38, 13, bold=True, color=WHITE) dense_pts = [ "• Careful drilling with ADEQUATE IRRIGATION mandatory", "• Prevent overheating of bone (heat kills osteoblasts!)", "• Final drill widens site to manufacturer's recommended diameter before tapping", "• Placing implant into too-tight a site → pressure necrosis → failure", "• Implant shape (parallel vs tapered) affects tightness (primary stability)", "", "CONCERN: PRESSURE NECROSIS", "If resistance during seating is excessive — STOP.", "Under-drilling the final diameter is better than over-torquing.", "", "PARALLEL WALL IMPLANTS", "• Twist drills have markings (depth slightly longer than implant)", "• Can be placed deeper if needed", "• CAUTION: extra tip at drill end — care near alveolar canal (posterior mandible)", ] for j, line in enumerate(dense_pts): bold = line.isupper() or line.startswith("CONCERN") or line.startswith("PARALLEL") or line.startswith("CAUTION") color = MID_BLUE if (line.isupper() or line.startswith("CONCERN") or line.startswith("PARALLEL")) else TEXT_DARK if line: add_textbox(slide, line, 0.32, 1.8 + j * 0.34, 5.9, 0.32, 10 if not bold else 11, bold=bold, color=color, wrap=True) # Soft bone add_rect(slide, 6.7, 1.22, 6.3, 5.95, WHITE) add_rect(slide, 6.7, 1.22, 6.3, 0.45, GOLD) add_textbox(slide, "SOFT BONE — Types 3 & 4", 6.78, 1.25, 6.15, 0.38, 13, bold=True, color=DARK_BLUE) soft_pts = [ "UNDER-PREPARATION IS KEY", "• Avoid over-preparation of osteotomy site", "• Inadvertent angulation changes → cannot place implant", "", "OSTEOTOME TECHNIQUE", "• Compress soft bone rather than remove it (drilling)", "• Improves initial stabilisation", "• Also used for sinus floor elevation", "", "TAPERED IMPLANTS IN SOFT BONE", "• Wedging effect improves stability", "• More challenging: depth preparation must be exact", "• Final position cannot be adjusted like parallel wall implant", "", "BI-CORTICAL FIXATION", "• Engage sinus floor (posterior maxilla) for extra anchorage", "• Improves primary stability in Type 3–4 bone", "", "COUNTERSINKING CAUTION", "• Countersinking may cause LOSS of initial stability", "• In soft bone: platform at crest or supra-crestal (if space allows)", "• Roughened implant surface → faster osseointegration", ] for j, line in enumerate(soft_pts): bold = line.isupper() or line.startswith("OSTEOTOME") or line.startswith("TAPERED") or line.startswith("BI-CORTICAL") or line.startswith("COUNTERSINKING") color = RGBColor(0xB8, 0x6B, 0x00) if (line.isupper() and line not in ["• Compress soft bone rather than remove it (drilling)"]) else TEXT_DARK if line: add_textbox(slide, line, 6.78, 1.8 + j * 0.3, 6.1, 0.28, 10 if not bold else 11, bold=bold, color=color, wrap=True) # ============================================================ # SLIDE 8: DEFICIENT RIDGE — LACK OF VERTICAL HEIGHT # ============================================================ slide = prs.slides.add_slide(blank_layout) add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GRAY) add_rect(slide, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(slide, 0, 1.1, 13.333, 0.06, ACCENT) add_rect(slide, 0, 1.1, 0.07, 6.4, ACCENT) add_textbox(slide, "Deficient Osseous Ridge — Lack of Vertical Height", 0.25, 0.18, 12.8, 0.75, 26, bold=True, color=WHITE, align=PP_ALIGN.LEFT) add_textbox(slide, "Dr. Shreya Chindak", 0.25, 0.78, 5.0, 0.32, 12, bold=False, color=ACCENT, align=PP_ALIGN.LEFT) # Anterior Maxilla add_rect(slide, 0.25, 1.22, 5.8, 5.95, WHITE) add_rect(slide, 0.25, 1.22, 5.8, 0.45, MID_BLUE) add_textbox(slide, "Anterior Maxilla — Vertical Resorption", 0.32, 1.25, 5.7, 0.38, 12, bold=True, color=WHITE) ant_max = [ "PROBLEM: Vertical resorption affects aesthetics", "• Partial edentulous: aesthetic zone at risk", "• Fully edentulous: may limit to removable overdenture", "", "OPTION 1: Onlay Block Graft", "• Autogenous bone from intra-oral (ramus / chin) OR", " extra-oral (iliac crest / calvaria)", "• Greater defect = more bone required", "• Extra-oral: general anaesthesia + greater morbidity", "• Intra-oral: better for partially edentulous situations", "• Cortical-cancellous block adapted and fixated with screws", "• Building vertical height = LEAST predictable grafting option", "", "OPTION 2: Distraction Osteogenesis", "• Surgical osteotomy + distraction device", "• Activated daily — bone moves coronally over weeks", "• Bone left to mature for months before implant placement", "• Used when inter-arch space is NOT a problem", ] for j, line in enumerate(ant_max): bold = line.isupper() or line.startswith("OPTION") color = MID_BLUE if (line.isupper() or line.startswith("OPTION")) else TEXT_DARK if line: add_textbox(slide, line, 0.32, 1.8 + j * 0.31, 5.65, 0.3, 10 if not bold else 11, bold=bold, color=color, wrap=True) # Posterior Maxilla add_rect(slide, 6.35, 1.22, 6.7, 5.95, WHITE) add_rect(slide, 6.35, 1.22, 6.7, 0.45, DARK_BLUE) add_textbox(slide, "Posterior Maxilla — Sinus Proximity Challenges", 6.42, 1.25, 6.6, 0.38, 12, bold=True, color=WHITE) post_max = [ "CHALLENGES: Bone loss + sinus proximity + soft Type 3–4 bone", "Most common tooth loss: maxillary molars (furcation involvement)", "", "SINUS LIFT — Lateral Wall Approach (Boyne et al.)", "• Open sinus via lateral wall window", "• Elevate sinus membrane (Schneider's membrane)", "• Pack bone graft material into space", "• GOLD STANDARD: autogenous bone (chin, ramus, tuberosity)", "• Mixed with osteo-conductive material (HA, Bio-Oss, FDBA)", "• Optional: Platelet Rich Plasma (PRP) to aid healing", "• Wait 5–6 months healing before implant placement", "• If ≥5 mm bone: simultaneous placement possible (less predictable)", "", "OSTEOTOME TECHNIQUE (if ≥7–8 mm bone height)", "• Drill initial twist drills 3 mm short of sinus floor", "• Place osteotome → in-fracture sinus floor upward", "• Pack bone graft → place implant simultaneously", "• Less invasive but MORE technique-sensitive", "• Risk: sinus membrane perforation", "", "POSTERIOR MANDIBLE", "• Inferior alveolar nerve limits placement", "• Short wide implants or nerve transposition (high morbidity)", "• Distal cantilever off mesial implants = alternative option", ] for j, line in enumerate(post_max): bold = line.startswith("CHALLENGES") or line.startswith("SINUS") or line.startswith("OSTEOTOME") or line.startswith("POSTERIOR") color = RGBColor(0x0D, 0x2B, 0x55) if bold else TEXT_DARK if line: add_textbox(slide, line, 6.42, 1.8 + j * 0.22, 6.5, 0.21, 9 if not bold else 10, bold=bold, color=color, wrap=True) # ============================================================ # SLIDE 9: DEFICIENT RIDGE — LACK OF HORIZONTAL WIDTH # ============================================================ slide = prs.slides.add_slide(blank_layout) add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GRAY) add_rect(slide, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(slide, 0, 1.1, 13.333, 0.06, ACCENT) add_rect(slide, 0, 1.1, 0.07, 6.4, ACCENT) add_textbox(slide, "Deficient Osseous Ridge — Lack of Horizontal Width", 0.25, 0.18, 12.8, 0.75, 26, bold=True, color=WHITE, align=PP_ALIGN.LEFT) add_textbox(slide, "Dr. Shreya Chindak", 0.25, 0.78, 5.0, 0.32, 12, bold=False, color=ACCENT, align=PP_ALIGN.LEFT) sections = [ ("Anterior Maxilla — Horizontal Deficiency", MID_BLUE, [ "PATTERNS: Knife-edge ridges or concavity type defects", "• Anterior incisal foramen: if large → restricts central implant placement", "", "KNIFE-EDGE RIDGES:", "• Veneer grafts = intra-oral cortical-cancellous block (most predictable)", "• Block stabilised with fixation screws", "• Remove screws after 6 months at implant placement surgery", "", "CONCAVITY DEFECTS:", "• Block grafts OR Guided Bone Regeneration (GBR)", "• Particulate graft (ramus scrapings + HA)", "• Covered with resorbable or non-resorbable membrane", "• Titanium-reinforced membrane if spacemaking desired", "", "NARROW RIDGES:", "• Osteotome spreading (bone expansion)", "• Split-ridge technique + simultaneous implant placement", ]), ("Anterior & Posterior Mandible", DARK_BLUE, [ "• Block grafts with fixation screws (GBR)", "• Same principles: autogenous bone + particulate", "", "KEY SUCCESS FACTORS:", "• Check vestibule depth before planning flap", "• Flap must advance WITHOUT TENSION for closure", "• Tension-free closure is mandatory for graft survival", "• Vertical releasing incisions ≥ 1 tooth distant from graft", ]), ("Soft Tissue Augmentation Techniques", ACCENT, [ "LANGER TECHNIQUE (Sub-Epithelial CT Graft)", "• Most common donor: palatal tissue mesial to 1st molar", "• Useful for thin tissue augmentation + minor ridge resorption", "", "TUBEROSITY TISSUE", "• Especially useful when thicker graft needed", "• Ideal for ridge augmentation (inlay or pouch technique)", "", "PALACCI ROTATED FLAP", "• Papilla regeneration technique", "• Important: building supporting bone beneath soft tissue", " produces most predictable soft tissue outcome", ]), ] positions2 = [ (0.25, 1.22, 6.1, 5.95), (6.7, 1.22, 6.3, 2.6), (6.7, 4.0, 6.3, 3.17), ] for i, (title, color, bullets) in enumerate(sections): x, y, w, h = positions2[i] add_rect(slide, x, y, w, h, WHITE) add_rect(slide, x, y, w, 0.42, color) add_textbox(slide, title, x + 0.08, y + 0.05, w - 0.15, 0.35, 12, bold=True, color=WHITE) for j, line in enumerate(bullets): bold = line.isupper() or line.startswith("KEY") or line.startswith("LANGER") or line.startswith("TUBEROSITY") or line.startswith("PALACCI") lcolor = (MID_BLUE if color == MID_BLUE else (DARK_BLUE if color == DARK_BLUE else RGBColor(0x00, 0x6A, 0x9E))) if bold else TEXT_DARK if line: add_textbox(slide, line, x + 0.1, y + 0.55 + j * 0.31, w - 0.2, 0.3, 10 if not bold else 11, bold=bold, color=lcolor, wrap=True) # ============================================================ # SLIDE 10: TOOTH REMOVAL — TIMING OPTIONS # ============================================================ slide = prs.slides.add_slide(blank_layout) add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GRAY) add_rect(slide, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(slide, 0, 1.1, 13.333, 0.06, ACCENT) add_rect(slide, 0, 1.1, 0.07, 6.4, ACCENT) add_textbox(slide, "Teeth Requiring Removal — Timing Options & Decision Factors", 0.25, 0.18, 12.8, 0.75, 24, bold=True, color=WHITE, align=PP_ALIGN.LEFT) add_textbox(slide, "Dr. Shreya Chindak", 0.25, 0.78, 5.0, 0.32, 12, bold=False, color=ACCENT, align=PP_ALIGN.LEFT) # Decision box add_rect(slide, 0.25, 1.22, 4.2, 1.4, WHITE) add_rect(slide, 0.25, 1.22, 4.2, 0.42, MID_BLUE) add_textbox(slide, "Ask These Questions Before Extraction", 0.32, 1.25, 4.1, 0.38, 12, bold=True, color=WHITE) qs = [ "1. Is the tooth in the aesthetic zone?", "2. What is the tissue biotype? (thin scalloped or thick flat)", "3. How much bone loss from perio/endo failure?", "4. How predictable is gingival architecture stability?", ] for j, q in enumerate(qs): add_textbox(slide, q, 0.32, 1.75 + j * 0.23, 4.1, 0.22, 10, color=TEXT_DARK, wrap=True) # Timing options timing = [ ("Option 1", MID_BLUE, "Extract → Wait months → Place implant", "Standard approach. Allows soft tissue maturity. Good for most cases."), ("Option 2", ACCENT, "Orthodontic Forced Eruption → Then Extract", "Move gingival complex + crestal bone coronally before extraction. Best when bone level at extraction site is deficient (Figs 62–67)."), ("Option 3", GOLD, "Extract + Socket Bone Graft", "Preserve soft tissue contours. Minimise ridge collapse. Use when: buccal plate is thin OR has slight dehiscence."), ("Option 4", MID_BLUE, "Extract + Immediate Implant (same visit)", "Only for single-rooted teeth with thick, intact buccal plate.\n a) Two-stage buried\n b) One-stage with healing abutment\n c) Immediate load with provisional restoration"), ("Option 5", ACCENT, "Extract → Wait 2–3 months → Bone Graft → Wait 5–6 months → Implant", "Best for cases with expected advanced ridge resorption after extraction. Most staged and predictable."), ] for i, (opt, color, title, body) in enumerate(timing): y = 1.22 if i == 0 else (1.22 + i * 1.16) x = 4.65 if i == 0: y = 2.75 else: y = 2.75 + i * 1.0 add_rect(slide, x, y, 8.4, 0.9, WHITE) add_rect(slide, x, y, 1.3, 0.9, color) add_textbox(slide, opt, x, y + 0.2, 1.3, 0.5, 12, bold=True, color=WHITE if color != GOLD else DARK_BLUE, align=PP_ALIGN.CENTER) add_textbox(slide, title, x + 1.38, y + 0.04, 6.85, 0.35, 11, bold=True, color=DARK_BLUE, wrap=True) add_textbox(slide, body, x + 1.38, y + 0.42, 6.85, 0.45, 10, color=TEXT_DARK, wrap=True) # Key notes bottom add_rect(slide, 0.25, 6.35, 12.85, 0.9, WHITE) add_rect(slide, 0.25, 6.35, 0.06, 0.9, GOLD) add_textbox(slide, "KEY NOTES: If advanced ridge resorption expected → stage with multiple procedures. Gruender: simultaneous implant + GBR (Bio-OSS + membrane) if ideal position achievable. Buser: GBR then wait 6 months before implant for predictable aesthetics. Orthodontic forced eruption (Salama & Salama) before extraction reduces bony defect.", 0.4, 6.4, 12.6, 0.8, 10, color=TEXT_DARK, wrap=True) # ============================================================ # SLIDE 11: LOADING PROTOCOLS & TIMING # ============================================================ slide = prs.slides.add_slide(blank_layout) add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GRAY) add_rect(slide, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(slide, 0, 1.1, 13.333, 0.06, ACCENT) add_rect(slide, 0, 1.1, 0.07, 6.4, ACCENT) add_textbox(slide, "Loading Protocols, Primary Stability & Timing", 0.25, 0.18, 12.8, 0.75, 26, bold=True, color=WHITE, align=PP_ALIGN.LEFT) add_textbox(slide, "Dr. Shreya Chindak", 0.25, 0.78, 5.0, 0.32, 12, bold=False, color=ACCENT, align=PP_ALIGN.LEFT) # Left: loading add_rect(slide, 0.25, 1.22, 6.1, 5.95, WHITE) add_rect(slide, 0.25, 1.22, 6.1, 0.45, MID_BLUE) add_textbox(slide, "Surface Modification & Osseointegration", 0.32, 1.25, 5.95, 0.38, 12, bold=True, color=WHITE) loading_pts = [ "• Roughened implant surface (vs original smooth machined finish)", " → Improves rate of bone healing adjacent to implant", " → Allows quicker osseointegration", "", "PRIMARY STABILITY = #1 Factor for Success", "• Achieved by bone quality, drill protocol, implant design", "• OsstellTM Machine: resonance frequency analysis (ISQ)", " → Objective measurement of fixture stability", " → Guides decision on loading timing", "", "CAUSES OF FAILURE:", "• Micro-motion during initial bone healing → NO integration", "• Most common cause: overloading via removable appliance", " transmitting trans-mucosal forces over healing implant", "", "TRANSITIONAL IMPLANTS", "• Developed to support interim fixed or removable prostheses", "• Also used as surgical guide anchors", "• Adapted for orthodontic anchorage (lack of dental anchorage)", "", "KEY ADVANTAGE OF FIXED PROVISIONALS:", "• Easier patient management during healing phases", "• Avoid removable appliance forces on healing implant", ] for j, line in enumerate(loading_pts): bold = line.startswith("PRIMARY") or line.startswith("CAUSES") or line.startswith("TRANSITIONAL") or line.startswith("KEY ADVANTAGE") color = MID_BLUE if bold else TEXT_DARK if line: add_textbox(slide, line, 0.32, 1.82 + j * 0.28, 5.9, 0.27, 10 if not bold else 11, bold=bold, color=color, wrap=True) # Right: immediate loading add_rect(slide, 6.7, 1.22, 6.3, 5.95, WHITE) add_rect(slide, 6.7, 1.22, 6.3, 0.45, DARK_BLUE) add_textbox(slide, "Immediate Loading Protocol", 6.78, 1.25, 6.15, 0.38, 12, bold=True, color=WHITE) imm_load = [ "CRITERIA for Immediate Loading:", "• Initial stability must be EXTREMELY TIGHT", "• Careful occlusal adjustment of provisional required", "• Continuous monitoring throughout healing", "", "BEST CANDIDATES:", "• Single anterior teeth (lower occlusal forces)", "• Fully edentulous cases: rigid splinted interim prosthesis", "", "WORST CANDIDATES:", "• Posterior teeth (far greater occlusal forces)", "• Soft bone sites (Type 3–4)", "", "AESTHETIC ZONE WARNING:", "• Extraction + immediate implant + immediate provisional", " = Higher risk option", "• Difficult to predict future buccal tissue contour due to shrinkage", "• BENEFIT: supports adjacent papilla", "• Long-term research on predictability still lacking (2006)", "", "ORIGINAL DELAYED LOADING PROTOCOL:", "• 3 months mandible / 6 months maxilla before loading", "• Still the gold standard for reliability in 2006", "• Not always necessary with modern surfaces", ] for j, line in enumerate(imm_load): bold = line.startswith("CRITERIA") or line.startswith("BEST") or line.startswith("WORST") or line.startswith("AESTHETIC") or line.startswith("ORIGINAL") color = DARK_BLUE if bold else TEXT_DARK if line: add_textbox(slide, line, 6.78, 1.82 + j * 0.25, 6.1, 0.24, 10 if not bold else 11, bold=bold, color=color, wrap=True) # ============================================================ # SLIDE 12: SURGICAL COMPLICATIONS & SPECIAL CONSIDERATIONS # ============================================================ slide = prs.slides.add_slide(blank_layout) add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GRAY) add_rect(slide, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(slide, 0, 1.1, 13.333, 0.06, ACCENT) add_rect(slide, 0, 1.1, 0.07, 6.4, ACCENT) add_textbox(slide, "Surgical Complications & Special Patient Considerations", 0.25, 0.18, 12.8, 0.75, 24, bold=True, color=WHITE, align=PP_ALIGN.LEFT) add_textbox(slide, "Dr. Shreya Chindak", 0.25, 0.78, 5.0, 0.32, 12, bold=False, color=ACCENT, align=PP_ALIGN.LEFT) # Complications add_rect(slide, 0.25, 1.22, 6.1, 4.4, WHITE) add_rect(slide, 0.25, 1.22, 6.1, 0.45, MID_BLUE) add_textbox(slide, "Post-Surgical Complications — Prevention", 0.32, 1.25, 5.95, 0.38, 12, bold=True, color=WHITE) comp_pts = [ "FLAP DESIGN", "• Careful planning of flap design is mandatory", "• Gentle soft tissue manipulation throughout surgery", "• Vertical releasing incisions ≥ 1 tooth distant from graft area", "", "BLEEDING CONTROL", "• Haemostasis is mandatory", "• Releasing incisions needed for tension-free flap advancement", "", "FLAP COVERAGE FAILURE", "• Sloughing or incision opening → delayed healing", "• Compromised results when coverage is lost", "• Prevention: close WITHOUT tension using resorbable sutures", "", "SMOKING", "• Greatest single risk factor for implant failure", "• Affects both hard AND soft tissue healing", "• Counsel patients strongly before treatment", ] for j, line in enumerate(comp_pts): bold = line.startswith("FLAP") or line.startswith("BLEEDING") or line.startswith("SMOKING") color = MID_BLUE if bold else TEXT_DARK if line: add_textbox(slide, line, 0.32, 1.82 + j * 0.32, 5.9, 0.3, 10 if not bold else 11, bold=bold, color=color, wrap=True) # Medical considerations add_rect(slide, 6.7, 1.22, 6.3, 4.4, WHITE) add_rect(slide, 6.7, 1.22, 6.3, 0.45, DARK_BLUE) add_textbox(slide, "Medically Compromised Patients", 6.78, 1.25, 6.15, 0.38, 12, bold=True, color=WHITE) med_pts = [ "NOT A CONTRAINDICATION but requires special attention:", "", "CONDITIONS REQUIRING CAREFUL MANAGEMENT:", "• Diabetes Mellitus", "• Autoimmune disease", "• Patients on long-term steroids", "• Prior radiation treatment", "", "APPROACH:", "• Logical and ethical decisions with patient + physicians", "• Higher failure rates associated with systemic disease", "• More frequent monitoring and modified protocols", "", "RISK FACTORS FOR FAILURE (Evidence-Based):", "• Smoking (Bain & Moy, 1993)", "• Systemic disease (Moy et al., 2005)", "• Poor bone quality (Type 3–4)", "• Lack of primary stability", "• Micro-motion during healing", "• Overloading with removable appliance", ] for j, line in enumerate(med_pts): bold = line.startswith("NOT A") or line.startswith("CONDITIONS") or line.startswith("APPROACH") or line.startswith("RISK FACTORS") color = DARK_BLUE if bold else TEXT_DARK if line: add_textbox(slide, line, 6.78, 1.82 + j * 0.27, 6.1, 0.26, 10 if not bold else 11, bold=bold, color=color, wrap=True) # Bottom summary bar add_rect(slide, 0.25, 5.75, 12.85, 1.5, WHITE) add_rect(slide, 0.25, 5.75, 0.06, 1.5, GOLD) add_rect(slide, 0.25, 5.75, 12.85, 0.42, RGBColor(0xE8, 0xF4, 0xFF)) add_textbox(slide, "Buccal Tissue Stability — Critical Point for Aesthetics", 0.4, 5.77, 12.6, 0.38, 12, bold=True, color=DARK_BLUE) buccal_text = ("During first year of bone remodelling: crestal resorption occurs down to the first thread of the implant — NOT just interproximally " "(as seen on X-ray) but also on the buccal aspect. This leads to buccal shrinkage and recession around the restoration. " "Buser recommends: staged GBR (block/particulate graft + membrane + fixation screws → 6 months → then implant placement).") add_textbox(slide, buccal_text, 0.4, 6.2, 12.6, 1.0, 10, color=TEXT_DARK, wrap=True) # ============================================================ # SLIDE 13: SUMMARY TABLE / QUICK REFERENCE # ============================================================ slide = prs.slides.add_slide(blank_layout) add_rect(slide, 0, 0, 13.333, 7.5, LIGHT_GRAY) add_rect(slide, 0, 0, 13.333, 1.1, DARK_BLUE) add_rect(slide, 0, 1.1, 13.333, 0.06, ACCENT) add_rect(slide, 0, 1.1, 0.07, 6.4, ACCENT) add_textbox(slide, "Quick Reference — Key Classifications & Rules", 0.25, 0.18, 12.8, 0.75, 26, bold=True, color=WHITE, align=PP_ALIGN.LEFT) add_textbox(slide, "Dr. Shreya Chindak", 0.25, 0.78, 5.0, 0.32, 12, bold=False, color=ACCENT, align=PP_ALIGN.LEFT) # Create a quick reference grid cards = [ ("Brånemark Protocol", MID_BLUE, "Mandible: 3 months healing\nMaxilla: 6 months healing\nBefore loading / abutment connection"), ("Sinus Lift Simultaneous", ACCENT, "≥5 mm: possible (less predictable)\n≥7–8 mm: Osteotome technique\n<5 mm: lift first, wait 5–6 months"), ("Dense Bone Drilling", MID_BLUE, "COOL DRILL + IRRIGATE\nFull diameter before tapping\nAvoid pressure necrosis"), ("Soft Bone Drilling", GOLD, "UNDER-PREPARE\nOsteotome technique\nTapered implant preferred"), ("Aesthetic Zone Depth", ACCENT, "Platform: 3–4 mm subgingival\nBuccal platform ≥1 mm palatal\nto future buccal gingival margin"), ("Platform Switching", MID_BLUE, "Narrower abutment on wider platform\nPreserves crestal bone (3i system)\nNeeds more research evidence"), ("Bone Graft Healing", DARK_BLUE, "Block graft: 6 months before implant\nSinus lift: 5–6 months before implant\nGBR: 6 months (Buser protocol)"), ("Smoking Risk", RGBColor(0xC0, 0x39, 0x2B), "Greatest single risk factor\nAffects hard + soft tissue healing\nCounsel STRONGLY pre-treatment"), ("Inter-Implant Distance", MID_BLUE, ">3 mm between implant fixtures\nPreserves interproximal bone\nSupports papilla formation"), ("Immediate Loading", ACCENT, "Extremely tight primary stability\nSingle anteriors best\nFully edentulous: rigid splint"), ("Tissue Biotype", DARK_BLUE, "Thin = scalloped, high risk\nThick = flat, more forgiving\nBone sounding = best parameter"), ("Key Risk Factors", RGBColor(0xC0, 0x39, 0x2B), "1. Smoking\n2. Systemic disease\n3. Poor bone quality\n4. Micro-motion\n5. Overloading"), ] for i, (title, color, body) in enumerate(cards): col = i % 4 row = i // 4 x = 0.25 + col * 3.27 y = 1.25 + row * 2.05 w = 3.1 h = 1.95 add_rect(slide, x, y, w, h, WHITE) add_rect(slide, x, y, w, 0.42, color) add_textbox(slide, title, x + 0.08, y + 0.05, w - 0.15, 0.35, 11, bold=True, color=WHITE if color != GOLD else DARK_BLUE, wrap=True) add_textbox(slide, body, x + 0.1, y + 0.5, w - 0.2, h - 0.6, 10, color=TEXT_DARK, wrap=True) # ============================================================ # SAVE # ============================================================ output_path = "/tmp/workspace/study-guide/Dental_Implant_Surgery_Study_Guide.pptx" prs.save(output_path) print(f"Saved: {output_path}") PYEOF
Dental Implant Surgery Study Guide
Presentation · PPTX
| Slide | Topic |
|---|---|
| 1 | Title Slide — "Surgical Guidelines for Dental Implant Placement" with Dr. Shreya Chindak below the title |
| 2 | Key Principles (IN BRIEF) — 6 core principles: restorative-driven planning, team approach, examination first, ridge reconstruction |
| 3 | Periodontal Diagnosis & Tissue Biotype — Becker/Ochenbein classification, Siebert classification, Kois crest levels, Lekholm & Zarb bone quality Types 1–4 |
| 4 | Five Key Pre-Implant Examinations — Periodontal, Occlusal, Endodontic, Restorative, Orthodontic, and Radiographic (CT scan workflow) |
| 5 | Bone Classification & Pre-Surgical Planning — Ridge shapes a–e, resorption patterns, 5-step surgical planning sequence |
| 6 | Flap Design & Implant Positioning — Protocol evolution (Brånemark → ITI → Modern), flapless technique, critical dimensions (3–4 mm subgingival, platform switching) |
| 7 | Drilling Protocols — Dense bone (Types 1–2) vs. soft bone (Types 3–4), osteotome technique, tapered implants, countersinking rules |
| 8 | Deficient Ridge — Vertical Height — Onlay block graft, distraction osteogenesis, sinus lift (lateral wall + osteotome), posterior mandible options |
| 9 | Deficient Ridge — Horizontal Width — Veneer grafts, GBR, split-ridge, Langer CT graft, Palacci rotated flap |
| 10 | Extraction Timing Options — 5 options from immediate placement to staged grafting, decision factors, Gruender & Buser protocols |
| 11 | Loading Protocols — Primary stability, Ostell machine, transitional implants, immediate loading criteria, delayed loading gold standard |
| 12 | Complications & Special Patients — Flap failure, smoking risk, medically compromised patients, buccal tissue stability warning |
| 13 | Quick Reference Card — 12 cards covering all key classifications, numbers, and clinical rules |
Make a pdf remove reference
python3 << 'PYEOF' from pptx import Presentation from pptx.util import Inches, Pt, Emu from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN, MSO_ANCHOR import subprocess, sys # First convert pptx to pdf using python-pptx to extract all slide content, # then render to PDF using reportlab # Check available tools import importlib for lib in ['reportlab', 'pypdf', 'pptx']: try: importlib.import_module(lib) print(f"{lib}: OK") except ImportError as e: print(f"{lib}: MISSING - {e}") PYEOF
python3 << 'PYEOF' from reportlab.lib.pagesizes import landscape, A4 from reportlab.lib import colors from reportlab.lib.units import inch, cm from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, PageBreak, KeepTogether from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT from reportlab.platypus import BaseDocTemplate, PageTemplate, Frame from reportlab.lib.colors import HexColor import os output_path = "/tmp/workspace/study-guide/Dental_Implant_Surgery_Study_Guide.pdf" # Color palette DARK_BLUE = HexColor('#0D2B55') MID_BLUE = HexColor('#15579A') ACCENT = HexColor('#00A8E8') GOLD = HexColor('#F0A500') WHITE = colors.white LIGHT_GRAY= HexColor('#F2F5FA') TEXT_DARK = HexColor('#1A1A2E') PALE_BLUE = HexColor('#CCE5FF') RED_COLOR = HexColor('#C0392B') W, H = landscape(A4) # 841.89 x 595.28 styles = getSampleStyleSheet() def style(name, **kwargs): return ParagraphStyle(name, **kwargs) title_style = style('Title2', fontName='Helvetica-Bold', fontSize=28, textColor=WHITE, alignment=TA_CENTER, spaceAfter=4) subtitle_style = style('Subtitle2', fontName='Helvetica', fontSize=16, textColor=ACCENT, alignment=TA_CENTER, spaceAfter=4) author_style = style('Author2', fontName='Helvetica-Bold', fontSize=14, textColor=GOLD, alignment=TA_CENTER, spaceAfter=4) source_style = style('Source2', fontName='Helvetica', fontSize=9, textColor=PALE_BLUE, alignment=TA_CENTER, spaceAfter=0) h1 = style('H1', fontName='Helvetica-Bold', fontSize=15, textColor=WHITE, alignment=TA_LEFT, spaceAfter=2, spaceBefore=0) h2 = style('H2', fontName='Helvetica-Bold', fontSize=12, textColor=WHITE, alignment=TA_LEFT, spaceAfter=2, spaceBefore=0) h3 = style('H3', fontName='Helvetica-Bold', fontSize=10, textColor=DARK_BLUE, alignment=TA_LEFT, spaceAfter=1, spaceBefore=0) body = style('Body2', fontName='Helvetica', fontSize=9, textColor=TEXT_DARK, alignment=TA_LEFT, spaceAfter=1, spaceBefore=0, leading=13) body_bold = style('BodyBold', fontName='Helvetica-Bold', fontSize=9, textColor=DARK_BLUE, alignment=TA_LEFT, spaceAfter=1, spaceBefore=0, leading=13) body_accent = style('BodyAccent', fontName='Helvetica-Bold', fontSize=9, textColor=MID_BLUE, alignment=TA_LEFT, spaceAfter=1, spaceBefore=0, leading=13) small = style('Small', fontName='Helvetica', fontSize=8, textColor=TEXT_DARK, alignment=TA_LEFT, spaceAfter=1, leading=11) small_bold = style('SmallBold', fontName='Helvetica-Bold', fontSize=8, textColor=DARK_BLUE, alignment=TA_LEFT, spaceAfter=1, leading=11) def hdr_cell(text, bg=DARK_BLUE, fg=WHITE, fontsize=10, bold=True): fn = 'Helvetica-Bold' if bold else 'Helvetica' s = ParagraphStyle('hc', fontName=fn, fontSize=fontsize, textColor=fg, alignment=TA_LEFT, leading=fontsize+3) return Paragraph(text, s) def body_cell(text, fg=TEXT_DARK, fontsize=9, bold=False, align=TA_LEFT): fn = 'Helvetica-Bold' if bold else 'Helvetica' s = ParagraphStyle('bc', fontName=fn, fontSize=fontsize, textColor=fg, alignment=align, leading=fontsize+3) return Paragraph(text, s) def section_header(text, bg=DARK_BLUE): return Table([[Paragraph(text, h2)]], colWidths=[W - 80], style=TableStyle([ ('BACKGROUND', (0,0), (-1,-1), bg), ('TOPPADDING', (0,0), (-1,-1), 6), ('BOTTOMPADDING', (0,0), (-1,-1), 6), ('LEFTPADDING', (0,0), (-1,-1), 10), ])) story = [] # ═══════════════════════════════════════════ # PAGE 1: TITLE PAGE # ═══════════════════════════════════════════ title_table = Table([ [Paragraph("Surgical Guidelines for Dental Implant Placement", title_style)], [Paragraph("A Comprehensive Study Guide", subtitle_style)], [Spacer(1, 6)], [Paragraph("Dr. Shreya Chindak", author_style)], [Spacer(1, 4)], [HRFlowable(width=W-100, thickness=1, color=GOLD, spaceAfter=6)], [Paragraph("Based on: Handelsman M. | British Dental Journal 2006; 201: 139–152", source_style)], [Spacer(1, 16)], [Paragraph("<b>Topics Covered:</b>", style('tc', fontName='Helvetica-Bold', fontSize=11, textColor=PALE_BLUE, alignment=TA_CENTER))], ], colWidths=[W-80]) title_table.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), DARK_BLUE), ('TOPPADDING', (0,0), (-1,-1), 8), ('BOTTOMPADDING', (0,0), (-1,-1), 8), ('ALIGN', (0,0), (-1,-1), 'CENTER'), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('BOX', (0,0), (-1,-1), 2, ACCENT), ])) story.append(title_table) topics_data = [ [body_cell('• Rationale & Treatment Planning', fg=WHITE), body_cell('• Bone Classification', fg=WHITE), body_cell('• Drilling Protocols', fg=WHITE)], [body_cell('• Five Key Examinations', fg=WHITE), body_cell('• Flap Design & Positioning', fg=WHITE), body_cell('• Deficient Ridge Management', fg=WHITE)], [body_cell('• Bone Grafting & Sinus Lift', fg=WHITE), body_cell('• Loading Protocols', fg=WHITE), body_cell('• Complications & Special Patients', fg=WHITE)], ] tt = Table(topics_data, colWidths=[(W-80)/3]*3) tt.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), MID_BLUE), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 12), ('BOX', (0,0), (-1,-1), 1, ACCENT), ('INNERGRID', (0,0), (-1,-1), 0.5, ACCENT), ])) story.append(tt) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 2: KEY PRINCIPLES # ═══════════════════════════════════════════ story.append(section_header("Key Principles — IN BRIEF", bg=DARK_BLUE)) story.append(Spacer(1, 8)) principles = [ ("1. Restorative-Driven Treatment Planning", "Visualisation of the final restorative result is MANDATORY before beginning any treatment. The goal is optimal aesthetics AND function. Work backwards from the diagnostic wax-up."), ("2. Biologically AND Restoratively Driven", "Implant placement must satisfy both biological requirements (bone quality/quantity, tissue biotype) and restorative needs (emergence, angulation, space). Neither can be sacrificed."), ("3. Comprehensive Examination First", "Dental implants should ONLY be placed following a complete periodontal, occlusal, endodontic, restorative, orthodontic, and radiographic examination with accurate diagnosis."), ("4. Reconstruct Before Implanting", "The deficient osseous ridge MUST be reconstructed prior to implant placement. Never place implants into compromised bone without first addressing the deficiency."), ("5. Team Approach", "Successful outcomes require a multidisciplinary team: restorative dentist, periodontist, oral surgeon, orthodontist, and endodontist — all coordinating before treatment begins."), ("6. Manage Patient Expectations", "Effective communication is critical. The patient must understand realistic expectations, treatment steps, risks, financial obligations, and aesthetic goals before any procedure."), ] # 2 columns, 3 rows for i in range(0, 6, 2): row_data = [] for j in range(2): num, desc = principles[i+j] cell_content = [ [hdr_cell(num, bg=MID_BLUE, fontsize=10)], [body_cell(desc, fontsize=9)], ] inner = Table(cell_content, colWidths=[(W-100)/2 - 10]) inner.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), MID_BLUE), ('BACKGROUND', (0,1), (0,1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) row_data.append(inner) t = Table([row_data], colWidths=[(W-100)/2]*2) t.setStyle(TableStyle([ ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('VALIGN', (0,0), (-1,-1), 'TOP'), ])) story.append(t) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 3: DIAGNOSIS — PERIODONTAL & TISSUE BIOTYPE # ═══════════════════════════════════════════ story.append(section_header("Diagnosis — Periodontal Examination & Tissue Biotype")) story.append(Spacer(1, 6)) left_data = [ [hdr_cell("Tissue Biotype Classification (Becker & Ochenbein)", bg=MID_BLUE)], [body_cell('<b>THIN PERIODONTIUM (Pronounced Scalloped)</b>', fg=MID_BLUE, bold=True)], [body_cell('• Scalloped or pronounced scalloped gingival architecture')], [body_cell('• Root dehiscence and fenestrations even in healthy tissue')], [body_cell('• Higher risk of recession and collapse after tooth loss')], [body_cell('• Thin buccal/lingual alveolar plates')], [Spacer(1,4)], [body_cell('<b>THICK PERIODONTIUM (Flat)</b>', fg=MID_BLUE, bold=True)], [body_cell('• Flat gingival architecture')], [body_cell('• Supported by thick buccal and lingual plates')], [body_cell('• More forgiving; easier to manipulate surgically')], [body_cell('• More predictable aesthetic outcomes post-extraction')], [Spacer(1,4)], [body_cell('<b>KOIS CREST CLASSIFICATION</b>', fg=MID_BLUE, bold=True)], [body_cell('• High Crest: Bone at CEJ level (delayed passive eruption)')], [body_cell('• Normal Crest: Bone 2 mm apical to CEJ')], [body_cell('• Low Crest: Recession with attachment loss')], [Spacer(1,4)], [body_cell('<b>KEY:</b> Bone sounding = best clinical parameter to identify attachment level', fg=DARK_BLUE)], ] left_t = Table(left_data, colWidths=[(W-100)/2 - 10]) left_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), MID_BLUE), ('BACKGROUND', (0,1), (-1,-1), LIGHT_GRAY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 2), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) # Right side: Siebert + Lekholm-Zarb siebert_data = [ [hdr_cell("Siebert Classification — Ridge Collapse", bg=MID_BLUE)], [Table([ [body_cell('Type I', fg=WHITE, bold=True), body_cell('Horizontal bone loss only (normal height preserved)')], [body_cell('Type II', fg=WHITE, bold=True), body_cell('Vertical bone loss only (normal width preserved)')], [body_cell('Type III', fg=WHITE, bold=True), body_cell('Combination: horizontal AND vertical bone loss')], ], colWidths=[60, (W-100)/2 - 80], style=TableStyle([ ('BACKGROUND', (0,0), (0,-1), ACCENT), ('BACKGROUND', (1,0), (1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ('INNERGRID', (0,0), (-1,-1), 0.5, LIGHT_GRAY), ('BOX', (0,0), (-1,-1), 0.5, MID_BLUE), ]))], [Spacer(1, 6)], [hdr_cell("Lekholm & Zarb — Bone Quality (Types 1–4)", bg=DARK_BLUE)], [Table([ [body_cell('Type 1', fg=WHITE, bold=True), body_cell('Almost entire jaw = homogenous compact bone (densest)')], [body_cell('Type 2', fg=WHITE, bold=True), body_cell('Thick compact bone surrounds dense trabecular core')], [body_cell('Type 3', fg=WHITE, bold=True), body_cell('Thin cortical bone + dense trabecular bone of favourable strength')], [body_cell('Type 4', fg=WHITE, bold=True), body_cell('Thin cortical bone + LOW DENSITY trabecular bone (softest)')], ], colWidths=[60, (W-100)/2 - 80], style=TableStyle([ ('BACKGROUND', (0,0), (0,-1), GOLD), ('BACKGROUND', (1,0), (1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ('INNERGRID', (0,0), (-1,-1), 0.5, LIGHT_GRAY), ('BOX', (0,0), (-1,-1), 0.5, DARK_BLUE), ]))], [Spacer(1, 6)], [hdr_cell("Lekholm & Zarb — Ridge Quantity (Shapes a–e)", bg=DARK_BLUE)], [Table([ [body_cell('Shape a', fg=WHITE, bold=True), body_cell('No bone resorption — ideal ridge form')], [body_cell('Shape b', fg=WHITE, bold=True), body_cell('Slight resorption — minimal volume loss')], [body_cell('Shape c', fg=WHITE, bold=True), body_cell('Moderate resorption — adequate bone remains')], [body_cell('Shape d', fg=WHITE, bold=True), body_cell('Advanced resorption — compromised')], [body_cell('Shape e', fg=WHITE, bold=True), body_cell('Extreme resorption — very challenging')], ], colWidths=[60, (W-100)/2 - 80], style=TableStyle([ ('BACKGROUND', (0,0), (0,-1), DARK_BLUE), ('BACKGROUND', (1,0), (1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ('INNERGRID', (0,0), (-1,-1), 0.5, LIGHT_GRAY), ('BOX', (0,0), (-1,-1), 0.5, DARK_BLUE), ]))], ] right_t = Table(siebert_data, colWidths=[(W-100)/2 - 10]) right_t.setStyle(TableStyle([ ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 2), ('LEFTPADDING', (0,0), (-1,-1), 0), ])) combined = Table([[left_t, right_t]], colWidths=[(W-100)/2]*2) combined.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ])) story.append(combined) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 4: FIVE KEY EXAMINATIONS # ═══════════════════════════════════════════ story.append(section_header("Pre-Implant Diagnosis — Five Key Examinations")) story.append(Spacer(1, 6)) exams_content = [ ("A. Periodontal", MID_BLUE, [ "• Soft and hard supporting tissues of dentition", "• Tissue biotype: thin vs thick periodontium", "• Probing depths + gingival recession measurement", "• Crestal alveolar bone level (bone sounding)", "• Mucogingival problems, furcation involvement", "• Ridge collapse: horizontal + vertical (Siebert I, II, III)", ]), ("B. Occlusal", ACCENT, [ "• Identify parafunctional habits (bruxism, clenching)", "• Opposing occlusion and restorative material selection", "• Mounted diagnostic casts evaluation", "• Vertical and horizontal overlap assessment", "• Restorative space: lack = mechanical failure", "• Over-erupted teeth causing occlusal interferences", ]), ("C. Endodontic", MID_BLUE, [ "• Vitality of remaining dentition", "• Periapical lesions and incomplete root canals", "• Poor endodontic prognosis = risk assessment required", "• Protect future implant sites from pathology", ]), ("D. Restorative", ACCENT, [ "• Margin integrity of existing restorations", "• Biologic width violations requiring crown lengthening", "• Strategic value of each compromised tooth", "• Sequential extraction for phased implant healing", "• Teeth with poor prognosis may support interim prosthesis", ]), ("E. Orthodontic", MID_BLUE, [ "• Restorative space analysis (M-D root positions)", "• Root angulation and tipping affect implant space", "• Complete ortho BEFORE implant placement in aesthetics", "• Provisional implants can provide anchorage", "• Final implants placed only after ortho wax-up confirms", ]), ("F. Radiographic", DARK_BLUE, [ "• Full-mouth periapical + bitewing X-rays", "• Panorex (limited compared to CT)", "• 3D CT scan — GOLD STANDARD", "• Diagnostic wax-up → radiographic guide → CT", "• Measures H & V bone loss accurately", "• CAD-CAM virtual planning (Nobel ARK, Simplant)", ]), ] exam_rows = [] for i in range(0, 6, 3): row_cells = [] for j in range(3): title, color, bullets = exams_content[i+j] cell_inner = [[hdr_cell(title, bg=color)]] + [[body_cell(b)] for b in bullets] inner = Table(cell_inner, colWidths=[(W-100)/3 - 12]) inner.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), color), ('BACKGROUND', (0,1), (-1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 7), ('BOX', (0,0), (-1,-1), 1, color), ])) row_cells.append(inner) t = Table([row_cells], colWidths=[(W-100)/3]*3) t.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 4), ('RIGHTPADDING', (0,0), (-1,-1), 4), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ])) story.append(t) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 5: FLAP DESIGN & IMPLANT POSITIONING # ═══════════════════════════════════════════ story.append(section_header("Flap Design, Surgical Protocols & Implant Positioning")) story.append(Spacer(1, 6)) # Protocols table story.append(Table([[hdr_cell("Surgical Protocol Evolution", bg=MID_BLUE)]], colWidths=[W-80], style=TableStyle([('BACKGROUND',(0,0),(-1,-1),MID_BLUE),('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5),('LEFTPADDING',(0,0),(-1,-1),10)]))) proto_data = [ [body_cell('Brånemark (Original)', fg=WHITE, bold=True), body_cell('2-stage: buried implant → 3–6 months healing → second stage surgery to connect abutment. Vestibular flap design.')], [body_cell('ITI One-Stage Protocol', fg=DARK_BLUE, bold=True), body_cell('Implant extends through soft tissue during healing. Crestal incision or flapless approach. Requires adequate keratinised tissue.')], [body_cell('Modern Standard', fg=WHITE, bold=True), body_cell('One-stage protocol most common. Roughened implant surface allows faster osseointegration. Immediate loading now popular with modified techniques.')], ] pt = Table(proto_data, colWidths=[160, W-100-160]) pt.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), ACCENT), ('BACKGROUND', (0,1), (0,1), GOLD), ('BACKGROUND', (0,2), (0,2), MID_BLUE), ('BACKGROUND', (1,0), (1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 8), ('INNERGRID', (0,0), (-1,-1), 0.5, LIGHT_GRAY), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) story.append(pt) story.append(Spacer(1, 8)) # Flapless + Positioning side by side flapless_data = [ [hdr_cell("Flapless Technique — Indications & Cautions", bg=DARK_BLUE)], [body_cell('<b>IDEAL CANDIDATE:</b> Adequate bone width + plenty of keratinised tissue', fg=MID_BLUE)], [body_cell('<b>RISK:</b> Compromised visibility during drilling', fg=RED_COLOR)], [body_cell('<b>AESTHETIC ZONE:</b> Needs adequate buccal thickness for long-term stability', fg=MID_BLUE)], [body_cell('• L. Abrams Roll Technique: transfer crestal thick tissue to buccal (additive)')], [body_cell('• Punch technique = subtractive — not preferred in aesthetic zone')], [body_cell('• Two-stage protocol in aesthetic zone allows 2nd surgical correction opportunity')], ] fl_t = Table(flapless_data, colWidths=[(W-100)/2 - 10]) fl_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), DARK_BLUE), ('BACKGROUND', (0,1), (-1,-1), LIGHT_GRAY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, DARK_BLUE), ])) pos_data_left = [ [hdr_cell("Critical Implant Positioning Dimensions", bg=MID_BLUE)], ] pos_items = [ ("Subgingival Depth", "3–4 mm subgingival placement of platform in aesthetic zone"), ("Buccal Position", "Buccal aspect of platform ≥1 mm palatal/lingual to future buccal gingival margin"), ("Inter-Implant Distance", ">3 mm between fixtures — preserves interproximal bone"), ("Platform Switching", "Narrower abutment on wider platform (3i) — preserves crestal bone, supports soft tissue"), ("Countersinking in Soft Bone", "AVOID — may lose initial stability. Keep platform at crest or supra-crestal"), ("Wide Platform", "Smoother gingival interface but greater risk of apical tissue migration"), ] for k, v in pos_items: pos_data_left.append([Table([[body_cell(k, fg=WHITE, bold=True), body_cell(v)]], colWidths=[140, (W-100)/2-160], style=TableStyle([ ('BACKGROUND',(0,0),(0,0),ACCENT), ('BACKGROUND',(1,0),(1,0),WHITE), ('TOPPADDING',(0,0),(-1,-1),3), ('BOTTOMPADDING',(0,0),(-1,-1),3), ('LEFTPADDING',(0,0),(-1,-1),5), ('BOX',(0,0),(-1,-1),0.5,ACCENT), ]))]) pos_t = Table(pos_data_left, colWidths=[(W-100)/2 - 10]) pos_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), MID_BLUE), ('TOPPADDING', (0,0), (-1,-1), 3), ('BOTTOMPADDING', (0,0), (-1,-1), 2), ('LEFTPADDING', (0,0), (-1,-1), 0), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) combined2 = Table([[fl_t, pos_t]], colWidths=[(W-100)/2]*2) combined2.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ])) story.append(combined2) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 6: DRILLING PROTOCOLS # ═══════════════════════════════════════════ story.append(section_header("Drilling Protocols — Dense vs Soft Bone")) story.append(Spacer(1, 6)) dense_data = [ [hdr_cell("DENSE BONE — Types 1 & 2", bg=MID_BLUE)], [body_cell('<b>KEY RULE: Adequate irrigation + controlled speed</b>', fg=MID_BLUE)], [body_cell('• Prevent overheating (heat kills osteoblasts)')], [body_cell('• Final drill widens site to recommended diameter before tapping')], [body_cell('• Too-tight placement → pressure necrosis → failure')], [body_cell('• Implant shape (parallel vs tapered) affects tightness')], [Spacer(1,4)], [body_cell('<b>PARALLEL WALL IMPLANTS</b>', fg=MID_BLUE)], [body_cell('• Drill depth slightly longer than implant (extra tip at end)')], [body_cell('• Can be placed deeper if desired')], [body_cell('• CAUTION: extra tip near alveolar canal in posterior mandible')], [Spacer(1,4)], [body_cell('<b>CONCERN: PRESSURE NECROSIS</b>', fg=RED_COLOR)], [body_cell('If resistance during seating is excessive — STOP and widen osteotomy.')], ] dense_t = Table(dense_data, colWidths=[(W-100)/2 - 10]) dense_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), MID_BLUE), ('BACKGROUND', (0,1), (-1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) soft_data = [ [hdr_cell("SOFT BONE — Types 3 & 4", bg=GOLD)], [body_cell('<b>KEY RULE: UNDER-PREPARE THE OSTEOTOMY</b>', fg=HexColor('#B86B00'))], [body_cell('• Avoid over-preparation — angulation changes preclude placement')], [Spacer(1,4)], [body_cell('<b>OSTEOTOME TECHNIQUE</b>', fg=DARK_BLUE)], [body_cell('• Compress soft bone rather than remove it (drilling)')], [body_cell('• Improves initial stabilisation')], [body_cell('• Also used for sinus floor in-fracture elevation')], [Spacer(1,4)], [body_cell('<b>TAPERED IMPLANTS IN SOFT BONE</b>', fg=DARK_BLUE)], [body_cell('• Wedging effect improves stability')], [body_cell('• More challenging: depth preparation must be exact')], [body_cell('• Final position CANNOT be adjusted unlike parallel wall')], [Spacer(1,4)], [body_cell('<b>BI-CORTICAL FIXATION (Posterior Maxilla)</b>', fg=DARK_BLUE)], [body_cell('• Engage sinus floor for extra anchorage')], [Spacer(1,4)], [body_cell('<b>COUNTERSINKING CAUTION</b>', fg=RED_COLOR)], [body_cell('• May cause LOSS of initial stability in soft bone')], [body_cell('• Keep platform at crest or supra-crestal if space allows')], ] soft_t = Table(soft_data, colWidths=[(W-100)/2 - 10]) soft_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), GOLD), ('BACKGROUND', (0,1), (-1,-1), LIGHT_GRAY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, GOLD), ])) combined3 = Table([[dense_t, soft_t]], colWidths=[(W-100)/2]*2) combined3.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ])) story.append(combined3) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 7: DEFICIENT RIDGE — VERTICAL HEIGHT # ═══════════════════════════════════════════ story.append(section_header("Deficient Osseous Ridge — Lack of Vertical Height")) story.append(Spacer(1, 6)) ant_max_data = [ [hdr_cell("Anterior Maxilla — Vertical Resorption", bg=MID_BLUE)], [body_cell('<b>PROBLEM:</b> Vertical resorption affects aesthetics. Full edentulous may limit to overdenture.', fg=MID_BLUE)], [Spacer(1,4)], [body_cell('<b>OPTION 1: Onlay Block Graft</b>', fg=DARK_BLUE)], [body_cell('• Autogenous bone from intra-oral (ramus / chin) OR extra-oral (iliac crest / calvaria)')], [body_cell('• Greater defect = more bone required')], [body_cell('• Extra-oral: general anaesthesia + greater morbidity')], [body_cell('• Intra-oral: better suited for partially edentulous situations')], [body_cell('• Cortical-cancellous block adapted and fixated with screws')], [body_cell('<b>⚠ Building vertical height = LEAST predictable grafting option</b>', fg=RED_COLOR)], [Spacer(1,4)], [body_cell('<b>OPTION 2: Distraction Osteogenesis</b>', fg=DARK_BLUE)], [body_cell('• Surgical osteotomy + distraction device placed in mouth')], [body_cell('• Activated daily — bone moves coronally over several weeks')], [body_cell('• Bone left to mature for months before implant placement')], [body_cell('• Used when inter-arch space is NOT a problem')], ] ant_t = Table(ant_max_data, colWidths=[(W-100)/2 - 10]) ant_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), MID_BLUE), ('BACKGROUND', (0,1), (-1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) post_max_data = [ [hdr_cell("Posterior Maxilla — Sinus Proximity Challenges", bg=DARK_BLUE)], [body_cell('<b>Challenges:</b> Perio bone loss + sinus proximity + soft Type 3–4 bone', fg=DARK_BLUE)], [Spacer(1,3)], [body_cell('<b>SINUS LIFT — Lateral Wall Approach (Boyne et al.)</b>', fg=DARK_BLUE)], [body_cell('• Open sinus via lateral wall window; elevate sinus membrane')], [body_cell('• Pack bone graft: autogenous best (chin, ramus, tuberosity)')], [body_cell('• Mix with HA, Bio-Oss, or FDBA; optional Platelet Rich Plasma (PRP)')], [body_cell('• Wait 5–6 months healing before implant placement')], [body_cell('• If ≥5 mm bone: simultaneous placement possible (less predictable)')], [Spacer(1,3)], [body_cell('<b>OSTEOTOME TECHNIQUE (≥7–8 mm bone available)</b>', fg=DARK_BLUE)], [body_cell('• Drill 3 mm short of sinus floor → osteotome in-fractures floor upward')], [body_cell('• Pack bone graft into osteotomy → place implant simultaneously')], [body_cell('• Less invasive but MORE technique-sensitive')], [body_cell('<b>Risk: sinus membrane perforation</b>', fg=RED_COLOR)], [Spacer(1,3)], [body_cell('<b>POSTERIOR MANDIBLE</b>', fg=DARK_BLUE)], [body_cell('• Inferior alveolar nerve limits implant length')], [body_cell('• Options: short wide implants, nerve transposition (high morbidity)')], [body_cell('• Distal cantilever off mesial implants = alternative')], ] post_t = Table(post_max_data, colWidths=[(W-100)/2 - 10]) post_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), DARK_BLUE), ('BACKGROUND', (0,1), (-1,-1), LIGHT_GRAY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, DARK_BLUE), ])) combined4 = Table([[ant_t, post_t]], colWidths=[(W-100)/2]*2) combined4.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ])) story.append(combined4) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 8: DEFICIENT RIDGE — HORIZONTAL WIDTH # ═══════════════════════════════════════════ story.append(section_header("Deficient Osseous Ridge — Lack of Horizontal Width")) story.append(Spacer(1, 6)) ant_horiz_data = [ [hdr_cell("Anterior Maxilla — Horizontal Deficiency", bg=MID_BLUE)], [body_cell('<b>PATTERNS:</b> Knife-edge ridges or concavity type defects', fg=MID_BLUE)], [body_cell('• Large anterior incisal foramen can restrict central implant placement')], [Spacer(1,4)], [body_cell('<b>KNIFE-EDGE RIDGES (most predictable grafting)</b>', fg=DARK_BLUE)], [body_cell('• Veneer grafts: intra-oral cortical-cancellous block')], [body_cell('• Block stabilised with fixation screws')], [body_cell('• Remove screws after 6 months at implant surgery')], [Spacer(1,4)], [body_cell('<b>CONCAVITY DEFECTS</b>', fg=DARK_BLUE)], [body_cell('• Block grafts OR Guided Bone Regeneration (GBR)')], [body_cell('• Particulate graft (ramus scrapings + HA/osteoconductive material)')], [body_cell('• Covered with resorbable or non-resorbable membrane')], [body_cell('• Titanium-reinforced membrane if spacemaking desired')], [Spacer(1,4)], [body_cell('<b>NARROW RIDGES</b>', fg=DARK_BLUE)], [body_cell('• Osteotome bone spreading (conservative)')], [body_cell('• Split-ridge technique + simultaneous implant placement')], ] ant_h_t = Table(ant_horiz_data, colWidths=[(W-100)/2 - 10]) ant_h_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), MID_BLUE), ('BACKGROUND', (0,1), (-1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) soft_tissue_data = [ [hdr_cell("Anterior & Posterior Mandible", bg=DARK_BLUE)], [body_cell('• Block grafts with fixation screws (same GBR principles)')], [body_cell('<b>KEY SUCCESS FACTORS:</b>', fg=DARK_BLUE)], [body_cell('• Check vestibule depth before planning flap')], [body_cell('• Flap must advance WITHOUT TENSION for closure')], [body_cell('• Tension-free closure is mandatory for graft survival')], [body_cell('• Vertical releasing incisions ≥1 tooth distant from graft')], [Spacer(1,6)], [hdr_cell("Soft Tissue Augmentation Techniques", bg=ACCENT)], [body_cell('<b>LANGER TECHNIQUE (Sub-Epithelial CT Graft)</b>', fg=DARK_BLUE)], [body_cell('• Most common donor: palatal tissue mesial to 1st molar')], [body_cell('• Useful for thin tissue augmentation + minor ridge resorption')], [Spacer(1,4)], [body_cell('<b>TUBEROSITY TISSUE</b>', fg=DARK_BLUE)], [body_cell('• Especially useful when thicker graft needed')], [body_cell('• Ideal for ridge augmentation (inlay or pouch technique)')], [Spacer(1,4)], [body_cell('<b>PALACCI ROTATED FLAP</b>', fg=DARK_BLUE)], [body_cell('• Papilla regeneration technique')], [body_cell('• Building supporting bone beneath soft tissue = most predictable outcome')], ] st_t = Table(soft_tissue_data, colWidths=[(W-100)/2 - 10]) st_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), DARK_BLUE), ('BACKGROUND', (0,8), (0,8), ACCENT), ('BACKGROUND', (0,1), (0,7), LIGHT_GRAY), ('BACKGROUND', (0,9), (-1,-1), LIGHT_GRAY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, DARK_BLUE), ])) combined5 = Table([[ant_h_t, st_t]], colWidths=[(W-100)/2]*2) combined5.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ])) story.append(combined5) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 9: EXTRACTION TIMING OPTIONS # ═══════════════════════════════════════════ story.append(section_header("Teeth Requiring Removal — Timing Options & Decision Factors")) story.append(Spacer(1, 6)) # Decision box decision_data = [ [hdr_cell("Ask These Questions Before Extraction", bg=MID_BLUE)], [Table([ [body_cell('1. Is the tooth in the aesthetic zone?'), body_cell('2. What is the tissue biotype? (thin scalloped or thick flat)')], [body_cell('3. How much bone loss from perio/endo failure?'), body_cell('4. How predictable is gingival architecture stability?')], ], colWidths=[(W-100)/2]*2, style=TableStyle([ ('BACKGROUND',(0,0),(-1,-1),LIGHT_GRAY), ('TOPPADDING',(0,0),(-1,-1),4), ('BOTTOMPADDING',(0,0),(-1,-1),4), ('LEFTPADDING',(0,0),(-1,-1),8), ('INNERGRID',(0,0),(-1,-1),0.5,ACCENT), ]))], ] dd = Table(decision_data, colWidths=[W-80]) dd.setStyle(TableStyle([ ('BACKGROUND',(0,0),(0,0),MID_BLUE), ('TOPPADDING',(0,0),(-1,-1),3), ('BOTTOMPADDING',(0,0),(-1,-1),3), ('LEFTPADDING',(0,0),(-1,-1),0), ('BOX',(0,0),(-1,-1),1,MID_BLUE), ])) story.append(dd) story.append(Spacer(1,6)) timing_items = [ ("Option 1", MID_BLUE, "Extract → Wait months → Place Implant", "Standard approach. Allows soft tissue maturity. Good for most cases."), ("Option 2", ACCENT, "Orthodontic Forced Eruption (Salama & Salama) → Then Extract", "Move gingival complex + crestal bone coronally before extraction. Best when bone level at planned extraction site is deficient."), ("Option 3", GOLD, "Extract + Socket Bone Graft → Heal → Place Implant", "Preserves soft tissue contours and minimises ridge collapse. Use when buccal plate is thin OR has slight dehiscence."), ("Option 4", MID_BLUE, "Extract + Immediate Implant (same visit)", "ONLY for single-rooted teeth with thick, intact buccal plate. Options: a) Two-stage buried b) One-stage with healing abutment c) Immediate load with provisional restoration."), ("Option 5", DARK_BLUE, "Extract → Wait 2–3 months → Bone Graft → Wait 5–6 months → Implant", "Best for cases with expected advanced ridge resorption. Most staged and most predictable option."), ] for opt, color, title, desc in timing_items: row = Table([ [body_cell(opt, fg=WHITE if color != GOLD else DARK_BLUE, bold=True), body_cell(f'<b>{title}</b>', fg=DARK_BLUE), body_cell(desc)], ], colWidths=[80, 250, W-100-330]) row.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), color), ('BACKGROUND', (1,0), (2,0), WHITE), ('TOPPADDING', (0,0), (-1,-1), 6), ('BOTTOMPADDING', (0,0), (-1,-1), 6), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, color), ('INNERGRID', (0,0), (-1,-1), 0.5, LIGHT_GRAY), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ])) story.append(row) story.append(Spacer(1,3)) # Key notes story.append(Spacer(1,4)) note_box = Table([[ body_cell('<b>KEY NOTES:</b> Gruender: simultaneous implant + GBR (Bio-OSS + membrane) if ideal position achievable. ' 'Buser: GBR (block graft + membrane + fixation screws) → 6 months → then place implant for predictable aesthetics. ' 'Orthodontic forced eruption before extraction reduces bony defect at socket.', fg=DARK_BLUE) ]], colWidths=[W-80]) note_box.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,-1),LIGHT_GRAY), ('TOPPADDING',(0,0),(-1,-1),6), ('BOTTOMPADDING',(0,0),(-1,-1),6), ('LEFTPADDING',(0,0),(-1,-1),10), ('LEFTBORDER',(0,0),(0,-1),4,GOLD), ('BOX',(0,0),(-1,-1),1,GOLD), ])) story.append(note_box) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 10: LOADING PROTOCOLS # ═══════════════════════════════════════════ story.append(section_header("Loading Protocols, Primary Stability & Timing")) story.append(Spacer(1, 6)) stability_data = [ [hdr_cell("Surface Modification & Primary Stability", bg=MID_BLUE)], [body_cell('<b>Roughened surface (vs smooth machined):</b> improves bone healing rate + speeds osseointegration', fg=DARK_BLUE)], [Spacer(1,3)], [body_cell('<b>PRIMARY STABILITY = #1 FACTOR FOR SUCCESS</b>', fg=MID_BLUE)], [body_cell('• Achieved by: bone quality, drill protocol, implant design and shape')], [body_cell('• OsstellTM Machine: resonance frequency analysis (ISQ score) — objective stability measurement')], [Spacer(1,3)], [body_cell('<b>CAUSES OF FAILURE:</b>', fg=RED_COLOR)], [body_cell('• Micro-motion during initial bone healing → NO integration')], [body_cell('• Most common cause: overloading via removable appliance over healing implant')], [Spacer(1,3)], [body_cell('<b>TRANSITIONAL IMPLANTS</b>', fg=DARK_BLUE)], [body_cell('• Support interim fixed or removable prostheses during healing')], [body_cell('• Used as surgical guide anchors')], [body_cell('• Adapted for orthodontic anchorage (where dental anchorage is lacking)')], [Spacer(1,3)], [body_cell('<b>KEY ADVANTAGE — Fixed Provisionals:</b> prevent removable appliance forces on healing implant', fg=MID_BLUE)], ] stab_t = Table(stability_data, colWidths=[(W-100)/2 - 10]) stab_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), MID_BLUE), ('BACKGROUND', (0,1), (-1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) imm_load_data = [ [hdr_cell("Immediate Loading Protocol", bg=DARK_BLUE)], [body_cell('<b>CRITERIA for Immediate Loading:</b>', fg=DARK_BLUE)], [body_cell('• Initial stability must be EXTREMELY TIGHT')], [body_cell('• Careful occlusal adjustment of provisional required')], [body_cell('• Continuous monitoring throughout healing phase')], [Spacer(1,3)], [body_cell('<b>BEST CANDIDATES:</b>', fg=MID_BLUE)], [body_cell('• Single anterior teeth (lower occlusal forces)')], [body_cell('• Fully edentulous: rigid splinted interim prosthesis')], [Spacer(1,3)], [body_cell('<b>POOREST CANDIDATES:</b>', fg=RED_COLOR)], [body_cell('• Posterior teeth (far greater occlusal forces)')], [body_cell('• Soft bone sites (Type 3–4)')], [Spacer(1,3)], [body_cell('<b>AESTHETIC ZONE WARNING:</b>', fg=RED_COLOR)], [body_cell('• Extraction + immediate implant + immediate provisional = HIGHER RISK')], [body_cell('• Difficult to predict future buccal tissue contour (shrinkage)')], [body_cell('• Benefit: supports adjacent papilla')], [Spacer(1,3)], [body_cell('<b>ORIGINAL DELAYED PROTOCOL:</b>', fg=DARK_BLUE)], [body_cell('• Mandible: 3 months | Maxilla: 6 months before loading')], [body_cell('• Still gold standard for reliability; not always required with modern surfaces')], ] imm_t = Table(imm_load_data, colWidths=[(W-100)/2 - 10]) imm_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), DARK_BLUE), ('BACKGROUND', (0,1), (-1,-1), LIGHT_GRAY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, DARK_BLUE), ])) combined6 = Table([[stab_t, imm_t]], colWidths=[(W-100)/2]*2) combined6.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ])) story.append(combined6) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 11: COMPLICATIONS & SPECIAL PATIENTS # ═══════════════════════════════════════════ story.append(section_header("Surgical Complications & Special Patient Considerations")) story.append(Spacer(1, 6)) comp_data = [ [hdr_cell("Post-Surgical Complications — Prevention", bg=MID_BLUE)], [body_cell('<b>FLAP DESIGN</b>', fg=MID_BLUE)], [body_cell('• Careful planning of flap design is mandatory before surgery')], [body_cell('• Gentle soft tissue manipulation throughout procedure')], [body_cell('• Vertical releasing incisions ≥1 tooth distant from graft area')], [Spacer(1,3)], [body_cell('<b>BLEEDING CONTROL</b>', fg=MID_BLUE)], [body_cell('• Haemostasis is mandatory')], [body_cell('• Releasing incisions needed for tension-free flap advancement and closure')], [Spacer(1,3)], [body_cell('<b>FLAP COVERAGE FAILURE</b>', fg=RED_COLOR)], [body_cell('• Sloughing or incision opening → delayed healing')], [body_cell('• Compromised results when graft coverage is lost')], [body_cell('• Prevention: close WITHOUT tension using resorbable sutures')], [Spacer(1,3)], [body_cell('<b>SMOKING — Greatest Single Risk Factor</b>', fg=RED_COLOR)], [body_cell('• Affects both hard AND soft tissue healing')], [body_cell('• Strongly counsel patients before treatment commences')], [Spacer(1,3)], [body_cell('<b>BUCCAL TISSUE STABILITY — Critical Point</b>', fg=DARK_BLUE)], [body_cell('First year: crestal resorption to 1st thread — buccal AND interproximal')], [body_cell('→ Leads to buccal shrinkage and recession around restoration')], [body_cell('→ Buser: staged GBR first → 6 months → implant = most predictable')], ] comp_t = Table(comp_data, colWidths=[(W-100)/2 - 10]) comp_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), MID_BLUE), ('BACKGROUND', (0,1), (-1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) med_data = [ [hdr_cell("Medically Compromised Patients", bg=DARK_BLUE)], [body_cell('<b>NOT a contraindication — requires special attention and planning</b>', fg=DARK_BLUE)], [Spacer(1,3)], [body_cell('<b>CONDITIONS REQUIRING CAREFUL MANAGEMENT:</b>', fg=DARK_BLUE)], [body_cell('• Diabetes Mellitus')], [body_cell('• Autoimmune disease')], [body_cell('• Patients on long-term steroids')], [body_cell('• Prior radiation treatment')], [Spacer(1,3)], [body_cell('<b>APPROACH:</b>', fg=DARK_BLUE)], [body_cell('• Logical and ethical decisions made with patient AND their physicians')], [body_cell('• Higher failure rates; more frequent monitoring; modified protocols')], [Spacer(1,3)], [body_cell('<b>EVIDENCE-BASED RISK FACTORS FOR FAILURE:</b>', fg=RED_COLOR)], [body_cell('1. Smoking')], [body_cell('2. Systemic disease')], [body_cell('3. Poor bone quality (Type 3–4)')], [body_cell('4. Lack of primary stability')], [body_cell('5. Micro-motion during healing')], [body_cell('6. Overloading with removable appliance')], ] med_t = Table(med_data, colWidths=[(W-100)/2 - 10]) med_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), DARK_BLUE), ('BACKGROUND', (0,1), (-1,-1), LIGHT_GRAY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, DARK_BLUE), ])) combined7 = Table([[comp_t, med_t]], colWidths=[(W-100)/2]*2) combined7.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ])) story.append(combined7) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 12: QUICK REFERENCE CARDS # ═══════════════════════════════════════════ story.append(section_header("Quick Reference — Key Classifications & Clinical Rules")) story.append(Spacer(1, 6)) cards = [ ("Brånemark Healing Protocol", DARK_BLUE, "Mandible: 3 months\nMaxilla: 6 months\nBefore loading / abutment connection"), ("Sinus Lift — Bone Height Rules", MID_BLUE, "< 5 mm: Lift first, wait 5–6 months\n≥ 5 mm: Simultaneous (less predictable)\n≥ 7–8 mm: Osteotome technique"), ("Dense Bone Drilling", ACCENT, "COOL + IRRIGATE\nFull diameter before tapping\nAvoid pressure necrosis"), ("Soft Bone Drilling", GOLD, "UNDER-PREPARE\nOsteotome technique preferred\nTapered implant advantageous"), ("Aesthetic Zone — Implant Depth", DARK_BLUE, "Platform: 3–4 mm subgingival\nBuccal platform ≥ 1 mm palatal\nto future buccal gingival margin"), ("Platform Switching", MID_BLUE, "Narrower abutment on wider platform\nPreserves crestal bone (eg 3i)\nNeeds further research evidence"), ("Bone Graft Healing Times", ACCENT, "Block graft: 6 months before implant\nSinus lift: 5–6 months before implant\nGBR (Buser): 6 months then implant"), ("Smoking Risk", RED_COLOR, "Greatest single risk factor\nAffects hard + soft tissue healing\nStrongly counsel pre-treatment"), ("Inter-Implant Distance", DARK_BLUE, "> 3 mm between fixtures\nPreserves interproximal bone\nSupports papilla formation"), ("Immediate Loading Criteria", MID_BLUE, "Extremely tight primary stability\nSingle anteriors = best candidates\nFully edentulous: rigid splinted prosthesis"), ("Tissue Biotype", ACCENT, "Thin = scalloped, high risk\nThick = flat, more forgiving\nBone sounding = best parameter"), ("Key Risk Factors for Failure", RED_COLOR, "1. Smoking\n2. Systemic disease\n3. Poor bone quality\n4. Micro-motion during healing\n5. Overloading"), ] card_rows = [] for i in range(0, 12, 4): row_cells = [] for j in range(4): if i+j < len(cards): title, color, body_txt = cards[i+j] fg = DARK_BLUE if color == GOLD else WHITE lines = body_txt.split('\n') cell_inner = [[hdr_cell(title, bg=color, fg=fg, fontsize=9)]] + \ [[body_cell(line, fontsize=9)] for line in lines] inner = Table(cell_inner, colWidths=[(W-100)/4 - 10]) inner.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), color), ('BACKGROUND', (0,1), (-1,-1), LIGHT_GRAY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 6), ('BOX', (0,0), (-1,-1), 1, color), ])) row_cells.append(inner) t = Table([row_cells], colWidths=[(W-100)/4]*4) t.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 4), ('RIGHTPADDING', (0,0), (-1,-1), 4), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ])) card_rows.append(t) for cr in card_rows: story.append(cr) # Build PDF def on_first_page(canvas, doc): canvas.saveState() canvas.setFillColor(DARK_BLUE) canvas.rect(0, H-6, W, 6, fill=1, stroke=0) canvas.rect(0, 0, W, 6, fill=1, stroke=0) canvas.setFillColor(ACCENT) canvas.rect(0, H-3, W, 3, fill=1, stroke=0) canvas.rect(0, 0, W, 3, fill=1, stroke=0) canvas.setFillColor(PALE_BLUE) canvas.setFont('Helvetica', 8) canvas.drawString(30, 10, "Dr. Shreya Chindak — Dental Implant Surgery Study Guide") canvas.drawRightString(W-30, 10, f"Page {doc.page}") canvas.restoreState() def on_later_pages(canvas, doc): on_first_page(canvas, doc) doc = SimpleDocTemplate( output_path, pagesize=landscape(A4), leftMargin=40, rightMargin=40, topMargin=20, bottomMargin=20, ) doc.build(story, onFirstPage=on_first_page, onLaterPages=on_later_pages) print(f"PDF saved: {output_path}") PYEOF
Dental Implant Surgery Study Guide
PDF Document · PDF
| Page | Content |
|---|---|
| 1 | Title page — "Dr. Shreya Chindak" prominently below the title |
| 2 | Key Principles (IN BRIEF) — 6 core rules in cards |
| 3 | Periodontal diagnosis, tissue biotype, Siebert & Lekholm-Zarb classifications |
| 4 | Five key pre-implant examinations (Periodontal, Occlusal, Endo, Restorative, Ortho, Radiographic) |
| 5 | Flap design, surgical protocol evolution, critical positioning dimensions |
| 6 | Drilling protocols — dense bone (Types 1–2) vs soft bone (Types 3–4) |
| 7 | Deficient ridge — vertical height (onlay graft, distraction, sinus lift, osteotome) |
| 8 | Deficient ridge — horizontal width (veneer grafts, GBR, split-ridge, soft tissue techniques) |
| 9 | Extraction timing options 1–5 with decision factors |
| 10 | Loading protocols, primary stability, Ostell machine, immediate vs delayed loading |
| 11 | Complications, smoking risk, medically compromised patients |
| 12 | Quick reference cards — all key numbers and rules at a glance |
Please make this pdf and remove the referance
Dental Implant Surgery Study Guide
PDF Document · PDF
Based on hansel remove that
python3 << 'PYEOF' from reportlab.lib.pagesizes import landscape, A4 from reportlab.lib import colors from reportlab.lib.units import inch, cm from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, PageBreak, KeepTogether from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT from reportlab.platypus import BaseDocTemplate, PageTemplate, Frame from reportlab.lib.colors import HexColor output_path = "/tmp/workspace/study-guide/Dental_Implant_Surgery_Study_Guide_v2.pdf" DARK_BLUE = HexColor('#0D2B55') MID_BLUE = HexColor('#15579A') ACCENT = HexColor('#00A8E8') GOLD = HexColor('#F0A500') WHITE = colors.white LIGHT_GRAY= HexColor('#F2F5FA') TEXT_DARK = HexColor('#1A1A2E') PALE_BLUE = HexColor('#CCE5FF') RED_COLOR = HexColor('#C0392B') W, H = landscape(A4) styles = getSampleStyleSheet() def style(name, **kwargs): return ParagraphStyle(name, **kwargs) title_style = style('Title2', fontName='Helvetica-Bold', fontSize=28, textColor=WHITE, alignment=TA_CENTER, spaceAfter=4) subtitle_style = style('Subtitle2', fontName='Helvetica', fontSize=16, textColor=ACCENT, alignment=TA_CENTER, spaceAfter=4) author_style = style('Author2', fontName='Helvetica-Bold', fontSize=14, textColor=GOLD, alignment=TA_CENTER, spaceAfter=4) h1 = style('H1', fontName='Helvetica-Bold', fontSize=15, textColor=WHITE, alignment=TA_LEFT, spaceAfter=2, spaceBefore=0) h2 = style('H2', fontName='Helvetica-Bold', fontSize=12, textColor=WHITE, alignment=TA_LEFT, spaceAfter=2, spaceBefore=0) h3 = style('H3', fontName='Helvetica-Bold', fontSize=10, textColor=DARK_BLUE, alignment=TA_LEFT, spaceAfter=1, spaceBefore=0) body = style('Body2', fontName='Helvetica', fontSize=9, textColor=TEXT_DARK, alignment=TA_LEFT, spaceAfter=1, spaceBefore=0, leading=13) body_bold = style('BodyBold', fontName='Helvetica-Bold', fontSize=9, textColor=DARK_BLUE, alignment=TA_LEFT, spaceAfter=1, spaceBefore=0, leading=13) small = style('Small', fontName='Helvetica', fontSize=8, textColor=TEXT_DARK, alignment=TA_LEFT, spaceAfter=1, leading=11) def hdr_cell(text, bg=DARK_BLUE, fg=WHITE, fontsize=10, bold=True): fn = 'Helvetica-Bold' if bold else 'Helvetica' s = ParagraphStyle('hc', fontName=fn, fontSize=fontsize, textColor=fg, alignment=TA_LEFT, leading=fontsize+3) return Paragraph(text, s) def body_cell(text, fg=TEXT_DARK, fontsize=9, bold=False, align=TA_LEFT): fn = 'Helvetica-Bold' if bold else 'Helvetica' s = ParagraphStyle('bc', fontName=fn, fontSize=fontsize, textColor=fg, alignment=align, leading=fontsize+3) return Paragraph(text, s) def section_header(text, bg=DARK_BLUE): return Table([[Paragraph(text, h2)]], colWidths=[W - 80], style=TableStyle([ ('BACKGROUND', (0,0), (-1,-1), bg), ('TOPPADDING', (0,0), (-1,-1), 6), ('BOTTOMPADDING', (0,0), (-1,-1), 6), ('LEFTPADDING', (0,0), (-1,-1), 10), ])) story = [] # ═══════════════════════════════════════════ # PAGE 1: TITLE PAGE — no "Based on" line # ═══════════════════════════════════════════ title_table = Table([ [Paragraph("Surgical Guidelines for Dental Implant Placement", title_style)], [Paragraph("A Comprehensive Study Guide", subtitle_style)], [Spacer(1, 6)], [Paragraph("Dr. Shreya Chindak", author_style)], [Spacer(1, 16)], [HRFlowable(width=W-100, thickness=1, color=GOLD, spaceAfter=6)], [Spacer(1, 10)], [Paragraph("<b>Topics Covered:</b>", style('tc', fontName='Helvetica-Bold', fontSize=11, textColor=PALE_BLUE, alignment=TA_CENTER))], ], colWidths=[W-80]) title_table.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), DARK_BLUE), ('TOPPADDING', (0,0), (-1,-1), 8), ('BOTTOMPADDING', (0,0), (-1,-1), 8), ('ALIGN', (0,0), (-1,-1), 'CENTER'), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('BOX', (0,0), (-1,-1), 2, ACCENT), ])) story.append(title_table) topics_data = [ [body_cell('• Rationale & Treatment Planning', fg=WHITE), body_cell('• Bone Classification', fg=WHITE), body_cell('• Drilling Protocols', fg=WHITE)], [body_cell('• Five Key Examinations', fg=WHITE), body_cell('• Flap Design & Positioning', fg=WHITE), body_cell('• Deficient Ridge Management', fg=WHITE)], [body_cell('• Bone Grafting & Sinus Lift', fg=WHITE), body_cell('• Loading Protocols', fg=WHITE), body_cell('• Complications & Special Patients', fg=WHITE)], ] tt = Table(topics_data, colWidths=[(W-80)/3]*3) tt.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), MID_BLUE), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 12), ('BOX', (0,0), (-1,-1), 1, ACCENT), ('INNERGRID', (0,0), (-1,-1), 0.5, ACCENT), ])) story.append(tt) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 2: KEY PRINCIPLES # ═══════════════════════════════════════════ story.append(section_header("Key Principles — IN BRIEF", bg=DARK_BLUE)) story.append(Spacer(1, 8)) principles = [ ("1. Restorative-Driven Treatment Planning", "Visualisation of the final restorative result is MANDATORY before beginning any treatment. The goal is optimal aesthetics AND function. Work backwards from the diagnostic wax-up."), ("2. Biologically AND Restoratively Driven", "Implant placement must satisfy both biological requirements (bone quality/quantity, tissue biotype) and restorative needs (emergence, angulation, space). Neither can be sacrificed."), ("3. Comprehensive Examination First", "Dental implants should ONLY be placed following a complete periodontal, occlusal, endodontic, restorative, orthodontic, and radiographic examination with accurate diagnosis."), ("4. Reconstruct Before Implanting", "The deficient osseous ridge MUST be reconstructed prior to implant placement. Never place implants into compromised bone without first addressing the deficiency."), ("5. Team Approach", "Successful outcomes require a multidisciplinary team: restorative dentist, periodontist, oral surgeon, orthodontist, and endodontist — all coordinating before treatment begins."), ("6. Manage Patient Expectations", "Effective communication is critical. The patient must understand realistic expectations, treatment steps, risks, financial obligations, and aesthetic goals before any procedure."), ] for i in range(0, 6, 2): row_data = [] for j in range(2): num, desc = principles[i+j] cell_content = [ [hdr_cell(num, bg=MID_BLUE, fontsize=10)], [body_cell(desc, fontsize=9)], ] inner = Table(cell_content, colWidths=[(W-100)/2 - 10]) inner.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), MID_BLUE), ('BACKGROUND', (0,1), (0,1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) row_data.append(inner) t = Table([row_data], colWidths=[(W-100)/2]*2) t.setStyle(TableStyle([ ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('VALIGN', (0,0), (-1,-1), 'TOP'), ])) story.append(t) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 3: DIAGNOSIS — PERIODONTAL & TISSUE BIOTYPE # ═══════════════════════════════════════════ story.append(section_header("Diagnosis — Periodontal Examination & Tissue Biotype")) story.append(Spacer(1, 6)) left_data = [ [hdr_cell("Tissue Biotype Classification (Becker & Ochenbein)", bg=MID_BLUE)], [body_cell('<b>THIN PERIODONTIUM (Pronounced Scalloped)</b>', fg=MID_BLUE)], [body_cell('• Scalloped or pronounced scalloped gingival architecture')], [body_cell('• Root dehiscence and fenestrations even in healthy tissue')], [body_cell('• Higher risk of recession and collapse after tooth loss')], [body_cell('• Thin buccal/lingual alveolar plates')], [Spacer(1,4)], [body_cell('<b>THICK PERIODONTIUM (Flat)</b>', fg=MID_BLUE)], [body_cell('• Flat gingival architecture')], [body_cell('• Supported by thick buccal and lingual plates')], [body_cell('• More forgiving; easier to manipulate surgically')], [body_cell('• More predictable aesthetic outcomes post-extraction')], [Spacer(1,4)], [body_cell('<b>KOIS CREST CLASSIFICATION</b>', fg=MID_BLUE)], [body_cell('• High Crest: Bone at CEJ level (delayed passive eruption)')], [body_cell('• Normal Crest: Bone 2 mm apical to CEJ')], [body_cell('• Low Crest: Recession with attachment loss')], [Spacer(1,4)], [body_cell('<b>KEY:</b> Bone sounding = best clinical parameter to identify attachment level', fg=DARK_BLUE)], ] left_t = Table(left_data, colWidths=[(W-100)/2 - 10]) left_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), MID_BLUE), ('BACKGROUND', (0,1), (-1,-1), LIGHT_GRAY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 2), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) siebert_data = [ [hdr_cell("Siebert Classification — Ridge Collapse", bg=MID_BLUE)], [Table([ [body_cell('Type I', fg=WHITE, bold=True), body_cell('Horizontal bone loss only (normal height preserved)')], [body_cell('Type II', fg=WHITE, bold=True), body_cell('Vertical bone loss only (normal width preserved)')], [body_cell('Type III', fg=WHITE, bold=True), body_cell('Combination: horizontal AND vertical bone loss')], ], colWidths=[60, (W-100)/2 - 80], style=TableStyle([ ('BACKGROUND', (0,0), (0,-1), ACCENT), ('BACKGROUND', (1,0), (1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ('INNERGRID', (0,0), (-1,-1), 0.5, LIGHT_GRAY), ('BOX', (0,0), (-1,-1), 0.5, MID_BLUE), ]))], [Spacer(1, 6)], [hdr_cell("Lekholm & Zarb — Bone Quality (Types 1–4)", bg=DARK_BLUE)], [Table([ [body_cell('Type 1', fg=WHITE, bold=True), body_cell('Almost entire jaw = homogenous compact bone (densest)')], [body_cell('Type 2', fg=WHITE, bold=True), body_cell('Thick compact bone surrounds dense trabecular core')], [body_cell('Type 3', fg=WHITE, bold=True), body_cell('Thin cortical bone + dense trabecular bone of favourable strength')], [body_cell('Type 4', fg=WHITE, bold=True), body_cell('Thin cortical bone + LOW DENSITY trabecular bone (softest)')], ], colWidths=[60, (W-100)/2 - 80], style=TableStyle([ ('BACKGROUND', (0,0), (0,-1), GOLD), ('BACKGROUND', (1,0), (1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ('INNERGRID', (0,0), (-1,-1), 0.5, LIGHT_GRAY), ('BOX', (0,0), (-1,-1), 0.5, DARK_BLUE), ]))], [Spacer(1, 6)], [hdr_cell("Lekholm & Zarb — Ridge Quantity (Shapes a–e)", bg=DARK_BLUE)], [Table([ [body_cell('Shape a', fg=WHITE, bold=True), body_cell('No bone resorption — ideal ridge form')], [body_cell('Shape b', fg=WHITE, bold=True), body_cell('Slight resorption — minimal volume loss')], [body_cell('Shape c', fg=WHITE, bold=True), body_cell('Moderate resorption — adequate bone remains')], [body_cell('Shape d', fg=WHITE, bold=True), body_cell('Advanced resorption — compromised')], [body_cell('Shape e', fg=WHITE, bold=True), body_cell('Extreme resorption — very challenging')], ], colWidths=[60, (W-100)/2 - 80], style=TableStyle([ ('BACKGROUND', (0,0), (0,-1), DARK_BLUE), ('BACKGROUND', (1,0), (1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ('INNERGRID', (0,0), (-1,-1), 0.5, LIGHT_GRAY), ('BOX', (0,0), (-1,-1), 0.5, DARK_BLUE), ]))], ] right_t = Table(siebert_data, colWidths=[(W-100)/2 - 10]) right_t.setStyle(TableStyle([ ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 2), ('LEFTPADDING', (0,0), (-1,-1), 0), ])) combined = Table([[left_t, right_t]], colWidths=[(W-100)/2]*2) combined.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ])) story.append(combined) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 4: FIVE KEY EXAMINATIONS # ═══════════════════════════════════════════ story.append(section_header("Pre-Implant Diagnosis — Five Key Examinations")) story.append(Spacer(1, 6)) exams_content = [ ("A. Periodontal", MID_BLUE, [ "• Soft and hard supporting tissues of dentition", "• Tissue biotype: thin vs thick periodontium", "• Probing depths + gingival recession measurement", "• Crestal alveolar bone level (bone sounding)", "• Mucogingival problems, furcation involvement", "• Ridge collapse: horizontal + vertical (Siebert I, II, III)", ]), ("B. Occlusal", ACCENT, [ "• Identify parafunctional habits (bruxism, clenching)", "• Opposing occlusion and restorative material selection", "• Mounted diagnostic casts evaluation", "• Vertical and horizontal overlap assessment", "• Restorative space: lack = mechanical failure", "• Over-erupted teeth causing occlusal interferences", ]), ("C. Endodontic", MID_BLUE, [ "• Vitality of remaining dentition", "• Periapical lesions and incomplete root canals", "• Poor endodontic prognosis = risk assessment required", "• Protect future implant sites from pathology", ]), ("D. Restorative", ACCENT, [ "• Margin integrity of existing restorations", "• Biologic width violations requiring crown lengthening", "• Strategic value of each compromised tooth", "• Sequential extraction for phased implant healing", "• Teeth with poor prognosis may support interim prosthesis", ]), ("E. Orthodontic", MID_BLUE, [ "• Restorative space analysis (M-D root positions)", "• Root angulation and tipping affect implant space", "• Complete ortho BEFORE implant placement in aesthetics", "• Provisional implants can provide anchorage", "• Final implants placed only after ortho wax-up confirms", ]), ("F. Radiographic", DARK_BLUE, [ "• Full-mouth periapical + bitewing X-rays", "• Panorex (limited compared to CT)", "• 3D CT scan — GOLD STANDARD", "• Diagnostic wax-up → radiographic guide → CT", "• Measures H & V bone loss accurately", "• CAD-CAM virtual planning (Nobel ARK, Simplant)", ]), ] for i in range(0, 6, 3): row_cells = [] for j in range(3): title, color, bullets = exams_content[i+j] cell_inner = [[hdr_cell(title, bg=color)]] + [[body_cell(b)] for b in bullets] inner = Table(cell_inner, colWidths=[(W-100)/3 - 12]) inner.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), color), ('BACKGROUND', (0,1), (-1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 7), ('BOX', (0,0), (-1,-1), 1, color), ])) row_cells.append(inner) t = Table([row_cells], colWidths=[(W-100)/3]*3) t.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 4), ('RIGHTPADDING', (0,0), (-1,-1), 4), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ])) story.append(t) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 5: FLAP DESIGN & IMPLANT POSITIONING # ═══════════════════════════════════════════ story.append(section_header("Flap Design, Surgical Protocols & Implant Positioning")) story.append(Spacer(1, 6)) story.append(Table([[hdr_cell("Surgical Protocol Evolution", bg=MID_BLUE)]], colWidths=[W-80], style=TableStyle([('BACKGROUND',(0,0),(-1,-1),MID_BLUE),('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5),('LEFTPADDING',(0,0),(-1,-1),10)]))) proto_data = [ [body_cell('Brånemark (Original)', fg=WHITE, bold=True), body_cell('2-stage: buried implant → 3–6 months healing → second stage surgery to connect abutment. Vestibular flap design.')], [body_cell('ITI One-Stage Protocol', fg=DARK_BLUE, bold=True), body_cell('Implant extends through soft tissue during healing. Crestal incision or flapless approach. Requires adequate keratinised tissue.')], [body_cell('Modern Standard', fg=WHITE, bold=True), body_cell('One-stage protocol most common. Roughened implant surface allows faster osseointegration. Immediate loading now popular with modified techniques.')], ] pt = Table(proto_data, colWidths=[160, W-100-160]) pt.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), ACCENT), ('BACKGROUND', (0,1), (0,1), GOLD), ('BACKGROUND', (0,2), (0,2), MID_BLUE), ('BACKGROUND', (1,0), (1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 8), ('INNERGRID', (0,0), (-1,-1), 0.5, LIGHT_GRAY), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) story.append(pt) story.append(Spacer(1, 8)) flapless_data = [ [hdr_cell("Flapless Technique — Indications & Cautions", bg=DARK_BLUE)], [body_cell('<b>IDEAL CANDIDATE:</b> Adequate bone width + plenty of keratinised tissue', fg=MID_BLUE)], [body_cell('<b>RISK:</b> Compromised visibility during drilling', fg=RED_COLOR)], [body_cell('<b>AESTHETIC ZONE:</b> Needs adequate buccal thickness for long-term stability', fg=MID_BLUE)], [body_cell('• L. Abrams Roll Technique: transfer crestal thick tissue to buccal (additive)')], [body_cell('• Punch technique = subtractive — not preferred in aesthetic zone')], [body_cell('• Two-stage protocol in aesthetic zone allows 2nd surgical correction opportunity')], ] fl_t = Table(flapless_data, colWidths=[(W-100)/2 - 10]) fl_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), DARK_BLUE), ('BACKGROUND', (0,1), (-1,-1), LIGHT_GRAY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, DARK_BLUE), ])) pos_data_left = [ [hdr_cell("Critical Implant Positioning Dimensions", bg=MID_BLUE)], ] pos_items = [ ("Subgingival Depth", "3–4 mm subgingival placement of platform in aesthetic zone"), ("Buccal Position", "Buccal aspect of platform ≥1 mm palatal/lingual to future buccal gingival margin"), ("Inter-Implant Distance", ">3 mm between fixtures — preserves interproximal bone"), ("Platform Switching", "Narrower abutment on wider platform (3i) — preserves crestal bone, supports soft tissue"), ("Countersinking in Soft Bone", "AVOID — may lose initial stability. Keep platform at crest or supra-crestal"), ("Wide Platform", "Smoother gingival interface but greater risk of apical tissue migration"), ] for k, v in pos_items: pos_data_left.append([Table([[body_cell(k, fg=WHITE, bold=True), body_cell(v)]], colWidths=[140, (W-100)/2-160], style=TableStyle([ ('BACKGROUND',(0,0),(0,0),ACCENT), ('BACKGROUND',(1,0),(1,0),WHITE), ('TOPPADDING',(0,0),(-1,-1),3), ('BOTTOMPADDING',(0,0),(-1,-1),3), ('LEFTPADDING',(0,0),(-1,-1),5), ('BOX',(0,0),(-1,-1),0.5,ACCENT), ]))]) pos_t = Table(pos_data_left, colWidths=[(W-100)/2 - 10]) pos_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), MID_BLUE), ('TOPPADDING', (0,0), (-1,-1), 3), ('BOTTOMPADDING', (0,0), (-1,-1), 2), ('LEFTPADDING', (0,0), (-1,-1), 0), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) combined2 = Table([[fl_t, pos_t]], colWidths=[(W-100)/2]*2) combined2.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ])) story.append(combined2) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 6: DRILLING PROTOCOLS # ═══════════════════════════════════════════ story.append(section_header("Drilling Protocols — Dense vs Soft Bone")) story.append(Spacer(1, 6)) dense_data = [ [hdr_cell("DENSE BONE — Types 1 & 2", bg=MID_BLUE)], [body_cell('<b>KEY RULE: Adequate irrigation + controlled speed</b>', fg=MID_BLUE)], [body_cell('• Prevent overheating (heat kills osteoblasts)')], [body_cell('• Final drill widens site to recommended diameter before tapping')], [body_cell('• Too-tight placement → pressure necrosis → failure')], [body_cell('• Implant shape (parallel vs tapered) affects tightness')], [Spacer(1,4)], [body_cell('<b>PARALLEL WALL IMPLANTS</b>', fg=MID_BLUE)], [body_cell('• Drill depth slightly longer than implant (extra tip at end)')], [body_cell('• Can be placed deeper if desired')], [body_cell('• CAUTION: extra tip near alveolar canal in posterior mandible')], [Spacer(1,4)], [body_cell('<b>CONCERN: PRESSURE NECROSIS</b>', fg=RED_COLOR)], [body_cell('If resistance during seating is excessive — STOP and widen osteotomy.')], ] dense_t = Table(dense_data, colWidths=[(W-100)/2 - 10]) dense_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), MID_BLUE), ('BACKGROUND', (0,1), (-1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) soft_data = [ [hdr_cell("SOFT BONE — Types 3 & 4", bg=GOLD)], [body_cell('<b>KEY RULE: UNDER-PREPARE THE OSTEOTOMY</b>', fg=HexColor('#B86B00'))], [body_cell('• Avoid over-preparation — angulation changes preclude placement')], [Spacer(1,4)], [body_cell('<b>OSTEOTOME TECHNIQUE</b>', fg=DARK_BLUE)], [body_cell('• Compress soft bone rather than remove it')], [body_cell('• Improves initial stabilisation')], [body_cell('• Also used for sinus floor in-fracture elevation')], [Spacer(1,4)], [body_cell('<b>TAPERED IMPLANTS IN SOFT BONE</b>', fg=DARK_BLUE)], [body_cell('• Wedging effect improves stability')], [body_cell('• More challenging: depth preparation must be exact')], [body_cell('• Final position CANNOT be adjusted unlike parallel wall')], [Spacer(1,4)], [body_cell('<b>BI-CORTICAL FIXATION (Posterior Maxilla)</b>', fg=DARK_BLUE)], [body_cell('• Engage sinus floor for extra anchorage')], [Spacer(1,4)], [body_cell('<b>COUNTERSINKING CAUTION</b>', fg=RED_COLOR)], [body_cell('• May cause LOSS of initial stability in soft bone')], [body_cell('• Keep platform at crest or supra-crestal if space allows')], ] soft_t = Table(soft_data, colWidths=[(W-100)/2 - 10]) soft_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), GOLD), ('BACKGROUND', (0,1), (-1,-1), LIGHT_GRAY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, GOLD), ])) combined3 = Table([[dense_t, soft_t]], colWidths=[(W-100)/2]*2) combined3.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ])) story.append(combined3) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 7: DEFICIENT RIDGE — VERTICAL HEIGHT # ═══════════════════════════════════════════ story.append(section_header("Deficient Osseous Ridge — Lack of Vertical Height")) story.append(Spacer(1, 6)) ant_max_data = [ [hdr_cell("Anterior Maxilla — Vertical Resorption", bg=MID_BLUE)], [body_cell('<b>PROBLEM:</b> Vertical resorption affects aesthetics. Full edentulous may limit to overdenture.', fg=MID_BLUE)], [Spacer(1,4)], [body_cell('<b>OPTION 1: Onlay Block Graft</b>', fg=DARK_BLUE)], [body_cell('• Autogenous bone from intra-oral (ramus / chin) OR extra-oral (iliac crest / calvaria)')], [body_cell('• Greater defect = more bone required')], [body_cell('• Extra-oral: general anaesthesia + greater morbidity')], [body_cell('• Intra-oral: better suited for partially edentulous situations')], [body_cell('• Cortical-cancellous block adapted and fixated with screws')], [body_cell('<b>Building vertical height = LEAST predictable grafting option</b>', fg=RED_COLOR)], [Spacer(1,4)], [body_cell('<b>OPTION 2: Distraction Osteogenesis</b>', fg=DARK_BLUE)], [body_cell('• Surgical osteotomy + distraction device placed in mouth')], [body_cell('• Activated daily — bone moves coronally over several weeks')], [body_cell('• Bone left to mature for months before implant placement')], [body_cell('• Used when inter-arch space is NOT a problem')], ] ant_t = Table(ant_max_data, colWidths=[(W-100)/2 - 10]) ant_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), MID_BLUE), ('BACKGROUND', (0,1), (-1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) post_max_data = [ [hdr_cell("Posterior Maxilla — Sinus Proximity Challenges", bg=DARK_BLUE)], [body_cell('<b>Challenges:</b> Perio bone loss + sinus proximity + soft Type 3–4 bone', fg=DARK_BLUE)], [Spacer(1,3)], [body_cell('<b>SINUS LIFT — Lateral Wall Approach</b>', fg=DARK_BLUE)], [body_cell('• Open sinus via lateral wall window; elevate sinus membrane')], [body_cell('• Pack bone graft: autogenous best (chin, ramus, tuberosity)')], [body_cell('• Mix with HA, Bio-Oss, or FDBA; optional Platelet Rich Plasma (PRP)')], [body_cell('• Wait 5–6 months healing before implant placement')], [body_cell('• If ≥5 mm bone: simultaneous placement possible (less predictable)')], [Spacer(1,3)], [body_cell('<b>OSTEOTOME TECHNIQUE (≥7–8 mm bone available)</b>', fg=DARK_BLUE)], [body_cell('• Drill 3 mm short of sinus floor → osteotome in-fractures floor upward')], [body_cell('• Pack bone graft into osteotomy → place implant simultaneously')], [body_cell('• Less invasive but MORE technique-sensitive')], [body_cell('<b>Risk: sinus membrane perforation</b>', fg=RED_COLOR)], [Spacer(1,3)], [body_cell('<b>POSTERIOR MANDIBLE</b>', fg=DARK_BLUE)], [body_cell('• Inferior alveolar nerve limits implant length')], [body_cell('• Options: short wide implants, nerve transposition (high morbidity)')], [body_cell('• Distal cantilever off mesial implants = alternative')], ] post_t = Table(post_max_data, colWidths=[(W-100)/2 - 10]) post_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), DARK_BLUE), ('BACKGROUND', (0,1), (-1,-1), LIGHT_GRAY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, DARK_BLUE), ])) combined4 = Table([[ant_t, post_t]], colWidths=[(W-100)/2]*2) combined4.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ])) story.append(combined4) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 8: DEFICIENT RIDGE — HORIZONTAL WIDTH # ═══════════════════════════════════════════ story.append(section_header("Deficient Osseous Ridge — Lack of Horizontal Width")) story.append(Spacer(1, 6)) ant_horiz_data = [ [hdr_cell("Anterior Maxilla — Horizontal Deficiency", bg=MID_BLUE)], [body_cell('<b>PATTERNS:</b> Knife-edge ridges or concavity type defects', fg=MID_BLUE)], [body_cell('• Large anterior incisal foramen can restrict central implant placement')], [Spacer(1,4)], [body_cell('<b>KNIFE-EDGE RIDGES (most predictable grafting)</b>', fg=DARK_BLUE)], [body_cell('• Veneer grafts: intra-oral cortical-cancellous block')], [body_cell('• Block stabilised with fixation screws')], [body_cell('• Remove screws after 6 months at implant surgery')], [Spacer(1,4)], [body_cell('<b>CONCAVITY DEFECTS</b>', fg=DARK_BLUE)], [body_cell('• Block grafts OR Guided Bone Regeneration (GBR)')], [body_cell('• Particulate graft (ramus scrapings + HA/osteoconductive material)')], [body_cell('• Covered with resorbable or non-resorbable membrane')], [body_cell('• Titanium-reinforced membrane if spacemaking desired')], [Spacer(1,4)], [body_cell('<b>NARROW RIDGES</b>', fg=DARK_BLUE)], [body_cell('• Osteotome bone spreading (conservative)')], [body_cell('• Split-ridge technique + simultaneous implant placement')], ] ant_h_t = Table(ant_horiz_data, colWidths=[(W-100)/2 - 10]) ant_h_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), MID_BLUE), ('BACKGROUND', (0,1), (-1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) soft_tissue_data = [ [hdr_cell("Anterior & Posterior Mandible", bg=DARK_BLUE)], [body_cell('• Block grafts with fixation screws (same GBR principles)')], [body_cell('<b>KEY SUCCESS FACTORS:</b>', fg=DARK_BLUE)], [body_cell('• Check vestibule depth before planning flap')], [body_cell('• Flap must advance WITHOUT TENSION for closure')], [body_cell('• Tension-free closure is mandatory for graft survival')], [body_cell('• Vertical releasing incisions ≥1 tooth distant from graft')], [Spacer(1,6)], [hdr_cell("Soft Tissue Augmentation Techniques", bg=ACCENT)], [body_cell('<b>LANGER TECHNIQUE (Sub-Epithelial CT Graft)</b>', fg=DARK_BLUE)], [body_cell('• Most common donor: palatal tissue mesial to 1st molar')], [body_cell('• Useful for thin tissue augmentation + minor ridge resorption')], [Spacer(1,4)], [body_cell('<b>TUBEROSITY TISSUE</b>', fg=DARK_BLUE)], [body_cell('• Especially useful when thicker graft needed')], [body_cell('• Ideal for ridge augmentation (inlay or pouch technique)')], [Spacer(1,4)], [body_cell('<b>PALACCI ROTATED FLAP</b>', fg=DARK_BLUE)], [body_cell('• Papilla regeneration technique')], [body_cell('• Building supporting bone beneath soft tissue = most predictable outcome')], ] st_t = Table(soft_tissue_data, colWidths=[(W-100)/2 - 10]) st_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), DARK_BLUE), ('BACKGROUND', (0,8), (0,8), ACCENT), ('BACKGROUND', (0,1), (0,7), LIGHT_GRAY), ('BACKGROUND', (0,9), (-1,-1), LIGHT_GRAY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, DARK_BLUE), ])) combined5 = Table([[ant_h_t, st_t]], colWidths=[(W-100)/2]*2) combined5.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ])) story.append(combined5) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 9: EXTRACTION TIMING OPTIONS # ═══════════════════════════════════════════ story.append(section_header("Teeth Requiring Removal — Timing Options & Decision Factors")) story.append(Spacer(1, 6)) decision_data = [ [hdr_cell("Ask These Questions Before Extraction", bg=MID_BLUE)], [Table([ [body_cell('1. Is the tooth in the aesthetic zone?'), body_cell('2. What is the tissue biotype? (thin scalloped or thick flat)')], [body_cell('3. How much bone loss from perio/endo failure?'), body_cell('4. How predictable is gingival architecture stability?')], ], colWidths=[(W-100)/2]*2, style=TableStyle([ ('BACKGROUND',(0,0),(-1,-1),LIGHT_GRAY), ('TOPPADDING',(0,0),(-1,-1),4), ('BOTTOMPADDING',(0,0),(-1,-1),4), ('LEFTPADDING',(0,0),(-1,-1),8), ('INNERGRID',(0,0),(-1,-1),0.5,ACCENT), ]))], ] dd = Table(decision_data, colWidths=[W-80]) dd.setStyle(TableStyle([ ('BACKGROUND',(0,0),(0,0),MID_BLUE), ('TOPPADDING',(0,0),(-1,-1),3), ('BOTTOMPADDING',(0,0),(-1,-1),3), ('LEFTPADDING',(0,0),(-1,-1),0), ('BOX',(0,0),(-1,-1),1,MID_BLUE), ])) story.append(dd) story.append(Spacer(1,6)) timing_items = [ ("Option 1", MID_BLUE, "Extract → Wait months → Place Implant", "Standard approach. Allows soft tissue maturity. Good for most cases."), ("Option 2", ACCENT, "Orthodontic Forced Eruption → Then Extract", "Move gingival complex + crestal bone coronally before extraction. Best when bone level at planned extraction site is deficient."), ("Option 3", GOLD, "Extract + Socket Bone Graft → Heal → Place Implant", "Preserves soft tissue contours and minimises ridge collapse. Use when buccal plate is thin OR has slight dehiscence."), ("Option 4", MID_BLUE, "Extract + Immediate Implant (same visit)", "ONLY for single-rooted teeth with thick, intact buccal plate. Options: a) Two-stage buried b) One-stage with healing abutment c) Immediate load with provisional restoration."), ("Option 5", DARK_BLUE, "Extract → Wait 2–3 months → Bone Graft → Wait 5–6 months → Implant", "Best for cases with expected advanced ridge resorption. Most staged and most predictable option."), ] for opt, color, title, desc in timing_items: row = Table([ [body_cell(opt, fg=WHITE if color != GOLD else DARK_BLUE, bold=True), body_cell(f'<b>{title}</b>', fg=DARK_BLUE), body_cell(desc)], ], colWidths=[80, 250, W-100-330]) row.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), color), ('BACKGROUND', (1,0), (2,0), WHITE), ('TOPPADDING', (0,0), (-1,-1), 6), ('BOTTOMPADDING', (0,0), (-1,-1), 6), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, color), ('INNERGRID', (0,0), (-1,-1), 0.5, LIGHT_GRAY), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ])) story.append(row) story.append(Spacer(1,3)) story.append(Spacer(1,4)) note_box = Table([[ body_cell('<b>KEY NOTES:</b> If advanced ridge resorption expected after extraction — stage with multiple procedures. ' 'Simultaneous implant + GBR (particulate bone + membrane) possible if ideal implant position achievable. ' 'Staged GBR first → 6 months healing → then implant = most predictable aesthetic outcome. ' 'Orthodontic forced eruption before extraction reduces bony defect at socket.', fg=DARK_BLUE) ]], colWidths=[W-80]) note_box.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,-1),LIGHT_GRAY), ('TOPPADDING',(0,0),(-1,-1),6), ('BOTTOMPADDING',(0,0),(-1,-1),6), ('LEFTPADDING',(0,0),(-1,-1),10), ('BOX',(0,0),(-1,-1),1,GOLD), ])) story.append(note_box) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 10: LOADING PROTOCOLS # ═══════════════════════════════════════════ story.append(section_header("Loading Protocols, Primary Stability & Timing")) story.append(Spacer(1, 6)) stability_data = [ [hdr_cell("Surface Modification & Primary Stability", bg=MID_BLUE)], [body_cell('<b>Roughened surface (vs smooth machined):</b> improves bone healing rate + speeds osseointegration', fg=DARK_BLUE)], [Spacer(1,3)], [body_cell('<b>PRIMARY STABILITY = #1 FACTOR FOR SUCCESS</b>', fg=MID_BLUE)], [body_cell('• Achieved by: bone quality, drill protocol, implant design and shape')], [body_cell('• OsstellTM Machine: resonance frequency analysis (ISQ) — objective stability measurement')], [Spacer(1,3)], [body_cell('<b>CAUSES OF FAILURE:</b>', fg=RED_COLOR)], [body_cell('• Micro-motion during initial bone healing → NO integration')], [body_cell('• Most common cause: overloading via removable appliance over healing implant')], [Spacer(1,3)], [body_cell('<b>TRANSITIONAL IMPLANTS</b>', fg=DARK_BLUE)], [body_cell('• Support interim fixed or removable prostheses during healing')], [body_cell('• Used as surgical guide anchors')], [body_cell('• Adapted for orthodontic anchorage where dental anchorage is lacking')], [Spacer(1,3)], [body_cell('<b>KEY ADVANTAGE — Fixed Provisionals:</b> prevent removable appliance forces on healing implant', fg=MID_BLUE)], ] stab_t = Table(stability_data, colWidths=[(W-100)/2 - 10]) stab_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), MID_BLUE), ('BACKGROUND', (0,1), (-1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) imm_load_data = [ [hdr_cell("Immediate Loading Protocol", bg=DARK_BLUE)], [body_cell('<b>CRITERIA for Immediate Loading:</b>', fg=DARK_BLUE)], [body_cell('• Initial stability must be EXTREMELY TIGHT')], [body_cell('• Careful occlusal adjustment of provisional required')], [body_cell('• Continuous monitoring throughout healing phase')], [Spacer(1,3)], [body_cell('<b>BEST CANDIDATES:</b>', fg=MID_BLUE)], [body_cell('• Single anterior teeth (lower occlusal forces)')], [body_cell('• Fully edentulous: rigid splinted interim prosthesis')], [Spacer(1,3)], [body_cell('<b>POOREST CANDIDATES:</b>', fg=RED_COLOR)], [body_cell('• Posterior teeth (far greater occlusal forces)')], [body_cell('• Soft bone sites (Type 3–4)')], [Spacer(1,3)], [body_cell('<b>AESTHETIC ZONE WARNING:</b>', fg=RED_COLOR)], [body_cell('• Extraction + immediate implant + immediate provisional = HIGHER RISK')], [body_cell('• Difficult to predict future buccal tissue contour (shrinkage)')], [body_cell('• Benefit: supports adjacent papilla')], [Spacer(1,3)], [body_cell('<b>ORIGINAL DELAYED PROTOCOL:</b>', fg=DARK_BLUE)], [body_cell('• Mandible: 3 months | Maxilla: 6 months before loading')], [body_cell('• Still gold standard for reliability; not always required with modern surfaces')], ] imm_t = Table(imm_load_data, colWidths=[(W-100)/2 - 10]) imm_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), DARK_BLUE), ('BACKGROUND', (0,1), (-1,-1), LIGHT_GRAY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, DARK_BLUE), ])) combined6 = Table([[stab_t, imm_t]], colWidths=[(W-100)/2]*2) combined6.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ])) story.append(combined6) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 11: COMPLICATIONS & SPECIAL PATIENTS # ═══════════════════════════════════════════ story.append(section_header("Surgical Complications & Special Patient Considerations")) story.append(Spacer(1, 6)) comp_data = [ [hdr_cell("Post-Surgical Complications — Prevention", bg=MID_BLUE)], [body_cell('<b>FLAP DESIGN</b>', fg=MID_BLUE)], [body_cell('• Careful planning of flap design is mandatory before surgery')], [body_cell('• Gentle soft tissue manipulation throughout procedure')], [body_cell('• Vertical releasing incisions ≥1 tooth distant from graft area')], [Spacer(1,3)], [body_cell('<b>BLEEDING CONTROL</b>', fg=MID_BLUE)], [body_cell('• Haemostasis is mandatory')], [body_cell('• Releasing incisions needed for tension-free flap advancement and closure')], [Spacer(1,3)], [body_cell('<b>FLAP COVERAGE FAILURE</b>', fg=RED_COLOR)], [body_cell('• Sloughing or incision opening → delayed healing')], [body_cell('• Compromised results when graft coverage is lost')], [body_cell('• Prevention: close WITHOUT tension using resorbable sutures')], [Spacer(1,3)], [body_cell('<b>SMOKING — Greatest Single Risk Factor</b>', fg=RED_COLOR)], [body_cell('• Affects both hard AND soft tissue healing')], [body_cell('• Strongly counsel patients before treatment commences')], [Spacer(1,3)], [body_cell('<b>BUCCAL TISSUE STABILITY — Critical Point</b>', fg=DARK_BLUE)], [body_cell('First year: crestal resorption to 1st thread — buccal AND interproximal')], [body_cell('→ Leads to buccal shrinkage and recession around restoration')], [body_cell('→ Staged GBR first → 6 months → implant = most predictable aesthetic result')], ] comp_t = Table(comp_data, colWidths=[(W-100)/2 - 10]) comp_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), MID_BLUE), ('BACKGROUND', (0,1), (-1,-1), WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, MID_BLUE), ])) med_data = [ [hdr_cell("Medically Compromised Patients", bg=DARK_BLUE)], [body_cell('<b>NOT a contraindication — requires special attention and planning</b>', fg=DARK_BLUE)], [Spacer(1,3)], [body_cell('<b>CONDITIONS REQUIRING CAREFUL MANAGEMENT:</b>', fg=DARK_BLUE)], [body_cell('• Diabetes Mellitus')], [body_cell('• Autoimmune disease')], [body_cell('• Patients on long-term steroids')], [body_cell('• Prior radiation treatment')], [Spacer(1,3)], [body_cell('<b>APPROACH:</b>', fg=DARK_BLUE)], [body_cell('• Logical and ethical decisions made with patient AND their physicians')], [body_cell('• Higher failure rates; more frequent monitoring; modified protocols')], [Spacer(1,3)], [body_cell('<b>EVIDENCE-BASED RISK FACTORS FOR FAILURE:</b>', fg=RED_COLOR)], [body_cell('1. Smoking')], [body_cell('2. Systemic disease')], [body_cell('3. Poor bone quality (Type 3–4)')], [body_cell('4. Lack of primary stability')], [body_cell('5. Micro-motion during healing')], [body_cell('6. Overloading with removable appliance')], ] med_t = Table(med_data, colWidths=[(W-100)/2 - 10]) med_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), DARK_BLUE), ('BACKGROUND', (0,1), (-1,-1), LIGHT_GRAY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOX', (0,0), (-1,-1), 1, DARK_BLUE), ])) combined7 = Table([[comp_t, med_t]], colWidths=[(W-100)/2]*2) combined7.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ])) story.append(combined7) story.append(PageBreak()) # ═══════════════════════════════════════════ # PAGE 12: QUICK REFERENCE CARDS # ═══════════════════════════════════════════ story.append(section_header("Quick Reference — Key Classifications & Clinical Rules")) story.append(Spacer(1, 6)) cards = [ ("Brånemark Healing Protocol", DARK_BLUE, "Mandible: 3 months\nMaxilla: 6 months\nBefore loading / abutment connection"), ("Sinus Lift — Bone Height Rules", MID_BLUE, "< 5 mm: Lift first, wait 5–6 months\n≥ 5 mm: Simultaneous (less predictable)\n≥ 7–8 mm: Osteotome technique"), ("Dense Bone Drilling", ACCENT, "COOL + IRRIGATE\nFull diameter before tapping\nAvoid pressure necrosis"), ("Soft Bone Drilling", GOLD, "UNDER-PREPARE\nOsteotome technique preferred\nTapered implant advantageous"), ("Aesthetic Zone — Implant Depth", DARK_BLUE, "Platform: 3–4 mm subgingival\nBuccal platform ≥ 1 mm palatal\nto future buccal gingival margin"), ("Platform Switching", MID_BLUE, "Narrower abutment on wider platform\nPreserves crestal bone (eg 3i)\nNeeds further research evidence"), ("Bone Graft Healing Times", ACCENT, "Block graft: 6 months before implant\nSinus lift: 5–6 months before implant\nGBR staged: 6 months then implant"), ("Smoking Risk", RED_COLOR, "Greatest single risk factor\nAffects hard + soft tissue healing\nStrongly counsel pre-treatment"), ("Inter-Implant Distance", DARK_BLUE, "> 3 mm between fixtures\nPreserves interproximal bone\nSupports papilla formation"), ("Immediate Loading Criteria", MID_BLUE, "Extremely tight primary stability\nSingle anteriors = best candidates\nFully edentulous: rigid splinted prosthesis"), ("Tissue Biotype", ACCENT, "Thin = scalloped, high risk\nThick = flat, more forgiving\nBone sounding = best parameter"), ("Key Risk Factors for Failure", RED_COLOR, "1. Smoking\n2. Systemic disease\n3. Poor bone quality\n4. Micro-motion during healing\n5. Overloading"), ] card_rows = [] for i in range(0, 12, 4): row_cells = [] for j in range(4): if i+j < len(cards): title, color, body_txt = cards[i+j] fg = DARK_BLUE if color == GOLD else WHITE lines = body_txt.split('\n') cell_inner = [[hdr_cell(title, bg=color, fg=fg, fontsize=9)]] + \ [[body_cell(line, fontsize=9)] for line in lines] inner = Table(cell_inner, colWidths=[(W-100)/4 - 10]) inner.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), color), ('BACKGROUND', (0,1), (-1,-1), LIGHT_GRAY), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 6), ('BOX', (0,0), (-1,-1), 1, color), ])) row_cells.append(inner) t = Table([row_cells], colWidths=[(W-100)/4]*4) t.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 4), ('RIGHTPADDING', (0,0), (-1,-1), 4), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ])) card_rows.append(t) for cr in card_rows: story.append(cr) # ═══════════════════════════════════════════ # BUILD # ═══════════════════════════════════════════ def on_page(canvas, doc): canvas.saveState() canvas.setFillColor(DARK_BLUE) canvas.rect(0, H-6, W, 6, fill=1, stroke=0) canvas.rect(0, 0, W, 6, fill=1, stroke=0) canvas.setFillColor(ACCENT) canvas.rect(0, H-3, W, 3, fill=1, stroke=0) canvas.rect(0, 0, W, 3, fill=1, stroke=0) canvas.setFillColor(PALE_BLUE) canvas.setFont('Helvetica', 8) canvas.drawString(30, 10, "Dr. Shreya Chindak — Dental Implant Surgery Study Guide") canvas.drawRightString(W-30, 10, f"Page {doc.page}") canvas.restoreState() doc = SimpleDocTemplate( output_path, pagesize=landscape(A4), leftMargin=40, rightMargin=40, topMargin=20, bottomMargin=20, ) doc.build(story, onFirstPage=on_page, onLaterPages=on_page) print(f"Saved: {output_path}") PYEOF
Dental Implant Surgery Study Guide v2
PDF Document · PDF