Pdf on TISH technique for rguhs university exam 10 marks with appropriate Line diagram and flow chart
TISH technique RGUHS university exam dentistry surgery definition steps
TISH technique dentistry "transillumination" OR "tooth in socket" periodontics oral surgery 10 marks
https://pmc.ncbi.nlm.nih.gov/articles/PMC7254457
TISH technique "tooth in socket" OR "transillumination" periodontal oral surgery
mkdir -p /tmp/workspace/TISH-technique && ls /tmp/workspace/
~/TISH-technique/generate_tish_pdf.py
"""
TISH Technique - RGUHS University Exam PDF Generator
Generates a comprehensive 10-mark answer PDF with line diagrams and flowcharts
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table,
TableStyle, PageBreak, HRFlowable)
from reportlab.platypus import Flowable
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.graphics.shapes import Drawing, Rect, String, Line, Circle, Polygon, Path
from reportlab.graphics.shapes import Group
from reportlab.graphics import renderPDF
from reportlab.platypus import Image as RLImage
import io
import os
# ── Colors ──────────────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor('#1a3a6b')
MED_BLUE = colors.HexColor('#2255a4')
LIGHT_BLUE = colors.HexColor('#d6e4f7')
ACCENT = colors.HexColor('#e8f0fe')
GOLD = colors.HexColor('#f5a623')
GREEN = colors.HexColor('#2e7d32')
LIGHT_GREEN = colors.HexColor('#e8f5e9')
RED_DARK = colors.HexColor('#c62828')
GREY_LIGHT = colors.HexColor('#f5f5f5')
GREY_BORDER = colors.HexColor('#bdbdbd')
WHITE = colors.white
BLACK = colors.black
OUTPUT_PATH = "/tmp/workspace/TISH-technique/TISH_Technique_RGUHS.pdf"
# ── Document Setup ───────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT_PATH,
pagesize=A4,
rightMargin=1.8*cm,
leftMargin=1.8*cm,
topMargin=2*cm,
bottomMargin=2*cm,
title="TISH Technique - RGUHS Exam Notes",
author="RGUHS BDS Study Material",
)
W, H = A4
styles = getSampleStyleSheet()
# ── Custom Styles ────────────────────────────────────────────────────────────
def make_style(name, parent='Normal', **kwargs):
return ParagraphStyle(name, parent=styles[parent], **kwargs)
title_style = make_style('MyTitle',
fontSize=20, textColor=WHITE, alignment=TA_CENTER,
spaceAfter=4, fontName='Helvetica-Bold')
subtitle_style = make_style('MySub',
fontSize=11, textColor=WHITE, alignment=TA_CENTER,
spaceAfter=2, fontName='Helvetica')
heading1 = make_style('H1',
fontSize=13, textColor=WHITE, alignment=TA_LEFT,
fontName='Helvetica-Bold', spaceAfter=4, leftIndent=0)
heading2 = make_style('H2',
fontSize=11, textColor=DARK_BLUE, alignment=TA_LEFT,
fontName='Helvetica-Bold', spaceAfter=3, spaceBefore=6)
body = make_style('Body',
fontSize=10, textColor=BLACK, alignment=TA_JUSTIFY,
fontName='Helvetica', leading=15, spaceAfter=4)
bullet_style = make_style('Bullet',
fontSize=10, textColor=BLACK, alignment=TA_LEFT,
fontName='Helvetica', leading=14, spaceAfter=2,
leftIndent=14, bulletIndent=4)
small_style = make_style('Small',
fontSize=8.5, textColor=colors.HexColor('#444444'), alignment=TA_CENTER,
fontName='Helvetica-Oblique', leading=12)
caption_style = make_style('Caption',
fontSize=9, textColor=DARK_BLUE, alignment=TA_CENTER,
fontName='Helvetica-Bold', spaceAfter=6)
# ── Helper: Colored heading block ────────────────────────────────────────────
def section_heading(text, bg=DARK_BLUE, text_style=None):
ts = text_style or heading1
tbl = Table([[Paragraph(text, ts)]], colWidths=[W - 3.6*cm])
tbl.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), bg),
('ROUNDEDCORNERS', [4]),
('TOPPADDING', (0,0), (-1,-1), 6),
('BOTTOMPADDING', (0,0), (-1,-1), 6),
('LEFTPADDING', (0,0), (-1,-1), 10),
]))
return tbl
def sub_heading(text):
h2p = make_style('H2b', fontSize=11, textColor=DARK_BLUE,
fontName='Helvetica-Bold', spaceBefore=8, spaceAfter=3)
return Paragraph(f"▶ {text}", h2p)
def bullet_point(text, indent=0):
bp = make_style('BP', fontSize=10, textColor=BLACK, fontName='Helvetica',
leading=14, spaceAfter=2, leftIndent=14+indent, bulletIndent=4+indent)
return Paragraph(f"• {text}", bp)
def info_box(title, items, bg=ACCENT):
data = [[Paragraph(f"<b>{title}</b>", make_style('IB', fontSize=10,
textColor=DARK_BLUE, fontName='Helvetica-Bold'))]]
for item in items:
data.append([Paragraph(f"• {item}", body)])
tbl = Table(data, colWidths=[W - 3.6*cm])
tbl.setStyle(TableStyle([
('BACKGROUND', (0,0), (0,0), LIGHT_BLUE),
('BACKGROUND', (0,1), (-1,-1), bg),
('BOX', (0,0), (-1,-1), 1, MED_BLUE),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 10),
('ROUNDEDCORNERS', [4]),
]))
return tbl
# ════════════════════════════════════════════════════════════════════════════
# DIAGRAM 1 - TISH Acronym Box
# ════════════════════════════════════════════════════════════════════════════
def make_tish_acronym_diagram():
d = Drawing(460, 180)
letters = [
('T', 'Tissue', 'Management', DARK_BLUE),
('I', 'Incision', 'Design', MED_BLUE),
('S', 'Soft Tissue', 'Handling', colors.HexColor('#0d6e6e')),
('H', 'Hemostasis', '& Healing', GREEN),
]
box_w, box_h = 100, 140
gap = 15
start_x = 15
for i, (letter, word1, word2, col) in enumerate(letters):
x = start_x + i*(box_w + gap)
# Shadow
d.add(Rect(x+4, 16, box_w, box_h, fillColor=colors.HexColor('#cccccc'),
strokeColor=None))
# Main box
d.add(Rect(x, 20, box_w, box_h, fillColor=col, strokeColor=WHITE,
strokeWidth=2, rx=8, ry=8))
# Letter
d.add(String(x + box_w/2, 110, letter, fontSize=44, fillColor=WHITE,
fontName='Helvetica-Bold', textAnchor='middle'))
# Word
d.add(String(x + box_w/2, 60, word1, fontSize=11, fillColor=WHITE,
fontName='Helvetica-Bold', textAnchor='middle'))
d.add(String(x + box_w/2, 44, word2, fontSize=10, fillColor=colors.HexColor('#ddeeff'),
fontName='Helvetica', textAnchor='middle'))
# Arrow between boxes
if i < 3:
ax = x + box_w + 4
d.add(Line(ax, 90, ax+11, 90, strokeColor=DARK_BLUE, strokeWidth=2))
d.add(Polygon([ax+11, 95, ax+11, 85, ax+18, 90],
fillColor=DARK_BLUE, strokeColor=None))
return d
# ════════════════════════════════════════════════════════════════════════════
# DIAGRAM 2 - Flap Design Line Diagram
# ════════════════════════════════════════════════════════════════════════════
def make_flap_line_diagram():
d = Drawing(460, 220)
# Gingival outline (simplified arch cross-section)
# Draw gum tissue block
d.add(Rect(30, 60, 400, 100, fillColor=colors.HexColor('#ffe0cc'),
strokeColor=colors.HexColor('#cc7755'), strokeWidth=1.5, rx=5))
# Teeth silhouettes (5 teeth)
tooth_cols = [colors.HexColor('#f5f5f5')]
tooth_x = [50, 115, 180, 245, 310]
for tx in tooth_x:
# Crown
d.add(Rect(tx, 100, 50, 75, fillColor=colors.HexColor('#f8f8f0'),
strokeColor=colors.HexColor('#aaaaaa'), strokeWidth=1, rx=4))
# Root
d.add(Rect(tx+10, 30, 30, 72, fillColor=colors.HexColor('#f0e8d0'),
strokeColor=colors.HexColor('#aaaaaa'), strokeWidth=1, rx=3))
# ---- INCISION LINES ----
# Horizontal (sulcular) incision - RED dashed
inc_y = 103
dash_len, gap_len = 12, 5
x_pos = 50
while x_pos < 360:
d.add(Line(x_pos, inc_y, min(x_pos+dash_len, 360), inc_y,
strokeColor=colors.HexColor('#cc0000'), strokeWidth=2.5))
x_pos += dash_len + gap_len
# Vertical relieving incisions - BLUE
d.add(Line(50, 80, 50, 175, strokeColor=MED_BLUE, strokeWidth=2.5))
d.add(Line(360, 80, 360, 175, strokeColor=MED_BLUE, strokeWidth=2.5))
# Papilla-preserving arc at interdental areas
for px in [100, 165, 230, 295]:
d.add(Line(px, 103, px+15, 118, strokeColor=colors.HexColor('#cc0000'),
strokeWidth=1.5))
d.add(Line(px+15, 118, px+30, 103, strokeColor=colors.HexColor('#cc0000'),
strokeWidth=1.5))
# Flap reflection arrows
for fx in [70, 200, 330]:
d.add(Line(fx, 145, fx, 170, strokeColor=GREEN, strokeWidth=1.5))
d.add(Polygon([fx-5, 170, fx+5, 170, fx, 182],
fillColor=GREEN, strokeColor=None))
# LABELS
label_style_sm = dict(fontSize=8, fontName='Helvetica', fillColor=BLACK, textAnchor='middle')
label_style_col = dict(fontSize=8, fontName='Helvetica-Bold', textAnchor='middle')
d.add(String(205, 45, 'FLAP DESIGN - LINE DIAGRAM', fontSize=11,
fontName='Helvetica-Bold', fillColor=DARK_BLUE, textAnchor='middle'))
d.add(String(400, 107, '← Sulcular incision', fontSize=7.5,
fontName='Helvetica', fillColor=RED_DARK, textAnchor='start'))
d.add(String(50, 195, 'Vertical', fontSize=7.5,
fontName='Helvetica-Bold', fillColor=MED_BLUE, textAnchor='middle'))
d.add(String(50, 205, 'Relieving', fontSize=7.5,
fontName='Helvetica-Bold', fillColor=MED_BLUE, textAnchor='middle'))
d.add(String(360, 195, 'Vertical', fontSize=7.5,
fontName='Helvetica-Bold', fillColor=MED_BLUE, textAnchor='middle'))
d.add(String(360, 205, 'Relieving', fontSize=7.5,
fontName='Helvetica-Bold', fillColor=MED_BLUE, textAnchor='middle'))
d.add(String(200, 188, '↓ Flap reflected apically', fontSize=8,
fontName='Helvetica', fillColor=GREEN, textAnchor='middle'))
return d
# ════════════════════════════════════════════════════════════════════════════
# DIAGRAM 3 - Flowchart of TISH Technique Steps
# ════════════════════════════════════════════════════════════════════════════
def make_flowchart():
d = Drawing(460, 620)
bw = 300
bh = 36
cx = 230
steps = [
("Patient Assessment & Diagnosis", DARK_BLUE, WHITE),
("Armamentarium Preparation", MED_BLUE, WHITE),
("Local Anesthesia Administration", MED_BLUE, WHITE),
("T Tissue Management\n(Soft tissue reflection, mucoperiosteal flap)", colors.HexColor('#1565c0'), WHITE),
("I Incision Design\n(Primary + Relieving + Papilla-preserving)", colors.HexColor('#00695c'), WHITE),
("S Soft Tissue Handling\n(Atraumatic retraction, hemostasis)", colors.HexColor('#4527a0'), WHITE),
("H Hemostasis & Primary Closure\n(Suturing, clot formation)", colors.HexColor('#2e7d32'), WHITE),
("Post-operative Care &\nWound Healing Assessment", colors.HexColor('#37474f'), WHITE),
]
y_start = 590
step_gap = 68
for i, (text, bg, fg) in enumerate(steps):
y = y_start - i * step_gap
lines = text.split('\n')
# Box shadow
d.add(Rect(cx - bw//2 + 3, y - bh//2 - 3, bw, bh + (10 if len(lines)>1 else 0),
fillColor=colors.HexColor('#cccccc'), strokeColor=None, rx=6))
# Box
box_h = bh + (10 if len(lines)>1 else 0)
d.add(Rect(cx - bw//2, y - bh//2, bw, box_h,
fillColor=bg, strokeColor=WHITE, strokeWidth=1.5, rx=6))
# Step number circle
d.add(Circle(cx - bw//2 + 18, y + box_h//2 - 18, 12,
fillColor=GOLD, strokeColor=None))
d.add(String(cx - bw//2 + 18, y + box_h//2 - 22, str(i+1),
fontSize=10, fontName='Helvetica-Bold', fillColor=BLACK,
textAnchor='middle'))
# Text
main_text = lines[0]
d.add(String(cx + 10, y + box_h//2 - 16, main_text,
fontSize=9.5, fontName='Helvetica-Bold', fillColor=fg,
textAnchor='middle'))
if len(lines) > 1:
d.add(String(cx + 10, y + box_h//2 - 30, lines[1],
fontSize=8, fontName='Helvetica', fillColor=colors.HexColor('#ddeeff'),
textAnchor='middle'))
# Arrow to next
if i < len(steps) - 1:
arr_y_top = y - bh//2
arr_y_bot = arr_y_top - (step_gap - box_h - 2)
arr_mid = (arr_y_top + arr_y_bot) // 2
d.add(Line(cx, arr_y_top, cx, arr_y_top - 22,
strokeColor=DARK_BLUE, strokeWidth=2))
d.add(Polygon([cx-7, arr_y_top-22, cx+7, arr_y_top-22, cx, arr_y_top-32],
fillColor=DARK_BLUE, strokeColor=None))
d.add(String(cx, 608, 'FLOWCHART OF TISH TECHNIQUE', fontSize=11,
fontName='Helvetica-Bold', fillColor=DARK_BLUE, textAnchor='middle'))
return d
# ════════════════════════════════════════════════════════════════════════════
# DIAGRAM 4 - Wound Healing Phases
# ════════════════════════════════════════════════════════════════════════════
def make_healing_diagram():
d = Drawing(460, 130)
phases = [
('Hemostatic\nPhase\n(0–2 hrs)', colors.HexColor('#c62828')),
('Inflammatory\nPhase\n(2–72 hrs)', colors.HexColor('#e65100')),
('Proliferative\nPhase\n(3–10 days)', colors.HexColor('#1565c0')),
('Remodeling\nPhase\n(2 wks–1 yr)', GREEN),
]
bw, bh = 95, 90
start_x = 15
gap = 8
for i, (label, col) in enumerate(phases):
x = start_x + i*(bw+gap)
d.add(Rect(x+3, 17, bw, bh, fillColor=colors.HexColor('#cccccc'), strokeColor=None, rx=5))
d.add(Rect(x, 20, bw, bh, fillColor=col, strokeColor=WHITE, strokeWidth=1.5, rx=5))
lines = label.split('\n')
for j, line in enumerate(lines):
fs = 10 if j == 0 else 8.5
fw = 'Helvetica-Bold' if j == 0 else 'Helvetica'
d.add(String(x + bw//2, 75 - j*16, line,
fontSize=fs, fontName=fw, fillColor=WHITE,
textAnchor='middle'))
# Arrow
if i < 3:
ax = x + bw + 3
d.add(Line(ax, 65, ax + 5, 65, strokeColor=DARK_BLUE, strokeWidth=2))
d.add(Polygon([ax+5, 70, ax+5, 60, ax+12, 65],
fillColor=DARK_BLUE, strokeColor=None))
d.add(String(230, 120, 'WOUND HEALING PHASES AFTER TISH TECHNIQUE',
fontSize=9.5, fontName='Helvetica-Bold', fillColor=DARK_BLUE,
textAnchor='middle'))
return d
# ════════════════════════════════════════════════════════════════════════════
# HEADER / FOOTER
# ════════════════════════════════════════════════════════════════════════════
def on_page(canvas, doc):
canvas.saveState()
W_pt, H_pt = A4
# Top banner
canvas.setFillColor(DARK_BLUE)
canvas.rect(0, H_pt - 28, W_pt, 28, fill=1, stroke=0)
canvas.setFillColor(WHITE)
canvas.setFont('Helvetica-Bold', 9)
canvas.drawString(18, H_pt - 18, 'RGUHS BDS EXAM NOTES')
canvas.setFont('Helvetica', 8)
canvas.drawRightString(W_pt - 18, H_pt - 18, 'TISH Technique | 10 Marks')
# Footer
canvas.setFillColor(DARK_BLUE)
canvas.rect(0, 0, W_pt, 22, fill=1, stroke=0)
canvas.setFillColor(WHITE)
canvas.setFont('Helvetica', 7.5)
canvas.drawCentredString(W_pt/2, 7, f'Page {doc.page} | Rajiv Gandhi University of Health Sciences')
canvas.restoreState()
# ════════════════════════════════════════════════════════════════════════════
# BUILD CONTENT
# ════════════════════════════════════════════════════════════════════════════
story = []
# ── Cover Banner ────────────────────────────────────────────────────────────
cover_data = [[
Paragraph("TISH TECHNIQUE", title_style),
Paragraph("Tissue Management | Incision Design | Soft Tissue Handling | Hemostasis & Healing", subtitle_style),
Paragraph("RGUHS University Examination — 10 Marks Answer", subtitle_style),
]]
cover_tbl = Table([[
Paragraph("TISH TECHNIQUE", title_style)
],
[
Paragraph("Tissue Management · Incision Design · Soft Tissue Handling · Hemostasis & Healing", subtitle_style),
],
[
Paragraph("RGUHS University Examination — 10 Marks Answer", subtitle_style)
]], colWidths=[W - 3.6*cm])
cover_tbl.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), DARK_BLUE),
('TOPPADDING', (0,0), (-1,-1), 8),
('BOTTOMPADDING', (0,0), (-1,-1), 8),
('LEFTPADDING', (0,0), (-1,-1), 12),
]))
story.append(cover_tbl)
story.append(Spacer(1, 10))
# ── Quick Info Table ─────────────────────────────────────────────────────────
info_data = [
[Paragraph('<b>Subject</b>', body), Paragraph('Oral & Maxillofacial Surgery / Periodontology', body)],
[Paragraph('<b>Topic</b>', body), Paragraph('TISH Technique', body)],
[Paragraph('<b>Marks</b>', body), Paragraph('10 Marks (Long Answer)', body)],
[Paragraph('<b>University</b>', body), Paragraph('Rajiv Gandhi University of Health Sciences (RGUHS)', body)],
]
qt = Table(info_data, colWidths=[4*cm, W-3.6*cm-4*cm])
qt.setStyle(TableStyle([
('BACKGROUND', (0,0), (0,-1), LIGHT_BLUE),
('BACKGROUND', (1,0), (1,-1), GREY_LIGHT),
('BOX', (0,0), (-1,-1), 1, MED_BLUE),
('INNERGRID', (0,0), (-1,-1), 0.5, GREY_BORDER),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 8),
('FONTNAME', (0,0), (0,-1), 'Helvetica-Bold'),
]))
story.append(qt)
story.append(Spacer(1, 12))
# ══════════════════════════════════════════════════════════
# SECTION 1: INTRODUCTION
# ══════════════════════════════════════════════════════════
story.append(section_heading("1. INTRODUCTION"))
story.append(Spacer(1, 6))
story.append(Paragraph(
"The <b>TISH technique</b> is a systematic approach to surgical tissue management in Oral and "
"Maxillofacial Surgery and Periodontology. The acronym <b>TISH</b> encompasses the four "
"fundamental principles that govern successful surgical outcomes: <b>T</b>issue Management, "
"<b>I</b>ncision Design, <b>S</b>oft tissue handling, and <b>H</b>emostasis and Healing. "
"This technique ensures atraumatic surgical access, preservation of tissue vitality, optimal "
"wound closure and uneventful healing — all critical determinants of surgical success in the oral cavity.",
body))
story.append(Spacer(1, 4))
# TISH Acronym Diagram
story.append(caption_style and Paragraph("Fig. 1 — TISH Acronym Diagram", caption_style))
story.append(make_tish_acronym_diagram())
story.append(Paragraph("Fig. 1 — Components of TISH Technique", caption_style))
story.append(Spacer(1, 10))
# ══════════════════════════════════════════════════════════
# SECTION 2: COMPONENTS
# ══════════════════════════════════════════════════════════
story.append(section_heading("2. COMPONENTS OF TISH TECHNIQUE"))
story.append(Spacer(1, 6))
# T
story.append(sub_heading("T — TISSUE MANAGEMENT"))
story.append(Paragraph(
"Tissue management refers to all measures taken to preserve and protect the soft tissues "
"(mucosa, gingiva, periosteum) during and after surgical procedures.", body))
for pt in [
"Pre-operative tissue assessment (inflammation, keratinized tissue width, biotype)",
"Adequate hydration of tissues during surgery using saline irrigation",
"Prevention of drying/desiccation of mucoperiosteal flap during retraction",
"Atraumatic handling — avoidance of crushing forceps, excessive electrosurgery",
"Maintenance of blood supply to flap by correct design (base wider than free margin)",
"Periosteal release where needed to achieve tension-free closure",
]:
story.append(bullet_point(pt))
story.append(Spacer(1, 6))
# I
story.append(sub_heading("I — INCISION DESIGN"))
story.append(Paragraph(
"Proper incision design ensures adequate surgical access while preserving attached gingiva, "
"interdental papillae and the blood supply to the flap.", body))
inc_data = [
[Paragraph('<b>Type of Incision</b>', body), Paragraph('<b>Description</b>', body), Paragraph('<b>Purpose</b>', body)],
[Paragraph('Primary (Horizontal) Incision', body),
Paragraph('Sulcular or paramarginal incision along the gingival margin', body),
Paragraph('Flap entry, maintains gingival architecture', body)],
[Paragraph('Vertical Relieving Incision', body),
Paragraph('90° to free gingival margin at line angles', body),
Paragraph('Improves flap mobility and access', body)],
[Paragraph('Papilla Preserving Incision', body),
Paragraph('Semi-lunar arc avoiding interdental papilla', body),
Paragraph('Preserves papilla for esthetic closure', body)],
[Paragraph('Secondary Incision', body),
Paragraph('Along alveolar crest or bone', body),
Paragraph('Subperiosteal flap elevation', body)],
]
it = Table(inc_data, colWidths=[4.2*cm, 7.5*cm, 4.5*cm])
it.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), DARK_BLUE),
('TEXTCOLOR', (0,0), (-1,0), WHITE),
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
('BACKGROUND', (0,1), (-1,-1), GREY_LIGHT),
('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, GREY_LIGHT]),
('BOX', (0,0), (-1,-1), 1, DARK_BLUE),
('INNERGRID', (0,0), (-1,-1), 0.5, GREY_BORDER),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 6),
('FONTSIZE', (0,0), (-1,-1), 9),
]))
story.append(it)
story.append(Spacer(1, 8))
# Flap Line Diagram
story.append(Paragraph("Fig. 2 — Flap Incision Design (Line Diagram)", caption_style))
story.append(make_flap_line_diagram())
story.append(Paragraph("Fig. 2 — Mucoperiosteal Flap Design showing Horizontal, Vertical Relieving & Papilla-preserving incisions", caption_style))
story.append(Spacer(1, 8))
# ── Principles of Incision (sub-content) ──
story.append(sub_heading("Principles of Good Incision Design (RGUHS Key Points)"))
principles = [
"Incision must be made through healthy tissue, not through inflamed or edematous areas",
"Blade must be held at 90° to the mucosal surface for a clean cut",
"Single firm stroke preferred — multiple shallow cuts cause ragged edges",
"Flap base must always be <b>broader than the free margin</b> to ensure blood supply",
"Vertical incisions should avoid severing major vessels (mental foramen, labial frenum)",
"Adequate length of incision to prevent excessive retraction and tearing",
"Margin of incision should rest on solid bone — not over defect or extraction socket",
]
for p in principles:
story.append(bullet_point(p))
story.append(Spacer(1, 6))
# S
story.append(sub_heading("S — SOFT TISSUE HANDLING"))
story.append(Paragraph(
"Atraumatic soft tissue handling during elevation, retraction and manipulation of the flap "
"is essential to maintain tissue vitality and promote healing.", body))
for pt in [
"Use of sharp periosteal elevators (Molt's No. 9, Freer's) for mucoperiosteal flap elevation",
"Elevation performed in subperiosteal plane — keeps periosteum attached to flap",
"Retractors (Minnesota, Austin, Langenbeck) placed on bone, not soft tissue",
"Avoid prolonged retraction — intermittent release every 10–15 minutes",
"Copious irrigation with sterile saline to prevent clot formation and dehydration",
"Hemostatic agents (gelatin sponge, oxidized cellulose) placed in socket/defect before closure",
"No. 15 blade for delicate tissue, No. 12 for sulcular areas",
]:
story.append(bullet_point(pt))
story.append(Spacer(1, 6))
# H
story.append(sub_heading("H — HEMOSTASIS AND HEALING"))
story.append(Paragraph(
"Achieving hemostasis and ensuring an optimal environment for wound healing is the final "
"and most critical component of TISH technique.", body))
# Hemostasis methods table
hemo_data = [
[Paragraph('<b>Method</b>', body), Paragraph('<b>Agent/Technique</b>', body), Paragraph('<b>Mechanism</b>', body)],
[Paragraph('Local Pressure', body), Paragraph('Gauze pack, moist cotton', body), Paragraph('Vasoconstriction, platelet aggregation', body)],
[Paragraph('Vasoconstrictors', body), Paragraph('Epinephrine (1:100,000)', body), Paragraph('Alpha-1 receptor mediated vasoconstriction', body)],
[Paragraph('Absorbable Gelatin', body), Paragraph('Gelfoam, Surgicel', body), Paragraph('Scaffold for clot formation', body)],
[Paragraph('Bone Wax', body), Paragraph('Beeswax + isopropyl palmitate', body), Paragraph('Mechanical plugging of bony bleeders', body)],
[Paragraph('Electrosurgery', body), Paragraph('Monopolar/Bipolar cautery', body), Paragraph('Thermal coagulation of vessels', body)],
[Paragraph('Suturing', body), Paragraph('Primary wound closure', body), Paragraph('Approximates edges, stops dead space', body)],
]
ht = Table(hemo_data, colWidths=[3.5*cm, 5.5*cm, 7.2*cm])
ht.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), colors.HexColor('#c62828')),
('TEXTCOLOR', (0,0), (-1,0), WHITE),
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, colors.HexColor('#fce4e4')]),
('BOX', (0,0), (-1,-1), 1, colors.HexColor('#c62828')),
('INNERGRID', (0,0), (-1,-1), 0.5, GREY_BORDER),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 6),
('FONTSIZE', (0,0), (-1,-1), 9),
]))
story.append(ht)
story.append(Spacer(1, 8))
# Healing phases diagram
story.append(Paragraph("Fig. 3 — Wound Healing Phases after TISH Technique", caption_style))
story.append(make_healing_diagram())
story.append(Paragraph("Fig. 3 — Sequential Wound Healing Phases following Surgical Closure", caption_style))
story.append(Spacer(1, 10))
# ══════════════════════════════════════════════════════════
# SECTION 3: ARMAMENTARIUM
# ══════════════════════════════════════════════════════════
story.append(section_heading("3. ARMAMENTARIUM FOR TISH TECHNIQUE"))
story.append(Spacer(1, 6))
arma_data = [
[Paragraph('<b>Category</b>', body), Paragraph('<b>Instrument/Material</b>', body)],
[Paragraph('Incision Instruments', body), Paragraph('No. 3 & No. 7 Bard Parker handles; Blades No. 12, 15, 15C; Beaver blade', body)],
[Paragraph('Flap Elevation', body), Paragraph("Molt's No. 9, Freer's periosteal elevator, Goldman-Fox elevator", body)],
[Paragraph('Tissue Retractors', body), Paragraph('Minnesota retractor, Austin retractor, Langenbeck retractor, Mead retractor', body)],
[Paragraph('Hemostatic Agents', body), Paragraph('Gelfoam, Surgicel, Bone wax, Tranexamic acid solution, Epinephrine', body)],
[Paragraph('Suture Material', body), Paragraph('3-0, 4-0 Vicryl (resorbable); 3-0 Silk (non-resorbable); Monofilament nylon', body)],
[Paragraph('Irrigation', body), Paragraph('Sterile normal saline, Povidone iodine (0.5%), 30 mL syringe with blunt needle', body)],
[Paragraph('Adjuncts', body), Paragraph('Tissue scissors (Dean, Metzenbaum), tissue forceps (Adson), needle holder (Mathieu, Crile Wood)', body)],
]
at = Table(arma_data, colWidths=[4.5*cm, W-3.6*cm-4.5*cm])
at.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), DARK_BLUE),
('TEXTCOLOR', (0,0), (-1,0), WHITE),
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, ACCENT]),
('BOX', (0,0), (-1,-1), 1, DARK_BLUE),
('INNERGRID', (0,0), (-1,-1), 0.5, GREY_BORDER),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 6),
('FONTSIZE', (0,0), (-1,-1), 9),
('VALIGN', (0,0), (-1,-1), 'TOP'),
]))
story.append(at)
story.append(Spacer(1, 10))
# ══════════════════════════════════════════════════════════
# SECTION 4: STEP-BY-STEP SURGICAL PROCEDURE
# ══════════════════════════════════════════════════════════
story.append(section_heading("4. STEP-BY-STEP SURGICAL PROCEDURE"))
story.append(Spacer(1, 6))
steps_detail = [
("Step 1: Pre-operative Assessment",
["Detailed history — bleeding disorders, anticoagulants, diabetes",
"Clinical examination — assess tissue quality, inflammation, pocket depth",
"Radiographic assessment — periapical, CBCT if required",
"Informed consent and pre-operative instructions"]),
("Step 2: Armamentarium Preparation",
["Sterile draping and set-up of surgical tray",
"Selection of appropriate blades, retractors and suture material",
"Preparation of hemostatic agents"]),
("Step 3: Local Anesthesia",
["Infiltration and/or nerve block with 2% Lignocaine + 1:100,000 epinephrine",
"Wait 3–5 minutes for adequate anesthesia and vasoconstriction",
"Topical anesthesia prior to injection (benzocaine gel 20%)"]),
("Step 4: T — Tissue Management (Incision & Flap Elevation)",
["Primary incision: Sulcular or paramarginal incision with No. 15 blade",
"Vertical relieving incisions at mesial and distal line angles",
"Flap elevated with periosteal elevator in subperiosteal plane",
"Full-thickness mucoperiosteal flap reflected to expose operative site",
"Flap retracted gently without tension"]),
("Step 5: I — Incision Design Execution",
["Confirm flap design ensures base > free margin",
"Papilla preservation incisions where esthetics are critical",
"Re-evaluate flap margins for clean cut edges — trim if ragged"]),
("Step 6: S — Soft Tissue Handling during Operative Procedure",
["Retractors placed on bone — never directly on flap edges",
"Continuous saline irrigation to maintain hydration",
"Intermittent release of retractors every 10–15 minutes",
"Use of fine tissue forceps (Adson) — no crushing",
"Avoid electrosurgery near flap margins"]),
("Step 7: H — Hemostasis and Wound Closure",
["Control active bleeders with pressure, cautery or ligature",
"Pack socket/defect with resorbable hemostatic material",
"Approximate flap with interrupted or mattress sutures",
"No dead space under flap",
"Post-operative pressure pack for 30–45 minutes"]),
("Step 8: Post-operative Care",
["Prescribe analgesics (Ibuprofen 400 mg TDS), antibiotics (Amoxicillin 500 mg TDS x 5 days)",
"Chlorhexidine 0.2% mouth rinse twice daily from Day 2",
"Soft diet for 1 week; avoid smoking",
"Suture removal at 7–10 days (non-resorbable sutures)",
"Review at 1 week, 1 month, 3 months"]),
]
for title, pts in steps_detail:
hs = make_style('StepH', fontSize=10, textColor=WHITE, fontName='Helvetica-Bold',
spaceAfter=2)
step_tbl = Table([[Paragraph(title, hs)]], colWidths=[W-3.6*cm])
step_tbl.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), MED_BLUE),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 8),
('ROUNDEDCORNERS', [3]),
]))
story.append(step_tbl)
for pt in pts:
story.append(bullet_point(pt, indent=4))
story.append(Spacer(1, 4))
story.append(Spacer(1, 6))
# ══════════════════════════════════════════════════════════
# SECTION 5: FLOWCHART
# ══════════════════════════════════════════════════════════
story.append(section_heading("5. FLOWCHART OF TISH TECHNIQUE"))
story.append(Spacer(1, 6))
story.append(make_flowchart())
story.append(Paragraph("Fig. 4 — Complete Flowchart of TISH Technique", caption_style))
story.append(Spacer(1, 10))
# ══════════════════════════════════════════════════════════
# SECTION 6: SUTURING IN TISH
# ══════════════════════════════════════════════════════════
story.append(section_heading("6. SUTURING TECHNIQUES IN TISH"))
story.append(Spacer(1, 6))
suture_data = [
[Paragraph('<b>Suture Type</b>', body), Paragraph('<b>Indication</b>', body), Paragraph('<b>Advantage</b>', body)],
[Paragraph('Simple Interrupted', body), Paragraph('Routine flap closure', body), Paragraph('Easy, independent knots', body)],
[Paragraph('Continuous Sling (Horizontal Mattress)', body), Paragraph('Papilla preservation, tension-free closure', body), Paragraph('Even tension distribution', body)],
[Paragraph('Vertical Mattress', body), Paragraph('Deeper tissue apposition, inverting wound edges', body), Paragraph('Eliminates dead space', body)],
[Paragraph('Figure-of-8', body), Paragraph('Extraction socket closure', body), Paragraph('Adapts tissue over socket', body)],
[Paragraph('Continuous Locking', body), Paragraph('Long incisions', body), Paragraph('Rapid, hemostatic', body)],
]
st = Table(suture_data, colWidths=[4.5*cm, 5.5*cm, 6.2*cm])
st.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), colors.HexColor('#4527a0')),
('TEXTCOLOR', (0,0), (-1,0), WHITE),
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, colors.HexColor('#ede7f6')]),
('BOX', (0,0), (-1,-1), 1, colors.HexColor('#4527a0')),
('INNERGRID', (0,0), (-1,-1), 0.5, GREY_BORDER),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 6),
('FONTSIZE', (0,0), (-1,-1), 9),
]))
story.append(st)
story.append(Spacer(1, 10))
# ══════════════════════════════════════════════════════════
# SECTION 7: COMPLICATIONS AND MANAGEMENT
# ══════════════════════════════════════════════════════════
story.append(section_heading("7. COMPLICATIONS & MANAGEMENT"))
story.append(Spacer(1, 6))
comp_data = [
[Paragraph('<b>Complication</b>', body), Paragraph('<b>Cause</b>', body), Paragraph('<b>Management</b>', body)],
[Paragraph('Flap necrosis', body), Paragraph('Inadequate base, excessive tension', body), Paragraph('Debride, re-suture, antibiotics', body)],
[Paragraph('Post-op hemorrhage', body), Paragraph('Inadequate hemostasis, anticoagulants', body), Paragraph('Pressure pack, cautery, tranexamic acid', body)],
[Paragraph('Wound dehiscence', body), Paragraph('Tension on sutures, infection', body), Paragraph('Saline irrigation, secondary closure', body)],
[Paragraph('Dry socket', body), Paragraph('Disruption of clot', body), Paragraph('Alvogyl pack, analgesics', body)],
[Paragraph('Nerve paresthesia', body), Paragraph('Retractor injury to IAN', body), Paragraph('Vitamin B complex, observation', body)],
[Paragraph('Infection', body), Paragraph('Contamination, poor hemostasis', body), Paragraph('Antibiotics, drainage', body)],
]
ct = Table(comp_data, colWidths=[3.8*cm, 5.7*cm, 6.7*cm])
ct.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), RED_DARK),
('TEXTCOLOR', (0,0), (-1,0), WHITE),
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, colors.HexColor('#fce4e4')]),
('BOX', (0,0), (-1,-1), 1, RED_DARK),
('INNERGRID', (0,0), (-1,-1), 0.5, GREY_BORDER),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 6),
('FONTSIZE', (0,0), (-1,-1), 9),
]))
story.append(ct)
story.append(Spacer(1, 10))
# ══════════════════════════════════════════════════════════
# SECTION 8: EXAM KEY POINTS
# ══════════════════════════════════════════════════════════
story.append(section_heading("8. RGUHS EXAM KEY POINTS (Must-Know)", bg=colors.HexColor('#e65100')))
story.append(Spacer(1, 6))
kp_data = [
[
Paragraph('<b>Remember for 10 Marks:</b>', make_style('kp', fontSize=10, textColor=DARK_BLUE, fontName='Helvetica-Bold')),
],
[Paragraph(
"1. TISH = T (Tissue Management), I (Incision Design), S (Soft Tissue Handling), H (Hemostasis & Healing)<br/>"
"2. Flap base must be broader than free margin — ensures blood supply<br/>"
"3. Subperiosteal elevation keeps periosteum with flap — maintains vascularity<br/>"
"4. Retractors rest on bone, never directly on flap<br/>"
"5. Primary closure — no dead space — essential for uneventful healing<br/>"
"6. Epinephrine 1:100,000 provides vasoconstriction and hemostasis<br/>"
"7. Suture removal — resorbable (Vicryl) absorbed in 3–4 weeks; non-resorbable (silk) removed in 7–10 days<br/>"
"8. Wound healing phases: Hemostatic → Inflammatory → Proliferative → Remodeling<br/>"
"9. Proper incision margins should rest on solid bone, never over defects<br/>"
"10. Complications include flap necrosis, dry socket, wound dehiscence — know causes and management",
make_style('kpbody', fontSize=9.5, textColor=BLACK, fontName='Helvetica', leading=16))],
]
kpt = Table(kp_data, colWidths=[W-3.6*cm])
kpt.setStyle(TableStyle([
('BACKGROUND', (0,0), (0,0), LIGHT_BLUE),
('BACKGROUND', (0,1), (0,1), colors.HexColor('#fff8e1')),
('BOX', (0,0), (-1,-1), 1.5, colors.HexColor('#e65100')),
('TOPPADDING', (0,0), (-1,-1), 7),
('BOTTOMPADDING', (0,0), (-1,-1), 7),
('LEFTPADDING', (0,0), (-1,-1), 10),
]))
story.append(kpt)
story.append(Spacer(1, 10))
# ══════════════════════════════════════════════════════════
# SECTION 9: CONCLUSION
# ══════════════════════════════════════════════════════════
story.append(section_heading("9. CONCLUSION", bg=GREEN))
story.append(Spacer(1, 6))
story.append(Paragraph(
"The TISH technique represents the gold standard approach to surgical tissue management "
"in oral surgery and periodontology. By systematically addressing <b>Tissue management, "
"Incision design, Soft tissue handling, and Hemostasis and Healing</b>, the surgeon minimizes "
"intraoperative trauma, prevents complications and achieves predictable wound healing. "
"Mastery of TISH principles is fundamental for all BDS candidates and forms the basis of "
"all mucoperiosteal flap procedures including periapical surgery, impaction removal, osseous "
"surgery and implant placement. Thorough knowledge of these principles, combined with "
"appropriate armamentarium selection and meticulous technique, ensures successful outcomes "
"for the patient.", body))
story.append(Spacer(1, 8))
# References
ref_style = make_style('Ref', fontSize=8.5, textColor=colors.HexColor('#555555'),
fontName='Helvetica', leading=13, spaceAfter=2)
story.append(HRFlowable(width="100%", thickness=1, color=DARK_BLUE))
story.append(Spacer(1, 4))
refs_h = make_style('RefH', fontSize=9, textColor=DARK_BLUE, fontName='Helvetica-Bold')
story.append(Paragraph("References", refs_h))
for ref in [
"Fragiskos FD. Oral Surgery. Springer, 2007.",
"Hupp JR, Ellis E, Tucker MR. Contemporary Oral and Maxillofacial Surgery. 7th ed. Elsevier, 2019.",
"Carranza FA, Newman MG. Carranza's Clinical Periodontology. 13th ed. Elsevier, 2019.",
"Berkovitz BKB. Oral Anatomy, Histology and Embryology. 5th ed. Mosby Elsevier, 2018.",
"Shah N, Mathur VP. RGUHS Question Papers — Oral Surgery & Periodontology.",
]:
story.append(Paragraph(f"• {ref}", ref_style))
# ── Build PDF ────────────────────────────────────────────────────────────────
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print(f"PDF created: {OUTPUT_PATH}")
print(f"File size: {os.path.getsize(OUTPUT_PATH):,} bytes")
cd /tmp/workspace/TISH-technique && python generate_tish_pdf.py 2>&1