Please summarize this in study guide
python3 -c " import pdfplumber pdf_path = '/tmp/workspace/attachments/6acab27f-1552-4c90-9f07-f1eea42639e9/00008505-199902000-00011~why-do-dental-implants-fail-part-i.pdf' with pdfplumber.open(pdf_path) as pdf: print(f'Total pages: {len(pdf.pages)}') for i, page in enumerate(pdf.pages): text = page.extract_text() print(f'--- PAGE {i+1} ---') print(text) print() "
python3 -c " from pypdf import PdfReader pdf_path = '/tmp/workspace/attachments/6acab27f-1552-4c90-9f07-f1eea42639e9/00008505-199902000-00011~why-do-dental-implants-fail-part-i.pdf' reader = PdfReader(pdf_path) print(f'Pages: {len(reader.pages)}') for i, page in enumerate(reader.pages): text = page.extract_text() if text and text.strip(): print(f'--- PAGE {i+1} ---') print(text[:2000]) print() else: print(f'--- PAGE {i+1}: (empty/image) ---') "
why do dental implants fail part 1 1999 implant dentistry journal summary osseointegration failure
python3 -c " from pypdf import PdfReader import base64, io pdf_path = '/tmp/workspace/attachments/6acab27f-1552-4c90-9f07-f1eea42639e9/00008505-199902000-00011~why-do-dental-implants-fail-part-i.pdf' reader = PdfReader(pdf_path) print(f'Pages: {len(reader.pages)}') print(f'Metadata: {reader.metadata}') # Check for embedded images or XObjects page = reader.pages[0] print('Resources:', page.get('/Resources', {})) "
python3 -c " from pypdf import PdfReader from PIL import Image import io, os pdf_path = '/tmp/workspace/attachments/6acab27f-1552-4c90-9f07-f1eea42639e9/00008505-199902000-00011~why-do-dental-implants-fail-part-i.pdf' reader = PdfReader(pdf_path) os.makedirs('/tmp/workspace/implant_pages', exist_ok=True) # Extract the image from each page for page_num, page in enumerate(reader.pages): resources = page.get('/Resources', {}) xobjects = resources.get('/XObject', {}) for name, obj_ref in xobjects.items(): obj = obj_ref.get_object() if obj.get('/Subtype') == '/Image': data = obj.get_data() filter_type = obj.get('/Filter', '') width = obj.get('/Width', 0) height = obj.get('/Height', 0) print(f'Page {page_num+1}: {name} filter={filter_type} size={width}x{height} bytes={len(data)}') # Save as PNG try: if '/DCTDecode' in str(filter_type) or 'DCT' in str(filter_type): img = Image.open(io.BytesIO(data)) else: # Try raw color_space = obj.get('/ColorSpace', '/DeviceGray') bpc = obj.get('/BitsPerComponent', 8) mode = 'L' if 'Gray' in str(color_space) else 'RGB' img = Image.frombytes(mode, (width, height), data) img.save(f'/tmp/workspace/implant_pages/page_{page_num+1}.png') print(f' -> Saved page_{page_num+1}.png') except Exception as e: print(f' -> Error: {e}') break # Only first image per page "
pip install --user pymupdf 2>&1 | tail -5
python3 -c " import fitz # pymupdf import os pdf_path = '/tmp/workspace/attachments/6acab27f-1552-4c90-9f07-f1eea42639e9/00008505-199902000-00011~why-do-dental-implants-fail-part-i.pdf' os.makedirs('/tmp/workspace/implant_pages', exist_ok=True) doc = fitz.open(pdf_path) print(f'Pages: {len(doc)}') # First try text extraction full_text = '' for i, page in enumerate(doc): text = page.get_text() full_text += text print(f'Page {i+1} text length: {len(text)}') print() print('Total text length:', len(full_text)) if full_text.strip(): print('SAMPLE:', full_text[:500]) "
python3 -c " import fitz import os pdf_path = '/tmp/workspace/attachments/6acab27f-1552-4c90-9f07-f1eea42639e9/00008505-199902000-00011~why-do-dental-implants-fail-part-i.pdf' os.makedirs('/tmp/workspace/implant_pages', exist_ok=True) doc = fitz.open(pdf_path) # Render pages as images at 150 dpi for i in range(min(6, len(doc))): # First 6 pages page = doc[i] mat = fitz.Matrix(150/72, 150/72) # 150 dpi pix = page.get_pixmap(matrix=mat, colorspace=fitz.csGRAY) out_path = f'/tmp/workspace/implant_pages/page_{i+1}.png' pix.save(out_path) print(f'Saved page {i+1}: {pix.width}x{pix.height} -> {out_path}') " 2>&1
python3 -c " import fitz import os pdf_path = '/tmp/workspace/attachments/6acab27f-1552-4c90-9f07-f1eea42639e9/00008505-199902000-00011~why-do-dental-implants-fail-part-i.pdf' doc = fitz.open(pdf_path) # Try get_text with OCR if available for i in range(len(doc)): page = doc[i] try: # Try textpage with OCR tp = page.get_textpage_ocr(flags=0, language='eng', dpi=300) text = page.get_text(textpage=tp) if text.strip(): print(f'=== PAGE {i+1} ===') print(text[:3000]) except Exception as e: print(f'Page {i+1} OCR error: {e}') break " 2>&1 | head -100
el Askary Meffert Griffin why dental implants fail part I
el-Askary Meffert Griffin 1999 "why do dental implants fail part I" early failure osseointegration risk factors
PMID: 10635160
https://www.semanticscholar.org/paper/Why-do-dental-implantsโฆ
Note: This PDF is a scanned (image-only) document with no extractable text layer, and OCR is not available in this environment. The study guide below is built from the full PubMed abstract (PMID 10635160), MeSH terms, and the well-documented content of this classic review, which is widely cited and summarized in the implant literature.
| Term | Definition |
|---|---|
| Ailing implant | Bone loss present but implant still osseointegrated; reversible with treatment |
| Failing implant | Progressive bone loss, bleeding on probing, exudate; at risk for loss |
| Failed implant | Complete loss of osseointegration; implant must be removed |
| Surviving implant | In function, no pathologic signs; does not mean "successful" |
Exam tip: The distinction between ailing, failing, and failed is a high-yield concept. An ailing implant can be saved; a failed implant cannot.
| Factor | Mechanism |
|---|---|
| Smoking | Vasoconstriction, reduced oxygen tension, impaired neutrophil function |
| Diabetes mellitus | Microvascular disease, impaired leukocyte function, altered collagen metabolism |
| Bruxism | Parafunction generates lateral forces exceeding implant tolerance |
| Poor oral hygiene | Plaque accumulation โ peri-implant inflammation |
| Bone disease | Osteoporosis, osteonecrosis reduce bone-implant contact |
| Factor | Consequence |
|---|---|
| Bone overheating | Thermal necrosis โ fibrous encapsulation instead of osseointegration |
| Contaminated implant surface | Disrupts titanium oxide layer, promotes infection |
| Incorrect positioning | Biomechanical stress concentration, aesthetic failure |
| Inadequate primary stability | Micromovement during healing โ fibrous interface |
Plaque accumulation
โ
Peri-implant mucositis (reversible - gingival inflammation only)
โ
Peri-implantitis (bone destruction begins - analogous to periodontitis)
โ
Ailing โ Failing โ Failed implant
| Part I (this article) | Part II (same authors, 1999) |
|---|---|
| Defines failure terminology | Expands on failure categories |
| Infective vs. non-infective etiology | Etiology, mode, type, origin, timing |
| Failure checklist | Classification by responsible personnel and tissue type |
| Ailing/failing/failed framework | More detailed clinical management |
I want a study guide
| Term | Definition |
|---|---|
| Ailing implant | Bone loss present but implant still osseointegrated; reversible with treatment |
| Failing implant | Progressive bone loss + bleeding on probing + exudate; at risk for loss |
| Failed implant | Complete loss of osseointegration; must be removed |
| Surviving implant | In function with no pathologic signs โ does NOT mean "successful" |
Key distinction: Ailing and failing implants can potentially be saved. A failed implant cannot.
| Type | When | Mechanism |
|---|---|---|
| Early failure | First 3โ4 months; before osseointegration completes | Failure of integration |
| Late failure | After osseointegration is established | Loss of an integrated implant |
| Factor | Mechanism |
|---|---|
| Smoking | Vasoconstriction, reduced Oโ, impaired neutrophil function |
| Diabetes mellitus | Microvascular disease, altered collagen, poor immune response |
| Bruxism | Parafunction creates lateral forces exceeding implant tolerance |
| Poor oral hygiene | Plaque โ peri-implant inflammation |
| Bone disease | Osteoporosis reduces bone-implant contact |
| Factor | Consequence |
|---|---|
| Bone overheating | Thermal necrosis โ fibrous encapsulation instead of osseointegration |
| Contaminated implant surface | Disrupts titanium oxide layer, promotes infection |
| Incorrect positioning | Biomechanical stress concentration, esthetic compromise |
| Inadequate primary stability | Micromovement โ fibrous interface |
Plaque accumulation
โ
Peri-implant mucositis โ reversible (soft tissue only)
โ
Peri-implantitis โ bone destruction begins (like periodontitis)
โ
Ailing โ Failing โ Failed implant
| Status | Management |
|---|---|
| Ailing | Debridement, chlorhexidine irrigation, antibiotics if indicated, surface decontamination, oral hygiene reinforcement |
| Failing | Surgical intervention, guided bone regeneration (GBR) if defect is favorable, address systemic risk factors, close monitoring |
| Failed | Remove implant, allow 3โ6 months healing, address causative factors, bone graft if needed, consider re-implantation |
In a pdf format !! And add my name below title dr. Shreya chindak
mkdir -p /tmp/workspace/study-guide && ls /tmp/workspace/study-guide/
~/study-guide/generate_study_guide.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
OUTPUT = "/tmp/workspace/study-guide/Dental_Implant_Failure_Study_Guide_Dr_Shreya.pdf"
# โโ Colours โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
NAVY = colors.HexColor("#1B3A6B")
TEAL = colors.HexColor("#0E7A8A")
LTBLUE = colors.HexColor("#D6EAF8")
LTGREY = colors.HexColor("#F4F6F7")
MIDGREY = colors.HexColor("#BDC3C7")
WHITE = colors.white
ACCENT = colors.HexColor("#E8F4FD")
# โโ Document โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2.2*cm, bottomMargin=2*cm,
title="Why Do Dental Implants Fail? Part I โ Study Guide",
author="Dr. Shreya Chindak",
)
W = A4[0] - 4*cm # usable width
# โโ Styles โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
base = getSampleStyleSheet()
def S(name, parent="Normal", **kw):
s = ParagraphStyle(name, parent=base[parent], **kw)
return s
titleStyle = S("MyTitle", "Title",
fontSize=22, textColor=NAVY, alignment=TA_CENTER,
spaceAfter=4, leading=28, fontName="Helvetica-Bold")
subtitleStyle = S("MySubtitle",
fontSize=11, textColor=TEAL, alignment=TA_CENTER,
spaceAfter=2, leading=14, fontName="Helvetica-BoldOblique")
authorStyle = S("Author",
fontSize=12, textColor=NAVY, alignment=TA_CENTER,
spaceAfter=4, leading=16, fontName="Helvetica-Bold")
refStyle = S("Ref",
fontSize=8, textColor=colors.HexColor("#7F8C8D"), alignment=TA_CENTER,
spaceAfter=6, leading=11, fontName="Helvetica-Oblique")
h1Style = S("H1",
fontSize=13, textColor=WHITE, alignment=TA_LEFT,
leading=17, fontName="Helvetica-Bold",
leftIndent=6, spaceAfter=0, spaceBefore=14)
h2Style = S("H2",
fontSize=11, textColor=NAVY, alignment=TA_LEFT,
leading=15, fontName="Helvetica-Bold",
spaceBefore=8, spaceAfter=3, leftIndent=2)
bodyStyle = S("Body",
fontSize=9.5, textColor=colors.black, alignment=TA_JUSTIFY,
leading=14, fontName="Helvetica",
spaceBefore=2, spaceAfter=3, leftIndent=4)
bulletStyle = S("Bullet",
fontSize=9.5, textColor=colors.black, alignment=TA_LEFT,
leading=13, fontName="Helvetica",
leftIndent=16, firstLineIndent=-10,
spaceBefore=1, spaceAfter=1)
keyStyle = S("Key",
fontSize=9.2, textColor=colors.HexColor("#1A5276"), alignment=TA_LEFT,
leading=13, fontName="Helvetica-Bold",
leftIndent=4, spaceBefore=2, spaceAfter=1)
qStyle = S("Q",
fontSize=9.5, textColor=NAVY, alignment=TA_LEFT,
leading=13, fontName="Helvetica-Bold",
leftIndent=4, spaceBefore=4, spaceAfter=1)
aStyle = S("A",
fontSize=9.5, textColor=colors.black, alignment=TA_LEFT,
leading=13, fontName="Helvetica",
leftIndent=14, spaceBefore=0, spaceAfter=3)
noteStyle = S("Note",
fontSize=8.8, textColor=colors.HexColor("#7D6608"), alignment=TA_LEFT,
leading=12, fontName="Helvetica-Oblique",
leftIndent=6, spaceBefore=2, spaceAfter=4)
smallStyle = S("Small",
fontSize=8.5, textColor=colors.HexColor("#555555"), alignment=TA_CENTER,
leading=11, fontName="Helvetica-Oblique")
# โโ Helper builders โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
def section_header(text):
"""Coloured banner for section headers."""
tbl = Table([[Paragraph(text, h1Style)]], colWidths=[W])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("ROUNDEDCORNERS", [4, 4, 4, 4]),
]))
return tbl
def info_table(headers, rows, col_widths, alt_color=LTBLUE):
data = [[Paragraph(f"<b>{h}</b>", S("TH", fontSize=9, textColor=WHITE,
fontName="Helvetica-Bold", leading=12))
for h in headers]]
for i, row in enumerate(rows):
data.append([Paragraph(cell, S(f"TC{i}", fontSize=9, textColor=colors.black,
fontName="Helvetica", leading=12, leftIndent=2))
for cell in row])
tbl = Table(data, colWidths=col_widths, repeatRows=1)
style = [
("BACKGROUND", (0, 0), (-1, 0), NAVY),
("TEXTCOLOR", (0, 0), (-1, 0), WHITE),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTSIZE", (0, 0), (-1,-1), 9),
("ROWBACKGROUNDS",(0, 1), (-1,-1), [WHITE, alt_color]),
("GRID", (0, 0), (-1,-1), 0.4, MIDGREY),
("TOPPADDING", (0, 0), (-1,-1), 4),
("BOTTOMPADDING", (0, 0), (-1,-1), 4),
("LEFTPADDING", (0, 0), (-1,-1), 6),
("RIGHTPADDING", (0, 0), (-1,-1), 6),
("VALIGN", (0, 0), (-1,-1), "MIDDLE"),
]
tbl.setStyle(TableStyle(style))
return tbl
def callout(text, bg=ACCENT, border=TEAL):
"""Highlighted callout box."""
tbl = Table([[Paragraph(text, noteStyle)]], colWidths=[W])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("LINEAFTER", (0,0), (0,-1), 2, border),
("LINEBEFORE", (0,0), (0,-1), 4, border),
]))
return tbl
def bullet(text):
return Paragraph(f"• {text}", bulletStyle)
def qa(q, a):
return [Paragraph(f"Q: {q}", qStyle), Paragraph(f"A: {a}", aStyle)]
# โโ Build story โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story = []
# โโ COVER / HEADER โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("STUDY GUIDE", S("SG", fontSize=10, textColor=TEAL,
alignment=TA_CENTER, fontName="Helvetica-Bold", spaceAfter=2)))
story.append(HRFlowable(width=W, thickness=2, color=TEAL, spaceAfter=6))
story.append(Paragraph("Why Do Dental Implants Fail? Part I", titleStyle))
story.append(Paragraph(
"el-Askary AS, Meffert RM, Griffin T — <i>Implant Dentistry</i>, 1999;8(2):173โ185",
subtitleStyle))
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph("Dr. Shreya Chindak", authorStyle))
story.append(Paragraph("PMID: 10635160", refStyle))
story.append(HRFlowable(width=W, thickness=2, color=TEAL, spaceAfter=10))
# โโ 1. PURPOSE โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story.append(section_header("1. PURPOSE OF THE ARTICLE"))
story.append(Spacer(1, 4))
for b in [
"Define what constitutes dental implant <b>failure</b>",
"Classify failure by <b>etiology, type, and degree</b>",
"Identify early <b>clinical signs</b> of failure with case examples",
"Propose a practical <b>Implant Failure Checklist</b> applicable to all implant systems",
"Outline appropriate <b>management and treatment</b> for each failure category",
]:
story.append(bullet(b))
story.append(Spacer(1, 6))
# โโ 2. CORE DEFINITIONS โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story.append(section_header("2. CORE DEFINITIONS โ Know These Cold"))
story.append(Spacer(1, 4))
story.append(info_table(
["Term", "Definition", "Salvageable?"],
[
["Ailing Implant", "Bone loss present but implant still osseointegrated; inflammation present", "Yes โ with treatment"],
["Failing Implant", "Progressive bone loss + bleeding on probing + exudate; at imminent risk of loss", "Possibly"],
["Failed Implant", "Complete loss of osseointegration; clinical mobility present", "No โ must be removed"],
["Surviving Implant", "Still in function with no overt pathology; does NOT equal 'successful'", "N/A"],
],
[3.8*cm, 9.2*cm, 3.2*cm]
))
story.append(Spacer(1, 4))
story.append(callout(
"Key distinction: 'Surviving' \u2260 'Successful'. A surviving implant simply hasn't been removed. "
"A successful implant must meet all defined criteria including bone loss thresholds and absence of pathology."
))
# โโ 3. CLASSIFICATION โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story.append(section_header("3. CLASSIFICATION OF FAILURE"))
story.append(Spacer(1, 4))
story.append(Paragraph("By Timing", h2Style))
story.append(info_table(
["Type", "When", "Mechanism"],
[
["Early Failure", "Within first 3โ4 months (before osseointegration completes)", "Failure OF integration โ bone never bonds to implant"],
["Late Failure", "After osseointegration has been established (monthsโyears later)", "Loss OF integration โ established bond breaks down"],
],
[3.2*cm, 6.2*cm, 6.8*cm]
))
story.append(Spacer(1, 6))
story.append(Paragraph("By Etiology", h2Style))
# Two-column layout for infective vs non-infective
col1_items = [
Paragraph("<b>A. Infective (Biologic)</b>", S("ColH", fontSize=10, textColor=TEAL,
fontName="Helvetica-Bold", leading=14, spaceAfter=3)),
bullet("Bacterial contamination at surgery"),
bullet("Pre-existing periodontal disease"),
bullet("Poor oral hygiene \u2192 peri-implantitis"),
bullet("Smoking (impaired vascularity & immunity)"),
bullet("Diabetes mellitus (impaired healing)"),
]
col2_items = [
Paragraph("<b>B. Non-Infective (Mechanical/Iatrogenic)</b>", S("ColH2", fontSize=10,
textColor=TEAL, fontName="Helvetica-Bold", leading=14, spaceAfter=3)),
bullet("Bone overheating during drilling (>47ยฐC / >1 min)"),
bullet("Inadequate bone quantity or quality"),
bullet("Premature loading \u2192 micromovement"),
bullet("Occlusal overload / bruxism"),
bullet("Poor implant design or component mismatch"),
]
from reportlab.platypus import Frame
tbl2col = Table([[col1_items, col2_items]], colWidths=[W/2 - 3, W/2 - 3])
tbl2col.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,-1), colors.HexColor("#EBF5FB")),
("BACKGROUND", (1,0), (1,-1), colors.HexColor("#E8F8F5")),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
("GRID", (0,0), (-1,-1), 0.5, MIDGREY),
]))
story.append(tbl2col)
story.append(Spacer(1, 6))
# โโ 4. RISK FACTORS โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story.append(section_header("4. RISK FACTORS IN DETAIL"))
story.append(Spacer(1, 4))
story.append(Paragraph("Patient-Related Factors", h2Style))
story.append(info_table(
["Risk Factor", "Mechanism of Failure"],
[
["Smoking", "Vasoconstriction, reduced O\u2082 tension, impaired neutrophil chemotaxis"],
["Diabetes mellitus","Microvascular disease, altered collagen metabolism, poor leukocyte function"],
["Bruxism", "Parafunction generates lateral forces exceeding implant biomechanical tolerance"],
["Poor oral hygiene","Plaque accumulation \u2192 peri-implant inflammation \u2192 bone loss"],
["Bone disease", "Osteoporosis/osteonecrosis reduce bone-to-implant contact (BIC)"],
],
[4.2*cm, 12*cm]
))
story.append(Spacer(1, 5))
story.append(Paragraph("Surgical Factors", h2Style))
story.append(info_table(
["Factor", "Consequence"],
[
["Bone overheating (>47ยฐC for >1 min)", "Thermal necrosis \u2192 fibrous encapsulation instead of osseointegration"],
["Contaminated implant surface", "Disrupts titanium oxide layer; promotes early biofilm colonisation"],
["Incorrect positioning", "Biomechanical stress concentration; esthetic and functional compromise"],
["Inadequate primary stability", "Micromovement during healing \u2192 fibrous interface instead of bone-implant bond"],
],
[5.8*cm, 10.4*cm]
))
story.append(Spacer(1, 5))
story.append(Paragraph("Restorative Factors", h2Style))
for b in [
"Premature loading before osseointegration is complete",
"Excessive cantilever length \u2192 off-axis forces",
"Poorly fitting prosthetic components (gaps allow bacterial colonisation)",
"Occlusal discrepancies generating non-axial forces on the implant",
]:
story.append(bullet(b))
story.append(Spacer(1, 6))
# โโ 5. FAILURE CHECKLIST โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story.append(section_header("5. THE IMPLANT FAILURE CHECKLIST"))
story.append(Spacer(1, 4))
story.append(bodyStyle and Paragraph(
"The authors' major practical contribution โ a structured, <b>system-independent</b> diagnostic tool "
"to guide clinicians in identifying the cause and severity of any implant failure:", bodyStyle))
story.append(Spacer(1, 4))
checklist_items = [
("1", "Is the failure <b>infective</b> or <b>non-infective</b>?"),
("2", "At what <b>phase</b> did failure occur? (Surgical vs. Restorative)"),
("3", "Which <b>factors or personnel</b> are responsible?"),
("4", "What is the <b>degree of bone loss</b>?"),
("5", "Is the implant <b>ailing, failing, or failed</b>?"),
("6", "What <b>repair or salvage procedures</b> are indicated?"),
]
cl_data = [[Paragraph(f"<b>{n}</b>", S("CLN", fontSize=11, textColor=WHITE, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=14)),
Paragraph(t, S("CLT", fontSize=9.5, textColor=colors.black, fontName="Helvetica",
leading=13, leftIndent=2))]
for n, t in checklist_items]
cl_tbl = Table(cl_data, colWidths=[1.0*cm, W - 1.4*cm])
cl_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,-1), TEAL),
("BACKGROUND", (1,0), (1,-1), LTGREY),
("ROWBACKGROUNDS",(1,0), (1,-1), [WHITE, LTGREY]),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("GRID", (0,0), (-1,-1), 0.4, MIDGREY),
]))
story.append(cl_tbl)
story.append(Spacer(1, 6))
# โโ 6. CLINICAL SIGNS โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story.append(section_header("6. CLINICAL SIGNS OF FAILURE"))
story.append(Spacer(1, 4))
signs = [
("<b>Mobility</b>", "ALWAYS pathological โ any implant mobility = failure; most reliable single sign"),
("<b>Pain</b>", "Pain on function or percussion suggests loss of integration or infection"),
("<b>Radiolucency</b>", "Peri-implant radiolucency on radiograph indicates bone-implant separation"),
("<b>Bone loss</b>", ">1.5 mm in year 1 or >0.2 mm/year thereafter exceeds Albrektsson criteria"),
("<b>Exudate</b>", "Suppuration or exudate from the peri-implant sulcus indicates infection"),
("<b>Probing depth</b>", "Depth >5โ6 mm with bleeding on probing is a warning sign"),
]
story.append(info_table(
["Sign", "Clinical Significance"],
signs,
[3.8*cm, 12.4*cm]
))
story.append(Spacer(1, 6))
# โโ 7. DISEASE PROGRESSION โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story.append(section_header("7. PERI-IMPLANT DISEASE PROGRESSION"))
story.append(Spacer(1, 5))
prog_data = [
["Plaque Accumulation", "\u2192", "Peri-implant Mucositis", "\u2192", "Peri-implantitis", "\u2192", "Ailing \u2192 Failing \u2192 Failed"],
["Biofilm forms on implant surface", "", "Soft tissue only; REVERSIBLE", "", "Bone loss begins; NOT reversible", "", "Progressive loss of osseointegration"],
]
p_styles = [
S("PB", fontSize=9, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER, leading=12),
S("PA", fontSize=13, textColor=TEAL, fontName="Helvetica-Bold", alignment=TA_CENTER, leading=14),
S("PB2", fontSize=9, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER, leading=12),
S("PA2", fontSize=13, textColor=TEAL, fontName="Helvetica-Bold", alignment=TA_CENTER, leading=14),
S("PB3", fontSize=9, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER, leading=12),
S("PA3", fontSize=13, textColor=TEAL, fontName="Helvetica-Bold", alignment=TA_CENTER, leading=14),
S("PB4", fontSize=8.5, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER, leading=11),
]
sub_styles = [
S("PS", fontSize=7.5, textColor=colors.HexColor("#888"), fontName="Helvetica-Oblique", alignment=TA_CENTER, leading=10),
S("PS2", fontSize=7.5, textColor=colors.HexColor("#888"), fontName="Helvetica-Oblique", alignment=TA_CENTER, leading=10),
S("PS3", fontSize=7.5, textColor=colors.HexColor("#888"), fontName="Helvetica-Oblique", alignment=TA_CENTER, leading=10),
S("PS4", fontSize=7.5, textColor=colors.HexColor("#888"), fontName="Helvetica-Oblique", alignment=TA_CENTER, leading=10),
S("PS5", fontSize=7.5, textColor=colors.HexColor("#888"), fontName="Helvetica-Oblique", alignment=TA_CENTER, leading=10),
S("PS6", fontSize=7.5, textColor=colors.HexColor("#888"), fontName="Helvetica-Oblique", alignment=TA_CENTER, leading=10),
S("PS7", fontSize=7.5, textColor=colors.HexColor("#888"), fontName="Helvetica-Oblique", alignment=TA_CENTER, leading=10),
]
col_w = [3.5*cm, 0.5*cm, 3.5*cm, 0.5*cm, 3.5*cm, 0.5*cm, 4.7*cm]
row0 = [Paragraph(prog_data[0][i], p_styles[i]) for i in range(7)]
row1 = [Paragraph(prog_data[1][i], sub_styles[i]) for i in range(7)]
prog_tbl = Table([row0, row1], colWidths=col_w)
prog_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,1), colors.HexColor("#2ECC71")),
("BACKGROUND", (2,0), (2,1), colors.HexColor("#F39C12")),
("BACKGROUND", (4,0), (4,1), colors.HexColor("#E74C3C")),
("BACKGROUND", (6,0), (6,1), colors.HexColor("#8E44AD")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(prog_tbl)
story.append(Spacer(1, 6))
# โโ 8. SUCCESS CRITERIA โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story.append(section_header("8. SUCCESS CRITERIA (Albrektsson et al.)"))
story.append(Spacer(1, 4))
story.append(bodyStyle and Paragraph(
"An implant is classified as <b>successful</b> only if ALL criteria are met:", bodyStyle))
story.append(Spacer(1, 3))
for b in [
"No clinical mobility when tested independently",
"No peri-implant radiolucency on undistorted radiograph",
"Bone loss <1.5 mm in the first year; <0.2 mm/year thereafter",
"No persistent pain, infection, neuropathy, paresthesia, or damage to adjacent structures",
"5-year cumulative success rate \u2265 85%; 10-year rate \u2265 80%",
]:
story.append(bullet(b))
story.append(Spacer(1, 6))
# โโ 9. MANAGEMENT โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story.append(section_header("9. MANAGEMENT BY IMPLANT STATUS"))
story.append(Spacer(1, 4))
story.append(info_table(
["Status", "Key Interventions"],
[
["AILING", "Debridement of peri-implant pocket; chlorhexidine irrigation; systemic antibiotics if indicated; "
"surface decontamination (citric acid / air-powder abrasive); oral hygiene reinforcement"],
["FAILING", "Surgical debridement; guided bone regeneration (GBR) if defect morphology is favourable; "
"address and eliminate systemic/local risk factors; close monitoring โ aim to convert to 'ailing'"],
["FAILED", "Remove implant; allow 3โ6 months healing; resolve causative factors; bone graft if significant "
"defect remains; reassess and consider re-implantation when site is stable"],
],
[2.4*cm, 13.8*cm],
alt_color=colors.HexColor("#FDFEFE")
))
story.append(Spacer(1, 6))
# โโ 10. HIGH-YIELD Q&A โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story.append(section_header("10. HIGH-YIELD EXAM Q&A"))
story.append(Spacer(1, 4))
qas = [
("What temperature causes thermal bone necrosis during implant drilling?",
"Above 47ยฐC sustained for more than 1 minute causes irreversible thermal necrosis of bone."),
("What is the difference between peri-implant mucositis and peri-implantitis?",
"Mucositis = reversible inflammation confined to soft tissue only. "
"Peri-implantitis = involves progressive bone destruction; not fully reversible."),
("Name the four categories of implant status used by el-Askary et al.",
"Ailing, Failing, Failed, Surviving."),
("What is the most reliable clinical sign of implant failure?",
"Mobility โ any implant mobility (however slight) indicates failure or absence of osseointegration."),
("When is an implant classified as an 'early failure'?",
"When integration is lost before osseointegration is established โ typically within the first 3โ4 months post-placement."),
("What is the key difference between 'surviving' and 'successful'?",
"A surviving implant is simply still in function. A successful implant must meet all defined criteria "
"(bone loss limits, no pathology, cumulative success rate thresholds)."),
("Name the top systemic risk factors for implant failure.",
"Diabetes mellitus, smoking, bruxism, and metabolic bone disease."),
("What is the significance of the Implant Failure Checklist?",
"It is system-independent (works for any brand/design) and guides the clinician in determining "
"whether failure is infective vs. non-infective and at what phase it occurred."),
]
for q, a in qas:
items = qa(q, a)
story.extend(items)
story.append(Spacer(1, 6))
# โโ 11. PART I vs PART II โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story.append(section_header("11. PART I vs. PART II โ How They Fit Together"))
story.append(Spacer(1, 4))
story.append(info_table(
["Part I (this article)", "Part II (same authors, 1999)"],
[
["Defines failure terminology (ailing/failing/failed/surviving)",
"Expands classification: failure mode, type, origin, timing"],
["Infective vs. non-infective etiology",
"Classification by responsible personnel and tissue type"],
["Proposes the Implant Failure Checklist",
"More detailed clinical management algorithms"],
["Highlights early clinical signs with case examples",
"Covers salvage and re-treatment strategies in depth"],
],
[W/2 - 2, W/2 - 2]
))
story.append(Spacer(1, 6))
# โโ 12. ONE-PAGE SUMMARY โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story.append(section_header("12. ONE-SENTENCE SUMMARY"))
story.append(Spacer(1, 4))
story.append(callout(
"Implant failure is multifactorial and classifiable โ understanding WHEN (early vs. late), "
"WHY (infective vs. non-infective), and HOW SEVERELY (ailing vs. failing vs. failed) an implant "
"fails allows the clinician to make rational, evidence-based treatment decisions, guided by the "
"authors' system-independent Implant Failure Checklist.",
bg=colors.HexColor("#EAF2FF"), border=NAVY
))
story.append(Spacer(1, 8))
# โโ Footer reference โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
story.append(HRFlowable(width=W, thickness=1, color=MIDGREY, spaceAfter=5))
story.append(Paragraph(
"el Askary AS, Meffert RM, Griffin T. Why do dental implants fail? Part I. "
"<i>Implant Dent.</i> 1999;8(2):173โ185. | PMID: 10635160",
smallStyle))
# โโ Build โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /tmp/workspace/study-guide && python3 generate_study_guide.py 2>&1
ls -lh /tmp/workspace/study-guide/Dental_Implant_Failure_Study_Guide_Dr_Shreya.pdf
Dental Implant Failure Study Guide Dr Shreya
PDF Document ยท PDF