Richmond crown dentistry
Richmond crown dentistry
Richmond crown
Richmond crown dental procedure post core crown technique
https://pmc.ncbi.nlm.nih.gov/articles/PMC10485437
| Feature | Benefit |
|---|---|
| Single-unit construction | No separate components to dislodge independently |
| Custom cast to root | Fits root canal anatomy precisely |
| Ferrule effect | Improved retention and fracture resistance |
| Porcelain facing | Natural appearance for anterior teeth |
| Low cervical stress | Better long-term tissue health |
| Feature | Richmond Crown | Post + Core + Crown |
|---|---|---|
| Number of units | Single casting | 2-3 separate pieces |
| Fabrication | Complex, single draw | More flexible |
| Retention | Excellent (integrated) | Good (separate steps) |
| Current use | Special cases | Standard approach |
More
Richmond crown preparation steps clinical technique components contraindications
Richmond crown vs post core crown endocrown comparison dentistry
https://www.organscigroup.us/Dental-Problems-Solutions/JDPS-…
"Richmond crown" endodontically treated teeth
[ Porcelain Facing ]
[ Metal Crown Coping ] ← cast as one unit with the post below
[ Ferrule Collar ] ← encircles the cervical tooth structure
[ Post / Dowel ] ← extends into the prepared root canal
| Clinical Situation | Why Richmond Crown |
|---|---|
| Grossly decayed tooth with <1/3 crown remaining | No other option to retain a crown |
| Endodontically treated tooth with steep incisal guidance (deep bite, minimal overjet) | Conventional post+core+separate crown would create occlusal interference |
| Repeated crown dislodgement due to inadequate tooth structure | Single unit = no separate cemental interface to fail |
| Severely fractured anterior tooth (Ellis Class III with subgingival extension) | Integrated post provides retention where nothing else can |
| Feature | Richmond Crown | Post-Core + Crown (3-piece) | Endocrown |
|---|---|---|---|
| Year introduced | 1878 | Mid 20th century | ~1990s |
| Number of units | 1 | 2-3 | 1 |
| Post required | Yes (integral) | Yes (separate) | No |
| Indication | Minimal crown, deep bite | Moderate-severe crown loss | Posterior, adequate pulp chamber |
| Failure mode | Catastrophic | Dislodgement + root fracture | Mostly repairable |
| CAD/CAM compatible | No | Limited | Yes (modern endocrowns) |
| Technique sensitivity | Very high | Moderate | Moderate |
Find clinical images showing Richmond crown preparations and completed cases
Richmond crown preparation clinical images photos dentistry
Richmond crown case report clinical photographs before after



