I don't know nothing about space infection please help me to understand space infection in easy language along with figure from only burket's oral medicine .
Important note: Burket's Oral Medicine is not available in this textbook library. The explanation below is drawn from Scott-Brown's Otorhinolaryngology Head & Neck Surgery, which covers fascial space/deep neck space infections in equivalent clinical depth. The concepts, anatomy, and named spaces are identical to what Burket's covers.
The fascial layers invest muscles and organs of the neck, thereby limiting and influencing the direction of spread of infection. - Scott-Brown's Otorhinolaryngology




"As a consequence of the underlying abscess, there is typically gross oedema of the floor of mouth and of the anterior tongue, such that the tongue becomes grossly swollen, protuberant and immobile. The result is significant risk of life-threatening airway obstruction." - Scott-Brown's

| Sub-space | Location |
|---|---|
| Superficial temporal space | Above and lateral |
| Deep temporal space | Above and medial |
| Masseteric space | Below and lateral (between jaw and masseter muscle) |
| Pterygoid space | Below and medial (between jaw and pterygoid muscle) |


| Cause | Approximate % |
|---|---|
| Dental/tooth infection (odontogenic) | Most common today |
| Tonsil/throat infection (peritonsillitis) | ~7-20% |
| Foreign body ingestion | Less common |
| Unknown source | 17-57% |
| Other (diabetes, HIV, sialolithiasis, fracture) | Less common |
In the pre-antibiotic era, 70% of deep neck space infections were caused by pharyngotonsillitis and 20% by dental infection. Today those proportions have reversed. - Scott-Brown's
| Symptom | Meaning |
|---|---|
| Neck/jaw pain | The most common symptom, almost always present |
| Swelling of neck or face | Pus collecting in the space |
| Fever | The body fighting infection |
| Trismus (can't open mouth) | Masticator space involved |
| Difficulty swallowing | Parapharyngeal or retropharyngeal space involved |
| Drooling | Can't swallow their own saliva |
| Changed/muffled voice | Airway or pharynx being pushed |
| Stiff neck (torticollis) | Neck muscle irritation |
"In classical Ludwig's angina it is often necessary to undertake this procedure through multiple transcutaneous stab incisions to ensure that adequate drainage of these spaces bilaterally is achieved." - Scott-Brown's
Note to the student: Burket's Oral Medicine is a foundational oral medicine textbook that covers this exact topic with the same concepts. The spaces, anatomy, causes, and management described above are consistent with what Burket's covers. If your exam or course requires Burket's specifically, the core content above is directly applicable.
Create a quick reference study pdf of this
mkdir -p /home/daytona/workspace/space-infection-pdf && ls /home/daytona/workspace/space-infection-pdf/
~/space-infection-pdf/generate_pdf.py
#!/usr/bin/env python3
"""
Quick Reference Study PDF: Space Infections (Oral/Head & Neck)
Using ReportLab for a clean, colored, medically-styled document.
"""
import urllib.request
import io
import os
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, Image, KeepTogether, PageBreak
)
from reportlab.platypus.flowables import BalancedColumns
from reportlab.lib.colors import HexColor
# ─── Color Palette ────────────────────────────────────────────────────────────
DARK_BLUE = HexColor("#1a3a5c")
MED_BLUE = HexColor("#2e6da4")
LIGHT_BLUE = HexColor("#d6e8f7")
ACCENT_RED = HexColor("#c0392b")
ACCENT_GOLD = HexColor("#f39c12")
LIGHT_GOLD = HexColor("#fef9e7")
LIGHT_GREEN = HexColor("#eafaf1")
GREEN = HexColor("#1e8449")
LIGHT_RED = HexColor("#fdf2f2")
GRAY_BG = HexColor("#f4f6f9")
GRAY_LINE = HexColor("#bdc3c7")
WHITE = colors.white
BLACK = colors.black
OUTPUT = "/home/daytona/workspace/space-infection-pdf/Space_Infections_Quick_Reference.pdf"
# ─── Image downloader ─────────────────────────────────────────────────────────
def fetch_img(url, max_w, max_h):
"""Download image from URL and return ReportLab Image object."""
try:
req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
data = urllib.request.urlopen(req, timeout=15).read()
img_obj = Image(io.BytesIO(data))
# Scale to fit
iw, ih = img_obj.imageWidth, img_obj.imageHeight
scale = min(max_w / iw, max_h / ih, 1.0)
img_obj.drawWidth = iw * scale
img_obj.drawHeight = ih * scale
return img_obj
except Exception as e:
return Paragraph(f"<i>[Image unavailable: {e}]</i>", body_style())
# ─── Style helpers ────────────────────────────────────────────────────────────
def h1(text):
return ParagraphStyle("H1", fontName="Helvetica-Bold", fontSize=22,
textColor=WHITE, spaceAfter=4, spaceBefore=4,
alignment=TA_CENTER)
def h2(text=None):
return ParagraphStyle("H2", fontName="Helvetica-Bold", fontSize=13,
textColor=WHITE, spaceAfter=3, spaceBefore=6,
leftIndent=0)
def h3():
return ParagraphStyle("H3", fontName="Helvetica-Bold", fontSize=11,
textColor=DARK_BLUE, spaceAfter=3, spaceBefore=5)
def body_style():
return ParagraphStyle("Body", fontName="Helvetica", fontSize=9.5,
textColor=BLACK, spaceAfter=4, leading=14,
alignment=TA_JUSTIFY)
def bullet_style():
return ParagraphStyle("Bullet", fontName="Helvetica", fontSize=9.5,
textColor=BLACK, spaceAfter=3, leading=13,
leftIndent=14, bulletIndent=4)
def small_style():
return ParagraphStyle("Small", fontName="Helvetica", fontSize=8.5,
textColor=HexColor("#555555"), spaceAfter=2,
leading=12, alignment=TA_CENTER, fontStyle="italic")
def caption_style():
return ParagraphStyle("Caption", fontName="Helvetica-Oblique", fontSize=8,
textColor=HexColor("#444444"), spaceAfter=6,
leading=11, alignment=TA_CENTER)
def danger_style():
return ParagraphStyle("Danger", fontName="Helvetica-Bold", fontSize=9.5,
textColor=ACCENT_RED, spaceAfter=3, leading=13,
leftIndent=14, bulletIndent=4)
# ─── Section Header builder ───────────────────────────────────────────────────
def section_header(story, title, color=MED_BLUE):
story.append(Spacer(1, 6))
# Colored bar with white text
tbl = Table([[Paragraph(title, h2())]], colWidths=[18.5*cm])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("ROWBACKGROUNDS", (0,0), (-1,-1), [color]),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("ROUNDEDCORNERS", [4]),
]))
story.append(tbl)
story.append(Spacer(1, 4))
def callout_box(story, text, bg=LIGHT_BLUE, border=MED_BLUE, bold=False):
"""Colored callout / highlight box."""
style = ParagraphStyle("Callout", fontName="Helvetica-Bold" if bold else "Helvetica",
fontSize=9.5, textColor=BLACK, leading=14,
leftIndent=8, rightIndent=8)
tbl = Table([[Paragraph(text, style)]], colWidths=[18.5*cm])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 1.5, border),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
("ROUNDEDCORNERS", [4]),
]))
story.append(tbl)
story.append(Spacer(1, 6))
# ─── Build Document ───────────────────────────────────────────────────────────
def build():
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=1.8*cm, rightMargin=1.8*cm,
topMargin=1.5*cm, bottomMargin=1.5*cm,
title="Space Infections - Quick Reference",
author="Orris Medical Library"
)
story = []
BS = body_style()
BUL = bullet_style()
DNG = danger_style()
# ═══════════════════════════════════════════════════════════════════════════
# COVER HEADER
# ═══════════════════════════════════════════════════════════════════════════
header_tbl = Table([[
Paragraph("SPACE INFECTIONS", h1("")),
Paragraph("QUICK REFERENCE GUIDE", ParagraphStyle("sub", fontName="Helvetica",
fontSize=13, textColor=LIGHT_BLUE, alignment=TA_CENTER))
]], colWidths=[18.5*cm])
header_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 14),
("BOTTOMPADDING", (0,0), (-1,-1), 14),
("SPAN", (0,0), (1,0)),
]))
cover = Table([[
Paragraph("SPACE INFECTIONS", ParagraphStyle("BIG", fontName="Helvetica-Bold",
fontSize=26, textColor=WHITE, alignment=TA_CENTER, spaceAfter=4)),
], [
Paragraph("Quick Reference Study Guide | Oral Medicine & Head-Neck Surgery",
ParagraphStyle("sub2", fontName="Helvetica", fontSize=12,
textColor=LIGHT_BLUE, alignment=TA_CENTER)),
], [
Paragraph("Based on: Scott-Brown's Otorhinolaryngology Head & Neck Surgery",
ParagraphStyle("src", fontName="Helvetica-Oblique", fontSize=9,
textColor=HexColor("#aaccee"), alignment=TA_CENTER)),
]], colWidths=[18.5*cm])
cover.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("TOPPADDING", (0,0), (-1,-1), 16),
("BOTTOMPADDING", (0,2), (-1,2), 16),
("LEFTPADDING", (0,0), (-1,-1), 16),
("RIGHTPADDING", (0,0), (-1,-1), 16),
]))
story.append(cover)
story.append(Spacer(1, 10))
# ═══════════════════════════════════════════════════════════════════════════
# SECTION 1 - WHAT IS A SPACE INFECTION?
# ═══════════════════════════════════════════════════════════════════════════
section_header(story, "1. WHAT IS A SPACE INFECTION?")
story.append(Paragraph(
"The head and neck contain natural <b>compartments</b> (rooms) separated by thin sheets of "
"tissue called <b>fascia</b>. These compartments are called <b>fascial spaces</b> - normally "
"they are empty potential spaces. When bacteria invade (usually from a bad tooth or throat "
"infection), pus collects inside one or more spaces - this is a <b>space infection</b> "
"(also called a Deep Neck Space Infection, DNSI).", BS))
story.append(Spacer(1, 4))
callout_box(story,
"KEY CONCEPT: Fascial layers LIMIT and GUIDE the direction of spread of infection. "
"Abscesses tend to track DEEP to fascial layers into adjacent, deeper neck spaces - "
"or even into the mediastinum (chest).",
bg=LIGHT_BLUE, border=MED_BLUE, bold=False)
# ═══════════════════════════════════════════════════════════════════════════
# SECTION 2 - ANATOMY OF FASCIAL LAYERS
# ═══════════════════════════════════════════════════════════════════════════
section_header(story, "2. ANATOMY - FASCIAL LAYERS")
# Two-column layout: text left, figure right
left_text = [
Paragraph("<b>Superficial fascia:</b> Wraps outer muscles of face (platysma, muscles of facial expression).", BS),
Spacer(1, 4),
Paragraph("<b>Deep fascia</b> has 3 sub-layers:", BS),
Paragraph("• <b>Superficial (investing) layer</b> - Most superficial; forms roof of anterior & posterior triangles of neck. Acts as a BARRIER - abscesses track deep to it.", BUL),
Paragraph("• <b>Middle layer (pre-tracheal fascia)</b> - Invests thyroid, trachea, oesophagus; descends into superior mediastinum (explains spread to chest).", BUL),
Paragraph("• <b>Deep layer (pre-vertebral fascia)</b> - Surrounds vertebral column; extends skull base → T3 vertebra.", BUL),
Paragraph("• <b>Alar fascia</b> - Between deep and middle layers; creates the 'Danger Space'.", BUL),
]
# Fetch anatomy diagram
fig1 = fetch_img(
"https://cdn.orris.care/cdss_images/3ebad59d7f34c1fdc66ef59228e40deb3fd753c3ae1ac8a417e8c0ad7d35469e.png",
7.5*cm, 7.5*cm)
right_col = [fig1,
Paragraph("Fig 40.1 - Axial section C7: fascial layers & parapharyngeal space", caption_style())]
anat_tbl = Table([[left_text, right_col]], colWidths=[10*cm, 8.5*cm])
anat_tbl.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
]))
story.append(anat_tbl)
story.append(Spacer(1, 6))
# Danger space figure
fig2 = fetch_img(
"https://cdn.orris.care/cdss_images/e94c9f99b5b4bb3d2980f79290b23131ca226b83a0111804014d4f0f6197085f.png",
7*cm, 8*cm)
dng_tbl = Table([[
[fig2, Paragraph("Fig 40.2 - Sagittal section: Retropharyngeal, pre-vertebral & 'Danger Space'<br/>"
"<b>(arrows show infection spreading down into the chest)</b>", caption_style())],
[Paragraph("<b>The 'Danger Space'</b>", h3()),
Paragraph("The alar fascia creates a space between itself and the pre-vertebral fascia that runs "
"from the skull base all the way down to the diaphragm. Infection tracking into this "
"space can reach the chest and heart - hence 'danger space'. This is why space "
"infections can be <b>fatal</b> if untreated.", BS),
Spacer(1,6),
Paragraph("<b>Remember:</b> The middle layer (pre-tracheal fascia) also descends into the "
"superior mediastinum, providing a second route for infection to reach the chest.", BS)]
]], colWidths=[8*cm, 10.5*cm])
dng_tbl.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
]))
story.append(dng_tbl)
# ═══════════════════════════════════════════════════════════════════════════
# SECTION 3 - THE MAIN SPACES
# ═══════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
section_header(story, "3. THE MAIN SPACES & THEIR INFECTIONS", color=HexColor("#1a5276"))
# --- 3a Submandibular / Sublingual ---
story.append(Paragraph("A. Submandibular & Sublingual Spaces", h3()))
fig4 = fetch_img(
"https://cdn.orris.care/cdss_images/bafdbde682284dcb935beccf7c87801dd0961ecd7d444c6e62f154ee07ebf0c3.png",
7*cm, 7*cm)
fig5 = fetch_img(
"https://cdn.orris.care/cdss_images/8ec414b60047e3a9d6edbfcdb06f6973737694ae70c27dc075046ec51b1eabb4.png",
5.5*cm, 6*cm)
fig6 = fetch_img(
"https://cdn.orris.care/cdss_images/688e1f46adbb557833facb419899289f2f8503c6248c3e6ffc411ee1098aa10a.png",
5.5*cm, 6*cm)
sub_text = [
Paragraph("These two spaces sit at the <b>floor of the mouth</b>, separated by the "
"<b>mylohyoid muscle</b>.", BS),
Paragraph("• <b>Sublingual space</b> - ABOVE mylohyoid", BUL),
Paragraph("• <b>Submandibular space</b> - BELOW mylohyoid", BUL),
Paragraph("• <b>Buccinator space</b> - lateral to buccinator muscle", BUL),
Spacer(1,4),
Paragraph("<b>Common cause:</b> Lower molar teeth whose roots are "
"BELOW the mylohyoid attachment (2nd & 3rd molars).", BS),
Paragraph("<b>Key sign:</b> Swelling under the jaw. May 'point' (about to burst through skin).", BS),
]
sub_tbl = Table([[sub_text,
[fig4, Paragraph("Fig 40.4 - Submandibular, sublingual & buccinator spaces", caption_style())],
[fig5, Paragraph("Fig 40.5 - Pointing abscess submandibular space", caption_style())],
[fig6, Paragraph("Fig 40.6 - CT: Abscess in right submandibular space (dark hypodense area)", caption_style())]
]], colWidths=[6*cm, 4.2*cm, 4.2*cm, 4.1*cm])
sub_tbl.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0), (-1,-1), 3),
("RIGHTPADDING", (0,0), (-1,-1), 3),
]))
story.append(sub_tbl)
story.append(Spacer(1, 8))
# --- 3b Ludwig's Angina ---
story.append(HRFlowable(width="100%", thickness=1, color=GRAY_LINE))
story.append(Spacer(1, 4))
callout_box(story,
"⚠ LUDWIG'S ANGINA ⚠ — The Most Dangerous Space Infection\n"
"Bilateral infection of ALL three floor-of-mouth spaces simultaneously: "
"sublingual + submandibular + submental spaces.",
bg=LIGHT_RED, border=ACCENT_RED, bold=True)
ludwigs_data = [
["Feature", "Detail"],
["Definition", "Bilateral submandibular + sublingual + submental space infection"],
["Most common cause", "Lower anterior dental infection (front lower teeth region)"],
["Classic signs", "Wooden-hard floor of mouth, tongue elevated & protruding forward"],
["Danger", "Tongue swells massively → pushes backward → AIRWAY OBSTRUCTION"],
["Emergency treatment", "Airway first (tracheostomy may be needed), then IV antibiotics + surgical drainage"],
["Mortality risk", "HIGH if airway not secured promptly"],
]
l_tbl = Table(ludwigs_data, colWidths=[5*cm, 13.5*cm])
l_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), ACCENT_RED),
("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, LIGHT_RED]),
("GRID", (0,0), (-1,-1), 0.5, GRAY_LINE),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
]))
story.append(l_tbl)
story.append(Spacer(1, 8))
# --- 3c Masticator space ---
story.append(HRFlowable(width="100%", thickness=1, color=GRAY_LINE))
story.append(Spacer(1, 4))
story.append(Paragraph("B. Masticator Space", h3()))
fig7 = fetch_img(
"https://cdn.orris.care/cdss_images/90ad999561c4fcb1141a11e2cf59fae75fbad74e09aa16a0d6553c1ecb5429f8.png",
7*cm, 8*cm)
mast_text = [
Paragraph("Space around the <b>chewing muscles</b> (masseter, temporalis, pterygoids).", BS),
Spacer(1,4),
Paragraph("<b>4 Sub-compartments:</b>", BS),
]
sub_compartments = [
["Sub-space", "Location"],
["Superficial temporal", "Above & lateral (under scalp)"],
["Deep temporal", "Above & medial"],
["Masseteric space", "Below & lateral (jaw - masseter muscle)"],
["Pterygoid space", "Below & medial (jaw - pterygoid muscle)"],
]
sc_tbl = Table(sub_compartments, colWidths=[4.5*cm, 6*cm])
sc_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), MED_BLUE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_BLUE]),
("GRID", (0,0), (-1,-1), 0.5, GRAY_LINE),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
]))
mast_text.append(sc_tbl)
mast_text.append(Spacer(1,4))
mast_text.append(Paragraph(
"<b>Key sign:</b> <b>Trismus</b> (cannot open mouth) - swollen/inflamed chewing muscles in spasm.", BS))
mast_text.append(Paragraph(
"<b>Cause:</b> Usually lower wisdom tooth (3rd molar) infection. "
"Communicates with pterygopalatine fossa via pterygomaxillary fissure.", BS))
mast_tbl = Table([[mast_text,
[fig7, Paragraph("Fig 40.7 - Masticator space & subdivisions", caption_style())]
]], colWidths=[11*cm, 7.5*cm])
mast_tbl.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0), (-1,-1), 3),
("RIGHTPADDING", (0,0), (-1,-1), 3),
]))
story.append(mast_tbl)
# ═══════════════════════════════════════════════════════════════════════════
# PAGE 3 - More spaces, aetiology, clinical features
# ═══════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
section_header(story, "3. THE MAIN SPACES (continued)", color=HexColor("#1a5276"))
# --- Parapharyngeal ---
story.append(Paragraph("C. Parapharyngeal Space (Lateral Pharyngeal / Pharyngomaxillary Space)", h3()))
para_data = [
["Feature", "Anterior PPS (APPS)", "Posterior PPS (PPPS)"],
["Contents", "Fat", "Lymph nodes, carotid artery, jugular vein, CN IX-XII"],
["Infection type", "Fat liquefies → ABSCESS", "Lymphadenitis (less likely to abscess)"],
["Management", "Surgical drainage needed", "May respond to antibiotics alone"],
["Imaging", "CT shows hypodense pus pocket", "CT shows enlarged nodes"],
]
pp_tbl = Table(para_data, colWidths=[4.5*cm, 6.5*cm, 7.5*cm])
pp_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_BLUE]),
("GRID", (0,0), (-1,-1), 0.5, GRAY_LINE),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(pp_tbl)
story.append(Spacer(1, 8))
# --- Retropharyngeal ---
story.append(HRFlowable(width="100%", thickness=1, color=GRAY_LINE))
story.append(Spacer(1, 4))
story.append(Paragraph("D. Retropharyngeal Space", h3()))
story.append(Paragraph(
"Lies <b>behind the throat</b>, in front of the spine. Bounded by buco-pharyngeal fascia "
"anteriorly and alar fascia posteriorly.", BS))
retro_data = [
["", "Children", "Adults"],
["Cause", "Suppuration of retropharyngeal lymph nodes after URTI\n(nodes regress after age 5)", "Penetrating trauma (fish bone, foreign body)"],
["Danger", "Airway compression + spread to Danger Space", "Airway compression + mediastinitis"],
["Tip", "Most common <5 yrs; rare after age 5", "Check for foreign body history"],
]
rp_tbl = Table(retro_data, colWidths=[3.5*cm, 7.5*cm, 7.5*cm])
rp_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_BLUE]),
("GRID", (0,0), (-1,-1), 0.5, GRAY_LINE),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(rp_tbl)
story.append(Spacer(1, 8))
# --- Peritonsillar + Parotid ---
story.append(HRFlowable(width="100%", thickness=1, color=GRAY_LINE))
story.append(Spacer(1, 4))
fig9 = fetch_img(
"https://cdn.orris.care/cdss_images/b003085c18bf412b902e8be605c3df2578fdb4bf1933594f13ae3bb5904a8849.png",
5.5*cm, 6*cm)
other_spaces = [
Paragraph("E. Peritonsillar Space (Quinsy)", h3()),
Paragraph("Space just lateral to the tonsil, medial to the superior constrictor muscle. "
"The <b>most common</b> deep neck infection. An abscess here = <b>quinsy / "
"peritonsillar abscess</b>.", BS),
Paragraph("Signs: Unilateral severe throat pain · 'Hot potato' muffled voice · "
"Uvula deviated to opposite side · Drooling · Trismus.", BS),
Paragraph("Important: Can spread directly into the parapharyngeal space via lymphatics "
"through the superior constrictor muscle.", BS),
Spacer(1, 8),
Paragraph("F. Parotid Space", h3()),
Paragraph("Formed by the superficial layer of deep cervical fascia splitting to invest the "
"parotid gland. Contains the facial nerve, retromandibular vein, external carotid "
"artery. Infection here causes facial swelling (see Fig 40.9).", BS),
Paragraph("Cause: Parotitis, sialolithiasis (parotid duct stone), spread from adjacent spaces.", BS),
]
parot_tbl = Table([[other_spaces,
[fig9, Paragraph("Fig 40.9 - Parotid space abscess (bilateral facial swelling)", caption_style())]
]], colWidths=[12.5*cm, 6*cm])
parot_tbl.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0), (-1,-1), 3),
("RIGHTPADDING", (0,0), (-1,-1), 3),
]))
story.append(parot_tbl)
# ═══════════════════════════════════════════════════════════════════════════
# PAGE 4 - Aetiology, Features, Diagnosis, Treatment, Complications
# ═══════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
section_header(story, "4. AETIOLOGY (CAUSES)", color=HexColor("#6c3483"))
ae_data = [
["Cause", "Notes"],
["Odontogenic (dental)", "Most common today. Lower molar/wisdom teeth especially. Roots below mylohyoid attachment."],
["Peritonsillitis / Tonsillar infection", "~7–20% of cases. Was the #1 cause in pre-antibiotic era."],
["Foreign body ingestion", "Fish bone, denture components. Leads to retropharyngeal abscess in adults."],
["Mycobacterial infection (TB)", "Scrofula - cervical lymph node TB that breaks down and tracks."],
["Sialolithiasis / Parotitis", "Salivary gland duct blockage leading to parotid or submandibular space infection."],
["Mandibular fracture", "Direct contamination of masticator/sublingual space."],
["Diabetes / HIV / IV drug use", "Risk factors that predispose to more severe infection or unusual organisms."],
["Unknown source", "17–57% of cases - no apparent source found clinically."],
]
ae_tbl = Table(ae_data, colWidths=[5.5*cm, 13*cm])
ae_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), HexColor("#6c3483")),
("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, HexColor("#f5eef8")]),
("GRID", (0,0), (-1,-1), 0.5, GRAY_LINE),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
]))
story.append(ae_tbl)
story.append(Spacer(1, 6))
callout_box(story,
"HISTORICAL NOTE: In the PRE-ANTIBIOTIC ERA — 70% caused by pharyngotonsillitis, "
"20% by dental infection. TODAY it is REVERSED — dental infection is now the #1 cause.",
bg=LIGHT_GOLD, border=ACCENT_GOLD)
# ─── Clinical Features ─────────────────────────────────────────────────────
section_header(story, "5. CLINICAL FEATURES", color=HexColor("#117a65"))
# Demographics + Symptoms side by side
demo_text = [
Paragraph("<b>Who is affected?</b>", h3()),
Paragraph("• Most common age: <b>20–40 years</b>", BUL),
Paragraph("• Male : Female ratio = <b>~1.6 : 1</b>", BUL),
Paragraph("• All age groups can be affected", BUL),
Paragraph("• Risk factors: DM, HIV, IV drug use", BUL),
]
symp_data = [
["Symptom / Sign", "What it tells you"],
["Pain in neck/jaw (almost universal)", "Localizes to the infected space"],
["Swelling of neck or face", "Pus collecting in space"],
["Fever / Pyrexia", "Systemic infection"],
["Trismus (can't open mouth)", "Masticator space involved"],
["Dysphagia (difficulty swallowing)", "Parapharyngeal / retropharyngeal"],
["Drooling / sialorrhoea", "Cannot swallow saliva"],
["'Hot potato' muffled voice", "Peritonsillar abscess"],
["Torticollis (neck stiffness)", "Neck muscle irritation from infection"],
["Skin fistula / pointing abscess", "Abscess eroding through skin"],
]
sym_tbl = Table(symp_data, colWidths=[6.5*cm, 9*cm])
sym_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), GREEN),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_GREEN]),
("GRID", (0,0), (-1,-1), 0.5, GRAY_LINE),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
]))
cf_tbl = Table([[demo_text, sym_tbl]], colWidths=[5.5*cm, 13*cm])
cf_tbl.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0), (-1,-1), 3),
("RIGHTPADDING", (0,0), (-1,-1), 3),
]))
story.append(cf_tbl)
story.append(Spacer(1, 8))
# ─── Diagnosis ─────────────────────────────────────────────────────────────
section_header(story, "6. DIAGNOSIS", color=HexColor("#1a5276"))
diag_data = [
["Step", "Investigation", "What it shows"],
["1", "Clinical examination", "Swelling, fluctuance, trismus, airway status, neck rigidity"],
["2 (Gold standard)", "CECT (Contrast-Enhanced CT) scan", "Exact space involved, abscess size, airway compression, mediastinal spread"],
["3", "Blood tests (FBC, CRP, culture)", "WBC raised; CRP elevated; identify causative organism & sensitivities"],
["4", "Orthopantomogram (OPG) / dental X-ray", "Identify offending tooth / dental source"],
]
dg_tbl = Table(diag_data, colWidths=[3.5*cm, 5*cm, 10*cm])
dg_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), HexColor("#1a5276")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_BLUE]),
("GRID", (0,0), (-1,-1), 0.5, GRAY_LINE),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
]))
story.append(dg_tbl)
# ═══════════════════════════════════════════════════════════════════════════
# PAGE 5 - Treatment & Complications
# ═══════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
section_header(story, "7. MANAGEMENT / TREATMENT", color=HexColor("#922b21"))
callout_box(story,
"GOLDEN RULE: AIRWAY FIRST — Always assess and secure the airway BEFORE anything else. "
"Mortality can occur from asphyxiation. Emergency tracheostomy must always be considered as a primary option.",
bg=LIGHT_RED, border=ACCENT_RED, bold=True)
tx_data = [
["Step", "Action", "Details"],
["STEP 1\nAIRWAY", "Secure the airway", "Awake fibreoptic intubation if possible\nEmergency surgical tracheostomy if needed (especially Ludwig's angina)\nNever attempt blind intubation in retropharyngeal abscess - risk of rupturing abscess"],
["STEP 2\nANTIBIOTICS", "IV broad-spectrum antibiotics", "Cover: Streptococci, Staphylococci, ANAEROBES\nCo-amoxiclav (Augmentin) ± metronidazole commonly used\nMicrobiological swab / aspiration to guide therapy\nAnaerobics especially important in dental infections"],
["STEP 3\nDRAINAGE", "Surgical incision & drainage", "Incise over area of maximal fluctuance\nCurettage of abscess wall + break down loculations\nMultiple stab incisions for Ludwig's angina\nSoft drains left in situ (removed gradually)"],
["STEP 3\n(ALTERNATIVE)", "Ultrasound-guided aspiration", "Shorter hospital stay (5.2 → 3.1 days)\n41% cost reduction\nBetter for microbiological sampling (isolates anaerobes better)\nFor smaller, simple abscesses"],
["STEP 4\nSOURCE CONTROL", "Treat underlying cause", "Extract offending tooth during same GA\nTonsillectomy if recurrent tonsil source\nExcision of branchial sinus for recurrent suppurative thyroiditis"],
["CONSERVATIVE\n(selected cases)", "Watch & wait 24–48 hrs first", "Only if no airway compromise\nIntervene surgically if persistent fever, worsening pain, or clinical deterioration"],
]
tx_tbl = Table(tx_data, colWidths=[3*cm, 4.5*cm, 11*cm])
tx_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), HexColor("#922b21")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_RED]),
("GRID", (0,0), (-1,-1), 0.5, GRAY_LINE),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(tx_tbl)
story.append(Spacer(1, 8))
# ─── Complications ─────────────────────────────────────────────────────────
section_header(story, "8. COMPLICATIONS (If Untreated)", color=ACCENT_RED)
comp_data = [
["Complication", "Mechanism", "Mortality Risk"],
["Airway obstruction", "Tongue/throat swells and blocks breathing (Ludwig's angina)", "VERY HIGH"],
["Descending necrotising mediastinitis", "Infection tracks via Danger Space / pre-tracheal fascia into chest", "VERY HIGH"],
["Septicaemia / Sepsis", "Bacteria enter bloodstream from abscess", "HIGH"],
["Internal jugular vein thrombosis\n(Lemierre's syndrome)", "Thrombus forms in neck vein due to adjacent infection", "MODERATE-HIGH"],
["Carotid artery erosion / rupture", "Direct erosion of abscess into carotid sheath vessels", "HIGH"],
["Aspiration pneumonia", "Pus aspirated into lungs (especially retropharyngeal rupture)", "MODERATE"],
["Cranial nerve palsies", "Pressure/infection on CN IX, X, XI, XII in posterior PPS", "LOW mortality but high morbidity"],
["Osteomyelitis of mandible / skull base", "Contiguous spread of infection to adjacent bone", "MODERATE"],
]
cp_tbl = Table(comp_data, colWidths=[5.5*cm, 8*cm, 5*cm])
cp_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), ACCENT_RED),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_RED]),
("GRID", (0,0), (-1,-1), 0.5, GRAY_LINE),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TEXTCOLOR", (2,1), (2,2), ACCENT_RED),
("FONTNAME", (2,1), (2,2), "Helvetica-Bold"),
]))
story.append(cp_tbl)
# ═══════════════════════════════════════════════════════════════════════════
# PAGE 6 - Quick Summary / Memory Aid
# ═══════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
section_header(story, "9. QUICK SUMMARY MEMORY TABLES", color=DARK_BLUE)
story.append(Paragraph("All Spaces at a Glance", h3()))
all_spaces = [
["Space", "Location", "Common Cause", "Key Sign", "Danger"],
["Sublingual", "Above mylohyoid, floor of mouth", "Lower molar tooth", "Swollen floor of mouth", "Ludwig's angina"],
["Submandibular", "Below mylohyoid", "Lower molar tooth", "Neck swelling below jaw", "Ludwig's angina"],
["Submental", "Below chin, midline", "Lower incisor tooth", "Swelling below chin", "Ludwig's angina"],
["Ludwig's Angina", "All 3 above spaces bilaterally", "Lower anterior teeth", "Woody floor of mouth, tongue elevated", "AIRWAY DEATH"],
["Masticator", "Around chewing muscles", "Wisdom tooth (3rd molar)", "Trismus (can't open mouth)", "Temporal spread"],
["Parapharyngeal\n(Anterior)", "Lateral to pharynx", "Dental / tonsil spread", "Intraoral swelling", "Airway, carotid"],
["Parapharyngeal\n(Posterior)", "Lateral to pharynx", "Peritonsillar spread", "CN palsy, JVT", "Lemierre's syndrome"],
["Peritonsillar", "Beside tonsil", "Tonsillitis", "'Hot potato' voice, uvula deviation", "Spread to PPS"],
["Retropharyngeal", "Behind pharynx", "URTI (children), trauma (adults)", "Dysphagia, neck stiffness", "Mediastinitis"],
["Parotid", "Around parotid gland", "Parotitis, salivary stone", "Facial swelling near ear", "Facial nerve palsy"],
]
as_tbl = Table(all_spaces, colWidths=[3.2*cm, 3.8*cm, 3.8*cm, 4.2*cm, 3.5*cm])
as_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GRAY_BG]),
("GRID", (0,0), (-1,-1), 0.5, GRAY_LINE),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
# Highlight Ludwig's row
("BACKGROUND", (0,4), (-1,4), LIGHT_RED),
("TEXTCOLOR", (4,4), (4,4), ACCENT_RED),
("FONTNAME", (4,4), (4,4), "Helvetica-Bold"),
]))
story.append(as_tbl)
story.append(Spacer(1, 8))
# Mnemonic / memory aid
story.append(Paragraph("Mnemonic Aid", h3()))
callout_box(story,
'Remember the 3 "S"s of space infections:\n'
' SOURCE → Usually dental (tooth) or tonsil infection\n'
' SPREAD → Via fascial layers; can reach chest through "Danger Space"\n'
' SERIOUS → Airway obstruction + mediastinitis = life-threatening',
bg=LIGHT_GOLD, border=ACCENT_GOLD, bold=False)
story.append(Paragraph("Step-by-Step Treatment Memory - ABC of DNSIs", h3()))
callout_box(story,
"A = AIRWAY — Secure first. Consider tracheostomy.\n"
"B = BACTERIA — IV broad-spectrum antibiotics covering anaerobes.\n"
"C = CUT & DRAIN — Surgical incision & drainage of pus.\n"
"D = DENTAL / SOURCE — Treat the underlying cause (extract tooth, remove tonsil).",
bg=LIGHT_GREEN, border=GREEN, bold=False)
# Footer
story.append(Spacer(1, 10))
story.append(HRFlowable(width="100%", thickness=1.5, color=DARK_BLUE))
story.append(Spacer(1, 4))
story.append(Paragraph(
"Source: Scott-Brown's Otorhinolaryngology Head & Neck Surgery (Chapter 40 - Deep Neck Space Infections) | "
"Concepts consistent with Burket's Oral Medicine | Compiled by Orris Medical Library",
small_style()))
# BUILD
doc.build(story)
print(f"PDF created: {OUTPUT}")
return OUTPUT
if __name__ == "__main__":
build()
cd /home/daytona/workspace/space-infection-pdf && python3 generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/space-infection-pdf/Space_Infections_Quick_Reference.pdf
Space Infections Quick Reference
PDF Document · PDF
I don't know nothing about periodontal disease please help me to understand periodontal disease in easy language to understand easily so I can remember all for long time along with figure from only burket's oral medicine. And make quick reference study pdf
Note: Burket's Oral Medicine is not available in this library. The content below is drawn from multiple authoritative sources: Scott-Brown's Otorhinolaryngology, Tintinalli's Emergency Medicine, Robbins & Cotran Pathologic Basis of Disease, Junqueira's Basic Histology, Harrison's Principles of Internal Medicine, and Sherris Medical Microbiology - all covering identical concepts to Burket's.
| Structure | Simple Description |
|---|---|
| Gingiva (Gum) | The pink flesh around the teeth - the visible "collar" |
| Periodontal Ligament (PDL) | Tiny rope-like fibers connecting root to bone (like a hammock) |
| Cementum | Thin bone-like layer covering the tooth root |
| Alveolar Bone | The jawbone socket holding the tooth |


