Make a detailed pdf on corrosive poisons, make it easy to memorize for a 3rd year student studying MBBS
mkdir -p /home/daytona/workspace/corrosive-poisons && ls /home/daytona/workspace…
~/corrosive-poisons/generate_pdf.py
#!/usr/bin/env python3
"""Generate a detailed, exam-ready PDF on Corrosive Poisons for 3rd Year MBBS students."""
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.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether, PageBreak
)
from reportlab.platypus.flowables import HRFlowable
from reportlab.pdfgen import canvas
import os
OUTPUT_PATH = "/home/daytona/workspace/corrosive-poisons/Corrosive_Poisons_MBBS.pdf"
# ── Color palette ──────────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1a2b4a")
MED_BLUE = colors.HexColor("#2563eb")
LIGHT_BLUE = colors.HexColor("#dbeafe")
ACCENT_GREEN = colors.HexColor("#16a34a")
LIGHT_GREEN = colors.HexColor("#dcfce7")
ACCENT_RED = colors.HexColor("#dc2626")
LIGHT_RED = colors.HexColor("#fee2e2")
ACCENT_ORANGE= colors.HexColor("#ea580c")
LIGHT_ORANGE = colors.HexColor("#ffedd5")
ACCENT_PURPLE= colors.HexColor("#7c3aed")
LIGHT_PURPLE = colors.HexColor("#ede9fe")
YELLOW_BG = colors.HexColor("#fef9c3")
YELLOW_BORDER= colors.HexColor("#ca8a04")
GRAY_LIGHT = colors.HexColor("#f1f5f9")
GRAY_TEXT = colors.HexColor("#475569")
WHITE = colors.white
BLACK = colors.black
# ── Page numbering ─────────────────────────────────────────────────────────────
def add_page_number(canvas_obj, doc):
canvas_obj.saveState()
canvas_obj.setFont("Helvetica", 8)
canvas_obj.setFillColor(GRAY_TEXT)
canvas_obj.drawString(1*cm, 0.7*cm, "Corrosive Poisons | Forensic Medicine & Toxicology | 3rd Year MBBS")
canvas_obj.drawRightString(A4[0]-1*cm, 0.7*cm, f"Page {doc.page}")
canvas_obj.restoreState()
# ── Styles ─────────────────────────────────────────────────────────────────────
def make_styles():
base = getSampleStyleSheet()
styles = {}
styles['cover_title'] = ParagraphStyle(
'cover_title', fontSize=30, textColor=WHITE, fontName='Helvetica-Bold',
alignment=TA_CENTER, spaceAfter=6, leading=36
)
styles['cover_sub'] = ParagraphStyle(
'cover_sub', fontSize=14, textColor=colors.HexColor("#bfdbfe"),
fontName='Helvetica', alignment=TA_CENTER, spaceAfter=4
)
styles['cover_tag'] = ParagraphStyle(
'cover_tag', fontSize=11, textColor=colors.HexColor("#fef08a"),
fontName='Helvetica-Bold', alignment=TA_CENTER
)
styles['h1'] = ParagraphStyle(
'h1', fontSize=18, textColor=WHITE, fontName='Helvetica-Bold',
alignment=TA_LEFT, spaceAfter=4, spaceBefore=8, leading=22,
backColor=DARK_BLUE, leftIndent=-10, rightIndent=-10,
borderPad=(6, 10, 6, 10)
)
styles['h2'] = ParagraphStyle(
'h2', fontSize=14, textColor=DARK_BLUE, fontName='Helvetica-Bold',
alignment=TA_LEFT, spaceAfter=3, spaceBefore=8, leading=18
)
styles['h3'] = ParagraphStyle(
'h3', fontSize=11, textColor=MED_BLUE, fontName='Helvetica-Bold',
alignment=TA_LEFT, spaceAfter=2, spaceBefore=5, leading=14
)
styles['body'] = ParagraphStyle(
'body', fontSize=10, textColor=BLACK, fontName='Helvetica',
alignment=TA_JUSTIFY, spaceAfter=3, leading=14
)
styles['body_bold'] = ParagraphStyle(
'body_bold', fontSize=10, textColor=BLACK, fontName='Helvetica-Bold',
alignment=TA_LEFT, spaceAfter=2, leading=13
)
styles['bullet'] = ParagraphStyle(
'bullet', fontSize=10, textColor=BLACK, fontName='Helvetica',
leftIndent=14, spaceAfter=2, leading=14, bulletIndent=4
)
styles['mnemonic'] = ParagraphStyle(
'mnemonic', fontSize=11, textColor=DARK_BLUE, fontName='Helvetica-Bold',
alignment=TA_CENTER, spaceAfter=2, leading=15
)
styles['mnemonic_body'] = ParagraphStyle(
'mnemonic_body', fontSize=10, textColor=colors.HexColor("#1e3a5f"),
fontName='Helvetica', alignment=TA_LEFT, leading=14, leftIndent=10
)
styles['table_header'] = ParagraphStyle(
'table_header', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold',
alignment=TA_CENTER, leading=12
)
styles['table_cell'] = ParagraphStyle(
'table_cell', fontSize=9, textColor=BLACK, fontName='Helvetica',
alignment=TA_LEFT, leading=12
)
styles['table_cell_c'] = ParagraphStyle(
'table_cell_c', fontSize=9, textColor=BLACK, fontName='Helvetica',
alignment=TA_CENTER, leading=12
)
styles['exam_tip'] = ParagraphStyle(
'exam_tip', fontSize=10, textColor=colors.HexColor("#78350f"),
fontName='Helvetica-Bold', alignment=TA_LEFT, leading=13
)
styles['footer_note'] = ParagraphStyle(
'footer_note', fontSize=8, textColor=GRAY_TEXT, fontName='Helvetica-Oblique',
alignment=TA_CENTER, leading=11
)
return styles
# ── Helper flowables ───────────────────────────────────────────────────────────
def section_header(text, styles):
"""Full-width dark-blue section banner."""
data = [[Paragraph(f" {text}", styles['h1'])]]
tbl = Table(data, colWidths=[18.4*cm])
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), 10),
('RIGHTPADDING', (0,0), (-1,-1), 10),
('ROUNDEDCORNERS', [4,4,4,4]),
]))
return tbl
def colored_box(content_paras, bg_color, border_color, styles, title=None):
"""Colored info box."""
flowables = []
if title:
flowables.append(Paragraph(title, styles['body_bold']))
flowables.extend(content_paras)
data = [[flowables]]
tbl = Table(data, colWidths=[17.6*cm])
tbl.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), bg_color),
('BOX', (0,0), (-1,-1), 1.5, border_color),
('TOPPADDING', (0,0), (-1,-1), 8),
('BOTTOMPADDING', (0,0), (-1,-1), 8),
('LEFTPADDING', (0,0), (-1,-1), 10),
('RIGHTPADDING', (0,0), (-1,-1), 10),
]))
return tbl
def mnemonic_box(letter_list, title, styles):
"""Styled mnemonic box with letters."""
rows = [[Paragraph(f"<b>{l}</b> - {desc}", styles['mnemonic_body'])]
for l, desc in letter_list]
data = [[Paragraph(f"🧠 {title}", styles['mnemonic'])]] + rows
tbl = Table(data, colWidths=[17.6*cm])
tbl.setStyle(TableStyle([
('BACKGROUND', (0,0), (0,0), YELLOW_BG),
('BACKGROUND', (0,1), (-1,-1), colors.HexColor("#fffbeb")),
('BOX', (0,0), (-1,-1), 2, YELLOW_BORDER),
('LINEBELOW', (0,0), (0,0), 1, YELLOW_BORDER),
('TOPPADDING', (0,0), (-1,-1), 6),
('BOTTOMPADDING', (0,0), (-1,-1), 6),
('LEFTPADDING', (0,0), (-1,-1), 12),
('RIGHTPADDING', (0,0), (-1,-1), 12),
]))
return tbl
def exam_tip_box(tips, styles):
"""Yellow exam tips box."""
items = [Paragraph(f"⭐ {t}", styles['exam_tip']) for t in tips]
data = [[Paragraph("📝 HIGH-YIELD EXAM TIPS", styles['exam_tip'])]] + [[i] for i in items]
tbl = Table(data, colWidths=[17.6*cm])
tbl.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), colors.HexColor("#fffbeb")),
('BOX', (0,0), (-1,-1), 2, colors.HexColor("#d97706")),
('LINEBELOW', (0,0), (0,0), 1, colors.HexColor("#d97706")),
('TOPPADDING', (0,0), (-1,-1), 6),
('BOTTOMPADDING', (0,0), (-1,-1), 6),
('LEFTPADDING', (0,0), (-1,-1), 12),
('RIGHTPADDING', (0,0), (-1,-1), 12),
]))
return tbl
def make_table(header_row, data_rows, col_widths, styles, alt_color=GRAY_LIGHT):
"""Generic styled table."""
h_cells = [Paragraph(h, styles['table_header']) for h in header_row]
rows = [h_cells]
for i, row in enumerate(data_rows):
rows.append([Paragraph(str(c), styles['table_cell']) for c in row])
tbl = Table(rows, colWidths=col_widths, repeatRows=1)
ts = [
('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), 9),
('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, alt_color]),
('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#cbd5e1")),
('VALIGN', (0,0), (-1,-1), 'TOP'),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 6),
('RIGHTPADDING', (0,0), (-1,-1), 6),
]
tbl.setStyle(TableStyle(ts))
return tbl
# ══════════════════════════════════════════════════════════════════════════════
# CONTENT BUILDER
# ══════════════════════════════════════════════════════════════════════════════
def build_content(styles):
story = []
S = styles
sp = lambda n=4: Spacer(1, n*mm)
hr = lambda: HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#cbd5e1"))
# ── COVER PAGE ─────────────────────────────────────────────────────────────
story.append(sp(20))
cover_data = [[
Paragraph("CORROSIVE POISONS", S['cover_title']),
]]
cover_sub_data = [[
Paragraph("Forensic Medicine & Toxicology", S['cover_sub']),
]]
cover_tag_data = [[
Paragraph("3rd Year MBBS | Quick Revision Guide", S['cover_tag']),
]]
cover_tbl = Table([[Paragraph("CORROSIVE POISONS", S['cover_title'])],
[Paragraph("Forensic Medicine & Toxicology", S['cover_sub'])],
[sp(2)],
[Paragraph("3rd Year MBBS • Quick Revision Guide • Exam Ready", S['cover_tag'])],
],
colWidths=[18*cm])
cover_tbl.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), DARK_BLUE),
('TOPPADDING', (0,0), (-1,-1), 14),
('BOTTOMPADDING', (0,0), (-1,-1), 14),
('LEFTPADDING', (0,0), (-1,-1), 16),
('RIGHTPADDING', (0,0), (-1,-1), 16),
('ROUNDEDCORNERS', [8,8,8,8]),
]))
story.append(cover_tbl)
story.append(sp(6))
# Quick index box on cover
toc_items = [
"1. Introduction & Classification",
"2. General Principles of Treatment",
"3. Causes of Death",
"4. Sulphuric Acid (H₂SO₄)",
"5. Nitric Acid (HNO₃)",
"6. Hydrochloric Acid (HCl)",
"7. Carbolic Acid (Phenol)",
"8. Oxalic Acid",
"9. Corrosive Alkalies",
"10. Comparison Tables",
"11. Mnemonics & Memory Aids",
"12. High-Yield Exam Tips",
]
toc_paras = [Paragraph(f"<bullet>•</bullet> {item}", S['bullet']) for item in toc_items]
story.append(colored_box(toc_paras, LIGHT_BLUE, MED_BLUE, S, title="📋 CONTENTS AT A GLANCE"))
story.append(sp(4))
story.append(Paragraph("Source: P C Dikshit Textbook of Forensic Medicine and Toxicology; The Essentials of Forensic Medicine and Toxicology (2026 Ed.)", S['footer_note']))
story.append(PageBreak())
# ── SECTION 1: INTRODUCTION & CLASSIFICATION ──────────────────────────────
story.append(section_header("1. INTRODUCTION & CLASSIFICATION", S))
story.append(sp(3))
story.append(Paragraph("Definition", S['h2']))
story.append(Paragraph(
"Corrosives are poisons that <b>fix, destroy, and cause erosion</b> of the surface coming into "
"contact with them. They act locally with powerful destructive action on living tissue. "
"Unlike irritant poisons, corrosives cause immediate structural destruction rather than "
"just inflammation.",
S['body']
))
story.append(sp(3))
story.append(Paragraph("Classification of Corrosive Poisons", S['h2']))
class_data = [
["Category", "Subtype", "Examples"],
["Strong Mineral (Inorganic) Acids", "Mineral acids", "Sulphuric acid (H₂SO₄), Hydrochloric acid (HCl), Nitric acid (HNO₃)"],
["Strong Organic Acids", "Organic acids", "Carbolic acid (Phenol), Oxalic acid, Acetic acid (glacial)"],
["Acid-like Corrosives", "Oxidizing/sulfonating agents", "Dimethyl sulphate, Diethyl sulphate, Ozone, Sulphur dioxide"],
["Corrosive Alkalies", "Strong alkalis", "NaOH (caustic soda), KOH (caustic potash), NH₃ (ammonia), Na₂CO₃ (washing soda), K₂CO₃"],
["Phosphates", "Polyphosphates", "Polyphosphates"],
["Metallic Salt Corrosives", "Heavy metal salts", "Potassium cyanide, Ferric chloride, Chromates and bichromates"],
]
story.append(make_table(class_data[0], class_data[1:], [5*cm, 5*cm, 7.4*cm], S))
story.append(sp(3))
story.append(mnemonic_box(
[
("S", "Sulphuric acid"),
("H", "Hydrochloric acid"),
("N", "Nitric acid"),
("C", "Carbolic acid (Phenol)"),
("O", "Oxalic acid"),
("A", "Alkalies (NaOH, KOH, NH₃)"),
],
"MNEMONIC: 'SHN-COA' — The 6 Key Corrosive Poisons",
S
))
story.append(sp(4))
# Differences: acids vs alkalies
story.append(Paragraph("Key Difference: Acids vs. Alkalies", S['h2']))
diff_data = [
["Feature", "Corrosive ACIDS", "Corrosive ALKALIES"],
["Mechanism", "Coagulation necrosis (precipitate proteins)", "Liquefactive necrosis (saponify fats, dissolve proteins)"],
["Depth of penetration", "Shallower — self-limiting eschar", "DEEPER — no self-limiting eschar (more dangerous!)"],
["Danger", "Acids are dangerous", "Alkalies are MORE dangerous than acids"],
["Eschar", "Hard, dry, leathery", "Soft, oedematous, translucent, slippery"],
["Charring", "Present (blackening)", "Absent"],
["Vomitus pH", "Acidic", "Alkaline"],
]
story.append(make_table(diff_data[0], diff_data[1:], [4*cm, 6.7*cm, 6.7*cm], S, alt_color=colors.HexColor("#fff7f7")))
story.append(sp(2))
story.append(colored_box(
[Paragraph("⚠️ Remember: Concentrated corrosive alkalies are MORE dangerous than acids because they cause <b>liquefactive (colliquative) necrosis</b> — there is NO self-limiting coagulated eschar to stop deeper penetration!", S['body'])],
LIGHT_RED, ACCENT_RED, S
))
story.append(PageBreak())
# ── SECTION 2: GENERAL PRINCIPLES OF TREATMENT ────────────────────────────
story.append(section_header("2. GENERAL PRINCIPLES OF TREATMENT (ALL CORROSIVES)", S))
story.append(sp(3))
story.append(colored_box(
[Paragraph("<b>DO NOT</b> give stomach wash (emesis or gastric lavage) — risk of perforation of the already-thinned stomach/oesophagus wall!", S['body'])],
LIGHT_RED, ACCENT_RED, S
))
story.append(sp(3))
gen_tx = [
("1", "Levin tube gastric lavage ONLY within 30 min (pass softly, carefully)"),
("2", "NO emesis — risk of re-exposure + perforation"),
("3", "Dilute & neutralize immediately: plenty of water + MgO / Al(OH)₃ gel / CaO; if unavailable: milk, white of egg, olive oil, soap solution"),
("4", "Bismuth subcarbonate 30 g orally"),
("5", "Morphine 15 mg i.m./i.v. or Meperidine 50-150 mg for pain"),
("6", "10 mL of 10% Calcium gluconate i.v."),
("7", "Blood transfusion if needed"),
("8", "Tracheostomy if oedema of glottis present"),
("9", "O₂ inhalation and artificial respiration if needed"),
("10", "Corticosteroids — to prevent oesophageal strictures"),
("11", "Bougie (½ inch mercury-filled) passed daily to prevent stricture formation"),
("12", "Skin burns: wash with large quantities of water / NaHCO₃ paste"),
("13", "Eye burns: irrigate with water for 10-15 min, then treat symptomatically"),
("14", "Avoid strong alkalis (NaHCO₃, Na₂CO₃, K₂CO₃) as antidotes for acids — they produce CO₂ causing gastric distension and perforation"),
]
tx_paras = [Paragraph(f"<b>{n}.</b> {t}", S['bullet']) for n, t in gen_tx]
story.append(colored_box(tx_paras, LIGHT_GREEN, ACCENT_GREEN, S, title="✅ General Treatment Steps"))
story.append(sp(3))
# ── SECTION 3: CAUSES OF DEATH ──────────────────────────────────────────────
story.append(Paragraph("3. Causes of Death from Corrosive Poisoning", S['h2']))
death_data = [
["Timing", "Cause of Death"],
["Within a few hours", "Shock OR spasm/oedema of glottis → asphyxia"],
["Within 24 hours", "Perforation of stomach → peritonitis + shock"],
["Within first week", "Septic absorption / septicaemia"],
["After weeks to months", "Mediastinitis or peritonitis from oesophageal perforation"],
["Months to years later", "Exhaustion + malnutrition due to oesophageal/pyloric stricture or incurable dyspepsia"],
]
story.append(make_table(death_data[0], death_data[1:], [5.5*cm, 12.5*cm], S))
story.append(sp(2))
story.append(mnemonic_box(
[
("S", "Shock (within hours)"),
("P", "Perforation → Peritonitis (within 24 hrs)"),
("S", "Septicaemia (within 1 week)"),
("S", "Stricture → Starvation (after months/years)"),
],
"MNEMONIC: 'SPSS' — Causes of Death Timeline",
S
))
story.append(PageBreak())
# ── SECTION 4: SULPHURIC ACID ────────────────────────────────────────────────
story.append(section_header("4. SULPHURIC ACID — H₂SO₄ (Oil of Vitriol)", S))
story.append(sp(3))
# Properties box
story.append(colored_box([
Paragraph("<b>Pure form:</b> Colourless, odourless, oily liquid; chars and blackens organic matter on contact", S['body']),
Paragraph("<b>Commercial form:</b> Dark brown/black due to organic impurities (oil of vitriol)", S['body']),
Paragraph("<b>Specific gravity:</b> 1.84 (heaviest of the mineral acids)", S['body']),
Paragraph("<b>Boiling point:</b> 340°C; hygroscopic — extracts water from tissues", S['body']),
Paragraph("<b>Fatal dose:</b> ~5 mL (concentrated); fatal period: 12–24 hours", S['body']),
Paragraph("<b>Uses:</b> Industrial (batteries, fertilisers, dyes), thrown as vitriolage (acid attack)", S['body']),
], LIGHT_BLUE, MED_BLUE, S, title="📌 Properties at a Glance"))
story.append(sp(3))
story.append(Paragraph("Mode of Action", S['h3']))
action_items = [
"Extracts water from tissues (hygroscopic action) → charring",
"Precipitates proteins → coagulation necrosis (haematin formation)",
"Converts Haemoglobin → Haematin (brownish-black colour)",
"Oesophageal mucosa is relatively resistant",
"Stomach (especially PYLORIC region) is very susceptible — necrosis most common here",
"Complications (stricture etc.) develop 3 weeks to 3 months after ingestion",
"Well-diluted form acts as irritant; very dilute acts as stimulant",
]
for item in action_items:
story.append(Paragraph(f"• {item}", S['bullet']))
story.append(sp(2))
story.append(Paragraph("Signs & Symptoms", S['h3']))
sx_data = [
["System", "Symptom / Sign"],
["Oral / Facial", "Corrosion of mouth/tongue/lips; brownish-black leathery spots; chalky-white teeth; trickling burns on chin, cheek, neck, chest"],
["GI Tract", "Severe burning pain mouth→stomach; nausea, vomiting (brown/black vomitus); abdomen board-like rigid"],
["Airway", "Dyspnoea; inhalation of fumes → pulmonary oedema"],
["Cardiovascular", "Cold clammy skin; feeble thready pulse; decreased BP — circulatory collapse"],
["CNS", "Mind remains calm until the end (characteristic!)"],
["Renal", "Dysuria; haematuria; pain during micturition"],
["Terminal", "Slow laboured respiration; convulsions; death in 12-24 hours"],
]
story.append(make_table(sx_data[0], sx_data[1:], [4*cm, 14*cm], S))
story.append(sp(3))
story.append(Paragraph("Autopsy Findings", S['h3']))
autopsy_items = [
"<b>External:</b> Brownish-black parchment-like corroded spots on chin, cheek, neck, chest (from trickling); excoriation of lips; chalky-white teeth",
"<b>Oral:</b> Mucosa of mouth, tongue, lips — grayish-white initially → brownish-black + leathery with necrosis",
"<b>Oesophagus:</b> Inflamed, swollen, oedematous; severe interstitial haemorrhage present even when corrosion is absent; perforation RARE",
"<b>Stomach:</b> Mucosa inflamed, oedematous, blackened with 'peppery feel'; perforation can occur",
"<b>Peritoneum:</b> Black grumous acidic liquid (altered blood + stomach contents) in peritoneal cavity if perforation occurred",
"<b>Spoon sign:</b> When taken by spoon, lips and mouth escape injury (characteristic of sulphuric acid suicide)",
]
for item in autopsy_items:
story.append(Paragraph(f"• {item}", S['bullet']))
story.append(sp(2))
story.append(Paragraph("Specific Tests for Identification", S['h3']))
story.append(Paragraph(
"Add <b>Barium Chloride (BaCl₂)</b> to suspected sulphuric acid solution → white precipitate of Barium Sulphate (BaSO₄) insoluble in HCl.",
S['body']
))
story.append(sp(2))
story.append(exam_tip_box([
"The mind remains CALM until death — pathognomonic of strong acid poisoning (esp. H₂SO₄)",
"Spoon sign — lips and mouth escape if acid taken by spoon",
"Pyloric region is the most susceptible part of the GI tract",
"Fatal dose: 5 mL; Fatal period: 12-24 hours",
"Test: BaCl₂ → white precipitate (BaSO₄)",
"Avoid carbonates/bicarbonates as antidote (CO₂ formation → perforation risk)",
], S))
story.append(PageBreak())
# ── SECTION 5: NITRIC ACID ────────────────────────────────────────────────────
story.append(section_header("5. NITRIC ACID — HNO₃ (Aqua Fortis)", S))
story.append(sp(3))
story.append(colored_box([
Paragraph("<b>Appearance:</b> Colourless, fuming, pungent liquid; turns yellow on exposure to air/light (liberation of NO₂)", S['body']),
Paragraph("<b>Staining:</b> Produces YELLOW staining (xanthoprotein reaction) on skin, mucous membranes, and clothes — CHARACTERISTIC", S['body']),
Paragraph("<b>Xanthoprotein reaction:</b> Nitric acid + proteins → yellow colour (nitration of aromatic amino acids)", S['body']),
Paragraph("<b>Fatal dose:</b> ~8 mL; Fatal period: 12-24 hours", S['body']),
Paragraph("<b>Uses:</b> Manufacturing explosives (TNT), fertilisers, goldsmithing (aqua regia = HNO₃ + HCl)", S['body']),
], LIGHT_ORANGE, ACCENT_ORANGE, S, title="📌 Properties at a Glance"))
story.append(sp(3))
story.append(Paragraph("Unique Features of Nitric Acid Poisoning", S['h3']))
unique = [
"<b>Yellow staining</b> of tissues, clothes, skin (xanthoprotein test) — KEY differentiator from H₂SO₄",
"Oesophagus and stomach: not stained yellow but brown/brownish-black (acid haematin formation)",
"Post-mortem: tissues are stained YELLOW but oesophagus/stomach are BROWN-BLACK",
"Perforation is NOT as common as sulphuric acid",
"Inhalation of fumes: congested respiratory passages; pulmonary oedema; right auricular lining shows inflammatory changes",
]
for item in unique:
story.append(Paragraph(f"• {item}", S['bullet']))
story.append(sp(2))
story.append(Paragraph("Identification Tests", S['h3']))
id_data = [
["Test", "Result"],
["Xanthoprotein test", "Yellow staining of protein-containing tissues and skin"],
["Bile + ammonia added to yellow stain", "NO colour change (differentiates from bile)"],
["Brown ring test (Ferrous sulphate + H₂SO₄)", "Brown ring at junction of two solutions (tests for nitrates)"],
]
story.append(make_table(id_data[0], id_data[1:], [7*cm, 11*cm], S))
story.append(sp(3))
story.append(exam_tip_box([
"YELLOW staining = Nitric acid (xanthoprotein reaction) — #1 exam question",
"Internal organs stained yellow; but oesophagus/stomach are brown-black (acid haematin)",
"Perforation LESS common than with sulphuric acid",
"Aqua fortis = nitric acid; Aqua regia = HNO₃ + 3HCl (dissolves gold)",
"Fatal dose: 8 mL (higher than H₂SO₄)",
], S))
story.append(PageBreak())
# ── SECTION 6: HYDROCHLORIC ACID ─────────────────────────────────────────────
story.append(section_header("6. HYDROCHLORIC ACID — HCl (Muriatic Acid)", S))
story.append(sp(3))
story.append(colored_box([
Paragraph("<b>Appearance:</b> Colourless fuming liquid; pungent irritating odour; strong solution fumes at ordinary temperature", S['body']),
Paragraph("<b>Commercial form (Muriatic acid):</b> Yellow colour; fumes in damp air; less destructive than H₂SO₄ and HNO₃", S['body']),
Paragraph("<b>Staining:</b> Does NOT stain skin or mucous membrane; stains dark clothes REDDISH-BROWN", S['body']),
Paragraph("<b>Volatility:</b> Readily affects respiratory tract mucosa (more than other mineral acids)", S['body']),
Paragraph("<b>Natural occurrence:</b> Normal constituent of gastric juice", S['body']),
Paragraph("<b>Fatal dose:</b> ~15 mL; least dangerous of the 3 mineral acids", S['body']),
], LIGHT_GREEN, ACCENT_GREEN, S, title="📌 Properties at a Glance"))
story.append(sp(3))
story.append(Paragraph("Key Signs & Symptoms", S['h3']))
hcl_sx = [
"Less active than H₂SO₄ and HNO₃ — symptoms are MILDER",
"Does NOT corrode or damage skin (unlike H₂SO₄)",
"Readily destroys mucous membrane → turns gray or gray-white then brown/black",
"Inhalation of fumes: irritation of air passages, spasm of glottis, symptoms of suffocation",
"Mucous membrane becomes gray → brown/black (acid haematin)",
]
for item in hcl_sx:
story.append(Paragraph(f"• {item}", S['bullet']))
story.append(sp(3))
story.append(exam_tip_box([
"HCl = LEAST dangerous of the 3 mineral acids (fatal dose: 15 mL vs H₂SO₄: 5 mL)",
"Does NOT stain skin (unlike HNO₃ which gives yellow, H₂SO₄ which chars)",
"Stains dark clothes REDDISH-BROWN (unique to HCl)",
"Most volatile → most likely to cause respiratory tract injuries from fumes",
"Normal stomach acid = HCl (0.1-0.5% in gastric juice)",
], S))
story.append(PageBreak())
# ── SECTION 7: CARBOLIC ACID (PHENOL) ────────────────────────────────────────
story.append(section_header("7. CARBOLIC ACID — PHENOL (C₆H₅OH)", S))
story.append(sp(3))
story.append(colored_box([
Paragraph("<b>Appearance:</b> Colourless/pale pink crystals or liquid; characteristic strong 'tarry' / disinfectant smell", S['body']),
Paragraph("<b>Concentration:</b> Concentrated form (>5%) = corrosive; dilute form = irritant; antiseptic at 1-2%", S['body']),
Paragraph("<b>Fatal dose:</b> 2 g (liquid = ~2 mL); rapidly absorbed through skin and mucous membranes", S['body']),
Paragraph("<b>Uses:</b> Disinfectant (Dettol), preservative; historically used in suicidal poisoning", S['body']),
], LIGHT_PURPLE, ACCENT_PURPLE, S, title="📌 Properties at a Glance"))
story.append(sp(3))
story.append(Paragraph("Unique Features (EXAM FAVOURITE)", S['h3']))
story.append(Paragraph("1. Carboluria", S['h3']))
story.append(Paragraph(
"Urine is initially normal or greenish, turns <b>dark olive green on exposure to air</b> due to oxidation of "
"pyrocatechol and hydroquinone (oxidation products of phenol) in air. "
"Phenol is excreted partly free, partly as unstable conjugates with sulphuric and glucuronic acid.",
S['body']
))
story.append(sp(2))
story.append(Paragraph("2. Ochronosis", S['h3']))
story.append(Paragraph(
"Hydroquinone and pyrocatechol cause <b>pigmentation in cornea, cartilages, and venous complexes</b> — "
"seen in chronic phenol poisoning. Normally associated with alkaptonuria.",
S['body']
))
story.append(sp(2))
story.append(Paragraph("Signs & Symptoms", S['h3']))
phenol_sx = [
"Local: whitening/eschar at point of contact; later brown (tannin-like reaction)",
"Burning pain in mouth, throat, oesophagus, stomach",
"Vomiting (may fail due to anaesthetic effect of phenol)",
"Peculiar smell of carbolic acid on breath",
"CNS: anaesthesia/numbness at site + systemic effects → vertigo, tinnitus, restlessness",
"Pulse increased but feeble and thready",
"Respiration slow and laboured",
"Convulsions and lockjaw (trismus)",
"Carboluria: urine turns dark olive-green on air exposure",
"Causes of death: Syncope OR Asphyxia (respiratory failure, oedema of glottis, pneumonia)",
]
for item in phenol_sx:
story.append(Paragraph(f"• {item}", S['bullet']))
story.append(sp(2))
story.append(Paragraph("Treatment", S['h3']))
phenol_tx = [
"Stomach wash with warm water + activated charcoal, olive oil, castor oil, MgSO₄/Na₂SO₄ (form harmless compounds with phenol)",
"Soap solution or 10% glycerine used until washings are clear and odourless",
"Leave 2 oz castor oil or liquid paraffin in stomach",
"Demulcents: milk, white of egg",
"IV saline + NaHCO₃ (7 g/L) — combats circulatory collapse + promotes urinary excretion",
"Oxygen inhalation and artificial respiration",
]
for item in phenol_tx:
story.append(Paragraph(f"• {item}", S['bullet']))
story.append(sp(2))
story.append(Paragraph("Autopsy Findings", S['h3']))
phenol_autopsy = [
"External: dark brown excoriations at angle of mouth and chin; splashing marks on body",
"Tongue: white or swollen",
"Mucosa: whitish areas with strong phenol odour",
"Smell: characteristic phenol smell throughout body",
"Liver: fatty degeneration",
"Kidneys: tubular necrosis",
]
for item in phenol_autopsy:
story.append(Paragraph(f"• {item}", S['bullet']))
story.append(sp(2))
story.append(exam_tip_box([
"Carboluria = urine turns dark olive-green on exposure to air — CLASSIC exam vignette",
"Carbolic acid has a LOCAL anaesthetic effect — can numb pain initially (misleading!)",
"Fatal dose VERY LOW: only 2 g (smallest among common corrosives)",
"Skin absorption can cause systemic toxicity (no need to ingest)",
"Ochronosis in chronic exposure — pigmentation of cartilages",
"Dettol contains chloroxylenol (not phenol directly) — but phenol is the parent compound",
], S))
story.append(PageBreak())
# ── SECTION 8: OXALIC ACID ──────────────────────────────────────────────────
story.append(section_header("8. OXALIC ACID — (COOH)₂", S))
story.append(sp(3))
story.append(colored_box([
Paragraph("<b>Appearance:</b> White crystalline solid; sour taste; occurs naturally in spinach, rhubarb, sorrel", S['body']),
Paragraph("<b>Fatal dose:</b> 15-30 g (large dose needed)", S['body']),
Paragraph("<b>Mechanism:</b> Combines with calcium → insoluble calcium oxalate → hypocalcaemia; also directly irritates/corrosive in high concentrations", S['body']),
Paragraph("<b>Common confusion:</b> Often mistaken for magnesium sulphate (Epsom salt) — common cause of accidental poisoning", S['body']),
], LIGHT_BLUE, MED_BLUE, S, title="📌 Properties at a Glance"))
story.append(sp(3))
story.append(Paragraph("Two Clinical Phases", S['h3']))
phases = [
["Phase", "Features"],
["Acute Phase\n(large dose, survives hours)", "Symptoms primarily of HYPOCALCAEMIA (not GI): muscle irritability and tenderness, convulsions, numbness/tingling of fingertips and legs, cardiovascular collapse, stupor and coma"],
["Delayed Phase\n(renal effects)", "Uraemia: scanty or suppressed urine containing blood; calcium oxalate crystals in urine (PATHOGNOMONIC)"],
]
story.append(make_table(phases[0], phases[1:], [4.5*cm, 13.5*cm], S))
story.append(sp(3))
story.append(Paragraph("Treatment", S['h3']))
oxalic_tx = [
"Gastric lavage with CALCIUM LACTATE (test each lavage) — converts oxalate to insoluble CaC₂O₄",
"Antidote: Calcium lactate or gluconate → 10 mL of 10% calcium gluconate i.v. at regular intervals",
"Parathyroid extract 100 units i.m. in severe cases",
"Demulcent drinks",
"Enema to relieve bowels",
"Symptomatic treatment",
"Dialysis or exchange transfusion in severe cases",
]
for item in oxalic_tx:
story.append(Paragraph(f"• {item}", S['bullet']))
story.append(sp(2))
story.append(Paragraph("Autopsy Findings", S['h3']))
oxalic_autopsy = [
"Skin: RARELY burned (unlike mineral acids)",
"Strong solution: white 'bleached' appearance of mucous membrane of mouth, tongue, lips (may be red due to irritation)",
"Stomach: inflamed reddened outer coat with patchy softening; contents brownish (acid haematin); perforation RARE; may show full corrosion if death not immediate",
"Kidneys: SWOLLEN and CONGESTED; tubules show oxalate crystals (PATHOGNOMONIC!)",
"All other organs: congested",
]
for item in oxalic_autopsy:
story.append(Paragraph(f"• {item}", S['bullet']))
story.append(sp(2))
story.append(Paragraph("Medicolegal Aspects", S['h3']))
ml = [
"Accidental: most common — mistaken for magnesium sulphate",
"Suicidal: occasionally",
"Homicidal: very rare (bitter taste)",
"Abortifacient: used rarely",
]
for item in ml:
story.append(Paragraph(f"• {item}", S['bullet']))
story.append(sp(2))
story.append(exam_tip_box([
"Calcium oxalate crystals in kidneys = PATHOGNOMONIC finding for oxalic acid poisoning",
"Antidote = Calcium gluconate/lactate (10 mL of 10% IV) — converts oxalate to insoluble salt",
"Symptoms are mainly of HYPOCALCAEMIA, not GI irritation (large dose)",
"Often mistaken for Epsom salts (MgSO₄) — accidental poisoning",
"Fatal dose: 15-30 g (large; hence mainly accidental, not suicidal)",
], S))
story.append(PageBreak())
# ── SECTION 9: CORROSIVE ALKALIES ──────────────────────────────────────────
story.append(section_header("9. CORROSIVE ALKALIES", S))
story.append(sp(3))
story.append(colored_box([
Paragraph("Strong alkaline solutions act as CORROSIVES; dilute solutions act as irritants.", S['body']),
Paragraph("<b>IMPORTANT:</b> Concentrated corrosive alkalies are MORE DANGEROUS than acids — they cause liquefactive necrosis with NO self-limiting eschar, allowing deeper tissue penetration.", S['body']),
], LIGHT_RED, ACCENT_RED, S))
story.append(sp(3))
story.append(Paragraph("Common Alkaline Corrosives & Fatal Doses", S['h3']))
alkali_data = [
["Substance", "Common Name", "Fatal Dose", "Notes"],
["Potassium hydroxide (KOH)", "Caustic potash", "5 g", "Most dangerous; used for cleaning"],
["Sodium hydroxide (NaOH)", "Caustic soda / Lye", "5 g", "Used in pipe cleaners, drain openers"],
["Potassium carbonate (K₂CO₃)", "Pearl ash / Potash", "18 g", ""],
["Sodium carbonate (Na₂CO₃)", "Washing soda", "30 g", "Common household cleaner"],
["Ammonia (NH₃)", "Spirits of hartshorn", "30 g", "Volatile; dangerous by inhalation"],
["Ammonium carbonate", "(NH₄)₂CO₃", "-", "Smelling salts (low concentration)"],
["Lye (mixture)", "NaOH + NaHCO₃", "5 g", "Used for cleaning purposes"],
]
story.append(make_table(alkali_data[0], alkali_data[1:], [4.5*cm, 3.5*cm, 2.5*cm, 7.5*cm], S))
story.append(sp(3))
story.append(Paragraph("Action Produced", S['h3']))
alkali_action = [
"Absorption of water from tissues (similar to acids)",
"Precipitate proteins",
"Combine with proteins to form proteinates",
"Combine with fats to form soaps (saponification)",
"Result: soft, necrotic, deeply penetrating areas — LIQUEFACTIVE necrosis",
]
for item in alkali_action:
story.append(Paragraph(f"• {item}", S['bullet']))
story.append(sp(2))
story.append(Paragraph("Signs & Symptoms", S['h3']))
alkali_sx = [
"Soft, oedematous, translucent, swollen, reddish-brown scar (no charring)",
"Charring is ABSENT (vs acids where charring is present)",
"Vomited matter is ALKALINE",
"Purging frequent; mucus and blood in stools",
"Strong alkali ingestion: mucosa of mouth and lips discoloured + blisters",
"Soap-like feel of burned tissue",
]
for item in alkali_sx:
story.append(Paragraph(f"• {item}", S['bullet']))
story.append(sp(2))
story.append(Paragraph("Inhalation of Ammonia Vapours", S['h3']))
ammonia_items = [
"Congestion and watering of eyes (lacrimation)",
"Sneezing, coughing, choking",
"Sudden collapse and death may occur",
"Death due to: suffocation and oedema of glottis",
"Ammonia can also cause perforation of stomach (one of few alkalies that do)",
]
for item in ammonia_items:
story.append(Paragraph(f"• {item}", S['bullet']))
story.append(sp(2))
story.append(Paragraph("Treatment", S['h3']))
alkali_tx = [
"Neutralize with vegetable acids (dilute vinegar, lemon juice, etc.) + water",
"Demulcents: milk, white of egg, olive oil",
"NO emesis (risk of re-exposure and perforation)",
"Wash skin/eye burns with copious water",
"Corticosteroids to prevent stricture",
"Tracheostomy if needed (ammonia inhalation)",
]
for item in alkali_tx:
story.append(Paragraph(f"• {item}", S['bullet']))
story.append(sp(2))
story.append(Paragraph("Autopsy Findings", S['h3']))
alkali_autopsy = [
"Soft, gelatinous, translucent mucosa (vs hard leathery in acids)",
"No charring; lesions are pale, soap-like",
"Mucosa: softened, oedematous, slippery",
"Deeper penetration than acids — may involve all coats of the oesophagus/stomach",
"Perforation possible (especially ammonia)",
]
for item in alkali_autopsy:
story.append(Paragraph(f"• {item}", S['bullet']))
story.append(sp(2))
story.append(exam_tip_box([
"Alkalies are MORE dangerous than acids — liquefactive necrosis (no self-limiting eschar)",
"Charring = ACID; No charring = ALKALI",
"KOH and NaOH fatal dose = 5 g (same as H₂SO₄!)",
"Ammonia: inhalation → oedema of glottis + sudden death",
"Antidote for alkali = vegetable acids (vinegar, lemon juice)",
"Vomitus: acidic = acid poisoning; alkaline = alkali poisoning",
], S))
story.append(PageBreak())
# ── SECTION 10: MASTER COMPARISON TABLE ─────────────────────────────────────
story.append(section_header("10. MASTER COMPARISON TABLE", S))
story.append(sp(3))
comp_data = [
["Feature", "H₂SO₄", "HNO₃", "HCl", "Phenol", "Oxalic Acid", "Alkalies"],
["Fatal dose", "5 mL", "8 mL", "15 mL", "2 g", "15-30 g", "KOH/NaOH: 5 g"],
["Fatal period", "12-24 hr", "12-24 hr", "12-24 hr", "Rapid (hrs)", "Hours-days", "Hours-days"],
["Colour of burn", "Brown-black", "YELLOW", "Grey-white → brown", "White → brown", "White/bleached", "No charring"],
["Specific gravity", "1.84", "-", "-", "-", "-", "-"],
["Staining of clothes", "Chars/blackens", "Yellow", "Reddish-brown", "-", "-", "-"],
["Vomitus", "Dark/acidic", "Yellow-brown", "Acidic", "Phenol smell", "Acidic", "ALKALINE"],
["Perforation", "Common", "Less common", "Rare", "Rare", "Rare", "Possible (NH₃)"],
["Necrosis type", "Coagulative", "Coagulative", "Coagulative", "Coagulative", "Coagulative", "LIQUEFACTIVE"],
["Unique sign", "Spoon sign; calm mind", "Xanthoprotein (yellow)", "Reddish-brown on dark clothes", "Carboluria (dark green urine)", "Oxalate crystals in kidney", "Soap-like feel; no charring"],
["Key test", "BaCl₂ → white ppt", "Xanthoprotein test", "-", "Urine turns dark green", "Urine crystals", "-"],
["Antidote", "MgO, Al(OH)₃", "MgO, Al(OH)₃", "MgO, Al(OH)₃", "CaS; NaHCO₃ IV", "Ca-gluconate IV", "Vegetable acids"],
]
story.append(make_table(comp_data[0], comp_data[1:],
[3.2*cm, 2.3*cm, 2.3*cm, 2.3*cm, 2.3*cm, 2.3*cm, 2.5*cm], S))
story.append(PageBreak())
# ── SECTION 11: MNEMONICS & MEMORY AIDS ─────────────────────────────────────
story.append(section_header("11. MNEMONICS & MEMORY AIDS", S))
story.append(sp(3))
# Mnemonic 1: Colour of burns
story.append(mnemonic_box(
[
("H₂SO₄", "→ Brown-BLACK (chars/parchment-like)"),
("HNO₃", "→ YELLOW (xanthoprotein reaction)"),
("HCl", "→ Grey-white → brown (no skin staining; reddish-brown on dark cloth)"),
("Phenol", "→ White (anaesthetic) → later brown"),
("Alkali", "→ White/translucent, soft, soapy — NO charring"),
],
"ACID COLOUR CODE: 'Black (H₂SO₄), Yellow (HNO₃), Grey (HCl), White (Phenol), Soft-White (Alkali)'",
S
))
story.append(sp(4))
# Mnemonic 2: Fatal doses
story.append(mnemonic_box(
[
("2 g", "Phenol (SMALLEST — rapidly absorbed)"),
("5 mL", "H₂SO₄ (Oil of Vitriol) — also KOH/NaOH: 5 g"),
("8 mL", "HNO₃ (Aqua Fortis)"),
("15 mL", "HCl (Muriatic acid — LARGEST among mineral acids)"),
("15-30 g", "Oxalic acid (LARGEST fatal dose — hence mostly accidental)"),
],
"FATAL DOSE LADDER: 'Phenol < H₂SO₄ < HNO₃ < HCl < Oxalic Acid'",
S
))
story.append(sp(4))
# Mnemonic 3: Unique features
story.append(mnemonic_box(
[
("S-H₂SO₄", "→ Spoon Sign + Calm mind till end + Peppery stomach + BaCl₂ test"),
("N-HNO₃", "→ N for 'N'itric = N for 'Yellow' (xanthoprotein reaction) + Brown ring test"),
("H-HCl", "→ Reddish-brown on dark clothes + Least dangerous mineral acid"),
("C-Carbolic", "→ Carboluria (dark green urine) + Ochronosis + Smell + Anaesthetic effect"),
("O-Oxalic", "→ Oxalate crystals in kidney + Hypocalcaemia + Ca-gluconate antidote"),
("A-Alkali", "→ Alkaline vomitus + No charring + Liquefactive + More dangerous than acids"),
],
"UNIQUE FEATURES: 'SNHCOA' — Remember One Unique Thing Per Poison",
S
))
story.append(sp(4))
# Mnemonic 4: Acids vs alkalies necrosis
story.append(colored_box(
[
Paragraph("<b>ACID</b> = <b>C</b>oagulative necrosis = <b>C</b>harring + hard leathery eschar = <b>S</b>elf-limiting", S['body']),
Paragraph("<b>ALKALI</b> = <b>L</b>iquefactive necrosis = <b>S</b>oft, soapy, NO eschar = <b>D</b>eeper penetration = <b>D</b>angerous", S['body']),
Paragraph("Memory trick: '<b>A</b>cid = <b>A</b>rmour (hardens/coagulates); <b>A</b>lkali = <b>A</b>ngry (melts through everything)'", S['body_bold']),
],
LIGHT_PURPLE, ACCENT_PURPLE, S, title="🧠 Acid vs Alkali Necrosis"
))
story.append(PageBreak())
# ── SECTION 12: HIGH-YIELD EXAM TIPS ─────────────────────────────────────────
story.append(section_header("12. HIGH-YIELD EXAM TIPS & ONE-LINERS", S))
story.append(sp(3))
oneliner_data = [
["One-Liner", "Acid/Poison"],
["Calm mind till the end", "H₂SO₄"],
["Spoon sign (lips/mouth spared)", "H₂SO₄"],
["Yellow staining of tissues", "HNO₃"],
["Xanthoprotein test positive", "HNO₃"],
["Brown ring test (FeSO₄ + H₂SO₄ layer)", "HNO₃"],
["Reddish-brown stain on dark clothes", "HCl"],
["Most volatile mineral acid", "HCl"],
["Carboluria — dark green urine on air exposure", "Carbolic acid (Phenol)"],
["Ochronosis — cartilage pigmentation", "Carbolic acid (Phenol)"],
["Calcium oxalate crystals in kidney tubules", "Oxalic acid"],
["Mistaken for Epsom salts (MgSO₄)", "Oxalic acid"],
["No charring; soft, soapy, translucent lesions", "Corrosive Alkali"],
["More dangerous than acids", "Corrosive Alkali"],
["Liquefactive necrosis", "Corrosive Alkali"],
["BaCl₂ → white ppt (BaSO₄)", "H₂SO₄ (test)"],
["Antidote = Ca gluconate 10 mL of 10% IV", "Oxalic acid"],
["Antidote = Vegetable acids (vinegar)", "Corrosive alkali"],
["Avoid NaHCO₃/Na₂CO₃ as antidote in acid poisoning", "All mineral acids (CO₂ → perforation)"],
["Peppery feel of stomach mucosa at autopsy", "H₂SO₄"],
["Perforation most common with", "H₂SO₄"],
["Ammonia → oedema of glottis + sudden death", "Corrosive alkali (NH₃)"],
["Fatal dose smallest among corrosives", "Phenol (2 g)"],
["Complications develop 3 wks–3 months post ingestion", "All corrosive acids"],
]
story.append(make_table(oneliner_data[0], oneliner_data[1:], [12.5*cm, 5.5*cm], S))
story.append(sp(4))
# Exam scenario patterns
story.append(Paragraph("Common Exam Scenario Patterns", S['h2']))
scenarios = [
("Q: Patient has yellow discolouration of skin and oral mucosa after drinking industrial chemical", "→ HNO₃ (Nitric acid) — Xanthoprotein reaction"),
("Q: Urine passed by poisoning patient turns dark green on standing", "→ Carbolic acid (Phenol) — Carboluria"),
("Q: Victim drank acid but mind remains completely calm", "→ H₂SO₄ — classic sign"),
("Q: Post-mortem: kidney tubules with crystals + hypocalcaemia", "→ Oxalic acid poisoning"),
("Q: Soft, soapy, translucent burn lesion; no charring; alkaline vomitus", "→ Corrosive alkali (NaOH/KOH)"),
("Q: Chemical used in acid attacks / vitriolage", "→ H₂SO₄ (Oil of Vitriol)"),
("Q: Antidote for acid poisoning that should NOT be used", "→ NaHCO₃ or Na₂CO₃ (generates CO₂ → perforation)"),
("Q: Person took poison; 3 months later develops difficulty swallowing", "→ Oesophageal stricture — late complication of corrosive acid"),
]
for q, a in scenarios:
story.append(colored_box(
[Paragraph(q, S['body']), Paragraph(f"<b>Answer: {a}</b>", S['body_bold'])],
LIGHT_GREEN, ACCENT_GREEN, S
))
story.append(sp(2))
story.append(PageBreak())
# ── QUICK REVISION CARD ────────────────────────────────────────────────────
story.append(section_header("QUICK REVISION CARD — LAST MINUTE REVIEW", S))
story.append(sp(3))
qr_data = [
["Poison", "Fatal Dose", "Burn Colour", "Unique Feature", "Antidote"],
["H₂SO₄", "5 mL", "Brown-black (chars)", "Calm mind; Spoon sign; Peppery stomach", "MgO, Al(OH)₃; NO NaHCO₃"],
["HNO₃", "8 mL", "YELLOW (xanthoprotein)", "Yellow staining; Brown ring test", "MgO, Al(OH)₃"],
["HCl", "15 mL", "Grey-white → brown", "Red-brown on dark cloth; least dangerous", "MgO, Al(OH)₃"],
["Phenol", "2 g", "White → brown", "Carboluria (dark green urine); Ochronosis", "Ca-bicarb IV; NaHCO₃ IV"],
["Oxalic acid", "15-30 g", "White/bleached", "Oxalate crystals in kidney; Hypocalcaemia", "Ca-gluconate 10% IV (10 mL)"],
["NaOH/KOH", "5 g", "Soft, translucent, NO charring", "Liquefactive necrosis; More dangerous than acids", "Vegetable acids (vinegar)"],
["NH₃", "30 g", "Oedema; no charring", "Inhalation → oedema of glottis; sudden death", "Vegetable acids"],
]
story.append(make_table(qr_data[0], qr_data[1:], [2.5*cm, 2*cm, 3.5*cm, 5.5*cm, 4.5*cm], S))
story.append(sp(4))
story.append(Paragraph(
"This document was prepared for 3rd Year MBBS students. "
"Source: P C Dikshit Textbook of Forensic Medicine and Toxicology; "
"The Essentials of Forensic Medicine and Toxicology (36th Ed., 2026). "
"Always cross-reference with your university syllabus.",
S['footer_note']
))
return story
# ══════════════════════════════════════════════════════════════════════════════
def main():
doc = SimpleDocTemplate(
OUTPUT_PATH,
pagesize=A4,
rightMargin=1.3*cm,
leftMargin=1.3*cm,
topMargin=1.5*cm,
bottomMargin=1.8*cm,
title="Corrosive Poisons — 3rd Year MBBS",
author="Orris Medical AI",
subject="Forensic Medicine & Toxicology",
)
styles = make_styles()
story = build_content(styles)
doc.build(story, onFirstPage=add_page_number, onLaterPages=add_page_number)
print(f"PDF generated: {OUTPUT_PATH}")
import os
size_kb = os.path.getsize(OUTPUT_PATH) / 1024
print(f"File size: {size_kb:.1f} KB")
if __name__ == "__main__":
main()
cd /home/daytona/workspace/corrosive-poisons && python3 generate_pdf.py
Corrosive Poisons MBBS
PDF Document · PDF
| Section | Content |
|---|---|
| 1 | Introduction & Full Classification (with comparison: acids vs alkalies — coagulative vs liquefactive necrosis) |
| 2 | General Principles of Treatment (all corrosives) — what to DO and NOT DO |
| 3 | Causes of Death with timeline (SPSS mnemonic) |
| 4 | Sulphuric Acid (H₂SO₄) — spoon sign, calm mind, peppery stomach, BaCl₂ test |
| 5 | Nitric Acid (HNO₃) — yellow staining, xanthoprotein reaction, brown ring test |
| 6 | Hydrochloric Acid (HCl) — mildest acid, reddish-brown on dark clothes |
| 7 | Carbolic Acid / Phenol — carboluria, ochronosis, anaesthetic effect |
| 8 | Oxalic Acid — hypocalcaemia, oxalate crystals in kidney, Ca-gluconate antidote |
| 9 | Corrosive Alkalies (NaOH, KOH, NH₃) — why alkalies are MORE dangerous than acids |
| 10 | Master Comparison Table (all 6 poisons side-by-side) |
| 11 | Mnemonics — colour code, fatal dose ladder, unique features per poison |
| 12 | High-yield exam tips + clinical scenario Q&A + Quick Revision Card |
Reduce this to 5-6 pages
~/corrosive-poisons/generate_pdf_compact.py
#!/usr/bin/env python3
"""Compact 5-6 page PDF on Corrosive Poisons for 3rd Year MBBS."""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak
)
import os
OUTPUT_PATH = "/home/daytona/workspace/corrosive-poisons/Corrosive_Poisons_MBBS_Compact.pdf"
# ── Colours ────────────────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1a2b4a")
MED_BLUE = colors.HexColor("#2563eb")
LIGHT_BLUE = colors.HexColor("#dbeafe")
ACCENT_GREEN = colors.HexColor("#16a34a")
LIGHT_GREEN = colors.HexColor("#dcfce7")
ACCENT_RED = colors.HexColor("#dc2626")
LIGHT_RED = colors.HexColor("#fee2e2")
ACCENT_ORANGE= colors.HexColor("#ea580c")
LIGHT_ORANGE = colors.HexColor("#ffedd5")
ACCENT_PURPLE= colors.HexColor("#7c3aed")
LIGHT_PURPLE = colors.HexColor("#ede9fe")
YELLOW_BG = colors.HexColor("#fef9c3")
YELLOW_BORDER= colors.HexColor("#ca8a04")
GRAY_LIGHT = colors.HexColor("#f1f5f9")
GRAY_TEXT = colors.HexColor("#64748b")
WHITE = colors.white
BLACK = colors.black
# ── Page footer ────────────────────────────────────────────────────────────────
def footer(canvas_obj, doc):
canvas_obj.saveState()
canvas_obj.setFont("Helvetica", 7.5)
canvas_obj.setFillColor(GRAY_TEXT)
canvas_obj.drawString(1*cm, 0.6*cm, "Corrosive Poisons | Forensic Medicine & Toxicology | 3rd Year MBBS")
canvas_obj.drawRightString(A4[0]-1*cm, 0.6*cm, f"Page {doc.page}")
canvas_obj.restoreState()
# ── Style factory ──────────────────────────────────────────────────────────────
def S():
def ps(name, **kw):
defaults = dict(fontName='Helvetica', fontSize=9, leading=12,
textColor=BLACK, spaceAfter=2, spaceBefore=0,
alignment=TA_LEFT)
defaults.update(kw)
return ParagraphStyle(name, **defaults)
return {
'title': ps('title', fontSize=18, fontName='Helvetica-Bold',
textColor=WHITE, alignment=TA_CENTER, leading=22, spaceAfter=0),
'sub': ps('sub', fontSize=10, textColor=colors.HexColor("#bfdbfe"),
alignment=TA_CENTER, leading=13),
'h1': ps('h1', fontSize=11, fontName='Helvetica-Bold',
textColor=WHITE, leading=14, spaceAfter=0),
'h2': ps('h2', fontSize=10, fontName='Helvetica-Bold',
textColor=DARK_BLUE, leading=13, spaceAfter=1, spaceBefore=4),
'body': ps('body', fontSize=8.5, alignment=TA_JUSTIFY, leading=12, spaceAfter=1),
'b': ps('b', fontSize=8.5, fontName='Helvetica-Bold', leading=11, spaceAfter=1),
'bullet': ps('bul', fontSize=8.5, leftIndent=10, leading=11, spaceAfter=1),
'th': ps('th', fontSize=8, fontName='Helvetica-Bold', textColor=WHITE,
alignment=TA_CENTER, leading=10),
'td': ps('td', fontSize=8, leading=10, spaceAfter=0),
'tdc': ps('tdc', fontSize=8, alignment=TA_CENTER, leading=10, spaceAfter=0),
'mnem': ps('mn', fontSize=8.5, fontName='Helvetica-Bold',
textColor=colors.HexColor("#78350f"), alignment=TA_CENTER,
leading=12, spaceAfter=0),
'mnem_b': ps('mnb', fontSize=8.5, textColor=colors.HexColor("#1c1917"),
leading=11, leftIndent=8, spaceAfter=1),
'tip': ps('tip', fontSize=8, fontName='Helvetica-Bold',
textColor=colors.HexColor("#166534"), leading=11, spaceAfter=1),
'note': ps('note', fontSize=7.5, textColor=GRAY_TEXT,
alignment=TA_CENTER, fontName='Helvetica-Oblique', leading=10),
}
# ── Helpers ────────────────────────────────────────────────────────────────────
W = 18.4 * cm # usable width
def sec_hdr(text, st):
"""Dark-blue full-width section header bar."""
tbl = Table([[Paragraph(f" {text}", st['h1'])]], colWidths=[W])
tbl.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), DARK_BLUE),
('TOPPADDING', (0,0),(-1,-1), 5),
('BOTTOMPADDING', (0,0),(-1,-1), 5),
('LEFTPADDING', (0,0),(-1,-1), 8),
]))
return tbl
def box(paras, bg, border, st, title=None):
"""Coloured info box."""
content = []
if title:
content.append(Paragraph(title, st['b']))
content.extend(paras)
tbl = Table([[ content ]], colWidths=[W - 0.6*cm])
tbl.setStyle(TableStyle([
('BACKGROUND', (0,0),(-1,-1), bg),
('BOX', (0,0),(-1,-1), 1.2, border),
('TOPPADDING', (0,0),(-1,-1), 5),
('BOTTOMPADDING', (0,0),(-1,-1), 5),
('LEFTPADDING', (0,0),(-1,-1), 8),
('RIGHTPADDING', (0,0),(-1,-1), 8),
]))
return tbl
def mnem_box(word, items, st):
"""Compact mnemonic box."""
rows = [[Paragraph(f"🧠 {word}", st['mnem'])]]
rows += [[Paragraph(f"<b>{l}</b> — {d}", st['mnem_b'])] for l, d in items]
tbl = Table(rows, colWidths=[W - 0.6*cm])
tbl.setStyle(TableStyle([
('BACKGROUND', (0,0),(0,0), YELLOW_BG),
('BACKGROUND', (0,1),(-1,-1), colors.HexColor("#fffbeb")),
('BOX', (0,0),(-1,-1), 1.5, YELLOW_BORDER),
('LINEBELOW', (0,0),(0,0), 1, YELLOW_BORDER),
('TOPPADDING', (0,0),(-1,-1), 4),
('BOTTOMPADDING', (0,0),(-1,-1), 4),
('LEFTPADDING', (0,0),(-1,-1), 10),
]))
return tbl
def tbl(headers, rows, widths, st, alt=GRAY_LIGHT):
"""Styled table."""
h_row = [Paragraph(h, st['th']) for h in headers]
data = [h_row]
for row in rows:
data.append([Paragraph(str(c), st['td']) for c in row])
t = Table(data, colWidths=widths, repeatRows=1)
t.setStyle(TableStyle([
('BACKGROUND', (0,0),(-1,0), DARK_BLUE),
('ROWBACKGROUNDS',(0,1),(-1,-1), [WHITE, alt]),
('GRID', (0,0),(-1,-1), 0.4, colors.HexColor("#cbd5e1")),
('VALIGN', (0,0),(-1,-1), 'TOP'),
('TOPPADDING', (0,0),(-1,-1), 3),
('BOTTOMPADDING', (0,0),(-1,-1), 3),
('LEFTPADDING', (0,0),(-1,-1), 4),
('RIGHTPADDING', (0,0),(-1,-1), 4),
]))
return t
def sp(n=3):
return Spacer(1, n*mm)
# ══════════════════════════════════════════════════════════════════════════════
def build(st):
story = []
# ── TITLE BANNER ──────────────────────────────────────────────────────────
hdr = Table([
[Paragraph("CORROSIVE POISONS", st['title'])],
[Paragraph("Forensic Medicine & Toxicology • 3rd Year MBBS • Quick Revision", st['sub'])],
], colWidths=[W])
hdr.setStyle(TableStyle([
('BACKGROUND', (0,0),(-1,-1), DARK_BLUE),
('TOPPADDING', (0,0),(-1,-1), 10),
('BOTTOMPADDING', (0,0),(-1,-1), 10),
('LEFTPADDING', (0,0),(-1,-1), 12),
]))
story.append(hdr)
story.append(sp(3))
# ── 1. DEFINITION & CLASSIFICATION ───────────────────────────────────────
story.append(sec_hdr("1. DEFINITION & CLASSIFICATION", st))
story.append(sp(2))
story.append(Paragraph(
"<b>Corrosive poisons</b> fix, destroy, and erode surfaces on contact. "
"They cause <b>immediate structural destruction</b> (vs irritants which cause inflammation). "
"In concentrated form, organic acids (carbolic, oxalic) and metallic salts also act as corrosives.",
st['body']
))
story.append(sp(2))
class_rows = [
["Strong Mineral Acids", "H₂SO₄ (Sulphuric), HCl (Hydrochloric), HNO₃ (Nitric)"],
["Strong Organic Acids", "Carbolic acid (Phenol), Oxalic acid, Glacial acetic acid"],
["Acid-like Corrosives", "Dimethyl sulphate, Diethyl sulphate, SO₂, Ozone"],
["Corrosive Alkalies", "NaOH (caustic soda), KOH (caustic potash), NH₃, Na₂CO₃, K₂CO₃"],
["Metallic Salts", "KCN, FeCl₃, Chromates, Bichromates of alkalis"],
]
story.append(tbl(["Category", "Examples"], class_rows, [5*cm, 13.4*cm], st))
story.append(sp(2))
# Acids vs Alkalies side by side
story.append(Paragraph("Acids vs. Alkalies — Key Difference", st['h2']))
diff_rows = [
["Mechanism", "Coagulation necrosis (precipitates proteins)", "Liquefactive necrosis (saponifies fats, dissolves proteins)"],
["Eschar", "Hard, dry, leathery — self-limiting", "Soft, oedematous, translucent — NOT self-limiting"],
["Depth", "Shallower", "DEEPER — more dangerous"],
["Charring", "PRESENT", "ABSENT"],
["Vomitus pH", "Acidic", "ALKALINE"],
["Overall danger", "Dangerous", "MORE dangerous than acids"],
]
story.append(tbl(["Feature", "ACIDS", "ALKALIES (more dangerous!)"],
diff_rows, [3.5*cm, 7.4*cm, 7.5*cm], st,
alt=colors.HexColor("#fff1f2")))
story.append(sp(2))
story.append(mnem_box("SHN-COA = The 6 Key Corrosives", [
("S", "Sulphuric acid"),
("H", "Hydrochloric acid"),
("N", "Nitric acid"),
("C", "Carbolic acid (Phenol)"),
("O", "Oxalic acid"),
("A", "Alkalies (NaOH, KOH, NH₃)"),
], st))
story.append(sp(3))
# ── 2. GENERAL TREATMENT & CAUSES OF DEATH ────────────────────────────────
story.append(sec_hdr("2. GENERAL TREATMENT & CAUSES OF DEATH", st))
story.append(sp(2))
# Treatment in 2 columns
tx_left = [
"⛔ NO gastric lavage / emesis (perforation risk)",
"✅ Levin tube lavage ONLY within 30 min",
"✅ Dilute + neutralise: MgO / Al(OH)₃ gel / CaO; or milk, white of egg, olive oil",
"✅ Bismuth subcarbonate 30 g",
"✅ Morphine 15 mg i.m./i.v. (pain relief)",
"✅ Ca-gluconate 10 mL of 10% i.v.",
]
tx_right = [
"✅ Blood transfusion if needed",
"✅ Tracheostomy if glottic oedema",
"✅ O₂ + artificial respiration",
"✅ Corticosteroids — prevent oesophageal stricture",
"✅ Daily ½-inch bougie — prevent stricture",
"⛔ Avoid NaHCO₃/Na₂CO₃ (CO₂ → distension → perforation)",
]
tx_data = [[Paragraph(l, st['bullet']), Paragraph(r, st['bullet'])]
for l, r in zip(tx_left, tx_right)]
tx_tbl = Table(tx_data, colWidths=[W/2 - 0.3*cm, W/2 - 0.3*cm])
tx_tbl.setStyle(TableStyle([
('BACKGROUND', (0,0),(-1,-1), LIGHT_GREEN),
('BOX', (0,0),(-1,-1), 1.2, ACCENT_GREEN),
('TOPPADDING', (0,0),(-1,-1), 2),
('BOTTOMPADDING', (0,0),(-1,-1), 2),
('LEFTPADDING', (0,0),(-1,-1), 5),
]))
story.append(tx_tbl)
story.append(sp(2))
story.append(Paragraph("Causes of Death Timeline", st['h2']))
death_rows = [
["Within hours", "Shock OR spasm/oedema of glottis → asphyxia"],
["Within 24 hours", "Perforation of stomach → peritonitis + shock"],
["Within 1 week", "Septicaemia / septic absorption"],
["Weeks to months", "Mediastinitis / peritonitis from oesophageal perforation"],
["Months to years", "Stricture (oesophageal/pyloric) → malnutrition/exhaustion"],
]
story.append(tbl(["Timing", "Cause"], death_rows, [4*cm, 14.4*cm], st))
story.append(sp(1))
story.append(mnem_box("SPSS — Causes of Death", [
("S", "Shock (hours)"),
("P", "Perforation → Peritonitis (24 hrs)"),
("S", "Septicaemia (1 week)"),
("S", "Stricture → Starvation (months-years)"),
], st))
story.append(PageBreak())
# ── 3. INDIVIDUAL ACIDS ───────────────────────────────────────────────────
story.append(sec_hdr("3. INDIVIDUAL CORROSIVE ACIDS — KEY FACTS", st))
story.append(sp(2))
# ---- H2SO4 ---------------------------------------------------------------
story.append(box([
Paragraph("<b>H₂SO₄ — Sulphuric Acid (Oil of Vitriol)</b>", st['b']),
Paragraph("Fatal dose: <b>5 mL</b> | Fatal period: <b>12–24 hr</b> | SG: <b>1.84</b> (heaviest mineral acid)", st['body']),
], LIGHT_BLUE, MED_BLUE, st))
h2so4_rows = [
["Properties", "Colourless, oily, odourless; chars/blackens organic matter; hygroscopic (extracts water)"],
["Burn colour", "Brown-BLACK, parchment-like, leathery eschar"],
["GI effects", "Oesophagus relatively resistant; PYLORIC region most susceptible; peppery feel of stomach"],
["Systemic sign", "MIND REMAINS CALM until death (pathognomonic)"],
["Unique signs", "Spoon sign — lips/mouth spared when acid taken by spoon; chalky-white teeth"],
["Autopsy", "Brownish-black spots on chin/cheek/neck (trickling); peritoneum contains black grumous fluid"],
["Identification", "BaCl₂ → white precipitate (BaSO₄, insoluble in HCl)"],
["Medicolegal", "Acid attacks (vitriolage); suicidal (most common mineral acid)"],
]
story.append(tbl(["Feature", "Detail"], h2so4_rows, [3.5*cm, 14.9*cm], st))
story.append(sp(2))
# ---- HNO3 ----------------------------------------------------------------
story.append(box([
Paragraph("<b>HNO₃ — Nitric Acid (Aqua Fortis)</b>", st['b']),
Paragraph("Fatal dose: <b>8 mL</b> | Fatal period: <b>12–24 hr</b> | Turns yellow on exposure to air (NO₂ liberation)", st['body']),
], LIGHT_ORANGE, ACCENT_ORANGE, st))
hno3_rows = [
["Burn colour", "YELLOW staining of skin + tissues (xanthoprotein reaction — nitration of aromatic AAs)"],
["Key point", "External tissues = yellow; but oesophagus/stomach = brown-black (acid haematin — NOT yellow)"],
["Perforation", "LESS common than H₂SO₄"],
["Tests", "Xanthoprotein test (yellow); Brown ring test (FeSO₄ + H₂SO₄ → brown ring at junction = nitrates); Bile + NH₃ added to yellow stain → NO change"],
["Other", "Inhalation: congested lungs; right auricular lining shows inflammatory changes"],
["Medicolegal", "Accidental/suicidal; rarely homicidal; Aqua regia = HNO₃ + 3HCl (dissolves gold)"],
]
story.append(tbl(["Feature", "Detail"], hno3_rows, [3.5*cm, 14.9*cm], st))
story.append(sp(2))
# ---- HCl ----------------------------------------------------------------
story.append(box([
Paragraph("<b>HCl — Hydrochloric Acid (Muriatic Acid)</b>", st['b']),
Paragraph("Fatal dose: <b>15 mL</b> (LEAST dangerous mineral acid) | Normal gastric constituent", st['body']),
], LIGHT_GREEN, ACCENT_GREEN, st))
hcl_rows = [
["Properties", "Colourless fuming; commercial = muriatic acid (yellow); most VOLATILE mineral acid"],
["Burn colour", "Does NOT stain skin; mucosa turns grey-white → brown-black; dark clothes → REDDISH-BROWN"],
["Symptoms", "Milder than H₂SO₄/HNO₃; does NOT corrode skin; fumes → spasm of glottis, suffocation"],
["Medicolegal", "Accidental/suicidal; least commonly used for acid attacks"],
]
story.append(tbl(["Feature", "Detail"], hcl_rows, [3.5*cm, 14.9*cm], st))
story.append(sp(2))
story.append(mnem_box("ACID COLOUR CODE", [
("H₂SO₄", "→ Brown-BLACK (chars)"),
("HNO₃", "→ YELLOW (xanthoprotein)"),
("HCl", "→ Grey-white → brown | Reddish-brown on dark clothes"),
], st))
story.append(PageBreak())
# ── 4. CARBOLIC ACID & OXALIC ACID ───────────────────────────────────────
story.append(sec_hdr("4. CARBOLIC ACID (PHENOL) & OXALIC ACID", st))
story.append(sp(2))
# 2-column layout
phenol_col = [
Paragraph("<b>Carbolic Acid — Phenol (C₆H₅OH)</b>", st['b']),
Paragraph(f"Fatal dose: <b>2 g</b> (SMALLEST — rapidly absorbed through skin)", st['body']),
Paragraph("Conc >5% = corrosive; dilute = irritant; 1-2% = antiseptic (Dettol parent compound)", st['body']),
sp(1),
Paragraph("<b>Unique Signs (EXAM FAVOURITES):</b>", st['b']),
Paragraph("• <b>Carboluria:</b> Urine turns <b>dark olive-green on exposure to air</b> (oxidation of pyrocatechol + hydroquinone)", st['bullet']),
Paragraph("• <b>Ochronosis:</b> Pigmentation of cornea, cartilages, venous complexes in chronic poisoning", st['bullet']),
Paragraph("• <b>Local anaesthetic effect</b> — initially numbs pain (misleading)", st['bullet']),
Paragraph("• Smell of carbolic acid on breath", st['bullet']),
Paragraph("• Convulsions + lockjaw (trismus)", st['bullet']),
Paragraph("• Causes of death: Syncope OR Asphyxia", st['bullet']),
sp(1),
Paragraph("<b>Treatment:</b>", st['b']),
Paragraph("• Gastric lavage with charcoal + castor oil + MgSO₄ until washings clear + odourless", st['bullet']),
Paragraph("• IV saline + NaHCO₃ (7 g/L) — combats collapse + promotes excretion", st['bullet']),
Paragraph("• O₂ + artificial respiration", st['bullet']),
sp(1),
Paragraph("<b>Autopsy:</b>", st['b']),
Paragraph("• Dark brown excoriations mouth/chin; splashing marks", st['bullet']),
Paragraph("• Characteristic phenol smell throughout body", st['bullet']),
Paragraph("• Liver: fatty degeneration; Kidneys: tubular necrosis", st['bullet']),
]
oxalic_col = [
Paragraph("<b>Oxalic Acid — (COOH)₂</b>", st['b']),
Paragraph(f"Fatal dose: <b>15–30 g</b> (LARGEST — hence mostly accidental)", st['body']),
Paragraph("White crystals; sour taste; occurs naturally in spinach, rhubarb. <b>Often mistaken for MgSO₄ (Epsom salt)</b>", st['body']),
sp(1),
Paragraph("<b>Mechanism:</b>", st['b']),
Paragraph("• Binds calcium → insoluble calcium oxalate → <b>hypocalcaemia</b>", st['bullet']),
Paragraph("• Also directly corrosive at high concentrations", st['bullet']),
sp(1),
Paragraph("<b>Clinical Phases:</b>", st['b']),
Paragraph("• <b>Acute:</b> Mainly hypocalcaemia — muscle irritability, convulsions, numbness/tingling fingers + legs, CVS collapse, coma (NOT primarily GI!)", st['bullet']),
Paragraph("• <b>Delayed:</b> Uraemia — oliguria/anuria with <b>calcium oxalate crystals in urine</b>", st['bullet']),
sp(1),
Paragraph("<b>Antidote:</b> Ca-gluconate 10 mL of 10% i.v. at intervals; lavage with calcium lactate", st['body']),
Paragraph("<b>Parathyroid extract</b> 100 units i.m. in severe cases", st['body']),
sp(1),
Paragraph("<b>Autopsy:</b>", st['b']),
Paragraph("• Skin RARELY burned", st['bullet']),
Paragraph("• Mucosa: white 'bleached' appearance", st['bullet']),
Paragraph("• <b>Kidneys: swollen + congested; tubules show oxalate crystals (PATHOGNOMONIC)</b>", st['bullet']),
sp(1),
Paragraph("<b>Medicolegal:</b> Accidental (MgSO₄ confusion); suicidal rare; homicidal very rare (bitter taste)", st['body']),
]
two_col = Table([[phenol_col, oxalic_col]],
colWidths=[W/2 - 0.3*cm, W/2 - 0.3*cm])
two_col.setStyle(TableStyle([
('BACKGROUND', (0,0),(0,0), LIGHT_PURPLE),
('BACKGROUND', (1,0),(1,0), LIGHT_BLUE),
('BOX', (0,0),(0,0), 1, ACCENT_PURPLE),
('BOX', (1,0),(1,0), 1, MED_BLUE),
('VALIGN', (0,0),(-1,-1), 'TOP'),
('TOPPADDING', (0,0),(-1,-1), 6),
('BOTTOMPADDING', (0,0),(-1,-1), 6),
('LEFTPADDING', (0,0),(-1,-1), 6),
('RIGHTPADDING', (0,0),(-1,-1), 6),
]))
story.append(two_col)
story.append(PageBreak())
# ── 5. CORROSIVE ALKALIES ─────────────────────────────────────────────────
story.append(sec_hdr("5. CORROSIVE ALKALIES", st))
story.append(sp(2))
story.append(box([
Paragraph("⚠️ Concentrated alkalies are <b>MORE DANGEROUS than acids</b> — liquefactive necrosis has NO self-limiting eschar → deeper penetration.", st['body']),
], LIGHT_RED, ACCENT_RED, st))
story.append(sp(2))
# Fatal doses table
alkali_rows = [
["KOH (Caustic potash)", "5 g", "Cleaning agents; most dangerous"],
["NaOH (Caustic soda / Lye)", "5 g", "Drain openers, pipe cleaners"],
["K₂CO₃ (Pearl ash)", "18 g", ""],
["Na₂CO₃ (Washing soda)", "30 g", "Common household cleaner"],
["NH₃ (Ammonia)", "30 g", "Volatile; dangerous by inhalation"],
["Ammonium carbonate", "–", "Smelling salts (low conc)"],
]
story.append(tbl(["Substance", "Fatal Dose", "Notes"],
alkali_rows, [5.5*cm, 2.5*cm, 10.4*cm], st))
story.append(sp(2))
# Action + signs in 2 columns
action_col = [
Paragraph("<b>Action Produced</b>", st['b']),
Paragraph("• Absorbs water from tissues", st['bullet']),
Paragraph("• Precipitates proteins → proteinates", st['bullet']),
Paragraph("• Saponifies fats → soaps", st['bullet']),
Paragraph("→ Soft, necrotic, deeply penetrating lesions (liquefactive necrosis)", st['body']),
sp(1),
Paragraph("<b>Signs & Symptoms</b>", st['b']),
Paragraph("• Soft, oedematous, translucent, reddish-brown lesions", st['bullet']),
Paragraph("• <b>NO charring</b> (key difference from acids)", st['bullet']),
Paragraph("• Vomitus is <b>ALKALINE</b>", st['bullet']),
Paragraph("• Purging; mucus + blood in stools", st['bullet']),
Paragraph("• Strong alkali: blisters on mouth/lips", st['bullet']),
]
ammonia_col = [
Paragraph("<b>Ammonia — Special Features</b>", st['b']),
Paragraph("• Inhalation → lacrimation, sneezing, choking", st['bullet']),
Paragraph("• Sudden collapse → <b>oedema of glottis → death</b>", st['bullet']),
Paragraph("• Can cause PERFORATION of stomach", st['bullet']),
sp(1),
Paragraph("<b>Treatment</b>", st['b']),
Paragraph("• Neutralise with vegetable acids (dilute vinegar, lemon juice)", st['bullet']),
Paragraph("• Demulcents: milk, white of egg, olive oil", st['bullet']),
Paragraph("• NO emesis; copious water for skin/eye burns", st['bullet']),
Paragraph("• Corticosteroids to prevent stricture", st['bullet']),
sp(1),
Paragraph("<b>Autopsy</b>", st['b']),
Paragraph("• Soft, gelatinous, translucent mucosa (vs leathery in acids)", st['bullet']),
Paragraph("• Soap-like pale lesions; no charring", st['bullet']),
Paragraph("• Deeper penetration through all wall coats", st['bullet']),
]
alk_cols = Table([[action_col, ammonia_col]],
colWidths=[W/2 - 0.3*cm, W/2 - 0.3*cm])
alk_cols.setStyle(TableStyle([
('BACKGROUND', (0,0),(-1,-1), LIGHT_RED),
('BOX', (0,0),(0,0), 1, ACCENT_RED),
('BOX', (1,0),(1,0), 1, ACCENT_RED),
('VALIGN', (0,0),(-1,-1), 'TOP'),
('TOPPADDING', (0,0),(-1,-1), 6),
('BOTTOMPADDING', (0,0),(-1,-1), 6),
('LEFTPADDING', (0,0),(-1,-1), 6),
('RIGHTPADDING', (0,0),(-1,-1), 6),
]))
story.append(alk_cols)
story.append(PageBreak())
# ── 6. MASTER TABLE + MNEMONICS + EXAM TIPS ───────────────────────────────
story.append(sec_hdr("6. MASTER COMPARISON + MNEMONICS + EXAM TIPS", st))
story.append(sp(2))
story.append(Paragraph("Master Comparison Table", st['h2']))
master_rows = [
["H₂SO₄", "5 mL", "Brown-BLACK", "Calm mind; Spoon sign; Peppery stomach; BaCl₂→white ppt", "MgO, Al(OH)₃"],
["HNO₃", "8 mL", "YELLOW (xanthoprotein)","Yellow staining; Brown ring test; Less perforation", "MgO, Al(OH)₃"],
["HCl", "15 mL", "Grey-white→brown", "Least dangerous; Reddish-brown on dark clothes; Volatile", "MgO, Al(OH)₃"],
["Phenol", "2 g", "White→brown", "Carboluria (dark green urine); Ochronosis; Anaesthetic", "NaHCO₃ IV; Castor oil lavage"],
["Oxalic", "15-30 g","White/bleached", "Hypocalcaemia; Oxalate crystals in kidney (pathognomonic)", "Ca-gluconate 10% 10 mL IV"],
["NaOH/KOH", "5 g", "Soft; NO charring", "Liquefactive necrosis; More dangerous than acids", "Vegetable acids"],
["NH₃", "30 g", "Oedema; NO charring", "Inhalation → glottic oedema → sudden death", "Vegetable acids"],
]
story.append(tbl(
["Poison", "Fatal Dose", "Burn Colour", "Unique Feature / Test", "Antidote"],
master_rows,
[2.3*cm, 2.2*cm, 3.3*cm, 6.7*cm, 3.9*cm], st
))
story.append(sp(3))
# Mnemonics row
story.append(Paragraph("Key Mnemonics", st['h2']))
mn1 = mnem_box("FATAL DOSE LADDER", [
("2 g", "Phenol ← smallest"),
("5 mL", "H₂SO₄ (also KOH/NaOH = 5 g)"),
("8 mL", "HNO₃"),
("15 mL", "HCl ← largest mineral acid"),
("15-30 g","Oxalic acid ← largest overall"),
], st)
mn2 = mnem_box("ONE UNIQUE THING EACH", [
("H₂SO₄", "Calm mind + Spoon sign"),
("HNO₃", "Yellow (xanthoprotein)"),
("HCl", "Reddish-brown on dark cloth"),
("Phenol","Dark-green urine on air"),
("Oxalic","Oxalate crystals in kidney"),
("Alkali","No charring + More dangerous"),
], st)
mn_row = Table([[mn1, mn2]], colWidths=[W/2 - 0.3*cm, W/2 - 0.3*cm])
mn_row.setStyle(TableStyle([
('TOPPADDING', (0,0),(-1,-1), 0),
('BOTTOMPADDING', (0,0),(-1,-1), 0),
('LEFTPADDING', (0,0),(-1,-1), 0),
('RIGHTPADDING', (0,0),(-1,-1), 3),
]))
story.append(mn_row)
story.append(sp(3))
# Exam tips
story.append(Paragraph("⭐ High-Yield One-Liners for Exams", st['h2']))
tips = [
("Calm mind till end", "H₂SO₄"),
("Yellow staining = xanthoprotein", "HNO₃"),
("BaCl₂ → white ppt", "H₂SO₄ test"),
("Reddish-brown on dark clothes", "HCl"),
("Carboluria — dark green urine", "Phenol"),
("Ochronosis", "Phenol (chronic)"),
("Oxalate crystals in kidney", "Oxalic acid (pathognomonic)"),
("Mistaken for Epsom salts", "Oxalic acid"),
("No charring; alkaline vomitus", "Corrosive alkali"),
("More dangerous than acids", "Corrosive alkali"),
("Liquefactive necrosis", "Alkali"),
("Avoid NaHCO₃ as antidote", "All mineral acids (CO₂ → perforation)"),
("Perforation most common", "H₂SO₄"),
("NH₃ → glottic oedema + sudden death", "Ammonia"),
("Stricture complication 3 wk–3 mo","All corrosive acids"),
("Peppery feel of stomach (PM)", "H₂SO₄"),
("Spoon sign", "H₂SO₄ — lips/mouth spared"),
("Brown ring test", "HNO₃ (nitrates)"),
]
tip_rows = [[Paragraph(f"• {t}", st['tip']), Paragraph(f"→ {a}", st['b'])]
for t, a in tips]
# split into 2 columns of 9 each
col1 = tip_rows[:9]
col2 = tip_rows[9:]
# pad col2 to same length
while len(col2) < len(col1):
col2.append([Paragraph("", st['tip']), Paragraph("", st['b'])])
half_w = W/2 - 0.5*cm
t1 = Table(col1, colWidths=[half_w*0.65, half_w*0.35])
t2 = Table(col2, colWidths=[half_w*0.65, half_w*0.35])
for t_obj in [t1, t2]:
t_obj.setStyle(TableStyle([
('BACKGROUND', (0,0),(-1,-1), YELLOW_BG),
('BOX', (0,0),(-1,-1), 1, YELLOW_BORDER),
('GRID', (0,0),(-1,-1), 0.3, colors.HexColor("#fde68a")),
('TOPPADDING', (0,0),(-1,-1), 2),
('BOTTOMPADDING', (0,0),(-1,-1), 2),
('LEFTPADDING', (0,0),(-1,-1), 5),
('RIGHTPADDING', (0,0),(-1,-1), 4),
]))
tips_row = Table([[t1, t2]], colWidths=[W/2 - 0.3*cm, W/2 - 0.3*cm])
tips_row.setStyle(TableStyle([
('TOPPADDING', (0,0),(-1,-1), 0),
('BOTTOMPADDING', (0,0),(-1,-1), 0),
('LEFTPADDING', (0,0),(-1,-1), 0),
('RIGHTPADDING', (0,0),(-1,-1), 0),
]))
story.append(tips_row)
story.append(sp(3))
story.append(Paragraph(
"Source: P C Dikshit Textbook of Forensic Medicine and Toxicology; "
"The Essentials of Forensic Medicine and Toxicology (36th Ed., 2026)",
st['note']
))
return story
# ══════════════════════════════════════════════════════════════════════════════
def main():
styles = S()
doc = SimpleDocTemplate(
OUTPUT_PATH,
pagesize=A4,
rightMargin=1.3*cm, leftMargin=1.3*cm,
topMargin=1.2*cm, bottomMargin=1.5*cm,
title="Corrosive Poisons — 3rd Year MBBS",
author="Orris Medical AI",
subject="Forensic Medicine & Toxicology",
)
story = build(styles)
doc.build(story, onFirstPage=footer, onLaterPages=footer)
size_kb = os.path.getsize(OUTPUT_PATH) / 1024
print(f"PDF: {OUTPUT_PATH} ({size_kb:.1f} KB)")
if __name__ == "__main__":
main()
cd /home/daytona/workspace/corrosive-poisons && python3 generate_pdf_compact.py
python3 -c "from pypdf import PdfReader; r = PdfReader('/home/daytona/workspace/…
Corrosive Poisons MBBS Compact
PDF Document · PDF
Add the topic vitriolage
~/corrosive-poisons/generate_pdf_compact.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/corrosive-poisons/generate_pdf_compact.py'
~/corrosive-poisons/generate_pdf_compact.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/corrosive-poisons/generate_pdf_compact.py'
~/corrosive-poisons/generate_pdf_compact.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/corrosive-poisons/generate_pdf_compact.py'
cd /home/daytona/workspace/corrosive-poisons && python3 generate_pdf_compact.py
python3 -c "from pypdf import PdfReader; r = PdfReader('/home/daytona/workspace/…
~/corrosive-poisons/generate_pdf_compact.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/corrosive-poisons/generate_pdf_compact.py'
~/corrosive-poisons/generate_pdf_compact.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/corrosive-poisons/generate_pdf_compact.py'
~/corrosive-poisons/generate_pdf_compact.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/corrosive-poisons/generate_pdf_compact.py'
~/corrosive-poisons/generate_pdf_compact.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/corrosive-poisons/generate_pdf_compact.py'
cd /home/daytona/workspace/corrosive-poisons && python3 generate_pdf_compact.py …
~/corrosive-poisons/generate_pdf_compact.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/corrosive-poisons/generate_pdf_compact.py'
cd /home/daytona/workspace/corrosive-poisons && python3 generate_pdf_compact.py …
Corrosive Poisons MBBS Compact
PDF Document · PDF
Now generate a video explanation of this pdf
Generate a video narration script with timestamps for the corrosive poisons content
ls /home/daytona/workspace/corrosive-poisons/
~/corrosive-poisons/Corrosive_Poisons_Narration_Script.md
# CORROSIVE POISONS — VIDEO NARRATION SCRIPT ### Forensic Medicine & Toxicology | 3rd Year MBBS ### Estimated Total Duration: ~28–32 minutes ### Format: Lecture-style narration with slide/screen cues --- > **PRODUCTION NOTES** > - Speaking pace: ~130 words/minute (clear, teaching pace) > - [SLIDE X] = cue to advance to that slide or PDF page > - [PAUSE] = brief 1–2 second pause for emphasis > - [HIGHLIGHT] = on-screen pointer/highlight cue > - Bold text = stress these words while speaking --- ## [00:00 – 00:45] INTRO [SLIDE: Title Banner — CORROSIVE POISONS] "Hello everyone, and welcome to this revision lecture on **Corrosive Poisons** — one of the most important topics in Forensic Medicine and Toxicology for your third-year MBBS exams. By the end of this video, you will know the classification of all corrosive poisons, how each one looks, smells, and kills, exactly what to do when a patient walks in with corrosive poisoning, and — very importantly — the unique features of each poison that examiners love to test. We will also cover **Vitriolage**, or acid attacks, including the legal sections under the Bharatiya Nyaya Sanhita. Let's get started." --- ## [00:45 – 03:30] SECTION 1 — DEFINITION & CLASSIFICATION [SLIDE: Definition & Classification] "First — what is a corrosive poison? A **corrosive** is a substance that **fixes, destroys, and erodes** the surface it comes into contact with. Unlike irritant poisons, which cause inflammation, corrosives cause **immediate structural destruction**. They don't just irritate — they dissolve. [PAUSE] Now, the classic classification. You need to know this cold. [HIGHLIGHT: Classification table] **Group 1 — Strong Mineral Acids.** These are the inorganic acids: Sulphuric acid, Hydrochloric acid, and Nitric acid. Remember them as the **Big Three mineral acids.** **Group 2 — Strong Organic Acids.** Carbolic acid — also called Phenol — Oxalic acid, and Glacial acetic acid. **Group 3 — Acid-like Corrosives.** Dimethyl sulphate, Diethyl sulphate, Sulphur dioxide, and Ozone. **Group 4 — Corrosive Alkalies.** Sodium hydroxide — caustic soda — Potassium hydroxide — caustic potash — Ammonia, Sodium carbonate, and Potassium carbonate. **Group 5 — Metallic salts** acting as corrosives — like Potassium cyanide, Ferric chloride, and Chromates. [PAUSE] For quick recall, use the mnemonic **SHN-COA.** [HIGHLIGHT: Mnemonic box] S — Sulphuric acid. H — Hydrochloric acid. N — Nitric acid. C — Carbolic acid. O — Oxalic acid. A — Alkalies. Six poisons. SHN-COA. Say it a few times and it sticks. [PAUSE] Now, the **most important conceptual difference** you must know — Acids versus Alkalies. [HIGHLIGHT: Comparison table] Acids cause **Coagulation necrosis.** They precipitate proteins, form a hard, dry, leathery eschar — and that eschar is **self-limiting.** It actually stops the acid from going deeper. Alkalies cause **Liquefactive necrosis.** They saponify fats and dissolve proteins. The lesion is soft, oedematous, translucent, soapy — and there is **no self-limiting eschar.** So the alkali keeps penetrating deeper and deeper. This is why — and write this down — **Concentrated alkalies are MORE dangerous than acids.** [PAUSE] Another way to remember: Acids = Armour — they harden the tissue and stop themselves. Alkalies = Angry — they melt through everything. The clinical signs confirm this. Acid burns give you charring. Alkali burns — no charring. Acid vomitus is acidic. Alkali vomitus is alkaline. Easy to differentiate at the bedside." --- ## [03:30 – 06:00] SECTION 2 — GENERAL TREATMENT & CAUSES OF DEATH [SLIDE: General Treatment & Causes of Death] "Before we go into individual poisons, let's nail the **general treatment** that applies to ALL corrosive poisoning cases. The single most important rule — and examiners test this every year — is this: [HIGHLIGHT: Red warning box] **DO NOT give gastric lavage or induce emesis.** Why? Because the stomach and oesophagus are already thinned out by the corrosive. If you shove a tube down or make the patient vomit, you risk **perforation.** Re-exposure of the oesophagus to the vomited corrosive makes things worse. [PAUSE] The exception — a Levin tube can be passed **very carefully** within 30 minutes of ingestion, with the patient positioned carefully to avoid perforation. [HIGHLIGHT: Green treatment box] Step by step: One — Dilute and neutralise immediately. Give plenty of water with Magnesium oxide, Aluminium hydroxide gel, or Calcium oxide. If these are unavailable, give milk, white of egg, olive oil, or soap solution. Two — Bismuth subcarbonate, 30 grams orally. Three — Morphine 15 milligrams intramuscularly or intravenously for pain relief. Four — Calcium gluconate, 10 millilitres of a 10 percent solution, intravenously. Five — Tracheostomy if there is oedema of the glottis. Six — Corticosteroids — and this is high yield — to **prevent oesophageal stricture.** Seven — Daily passage of a bougie — also to prevent stricture formation. [PAUSE] And the thing you must absolutely avoid — do NOT use sodium bicarbonate or sodium carbonate as antidotes for acid poisoning. These alkaline compounds react with acid and produce **Carbon dioxide gas.** That gas distends the already-damaged stomach and can cause perforation. So never use them. [PAUSE] Now, causes of death. Use the mnemonic **SPSS.** [HIGHLIGHT: SPSS mnemonic box] S — Shock. Occurs within a few hours. From circulatory collapse. P — Perforation leading to Peritonitis. Within 24 hours. S — Septicaemia. Within the first week. S — Stricture and Starvation. This is the long-term cause. Oesophageal or pyloric stricture develops over months to years, causing malnutrition and exhaustion. SPSS. Hours, 24 hours, 1 week, months to years." --- ## [06:00 – 11:00] SECTION 3 — SULPHURIC ACID [SLIDE: Sulphuric Acid — H₂SO₄] "Now let's go through each acid individually. We start with the **most important** corrosive poison — **Sulphuric acid**, also known as **Oil of Vitriol.** [HIGHLIGHT: Blue properties box] Properties first. Pure sulphuric acid is colourless, odourless, and oily. Its specific gravity is 1.84 — the **heaviest of the three mineral acids.** The commercial form is dark brown or black, due to organic impurities — that's the 'oil of vitriol' you see in acid attack cases. The fatal dose is just **5 millilitres.** That's one teaspoon. The fatal period is 12 to 24 hours. It is profoundly hygroscopic — it pulls water out of tissues — and that's how it chars and destroys them. [PAUSE] Mode of action. Sulphuric acid works in multiple ways: It extracts water from tissues — hygroscopic charring. It precipitates proteins — coagulation necrosis. It converts haemoglobin to haematin — giving that characteristic brownish-black colour. The oesophageal mucosa is relatively resistant. But the **pyloric region of the stomach** — the outlet — is the most susceptible part. Necrosis most commonly occurs there. [PAUSE] Signs and symptoms. The patient presents with severe burning pain from mouth to stomach. The mucosa of the mouth, tongue, and lips turns grayish-white initially, then **brownish-black and leathery.** The teeth appear chalky-white. You will see trickle marks — brownish-black parchment-like burns along the chin, cheeks, neck, and chest — from where the acid trickled down. The abdomen is board-like and rigid. [PAUSE] Now, two **pathognomonic signs** — things only seen in sulphuric acid poisoning: [HIGHLIGHT: Exam tip box] **First — The mind remains calm until death.** This is a classic exam favourite. The patient is in excruciating physical pain, the body is shutting down, but the mental state remains clear right until the end. No delirium, no confusion. **Second — The Spoon Sign.** If a patient took the acid by spoon, the lips and mouth escape injury entirely. The acid goes straight to the back of the mouth and down. So at autopsy, you find a badly burned oesophagus and stomach, but the lips and oral mucosa look normal. [PAUSE] Autopsy findings. Externally — brownish-black corroded spots on chin, cheeks, neck. Chalky-white teeth. The oesophagus shows inflammation and haemorrhage but perforation is rare here. The **stomach mucosa** is inflamed, oedematous, blackened, with a characteristic **peppery feel.** If the stomach perforated, the peritoneal cavity contains black, grumous, acidic fluid — altered blood mixed with stomach contents. [PAUSE] Identification test — add **Barium Chloride** to a sample. You get a **white precipitate of Barium Sulphate**, which is insoluble in hydrochloric acid. That confirms sulphuric acid. Medicolegally — sulphuric acid is the most common acid used in **acid attacks** — vitriolage. We'll come back to that in detail." --- ## [11:00 – 14:30] SECTION 4 — NITRIC ACID & HYDROCHLORIC ACID [SLIDE: Nitric Acid — HNO₃] "Moving on to **Nitric acid** — Aqua Fortis. [HIGHLIGHT: Orange properties box] The **one word** you must remember for nitric acid is **YELLOW.** Pure nitric acid is colourless, but it turns yellow on exposure to air or light because it liberates nitrogen dioxide. More importantly — when it contacts protein in tissues, it causes the **Xanthoprotein reaction** — the nitration of aromatic amino acids — and this produces a **deep yellow staining** of all affected tissues. Fatal dose: 8 millilitres. Fatal period: 12 to 24 hours. [PAUSE] Here is the critical distinction examiners love to test: [HIGHLIGHT: Key point] **External tissues — skin, clothes — turn YELLOW.** But the **oesophagus and stomach** turn **brown-black** — because acid haematin forms there, just like in sulphuric acid. So if a question says yellow staining of skin and clothes — Nitric acid. If it says brown-black internally — that's still Nitric acid. [PAUSE] Perforation is **less common** with nitric acid compared to sulphuric acid. The identification tests are the Xanthoprotein test — yellow staining with protein — and the **Brown ring test**: add Ferrous sulphate solution, then layer sulphuric acid underneath. You get a brown ring at the junction — this tests for nitrates. Also note — bile added to the yellow staining produces **no colour change** — this differentiates it from bile staining. [SLIDE: Hydrochloric Acid — HCl] Now, **Hydrochloric acid** — Muriatic acid. HCl is the **least dangerous** of the three mineral acids. Fatal dose is 15 millilitres — three times the fatal dose of sulphuric acid. And it is a normal constituent of our own gastric juice, so the body handles it somewhat better. The commercial form — muriatic acid — is yellow-coloured. [PAUSE] Key distinguishing features: HCl does **NOT stain the skin** — unlike nitric acid which gives yellow, or sulphuric acid which chars. But it does stain **dark-coloured clothes reddish-brown.** That is unique to HCl. It is the **most volatile** of the three mineral acids. So it readily causes respiratory tract injuries — spasm of the glottis, irritation of air passages, symptoms of suffocation — even from inhaling fumes. The mucosa turns grey-white, then brown or black — acid haematin again — but the symptoms are milder overall." --- ## [14:30 – 18:30] SECTION 5 — CARBOLIC ACID & OXALIC ACID [SLIDE: Carbolic Acid — Phenol] "Now we come to the two organic acid corrosives — and both have **extremely high-yield unique features.** First — **Carbolic acid**, or **Phenol.** [HIGHLIGHT: Purple properties box] Fatal dose: just **2 grams.** That is the smallest fatal dose among all corrosives. And it is dangerous because it is rapidly absorbed not just from the gut but also through intact skin. You don't have to swallow it — spilling it on skin can cause systemic toxicity. Concentrated phenol above 5 percent is corrosive. Dilute is irritant. At 1 to 2 percent — it is an antiseptic. Dettol contains a phenol derivative. [PAUSE] Two unique features you absolutely must know: [HIGHLIGHT: Exam box] **Feature One — Carboluria.** When phenol is metabolised, it produces pyrocatechol and hydroquinone as oxidation products. The patient passes urine that initially looks normal or slightly greenish. But on standing — on exposure to air — it oxidises and turns **dark olive green.** This is carboluria, and it is pathognomonic of carbolic acid poisoning. Classic exam vignette: 'A patient passes urine that turns dark green on standing.' Answer — carbolic acid poisoning. **Feature Two — Ochronosis.** In chronic phenol exposure, hydroquinone and pyrocatechol deposit in the cornea, cartilages, and venous complexes, causing a pigmentation called ochronosis. This is also seen in alkaptonuria. [PAUSE] Another unique feature — carbolic acid has a **local anaesthetic effect.** It numbs the tissue it contacts. So initially the patient may feel less pain than expected — which can be misleading. Causes of death: either **Syncope** — sudden cardiovascular collapse — or **Asphyxia** from respiratory failure, oedema of glottis, or pneumonia. [PAUSE] Treatment — stomach lavage with warm water plus activated charcoal, castor oil, and magnesium sulphate — these form harmless compounds with phenol. Intravenous saline with sodium bicarbonate 7 grams per litre — this combats circulatory collapse and promotes urinary excretion of phenol. [SLIDE: Oxalic Acid] Now — **Oxalic acid.** Fatal dose: 15 to 30 grams — the **largest fatal dose** among common corrosives. Because you need a large amount, most cases are **accidental**, not suicidal. The most common scenario — it is **mistaken for Magnesium sulphate**, or Epsom salt. They look similar — both white crystals. [PAUSE] Mechanism — oxalic acid binds calcium to form insoluble calcium oxalate. This causes **hypocalcaemia.** And here is the key clinical point — in large-dose acute poisoning, the symptoms are **primarily those of hypocalcaemia**, not GI symptoms. [HIGHLIGHT: Phases] Acute phase: Muscle irritability, convulsions, numbness and tingling of fingertips and legs, cardiovascular collapse, stupor, and coma. Delayed phase: Uraemia — oliguria or anuria — and **calcium oxalate crystals in the urine and in the kidney tubules.** This is pathognomonic. [PAUSE] At autopsy — the kidneys are swollen and congested, and the **tubules show oxalate crystals.** That is the single most testable autopsy finding in oxalic acid. Antidote — **Calcium gluconate, 10 millilitres of a 10 percent solution, intravenously.** It converts soluble oxalate to insoluble calcium oxalate, reducing absorption. Gastric lavage is done with calcium lactate solution." --- ## [18:30 – 21:30] SECTION 6 — CORROSIVE ALKALIES [SLIDE: Corrosive Alkalies] "Now — **Corrosive Alkalies.** And I want you to really understand why these are so dangerous. [HIGHLIGHT: Red warning box] Write this down: **Concentrated corrosive alkalies are MORE dangerous than acids.** Acids cause coagulation necrosis — they harden the tissue and form a barrier that limits further penetration. Alkalies cause liquefactive necrosis — they keep dissolving deeper and deeper because there is no protective eschar. The lesions in alkali burns are **soft, oedematous, translucent, and soapy** — not hard and leathery like acid burns. And there is **no charring.** [PAUSE] The main alkaline corrosives and their fatal doses: [HIGHLIGHT: Fatal dose table] Potassium hydroxide and Sodium hydroxide — **5 grams.** That's the same fatal dose as sulphuric acid — showing just how dangerous these are. Potassium carbonate — 18 grams. Sodium carbonate, washing soda — 30 grams. Ammonia — 30 grams. [PAUSE] Mechanism: Alkalies absorb water from tissues, precipitate proteins to form proteinates, and saponify fats to form soaps. All of this produces soft, necrotic, deeply penetrating injuries. Signs and symptoms: Soft, swollen, reddish-brown lesions. No charring. Vomitus is alkaline — you can test it with litmus. Purging with mucus and blood in stools. Strong alkali ingestion causes blistering of the mouth and lips. [PAUSE] Special mention — **Ammonia.** Ammonia vapour inhalation is a unique danger. Inhaling concentrated ammonia causes tearing, sneezing, choking, and can lead to **sudden collapse and death from oedema of the glottis.** Ammonia can also cause **perforation of the stomach** — which is less common with other alkalies. [PAUSE] Treatment — neutralise with vegetable acids. Dilute vinegar, lemon juice. Give demulcents — milk, white of egg. No emesis. Copious water for skin and eye burns. Corticosteroids to prevent stricture." --- ## [21:30 – 26:00] SECTION 7 — VITRIOLAGE [SLIDE: Vitriolage — Acid / Vitriol Throwing] "Now — **Vitriolage.** This is a medico-legally extremely important topic, and it has been coming up repeatedly in university exams. [PAUSE] **Definition:** Vitriolage is the act of throwing any corrosive substance — an acid, alkali, or other corrosive — on the face or body of a victim, with **malicious intent** — out of jealousy, hatred, or vengeance — with the purpose of disfiguring the face, destroying vision, or causing bodily injury. [PAUSE] Why is it called vitriolage? Because **Sulphuric acid** is also known as **oil of vitriol** — and it is the most commonly used substance in acid attacks. [HIGHLIGHT: Substances used] But other substances are also used: Nitric acid, Carbolic acid, Corrosive alkalies like NaOH and KOH, Iodine, and — interestingly — the juice of the **Marking nut**, Semecarpus anacardium, and **Calotropis juice.** These are plant-derived corrosives. A unique delivery method — people sometimes fill an **old electric bulb with acid** and hurl it at the victim. The bulb shatters on impact, spraying the acid. [PAUSE] The burns from vitriolage have **characteristic features:** [HIGHLIGHT: Burn features] **First — the burns are initially PAINLESS.** The acid devitalises nerve endings. This is important — the victim may not immediately realise the severity. **Second — they are PENETRATING.** The acid goes deep into tissue layers. **Third — TRICKLE MARKS.** The corrosive runs down the face and body, leaving linear burn tracks — characteristic of acid attacks. **Fourth — NO VESICATION** — no blisters. Unlike thermal burns which form blisters, chemical burns from acids do not. **Fifth — Colour of stains:** Yellow staining — Nitric acid. Brown-black staining — Sulphuric acid. Slow repair, permanent scarring, and contracture follow. If the **eyes** are involved, **blindness** results. [PAUSE] Causes of death in vitriolage: Shock from extensive burns, Toxaemia, Infection and septicaemia. [PAUSE] **Treatment of acid attack:** **Step one** — Immediately wash the affected area with **large amounts of water and soap,** or a dilute solution of sodium or potassium bicarbonate. **Step two** — Apply a thick paste of **Magnesium oxide or Magnesium carbonate.** **Step three** — Cover the raw surface with Tannic acid jelly, Soframycin, or Penicillin tulle gauze dressing. **For eyes** — Irrigate copiously with water, then irrigate with **1% sodium bicarbonate solution.** Instil a few drops of **olive oil or castor oil.** Then treat corneal ulcers with **Atropine ointment, Hydrocortisone, and Antibiotics.** [PAUSE] Now — the **medicolegal classification of injury in vitriolage.** This is very frequently asked. [HIGHLIGHT: Injury classification] **Blindness from vitriolage — constitutes Grievous Injury.** **Scar tissue formation — constitutes Grievous Injury.** **Vitriolage itself — constitutes Dangerous Injury.** [PAUSE] And the legal sections — under the **Bharatiya Nyaya Sanhita 2023** — the new criminal law that replaced the IPC: [HIGHLIGHT: Legal table] **BNS Section 124(1)** — corresponding to the old IPC Section 326A — covers causing permanent or partial damage by throwing or administering acid with intent or knowledge. Punishment: **Minimum 10 years — up to Life imprisonment, plus a fine that must be paid to the victim as compensation.** **BNS Section 124(2)** — corresponding to IPC 326B — covers throwing acid or attempting to throw acid causing damage. Punishment: **5 to 7 years plus fine.** [PAUSE] Remember the mnemonic — **ACID ATTACK** — for vitriolage: A — Any corrosive — H₂SO₄ most common C — Colour: Yellow is HNO₃; Brown-Black is H₂SO₄ I — Intent is malicious D — Disfigurement — Destroys vision — Grievous injury A — Always wash with water first — MgO paste T — Trickle marks — Penetrating painless burns T — Ten years to life under BNS 124(1) A — Acid bulb trick — electric bulb filled with acid C — Contracture; Corneal ulcers treated with atropine + steroids K — Kills via shock, toxaemia, infection" --- ## [26:00 – 29:30] SECTION 8 — MASTER TABLE & MNEMONICS [SLIDE: Master Comparison Table] "Let's now do a rapid-fire review using the master comparison table. [HIGHLIGHT: Master table — go column by column] **Sulphuric acid** — Fatal dose 5 mL — Brown-black burn — Calm mind, Spoon sign, Peppery stomach, BaCl₂ test — Antidote: MgO, Al(OH)₃. **Nitric acid** — Fatal dose 8 mL — YELLOW burn — Xanthoprotein, Brown ring test, Less perforation — Antidote: MgO, Al(OH)₃. **HCl** — Fatal dose 15 mL — Grey-white to brown — Reddish-brown on dark clothes, Most volatile, Least dangerous mineral acid — Antidote: MgO, Al(OH)₃. **Phenol** — Fatal dose 2 g — White to brown — Carboluria, Ochronosis, Anaesthetic — Antidote: NaHCO₃ IV, Castor oil lavage. **Oxalic acid** — Fatal dose 15–30 g — White/bleached — Hypocalcaemia, Oxalate crystals in kidney — Antidote: Calcium gluconate 10% IV. **NaOH and KOH** — Fatal dose 5 g — Soft, no charring — Liquefactive necrosis, More dangerous than acids — Antidote: Vegetable acids. **Ammonia** — Fatal dose 30 g — Oedema, no charring — Glottic oedema, sudden death — Antidote: Vegetable acids. [PAUSE] [SLIDE: Fatal Dose Ladder Mnemonic] Now the **fatal dose ladder.** Remember it in ascending order: [HIGHLIGHT: Mnemonic] 2 grams — Phenol — the smallest. 5 millilitres — Sulphuric acid — and remember KOH and NaOH also kill at 5 grams. 8 millilitres — Nitric acid. 15 millilitres — Hydrochloric acid — the largest among the mineral acids. 15 to 30 grams — Oxalic acid — the largest overall — which is why it's mostly accidental. Phenol, H₂SO₄, HNO₃, HCl, Oxalic acid. 2, 5, 8, 15, 15–30." --- ## [29:30 – 32:00] SECTION 9 — RAPID-FIRE EXAM TIPS & CLOSE [SLIDE: High-Yield One-Liners] "Last section — rapid-fire one-liners. These are the kind of facts that come as single-best-answer or short-note questions. [Read at a slightly faster pace, one per second with a beat] Calm mind till death — Sulphuric acid. Yellow staining — Nitric acid. BaCl₂ gives white precipitate — Sulphuric acid test. Reddish-brown on dark clothes — Hydrochloric acid. Carboluria — dark green urine on air exposure — Carbolic acid. Ochronosis — Carbolic acid, chronic. Oxalate crystals in kidney tubules — Oxalic acid — pathognomonic. Mistaken for Epsom salts — Oxalic acid. No charring, alkaline vomitus — Corrosive alkali. MORE dangerous than acids — Corrosive alkali. Liquefactive necrosis — Alkali. Avoid NaHCO₃ as antidote in acid poisoning — CO₂ causes perforation. Perforation most common — Sulphuric acid. Ammonia inhalation — glottic oedema — sudden death. Stricture complication 3 weeks to 3 months — All corrosive acids. Peppery feel of stomach at autopsy — Sulphuric acid. Spoon sign — Sulphuric acid. Brown ring test — Nitric acid — tests for nitrates. Vitriolage — acid attack — H₂SO₄ most common. Painless penetrating burns with trickle marks — Vitriolage. BNS 124(1) — 10 years to life — acid causing grievous hurt. BNS 124(2) — 5 to 7 years — attempt to throw acid. Blindness from acid attack — Grievous injury. Scar tissue formation — Grievous injury. [PAUSE] [SLIDE: Quick Revision Card] And finally — the Quick Revision Card at the end of your PDF. Before any exam, run through this table once. Every poison, fatal dose, burn colour, unique feature, and antidote — all in one place. [PAUSE] Alright, that's a wrap on Corrosive Poisons. Key takeaways to walk away with: **One** — SHN-COA — the six key corrosives. **Two** — Alkalies are MORE dangerous than acids — liquefactive necrosis. **Three** — Never give gastric lavage or emesis. Never use NaHCO₃ for acids. **Four** — Sulphuric acid: calm mind, spoon sign, BaCl₂ test. **Five** — HNO₃: yellow staining, xanthoprotein. **Six** — Phenol: carboluria, dark green urine, fatal dose only 2 grams. **Seven** — Oxalic acid: hypocalcaemia, oxalate crystals in kidney, Ca-gluconate antidote. **Eight** — Vitriolage: painless penetrating trickle-mark burns, BNS 124(1) — 10 years to life. Good luck in your exams. You've got this." --- ## [END — 32:00] --- # PRODUCTION REFERENCE SHEET | Segment | Timestamp | Duration | PDF Page | |---|---|---|---| | Intro | 00:00 | 0:45 | Title | | Definition & Classification | 00:45 | 2:45 | Page 1 | | Acids vs Alkalies | 02:30 | 1:00 | Page 1 | | General Treatment | 03:30 | 1:30 | Page 2 | | Causes of Death (SPSS) | 05:00 | 1:00 | Page 2 | | Sulphuric Acid | 06:00 | 5:00 | Page 3 | | Nitric Acid | 11:00 | 2:00 | Page 3 | | Hydrochloric Acid | 13:00 | 1:30 | Page 3 | | Carbolic Acid / Phenol | 14:30 | 2:30 | Page 4 | | Oxalic Acid | 17:00 | 1:30 | Page 4 | | Corrosive Alkalies | 18:30 | 3:00 | Page 5 | | Vitriolage | 21:30 | 4:30 | Page 6 | | Master Table & Mnemonics | 26:00 | 3:30 | Page 7 | | Rapid-fire Exam Tips & Close | 29:30 | 2:30 | Page 7 | | **TOTAL** | | **~32 min** | | --- # RECORDING TIPS - Use the PDF on a second screen and advance slides as cues appear - Record in a quiet environment; use a decent USB microphone - Use OBS Studio (free) or Camtasia to screen-record the PDF while you narrate - Add simple on-screen highlights using PowerPoint or Canva as your slide base - Export at 1080p, 30fps for YouTube/WhatsApp quality --- *Sources: P C Dikshit Textbook of Forensic Medicine and Toxicology; The Essentials of Forensic Medicine and Toxicology 36th Ed. (2026); Parikh's Textbook of Medical Jurisprudence Forensic Medicine and Toxicology*
~/corrosive-poisons/generate_script_pdf.py
#!/usr/bin/env python3
"""Convert narration script markdown to a clean, printable PDF."""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak
import re, os
OUTPUT = "/home/daytona/workspace/corrosive-poisons/Corrosive_Poisons_Narration_Script.pdf"
SCRIPT = "/home/daytona/workspace/corrosive-poisons/Corrosive_Poisons_Narration_Script.md"
DARK_BLUE = colors.HexColor("#1a2b4a")
MED_BLUE = colors.HexColor("#2563eb")
LIGHT_BLUE = colors.HexColor("#dbeafe")
DARK_GREEN = colors.HexColor("#14532d")
LIGHT_GREEN = colors.HexColor("#dcfce7")
ACCENT_GREEN= colors.HexColor("#16a34a")
YELLOW_BG = colors.HexColor("#fef9c3")
YELLOW_BDR = colors.HexColor("#ca8a04")
GRAY = colors.HexColor("#f1f5f9")
GRAY_TEXT = colors.HexColor("#64748b")
ORANGE_BG = colors.HexColor("#ffedd5")
ORANGE_BDR = colors.HexColor("#ea580c")
WHITE = colors.white
BLACK = colors.black
def footer(c, doc):
c.saveState()
c.setFont("Helvetica", 7.5)
c.setFillColor(GRAY_TEXT)
c.drawString(1.5*cm, 0.7*cm, "Corrosive Poisons — Video Narration Script | 3rd Year MBBS")
c.drawRightString(A4[0]-1.5*cm, 0.7*cm, f"Page {doc.page}")
c.restoreState()
def make_styles():
def ps(name, **kw):
d = dict(fontName='Helvetica', fontSize=9.5, leading=14,
textColor=BLACK, spaceAfter=3, spaceBefore=0, alignment=TA_LEFT)
d.update(kw)
return ParagraphStyle(name, **d)
return {
'cover_title': ps('ct', fontSize=22, fontName='Helvetica-Bold', textColor=WHITE,
alignment=TA_CENTER, leading=28, spaceAfter=0),
'cover_sub': ps('cs', fontSize=11, textColor=colors.HexColor("#bfdbfe"),
alignment=TA_CENTER, leading=15),
'cover_tag': ps('ctag', fontSize=9.5, textColor=colors.HexColor("#fef08a"),
alignment=TA_CENTER, fontName='Helvetica-Bold'),
'ts_hdr': ps('tsh', fontSize=11, fontName='Helvetica-Bold', textColor=WHITE,
alignment=TA_LEFT, leading=15),
'h2': ps('h2', fontSize=11, fontName='Helvetica-Bold', textColor=DARK_BLUE,
spaceBefore=8, spaceAfter=2, leading=14),
'timestamp': ps('ts', fontSize=9, fontName='Helvetica-Bold',
textColor=colors.HexColor("#1e40af"),
backColor=colors.HexColor("#eff6ff"),
spaceBefore=6, spaceAfter=2, leading=12),
'cue': ps('cue', fontSize=8.5, fontName='Helvetica-Oblique',
textColor=colors.HexColor("#7c3aed"), leading=12,
spaceAfter=1),
'narration': ps('nar', fontSize=9.5, alignment=TA_JUSTIFY, leading=14,
spaceAfter=4, leftIndent=10),
'bold_nar': ps('bnar', fontSize=9.5, fontName='Helvetica-Bold',
leading=13, spaceAfter=2, leftIndent=10),
'note': ps('note', fontSize=8.5, fontName='Helvetica-Oblique',
textColor=GRAY_TEXT, alignment=TA_CENTER, leading=11),
'th': ps('th', fontSize=8.5, fontName='Helvetica-Bold', textColor=WHITE,
alignment=TA_CENTER, leading=11),
'td': ps('td', fontSize=8.5, leading=11, spaceAfter=0),
'ref_row': ps('rr', fontSize=9, fontName='Helvetica-Bold',
textColor=colors.HexColor("#78350f"), leading=12),
'tip': ps('tip', fontSize=8.5, textColor=DARK_GREEN, leading=12,
fontName='Helvetica-Bold'),
}
W = 17.4*cm
def sec_banner(text, st):
t = Table([[Paragraph(f" {text}", st['ts_hdr'])]], colWidths=[W])
t.setStyle(TableStyle([
('BACKGROUND', (0,0),(-1,-1), DARK_BLUE),
('TOPPADDING', (0,0),(-1,-1), 6),
('BOTTOMPADDING', (0,0),(-1,-1), 6),
]))
return t
def info_box(paras, bg, border):
t = Table([[paras]], colWidths=[W - 0.4*cm])
t.setStyle(TableStyle([
('BACKGROUND', (0,0),(-1,-1), bg),
('BOX', (0,0),(-1,-1), 1.2, border),
('TOPPADDING', (0,0),(-1,-1), 5),
('BOTTOMPADDING', (0,0),(-1,-1), 5),
('LEFTPADDING', (0,0),(-1,-1), 8),
('RIGHTPADDING', (0,0),(-1,-1), 8),
]))
return t
def sp(n=3):
return Spacer(1, n*mm)
def make_table(headers, rows, widths, st):
data = [[Paragraph(h, st['th']) for h in headers]]
for row in rows:
data.append([Paragraph(str(c), st['td']) for c in row])
t = Table(data, colWidths=widths, repeatRows=1)
t.setStyle(TableStyle([
('BACKGROUND', (0,0),(-1,0), DARK_BLUE),
('ROWBACKGROUNDS', (0,1),(-1,-1), [WHITE, GRAY]),
('GRID', (0,0),(-1,-1), 0.4, colors.HexColor("#cbd5e1")),
('VALIGN', (0,0),(-1,-1), 'TOP'),
('TOPPADDING', (0,0),(-1,-1), 3),
('BOTTOMPADDING', (0,0),(-1,-1), 3),
('LEFTPADDING', (0,0),(-1,-1), 5),
('RIGHTPADDING', (0,0),(-1,-1), 5),
]))
return t
def build(st):
story = []
# ── Cover ─────────────────────────────────────────────────────────────────
cover = Table([
[Paragraph("CORROSIVE POISONS", st['cover_title'])],
[Paragraph("Video Narration Script", st['cover_sub'])],
[sp(1)],
[Paragraph("Forensic Medicine & Toxicology • 3rd Year MBBS • ~32 Minutes", st['cover_tag'])],
], colWidths=[W])
cover.setStyle(TableStyle([
('BACKGROUND', (0,0),(-1,-1), DARK_BLUE),
('TOPPADDING', (0,0),(-1,-1), 12),
('BOTTOMPADDING', (0,0),(-1,-1), 12),
('LEFTPADDING', (0,0),(-1,-1), 12),
('RIGHTPADDING', (0,0),(-1,-1), 12),
]))
story.append(cover)
story.append(sp(4))
# How-to-use box
story.append(info_box([
Paragraph("<b>HOW TO USE THIS SCRIPT</b>", st['bold_nar']),
Paragraph("• Read the narration aloud while the PDF is displayed on screen (use a second monitor)", st['narration']),
Paragraph("• [SLIDE X] = advance to that PDF page | [PAUSE] = brief 1-2 second pause | [HIGHLIGHT] = point to on-screen element", st['narration']),
Paragraph("• <b>Bold text</b> = emphasise these words while speaking | Target pace: ~130 words per minute", st['narration']),
Paragraph("• Record using OBS Studio (free) or Camtasia — screen-record the PDF while you narrate", st['narration']),
Paragraph("• Export at 1080p / 30fps for YouTube or WhatsApp quality", st['narration']),
], LIGHT_BLUE, MED_BLUE))
story.append(sp(3))
# Production reference table
story.append(Paragraph("Segment Timeline", st['h2']))
ref_rows = [
["Intro", "00:00", "0:45", "Title"],
["Definition & Classification", "00:45", "2:45", "Page 1"],
["Acids vs Alkalies", "02:30", "1:00", "Page 1"],
["General Treatment", "03:30", "1:30", "Page 2"],
["Causes of Death (SPSS)", "05:00", "1:00", "Page 2"],
["Sulphuric Acid", "06:00", "5:00", "Page 3"],
["Nitric Acid", "11:00", "2:00", "Page 3"],
["Hydrochloric Acid", "13:00", "1:30", "Page 3"],
["Carbolic Acid / Phenol", "14:30", "2:30", "Page 4"],
["Oxalic Acid", "17:00", "1:30", "Page 4"],
["Corrosive Alkalies", "18:30", "3:00", "Page 5"],
["Vitriolage", "21:30", "4:30", "Page 6"],
["Master Table & Mnemonics", "26:00", "3:30", "Page 7"],
["Rapid-fire Tips & Close", "29:30", "2:30", "Page 7"],
["TOTAL", "–", "~32 min","–"],
]
story.append(make_table(["Segment", "Start", "Duration", "PDF Page"],
ref_rows, [6.5*cm, 2.5*cm, 2.5*cm, 5.9*cm], st))
story.append(PageBreak())
# ── SCRIPT SECTIONS ───────────────────────────────────────────────────────
sections = [
{
"title": "INTRO",
"ts": "[00:00 – 00:45]",
"cue": "[SLIDE: Title Banner — CORROSIVE POISONS]",
"lines": [
"Hello everyone, and welcome to this revision lecture on <b>Corrosive Poisons</b> — one of the most important topics in Forensic Medicine and Toxicology for your third-year MBBS exams.",
"By the end of this video, you will know the classification of all corrosive poisons, how each one looks, smells, and kills, exactly what to do when a patient presents with corrosive poisoning, and — very importantly — the unique features of each poison that examiners love to test.",
"We will also cover <b>Vitriolage</b>, or acid attacks, including the legal sections under the Bharatiya Nyaya Sanhita.",
"Let's get started.",
]
},
{
"title": "SECTION 1 — DEFINITION & CLASSIFICATION",
"ts": "[00:45 – 03:30]",
"cue": "[SLIDE: Definition & Classification]",
"lines": [
"First — what is a corrosive poison?",
"A <b>corrosive</b> is a substance that <b>fixes, destroys, and erodes</b> the surface it comes into contact with. Unlike irritant poisons which cause inflammation, corrosives cause <b>immediate structural destruction.</b> They don't just irritate — they dissolve.",
"[PAUSE]",
"Now, the classic classification. You need to know this cold.",
"[HIGHLIGHT: Classification table]",
"<b>Group 1 — Strong Mineral Acids.</b> These are the inorganic acids: Sulphuric acid, Hydrochloric acid, and Nitric acid. Remember them as the Big Three mineral acids.",
"<b>Group 2 — Strong Organic Acids.</b> Carbolic acid — also called Phenol — Oxalic acid, and Glacial acetic acid.",
"<b>Group 3 — Acid-like Corrosives.</b> Dimethyl sulphate, Diethyl sulphate, Sulphur dioxide, and Ozone.",
"<b>Group 4 — Corrosive Alkalies.</b> Sodium hydroxide — caustic soda — Potassium hydroxide — caustic potash — Ammonia, Sodium carbonate, and Potassium carbonate.",
"<b>Group 5 — Metallic salts</b> acting as corrosives — like Potassium cyanide, Ferric chloride, and Chromates.",
"[PAUSE]",
"For quick recall, use the mnemonic <b>SHN-COA.</b>",
"[HIGHLIGHT: Mnemonic box]",
"S — Sulphuric acid. H — Hydrochloric acid. N — Nitric acid. C — Carbolic acid. O — Oxalic acid. A — Alkalies. Six poisons. SHN-COA. Say it a few times and it sticks.",
"[PAUSE]",
"Now, the <b>most important conceptual difference</b> — Acids versus Alkalies.",
"[HIGHLIGHT: Comparison table]",
"Acids cause <b>Coagulation necrosis.</b> They precipitate proteins, form a hard, dry, leathery eschar — and that eschar is <b>self-limiting.</b> It actually stops the acid from going deeper.",
"Alkalies cause <b>Liquefactive necrosis.</b> They saponify fats and dissolve proteins. The lesion is soft, oedematous, translucent, soapy — and there is <b>no self-limiting eschar.</b> So the alkali keeps penetrating deeper and deeper.",
"This is why — and write this down — <b>Concentrated alkalies are MORE dangerous than acids.</b>",
"[PAUSE]",
"Another way to remember: Acids equal Armour — they harden the tissue and stop themselves. Alkalies equal Angry — they melt through everything.",
"Clinically: Acid burns cause charring. Alkali burns — no charring. Acid vomitus is acidic. Alkali vomitus is alkaline.",
]
},
{
"title": "SECTION 2 — GENERAL TREATMENT & CAUSES OF DEATH",
"ts": "[03:30 – 06:00]",
"cue": "[SLIDE: General Treatment & Causes of Death]",
"lines": [
"Before we go into individual poisons, let's nail the <b>general treatment</b> that applies to ALL corrosive poisoning cases.",
"The single most important rule — and examiners test this every year — is this:",
"[HIGHLIGHT: Red warning box]",
"<b>DO NOT give gastric lavage or induce emesis.</b> The stomach and oesophagus are already thinned out by the corrosive. Gastric lavage or vomiting risks <b>perforation,</b> and re-exposes the oesophagus to the corrosive.",
"[PAUSE]",
"The exception — a Levin tube can be passed <b>very carefully</b> within 30 minutes of ingestion.",
"[HIGHLIGHT: Green treatment box]",
"Step by step: <b>One</b> — Dilute and neutralise immediately with water plus Magnesium oxide, Al(OH)₃ gel, or Calcium oxide. If unavailable — milk, white of egg, olive oil, or soap solution.",
"<b>Two</b> — Bismuth subcarbonate 30 grams orally.",
"<b>Three</b> — Morphine 15 mg i.m. or i.v. for pain.",
"<b>Four</b> — Calcium gluconate 10 mL of 10% solution, intravenously.",
"<b>Five</b> — Tracheostomy if oedema of glottis is present.",
"<b>Six</b> — Corticosteroids — to <b>prevent oesophageal stricture.</b> This is high yield.",
"<b>Seven</b> — Daily passage of a bougie to prevent stricture formation.",
"[PAUSE]",
"And absolutely avoid sodium bicarbonate or carbonate as antidotes for acid poisoning — they react with acid to produce <b>CO₂ gas,</b> which distends the damaged stomach and causes perforation.",
"[PAUSE]",
"Causes of death — use the mnemonic <b>SPSS.</b>",
"[HIGHLIGHT: SPSS mnemonic]",
"<b>S</b> — Shock. Within hours. <b>P</b> — Perforation to Peritonitis. Within 24 hours. <b>S</b> — Septicaemia. Within the first week. <b>S</b> — Stricture and Starvation. Months to years.",
"SPSS. Hours, 24 hours, 1 week, months to years.",
]
},
{
"title": "SECTION 3 — SULPHURIC ACID (H₂SO₄ — OIL OF VITRIOL)",
"ts": "[06:00 – 11:00]",
"cue": "[SLIDE: Sulphuric Acid — Page 3]",
"lines": [
"Now let's go through each acid. We start with the <b>most important</b> corrosive — <b>Sulphuric acid,</b> also known as <b>Oil of Vitriol.</b>",
"[HIGHLIGHT: Blue properties box]",
"Properties: Pure sulphuric acid is colourless, odourless, and oily. Specific gravity <b>1.84</b> — the heaviest mineral acid. Commercial form is dark brown-black. <b>Fatal dose: 5 millilitres.</b> Fatal period: 12 to 24 hours. Profoundly hygroscopic — it pulls water out of tissues.",
"[PAUSE]",
"Mode of action: Extracts water from tissues causing charring. Precipitates proteins — coagulation necrosis. Converts haemoglobin to <b>haematin</b> — brownish-black colour. The oesophagus is relatively resistant. But the <b>pyloric region</b> of the stomach is most susceptible — necrosis occurs most here.",
"[PAUSE]",
"Signs and symptoms: Severe burning pain mouth to stomach. Mucosa turns grayish-white, then <b>brownish-black and leathery.</b> Chalky-white teeth. Trickle marks — parchment-like burns along chin, cheeks, neck, and chest.",
"[PAUSE]",
"Two <b>pathognomonic signs</b> — know these cold:",
"[HIGHLIGHT: Exam tip]",
"<b>First — The mind remains calm until death.</b> Excruciating physical pain, body shutting down, but the mental state stays clear to the very end. No confusion, no delirium.",
"<b>Second — The Spoon Sign.</b> If the acid was taken by spoon, the lips and mouth escape injury entirely — the acid bypasses them. At autopsy, normal lips, badly burned stomach.",
"[PAUSE]",
"Autopsy findings: Brownish-black corroded spots on chin, cheeks, neck externally. Chalky-white teeth. Stomach mucosa inflamed, blackened, with <b>peppery feel.</b> If perforated — peritoneal cavity contains black grumous acidic fluid.",
"[PAUSE]",
"Identification test: <b>Barium Chloride</b> produces a <b>white precipitate of Barium Sulphate,</b> insoluble in HCl. Confirms sulphuric acid.",
"Medicolegally — sulphuric acid is the most common acid in <b>acid attacks</b> — vitriolage. More on that shortly.",
]
},
{
"title": "SECTION 4 — NITRIC ACID & HYDROCHLORIC ACID",
"ts": "[11:00 – 14:30]",
"cue": "[SLIDE: Nitric Acid / HCl — Page 3 continued]",
"lines": [
"Moving on to <b>Nitric acid</b> — Aqua Fortis.",
"The <b>one word</b> for nitric acid is <b>YELLOW.</b>",
"[HIGHLIGHT: Orange box]",
"It causes the <b>Xanthoprotein reaction</b> — nitration of aromatic amino acids — producing deep yellow staining of all tissues and clothes. Fatal dose: 8 mL. Fatal period: 12 to 24 hours.",
"[PAUSE]",
"Critical distinction for exams: <b>External tissues turn YELLOW.</b> But the <b>oesophagus and stomach turn brown-black</b> — because acid haematin forms there. So yellow outside, brown-black inside — both are nitric acid.",
"[PAUSE]",
"Identification tests: Xanthoprotein test — yellow with protein. <b>Brown ring test</b> — Ferrous sulphate layered with sulphuric acid gives a brown ring at the junction. Tests for nitrates. And bile added to the yellow stain gives no colour change.",
"Perforation is <b>less common</b> than with sulphuric acid.",
"[PAUSE]",
"Now <b>Hydrochloric acid</b> — Muriatic acid.",
"HCl is the <b>least dangerous</b> mineral acid. Fatal dose: <b>15 millilitres</b> — three times that of sulphuric acid. It is a normal component of our own gastric juice.",
"[PAUSE]",
"Key features: Does <b>NOT stain skin.</b> But stains <b>dark clothes reddish-brown</b> — unique to HCl. Most <b>volatile</b> of the three — inhalation readily causes respiratory symptoms, glottis spasm, suffocation. Symptoms are milder overall.",
]
},
{
"title": "SECTION 5 — CARBOLIC ACID (PHENOL) & OXALIC ACID",
"ts": "[14:30 – 18:30]",
"cue": "[SLIDE: Carbolic Acid & Oxalic Acid — Page 4]",
"lines": [
"Now — the two organic acid corrosives with <b>extremely high-yield unique features.</b>",
"First — <b>Carbolic acid, or Phenol.</b>",
"[HIGHLIGHT: Purple box]",
"Fatal dose: just <b>2 grams.</b> Smallest among all corrosives. Dangerous because it absorbs through intact skin — systemic toxicity without ingestion.",
"[PAUSE]",
"Two unique features you absolutely must know:",
"<b>Feature One — Carboluria.</b> Phenol is metabolised to pyrocatechol and hydroquinone. The patient passes urine that initially looks normal or slightly greenish. But on exposure to air — it oxidises and turns <b>dark olive green.</b> Carboluria. Classic exam vignette — dark green urine on standing — answer is carbolic acid.",
"<b>Feature Two — Ochronosis.</b> In chronic exposure, these metabolites deposit in cornea, cartilages, and venous complexes causing pigmentation. Associated with alkaptonuria.",
"[PAUSE]",
"Also — carbolic acid has a <b>local anaesthetic effect.</b> Initially numbs the tissue — pain may be less than expected — misleading.",
"Causes of death: Syncope, or Asphyxia from respiratory failure, glottic oedema, or pneumonia.",
"[PAUSE]",
"Treatment: Gastric lavage with charcoal plus castor oil plus MgSO₄ until washings are clear and odourless. IV saline with NaHCO₃ 7 g per litre — combats collapse, promotes urinary excretion.",
"[PAUSE]",
"Now — <b>Oxalic acid.</b>",
"Fatal dose: <b>15 to 30 grams</b> — the largest fatal dose. Mostly <b>accidental</b> — commonly <b>mistaken for Magnesium sulphate,</b> Epsom salt. They look identical — both white crystals.",
"[PAUSE]",
"Mechanism: Binds calcium to form insoluble calcium oxalate — causing <b>hypocalcaemia.</b> In acute large-dose poisoning, symptoms are <b>primarily those of hypocalcaemia,</b> not GI symptoms — muscle irritability, convulsions, numbness and tingling of fingertips and legs, cardiovascular collapse, coma.",
"Delayed phase: Uraemia — oliguria or anuria — with <b>calcium oxalate crystals in urine and kidney tubules.</b> Pathognomonic.",
"[PAUSE]",
"Antidote: <b>Calcium gluconate 10 mL of 10% IV.</b> Converts oxalate to insoluble calcium oxalate. Gastric lavage with calcium lactate solution.",
"Autopsy: Kidneys swollen, congested, tubules show oxalate crystals — the most testable autopsy finding in oxalic acid.",
]
},
{
"title": "SECTION 6 — CORROSIVE ALKALIES",
"ts": "[18:30 – 21:30]",
"cue": "[SLIDE: Corrosive Alkalies — Page 5]",
"lines": [
"Now — <b>Corrosive Alkalies.</b>",
"[HIGHLIGHT: Red warning box]",
"Write this down: <b>Concentrated corrosive alkalies are MORE dangerous than acids.</b>",
"Because they cause liquefactive necrosis — they keep dissolving deeper with no self-limiting eschar. Burns are soft, oedematous, translucent, soapy — not hard and leathery. No charring.",
"[PAUSE]",
"Fatal doses: KOH and NaOH — <b>5 grams</b> — same as sulphuric acid. Potassium carbonate — 18 grams. Sodium carbonate — 30 grams. Ammonia — 30 grams.",
"[PAUSE]",
"Mechanism: Alkalies absorb water, precipitate proteins to form proteinates, saponify fats to form soaps — producing soft, necrotic, deeply penetrating injuries.",
"Signs: Soft swollen reddish-brown lesions. No charring. <b>Alkaline vomitus.</b> Purging with mucus and blood. Blistering of mouth and lips.",
"[PAUSE]",
"Special mention — <b>Ammonia.</b> Inhalation causes tearing, sneezing, choking, and can lead to <b>sudden collapse and death from glottic oedema.</b> Ammonia can also perforate the stomach.",
"[PAUSE]",
"Treatment: Neutralise with vegetable acids — dilute vinegar, lemon juice. Demulcents — milk, white of egg. No emesis. Copious water for skin and eye burns. Corticosteroids for stricture prevention.",
]
},
{
"title": "SECTION 7 — VITRIOLAGE (ACID / VITRIOL THROWING)",
"ts": "[21:30 – 26:00]",
"cue": "[SLIDE: Vitriolage — Page 6]",
"lines": [
"Now — <b>Vitriolage.</b> Medico-legally extremely important. Frequently asked in exams.",
"[PAUSE]",
"<b>Definition:</b> Vitriolage is the act of throwing any corrosive substance on the face or body of a victim with <b>malicious intent</b> — out of jealousy, hatred, or vengeance — to disfigure, destroy vision, or cause bodily harm.",
"Called vitriolage because <b>Sulphuric acid</b> is known as <b>oil of vitriol</b> — and it is the most commonly used substance.",
"[PAUSE]",
"Other substances used: Nitric acid, Carbolic acid, Corrosive alkalis — NaOH and KOH — Iodine, juice of the <b>Marking nut</b> — Semecarpus anacardium — and Calotropis juice. Some perpetrators fill <b>old electric bulbs with acid</b> and hurl them at the victim.",
"[PAUSE]",
"Characteristic burn features:",
"<b>Burns are initially PAINLESS</b> — the acid devitalises nerve endings.",
"<b>Burns are PENETRATING</b> — go deep into tissue layers.",
"<b>TRICKLE MARKS</b> — linear burn tracks running down the face and body.",
"<b>NO VESICATION</b> — no blisters, unlike thermal burns.",
"<b>Stain colour:</b> Yellow equals HNO₃. Brown-black equals H₂SO₄.",
"Permanent scarring and contracture. Blindness if eyes involved.",
"[PAUSE]",
"Causes of death: Shock, Toxaemia, Infection and Septicaemia.",
"[PAUSE]",
"<b>Treatment of acid attack:</b>",
"Step one — immediately wash with <b>large amounts of water and soap,</b> or dilute NaHCO₃ or K₂CO₃.",
"Step two — apply thick paste of <b>Magnesium oxide or Magnesium carbonate.</b>",
"Step three — cover with Tannic acid jelly, Soframycin, or Penicillin tulle gauze.",
"For eyes — irrigate copiously with water, then <b>1% sodium bicarbonate solution,</b> instil olive or castor oil, then treat with <b>Atropine ointment, Hydrocortisone, and Antibiotics</b> for corneal ulcers.",
"[PAUSE]",
"Medicolegal classification of injury:",
"[HIGHLIGHT: Injury classification]",
"<b>Blindness from vitriolage</b> — Grievous Injury.",
"<b>Scar tissue formation</b> — Grievous Injury.",
"<b>Vitriolage itself</b> — Dangerous Injury.",
"[PAUSE]",
"Legal sections — <b>Bharatiya Nyaya Sanhita 2023:</b>",
"[HIGHLIGHT: Legal table]",
"<b>BNS Section 124(1)</b> — IPC 326A — causing permanent or partial damage by throwing acid with intent or knowledge. Punishment: <b>Minimum 10 years up to Life imprisonment, plus a fine paid to the victim as compensation.</b>",
"<b>BNS Section 124(2)</b> — IPC 326B — throwing acid or attempting to throw acid causing damage. Punishment: <b>5 to 7 years plus fine.</b>",
"[PAUSE]",
"Mnemonic — <b>ACID ATTACK</b> for vitriolage:",
"A — Any corrosive — H₂SO₄ most common.",
"C — Colour: Yellow is HNO₃; Brown-Black is H₂SO₄.",
"I — Intent is malicious.",
"D — Disfigurement — Destroys vision — Grievous injury.",
"A — Always wash with water first; MgO paste.",
"T — Trickle marks — Penetrating painless burns.",
"T — Ten years to life under BNS 124(1).",
"A — Acid bulb trick — electric bulb filled with acid.",
"C — Contracture; Corneal ulcers: atropine plus steroids.",
"K — Kills via shock, toxaemia, infection.",
]
},
{
"title": "SECTION 8 — MASTER TABLE & MNEMONICS",
"ts": "[26:00 – 29:30]",
"cue": "[SLIDE: Master Comparison Table — Page 7]",
"lines": [
"Rapid-fire review using the master table.",
"[HIGHLIGHT: go row by row]",
"<b>Sulphuric acid</b> — 5 mL — Brown-black — Calm mind; Spoon sign; Peppery stomach; BaCl₂ test — MgO antidote.",
"<b>Nitric acid</b> — 8 mL — YELLOW — Xanthoprotein; Brown ring test; Less perforation — MgO antidote.",
"<b>HCl</b> — 15 mL — Grey-white to brown — Reddish-brown on dark clothes; Most volatile; Least dangerous — MgO antidote.",
"<b>Phenol</b> — 2 g — White to brown — Carboluria; Ochronosis; Anaesthetic — NaHCO₃ IV; Castor oil lavage.",
"<b>Oxalic acid</b> — 15 to 30 g — White, bleached — Hypocalcaemia; Oxalate crystals in kidney — Calcium gluconate 10% IV.",
"<b>NaOH and KOH</b> — 5 g — Soft, no charring — Liquefactive necrosis; More dangerous than acids — Vegetable acids.",
"<b>Ammonia</b> — 30 g — Oedema, no charring — Glottic oedema, sudden death — Vegetable acids.",
"[PAUSE]",
"[HIGHLIGHT: Fatal dose ladder mnemonic]",
"The <b>fatal dose ladder:</b> 2 grams — Phenol — smallest. 5 millilitres — Sulphuric acid — and KOH and NaOH also kill at 5 grams. 8 millilitres — Nitric acid. 15 millilitres — HCl — largest mineral acid. 15 to 30 grams — Oxalic acid — largest overall, mostly accidental.",
]
},
{
"title": "SECTION 9 — RAPID-FIRE EXAM TIPS & CLOSING",
"ts": "[29:30 – 32:00]",
"cue": "[SLIDE: High-Yield One-Liners — Page 7]",
"lines": [
"Last section — rapid-fire one-liners:",
"Calm mind till death — Sulphuric acid. Yellow staining — Nitric acid. BaCl₂ white precipitate — Sulphuric acid test. Reddish-brown on dark clothes — Hydrochloric acid. Carboluria, dark green urine on air — Carbolic acid. Ochronosis — Carbolic acid, chronic. Oxalate crystals in kidney — Oxalic acid, pathognomonic. Mistaken for Epsom salts — Oxalic acid. No charring, alkaline vomitus — Corrosive alkali. More dangerous than acids — Corrosive alkali. Liquefactive necrosis — Alkali. Avoid NaHCO₃ in acid poisoning — CO₂ perforation. Perforation most common — Sulphuric acid. Ammonia inhalation — glottic oedema — sudden death. Stricture complication 3 weeks to 3 months — all corrosive acids. Peppery feel of stomach at autopsy — Sulphuric acid. Spoon sign — Sulphuric acid. Brown ring test — Nitric acid. Vitriolage — H₂SO₄ most common. Painless penetrating trickle-mark burns — Vitriolage. BNS 124(1) — 10 years to life. BNS 124(2) — 5 to 7 years. Blindness — Grievous injury. Scar formation — Grievous injury.",
"[PAUSE]",
"[SLIDE: Quick Revision Card]",
"And finally — the Quick Revision Card at the end of your PDF. Before any exam, run through this table once. Every poison, fatal dose, burn colour, unique feature, and antidote — all in one place.",
"[PAUSE]",
"Alright — that's a wrap on Corrosive Poisons. Eight takeaways:",
"<b>One</b> — SHN-COA — the six key corrosives. <b>Two</b> — Alkalies are MORE dangerous than acids — liquefactive necrosis. <b>Three</b> — Never give gastric lavage or emesis. Never use NaHCO₃ for acids. <b>Four</b> — H₂SO₄: calm mind, spoon sign, BaCl₂ test. <b>Five</b> — HNO₃: yellow staining, xanthoprotein. <b>Six</b> — Phenol: carboluria, dark green urine, fatal dose only 2 grams. <b>Seven</b> — Oxalic acid: hypocalcaemia, oxalate crystals in kidney, calcium gluconate antidote. <b>Eight</b> — Vitriolage: painless penetrating trickle-mark burns, BNS 124(1) — 10 years to life.",
"Good luck in your exams. You've got this.",
]
},
]
st_lookup = {
'[PAUSE]': ('cue', '[PAUSE — 1-2 second beat]'),
'[HIGHLIGHT': ('cue', None),
'[SLIDE': ('cue', None),
'[HIGHLIGHT:': ('cue', None),
}
for sec in sections:
story.append(sec_banner(sec["title"], st))
story.append(sp(1))
# Timestamp + cue
story.append(Paragraph(sec["ts"], st['timestamp']))
story.append(Paragraph(sec["cue"], st['cue']))
story.append(sp(2))
for line in sec["lines"]:
stripped = line.strip()
if not stripped:
story.append(sp(1))
elif stripped.startswith('[PAUSE'):
story.append(Paragraph(" ✦ [PAUSE — 1-2 second beat]", st['cue']))
elif stripped.startswith('[HIGHLIGHT') or stripped.startswith('[SLIDE'):
story.append(Paragraph(f" 📌 {stripped}", st['cue']))
else:
story.append(Paragraph(stripped, st['narration']))
story.append(sp(4))
# Footer note
story.append(Paragraph(
"Source: P C Dikshit Textbook of Forensic Medicine and Toxicology; "
"The Essentials of Forensic Medicine and Toxicology 36th Ed. (2026); "
"Parikh's Textbook of Medical Jurisprudence Forensic Medicine and Toxicology",
st['note']
))
return story
def main():
st = make_styles()
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.8*cm, leftMargin=1.8*cm,
topMargin=1.5*cm, bottomMargin=1.8*cm,
title="Corrosive Poisons — Video Narration Script",
author="Orris Medical AI",
)
story = build(st)
doc.build(story, onFirstPage=footer, onLaterPages=footer)
size = os.path.getsize(OUTPUT) / 1024
print(f"PDF: {OUTPUT} ({size:.1f} KB)")
if __name__ == "__main__":
main()
cd /home/daytona/workspace/corrosive-poisons && python3 generate_script_pdf.py &…
Corrosive Poisons Narration Script
PDF Document · PDF
Corrosive Poisons Narration Script
MD File · MD
| Segment | Timestamp | What you say |
|---|---|---|
| Intro | 00:00 | Hook + what students will learn |
| Definition & Classification | 00:45 | SHN-COA mnemonic + Acids vs Alkalies |
| General Treatment + SPSS | 03:30 | No lavage rule, all treatment steps, death timeline |
| Sulphuric Acid | 06:00 | Calm mind, Spoon sign, BaCl₂ test, peppery stomach |
| Nitric Acid + HCl | 11:00 | Yellow staining, Brown ring test, reddish-brown on clothes |
| Phenol + Oxalic Acid | 14:30 | Carboluria, ochronosis, hypocalcaemia, oxalate crystals |
| Corrosive Alkalies | 18:30 | Liquefactive necrosis, ammonia inhalation, fatal doses |
| Vitriolage | 21:30 | Full definition, burn features, treatment, BNS 124(1) and 124(2) |
| Master Table Rapid-Fire | 26:00 | All 7 poisons in 90 seconds |
| Exam Tips + Close | 29:30 | 24 one-liners + 8 key takeaways |
[SLIDE], [PAUSE], and [HIGHLIGHT] cues tell you exactly when to move or gesture.