| Feature | What to Look For |
|---|---|
| Single-unit casting | The post and crown coping are one continuous piece (visible in Image 1, panels 2.3 and 2.5) |
| Ferrule collar | Metal band at the cervical margin hugging the tooth preparation |
| Porcelain facing | Applied only to the labial/facial surface; palate and lingual remain metal |
| Post in radiograph | Post visible extending into root canal space (Image 1, panel 2.4) |
| Final aesthetics | Natural-looking anterior tooth when porcelain is intact (Image 1, panels 2.6 and 2.7) |
Create a visual guide PDF comparing Richmond crowns with modern post-core and endocrown techniques
Dental anatomy cross-section diagram showing a Richmond crown restoration. Label all components clearly: root canal space, metal post/dowel extending into root, ferrule collar at the cervical margin encircling tooth structure, metal crown coping, porcelain facing on the labial surface. Show the single-unit casting nature with an arrow or bracket. Clean medical illustration style on white background with title "Richmond Crown (1878)" at the top.
Dental anatomy cross-section diagram showing a conventional Post-Core-Crown restoration with three separate components. Label clearly: prefabricated or cast metal post in root canal, composite resin or cast metal core buildup, separate full crown cemented over the core, cemental interface between post-core and crown. Use different colors or shading to show the three distinct units. Clean medical illustration style on white background with title "Conventional Post-Core Crown" at the top.
Dental anatomy cross-section diagram showing an Endocrown restoration on a molar tooth. Label clearly: no post used, pulp chamber provides macromechanical retention, monolithic ceramic crown extending into pulp chamber, adhesive bonded interface at tooth margins. Show the tooth is a posterior molar. Clean medical illustration style on white background with title "Endocrown" at the top.
mkdir -p /home/daytona/workspace/richmond-crown-guide && ls /home/daytona/worksp…
cd /home/daytona/workspace/richmond-crown-guide && python3 - << 'EOF' import url…
~/richmond-crown-guide/build_pdf.py
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, Image, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.platypus.flowables import BalancedColumns
from reportlab.pdfgen import canvas
import os
OUTPUT = "/home/daytona/workspace/richmond-crown-guide/Richmond_Crown_Visual_Guide.pdf"
DIR = "/home/daytona/workspace/richmond-crown-guide"
# ── Colour palette ──────────────────────────────────────────────────────────
NAVY = colors.HexColor("#1B3A5C")
TEAL = colors.HexColor("#1A7A8A")
GOLD = colors.HexColor("#C9942A")
LTBLUE = colors.HexColor("#E8F4F8")
LTGOLD = colors.HexColor("#FDF6E3")
LTGREY = colors.HexColor("#F5F5F5")
WHITE = colors.white
RED = colors.HexColor("#C0392B")
GREEN = colors.HexColor("#1A7A5A")
ORANGE = colors.HexColor("#D4700A")
W, H = A4
# ── Page decorations ─────────────────────────────────────────────────────────
def add_header_footer(canvas_obj, doc):
canvas_obj.saveState()
# header bar
canvas_obj.setFillColor(NAVY)
canvas_obj.rect(0, H - 1.1*cm, W, 1.1*cm, fill=1, stroke=0)
canvas_obj.setFillColor(WHITE)
canvas_obj.setFont("Helvetica-Bold", 9)
canvas_obj.drawString(1.5*cm, H - 0.75*cm,
"Richmond Crown vs Post-Core vs Endocrown | Clinical Visual Guide")
canvas_obj.setFont("Helvetica", 8)
canvas_obj.drawRightString(W - 1.5*cm, H - 0.75*cm, "Dentistry | Prosthodontics")
# footer bar
canvas_obj.setFillColor(NAVY)
canvas_obj.rect(0, 0, W, 0.8*cm, fill=1, stroke=0)
canvas_obj.setFillColor(GOLD)
canvas_obj.setFont("Helvetica", 7.5)
canvas_obj.drawString(1.5*cm, 0.28*cm, "For educational purposes only. Based on published literature.")
canvas_obj.setFillColor(WHITE)
canvas_obj.drawRightString(W - 1.5*cm, 0.28*cm, f"Page {doc.page}")
canvas_obj.restoreState()
# ── Styles ────────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
title_style = S("title", fontSize=26, textColor=WHITE, alignment=TA_CENTER,
fontName="Helvetica-Bold", leading=32)
subtitle_style = S("subtitle", fontSize=12, textColor=GOLD, alignment=TA_CENTER,
fontName="Helvetica-Oblique", leading=16)
h1 = S("h1", fontSize=15, textColor=WHITE, fontName="Helvetica-Bold",
leading=20, spaceAfter=4)
h2 = S("h2", fontSize=12, textColor=NAVY, fontName="Helvetica-Bold",
leading=16, spaceBefore=8, spaceAfter=4)
h3 = S("h3", fontSize=10.5, textColor=TEAL, fontName="Helvetica-Bold",
leading=14, spaceBefore=6, spaceAfter=3)
body = S("body", fontSize=9.5, textColor=colors.HexColor("#222222"),
fontName="Helvetica", leading=14, spaceAfter=4, alignment=TA_JUSTIFY)
bullet = S("bullet", fontSize=9.5, textColor=colors.HexColor("#222222"),
fontName="Helvetica", leading=14, leftIndent=14, spaceAfter=3,
bulletIndent=4)
caption = S("caption", fontSize=8, textColor=colors.HexColor("#555555"),
fontName="Helvetica-Oblique", alignment=TA_CENTER, leading=10)
tag_style = S("tag", fontSize=8.5, textColor=WHITE, fontName="Helvetica-Bold",
alignment=TA_CENTER)
small = S("small", fontSize=8, textColor=colors.HexColor("#444444"),
fontName="Helvetica", leading=11)
# ── Helpers ───────────────────────────────────────────────────────────────────
def section_header(text, color=NAVY):
data = [[Paragraph(text, h1)]]
t = Table(data, colWidths=[W - 3*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("ROWPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 12),
]))
return t
def info_box(text, bg=LTBLUE, border=TEAL):
data = [[Paragraph(text, body)]]
t = Table(data, colWidths=[W - 3*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("ROWPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 10),
("BOX", (0,0), (-1,-1), 1.5, border),
("ROUNDEDCORNERS", [4,4,4,4]),
]))
return t
def hr(color=TEAL, thickness=1):
return HRFlowable(width="100%", thickness=thickness, color=color, spaceAfter=6, spaceBefore=6)
def img(filename, width=6*cm, caption_text=None):
path = os.path.join(DIR, filename)
items = [Image(path, width=width, height=width)]
if caption_text:
items.append(Paragraph(caption_text, caption))
return items
# ── Build document ─────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=1.5*cm, rightMargin=1.5*cm,
topMargin=1.8*cm, bottomMargin=1.4*cm,
title="Richmond Crown vs Post-Core vs Endocrown",
author="Clinical Visual Guide",
subject="Prosthodontics - Endodontically Treated Teeth Restoration",
)
story = []
# ═══════════════════════════════════════════════════════════
# PAGE 1 – COVER
# ═══════════════════════════════════════════════════════════
# Navy banner
cover_title_data = [[Paragraph("Restoring the<br/>Endodontically Treated Tooth", title_style)]]
cover_title_table = Table(cover_title_data, colWidths=[W - 3*cm])
cover_title_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("ROWPADDING", (0,0), (-1,-1), 20),
("ALIGN", (0,0), (-1,-1), "CENTER"),
]))
story.append(cover_title_table)
story.append(Spacer(1, 0.4*cm))
subtitle_data = [[Paragraph("A Visual Comparison Guide:<br/>Richmond Crown | Post-Core Crown | Endocrown", subtitle_style)]]
st_table = Table(subtitle_data, colWidths=[W - 3*cm])
st_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#F0F8FF")),
("ROWPADDING", (0,0), (-1,-1), 10),
("BOX", (0,0), (-1,-1), 1, TEAL),
]))
story.append(st_table)
story.append(Spacer(1, 0.5*cm))
# Three technique images side by side
ri = Image(os.path.join(DIR, "richmond.png"), width=5.2*cm, height=5.2*cm)
pc = Image(os.path.join(DIR, "postcore.png"), width=5.2*cm, height=5.2*cm)
ec = Image(os.path.join(DIR, "endocrown.png"), width=5.2*cm, height=5.2*cm)
img_row = Table([[ri, pc, ec]], colWidths=[5.6*cm, 5.6*cm, 5.6*cm])
img_row.setStyle(TableStyle([
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("BOX", (0,0), (0,0), 1, NAVY),
("BOX", (1,0), (1,0), 1, TEAL),
("BOX", (2,0), (2,0), 1, GOLD),
("BACKGROUND", (0,0), (0,0), colors.HexColor("#EBF2F8")),
("BACKGROUND", (1,0), (1,0), colors.HexColor("#E8F5F2")),
("BACKGROUND", (2,0), (2,0), colors.HexColor("#FDF6E3")),
("ROWPADDING", (0,0), (-1,-1), 4),
]))
story.append(img_row)
story.append(Spacer(1, 0.15*cm))
label_row = Table([
[Paragraph("Richmond Crown<br/><font size='7' color='#888888'>Est. 1878</font>", S("lbl", fontSize=9, fontName="Helvetica-Bold", textColor=NAVY, alignment=TA_CENTER, leading=12)),
Paragraph("Post-Core Crown<br/><font size='7' color='#888888'>Mid 20th century</font>", S("lbl2", fontSize=9, fontName="Helvetica-Bold", textColor=TEAL, alignment=TA_CENTER, leading=12)),
Paragraph("Endocrown<br/><font size='7' color='#888888'>~1990s onward</font>", S("lbl3", fontSize=9, fontName="Helvetica-Bold", textColor=GOLD, alignment=TA_CENTER, leading=12))]
], colWidths=[5.6*cm, 5.6*cm, 5.6*cm])
label_row.setStyle(TableStyle([("ALIGN",(0,0),(-1,-1),"CENTER"),("TOPPADDING",(0,0),(-1,-1),2)]))
story.append(label_row)
story.append(Spacer(1, 0.5*cm))
story.append(info_box(
"<b>Purpose of this guide:</b> Compare three techniques for restoring endodontically treated teeth "
"with compromised coronal structure — covering indications, design, preparation, advantages, "
"disadvantages, failure modes, and clinical decision-making."
))
story.append(Spacer(1, 0.3*cm))
# Quick reference tags
tag_data = [[
Paragraph("Anterior teeth", tag_style),
Paragraph("Posterior teeth", tag_style),
Paragraph("Minimal structure", tag_style),
Paragraph("Deep bite / low overjet", tag_style),
]]
tag_table = Table(tag_data, colWidths=[3.6*cm]*4)
tag_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), NAVY),
("BACKGROUND", (1,0), (1,0), TEAL),
("BACKGROUND", (2,0), (2,0), RED),
("BACKGROUND", (3,0), (3,0), ORANGE),
("ROWPADDING", (0,0), (-1,-1), 5),
("ALIGN", (0,0), (-1,-1), "CENTER"),
]))
story.append(tag_table)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════
# PAGE 2 – RICHMOND CROWN
# ═══════════════════════════════════════════════════════════
story.append(section_header("1. RICHMOND CROWN (1878)", color=NAVY))
story.append(Spacer(1, 0.3*cm))
rc_img = Image(os.path.join(DIR, "richmond.png"), width=7*cm, height=7*cm)
rc_text_items = [
Paragraph("Definition", h2),
Paragraph(
"A <b>single-unit casting</b> in which the metal post (dowel), core, and full crown coping "
"are fabricated as one piece, with porcelain fired onto the labial surface. "
"It is <i>not</i> a post-and-core system — it is a <b>post + crown in one casting</b>.",
body),
Spacer(1, 0.2*cm),
Paragraph("Components", h2),
Paragraph("• <b>Metal post/dowel</b> — extends into the prepared root canal", bullet),
Paragraph("• <b>Ferrule collar</b> — encircles 1.5–2 mm of cervical tooth structure; anti-rotational", bullet),
Paragraph("• <b>Metal crown coping</b> — cast as one with the post", bullet),
Paragraph("• <b>Porcelain facing</b> — fired onto the labial/facial surface", bullet),
Spacer(1, 0.2*cm),
Paragraph("Single path of insertion", h2),
Paragraph(
"The internal root canal axis and the external crown preparation axis must share "
"<b>one common draw</b> — the most technically demanding aspect of preparation.",
body),
]
rc_content = []
for item in rc_text_items:
rc_content.append(item)
main_row = Table([[rc_img, rc_content]], colWidths=[7.4*cm, W - 3*cm - 7.4*cm])
main_row.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (1,0), (1,0), 12),
("BACKGROUND", (0,0), (0,0), colors.HexColor("#EBF2F8")),
("BOX", (0,0), (0,0), 1, NAVY),
]))
story.append(main_row)
story.append(Spacer(1, 0.4*cm))
# Indications / Contraindications side by side
ind_data = [
[Paragraph("<b>INDICATIONS</b>", S("ih", fontSize=10, fontName="Helvetica-Bold", textColor=WHITE, alignment=TA_CENTER)),
Paragraph("<b>CONTRAINDICATIONS</b>", S("ch", fontSize=10, fontName="Helvetica-Bold", textColor=WHITE, alignment=TA_CENTER))],
[Paragraph(
"• Grossly carious / fractured tooth (>2/3 crown lost)<br/>"
"• Endodontically treated anterior teeth<br/>"
"• Steep incisal guidance + minimal overjet (deep bite)<br/>"
"• Repeated crown dislodgement with insufficient stump<br/>"
"• Ellis Class III fracture with subgingival extension",
small),
Paragraph(
"• Adequate remaining coronal structure<br/>"
"• Very short or thin roots (root fracture risk)<br/>"
"• Curved or calcified root canals<br/>"
"• Active periapical pathology<br/>"
"• Poor periodontal support / mobility<br/>"
"• Young patients with open apices",
small)],
]
ind_table = Table(ind_data, colWidths=[(W-3*cm)/2]*2)
ind_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), GREEN),
("BACKGROUND", (1,0), (1,0), RED),
("BACKGROUND", (0,1), (0,1), colors.HexColor("#EAF6F0")),
("BACKGROUND", (1,1), (1,1), colors.HexColor("#FDECEA")),
("BOX", (0,0), (0,-1), 1, GREEN),
("BOX", (1,0), (1,-1), 1, RED),
("ROWPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(ind_table)
story.append(Spacer(1, 0.4*cm))
# Advantages / Disadvantages
adv_data = [
[Paragraph("<b>ADVANTAGES</b>", S("ah", fontSize=10, fontName="Helvetica-Bold", textColor=NAVY, alignment=TA_CENTER)),
Paragraph("<b>DISADVANTAGES</b>", S("dh", fontSize=10, fontName="Helvetica-Bold", textColor=NAVY, alignment=TA_CENTER))],
[Paragraph(
"✓ Single unit — no interfaces to debond<br/>"
"✓ Custom fit to root canal anatomy<br/>"
"✓ Ferrule provides anti-rotation + retention<br/>"
"✓ High fracture resistance (avg ~1180 N)<br/>"
"✓ Works when NO other technique is feasible",
small),
Paragraph(
"✗ Dual-axis preparation — technically demanding<br/>"
"✗ Excessive tooth removal to achieve parallel draw<br/>"
"✗ Increases stress at post apex → root fracture risk<br/>"
"✗ Catastrophic failure mode (non-repairable)<br/>"
"✗ Not CAD/CAM compatible<br/>"
"✗ Multiple lab steps required",
small)],
]
adv_table = Table(adv_data, colWidths=[(W-3*cm)/2]*2)
adv_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), LTBLUE),
("BOX", (0,0), (-1,-1), 1, TEAL),
("INNERGRID", (0,0), (-1,-1), 0.5, colors.HexColor("#CCDDEE")),
("ROWPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(adv_table)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════
# PAGE 3 – POST-CORE CROWN
# ═══════════════════════════════════════════════════════════
story.append(section_header("2. CONVENTIONAL POST-CORE CROWN", color=TEAL))
story.append(Spacer(1, 0.3*cm))
pc_img = Image(os.path.join(DIR, "postcore.png"), width=7*cm, height=7*cm)
pc_text_items = [
Paragraph("Definition", h2),
Paragraph(
"A <b>three-component system</b>: a post cemented into the root canal, a core material "
"built up around it to recreate coronal tooth shape, and a <b>separate full crown</b> "
"cemented over the core. Each component is distinct and can be selected independently.",
body),
Spacer(1, 0.2*cm),
Paragraph("Post Types", h2),
Paragraph("• <b>Prefabricated</b>: stainless steel, titanium, fiber (carbon/glass)", bullet),
Paragraph("• <b>Custom cast</b>: cast gold from direct or indirect impression", bullet),
Spacer(1, 0.1*cm),
Paragraph("Core Materials", h2),
Paragraph("• Composite resin (most popular)", bullet),
Paragraph("• Amalgam, resin-modified glass ionomer", bullet),
Paragraph("• Cast gold (indirect technique)", bullet),
Spacer(1, 0.1*cm),
Paragraph("Crown", h2),
Paragraph("• PFM, full ceramic, zirconia, full gold", bullet),
Paragraph("• Cemented separately over the completed core", bullet),
]
pc_content = []
for item in pc_text_items:
pc_content.append(item)
pc_row = Table([[pc_img, pc_content]], colWidths=[7.4*cm, W - 3*cm - 7.4*cm])
pc_row.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (1,0), (1,0), 12),
("BACKGROUND", (0,0), (0,0), colors.HexColor("#E8F5F2")),
("BOX", (0,0), (0,0), 1, TEAL),
]))
story.append(pc_row)
story.append(Spacer(1, 0.4*cm))
pc_ind_data = [
[Paragraph("<b>INDICATIONS</b>", S("ih2", fontSize=10, fontName="Helvetica-Bold", textColor=WHITE, alignment=TA_CENTER)),
Paragraph("<b>CONTRAINDICATIONS</b>", S("ch2", fontSize=10, fontName="Helvetica-Bold", textColor=WHITE, alignment=TA_CENTER))],
[Paragraph(
"• Moderate-to-severe coronal tooth loss<br/>"
"• Achievable ferrule of ≥1.5–2 mm<br/>"
"• Anterior and posterior teeth<br/>"
"• Root suitable for post placement<br/>"
"• Standard occlusal relationships",
small),
Paragraph(
"• Very thin/short roots<br/>"
"• Severely curved canals (fiber post exception)<br/>"
"• Inadequate ferrule height<br/>"
"• Active infection<br/>"
"• Where simpler restoration suffices",
small)],
]
pc_ind_table = Table(pc_ind_data, colWidths=[(W-3*cm)/2]*2)
pc_ind_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), GREEN),
("BACKGROUND", (1,0), (1,0), RED),
("BACKGROUND", (0,1), (0,1), colors.HexColor("#EAF6F0")),
("BACKGROUND", (1,1), (1,1), colors.HexColor("#FDECEA")),
("BOX", (0,0), (0,-1), 1, GREEN),
("BOX", (1,0), (1,-1), 1, RED),
("ROWPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(pc_ind_table)
story.append(Spacer(1, 0.4*cm))
pc_adv_data = [
[Paragraph("<b>ADVANTAGES</b>", S("ah2", fontSize=10, fontName="Helvetica-Bold", textColor=NAVY, alignment=TA_CENTER)),
Paragraph("<b>DISADVANTAGES</b>", S("dh2", fontSize=10, fontName="Helvetica-Bold", textColor=NAVY, alignment=TA_CENTER))],
[Paragraph(
"✓ Well-studied, proven long-term outcomes<br/>"
"✓ Flexible — post, core, crown chosen independently<br/>"
"✓ Fiber posts reduce root stress<br/>"
"✓ Repaired incrementally if one component fails<br/>"
"✓ CAD/CAM crowns available",
small),
Paragraph(
"✗ Three separate cemental interfaces<br/>"
"✗ Multiple appointments required<br/>"
"✗ Metal posts: stress concentration, root fracture<br/>"
"✗ Tooth susceptible to fracture between appointments<br/>"
"✗ Post removal difficult if re-treatment needed",
small)],
]
pc_adv_table = Table(pc_adv_data, colWidths=[(W-3*cm)/2]*2)
pc_adv_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#E0F5EF")),
("BOX", (0,0), (-1,-1), 1, TEAL),
("INNERGRID", (0,0), (-1,-1), 0.5, colors.HexColor("#BBDDCC")),
("ROWPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(pc_adv_table)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════
# PAGE 4 – ENDOCROWN
# ═══════════════════════════════════════════════════════════
story.append(section_header("3. ENDOCROWN", color=GOLD))
story.append(Spacer(1, 0.3*cm))
ec_img = Image(os.path.join(DIR, "endocrown.png"), width=7*cm, height=7*cm)
ec_text_items = [
Paragraph("Definition", h2),
Paragraph(
"A <b>single-piece, post-free restoration</b> that derives its retention from "
"the pulp chamber (macromechanical) and adhesive bonding to enamel/dentin margins. "
"The crown extends into the pulp chamber space rather than into the root canal. "
"Typically fabricated in ceramic (lithium disilicate, zirconia) using CAD/CAM.",
body),
Spacer(1, 0.2*cm),
Paragraph("Retention Mechanism", h2),
Paragraph("• <b>Primary</b>: pulp chamber macromechanical lock", bullet),
Paragraph("• <b>Secondary</b>: adhesive bonding at crown margins", bullet),
Paragraph("• <b>No post</b> — canal is NOT invaded", bullet),
Spacer(1, 0.2*cm),
Paragraph("Materials", h2),
Paragraph("• Lithium disilicate (e.max) — anterior + premolars", bullet),
Paragraph("• Zirconia — posterior, high-load areas", bullet),
Paragraph("• Resin ceramic composites (CAD/CAM blocks)", bullet),
Spacer(1, 0.1*cm),
Paragraph("Key requirement: Pulp chamber depth ≥ 3–4 mm", h3),
]
ec_content = []
for item in ec_text_items:
ec_content.append(item)
ec_row = Table([[ec_img, ec_content]], colWidths=[7.4*cm, W - 3*cm - 7.4*cm])
ec_row.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (1,0), (1,0), 12),
("BACKGROUND", (0,0), (0,0), colors.HexColor("#FDF6E3")),
("BOX", (0,0), (0,0), 1, GOLD),
]))
story.append(ec_row)
story.append(Spacer(1, 0.4*cm))
ec_ind_data = [
[Paragraph("<b>INDICATIONS</b>", S("ih3", fontSize=10, fontName="Helvetica-Bold", textColor=WHITE, alignment=TA_CENTER)),
Paragraph("<b>CONTRAINDICATIONS</b>", S("ch3", fontSize=10, fontName="Helvetica-Bold", textColor=WHITE, alignment=TA_CENTER))],
[Paragraph(
"• Posterior teeth (molars esp.) with adequate pulp chamber<br/>"
"• Sufficient remaining coronal tissue for bonding<br/>"
"• Good moisture control and adhesive isolation<br/>"
"• Pulp chamber depth ≥ 3–4 mm<br/>"
"• Bruxism cases (zirconia material)",
small),
Paragraph(
"• Anterior teeth (limited pulp chamber space)<br/>"
"• Calcified or very shallow pulp chamber<br/>"
"• Poor bonding substrate (sclerotic dentin)<br/>"
"• Inadequate moisture control (subgingival margins)<br/>"
"• Heavily calcified canals where re-treatment may be needed",
small)],
]
ec_ind_table = Table(ec_ind_data, colWidths=[(W-3*cm)/2]*2)
ec_ind_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), GREEN),
("BACKGROUND", (1,0), (1,0), RED),
("BACKGROUND", (0,1), (0,1), colors.HexColor("#EAF6F0")),
("BACKGROUND", (1,1), (1,1), colors.HexColor("#FDECEA")),
("BOX", (0,0), (0,-1), 1, GREEN),
("BOX", (1,0), (1,-1), 1, RED),
("ROWPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(ec_ind_table)
story.append(Spacer(1, 0.4*cm))
ec_adv_data = [
[Paragraph("<b>ADVANTAGES</b>", S("ah3", fontSize=10, fontName="Helvetica-Bold", textColor=NAVY, alignment=TA_CENTER)),
Paragraph("<b>DISADVANTAGES</b>", S("dh3", fontSize=10, fontName="Helvetica-Bold", textColor=NAVY, alignment=TA_CENTER))],
[Paragraph(
"✓ No post — root canal not invaded<br/>"
"✓ CAD/CAM: single-visit chairside fabrication<br/>"
"✓ Favorable failure mode (repairable chip/debond)<br/>"
"✓ Minimal tooth reduction vs post-core<br/>"
"✓ Good aesthetics (all-ceramic options)<br/>"
"✓ Re-treatment access preserved",
small),
Paragraph(
"✗ Limited to posterior teeth (typically)<br/>"
"✗ Requires adequate pulp chamber depth<br/>"
"✗ Bonding sensitive to moisture contamination<br/>"
"✗ CAD/CAM equipment required<br/>"
"✗ Less evidence in severely mutilated teeth<br/>"
"✗ Adhesive failure in subgingival cases",
small)],
]
ec_adv_table = Table(ec_adv_data, colWidths=[(W-3*cm)/2]*2)
ec_adv_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), LTGOLD),
("BOX", (0,0), (-1,-1), 1, GOLD),
("INNERGRID", (0,0), (-1,-1), 0.5, colors.HexColor("#E0C870")),
("ROWPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(ec_adv_table)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════
# PAGE 5 – HEAD-TO-HEAD COMPARISON TABLE
# ═══════════════════════════════════════════════════════════
story.append(section_header("4. HEAD-TO-HEAD COMPARISON", color=colors.HexColor("#2C2C2C")))
story.append(Spacer(1, 0.3*cm))
col_w = [4.2*cm, 4.5*cm, 4.5*cm, 3.6*cm]
hdr_style = S("hdr", fontSize=9, fontName="Helvetica-Bold", textColor=WHITE, alignment=TA_CENTER, leading=12)
cell_c = S("cellC", fontSize=8.5, fontName="Helvetica", textColor=colors.HexColor("#222222"), alignment=TA_CENTER, leading=12)
cell_l = S("cellL", fontSize=8.5, fontName="Helvetica", textColor=colors.HexColor("#222222"), alignment=TA_LEFT, leading=12)
row_hdr = S("rowHdr", fontSize=9, fontName="Helvetica-Bold", textColor=NAVY, alignment=TA_LEFT, leading=12)
comp_data = [
# header
[Paragraph("Feature", hdr_style),
Paragraph("Richmond Crown", hdr_style),
Paragraph("Post-Core Crown", hdr_style),
Paragraph("Endocrown", hdr_style)],
# rows
[Paragraph("Year introduced", row_hdr), Paragraph("1878", cell_c), Paragraph("Mid 20th c.", cell_c), Paragraph("~1990s", cell_c)],
[Paragraph("Number of units", row_hdr), Paragraph("1 (single casting)", cell_c), Paragraph("2–3 separate", cell_c), Paragraph("1 (monolithic)", cell_c)],
[Paragraph("Post required", row_hdr), Paragraph("Yes (integral)", cell_c), Paragraph("Yes (separate)", cell_c), Paragraph("No", cell_c)],
[Paragraph("Tooth type", row_hdr), Paragraph("Anterior (mainly)", cell_c), Paragraph("Anterior + Posterior", cell_c), Paragraph("Posterior (mainly)", cell_c)],
[Paragraph("Remaining structure", row_hdr), Paragraph("Minimal / none", cell_c), Paragraph("Moderate–severe loss", cell_c), Paragraph("Adequate pulp chamber", cell_c)],
[Paragraph("Deep bite / low overjet", row_hdr), Paragraph("Best suited ✓", cell_c), Paragraph("Often not feasible", cell_c), Paragraph("Not relevant", cell_c)],
[Paragraph("Failure mode", row_hdr), Paragraph("Catastrophic (root #)", cell_c), Paragraph("Post displacement / root #", cell_c), Paragraph("Repairable (chip/debond)", cell_c)],
[Paragraph("Fracture resistance", row_hdr), Paragraph("~1180 N (high)", cell_c), Paragraph("~972 N (moderate)", cell_c), Paragraph("High (material-dependent)", cell_c)],
[Paragraph("CAD/CAM", row_hdr), Paragraph("No", cell_c), Paragraph("Crown only", cell_c), Paragraph("Yes (full workflow)", cell_c)],
[Paragraph("Single visit possible", row_hdr), Paragraph("No", cell_c), Paragraph("No", cell_c), Paragraph("Yes ✓", cell_c)],
[Paragraph("Technique difficulty", row_hdr), Paragraph("Very high", cell_c), Paragraph("Moderate", cell_c), Paragraph("Moderate", cell_c)],
[Paragraph("Re-treatment access", row_hdr), Paragraph("Difficult", cell_c), Paragraph("Difficult", cell_c), Paragraph("Preserved ✓", cell_c)],
[Paragraph("Aesthetics (anterior)", row_hdr), Paragraph("Good (PFM)", cell_c), Paragraph("Good–excellent", cell_c), Paragraph("Excellent (all-ceramic)", cell_c)],
[Paragraph("Modern use", row_hdr), Paragraph("Niche / special cases", cell_c), Paragraph("Standard approach", cell_c), Paragraph("Growing (posterior)", cell_c)],
]
comp_table = Table(comp_data, colWidths=col_w, repeatRows=1)
comp_table.setStyle(TableStyle([
# Header row
("BACKGROUND", (0,0), (0,0), colors.HexColor("#444444")),
("BACKGROUND", (1,0), (1,0), NAVY),
("BACKGROUND", (2,0), (2,0), TEAL),
("BACKGROUND", (3,0), (3,0), GOLD),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 9),
("ROWPADDING", (0,0), (-1,0), 7),
# Data rows alternating
*[("BACKGROUND", (0,i), (-1,i), colors.HexColor("#F9F9F9") if i % 2 == 0 else WHITE) for i in range(1, len(comp_data))],
("BACKGROUND", (0,1), (0,-1), colors.HexColor("#F0F0F0")),
# Grid
("GRID", (0,0), (-1,-1), 0.5, colors.HexColor("#BBBBBB")),
("ROWPADDING", (0,1), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ALIGN", (1,0), (-1,-1), "CENTER"),
# Highlight key differentiators
("BACKGROUND", (1,5), (1,5), colors.HexColor("#D4EAF7")), # minimal structure Richmond
("BACKGROUND", (1,6), (1,6), colors.HexColor("#D4EAF7")), # deep bite Richmond
("BACKGROUND", (3,7), (3,7), colors.HexColor("#FFF3CD")), # endocrown failure
("BACKGROUND", (3,10), (3,10), colors.HexColor("#D4EDDA")), # endocrown single visit
]))
story.append(comp_table)
story.append(Spacer(1, 0.5*cm))
story.append(info_box(
"<b>Reading the table:</b> Highlighted cells indicate a technique's stand-out characteristic. "
"Richmond crown excels when remaining tooth structure is minimal and deep-bite geometry prevents "
"conventional post-core. Endocrown offers the most patient-friendly workflow (single visit, "
"repairable failure) for posterior teeth. Post-core crown remains the workhorse for the broadest range of cases."
))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════
# PAGE 6 – CLINICAL DECISION FLOWCHART + FERRULE NOTE
# ═══════════════════════════════════════════════════════════
story.append(section_header("5. CLINICAL DECISION GUIDE", color=colors.HexColor("#2C3E50")))
story.append(Spacer(1, 0.35*cm))
story.append(Paragraph("Step-by-Step Decision Algorithm", h2))
story.append(Spacer(1, 0.1*cm))
# Decision flowchart as a styled table
flow_style = S("flow", fontSize=9, fontName="Helvetica", textColor=colors.HexColor("#222222"), alignment=TA_CENTER, leading=13)
flow_q = S("flowq", fontSize=9.5, fontName="Helvetica-Bold", textColor=NAVY, alignment=TA_CENTER, leading=13)
flow_ans = S("flowa", fontSize=8.5, fontName="Helvetica-Oblique", textColor=TEAL, alignment=TA_CENTER, leading=11)
flow_data = [
[Paragraph("START: Endodontically treated tooth with significant coronal destruction", flow_q)],
[Paragraph("▼", flow_style)],
[Paragraph("Is the tooth posterior (molar/premolar) with adequate pulp chamber depth (≥3–4 mm)\nand good bonding substrate?", flow_q)],
[Paragraph("YES → Consider ENDOCROWN (single visit, no post, repairable failure)", S("yes", fontSize=9.5, fontName="Helvetica-Bold", textColor=GREEN, alignment=TA_CENTER, leading=13))],
[Paragraph("NO ▼", flow_style)],
[Paragraph("Is there moderate coronal loss but ≥1.5 mm ferrule achievable\nand normal incisal guidance (no steep deep bite)?", flow_q)],
[Paragraph("YES → Consider POST-CORE CROWN (standard approach, flexible materials)", S("yes2", fontSize=9.5, fontName="Helvetica-Bold", textColor=TEAL, alignment=TA_CENTER, leading=13))],
[Paragraph("NO ▼", flow_style)],
[Paragraph("Is it an anterior tooth with minimal/no remaining crown,\nsteep incisal guidance, and minimal overjet?", flow_q)],
[Paragraph("YES → RICHMOND CROWN is the technique of choice", S("yes3", fontSize=9.5, fontName="Helvetica-Bold", textColor=NAVY, alignment=TA_CENTER, leading=13))],
[Paragraph("NO ▼", flow_style)],
[Paragraph("Consider extraction + implant or bridge if none of the above are feasible", S("ext", fontSize=9.5, fontName="Helvetica-Bold", textColor=RED, alignment=TA_CENTER, leading=13))],
]
flow_colors = [
colors.HexColor("#1B3A5C"), # START - navy
WHITE,
colors.HexColor("#EBF2F8"), # Q1
colors.HexColor("#E8F8F0"), # YES green
WHITE,
colors.HexColor("#EBF2F8"), # Q2
colors.HexColor("#E0F5EF"), # YES teal
WHITE,
colors.HexColor("#EBF2F8"), # Q3
colors.HexColor("#E8EFF8"), # YES navy
WHITE,
colors.HexColor("#FDE8E8"), # extraction - red
]
flow_text_colors = [WHITE] + [None]*11
flow_table_data = [[item] for item in [row[0] for row in flow_data]]
flow_table = Table(flow_table_data, colWidths=[W - 3*cm])
flow_ts = [
("ROWPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("ALIGN", (0,0), (-1,-1), "CENTER"),
]
for i, bg in enumerate(flow_colors):
flow_ts.append(("BACKGROUND", (0,i), (0,i), bg))
flow_ts.append(("BOX", (0,0), (-1,-1), 1, colors.HexColor("#AAAAAA")))
flow_ts.append(("INNERGRID", (0,0), (-1,-1), 0.3, colors.HexColor("#DDDDDD")))
flow_table.setStyle(TableStyle(flow_ts))
story.append(flow_table)
story.append(Spacer(1, 0.5*cm))
# Ferrule effect note
story.append(Paragraph("The Ferrule Effect — Why It Matters", h2))
story.append(hr(GOLD))
ferrule_data = [[
Paragraph(
"<b>Definition:</b> The ferrule is a 360° metal band (1.5–2 mm height) that encircles the "
"remaining coronal tooth structure above the finish line, forming a 'hoop' around the tooth.<br/><br/>"
"<b>Why it matters:</b><br/>"
"• Resists the lever forces transmitted through the post<br/>"
"• Prevents crown from acting as a wedge that splits the root<br/>"
"• Critical for long-term survival of post-retained restorations<br/>"
"• Minimum 1.5 mm height required (2 mm preferred)<br/>"
"• Present in the Richmond crown (integral to its design)<br/>"
"• Must be achieved in conventional post-core preparations<br/>"
"• Not applicable to endocrowns (different retention mechanism)",
body),
Paragraph(
"<b>Ferrule height vs survival:</b><br/><br/>"
"0 mm ferrule: High fracture risk<br/>"
"1 mm ferrule: Marginal<br/>"
"≥1.5 mm ferrule: Acceptable<br/>"
"2 mm ferrule: Optimal<br/><br/>"
"If ≥1.5 mm ferrule cannot be achieved, crown lengthening or orthodontic extrusion "
"should be considered before restoration.",
body),
]]
ferrule_table = Table(ferrule_data, colWidths=[(W-3*cm)*0.6, (W-3*cm)*0.4])
ferrule_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LTGOLD),
("BOX", (0,0), (-1,-1), 1.5, GOLD),
("INNERGRID", (0,0), (-1,-1), 0.5, colors.HexColor("#E0C870")),
("ROWPADDING", (0,0), (-1,-1), 10),
("LEFTPADDING", (0,0), (-1,-1), 10),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(ferrule_table)
story.append(Spacer(1, 0.4*cm))
# References
story.append(hr(NAVY))
story.append(Paragraph("Key References", h3))
refs = [
"Patel N et al. Case Reports of Aesthetic Rehabilitation by Richmond Crown in Maxillary Anterior Teeth. J Pharm Bioallied Sci. 2023. PMID: 37693989",
"Hudis SI, Goldstein GR. Restoration of endodontically treated teeth: a review. J Prosthet Dent. 1986. PMID: 3511237",
"Decisions in Dentistry. Managing the Unexpected: Modification of Existing Richmond Crowns. 2022.",
"Swetha SP et al. The Richmond Crown Returns: A Laser-Assisted Approach. Clin Case Rep. 2025.",
"Comparative Evaluation of Fracture Toughness: Richmond Crown vs Endocrown. Int J Prosthodont Restor Dent. 2023.",
]
for r in refs:
story.append(Paragraph(f"• {r}", small))
story.append(Spacer(1, 0.05*cm))
# Build PDF
doc.build(story, onFirstPage=add_header_footer, onLaterPages=add_header_footer)
print("PDF created successfully:", OUTPUT)
EOFcd /home/daytona/workspace/richmond-crown-guide && python3 build_pdf.py 2>&1
ls -lh /home/daytona/workspace/richmond-crown-guide/Richmond_Crown_Visual_Guide.…
Richmond Crown Visual Guide
PDF Document · PDF
| Page | Content |
|---|---|
| 1 - Cover | Title banner, side-by-side AI-generated diagrams of all three techniques, purpose statement, clinical tag chips |
| 2 - Richmond Crown | Diagram + labeled components, indications vs contraindications (green/red), advantages vs disadvantages table |
| 3 - Post-Core Crown | Diagram + post types and core materials, indications vs contraindications, advantages vs disadvantages |
| 4 - Endocrown | Diagram + retention mechanism and material options, indications vs contraindications, advantages vs disadvantages |
| 5 - Head-to-Head Comparison | 15-row comparison table across all three techniques covering year, units, post, tooth type, failure mode, fracture resistance, CAD/CAM, single visit, technique difficulty, and more |
| 6 - Clinical Decision Guide | Step-by-step color-coded decision flowchart, ferrule effect explanation with height vs survival guide, key references |
Perfect write Dr. Shreya Chindak below title
~/richmond-crown-guide/build_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/richmond-crown-guide/build_pdf.py'
cd /home/daytona/workspace/richmond-crown-guide && python3 build_pdf.py 2>&1 | h…
Richmond Crown Visual Guide
PDF Document · PDF