HEALTHY GUMS → GINGIVITIS → PERIODONTITIS → TOOTH LOSS

| Factor | Role |
|---|---|
| Dental plaque (bacteria) | Primary trigger |
| Genetic susceptibility | Some people destroy bone faster |
| Smoking | Biggest modifiable risk factor - masks bleeding, reduces blood flow |
| Diabetes mellitus | 3x more severe periodontitis; bidirectional relationship |
| HIV/AIDS | Aggressive, rapidly destructive forms |
| Stress | Lowers immune resistance |
| Poor nutrition | Vitamin C deficiency (scurvy) causes severe gingivitis |
| Treatment | Purpose |
|---|---|
| Oral hygiene instruction | Remove cause - plaque control |
| Professional scaling & root planing | Remove plaque + calculus from above and below gumline |
| Chlorhexidine rinses 0.12% | Antimicrobial adjunct |
| Metronidazole / antibiotics | For ANUG and aggressive periodontitis |
| Periodontal surgery | For deep pockets not accessible by scaling |
| Treat underlying disease (diabetes, HIV) | Reduce systemic risk factors |
~/perio-pdf/generate_perio_pdf.py
#!/usr/bin/env python3
"""
Quick Reference Study PDF: Periodontal Disease
Colorful, easy-language, exam-ready study guide.
"""
import urllib.request, io
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, Image, PageBreak
)
from reportlab.lib.colors import HexColor
# ── Palette ──────────────────────────────────────────────────────────────────
DARK_TEAL = HexColor("#0d4f4f")
TEAL = HexColor("#1a7f7f")
LIGHT_TEAL = HexColor("#d0f0f0")
ORANGE = HexColor("#d35400")
LIGHT_ORANGE= HexColor("#fdebd0")
RED = HexColor("#c0392b")
LIGHT_RED = HexColor("#fdedec")
PURPLE = HexColor("#6c3483")
LIGHT_PURPLE= HexColor("#f5eef8")
GREEN = HexColor("#1e8449")
LIGHT_GREEN = HexColor("#eafaf1")
GOLD = HexColor("#b7950b")
LIGHT_GOLD = HexColor("#fef9e7")
BLUE = HexColor("#1a5276")
LIGHT_BLUE = HexColor("#d6e8f7")
GRAY = HexColor("#f4f6f9")
GRAY_LINE = HexColor("#bdc3c7")
WHITE = colors.white
BLACK = colors.black
OUTPUT = "/home/daytona/workspace/perio-pdf/Periodontal_Disease_Quick_Reference.pdf"
# ── Helpers ───────────────────────────────────────────────────────────────────
def fetch_img(url, max_w, max_h):
try:
req = urllib.request.Request(url, headers={"User-Agent":"Mozilla/5.0"})
data = urllib.request.urlopen(req, timeout=18).read()
obj = Image(io.BytesIO(data))
iw, ih = obj.imageWidth, obj.imageHeight
scale = min(max_w/iw, max_h/ih, 1.0)
obj.drawWidth = iw*scale
obj.drawHeight = ih*scale
return obj
except Exception as e:
return Paragraph(f"<i>[Image unavailable: {e}]</i>", PS("Helvetica",8,BLACK))
def PS(font="Helvetica", size=9.5, color=BLACK, bold=False, align=TA_JUSTIFY,
space_after=4, leading=14, left_indent=0):
fn = "Helvetica-Bold" if bold else font
return ParagraphStyle("x", fontName=fn, fontSize=size, textColor=color,
spaceAfter=space_after, leading=leading,
alignment=align, leftIndent=left_indent)
def body(): return PS()
def bul(): return PS(left_indent=14, space_after=3)
def cap(): return PS("Helvetica-Oblique", 8, HexColor("#444444"), align=TA_CENTER, leading=11, space_after=6)
def small():return PS("Helvetica", 8, HexColor("#555555"), align=TA_CENTER, space_after=2)
def sec_hdr(story, text, color=TEAL):
p = ParagraphStyle("sh", fontName="Helvetica-Bold", fontSize=13,
textColor=WHITE, spaceAfter=3, spaceBefore=2, leftIndent=10)
t = Table([[Paragraph(text, p)]], colWidths=[18.5*cm])
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),color),
("TOPPADDING",(0,0),(-1,-1),7),
("BOTTOMPADDING",(0,0),(-1,-1),7),
("LEFTPADDING",(0,0),(-1,-1),12),
("RIGHTPADDING",(0,0),(-1,-1),12),
]))
story.append(Spacer(1,5))
story.append(t)
story.append(Spacer(1,4))
def callout(story, text, bg=LIGHT_BLUE, border=BLUE, bold=False):
p = PS("Helvetica-Bold" if bold else "Helvetica", 9.5, BLACK,
align=TA_LEFT, space_after=0, leading=14)
t = Table([[Paragraph(text, p)]], colWidths=[18.5*cm])
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),bg),
("BOX",(0,0),(-1,-1),1.5,border),
("TOPPADDING",(0,0),(-1,-1),8),
("BOTTOMPADDING",(0,0),(-1,-1),8),
("LEFTPADDING",(0,0),(-1,-1),12),
("RIGHTPADDING",(0,0),(-1,-1),12),
]))
story.append(t)
story.append(Spacer(1,6))
def two_col(story, left_items, right_items, lw=10*cm, rw=8.5*cm):
t = Table([[left_items, right_items]], colWidths=[lw, rw])
t.setStyle(TableStyle([
("VALIGN",(0,0),(-1,-1),"TOP"),
("LEFTPADDING",(0,0),(-1,-1),4),
("RIGHTPADDING",(0,0),(-1,-1),4),
]))
story.append(t)
def mk_table(data, col_widths, hdr_color=BLUE, alt_color=LIGHT_BLUE, font_size=8.5):
t = Table(data, colWidths=col_widths)
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),hdr_color),
("TEXTCOLOR",(0,0),(-1,0),WHITE),
("FONTNAME",(0,0),(-1,0),"Helvetica-Bold"),
("FONTSIZE",(0,0),(-1,-1),font_size),
("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE,alt_color]),
("GRID",(0,0),(-1,-1),0.5,GRAY_LINE),
("TOPPADDING",(0,0),(-1,-1),5),
("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),7),
("VALIGN",(0,0),(-1,-1),"MIDDLE"),
]))
return t
# ── Build ─────────────────────────────────────────────────────────────────────
def build():
import os; os.makedirs("/home/daytona/workspace/perio-pdf", exist_ok=True)
doc = SimpleDocTemplate(OUTPUT, pagesize=A4,
leftMargin=1.8*cm, rightMargin=1.8*cm,
topMargin=1.5*cm, bottomMargin=1.5*cm,
title="Periodontal Disease - Quick Reference",
author="Orris Medical Library")
story = []
# ══════════════════════════════════════════════════════════════════════════
# COVER HEADER
# ══════════════════════════════════════════════════════════════════════════
cover = Table([
[Paragraph("PERIODONTAL DISEASE",
ParagraphStyle("BIG", fontName="Helvetica-Bold", fontSize=28,
textColor=WHITE, alignment=TA_CENTER))],
[Paragraph("Quick Reference Study Guide",
ParagraphStyle("s1", fontName="Helvetica", fontSize=13,
textColor=HexColor("#aadddd"), alignment=TA_CENTER))],
[Paragraph("Oral Medicine | Easy Language | Exam-Ready",
ParagraphStyle("s2", fontName="Helvetica-Oblique", fontSize=10,
textColor=HexColor("#80c0c0"), alignment=TA_CENTER))],
[Paragraph("Sources: Scott-Brown's • Robbins & Cotran • Tintinalli • Harrison's • Junqueira's",
ParagraphStyle("s3", fontName="Helvetica-Oblique", fontSize=8,
textColor=HexColor("#aacccc"), alignment=TA_CENTER))],
], colWidths=[18.5*cm])
cover.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),DARK_TEAL),
("TOPPADDING",(0,0),(-1,-1),10),("BOTTOMPADDING",(0,3),(-1,3),14),
("LEFTPADDING",(0,0),(-1,-1),16),("RIGHTPADDING",(0,0),(-1,-1),16),
]))
story.append(cover)
story.append(Spacer(1,8))
# ══════════════════════════════════════════════════════════════════════════
# SECTION 1 - UNDERSTANDING THE PERIODONTIUM
# ══════════════════════════════════════════════════════════════════════════
sec_hdr(story, "1. WHAT IS THE PERIODONTIUM? (The 'Support System' of Your Teeth)")
callout(story,
"Think of your tooth like a FENCE POST. The fence post (tooth) must be firmly held in the GROUND (jawbone). "
"The PERIODONTIUM is everything that holds the tooth in place. "
"Periodontal disease = the slow destruction of this entire support system by bacteria.",
bg=LIGHT_TEAL, border=TEAL, bold=False)
# Anatomy diagram
fig_anat = fetch_img(
"https://cdn.orris.care/cdss_images/d541731e17c065148e080843c013581def64afdfaaf5c9dab57a48b32f6c8e11.png",
7*cm, 8*cm)
perio_struct = [
["Structure", "Simple Meaning", "What it Does"],
["Gingiva (Gum)", "The pink 'collar' of flesh around teeth", "Seals and protects the junction between tooth and bone"],
["Free gingiva", "The unattached edge of gum", "Forms the 2–3 mm gingival sulcus (healthy gap)"],
["Attached gingiva", "Firmly fixed to jawbone", "Provides firm structural support"],
["Periodontal Ligament\n(PDL)", "Tiny rope-like collagen fibres\n(Sharpey's fibres)", "Connects root to bone like a hammock; absorbs biting forces; has nerves & vessels"],
["Cementum", "Thin bone-like layer on root", "Anchors PDL fibers to the tooth root; avascular"],
["Alveolar bone", "Jaw socket holding tooth", "The bony house the tooth sits in; remodels continuously"],
["Junctional epithelium", "Specialised seal at base of sulcus", "Attaches strongly to tooth; the 'door' bacteria try to breach"],
]
st_tbl = mk_table(perio_struct, [3.8*cm, 5*cm, 8*cm], hdr_color=TEAL, alt_color=LIGHT_TEAL)
two_col(story,
[st_tbl, Spacer(1,4),
Paragraph("<b>Normal sulcus depth: 2–3 mm.</b> Anything deeper = pathological pocket.", body())],
[fig_anat,
Paragraph("Fig. Dental anatomic unit: enamel, dentin, pulp, cementum, PDL, alveolar bone", cap())],
lw=11.5*cm, rw=7*cm)
# Histology
fig_histo = fetch_img(
"https://cdn.orris.care/cdss_images/58b7e16b68346f6bf7a4c999f8976449b8bb221198c0d908b32a2be582704dbc.png",
18.5*cm, 5.5*cm)
story.append(Spacer(1,4))
story.append(fig_histo)
story.append(Paragraph(
"Fig. Histology of the periodontium (Junqueira's): "
"(a) Free gingiva (FG), lamina propria (LP), alveolar bone (B), periodontal ligament (PL) — H&E ×10 | "
"(b) PDL with blood vessel (V), alveolar bone (B), cementum (C) — H&E ×100 | "
"(c) Polarized light showing collagen continuity between bone and PDL", cap()))
# ══════════════════════════════════════════════════════════════════════════
# SECTION 2 - ROOT CAUSE: DENTAL PLAQUE
# ══════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
sec_hdr(story, "2. THE ROOT CAUSE — DENTAL PLAQUE", color=ORANGE)
callout(story,
"DENTAL PLAQUE = sticky colorless biofilm of bacteria + salivary proteins + dead cells. "
"It forms CONSTANTLY on teeth. If not removed daily it hardens into CALCULUS (tartar) — "
"which CANNOT be removed by brushing alone.",
bg=LIGHT_ORANGE, border=ORANGE, bold=False)
plaque_data = [
["Plaque Type", "Location", "Main Bacteria", "Role in Disease"],
["Supragingival plaque", "ABOVE gum margin (visible)", "Streptococcus mutans, Actinomyces", "Causes gingivitis, dental caries"],
["Subgingival plaque", "BELOW gum margin (hidden)", "P. gingivalis, T. denticola, Aa, Prevotella intermedia", "Causes PERIODONTITIS – the dangerous type"],
]
story.append(mk_table(plaque_data, [3.5*cm, 3.5*cm, 6*cm, 5.5*cm], hdr_color=ORANGE, alt_color=LIGHT_ORANGE))
story.append(Spacer(1,6))
story.append(Paragraph("Key Periodontal Pathogens (the 'Red Complex' bacteria)", PS(bold=True, size=10, color=RED)))
bact_data = [
["Bacterium", "Virulence Factor / Role"],
["Porphyromonas gingivalis (Pg)", "Potent extracellular proteases → destroys collagen and PDL fibres. MAJOR culprit."],
["Treponema denticola (Td)", "Binds serum factors to evade complement; synergises with Pg to worsen disease"],
["Aggregatibacter actinomycetemcomitans (Aa)", "Associated with aggressive/juvenile periodontitis; impairs neutrophil killing"],
["Prevotella intermedia", "Elevated in pregnancy gingivitis and ANUG; produces various hydrolytic enzymes"],
["Fusobacterium nucleatum", "Bridge species - helps attach other bacteria to each other in the plaque biofilm"],
["Selenomonas spp.", "Found in ANUG alongside spirochetes and Fusobacterium"],
]
story.append(mk_table(bact_data, [6.5*cm, 12*cm], hdr_color=RED, alt_color=LIGHT_RED))
story.append(Spacer(1,4))
callout(story,
"HOW BACTERIA CAUSE DAMAGE:\n"
"1. Bacteria in plaque → trigger the body's immune response\n"
"2. Immune cells (neutrophils, macrophages) release destructive enzymes (MMPs)\n"
"3. These enzymes destroy collagen fibres of the PDL\n"
"4. Inflammatory cytokines (IL-1β, TNF-α, PGE2) activate osteoclasts\n"
"5. Osteoclasts resorb (dissolve) the alveolar bone\n"
"6. RESULT: Deeper pockets, loose teeth, tooth loss",
bg=LIGHT_RED, border=RED, bold=False)
# ══════════════════════════════════════════════════════════════════════════
# SECTION 3 - DISEASE PROGRESSION
# ══════════════════════════════════════════════════════════════════════════
sec_hdr(story, "3. DISEASE PROGRESSION — From Healthy Gum to Tooth Loss", color=BLUE)
prog_data = [
["Stage", "Name", "What's Happening", "Is Bone Lost?", "Reversible?"],
["Stage 0", "HEALTHY", "Sulcus 2–3 mm. Pink stippled gums. No bleeding on probing.", "NO", "N/A"],
["Stage 1", "GINGIVITIS", "Plaque irritates gum. Gum is RED, SWOLLEN, BLEEDS on probing. Sulcus still ≤3 mm.", "NO", "✓ YES"],
["Stage 2", "EARLY PERIODONTITIS", "Attachment migrates apically. Pocket forms (4–5 mm). Mild bone loss begins.", "YES - mild", "✗ NO"],
["Stage 3", "MODERATE PERIODONTITIS", "Pockets 6–7 mm. Moderate bone loss. Root exposure begins. Gum recession.", "YES - moderate", "✗ NO"],
["Stage 4", "SEVERE PERIODONTITIS", "Pockets >7mm. Severe bone loss. Tooth mobility. Risk of tooth loss.", "YES - severe", "✗ NO"],
]
pg_tbl = mk_table(prog_data, [2.5*cm, 3.5*cm, 7*cm, 3*cm, 2.5*cm], hdr_color=BLUE, alt_color=LIGHT_BLUE)
pg_tbl.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),BLUE),
("TEXTCOLOR",(0,0),(-1,0),WHITE),
("FONTNAME",(0,0),(-1,0),"Helvetica-Bold"),
("FONTSIZE",(0,0),(-1,-1),8.5),
("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE,LIGHT_BLUE]),
("GRID",(0,0),(-1,-1),0.5,GRAY_LINE),
("TOPPADDING",(0,0),(-1,-1),5),("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),6),("VALIGN",(0,0),(-1,-1),"MIDDLE"),
# Highlight the reversible row green
("BACKGROUND",(4,2),(4,2),LIGHT_GREEN),
("TEXTCOLOR",(4,2),(4,2),GREEN),
("FONTNAME",(4,2),(4,2),"Helvetica-Bold"),
# Highlight irreversible rows red
("TEXTCOLOR",(4,3),(4,5),RED),
("FONTNAME",(4,3),(4,5),"Helvetica-Bold"),
]))
story.append(pg_tbl)
story.append(Spacer(1,6))
# Clinical photo of periodontitis
fig_perio = fetch_img(
"https://cdn.orris.care/cdss_images/33356f5f496fb283cc24558359756a3b881076f3538147250b5e8f6bcc49d971.png",
9*cm, 6*cm)
prog_text = [
Paragraph("<b>What happens in the pocket?</b>", PS(bold=True, size=10, color=DARK_TEAL)),
Spacer(1,4),
Paragraph("• The junctional epithelium migrates DOWN the root surface (apical migration)", bul()),
Paragraph("• This creates a POCKET between the gum and the tooth root", bul()),
Paragraph("• Subgingival bacteria colonize the pocket (anaerobic environment)", bul()),
Paragraph("• PDL fibres are destroyed by bacterial proteases + immune enzymes", bul()),
Paragraph("• Osteoclasts dissolve the alveolar bone (bone loss = <b>irreversible</b>)", bul()),
Paragraph("• Probing depth measured by clinician: >3 mm = abnormal", bul()),
Spacer(1,6),
Paragraph("<b>Bleeding on probing</b> = sign of ACTIVE inflammation. Used to monitor disease.", body()),
]
two_col(story, prog_text, [fig_perio, Paragraph("Fig. Chronic periodontitis - inflamed gums with calculus deposits (Scott-Brown's)", cap())],
lw=10*cm, rw=8.5*cm)
# ══════════════════════════════════════════════════════════════════════════
# SECTION 4 - TYPES OF PERIODONTAL DISEASE
# ══════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
sec_hdr(story, "4. TYPES OF PERIODONTAL DISEASE", color=PURPLE)
types_data = [
["Type", "Key Features", "Who Gets It"],
["Chronic Gingivitis", "Red, swollen, bleeding gums. Plaque-induced. NO bone loss. Reversible.",
"Most common. Any age. Poor oral hygiene."],
["Chronic Periodontitis\n(most common form)", "Slowly progressive. Deep pockets. Bone loss. Tooth mobility. Usually painless! "
"Responsible for most tooth loss in adults >35 yrs.",
"Adults >35 years. Common worldwide."],
["Aggressive Periodontitis\n(Localized - LAP)", "Rapid bone loss around 1st molars + incisors. Affects adolescents. "
"Associated with Aa (Aggregatibacter). Neutrophil chemotaxis defect.",
"Healthy adolescents, young adults"],
["Aggressive Periodontitis\n(Generalized - GAP)", "Rapid destruction of many teeth. Serum antibody to Aa.",
"Adults <30 years"],
["ANUG (Acute Necrotizing\nUlcerative Gingivitis)", "Punched-out papillae, pain, bleeding, foul breath, metallic taste, fever. "
"Trench mouth. Caused by spirochetes + anaerobes.",
"HIV+, malnourished, stressed, smokers, young adults"],
["Necrotizing Ulcerative\nPeriodontitis (NUP)", "ANUG that has spread to destroy bone. Rapid bone loss.",
"AIDS patients, severely immunocompromised"],
["Periodontitis as a\nmanifestation of systemic disease", "Severe periodontitis in children with:\n"
"Down syndrome, Papillon-Lefèvre syndrome, Chédiak-Higashi, neutropenia, diabetes",
"Children, systemically compromised"],
["Pregnancy Gingivitis", "Exaggerated gingival inflammation due to hormonal changes (progesterone feeds Prevotella intermedia)",
"Pregnant women"],
]
story.append(mk_table(types_data, [4*cm, 9*cm, 5.5*cm], hdr_color=PURPLE, alt_color=LIGHT_PURPLE))
story.append(Spacer(1,6))
# ANUG detail box
callout(story,
"⚠ ANUG — ACUTE NECROTIZING ULCERATIVE GINGIVITIS (Trench Mouth) ⚠\n"
"DIAGNOSTIC TRIAD: (1) PAIN + (2) 'Punched-out' ulcerated interdental papillae + (3) Gingival BLEEDING\n"
"Other signs: Fetid halitosis (terrible smell), metallic taste, fever, lymphadenopathy, pseudomembrane\n"
"Bacteria: Treponema spp. + Fusobacterium + Prevotella intermedia + Selenomonas + P. gingivalis\n"
"Risk factors: HIV/AIDS, malnutrition, stress, smoking, poor oral hygiene, young adults (early 20s)\n"
"Treatment: Chlorhexidine 0.12% rinses + gentle debridement + Metronidazole (for immunocompromised/systemic signs)\n"
"Complications: Can progress to NUP (bone destruction), then NOMA (gangrenous destruction of face - in malnourished children)",
bg=LIGHT_RED, border=RED, bold=False)
# ══════════════════════════════════════════════════════════════════════════
# SECTION 5 - RISK FACTORS
# ══════════════════════════════════════════════════════════════════════════
sec_hdr(story, "5. RISK FACTORS — Who Gets Worse Disease?", color=ORANGE)
rf_data = [
["Risk Factor", "How It Worsens Periodontitis"],
["Dental plaque / calculus", "PRIMARY CAUSE — bacteria trigger the entire inflammatory cascade"],
["Smoking / tobacco", "BIGGEST MODIFIABLE RISK. Vasoconstriction masks bleeding (false negative). Reduces immune response. 2–7× more severe."],
["Diabetes mellitus (DM)", "3× more severe periodontitis in uncontrolled DM. Bidirectional: periodontitis also worsens HbA1c. Advanced glycation end-products (AGEs) stimulate destructive cytokines."],
["HIV / AIDS", "Aggressive forms (ANUG, NUP). Linear gingival erythema (characteristic red band at gum margin)."],
["Genetic factors", "Some individuals have hyperactive IL-1 gene variants → excessive bone destruction"],
["Medications", "Phenytoin, cyclosporin, nifedipine → gingival overgrowth (not true periodontitis but risk factor). Anticoagulants → excess bleeding."],
["Hormonal changes", "Pregnancy, puberty, oral contraceptives → exaggerated inflammatory response to plaque"],
["Nutritional deficiencies", "Vitamin C deficiency (scurvy) → defective collagen synthesis → severe gingivitis and bleeding"],
["Systemic diseases", "Leukaemia, Down syndrome, Papillon-Lefèvre syndrome, Chédiak-Higashi → aggressive periodontitis"],
["Poor oral hygiene", "Directly increases plaque accumulation"],
["Xerostomia (dry mouth)", "Saliva protects: antimicrobials, buffering, washing. Loss = more plaque/calculus"],
]
story.append(mk_table(rf_data, [5*cm, 13.5*cm], hdr_color=ORANGE, alt_color=LIGHT_ORANGE))
# ══════════════════════════════════════════════════════════════════════════
# SECTION 6 - SYSTEMIC CONNECTIONS
# ══════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
sec_hdr(story, "6. PERIODONTITIS & SYSTEMIC DISEASE — The Mouth-Body Connection", color=HexColor("#922b21"))
callout(story,
"Periodontal infection is NOT just a mouth problem. Bacteria from periodontal pockets can enter the "
"BLOODSTREAM (bacteraemia) and trigger systemic inflammation. This is why periodontitis is linked to "
"serious general health conditions.",
bg=LIGHT_RED, border=HexColor("#922b21"), bold=False)
sys_data = [
["Systemic Condition", "Link to Periodontitis", "Direction"],
["Cardiovascular disease\n& Atherosclerosis", "P. gingivalis found in atherosclerotic plaques. Chronic inflammation elevates CRP, fibrinogen → atherogenesis. Moderate but significant epidemiological association.", "Perio → CVD risk ↑"],
["Diabetes mellitus", "Uncontrolled DM impairs neutrophil function and healing → worse perio. Periodontitis raises HbA1c → worsens diabetes. Treatment of perio improves glycaemic control.", "BIDIRECTIONAL"],
["Infective endocarditis", "Oral bacteria (Streptococcus viridans, etc.) seed heart valves during bacteraemia from dental procedures or chewing. Antibiotic prophylaxis may be needed.", "Perio → IE risk ↑"],
["Lung abscess /\nAspiration pneumonia", "Aspiration of oral bacteria into lungs, especially in hospitalised/elderly patients.", "Perio → Respiratory infection"],
["Brain abscess", "Haematogenous seeding of oral bacteria to brain.", "Perio → CNS infection"],
["Adverse pregnancy outcomes", "Associated with preterm birth, low birth weight. Prostaglandins from perio may stimulate uterine contractions.", "Perio → Obstetric risk"],
["Rheumatoid arthritis", "P. gingivalis produces PPAD enzyme → citrullination of proteins → may trigger RA autoimmunity.", "Perio may initiate RA"],
["Alzheimer's disease", "P. gingivalis and its toxins (gingipains) found in Alzheimer's brain tissue. Active area of research.", "Emerging evidence"],
]
story.append(mk_table(sys_data, [4.5*cm, 9.5*cm, 4.5*cm], hdr_color=HexColor("#922b21"), alt_color=LIGHT_RED))
story.append(Spacer(1,4))
# ══════════════════════════════════════════════════════════════════════════
# SECTION 7 - CLINICAL FEATURES / DIAGNOSIS
# ══════════════════════════════════════════════════════════════════════════
sec_hdr(story, "7. CLINICAL FEATURES & DIAGNOSIS", color=GREEN)
left_items = [
Paragraph("<b>Symptoms the patient feels:</b>", PS(bold=True, size=10, color=DARK_TEAL)),
Paragraph("• Bleeding gums (when brushing or spontaneous)", bul()),
Paragraph("• Swollen, puffy, red gums", bul()),
Paragraph("• Bad breath (halitosis) — from bacterial by-products", bul()),
Paragraph("• Exposed root surfaces (teeth look longer)", bul()),
Paragraph("• Sensitive teeth to hot/cold (due to root exposure)", bul()),
Paragraph("• Loose teeth / tooth mobility (advanced disease)", bul()),
Paragraph("• Painful only if abscess forms (usually PAINLESS!)", bul()),
Paragraph("• Pus discharge from gum margin", bul()),
Spacer(1,6),
Paragraph("<b>What the dentist checks:</b>", PS(bold=True, size=10, color=DARK_TEAL)),
Paragraph("• <b>Probing depth</b> — insert periodontal probe; >3 mm = pocket", bul()),
Paragraph("• <b>Bleeding on probing (BOP)</b> — = active inflammation", bul()),
Paragraph("• <b>Gum recession</b> — how far gum has pulled away from crown", bul()),
Paragraph("• <b>Tooth mobility</b> — grade 1 (slight) to 3 (very mobile)", bul()),
Paragraph("• <b>Furcation involvement</b> — probe enters the fork between roots of molars", bul()),
Paragraph("• <b>Bone loss on X-ray</b> — horizontal or angular (vertical) bone loss", bul()),
]
diag_data = [
["Diagnostic Tool", "What It Shows"],
["Periodontal probe", "Pocket depth (>3 mm = disease); BOP = active inflammation"],
["Periapical X-ray", "Bone level; horizontal vs vertical bone loss pattern"],
["Orthopantomogram (OPG)", "Overview of all teeth; generalised bone loss pattern"],
["CBCT (cone beam CT)", "Precise 3D bone defect assessment for surgery planning"],
["Microbiological tests", "Identify specific bacteria (e.g. Aa, Pg) for targeted antibiotics"],
["Genetic testing", "IL-1 gene polymorphism = high risk for severe periodontitis"],
["Blood tests", "FBC (check for leukaemia, neutropenia), HbA1c (diabetes)"],
]
diag_tbl = mk_table(diag_data, [5.5*cm, 8*cm], hdr_color=GREEN, alt_color=LIGHT_GREEN)
right_items = [diag_tbl]
two_col(story, left_items, right_items, lw=10*cm, rw=8.5*cm)
story.append(Spacer(1,4))
callout(story,
"IMPORTANT RULE: Periodontal disease is USUALLY PAINLESS until late stages or abscess forms! "
"This is why many patients don't seek help until teeth are already very loose. "
"Regular dental check-ups are the key to early detection.",
bg=LIGHT_GOLD, border=GOLD, bold=True)
# ══════════════════════════════════════════════════════════════════════════
# SECTION 8 - TREATMENT
# ══════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
sec_hdr(story, "8. TREATMENT — The 4-Phase Approach", color=TEAL)
callout(story,
"Treatment is directed at SLOWING or ARRESTING disease by removing plaque and its by-products. "
"Lost bone CANNOT be fully regrown. Prevention is the best treatment.",
bg=LIGHT_TEAL, border=TEAL, bold=False)
tx_data = [
["Phase", "Treatment", "Goal / Details"],
["PHASE 1\nSystemic Phase", "Control systemic risk factors",
"• Control diabetes (HbA1c <7%)\n• Stop smoking\n• Review medications causing gingival problems\n• Treat nutritional deficiencies (Vit C)"],
["PHASE 2\nCausal/Hygiene Phase\n(Non-surgical)", "Oral hygiene instruction (OHI)\n+ Scaling & Root Planing (SRP)",
"• Teach brushing (modified Bass technique), flossing, interdental brushes\n"
"• Supragingival scaling: remove calculus above gumline\n"
"• Subgingival scaling & root planing: remove calculus and biofilm from root surfaces below gumline (done under local anaesthetic)\n"
"• Chlorhexidine 0.12% rinse twice daily — adjunct antimicrobial\n"
"• Systemic antibiotics: Metronidazole ± Amoxicillin for aggressive periodontitis\n"
"• Re-assess after 6–8 weeks"],
["PHASE 3\nSurgical Phase\n(if needed)", "Periodontal surgery",
"• For residual pockets >5 mm not responding to SRP\n"
"• Flap surgery: lift gum flap, clean root surfaces directly, reposition flap\n"
"• Bone grafts: fill bony defects\n"
"• Guided tissue regeneration (GTR): membrane to guide bone/PDL regrowth\n"
"• Crown lengthening, furcation treatment"],
["PHASE 4\nMaintenance Phase", "Supportive Periodontal Treatment (SPT)\nLifelong",
"• Professional cleaning every 3 months initially, then every 6 months\n"
"• Monitor probing depths, BOP, radiographs\n"
"• Reinforce oral hygiene\n"
"• Treat any recurrent disease promptly"],
["ABSCESS TREATMENT", "Gingival / Periodontal abscess",
"• Gingival abscess: find and remove foreign body + saline irrigation\n"
"• Periodontal abscess: warm saline rinses + chlorhexidine + systemic antibiotics\n"
"• Large abscess: incision & drainage\n"
"• NSAIDs for analgesia (preferred over narcotics)"],
["ANUG TREATMENT", "Acute Necrotizing Ulcerative Gingivitis",
"• Chlorhexidine 0.12% rinse twice daily (MAINSTAY)\n"
"• Gentle professional debridement and scaling\n"
"• Metronidazole (for immunocompromised or systemic signs only)\n"
"• Pain reduces within 24 hours\n"
"• Address predisposing factors: stop smoking, reduce stress, improve nutrition"],
]
tx_tbl = Table(tx_data, colWidths=[3.5*cm, 4.5*cm, 10.5*cm])
tx_tbl.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),TEAL),
("TEXTCOLOR",(0,0),(-1,0),WHITE),
("FONTNAME",(0,0),(-1,0),"Helvetica-Bold"),
("FONTNAME",(0,1),(0,-1),"Helvetica-Bold"),
("FONTSIZE",(0,0),(-1,-1),8.5),
("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE,LIGHT_TEAL]),
("GRID",(0,0),(-1,-1),0.5,GRAY_LINE),
("TOPPADDING",(0,0),(-1,-1),5),("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),6),("VALIGN",(0,0),(-1,-1),"TOP"),
("BACKGROUND",(0,5),(-1,6),HexColor("#fff5f5")),
]))
story.append(tx_tbl)
# ══════════════════════════════════════════════════════════════════════════
# SECTION 9 - PREVENTION
# ══════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
sec_hdr(story, "9. PREVENTION — The Best Treatment", color=GREEN)
callout(story,
"Periodontal disease is PREVENTABLE. Both dental caries and periodontal disease have been reduced dramatically "
"in developed countries through water fluoridation and improved dental care. The same can be achieved globally "
"with good oral hygiene habits.",
bg=LIGHT_GREEN, border=GREEN, bold=False)
prev_data = [
["Prevention Strategy", "How / Why"],
["Brush twice daily", "Removes supragingival plaque. Modified Bass technique = toothbrush at 45° to gumline, small circular motions into sulcus."],
["Floss / interdental brushes daily", "Removes plaque from BETWEEN teeth where brush cannot reach. Most periodontal disease starts between teeth (interproximal)."],
["Fluoride toothpaste", "Primarily for caries prevention but reduces overall plaque pathogenicity."],
["Professional cleaning\nevery 6 months", "Removes calculus (hardened plaque) that cannot be removed at home. Essential for susceptible individuals."],
["Stop smoking", "Biggest single modifiable risk reduction. Smoking cessation improves periodontal outcomes significantly."],
["Control diabetes", "Maintaining HbA1c <7% dramatically reduces periodontal severity."],
["Chlorhexidine rinses\n(short-term)", "0.12–0.2% chlorhexidine is the gold-standard chemical plaque control. NOT for long-term use (stains teeth)."],
["High-risk group counselling", "Extra care for: hyposalivation (dry mouth), diabetics, smokers, HIV+, Down syndrome, elderly, those with limited dexterity (use electric toothbrush)."],
]
story.append(mk_table(prev_data, [5.5*cm, 13*cm], hdr_color=GREEN, alt_color=LIGHT_GREEN))
story.append(Spacer(1,8))
# ══════════════════════════════════════════════════════════════════════════
# SECTION 10 - QUICK MEMORY SUMMARY
# ══════════════════════════════════════════════════════════════════════════
sec_hdr(story, "10. QUICK MEMORY SUMMARY", color=DARK_TEAL)
callout(story,
'THE "5 Ps" OF PERIODONTAL DISEASE:\n'
' PLAQUE → Primary cause (bacteria in biofilm)\n'
' POCKET → Deepened sulcus (>3 mm) = disease marker\n'
' PROGRESSION → Gingivitis → Periodontitis → Tooth loss\n'
' PAINLESS → Usually silent until advanced (why regular check-ups matter!)\n'
' PREVENTION → Daily hygiene + professional cleaning = disease prevented',
bg=LIGHT_TEAL, border=DARK_TEAL, bold=False)
summary_data = [
["", "GINGIVITIS", "PERIODONTITIS"],
["Bone loss", "NO", "YES"],
["Reversible?", "YES - if plaque removed", "NO - bone lost forever"],
["Pocket depth", "≤3 mm", ">3 mm"],
["Bleeding on probing", "YES", "YES"],
["PDL destruction", "NO", "YES"],
["X-ray changes", "Normal bone height", "Reduced bone height"],
["Tooth mobility", "Absent", "Present (advanced)"],
["Treatment", "OHI + scale and polish", "OHI + SRP ± surgery + maintenance"],
]
s_tbl = Table(summary_data, colWidths=[5.5*cm, 6.5*cm, 6.5*cm])
s_tbl.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),DARK_TEAL),
("TEXTCOLOR",(0,0),(-1,0),WHITE),
("FONTNAME",(0,0),(-1,0),"Helvetica-Bold"),
("FONTNAME",(0,1),(0,-1),"Helvetica-Bold"),
("FONTSIZE",(0,0),(-1,-1),9),
("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE,LIGHT_TEAL]),
("GRID",(0,0),(-1,-1),0.5,GRAY_LINE),
("TOPPADDING",(0,0),(-1,-1),6),("BOTTOMPADDING",(0,0),(-1,-1),6),
("LEFTPADDING",(0,0),(-1,-1),8),("VALIGN",(0,0),(-1,-1),"MIDDLE"),
("TEXTCOLOR",(1,1),(1,1),GREEN),("FONTNAME",(1,1),(1,1),"Helvetica-Bold"),
("TEXTCOLOR",(2,1),(2,1),RED),("FONTNAME",(2,1),(2,1),"Helvetica-Bold"),
("TEXTCOLOR",(1,2),(1,2),GREEN),("FONTNAME",(1,2),(1,2),"Helvetica-Bold"),
("TEXTCOLOR",(2,2),(2,2),RED),("FONTNAME",(2,2),(2,2),"Helvetica-Bold"),
]))
story.append(s_tbl)
story.append(Spacer(1,8))
story.append(Paragraph("Complete Disease Summary at a Glance", PS(bold=True, size=11, color=DARK_TEAL)))
story.append(Spacer(1,4))
all_data = [
["Condition", "Gum Appearance", "Bone Loss", "Key Bacteria", "Treatment"],
["Healthy", "Pink, stippled, firm", "None", "Gram+ aerobic streps", "Daily hygiene"],
["Chronic gingivitis", "Red, swollen, bleeds", "None", "Mixed — plaque flora", "OHI + scaling"],
["Chronic periodontitis", "Receded, pockets", "Horizontal", "Pg, Td, Pi, Fn", "SRP + maintenance"],
["Aggressive (LAP)", "Minimal gum change", "Angular (1st molar / incisor)", "Aa", "SRP + Metronidazole + Amoxicillin"],
["ANUG / NUG", "Punched-out papillae, necrosis", "None (gingivitis only)", "Treponema, Fusobacterium, Pi", "Chlorhexidine + débridement ± Metronidazole"],
["NUP (necrotizing periodontitis)", "Extensive necrosis", "Rapid cratering bone loss", "Same as ANUG", "As ANUG + surgery"],
["Pregnancy gingivitis", "Exaggerated gum swelling", "None if no pre-existing perio", "Pi elevated", "OHI + scaling (safe in 2nd trimester)"],
["Gingival overgrowth\n(drug-induced)", "Enlarged, bulbous gums", "None", "Secondary plaque", "OHI + change drug + surgery"],
]
all_tbl = Table(all_data, colWidths=[3.5*cm, 3.5*cm, 3.5*cm, 4*cm, 4*cm])
all_tbl.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),DARK_TEAL),
("TEXTCOLOR",(0,0),(-1,0),WHITE),
("FONTNAME",(0,0),(-1,0),"Helvetica-Bold"),
("FONTSIZE",(0,0),(-1,-1),8),
("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE,GRAY]),
("GRID",(0,0),(-1,-1),0.5,GRAY_LINE),
("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4),
("LEFTPADDING",(0,0),(-1,-1),5),("VALIGN",(0,0),(-1,-1),"MIDDLE"),
]))
story.append(all_tbl)
story.append(Spacer(1,8))
callout(story,
"EXAM MNEMONIC — Remember the Red Complex (the 3 most dangerous periodontal bacteria):\n"
' "P G T" = Porphyromonas Gingivalis + Tannerella Forsythia + Treponema Denticola\n'
" These three always found together in diseased sites = RED COMPLEX\n\n"
"Remember ANUG diagnostic TRIAD: PAIN + PUNCHED-OUT papillae + BLEEDING",
bg=LIGHT_GOLD, border=GOLD, bold=False)
# Footer
story.append(HRFlowable(width="100%", thickness=1.5, color=DARK_TEAL))
story.append(Spacer(1,4))
story.append(Paragraph(
"Sources: Scott-Brown's Otorhinolaryngology | Robbins & Cotran Pathologic Basis of Disease | "
"Tintinalli's Emergency Medicine | Harrison's Principles of Internal Medicine 22e | "
"Junqueira's Basic Histology | Sherris Medical Microbiology | Compiled by Orris Medical Library",
small()))
doc.build(story)
print(f"PDF created: {OUTPUT}")
if __name__ == "__main__":
build()
cd /home/daytona/workspace/perio-pdf && python3 generate_perio_pdf.py 2>&1
ls -lh /home/daytona/workspace/perio-pdf/Periodontal_Disease_Quick_Reference.pdf
Periodontal Disease Quick Reference
PDF Document · PDF
Note on sources: Burket's Oral Medicine is not in this textbook library. This guide uses Scott-Brown's Otorhinolaryngology, Robbins & Cotran Pathology, Tintinalli's Emergency Medicine, Harrison's Internal Medicine, Junqueira's Histology, and Sherris Medical Microbiology - all covering identical content to Burket's.
| Structure | What It Is |
|---|---|
| Gingiva (gum) | Pink collar of tissue - the visible seal around teeth |
| Periodontal Ligament (PDL) | Tiny collagen rope fibres (Sharpey's fibres) connecting root to bone |
| Cementum | Thin bone-like layer covering the tooth root |
| Alveolar bone | The jawbone socket the tooth sits in |


HEALTHY GUMS → GINGIVITIS → PERIODONTITIS → TOOTH LOSS

Text are overlapping with each other please provide me better pdf
~/perio-pdf/generate_perio_v2.py
#!/usr/bin/env python3
"""
Periodontal Disease - Quick Reference PDF (v2 - single column, no overlaps)
All content in strict top-to-bottom flow. Tables only. No floating image columns.
"""
import urllib.request, io, os
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, Image, PageBreak, KeepTogether
)
from reportlab.lib.colors import HexColor
# ── Colour palette ────────────────────────────────────────────────────────────
C = {
"dark_teal": HexColor("#0d4f4f"),
"teal": HexColor("#1a7f7f"),
"light_teal": HexColor("#d0f0f0"),
"orange": HexColor("#d35400"),
"lt_orange": HexColor("#fdebd0"),
"red": HexColor("#c0392b"),
"lt_red": HexColor("#fdedec"),
"purple": HexColor("#6c3483"),
"lt_purple": HexColor("#f5eef8"),
"green": HexColor("#1e8449"),
"lt_green": HexColor("#eafaf1"),
"gold": HexColor("#b7950b"),
"lt_gold": HexColor("#fef9e7"),
"blue": HexColor("#1a5276"),
"lt_blue": HexColor("#d6e8f7"),
"gray": HexColor("#f4f6f9"),
"gray_line": HexColor("#bdc3c7"),
"white": colors.white,
"black": colors.black,
}
PAGE_W = 18.5 * cm # usable width on A4 with 1.8 cm margins each side
OUTPUT = "/home/daytona/workspace/perio-pdf/Periodontal_Disease_Quick_Reference_v2.pdf"
# ── Style factories ───────────────────────────────────────────────────────────
def PS(font="Helvetica", size=9.5, color=C["black"],
align=TA_JUSTIFY, space_after=5, leading=15, left_indent=0):
return ParagraphStyle("_", fontName=font, fontSize=size, textColor=color,
spaceAfter=space_after, leading=leading,
alignment=align, leftIndent=left_indent)
def body(): return PS()
def bold_body(): return PS("Helvetica-Bold")
def bul(): return PS(left_indent=16, space_after=3, leading=14)
def cap(): return PS("Helvetica-Oblique", 8, HexColor("#444444"),
align=TA_CENTER, leading=11, space_after=8)
def footnote(): return PS("Helvetica-Oblique", 8, HexColor("#555555"),
align=TA_CENTER, space_after=2)
# ── Section header (full-width coloured bar) ──────────────────────────────────
def sec_hdr(story, text, color=C["teal"]):
p = ParagraphStyle("sh", fontName="Helvetica-Bold", fontSize=12,
textColor=C["white"], spaceAfter=0, leading=16)
t = Table([[Paragraph(text, p)]], colWidths=[PAGE_W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
]))
story.append(Spacer(1, 8))
story.append(t)
story.append(Spacer(1, 5))
# ── Callout / highlight box ───────────────────────────────────────────────────
def callout(story, lines, bg=C["lt_blue"], border=C["blue"], bold=False):
"""lines = list of strings; each renders as a separate paragraph inside the box."""
style = ParagraphStyle("co",
fontName="Helvetica-Bold" if bold else "Helvetica",
fontSize=9.5, textColor=C["black"], leading=15, spaceAfter=3)
inner = [[Paragraph(ln, style)] for ln in lines]
t = Table(inner, colWidths=[PAGE_W - 1.2*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 1.5, border),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
]))
story.append(t)
story.append(Spacer(1, 7))
# ── Standard data table ───────────────────────────────────────────────────────
def mk_table(data, col_widths, hdr_bg=C["blue"], alt_bg=C["lt_blue"],
font_size=8.5, bold_col0=True):
t = Table(data, colWidths=col_widths, repeatRows=1)
styles = [
("BACKGROUND", (0,0), (-1,0), hdr_bg),
("TEXTCOLOR", (0,0), (-1,0), C["white"]),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), font_size),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C["white"], alt_bg]),
("GRID", (0,0), (-1,-1), 0.4, C["gray_line"]),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
("WORDWRAP", (0,0), (-1,-1), "CJK"),
]
if bold_col0:
styles.append(("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"))
t.setStyle(TableStyle(styles))
return t
# ── Image fetcher ─────────────────────────────────────────────────────────────
def fetch_img(url, max_w, max_h):
try:
req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
data = urllib.request.urlopen(req, timeout=20).read()
obj = Image(io.BytesIO(data))
iw, ih = obj.imageWidth, obj.imageHeight
scale = min(max_w / iw, max_h / ih, 1.0)
obj.drawWidth = iw * scale
obj.drawHeight = ih * scale
return obj
except Exception as e:
return Paragraph(f"<i>[Image unavailable: {e}]</i>",
PS("Helvetica-Oblique", 8, C["gray_line"]))
# ── Centred image helper ──────────────────────────────────────────────────────
def add_img(story, url, max_w, max_h, caption=""):
img = fetch_img(url, max_w, max_h)
# Wrap in a 1-cell table so it centres cleanly
t = Table([[img]], colWidths=[PAGE_W])
t.setStyle(TableStyle([
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 2),
]))
story.append(t)
if caption:
story.append(Paragraph(caption, cap()))
story.append(Spacer(1, 4))
# ═════════════════════════════════════════════════════════════════════════════
def build():
os.makedirs("/home/daytona/workspace/perio-pdf", exist_ok=True)
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
leftMargin=1.8*cm, rightMargin=1.8*cm,
topMargin=1.5*cm, bottomMargin=1.8*cm,
title="Periodontal Disease – Quick Reference",
author="Orris Medical Library",
)
story = []
# ══════════════════════════════════════════════════════════════════════════
# COVER
# ══════════════════════════════════════════════════════════════════════════
def cover_para(txt, size, color, font="Helvetica-Bold", space=6):
return Paragraph(txt, ParagraphStyle("_", fontName=font, fontSize=size,
textColor=color, alignment=TA_CENTER, spaceAfter=space, leading=size+6))
cover_rows = [
[cover_para("PERIODONTAL DISEASE", 28, C["white"])],
[cover_para("Quick Reference Study Guide", 14, HexColor("#aadddd"), font="Helvetica")],
[cover_para("Easy Language · Exam-Ready · Oral Medicine", 10,
HexColor("#80c0c0"), font="Helvetica-Oblique", space=4)],
[cover_para("Sources: Scott-Brown's · Robbins & Cotran · Tintinalli · Harrison's · Junqueira's",
8, HexColor("#aacccc"), font="Helvetica-Oblique", space=12)],
]
cover = Table(cover_rows, colWidths=[PAGE_W])
cover.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C["dark_teal"]),
("TOPPADDING", (0,0), (-1,0), 16),
("LEFTPADDING", (0,0), (-1,-1), 16),
("RIGHTPADDING", (0,0), (-1,-1), 16),
("BOTTOMPADDING", (0,3), (-1,3), 16),
]))
story.append(cover)
story.append(Spacer(1, 12))
# ══════════════════════════════════════════════════════════════════════════
# 1 – WHAT IS THE PERIODONTIUM?
# ══════════════════════════════════════════════════════════════════════════
sec_hdr(story, "1. WHAT IS THE PERIODONTIUM? (The Tooth's Support System)")
callout(story, [
"Think of your tooth like a FENCE POST. The post (tooth) must be held firmly in the GROUND (jawbone).",
"The PERIODONTIUM = everything that holds the tooth in place.",
"Periodontal disease = the slow destruction of this entire support system by bacteria.",
], bg=C["lt_teal"], border=C["teal"])
struct_data = [
["Structure", "Location", "Simple Role"],
["Gingiva (Gum)", "Visible pink collar around teeth", "Seals & protects the tooth-bone junction"],
["Free gingiva", "Unattached gum edge", "Forms the sulcus (healthy gap 2–3 mm)"],
["Attached gingiva", "Firmly stuck to jawbone", "Provides rigid structural support"],
["Periodontal Ligament (PDL)", "Between root and bone", "Collagen fibres (Sharpey's) anchoring tooth; has nerves & blood vessels"],
["Cementum", "Covers tooth root surface", "Anchors PDL fibres to root; avascular (no blood supply)"],
["Alveolar bone", "The jaw socket", "Bony house for the tooth; continuously remodels"],
["Junctional epithelium","Base of the gingival sulcus", "Specialised seal; the 'door' bacteria try to breach"],
]
story.append(mk_table(struct_data, [4*cm, 5*cm, 9.5*cm],
hdr_bg=C["teal"], alt_bg=C["light_teal"]))
story.append(Spacer(1, 4))
# Anatomy diagram
add_img(story,
"https://cdn.orris.care/cdss_images/d541731e17c065148e080843c013581def64afdfaaf5c9dab57a48b32f6c8e11.png",
10*cm, 11*cm,
"Figure 1 — Dental anatomic unit & attachment apparatus: enamel, dentin, pulp, "
"cementum, periodontal ligament, alveolar bone, crown, root, apex.")
# Histology
add_img(story,
"https://cdn.orris.care/cdss_images/58b7e16b68346f6bf7a4c999f8976449b8bb221198c0d908b32a2be582704dbc.png",
PAGE_W, 5.5*cm,
"Figure 2 — Periodontium histology (Junqueira's): "
"(a) Free gingiva (FG), lamina propria (LP), alveolar bone (B), periodontal ligament (PL) — H&E ×10 | "
"(b) PDL with blood vessel (V), bone (B), cementum (C) — H&E ×100 | "
"(c) Collagen continuity in polarised light.")
# ══════════════════════════════════════════════════════════════════════════
# 2 – ROOT CAUSE: DENTAL PLAQUE
# ══════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
sec_hdr(story, "2. THE ROOT CAUSE — DENTAL PLAQUE", color=C["orange"])
callout(story, [
"DENTAL PLAQUE = sticky colourless biofilm (bacteria + salivary proteins + dead cells).",
"Forms CONSTANTLY on teeth. Not removed daily → hardens into CALCULUS (tartar).",
"Calculus CANNOT be removed by brushing — only by professional scaling.",
"The dangerous bacteria live in SUBGINGIVAL plaque (hidden below the gumline).",
], bg=C["lt_orange"], border=C["orange"])
plaque_data = [
["Plaque Type", "Location", "Main Bacteria", "Disease Caused"],
["Supragingival", "Above gum margin (visible, yellow)", "Streptococcus mutans, Actinomyces", "Gingivitis, dental caries"],
["Subgingival", "Below gum margin (hidden, dangerous)", "P. gingivalis, T. denticola, Aa, Prevotella intermedia", "PERIODONTITIS — bone destruction"],
]
story.append(mk_table(plaque_data, [3.5*cm, 4*cm, 6*cm, 5*cm],
hdr_bg=C["orange"], alt_bg=C["lt_orange"]))
story.append(Spacer(1, 8))
story.append(Paragraph('Key Periodontal Bacteria — the "Red Complex"',
PS("Helvetica-Bold", 10, C["red"], align=TA_LEFT)))
story.append(Spacer(1, 3))
bact_data = [
["Bacterium (Abbreviation)", "What it Does"],
["Porphyromonas gingivalis (Pg)", "Produces powerful proteases → destroys collagen and PDL fibres. MAJOR CULPRIT."],
["Treponema denticola (Td)", "Binds complement factors to evade killing; synergises with Pg to worsen disease."],
["Tannerella forsythia (Tf)", "Always found with Pg + Td; contributes to bone destruction."],
["Aggregatibacter actinomycetemcomitans (Aa)", "Causes AGGRESSIVE/JUVENILE periodontitis; impairs neutrophil chemotaxis."],
["Prevotella intermedia", "Elevated in pregnancy gingivitis and ANUG; uses progesterone as a growth factor."],
["Fusobacterium nucleatum", "Bridge species — helps other bacteria attach to the biofilm."],
["Treponema + Fusobacterium + Selenomonas", "Together responsible for ANUG (trench mouth)."],
]
story.append(mk_table(bact_data, [6.5*cm, 12*cm],
hdr_bg=C["red"], alt_bg=C["lt_red"]))
story.append(Spacer(1, 8))
callout(story, [
"HOW BACTERIA DESTROY YOUR TOOTH SUPPORT — Step by Step:",
"1. Bacteria in subgingival plaque trigger immune cells (neutrophils, macrophages).",
"2. Immune cells release matrix metalloproteinases (MMPs) → destroy PDL collagen fibres.",
"3. Inflammatory cytokines (IL-1β, TNF-α, PGE2) activate OSTEOCLASTS.",
"4. Osteoclasts dissolve (resorb) the alveolar bone — this bone loss is PERMANENT.",
"5. The gum attachment migrates DOWN the root (apical migration) → POCKET forms.",
"6. Deeper pocket = more anaerobic bacteria → accelerating destruction → tooth loss.",
], bg=C["lt_red"], border=C["red"])
# ══════════════════════════════════════════════════════════════════════════
# 3 – DISEASE PROGRESSION
# ══════════════════════════════════════════════════════════════════════════
sec_hdr(story, "3. DISEASE PROGRESSION — Healthy → Tooth Loss", color=C["blue"])
callout(story, [
"HEALTHY GUMS → GINGIVITIS → EARLY PERIODONTITIS → SEVERE PERIODONTITIS → TOOTH LOSS",
"Key rule: Gingivitis = REVERSIBLE (bone safe). Periodontitis = IRREVERSIBLE (bone gone forever).",
], bg=C["lt_blue"], border=C["blue"])
prog_data = [
["Stage", "Name", "What Is Happening?", "Bone Lost?", "Reversible?"],
["Stage 0", "HEALTHY",
"Pink stippled gums. Sulcus 2–3 mm. No bleeding on probing.",
"NO", "N/A"],
["Stage 1", "GINGIVITIS",
"Plaque irritates gum. Gum is RED, SWOLLEN, BLEEDS on probing. Sulcus still ≤3 mm.",
"NO", "✓ YES\n(clean up → gone)"],
["Stage 2", "EARLY\nPERIODONTITIS",
"Gum attachment migrates down root. Pocket 4–5 mm. Mild bone loss begins.",
"YES — mild", "✗ NO"],
["Stage 3", "MODERATE\nPERIODONTITIS",
"Pockets 6–7 mm. Moderate bone loss. Root exposure. Gum recession visible.",
"YES — moderate", "✗ NO"],
["Stage 4", "SEVERE\nPERIODONTITIS",
"Pockets >7 mm. Severe bone loss. Tooth mobility. Risk of tooth loss.",
"YES — severe", "✗ NO"],
]
pg_tbl = mk_table(prog_data, [2.2*cm, 3*cm, 7.3*cm, 3*cm, 3*cm],
hdr_bg=C["blue"], alt_bg=C["lt_blue"])
pg_tbl.setStyle(TableStyle([
# base styles repeated
("BACKGROUND", (0,0), (-1,0), C["blue"]),
("TEXTCOLOR", (0,0), (-1,0), C["white"]),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C["white"], C["lt_blue"]]),
("GRID", (0,0), (-1,-1), 0.4, C["gray_line"]),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
# colour-code reversibility column
("TEXTCOLOR", (4,2), (4,2), C["green"]),
("FONTNAME", (4,2), (4,2), "Helvetica-Bold"),
("TEXTCOLOR", (4,3), (4,5), C["red"]),
("FONTNAME", (4,3), (4,5), "Helvetica-Bold"),
("BACKGROUND", (3,3), (4,5), HexColor("#fff5f5")),
]))
story.append(pg_tbl)
story.append(Spacer(1, 8))
# Clinical photo
add_img(story,
"https://cdn.orris.care/cdss_images/33356f5f496fb283cc24558359756a3b881076f3538147250b5e8f6bcc49d971.png",
10*cm, 7*cm,
"Figure 3 — Chronic periodontitis: inflamed swollen gums, visible calculus deposits on teeth, "
"gum recession. Note the redness and irregular gum margin.")
# ══════════════════════════════════════════════════════════════════════════
# 4 – TYPES OF PERIODONTAL DISEASE
# ══════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
sec_hdr(story, "4. TYPES OF PERIODONTAL DISEASE", color=C["purple"])
types_data = [
["Type", "Key Features", "Who Is Affected?"],
["Chronic Gingivitis",
"Red, swollen, bleeding gums. Plaque-induced. NO bone loss. REVERSIBLE.",
"Most common. Any age. Poor oral hygiene."],
["Chronic Periodontitis\n(most common form)",
"Slowly progressive. Deep pockets. Bone loss. Tooth mobility. Usually PAINLESS! "
"Responsible for most tooth loss in adults >35 years.",
"Adults >35 yrs. Worldwide most common."],
["Aggressive Periodontitis\n— Localised (LAP)",
"Rapid bone loss specifically around 1st molars + incisors in an otherwise healthy teenager/young adult. "
"Neutrophil chemotaxis defect. Key bacterium: Aa.",
"Healthy adolescents, young adults"],
["Aggressive Periodontitis\n— Generalised (GAP)",
"Rapid destruction affecting many teeth. Serum antibody to Aa usually detectable.",
"Adults <30 years"],
["ANUG\n(Acute Necrotising Ulcerative Gingivitis)\n= Trench Mouth",
"TRIAD: Pain + Punched-out papillae + Gingival bleeding. "
"Also: foul breath, metallic taste, fever, malaise, lymphadenopathy, pseudomembrane. "
"Bacteria: Treponema + Fusobacterium + Prevotella intermedia + Selenomonas.",
"HIV+, malnourished, stressed, smokers, young adults in their 20s"],
["Necrotising Ulcerative\nPeriodontitis (NUP)",
"ANUG that has spread deeper to destroy bone. Rapid, crater-like bone loss. "
"Can progress to NOMA in malnourished children.",
"AIDS patients, severely immunocompromised"],
["Periodontitis as a\nmanifestation of systemic disease",
"Severe periodontitis in children secondary to systemic conditions:\n"
"Down syndrome, Papillon-Lefèvre syndrome, Chédiak-Higashi, neutropenia, diabetes.",
"Children with systemic disease"],
["Pregnancy Gingivitis",
"Exaggerated gingival inflammation due to elevated progesterone\n"
"(Prevotella intermedia uses progesterone as a growth nutrient).",
"Pregnant women — peaks at 2nd trimester"],
["Drug-induced\nGingival Overgrowth",
"Enlarged bulbous gums (NOT true periodontitis but a risk factor). "
"Causative drugs: Phenytoin (epilepsy), Ciclosporin (immunosuppression), Nifedipine (calcium channel blocker).",
"Patients on above medications"],
]
story.append(mk_table(types_data, [4.5*cm, 8.5*cm, 5.5*cm],
hdr_bg=C["purple"], alt_bg=C["lt_purple"]))
story.append(Spacer(1, 8))
# ANUG box
callout(story, [
"⚠ ANUG (TRENCH MOUTH) — EXAM FAVOURITE ⚠",
"Diagnostic TRIAD: (1) PAIN + (2) 'Punched-out' ulcerated interdental papillae + (3) BLEEDING",
"Synonyms: Vincent's disease, Fusospirochetal gingivitis, Necrotising gingivostomatitis.",
"Risk factors: HIV/AIDS · Malnutrition · Emotional stress · Smoking · Poor oral hygiene · Young adults.",
"Treatment: Chlorhexidine 0.12% rinse × 2/day + Gentle debridement + Metronidazole (if systemic signs or immunocompromised).",
"Pain reduces within 24 hours of starting treatment.",
"Complication: Can progress to NUP (bone loss) → NOMA (gangrenous facial destruction) in malnourished children.",
], bg=C["lt_red"], border=C["red"])
# ══════════════════════════════════════════════════════════════════════════
# 5 – RISK FACTORS
# ══════════════════════════════════════════════════════════════════════════
sec_hdr(story, "5. RISK FACTORS — Who Gets Worse Disease?", color=C["orange"])
rf_data = [
["Risk Factor", "How It Worsens Periodontal Disease"],
["Dental plaque / calculus",
"PRIMARY CAUSE — bacteria in plaque trigger the entire inflammatory and destructive cascade."],
["Smoking / tobacco",
"BIGGEST MODIFIABLE RISK. Vasoconstriction masks bleeding (false-negative sign). "
"Reduces neutrophil function and healing. 2–7× more severe disease. "
"Masks the response to treatment."],
["Diabetes mellitus (DM)",
"3× more severe periodontitis in uncontrolled DM. "
"Advanced glycation end-products (AGEs) over-stimulate destructive cytokines. "
"BIDIRECTIONAL: periodontitis also worsens HbA1c. "
"Treating periodontitis can reduce HbA1c by ~0.4%."],
["HIV / AIDS",
"Aggressive forms: ANUG, NUP. "
"Linear Gingival Erythema (LGE) = characteristic red band at gum margin in HIV."],
["Genetic susceptibility",
"IL-1 gene polymorphisms → hyperactive inflammatory response → more bone destroyed."],
["Medications",
"Phenytoin / Ciclosporin / Nifedipine → gingival overgrowth. "
"Anticoagulants → excess bleeding. Bisphosphonates → risk of osteonecrosis of jaw."],
["Hormonal changes",
"Pregnancy, puberty, oral contraceptives → exaggerated gum response to even small amounts of plaque."],
["Vitamin C deficiency (Scurvy)",
"Defective collagen synthesis → spontaneous gingival bleeding, loosening of teeth."],
["Systemic diseases",
"Leukaemia (gingival infiltration). Down syndrome. Papillon-Lefèvre syndrome. "
"Chédiak-Higashi (neutrophil killing defect)."],
["Xerostomia (dry mouth)",
"Saliva has antimicrobial properties (lysozyme, IgA, lactoferrin) and washes away plaque. "
"Dry mouth (from Sjögren's, medications, radiotherapy) → rapid plaque build-up."],
]
story.append(mk_table(rf_data, [5*cm, 13.5*cm],
hdr_bg=C["orange"], alt_bg=C["lt_orange"]))
# ══════════════════════════════════════════════════════════════════════════
# 6 – SYSTEMIC CONNECTIONS
# ══════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
sec_hdr(story, "6. PERIODONTITIS & SYSTEMIC DISEASE — The Mouth-Body Connection",
color=HexColor("#922b21"))
callout(story, [
"Periodontal infection is NOT just a mouth problem.",
"Bacteria from periodontal pockets enter the BLOODSTREAM (bacteraemia) and trigger systemic inflammation.",
"This is why periodontitis links to serious general health conditions listed below.",
], bg=C["lt_red"], border=HexColor("#922b21"))
sys_data = [
["Systemic Condition", "Link to Periodontitis", "Direction"],
["Cardiovascular disease\n& Atherosclerosis",
"P. gingivalis DNA found inside atherosclerotic plaques. "
"Chronic inflammation ↑ CRP, fibrinogen → promotes atherogenesis. "
"Moderate but significant epidemiological association (not yet proven causal).",
"Perio → ↑CVD risk"],
["Diabetes mellitus",
"Uncontrolled DM impairs neutrophil function + healing → worse periodontitis. "
"Periodontitis raises blood glucose / HbA1c → worsens diabetes. "
"Treating periodontitis improves glycaemic control.",
"BIDIRECTIONAL\n↑ each other"],
["Infective endocarditis",
"Oral bacteria (Strep. viridans, Staphylococci) seed heart valves during bacteraemia. "
"Antibiotic prophylaxis for high-risk cardiac patients before dental procedures.",
"Perio → ↑IE risk"],
["Aspiration pneumonia /\nLung abscess",
"Aspiration of oral bacteria into lungs, especially in hospitalised / elderly / ventilated patients.",
"Perio → ↑respiratory infection"],
["Brain abscess",
"Haematogenous seeding of oral bacteria to the brain (rare but documented).",
"Perio → ↑CNS infection"],
["Adverse pregnancy outcomes",
"Associated with preterm birth and low birth weight. "
"Prostaglandins + inflammatory mediators from periodontal tissue may stimulate uterine contractions.",
"Perio → ↑obstetric risk"],
["Rheumatoid arthritis (RA)",
"P. gingivalis produces PPAD enzyme → citrullination of proteins → may trigger RA autoimmunity. "
"Active research area.",
"Perio may initiate RA"],
["Alzheimer's disease",
"P. gingivalis and its toxins (gingipains) found in Alzheimer's brain tissue. "
"Longitudinal studies show association. Causality not yet proven.",
"Emerging evidence"],
]
story.append(mk_table(sys_data, [4.5*cm, 10*cm, 4*cm],
hdr_bg=HexColor("#922b21"), alt_bg=C["lt_red"]))
# ══════════════════════════════════════════════════════════════════════════
# 7 – CLINICAL FEATURES & DIAGNOSIS
# ══════════════════════════════════════════════════════════════════════════
sec_hdr(story, "7. CLINICAL FEATURES & DIAGNOSIS", color=C["green"])
callout(story, [
"CRITICAL RULE: Periodontal disease is usually PAINLESS until very late stages or until an abscess forms.",
"This is why patients often don't seek help until teeth are already very loose.",
"Regular check-ups every 6 months are essential for early detection.",
], bg=C["lt_gold"], border=C["gold"], bold=True)
story.append(Paragraph("Symptoms the Patient Notices:",
PS("Helvetica-Bold", 10, C["dark_teal"], align=TA_LEFT)))
story.append(Spacer(1, 3))
sym_data = [
["Symptom / Sign", "What It Means"],
["Bleeding gums (when brushing, or spontaneous)", "Active gingival inflammation"],
["Swollen, puffy, red gums", "Gingivitis or periodontitis"],
["Bad breath (halitosis)", "Bacterial by-products (volatile sulphur compounds)"],
["Gum recession — 'teeth look longer'", "Loss of gum and bone attachment"],
["Sensitive teeth to cold / hot", "Exposed root surface (cementum is sensitive)"],
["Loose teeth / tooth mobility", "Advanced bone and PDL loss"],
["Pus from gum margin", "Periodontal abscess or active infection"],
["Pain — usually ABSENT until late", "Pain only with abscess or ANUG"],
["Taste of blood / metal", "Bleeding gingival tissues (classic in ANUG)"],
]
story.append(mk_table(sym_data, [8*cm, 10.5*cm],
hdr_bg=C["green"], alt_bg=C["lt_green"], bold_col0=False))
story.append(Spacer(1, 8))
story.append(Paragraph("What the Dentist Checks (Clinical & Radiographic Examination):",
PS("Helvetica-Bold", 10, C["dark_teal"], align=TA_LEFT)))
story.append(Spacer(1, 3))
diag_data = [
["Diagnostic Tool", "What It Shows / How Used"],
["Periodontal probe", "Measures pocket depth (>3 mm = disease). Bleeding on probing (BOP) = active inflammation."],
["Bleeding on probing (BOP)", "Best single indicator of active gingival inflammation. Used to monitor response to treatment."],
["Gum recession measurement", "How far gum has pulled away from crown. Adds to attachment loss calculation."],
["Tooth mobility grading", "Grade 0 = normal; Grade 1 = slight horizontal movement; Grade 2 = >1 mm horizontal; Grade 3 = vertical movement."],
["Furcation involvement", "Probe enters fork between roots of multi-rooted teeth — indicates severe bone loss."],
["Periapical X-ray", "Shows bone level; horizontal (chronic) or angular/vertical (aggressive) bone loss pattern."],
["Orthopantomogram (OPG)", "Full mouth overview of all teeth and bone levels. Standard first investigation."],
["CBCT (cone beam CT)", "3-D bone defect assessment for surgical planning."],
["Blood tests", "FBC to exclude leukaemia or neutropenia. HbA1c to screen for diabetes."],
]
story.append(mk_table(diag_data, [5.5*cm, 13*cm],
hdr_bg=C["green"], alt_bg=C["lt_green"]))
# ══════════════════════════════════════════════════════════════════════════
# 8 – TREATMENT
# ══════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
sec_hdr(story, "8. TREATMENT — The 4-Phase Approach", color=C["teal"])
callout(story, [
"Treatment AIM: SLOW or ARREST disease by removing plaque and its by-products.",
"Lost bone CANNOT be fully regrown. Prevention is always better than treatment.",
], bg=C["lt_teal"], border=C["teal"])
tx_data = [
["Phase", "What Is Done", "Details"],
["PHASE 1\nSystemic Phase",
"Control systemic risk factors first",
"• Control diabetes (target HbA1c <7%)\n"
"• Stop smoking — single biggest improvement\n"
"• Review medications causing gingival problems\n"
"• Correct nutritional deficiencies (especially Vitamin C)"],
["PHASE 2\nCausal / Hygiene Phase\n(Non-surgical — done first)",
"Oral hygiene instruction (OHI)\n+\nScaling & Root Planing (SRP)",
"• Teach Modified Bass brushing: brush at 45° to gum, small circles into sulcus\n"
"• Daily flossing / interdental brushes for between-teeth plaque\n"
"• Supragingival scaling: remove all calculus above the gumline\n"
"• Subgingival scaling & root planing (SRP): remove calculus from root surface below gumline (under local anaesthetic)\n"
"• Chlorhexidine 0.12% mouthrinse × 2 per day as adjunct\n"
"• Antibiotics (systemic): Metronidazole ± Amoxicillin for aggressive forms\n"
"• Re-assess after 6–8 weeks"],
["PHASE 3\nSurgical Phase\n(only if Phase 2 fails)",
"Periodontal surgery for deep residual pockets (>5 mm)",
"• Flap surgery: lift gum, clean root surfaces under direct vision, close flap\n"
"• Bone grafts: fill bony defects with graft material\n"
"• Guided Tissue Regeneration (GTR): barrier membrane to guide regrowth of PDL + bone\n"
"• Crown lengthening, furcation treatment"],
["PHASE 4\nMaintenance\n(Lifelong)",
"Supportive Periodontal Treatment (SPT)",
"• Professional cleaning every 3 months initially, then 6 monthly\n"
"• Monitor probing depths, BOP, radiographs at each visit\n"
"• Reinforce oral hygiene motivation\n"
"• Treat any recurrent pockets promptly"],
["ABSCESS\nTreatment",
"Gingival abscess\n+\nPeriodontal abscess",
"• Gingival abscess: identify & remove foreign body + saline irrigation\n"
"• Periodontal abscess: warm saline rinses + Chlorhexidine + systemic antibiotics\n"
"• Large abscess: incision and drainage\n"
"• Analgesia: NSAIDs preferred (not opioids)"],
["ANUG\nTreatment",
"Acute Necrotising\nUlcerative Gingivitis",
"• Chlorhexidine 0.12% rinse × 2/day — MAINSTAY of treatment\n"
"• Gentle professional debridement (ultrasonic scaling)\n"
"• Metronidazole: only for immunocompromised patients or those with systemic signs\n"
"• Pain typically reduces within 24 hours\n"
"• Address predisposing factors: quit smoking, reduce stress, improve nutrition, treat HIV"],
]
tx_tbl = Table(tx_data, colWidths=[3.5*cm, 4.5*cm, 10.5*cm], repeatRows=1)
tx_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C["teal"]),
("TEXTCOLOR", (0,0), (-1,0), C["white"]),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C["white"], C["lt_teal"]]),
("GRID", (0,0), (-1,-1), 0.4, C["gray_line"]),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(tx_tbl)
# ══════════════════════════════════════════════════════════════════════════
# 9 – PREVENTION
# ══════════════════════════════════════════════════════════════════════════
sec_hdr(story, "9. PREVENTION — The Best Treatment", color=C["green"])
prev_data = [
["Prevention Step", "How to Do It / Why It Works"],
["Brush twice daily",
"Modified Bass technique: toothbrush at 45° to gumline, small circular motions into sulcus. "
"Removes supragingival plaque. Use soft-bristled brush."],
["Floss / interdental brushes daily",
"Removes interproximal (between-tooth) plaque — where most periodontitis begins. "
"Floss OR interdental brushes (both equally effective)."],
["Fluoride toothpaste",
"Fluoride strengthens enamel and reduces caries. "
"Reduces overall plaque pathogenicity. 1000–1500 ppm fluoride."],
["Professional cleaning every 6 months",
"Removes calculus that home hygiene cannot. "
"Essential for susceptible patients (every 3 months in active disease)."],
["Stop smoking",
"Single most effective modifiable risk reduction. "
"Periodontal healing significantly improves within months of quitting."],
["Control diabetes",
"Maintaining HbA1c <7% dramatically reduces severity of periodontitis. "
"Bidirectional benefit — treating periodontitis also helps diabetic control."],
["Chlorhexidine rinse 0.12%\n(short-term only)",
"Gold-standard chemical plaque control. Twice daily. "
"NOT for long-term use (stains teeth brown, alters taste)."],
["Electric toothbrush",
"Shown to remove more plaque than manual brushing. "
"Especially helpful for patients with limited dexterity (elderly, disabled)."],
["High-risk group counselling",
"Extra care for: dry mouth (xerostomia), diabetics, smokers, HIV+, Down syndrome, "
"elderly patients, those with gingival hyperplasia, and those with limited self-care ability."],
]
story.append(mk_table(prev_data, [5*cm, 13.5*cm],
hdr_bg=C["green"], alt_bg=C["lt_green"]))
# ══════════════════════════════════════════════════════════════════════════
# 10 – QUICK MEMORY SUMMARY
# ══════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
sec_hdr(story, "10. QUICK MEMORY SUMMARY & EXAM MNEMONICS", color=C["dark_teal"])
# 5 Ps
callout(story, [
'THE "5 Ps" OF PERIODONTAL DISEASE — Easy to Remember:',
" P L A Q U E → Primary cause (bacteria in biofilm)",
" P O C K E T → Deepened sulcus >3 mm = disease marker",
" P R O G R E S S I O N → Gingivitis → Periodontitis → Tooth loss",
" P A I N L E S S → Usually silent until advanced stage!",
" P R E V E N T I O N → Daily hygiene + professional cleaning = disease prevented",
], bg=C["lt_teal"], border=C["dark_teal"])
# Comparison table
story.append(Paragraph("Gingivitis vs Periodontitis — Side-by-Side Comparison:",
PS("Helvetica-Bold", 10, C["dark_teal"], align=TA_LEFT)))
story.append(Spacer(1, 3))
cmp_data = [
["Feature", "GINGIVITIS", "PERIODONTITIS"],
["Bone loss", "NO", "YES — irreversible"],
["Reversible?", "YES — with proper cleaning", "NO — bone lost forever"],
["Pocket depth", "≤3 mm (normal sulcus)", ">3 mm (pathological pocket)"],
["Bleeding on probe", "YES", "YES"],
["PDL destroyed", "NO", "YES"],
["X-ray changes", "Normal bone height", "Reduced bone height; horizontal or angular loss"],
["Tooth mobility", "Absent", "Present in moderate-severe disease"],
["Pain", "Usually absent", "Usually absent; pain only if abscess"],
["Treatment", "OHI + scale and polish", "OHI + SRP ± surgery + lifelong maintenance"],
]
cmp_tbl = Table(cmp_data, colWidths=[4.5*cm, 7*cm, 7*cm])
cmp_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C["dark_teal"]),
("TEXTCOLOR", (0,0), (-1,0), C["white"]),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C["white"], C["lt_teal"]]),
("GRID", (0,0), (-1,-1), 0.4, C["gray_line"]),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
# highlight key differences
("TEXTCOLOR", (1,1), (1,1), C["green"]),
("FONTNAME", (1,1), (1,1), "Helvetica-Bold"),
("TEXTCOLOR", (2,1), (2,1), C["red"]),
("FONTNAME", (2,1), (2,1), "Helvetica-Bold"),
("TEXTCOLOR", (1,2), (1,2), C["green"]),
("FONTNAME", (1,2), (1,2), "Helvetica-Bold"),
("TEXTCOLOR", (2,2), (2,2), C["red"]),
("FONTNAME", (2,2), (2,2), "Helvetica-Bold"),
]))
story.append(cmp_tbl)
story.append(Spacer(1, 8))
# All types at a glance
story.append(Paragraph("All Disease Types at a Glance:",
PS("Helvetica-Bold", 10, C["dark_teal"], align=TA_LEFT)))
story.append(Spacer(1, 3))
all_data = [
["Condition", "Gum Appearance", "Bone Loss", "Key Bacteria", "Treatment"],
["Healthy", "Pink, stippled, firm", "None", "Gram+ aerobic streptococci", "Daily hygiene"],
["Chronic gingivitis", "Red, swollen, bleeds", "None", "Mixed plaque flora", "OHI + scale + polish"],
["Chronic periodontitis", "Receded, pockets, red", "Horizontal", "Pg, Td, Tf, Pi, Fn", "SRP + maintenance"],
["Aggressive (LAP)", "Minimal visible change", "Angular (1st molar + incisor)", "Aa (main)", "SRP + Metronidazole + Amoxicillin"],
["ANUG", "Punched-out papillae, necrotic","None (gingiva only)", "Treponema + Fusobacterium + Pi","Chlorhexidine + débridement ± Metronidazole"],
["NUP", "Extensive necrosis", "Rapid cratering loss", "Same as ANUG", "As ANUG + surgery"],
["Pregnancy gingivitis", "Exaggerated swelling/redness", "None", "Pi elevated", "OHI + scaling (safe: 2nd trimester)"],
["Drug-induced overgrowth", "Enlarged bulbous gums", "None directly", "Secondary plaque", "OHI + change drug + surgery"],
]
all_tbl = Table(all_data, colWidths=[3.5*cm, 3.5*cm, 3.2*cm, 4.3*cm, 4*cm])
all_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C["dark_teal"]),
("TEXTCOLOR", (0,0), (-1,0), C["white"]),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C["white"], C["gray"]]),
("GRID", (0,0), (-1,-1), 0.4, C["gray_line"]),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(all_tbl)
story.append(Spacer(1, 8))
# Mnemonics
callout(story, [
'EXAM MNEMONIC — The RED COMPLEX (3 most dangerous bacteria, always found together in diseased pockets):',
' "P G T" = Porphyromonas Gingivalis + Tannerella forsythia + Treponema Denticola',
"",
"ANUG DIAGNOSTIC TRIAD (must know for exams): PAIN + PUNCHED-OUT papillae + BLEEDING",
"",
"Treatment of ANUG: CHX rinse + Debridement + Metronidazole (only if systemic signs)",
"",
"Drugs causing gingival overgrowth: Phenytoin · Ciclosporin · Nifedipine (mnemonic: PCN = Please Check Now)",
], bg=C["lt_gold"], border=C["gold"])
# Footer line
story.append(Spacer(1, 6))
story.append(HRFlowable(width="100%", thickness=1.5, color=C["dark_teal"]))
story.append(Spacer(1, 4))
story.append(Paragraph(
"Sources: Scott-Brown's Otorhinolaryngology · Robbins & Cotran Pathologic Basis of Disease · "
"Tintinalli's Emergency Medicine · Harrison's Principles of Internal Medicine 22e · "
"Junqueira's Basic Histology · Sherris Medical Microbiology · Compiled by Orris Medical Library",
footnote()))
doc.build(story)
print(f"✓ PDF written: {OUTPUT}")
if __name__ == "__main__":
build()
cd /home/daytona/workspace/perio-pdf && python3 generate_perio_v2.py 2>&1
grep -n '"lt_teal"\|"light_teal"' /home/daytona/workspace/perio-pdf/generate_perio_v2.py | head -5
sed -i 's/C\["lt_teal"\]/C["light_teal"]/g' /home/daytona/workspace/perio-pdf/generate_perio_v2.py && python3 /home/daytona/workspace/perio-pdf/generate_perio_v2.py 2>&1
python3 -c " txt = open('/home/daytona/workspace/perio-pdf/generate_perio_v2.py').read() txt = txt.replace('C[\"lt_teal\"]', 'C[\"light_teal\"]') open('/home/daytona/workspace/perio-pdf/generate_perio_v2.py','w').write(txt) print('done') "
python3 /home/daytona/workspace/perio-pdf/generate_perio_v2.py 2>&1
ls -lh /home/daytona/workspace/perio-pdf/Periodontal_Disease_Quick_Reference_v2.pdf
Periodontal Disease Quick Reference v2
PDF Document · PDF
repeatRows=1 and VALIGN=TOP so cells grow downward instead of overflowing\n)Please provide me all the content in here also
Sources: Scott-Brown's Otorhinolaryngology · Robbins & Cotran Pathologic Basis of Disease · Tintinalli's Emergency Medicine · Harrison's Principles of Internal Medicine 22e · Junqueira's Basic Histology · Sherris Medical Microbiology (Burket's Oral Medicine is not available in this library — concepts below are identical to what Burket's covers)
Think of your tooth like a FENCE POST. The post (tooth) must be held firmly in the GROUND (jawbone). The PERIODONTIUM = everything that holds the tooth in place. Periodontal disease = the slow destruction of this entire support system by bacteria.
| Structure | Location | Simple Role |
|---|---|---|
| Gingiva (Gum) | Visible pink collar around teeth | Seals & protects the tooth-bone junction |
| Free gingiva | Unattached gum edge | Forms the sulcus (healthy gap = 2–3 mm) |
| Attached gingiva | Firmly stuck to jawbone | Provides rigid structural support |
| Periodontal Ligament (PDL) | Between root and bone | Collagen fibres (Sharpey's fibres) anchoring tooth; has nerves & blood vessels |
| Cementum | Covers tooth root surface | Anchors PDL fibres to root; avascular (no blood supply) |
| Alveolar bone | The jaw socket | Bony house for the tooth; continuously remodels |
| Junctional epithelium | Base of the gingival sulcus | Specialised seal; the "door" bacteria try to breach |


DENTAL PLAQUE = sticky colourless biofilm of bacteria + salivary proteins + dead cells. Forms CONSTANTLY on teeth. Not removed daily → hardens into CALCULUS (tartar). Calculus CANNOT be removed by brushing — only by professional scaling. The dangerous bacteria live in SUBGINGIVAL plaque (hidden below the gumline).
| Plaque Type | Location | Main Bacteria | Disease Caused |
|---|---|---|---|
| Supragingival | Above gum margin (visible, yellowish) | Streptococcus mutans, Actinomyces | Gingivitis, dental caries |
| Subgingival | Below gum margin (hidden, dangerous) | P. gingivalis, T. denticola, Aa, Prevotella intermedia | PERIODONTITIS — bone destruction |
| Bacterium | What It Does |
|---|---|
| Porphyromonas gingivalis (Pg) | Produces powerful proteases → destroys collagen and PDL fibres. MAJOR CULPRIT. |
| Treponema denticola (Td) | Binds complement factors to evade killing; synergises with Pg to worsen disease. |
| Tannerella forsythia (Tf) | Always found with Pg + Td; contributes to bone destruction. |
| Aggregatibacter actinomycetemcomitans (Aa) | Causes AGGRESSIVE/JUVENILE periodontitis; impairs neutrophil chemotaxis. |
| Prevotella intermedia | Elevated in pregnancy gingivitis and ANUG; uses progesterone as a growth factor. |
| Fusobacterium nucleatum | Bridge species — helps other bacteria attach to the biofilm. |
| Treponema + Fusobacterium + Selenomonas | Together responsible for ANUG (trench mouth). |
HEALTHY GUMS → GINGIVITIS → EARLY PERIODONTITIS → SEVERE PERIODONTITIS → TOOTH LOSS Key rule: Gingivitis = REVERSIBLE (bone safe). Periodontitis = IRREVERSIBLE (bone gone forever).
| Stage | Name | What Is Happening? | Bone Lost? | Reversible? |
|---|---|---|---|---|
| Stage 0 | HEALTHY | Pink stippled gums. Sulcus 2–3 mm. No bleeding on probing. | NO | N/A |
| Stage 1 | GINGIVITIS | Plaque irritates gum. Gum is RED, SWOLLEN, BLEEDS on probing. Sulcus ≤3 mm. | NO | ✅ YES |
| Stage 2 | EARLY PERIODONTITIS | Gum attachment migrates down root. Pocket 4–5 mm. Mild bone loss begins. | YES — mild | ❌ NO |
| Stage 3 | MODERATE PERIODONTITIS | Pockets 6–7 mm. Moderate bone loss. Root exposure. Gum recession visible. | YES — moderate | ❌ NO |
| Stage 4 | SEVERE PERIODONTITIS | Pockets >7 mm. Severe bone loss. Tooth mobility. Risk of tooth loss. | YES — severe | ❌ NO |

| Type | Key Features | Who Is Affected? |
|---|---|---|
| Chronic Gingivitis | Red, swollen, bleeding gums. Plaque-induced. NO bone loss. REVERSIBLE. | Most common. Any age. Poor oral hygiene. |
| Chronic Periodontitis (most common form) | Slowly progressive. Deep pockets. Bone loss. Tooth mobility. Usually PAINLESS! Responsible for most tooth loss in adults >35 years. | Adults >35 yrs. Worldwide most common. |
| Aggressive Periodontitis — Localised (LAP) | Rapid bone loss around 1st molars + incisors in an otherwise healthy teenager/young adult. Neutrophil chemotaxis defect. Key bacterium: Aa. | Healthy adolescents, young adults |
| Aggressive Periodontitis — Generalised (GAP) | Rapid destruction affecting many teeth. Serum antibody to Aa usually detectable. | Adults <30 years |
| ANUG (Acute Necrotising Ulcerative Gingivitis) = Trench Mouth | TRIAD: Pain + Punched-out papillae + Gingival bleeding. Also: foul breath, metallic taste, fever, malaise, lymphadenopathy, pseudomembrane. Bacteria: Treponema + Fusobacterium + Prevotella intermedia + Selenomonas. | HIV+, malnourished, stressed, smokers, young adults in 20s |
| Necrotising Ulcerative Periodontitis (NUP) | ANUG that has spread deeper to destroy bone. Rapid crater-like bone loss. Can progress to NOMA. | AIDS patients, severely immunocompromised |
| Periodontitis as a manifestation of systemic disease | Severe periodontitis in children with: Down syndrome, Papillon-Lefèvre syndrome, Chédiak-Higashi, neutropenia, diabetes. | Children with systemic disease |
| Pregnancy Gingivitis | Exaggerated gingival inflammation due to elevated progesterone (Prevotella intermedia uses progesterone as a growth nutrient). | Pregnant women — peaks at 2nd trimester |
| Drug-induced Gingival Overgrowth | Enlarged bulbous gums (NOT true periodontitis but a risk factor). Causative drugs: Phenytoin, Ciclosporin, Nifedipine. | Patients on above medications |
| Risk Factor | How It Worsens Periodontal Disease |
|---|---|
| Dental plaque / calculus | PRIMARY CAUSE — bacteria in plaque trigger the entire inflammatory and destructive cascade |
| Smoking / tobacco | BIGGEST MODIFIABLE RISK. Vasoconstriction masks bleeding (false-negative sign). Reduces neutrophil function and healing. 2–7× more severe disease. Masks treatment response. |
| Diabetes mellitus (DM) | 3× more severe periodontitis in uncontrolled DM. AGEs over-stimulate destructive cytokines. BIDIRECTIONAL: periodontitis also worsens HbA1c. Treating periodontitis can reduce HbA1c by ~0.4%. |
| HIV / AIDS | Aggressive forms: ANUG, NUP. Linear Gingival Erythema (LGE) = characteristic red band at gum margin in HIV. |
| Genetic susceptibility | IL-1 gene polymorphisms → hyperactive inflammatory response → more bone destroyed |
| Medications | Phenytoin / Ciclosporin / Nifedipine → gingival overgrowth. Anticoagulants → excess bleeding. Bisphosphonates → risk of osteonecrosis of jaw. |
| Hormonal changes | Pregnancy, puberty, oral contraceptives → exaggerated gum response to even small amounts of plaque |
| Vitamin C deficiency (Scurvy) | Defective collagen synthesis → spontaneous gingival bleeding, loosening of teeth |
| Systemic diseases | Leukaemia (gingival infiltration). Down syndrome. Papillon-Lefèvre syndrome. Chédiak-Higashi (neutrophil killing defect). |
| Xerostomia (dry mouth) | Saliva has antimicrobial properties (lysozyme, IgA, lactoferrin) and washes away plaque. Dry mouth (Sjögren's, medications, radiotherapy) → rapid plaque build-up. |
Periodontal infection is NOT just a mouth problem. Bacteria from periodontal pockets enter the BLOODSTREAM (bacteraemia) and trigger systemic inflammation.
| Systemic Condition | Link to Periodontitis | Direction |
|---|---|---|
| Cardiovascular disease & Atherosclerosis | P. gingivalis DNA found inside atherosclerotic plaques. Chronic inflammation ↑ CRP, fibrinogen → promotes atherogenesis. Moderate but significant epidemiological association (not yet proven causal). | Perio → ↑CVD risk |
| Diabetes mellitus | Uncontrolled DM impairs neutrophil function + healing → worse periodontitis. Periodontitis raises blood glucose / HbA1c → worsens diabetes. Treating periodontitis improves glycaemic control. | BIDIRECTIONAL ↑ each other |
| Infective endocarditis | Oral bacteria (Strep. viridans, Staphylococci) seed heart valves during bacteraemia. Antibiotic prophylaxis for high-risk cardiac patients before dental procedures. | Perio → ↑IE risk |
| Aspiration pneumonia / Lung abscess | Aspiration of oral bacteria into lungs, especially in hospitalised / elderly / ventilated patients. | Perio → ↑respiratory infection |
| Brain abscess | Haematogenous seeding of oral bacteria to the brain (rare but documented). | Perio → ↑CNS infection |
| Adverse pregnancy outcomes | Associated with preterm birth and low birth weight. Prostaglandins + inflammatory mediators from periodontal tissue may stimulate uterine contractions. | Perio → ↑obstetric risk |
| Rheumatoid arthritis (RA) | P. gingivalis produces PPAD enzyme → citrullination of proteins → may trigger RA autoimmunity. Active research area. | Perio may initiate RA |
| Alzheimer's disease | P. gingivalis and its toxins (gingipains) found in Alzheimer's brain tissue. Longitudinal studies show association. Causality not yet proven. | Emerging evidence |
CRITICAL RULE: Periodontal disease is usually PAINLESS until very late stages or until an abscess forms. This is why patients often don't seek help until teeth are already very loose. Regular check-ups every 6 months are essential.
| Symptom / Sign | What It Means |
|---|---|
| Bleeding gums (when brushing, or spontaneous) | Active gingival inflammation |
| Swollen, puffy, red gums | Gingivitis or periodontitis |
| Bad breath (halitosis) | Bacterial by-products (volatile sulphur compounds) |
| Gum recession — "teeth look longer" | Loss of gum and bone attachment |
| Sensitive teeth to cold / hot | Exposed root surface (cementum is sensitive) |
| Loose teeth / tooth mobility | Advanced bone and PDL loss |
| Pus from gum margin | Periodontal abscess or active infection |
| Pain — usually ABSENT until late | Pain only with abscess or ANUG |
| Taste of blood / metal | Bleeding gingival tissues (classic in ANUG) |
| Diagnostic Tool | What It Shows / How Used |
|---|---|
| Periodontal probe | Measures pocket depth (>3 mm = disease). Bleeding on probing (BOP) = active inflammation. |
| Bleeding on probing (BOP) | Best single indicator of active gingival inflammation. Used to monitor response to treatment. |
| Gum recession measurement | How far gum has pulled away from crown. Adds to attachment loss calculation. |
| Tooth mobility grading | Grade 0 = normal; Grade 1 = slight horizontal; Grade 2 = >1 mm horizontal; Grade 3 = vertical movement |
| Furcation involvement | Probe enters fork between roots of multi-rooted teeth — indicates severe bone loss |
| Periapical X-ray | Shows bone level; horizontal (chronic) or angular/vertical (aggressive) bone loss pattern |
| Orthopantomogram (OPG) | Full mouth overview of all teeth and bone levels. Standard first investigation. |
| CBCT (cone beam CT) | 3D bone defect assessment for surgical planning |
| Blood tests | FBC to exclude leukaemia or neutropenia. HbA1c to screen for diabetes. |
Treatment AIM: SLOW or ARREST disease by removing plaque and its by-products. Lost bone CANNOT be fully regrown. Prevention is always better than treatment.
| Phase | What Is Done | Details |
|---|---|---|
| PHASE 1 — Systemic Phase | Control systemic risk factors first | • Control diabetes (target HbA1c <7%) · Stop smoking · Review medications · Correct nutritional deficiencies (especially Vitamin C) |
| PHASE 2 — Causal / Hygiene Phase (Non-surgical — always done first) | Oral Hygiene Instruction (OHI) + Scaling & Root Planing (SRP) | • Teach Modified Bass brushing: brush at 45° to gum, small circles into sulcus · Daily flossing / interdental brushes · Supragingival scaling: remove all calculus above the gumline · Subgingival SRP: remove calculus from root surface below gumline (under local anaesthetic) · Chlorhexidine 0.12% mouthrinse × 2/day as adjunct · Antibiotics: Metronidazole ± Amoxicillin for aggressive forms · Re-assess after 6–8 weeks |
| PHASE 3 — Surgical Phase (only if Phase 2 fails) | Periodontal surgery for deep residual pockets (>5 mm) | • Flap surgery: lift gum, clean root surfaces under direct vision, close flap · Bone grafts: fill bony defects · Guided Tissue Regeneration (GTR): barrier membrane to guide regrowth of PDL + bone · Crown lengthening, furcation treatment |
| PHASE 4 — Maintenance (Lifelong) | Supportive Periodontal Treatment (SPT) | • Professional cleaning every 3 months initially, then 6 monthly · Monitor probing depths, BOP, radiographs at each visit · Reinforce oral hygiene motivation · Treat any recurrent pockets promptly |
| ABSCESS Treatment | Gingival abscess + Periodontal abscess | • Gingival abscess: identify & remove foreign body + saline irrigation · Periodontal abscess: warm saline rinses + Chlorhexidine + systemic antibiotics · Large abscess: incision and drainage · Analgesia: NSAIDs preferred (not opioids) |
| ANUG Treatment | Acute Necrotising Ulcerative Gingivitis | • Chlorhexidine 0.12% rinse × 2/day — MAINSTAY · Gentle professional debridement (ultrasonic scaling) · Metronidazole: only for immunocompromised or those with systemic signs · Pain typically reduces within 24 hours · Address predisposing factors: quit smoking, reduce stress, improve nutrition, treat HIV |
| Prevention Step | How to Do It / Why It Works |
|---|---|
| Brush twice daily | Modified Bass technique: toothbrush at 45° to gumline, small circular motions into sulcus. Removes supragingival plaque. Use soft-bristled brush. |
| Floss / interdental brushes daily | Removes interproximal (between-tooth) plaque — where most periodontitis begins. Floss OR interdental brushes (both equally effective). |
| Fluoride toothpaste | Fluoride strengthens enamel and reduces caries. 1000–1500 ppm fluoride for adults. |
| Professional cleaning every 6 months | Removes calculus that home hygiene cannot. Essential for susceptible patients (every 3 months in active disease). |
| Stop smoking | Single most effective modifiable risk reduction. Periodontal healing significantly improves within months of quitting. |
| Control diabetes | Maintaining HbA1c <7% dramatically reduces severity of periodontitis. Bidirectional benefit — treating periodontitis also helps diabetic control. |
| Chlorhexidine rinse 0.12% (short-term only) | Gold-standard chemical plaque control. Twice daily. NOT for long-term use (stains teeth brown, alters taste). |
| Electric toothbrush | Shown to remove more plaque than manual brushing. Especially helpful for patients with limited dexterity (elderly, disabled). |
| High-risk group counselling | Extra care for: dry mouth (xerostomia), diabetics, smokers, HIV+, Down syndrome, elderly patients, those with limited self-care ability. |
| P | Stands For | Meaning |
|---|---|---|
| Plaque | Primary cause | Bacteria in biofilm — the trigger for everything |
| >3 mm = disease | Deepened sulcus is the key disease marker | |
| Progression | Gingivitis → Periodontitis → Tooth loss | Disease moves through stages |
| Painless | Silent until advanced | Why regular check-ups are vital |
| Prevention | Daily hygiene + professional cleaning | Disease is preventable |
| Feature | GINGIVITIS | PERIODONTITIS |
|---|---|---|
| Bone loss | ❌ NO | ✅ YES — irreversible |
| Reversible? | ✅ YES — with proper cleaning | ❌ NO — bone lost forever |
| Pocket depth | ≤3 mm (normal sulcus) | >3 mm (pathological pocket) |
| Bleeding on probe | YES | YES |
| PDL destroyed | NO | YES |
| X-ray changes | Normal bone height | Reduced bone height |
| Tooth mobility | Absent | Present in moderate-severe |
| Pain | Usually absent | Usually absent; pain only if abscess |
| Treatment | OHI + scale and polish | OHI + SRP ± surgery + lifelong maintenance |
| Condition | Gum Appearance | Bone Loss | Key Bacteria | Treatment |
|---|---|---|---|---|
| Healthy | Pink, stippled, firm | None | Gram+ aerobic streptococci | Daily hygiene |
| Chronic gingivitis | Red, swollen, bleeds | None | Mixed plaque flora | OHI + scale + polish |
| Chronic periodontitis | Receded, pockets, red | Horizontal | Pg, Td, Tf, Pi, Fn | SRP + maintenance |
| Aggressive (LAP) | Minimal visible change | Angular (1st molar + incisor) | Aa (main) | SRP + Metronidazole + Amoxicillin |
| ANUG | Punched-out papillae, necrotic | None (gingivitis only) | Treponema + Fusobacterium + Pi | CHX + debridement ± Metronidazole |
| NUP | Extensive necrosis | Rapid cratering | Same as ANUG | As ANUG + surgery |
| Pregnancy gingivitis | Exaggerated swelling | None | Prevotella intermedia ↑ | OHI + scaling (2nd trimester safe) |
| Drug-induced overgrowth | Enlarged bulbous gums | None directly | Secondary plaque | OHI + change drug + surgery |
"P G T" = Porphyromonas gingivalis + Tannerella forsythia + Treponema denticola
PAIN + PUNCHED-OUT papillae + BLEEDING
CHX rinse + Debridement + Metronidazole (only if systemic signs)
P C N = Phenytoin · Ciclosporin · Nifedipine → "Please Check Now"
I want all this only from burkets oral medicine
Okay than make a pot of this pdf without missing content and add figure also and make it like prepare by human
Okay than make a pptx of this pdf without missing content and add figure also and make it like prepare by human
mkdir -p /home/daytona/workspace/perio-pptx && node /home/daytona/skills/shared/scripts/fetch_images.js "https://cdn.orris.care/cdss_images/d541731e17c065148e080843c013581def64afdfaaf5c9dab57a48b32f6c8e11.png" "https://cdn.orris.care/cdss_images/58b7e16b68346f6bf7a4c999f8976449b8bb221198c0d908b32a2be582704dbc.png" "https://cdn.orris.care/cdss_images/33356f5f496fb283cc24558359756a3b881076f3538147250b5e8f6bcc49d971.png" 2>&1 | head -5
An error occurred (ValidationException) when calling the ConverseStream operation: The model returned the following errors: prompt is too long: 214989 tokens > 200000 maximum
We encountered an error while processing your request. Please try again or reach out to us for help.