Prepare me a pdf containing all the plant poisons with classification

Reading File
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Running Command

mkdir -p /home/daytona/workspace/plant-poisons && ls /home/daytona/workspace/

Writing File

~/plant-poisons/generate_pdf.py

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY

OUTPUT = "/home/daytona/workspace/plant-poisons/Plant_Poisons_Classification.pdf"

# ── colour palette ──────────────────────────────────────────────────────────
GREEN_DARK  = colors.HexColor("#1B4332")
GREEN_MID   = colors.HexColor("#2D6A4F")
GREEN_LIGHT = colors.HexColor("#D8F3DC")
GREEN_PALE  = colors.HexColor("#F0FFF4")
ACCENT      = colors.HexColor("#B7E4C7")
WHITE       = colors.white
BLACK       = colors.HexColor("#1A1A1A")
GREY        = colors.HexColor("#555555")
LIGHT_GREY  = colors.HexColor("#F5F5F5")

# ── styles ───────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()

title_style = ParagraphStyle(
    "DocTitle", fontName="Helvetica-Bold", fontSize=26,
    textColor=WHITE, alignment=TA_CENTER, spaceAfter=4,
    leading=32
)
subtitle_style = ParagraphStyle(
    "DocSubtitle", fontName="Helvetica", fontSize=13,
    textColor=GREEN_LIGHT, alignment=TA_CENTER, spaceAfter=6, leading=18
)
source_style = ParagraphStyle(
    "Source", fontName="Helvetica-Oblique", fontSize=9,
    textColor=ACCENT, alignment=TA_CENTER
)
h1_style = ParagraphStyle(
    "H1", fontName="Helvetica-Bold", fontSize=16,
    textColor=WHITE, alignment=TA_LEFT, spaceAfter=6,
    spaceBefore=2, leading=20
)
h2_style = ParagraphStyle(
    "H2", fontName="Helvetica-Bold", fontSize=13,
    textColor=GREEN_DARK, alignment=TA_LEFT, spaceBefore=10, spaceAfter=4,
    leading=17
)
h3_style = ParagraphStyle(
    "H3", fontName="Helvetica-Bold", fontSize=11,
    textColor=GREEN_MID, alignment=TA_LEFT, spaceBefore=8, spaceAfter=3,
    leading=15
)
body_style = ParagraphStyle(
    "Body", fontName="Helvetica", fontSize=10,
    textColor=BLACK, alignment=TA_JUSTIFY, spaceAfter=5,
    leading=15
)
bullet_style = ParagraphStyle(
    "Bullet", fontName="Helvetica", fontSize=10,
    textColor=BLACK, alignment=TA_LEFT, spaceAfter=3,
    leftIndent=16, bulletIndent=4, leading=14
)
note_style = ParagraphStyle(
    "Note", fontName="Helvetica-Oblique", fontSize=9,
    textColor=GREY, alignment=TA_LEFT, spaceAfter=4, leading=13
)
table_header_style = ParagraphStyle(
    "TableHdr", fontName="Helvetica-Bold", fontSize=9,
    textColor=WHITE, alignment=TA_CENTER, leading=12
)
table_cell_style = ParagraphStyle(
    "TableCell", fontName="Helvetica", fontSize=9,
    textColor=BLACK, alignment=TA_LEFT, leading=12
)

# ── helpers ──────────────────────────────────────────────────────────────────
def section_header(text):
    """Returns a coloured section-header band."""
    return Table(
        [[Paragraph(text, h1_style)]],
        colWidths=[17 * cm],
        style=TableStyle([
            ("BACKGROUND", (0, 0), (-1, -1), GREEN_DARK),
            ("ROUNDEDCORNERS", [6]),
            ("TOPPADDING",    (0, 0), (-1, -1), 8),
            ("BOTTOMPADDING", (0, 0), (-1, -1), 8),
            ("LEFTPADDING",   (0, 0), (-1, -1), 12),
        ])
    )

def subsection_header(text):
    tbl = Table(
        [[Paragraph(text, ParagraphStyle("SH", fontName="Helvetica-Bold",
            fontSize=12, textColor=WHITE, leading=16))],],
        colWidths=[17 * cm],
        style=TableStyle([
            ("BACKGROUND", (0, 0), (-1, -1), GREEN_MID),
            ("TOPPADDING",    (0, 0), (-1, -1), 6),
            ("BOTTOMPADDING", (0, 0), (-1, -1), 6),
            ("LEFTPADDING",   (0, 0), (-1, -1), 10),
        ])
    )
    return tbl

def poison_card(name, local_names, family, active_principles,
                fatal_dose, fatal_period, symptoms, treatment, medicolegal):
    """Returns a styled flowable block for one poison."""
    elems = []
    # Card title bar
    elems.append(Table(
        [[Paragraph(f"<b>{name}</b>", ParagraphStyle("CardTitle",
            fontName="Helvetica-Bold", fontSize=11, textColor=WHITE, leading=14))]],
        colWidths=[17 * cm],
        style=TableStyle([
            ("BACKGROUND", (0, 0), (-1, -1), GREEN_MID),
            ("TOPPADDING",    (0, 0), (-1, -1), 5),
            ("BOTTOMPADDING", (0, 0), (-1, -1), 5),
            ("LEFTPADDING",   (0, 0), (-1, -1), 8),
        ])
    ))

    # Data rows inside a single border box
    rows = []
    if local_names:
        rows.append(["Local / Other Names:", local_names])
    if family:
        rows.append(["Plant Family:", family])
    if active_principles:
        rows.append(["Active Principles:", active_principles])
    if fatal_dose:
        rows.append(["Fatal Dose:", fatal_dose])
    if fatal_period:
        rows.append(["Fatal Period:", fatal_period])

    if rows:
        t = Table(rows, colWidths=[4.5*cm, 12.5*cm],
            style=TableStyle([
                ("BACKGROUND",    (0, 0), (0, -1), GREEN_PALE),
                ("FONTNAME",      (0, 0), (0, -1), "Helvetica-Bold"),
                ("FONTNAME",      (1, 0), (1, -1), "Helvetica"),
                ("FONTSIZE",      (0, 0), (-1, -1), 9),
                ("TEXTCOLOR",     (0, 0), (0, -1), GREEN_DARK),
                ("TEXTCOLOR",     (1, 0), (1, -1), BLACK),
                ("TOPPADDING",    (0, 0), (-1, -1), 4),
                ("BOTTOMPADDING", (0, 0), (-1, -1), 4),
                ("LEFTPADDING",   (0, 0), (-1, -1), 6),
                ("ROWBACKGROUNDS",(0, 0), (-1, -1), [GREEN_PALE, WHITE]),
                ("GRID",          (0, 0), (-1, -1), 0.3, colors.HexColor("#A8D8BA")),
            ]))
        elems.append(t)

    def mini_section(label, text):
        if not text:
            return
        elems.append(Table(
            [[Paragraph(f"<b>{label}</b>", ParagraphStyle("MiniLbl",
                fontName="Helvetica-Bold", fontSize=9,
                textColor=GREEN_DARK, leading=12))]],
            colWidths=[17*cm],
            style=TableStyle([
                ("BACKGROUND", (0,0),(-1,-1), ACCENT),
                ("TOPPADDING",    (0,0),(-1,-1), 3),
                ("BOTTOMPADDING", (0,0),(-1,-1), 3),
                ("LEFTPADDING",   (0,0),(-1,-1), 8),
            ])
        ))
        elems.append(Table(
            [[Paragraph(text, ParagraphStyle("MiniBody",
                fontName="Helvetica", fontSize=9,
                textColor=BLACK, leading=13, alignment=TA_JUSTIFY))]],
            colWidths=[17*cm],
            style=TableStyle([
                ("BACKGROUND",    (0,0),(-1,-1), WHITE),
                ("TOPPADDING",    (0,0),(-1,-1), 4),
                ("BOTTOMPADDING", (0,0),(-1,-1), 4),
                ("LEFTPADDING",   (0,0),(-1,-1), 8),
                ("RIGHTPADDING",  (0,0),(-1,-1), 8),
                ("BOX",           (0,0),(-1,-1), 0.5, colors.HexColor("#A8D8BA")),
            ])
        ))

    mini_section("Symptoms & Signs", symptoms)
    mini_section("Treatment", treatment)
    mini_section("Medicolegal Aspects", medicolegal)

    # Outer border
    outer = Table([[elem] for elem in elems],
        colWidths=[17*cm],
        style=TableStyle([
            ("BOX",        (0,0),(-1,-1), 1, GREEN_MID),
            ("TOPPADDING", (0,0),(-1,-1), 0),
            ("BOTTOMPADDING",(0,0),(-1,-1), 0),
            ("LEFTPADDING",  (0,0),(-1,-1), 0),
            ("RIGHTPADDING", (0,0),(-1,-1), 0),
        ])
    )
    return [KeepTogether([outer, Spacer(1, 8*mm)])]

# ── DOCUMENT SETUP ──────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
    OUTPUT, pagesize=A4,
    leftMargin=2*cm, rightMargin=2*cm,
    topMargin=2.2*cm, bottomMargin=2*cm,
    title="Plant Poisons - Classification & Forensic Toxicology",
    author="Orris Medical Library",
    subject="Forensic Toxicology"
)

# ── CONTENT ──────────────────────────────────────────────────────────────────
story = []

# ── COVER ────────────────────────────────────────────────────────────────────
cover_bg = Table(
    [[Paragraph("PLANT POISONS", title_style)],
     [Paragraph("Classification, Active Principles, Clinical Features &<br/>Medicolegal Significance", subtitle_style)],
     [Spacer(1, 4*mm)],
     [Paragraph("Sources: PC Dikshit Textbook of Forensic Medicine &amp; Toxicology •<br/>Parikh's Textbook of Medical Jurisprudence, Forensic Medicine &amp; Toxicology •<br/>The Essentials of Forensic Medicine &amp; Toxicology, 36th Ed (2026)", source_style)],
    ],
    colWidths=[17*cm],
    style=TableStyle([
        ("BACKGROUND",    (0,0),(-1,-1), GREEN_DARK),
        ("TOPPADDING",    (0,0),(-1,-1), 30),
        ("BOTTOMPADDING", (0,0),(-1,-1), 30),
        ("LEFTPADDING",   (0,0),(-1,-1), 20),
        ("RIGHTPADDING",  (0,0),(-1,-1), 20),
        ("ROUNDEDCORNERS",[10]),
    ])
)
story.append(cover_bg)
story.append(Spacer(1, 1*cm))

# ── INTRO ─────────────────────────────────────────────────────────────────────
story.append(Paragraph(
    "Plant (Vegetable) poisons are naturally occurring toxic substances derived from plants. "
    "In forensic toxicology, they are classified primarily by their <b>chemical nature</b> and <b>pharmacological action</b>. "
    "Most plant poisons are alkaloids, glycosides, resins, or toxalbumins. "
    "They are of great medicolegal importance in India and worldwide, being used in suicides, homicides, abortions, and cattle poisoning.",
    body_style
))
story.append(Spacer(1, 5*mm))

# ============================================================
# SECTION 1: CLASSIFICATION TABLE
# ============================================================
story.append(section_header("1. Classification of Plant Poisons"))
story.append(Spacer(1, 4*mm))
story.append(Paragraph(
    "Plant poisons are classified according to two major schemes used in forensic medicine:",
    body_style
))

# Sub-heading A
story.append(Paragraph("A. Classification by Chemical Nature (Active Principles)", h2_style))

chem_data = [
    [Paragraph("Class", table_header_style),
     Paragraph("Examples", table_header_style),
     Paragraph("Key Poisons", table_header_style)],
    [Paragraph("Alkaloids", table_cell_style),
     Paragraph("Nitrogenous bases, bitter taste, react with acids", table_cell_style),
     Paragraph("Aconite, Dhatura, Opium, Nux Vomica, Tobacco, Hemlock, Lobelia, Veratrum, Colchicine, Ergot, Pilocarpine, Physostigmine", table_cell_style)],
    [Paragraph("Glycosides", table_cell_style),
     Paragraph("Sugar + aglycone (non-sugar) moiety", table_cell_style),
     Paragraph("Digitalis, Oleander, Calotropis, Bitter Almonds (HCN), Linseed, Arrowroot, Croton", table_cell_style)],
    [Paragraph("Resins / Resinoids", table_cell_style),
     Paragraph("Non-crystalline, insoluble in water", table_cell_style),
     Paragraph("Marking Nut (Semecarpus anacardium), Cannabis (Charas/Hashish), Jalap, Colocynth, Croton oil", table_cell_style)],
    [Paragraph("Toxalbumins (Phytotoxins)", table_cell_style),
     Paragraph("Protein-based lectins / toxins", table_cell_style),
     Paragraph("Ricin (Castor bean), Abrin (Rosary pea/Abrus), Crotin, Robin (Black locust)", table_cell_style)],
    [Paragraph("Fixed Oils / Irritant oils", table_cell_style),
     Paragraph("Oily substances with local/systemic toxicity", table_cell_style),
     Paragraph("Croton oil, Mustard oil (toxic dose), Euphorbia latex", table_cell_style)],
    [Paragraph("Volatile Oils", table_cell_style),
     Paragraph("Aromatic, volatile", table_cell_style),
     Paragraph("Oil of bitter almonds (HCN), Oil of tansy, Oil of pennyroyal, Wormwood (absinthe)", table_cell_style)],
    [Paragraph("Acids / Oxalic acid compounds", table_cell_style),
     Paragraph("Organic acids from plant sources", table_cell_style),
     Paragraph("Rhubarb, Sorrel (oxalic acid poisoning)", table_cell_style)],
]

chem_table = Table(chem_data, colWidths=[3.5*cm, 5.5*cm, 8*cm],
    style=TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), GREEN_DARK),
        ("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, GREEN_PALE]),
        ("GRID",          (0,0), (-1,-1), 0.4, colors.HexColor("#A8D8BA")),
        ("TOPPADDING",    (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING",   (0,0), (-1,-1), 6),
        ("VALIGN",        (0,0), (-1,-1), "TOP"),
    ]))
story.append(chem_table)
story.append(Spacer(1, 6*mm))

# Sub-heading B
story.append(Paragraph("B. Classification by Pharmacological/Systemic Action", h2_style))

pharm_data = [
    [Paragraph("Action / System Affected", table_header_style),
     Paragraph("Plant Poisons", table_header_style)],
    [Paragraph("CNS Stimulants", table_cell_style),
     Paragraph("Nux Vomica (Strychnine), Picrotoxin (Fishberry), Camphor, Cocaine", table_cell_style)],
    [Paragraph("CNS Depressants / Narcotics", table_cell_style),
     Paragraph("Opium & its alkaloids (morphine, codeine, heroin), Cannabis, Hemlock (Conium), Chloral hydrate", table_cell_style)],
    [Paragraph("Deliriants / Anticholinergics", table_cell_style),
     Paragraph("Dhatura (Atropine), Belladonna, Hyoscyamus (Henbane), Mandragora", table_cell_style)],
    [Paragraph("Cardiac Glycoside Poisons", table_cell_style),
     Paragraph("Digitalis (Foxglove), Oleander (Nerium), Calotropis, Squill (Urginea), Lily of the Valley", table_cell_style)],
    [Paragraph("Gastrointestinal / Irritant Poisons", table_cell_style),
     Paragraph("Croton oil, Castor seeds (Ricin), Abrus (Abrin), Calotropis, Colocynth, Jalap, Aloe, Marking Nut, Plumbago, Euphorbia", table_cell_style)],
    [Paragraph("Convulsant / Neurotoxic Poisons", table_cell_style),
     Paragraph("Nux Vomica (Strychnos nux-vomica), Aconite, Ergot", table_cell_style)],
    [Paragraph("Cyanogenic (Hydrogen Cyanide-releasing)", table_cell_style),
     Paragraph("Bitter Almonds, Wild cherry, Cassava, Linseed, Bamboo shoots", table_cell_style)],
    [Paragraph("Cholinergic / Parasympathomimetic", table_cell_style),
     Paragraph("Physostigmine (Calabar bean), Pilocarpine, Muscarine (Amanita mushroom)", table_cell_style)],
    [Paragraph("Hallucinogens", table_cell_style),
     Paragraph("Cannabis (THC), Psilocybin mushrooms, Peyote (Mescaline), Datura", table_cell_style)],
    [Paragraph("Uterotonic / Abortifacients", table_cell_style),
     Paragraph("Ergot (Ergotamine), Plumbago rosea, Calotropis, Abrus, Castor oil", table_cell_style)],
    [Paragraph("Vesicant / Irritant (External)", table_cell_style),
     Paragraph("Marking Nut (Semecarpus anacardium), Plumbago rosea (Lal Chitra), Calotropis juice, Euphorbia", table_cell_style)],
    [Paragraph("Hepatotoxic", table_cell_style),
     Paragraph("Pyrrolizidine alkaloids (Crotalaria, Senecio), Aflatoxins (Aspergillus on groundnuts)", table_cell_style)],
    [Paragraph("Nephrotoxic", table_cell_style),
     Paragraph("Calotropis (systemic), Castor (Ricin), Abrus (Abrin)", table_cell_style)],
]

pharm_table = Table(pharm_data, colWidths=[6*cm, 11*cm],
    style=TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), GREEN_DARK),
        ("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, GREEN_PALE]),
        ("GRID",          (0,0), (-1,-1), 0.4, colors.HexColor("#A8D8BA")),
        ("TOPPADDING",    (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING",   (0,0), (-1,-1), 6),
        ("VALIGN",        (0,0), (-1,-1), "TOP"),
    ]))
story.append(pharm_table)
story.append(Spacer(1, 4*mm))

# Sub-heading C
story.append(Paragraph("C. Classification by Medicolegal Importance (Indian Context)", h2_style))
ml_data = [
    [Paragraph("Category", table_header_style),
     Paragraph("Main Poisons", table_header_style)],
    [Paragraph("Most Commonly Used for Homicide", table_cell_style),
     Paragraph("Aconite (Aconitum ferox), Dhatura, Nux Vomica, Oleander", table_cell_style)],
    [Paragraph("Commonly Used for Suicide", table_cell_style),
     Paragraph("Opium, Cannabis, Dhatura, Aconite, Oleander", table_cell_style)],
    [Paragraph("Used as Cattle Poison (Suis)", table_cell_style),
     Paragraph("Abrus precatorius (Ratti / Rosary Pea), Nux Vomica, Datura", table_cell_style)],
    [Paragraph("Used as Abortifacient", table_cell_style),
     Paragraph("Plumbago rosea, Calotropis, Abrus seeds, Castor oil (large doses)", table_cell_style)],
    [Paragraph("Used to Produce Artificial Bruises (Malingering)", table_cell_style),
     Paragraph("Marking Nut (Semecarpus anacardium), Plumbago rosea juice", table_cell_style)],
    [Paragraph("Arrow / Ordeal Poisons", table_cell_style),
     Paragraph("Abrus precatorius (paste), Aconite, Calabar bean (Physostigma)", table_cell_style)],
    [Paragraph("Drug Abuse / Narcotic Plants", table_cell_style),
     Paragraph("Cannabis (Ganja, Bhang, Charas), Opium (Morphine, Heroin), Cocaine (Coca leaf)", table_cell_style)],
]
ml_table = Table(ml_data, colWidths=[6*cm, 11*cm],
    style=TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), GREEN_DARK),
        ("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, GREEN_PALE]),
        ("GRID",          (0,0), (-1,-1), 0.4, colors.HexColor("#A8D8BA")),
        ("TOPPADDING",    (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING",   (0,0), (-1,-1), 6),
        ("VALIGN",        (0,0), (-1,-1), "TOP"),
    ]))
story.append(ml_table)
story.append(PageBreak())

# ============================================================
# SECTION 2: DETAILED PROFILES
# ============================================================
story.append(section_header("2. Detailed Profiles of Important Plant Poisons"))
story.append(Spacer(1, 4*mm))

# ─── 2.1 Alkaloid Poisons ────────────────────────────────────────────────────
story.append(subsection_header("2.1  Alkaloid Poisons"))
story.append(Spacer(1, 3*mm))

# ACONITE
for elem in poison_card(
    "Aconite (Aconitum ferox / A. napellus) — Vatsnabh, Mitha Zahar, Monk's Hood",
    "Vatsnabh (Hindi), Mitha Zahar, Monk's Hood, Wolfsbane, Blue Rocket",
    "Ranunculaceae",
    "Aconitine (principal alkaloid), mesaconitine, hypaconitine — all highly toxic diterpene alkaloids",
    "2 mg (aconitine); 1–2 g of root",
    "2–6 hours (may be as short as 30 minutes)",
    "Intense tingling and numbness of lips, tongue, and throat followed by burning. Excessive salivation, nausea, vomiting. Progressive ascending paralysis starting from extremities. Severe bradycardia and arrhythmias — ventricular fibrillation. Hypotension, cold sweating. Respiratory paralysis leading to death. Sensorium typically clear till near death.",
    "No specific antidote. Gastric lavage with KMnO₄ (1:1000). Atropine for bradycardia. Lignocaine/amiodarone for arrhythmias. Assisted ventilation. Symptomatic treatment.",
    "Most important homicidal plant poison in India. Added to food, liquor, or sweets. Used as arrow poison. Easily confused with edible roots. Post-mortem — organs congested, no specific changes. Chemical analysis on viscera required."
):
    story.append(elem)

# DHATURA
for elem in poison_card(
    "Dhatura (Datura stramonium / D. metel) — Jimson Weed, Thorn Apple",
    "Dhatura (Hindi), Jimson Weed, Thorn Apple, Stinkweed, Angel's Trumpet (D. suaveolens)",
    "Solanaceae",
    "Atropine (hyoscyamine), Hyoscine (scopolamine), Hyoscyamine — anticholinergic alkaloids",
    "Seeds: 100 seeds (may be fatal). Alkaloid: atropine — 100 mg",
    "24–36 hours",
    "Classic 'Anticholinergic Toxidrome': Dry mouth, hot dry flushed skin, mydriasis (dilated pupils), tachycardia, urinary retention, constipation. CNS — excitement, delirium, hallucinations, incoherence, coma. 'Blind as a bat, dry as a bone, red as a beet, mad as a hatter, hot as a hare' mnemonic.",
    "Physostigmine (specific antidote — reverses anticholinergic effects). Gastric lavage with KMnO₄. Diazepam for convulsions. Catheterisation for urinary retention. Tepid sponging for hyperthermia.",
    "Commonest homicidal plant poison used to stupefy victims for theft/robbery. Given in food/drinks. Used in dacoities (hence called 'dacoit poison'). Misuse for inducing hallucinations. Seeds used as adulterant. Can simulate excited delirium."
):
    story.append(elem)

# NUX VOMICA
for elem in poison_card(
    "Nux Vomica (Strychnos nux-vomica) — Kuchla, Poison Nut",
    "Kuchla (Hindi), Poison Nut, Quaker Buttons",
    "Loganiaceae",
    "Strychnine (main alkaloid — 1.5%), Brucine (less toxic), Loganine, Chlorogenic acid",
    "Strychnine: 30–60 mg (adult); Nux Vomica seeds: 1–2 g",
    "1–2 hours",
    "Reflex hyperexcitability — any stimulus (touch, sound, light) precipitates violent tetanic convulsions. Opisthotonos (arching of back), risus sardonicus (sardonic grin), trismus. Consciousness preserved throughout. Cyanosis due to respiratory muscle spasm. Death from asphyxia. Intervals of relaxation between convulsions.",
    "Diazepam/barbiturates to control convulsions. Neuromuscular blockers (pancuronium) if needed. Assisted ventilation. Minimize all sensory stimuli. Gastric lavage only if no convulsions. No specific antidote.",
    "Used as cattle poison and rodenticide. Added to food/liquor for homicide. Post-mortem: asphyxial signs — petechiae, cyanosis, pulmonary oedema. Characteristic posture of opisthotonus preserved after death. Viscera analysis confirms diagnosis."
):
    story.append(elem)

# OPIUM
for elem in poison_card(
    "Opium (Papaver somniferum) — Afim, Laudanum, Morphine Source",
    "Afim (Hindi), Laudanum, Black Stuff, Raw Opium",
    "Papaveraceae",
    "Morphine (10%), Codeine (0.5%), Thebaine, Papaverine, Noscapine. Active: Morphine and its metabolites",
    "Morphine: 200 mg (adult, oral); 60 mg (IV). Raw opium: 2 g",
    "6–12 hours",
    "Narcotic triad: Pinpoint pupils (miosis), Respiratory depression, Coma. Bradycardia, hypotension. Hypothermia. Reduced gut motility. Pulmonary oedema. Death from respiratory failure.",
    "Naloxone (specific opioid antagonist) — 0.4–2 mg IV, repeat as needed. Assisted ventilation. Gastric lavage. Symptomatic care.",
    "Major drug of abuse; schedule I substance in India (NDPS Act). Used for addiction, suicide, and homicide (especially in infants — infanticide). Post-mortem: pinpoint pupils (diagnostic), pulmonary oedema, drug in viscera/urine/blood."
):
    story.append(elem)

# CANNABIS
for elem in poison_card(
    "Cannabis (Cannabis sativa) — Ganja, Bhang, Charas, Hashish",
    "Ganja (dried flowering tops), Bhang (leaves/drink), Charas (resin), Hashish, Marijuana",
    "Cannabaceae",
    "Delta-9-Tetrahydrocannabinol (THC) — main psychoactive; Cannabidiol (CBD), Cannabinol (CBN)",
    "Variable; depends on route and preparation. Bhang: 10 g; Ganja: 5 g; Charas: 2 g",
    "Several hours to days depending on dose",
    "Mild: euphoria, conjunctival injection, tachycardia, increased appetite. Moderate: disorientation, impaired memory and coordination. Severe: paranoia, psychosis, hallucinations, depersonalisation. Chronic: amotivational syndrome, cannabis use disorder.",
    "Mainly supportive. Benzodiazepines for agitation/anxiety. No specific antidote. Antipsychotics for severe psychosis.",
    "Scheduled substance under NDPS Act 1985 (India). Relevant in road traffic accidents. Hair, urine, blood analysis for detection. THC detectable in urine up to 30 days in chronic users. Increasingly relevant in mental health/psychiatry medicolegal cases."
):
    story.append(elem)

# HEMLOCK
for elem in poison_card(
    "Hemlock (Conium maculatum) — Poison Hemlock",
    "Poison Hemlock, Spotted Hemlock, Bad Man's Oatmeal",
    "Apiaceae (Umbelliferae)",
    "Coniine (main alkaloid), Methylconiine, Conhydrine, Pseudoconhydrine — piperidine alkaloids",
    "Coniine: ~150 mg (adult)",
    "2–3 hours",
    "Ascending peripheral motor paralysis (flaccid, from legs upward). Ptosis, mydriasis. Nausea, vomiting, salivation. Bradycardia. Death from respiratory paralysis. Sensorium usually preserved. Classic historical poison — used to execute Socrates.",
    "Artificial ventilation. Gastric lavage. Physostigmine may help reverse effects. Symptomatic.",
    "Historical significance — used for judicial execution in ancient Greece. Homicidal and suicidal poisoning documented. Confused with edible plants (wild parsley, wild carrot). Post-mortem — mousy odour of coniine, no specific macro findings."
):
    story.append(elem)

story.append(PageBreak())

# ─── 2.2 Glycoside Poisons ───────────────────────────────────────────────────
story.append(subsection_header("2.2  Glycoside Poisons (Cardiac & Cyanogenic)"))
story.append(Spacer(1, 3*mm))

# DIGITALIS
for elem in poison_card(
    "Digitalis (Digitalis purpurea / D. lanata) — Foxglove",
    "Foxglove, Fairy Fingers, Witch's Bells",
    "Plantaginaceae (formerly Scrophulariaceae)",
    "Digitoxin, Digoxin, Gitoxin, Lanatoside C — cardiac glycosides (inhibit Na+/K+ ATPase)",
    "Toxic: Digoxin >2 ng/mL serum. Fatal: ~3 mg digoxin (adult)",
    "24–48 hours",
    "GI: Nausea, vomiting, diarrhoea. Visual: Yellow-green colour vision (xanthopsia), halos. Cardiac: Bradyarrhythmias, heart block, VT, VF. CNS: Headache, confusion, delirium. Characteristic ECG: Scooped ST depression ('Salvador Dali' sign).",
    "Digoxin-specific Fab antibody fragments (Digibind) — specific antidote. Atropine for bradycardia. KCl for hypokalaemia. Anti-arrhythmics. Activated charcoal (if early).",
    "Used therapeutically in heart failure/AF — therapeutic window is narrow. Poisoning may be accidental (children), suicidal, or homicidal. Historically used in murder cases (undetectable before immunoassays). Serum digoxin level in blood from vitreous humour at PM."
):
    story.append(elem)

# OLEANDER
for elem in poison_card(
    "Oleander (Nerium oleander) — Kaner, Rose Laurel",
    "Kaner (Hindi), Rose Laurel, Rose Bay, Sweet-scented Oleander",
    "Apocynaceae",
    "Oleandrin, Neriine, Folinerin — cardiac glycosides. All parts toxic including smoke from burning",
    "Uncertain; a few leaves may be fatal in children",
    "24 hours",
    "Nausea, vomiting, abdominal pain. Bradycardia, complete heart block, ventricular arrhythmias. Hyperkalaemia. Neurological: dizziness, drowsiness, visual disturbances, seizures. Skin and mucous membrane irritation on contact.",
    "Activated charcoal. Atropine for bradycardia. Anti-arrhythmics. Digoxin-specific Fab antibody (cross-reacts with oleandrin) in severe cases. Supportive care.",
    "One of the most common plant poisonings in South India. Commonly used for suicidal poisoning. Honey made from oleander nectar can cause mass poisoning. All parts including dried plant, smoke, and even water in which flowers have been placed are toxic."
):
    story.append(elem)

# CALOTROPIS
for elem in poison_card(
    "Calotropis (Calotropis gigantea / C. procera) — Madar, Akdo",
    "Madar (Hindi), Akdo (Gujarati), Rui, Crown Flower",
    "Apocynaceae",
    "Uscharin, Calotoxin, Calactin, Calotropin (cardiac glycosides), Gigantin (in serum — highly toxic)",
    "Uncertain (juice is the toxic form)",
    "About 12 hours",
    "External application: Redness, vesication, blisters. Instilled in eyes: Fulminating conjunctivitis, potential permanent visual impairment. Internal ingestion: Acrid bitter taste, burning pain in throat/stomach, nausea, vomiting, diarrhoea, dilated pupils, tetanic convulsions, cardiac arrhythmias, collapse, death.",
    "Gastric lavage with warm water. Demulcents. Stimulants. Symptomatic and supportive.",
    "Juice used as vesicant and depilatory. Used as abortifacient via instillation at os uteri. Used to produce artificial bruises (malingering). Juice thrown on face as acid-like assault. Madar root powder used as snuff — rapidly fatal."
):
    story.append(elem)

# BITTER ALMONDS / HCN
for elem in poison_card(
    "Bitter Almonds / Cyanogenic Plants (Prunus amygdalus var. amara)",
    "Bitter Almonds, Cassava (Tapioca), Wild Cherry laurel, Linseed, Bamboo shoots, Apple/Apricot seeds",
    "Rosaceae (Bitter Almonds); Euphorbiaceae (Cassava)",
    "Amygdalin (cyanogenic glycoside) → hydrolysed → Hydrocyanic acid (HCN / prussic acid) + Benzaldehyde",
    "HCN: 1–3 mg/kg body weight; Bitter almonds: 50–60 (children), 60–70 (adults)",
    "Minutes to 1–4 hours",
    "Smell of bitter almonds on breath. Headache, dizziness, excitement followed by coma. Bright red or cherry-red blood and tissues (HbCN). Rapid tachycardia → bradycardia and cardiovascular collapse. Convulsions. Respiratory failure — 'internal asphyxia' (cytochrome c oxidase inhibition).",
    "Amyl nitrite (inhalation) → Sodium nitrite (IV 3%) → Sodium thiosulphate (25% IV) — 'Lilly' regimen. Hydroxocobalamin (Cyanokit) IV — first-line in many countries. O₂ 100%. Gastric lavage with ferrous sulphate solution.",
    "Post-mortem: bright red viscera and lividity, smell of bitter almonds (not always). Important in industrial cyanide exposure (electroplating, mining) and smoke inhalation (plastics burning). Cassava improper preparation a cause of mass poisoning in Africa/Asia."
):
    story.append(elem)

story.append(PageBreak())

# ─── 2.3 Toxalbumin Poisons ──────────────────────────────────────────────────
story.append(subsection_header("2.3  Toxalbumin (Phytotoxin) Poisons"))
story.append(Spacer(1, 3*mm))

# CASTOR (RICIN)
for elem in poison_card(
    "Castor Bean (Ricinus communis) — Arandi, Castor Oil Plant",
    "Arandi (Hindi), Castor Oil Plant, Palma Christi",
    "Euphorbiaceae",
    "Ricin (toxalbumin — one of the most toxic natural substances; LD₅₀ ~1–10 μg/kg), Ricinine (alkaloid)",
    "Seeds: 1–2 seeds (children); 4–5 seeds (adults). Ricin: ~1 μg/kg parenterally",
    "3–5 days (oral); 36–72 hours (parenteral)",
    "Oral: Latency 2–24 hours. Then burning abdominal pain, vomiting, bloody diarrhoea, haemorrhagic gastroenteritis. Diffuse nephritis, hepatic necrosis, haemolysis. Severe dehydration, oliguria. Consciousness preserved till end. Death from hypovolaemic shock and multi-organ failure. Parenteral: Fever, leucocytosis, local tissue necrosis, hypotension, hypothermia.",
    "No specific antidote. Gastric lavage with KMnO₄. Activated charcoal. Supportive: IV fluids, blood transfusion, sodium bicarbonate, monitoring for hypoglycaemia and haemolysis. Experimental: Anti-ricin antibodies (research stage).",
    "Poisoning usually accidental (children eat seeds). Castor oil itself is non-toxic (ricin destroyed by heat). Given in food for homicide. Ricin historically weaponised (Georgi Markov assassination, 1978). Powder in eyes causes conjunctivitis. Seeds used as abortifacient."
):
    story.append(elem)

# ABRUS
for elem in poison_card(
    "Abrus precatorius (Rosary Pea) — Ratti, Gunja, Jequirity Bean",
    "Ratti, Gunja (Hindi), Jequirity Bean, Indian Liquorice, Crab's Eye",
    "Fabaceae (Leguminosae)",
    "Abrin (toxalbumin — similar mechanism to Ricin; inhibits ribosomal protein synthesis), Abric acid, Abralin",
    "90–120 mg (½ to 1 crushed seed). Intact seed not toxic (hard coat prevents absorption)",
    "3–5 days (occasionally 24 hours)",
    "After ingestion of crushed seeds: nausea, vomiting, vertigo, tinnitus. Cold clammy skin, hypotension. Irregular pulse, laboured breathing. Haemolysis, convulsions, oliguria. Death from cardiac failure. Parenteral ('Sui'): Severe local inflammatory oedema and necrosis, petechial haemorrhages, congested viscera.",
    "Gastric lavage and emesis. Antiabrin antiserum (if available). Sodium bicarbonate 10 g/day to alkalinise urine (prevents haemoglobin precipitation in renal tubules). Dilute HCl + pepsin orally. Symptomatic.",
    "Mainly used as cattle poison — 'Suis' made by mixing with Datura, Opium, Onion, and Spirit. Used for homicide. Seeds used as arrow poison and as abortifacient. Application of powdered seeds on eyes to produce conjunctivitis (malingering). The paste is used as aphrodisiac."
):
    story.append(elem)

story.append(PageBreak())

# ─── 2.4 Resin / Irritant Poisons ───────────────────────────────────────────
story.append(subsection_header("2.4  Resin/Irritant Poisons"))
story.append(Spacer(1, 3*mm))

# MARKING NUT
for elem in poison_card(
    "Semecarpus anacardium (Marking Nut) — Bhilawa",
    "Bhilawa, Bhilawanol, Marking Nut",
    "Anacardiaceae",
    "Semicarpol (0.1%), Bhilawanol (15–17%), Non-volatile corrosive residue (18%), Fatty oils, Tannic acids",
    "5 g (fatal dose when ingested)",
    "Uncertain; usually 12–24 hours",
    "External: Irritation, itching, painful black blisters containing acrid serum, eczematous eruption, fever, haematuria, dysuria. Ingestion: Intense painful irritation with blister formation in mouth/throat, gastroenteritis, tachycardia, hypotension, dilated pupils, cyanosis, dyspnoea, delirium, areflexia, collapse, coma, death.",
    "External: Wash with lukewarm water + antiseptic, bland liniments. Internal: Gastric lavage, demulcents, symptomatic treatment.",
    "Used to produce artificial bruises (false bruise) to support fabricated injury claims — medicolegally important. Used by malingerers, army/navy personnel to feign disease. Juice thrown on face (vitriol-like assault). Used as abortifacient. Can be detected by chemical analysis of blister fluid."
):
    story.append(elem)

# PLUMBAGO
for elem in poison_card(
    "Plumbago rosea (Lal Chitra) — Red Leadwort",
    "Lal Chitra (Hindi), Red Leadwort",
    "Plumbaginaceae",
    "Plumbagin (naphthoquinone derivative — irritant vesicant)",
    "Variable",
    "Uncertain",
    "External: Produces vesication (blisters), local irritation similar to Calotropis. Internal (large doses): Acts as irritant poison producing symptoms similar to Calotropis poisoning — gastroenteritis, cardiac effects.",
    "Symptomatic — wash exposed areas with warm water and bland liniments. Internal: Gastric lavage, demulcents.",
    "Juice used as abortifacient — applied to os uteri by quacks. Used to produce artificial bruises and conjunctivitis (malingering). Applied to genitals as punishment for adultery. Blister fluid preserved in rectified spirit for FSL analysis."
):
    story.append(elem)

# CROTON
for elem in poison_card(
    "Croton tiglium (Purging Croton) — Jamalgota",
    "Jamalgota (Hindi), Purging Croton",
    "Euphorbiaceae",
    "Croton oil (fixed oil — 50% of seed), Crotin (toxalbumin), Tigliane esters (TPA — tumour-promoting). Phorbol esters are the main irritants",
    "Croton oil: 20 drops (adult). Seeds: 1–2 seeds may be fatal in children",
    "24–48 hours",
    "Topical: Severe vesication and inflammation. Ingested: Intense burning in mouth, throat, oesophagus and stomach. Violent vomiting and diarrhoea (often bloody). Tenesmus, collapse, shock. Renal damage. Death from circulatory failure.",
    "Gastric lavage (carefully). Demulcents (milk, egg white). IV fluids for shock. Symptomatic.",
    "Used as cathartic in Ayurvedic medicine (dangerous doses). Criminal poisoning documented. Seeds mixed with food. Topical application causes counter-irritation — sometimes used in quack remedies causing poisoning."
):
    story.append(elem)

story.append(PageBreak())

# ─── 2.5 Special / Miscellaneous ─────────────────────────────────────────────
story.append(subsection_header("2.5  Additional Important Plant Poisons"))
story.append(Spacer(1, 3*mm))

misc_data = [
    [Paragraph("Plant Poison", table_header_style),
     Paragraph("Scientific Name", table_header_style),
     Paragraph("Family", table_header_style),
     Paragraph("Active Principle", table_header_style),
     Paragraph("Key Feature", table_header_style)],
    [Paragraph("Aconite (Aconitum ferox)", table_cell_style),
     Paragraph("Aconitum ferox", table_cell_style),
     Paragraph("Ranunculaceae", table_cell_style),
     Paragraph("Aconitine", table_cell_style),
     Paragraph("Most important homicidal plant poison in India; cardiac arrhythmias", table_cell_style)],
    [Paragraph("Ergot", table_cell_style),
     Paragraph("Claviceps purpurea (fungus on rye)", table_cell_style),
     Paragraph("Clavicipitaceae", table_cell_style),
     Paragraph("Ergotamine, Ergometrine, Lysergic acid (LSD precursor)", table_cell_style),
     Paragraph("St. Anthony's Fire: vasoconstriction, gangrene; uterotonic; mass poisoning from contaminated grain", table_cell_style)],
    [Paragraph("Veratrum (Hellebore)", table_cell_style),
     Paragraph("Veratrum album / V. viride", table_cell_style),
     Paragraph("Melanthiaceae", table_cell_style),
     Paragraph("Veratrine, Cevadine, Protoveratrine", table_cell_style),
     Paragraph("Extreme bradycardia, hypotension; vomiting; easily confused with Gentiana", table_cell_style)],
    [Paragraph("Colchicine (Autumn Crocus)", table_cell_style),
     Paragraph("Colchicum autumnale", table_cell_style),
     Paragraph("Colchicaceae", table_cell_style),
     Paragraph("Colchicine (inhibits mitosis — anti-mitotic)", table_cell_style),
     Paragraph("Multi-organ failure after latent period; bone marrow suppression; used in gout treatment", table_cell_style)],
    [Paragraph("Physostigmine (Calabar Bean)", table_cell_style),
     Paragraph("Physostigma venenosum", table_cell_style),
     Paragraph("Fabaceae", table_cell_style),
     Paragraph("Physostigmine (reversible AChE inhibitor)", table_cell_style),
     Paragraph("Ordeal poison in West Africa; antidote for atropine/Dhatura poisoning", table_cell_style)],
    [Paragraph("Tobacco", table_cell_style),
     Paragraph("Nicotiana tabacum", table_cell_style),
     Paragraph("Solanaceae", table_cell_style),
     Paragraph("Nicotine (ganglionic stimulant → depressant)", table_cell_style),
     Paragraph("Acute: nausea, vomiting, hypertension, convulsions, respiratory paralysis; Chronic: carcinogenesis", table_cell_style)],
    [Paragraph("Strophanthus", table_cell_style),
     Paragraph("Strophanthus gratus / S. hispidus", table_cell_style),
     Paragraph("Apocynaceae", table_cell_style),
     Paragraph("Ouabain (G-strophanthin), Cymarin — cardiac glycosides", table_cell_style),
     Paragraph("Arrow poison in Africa; rapid cardiac arrest; used in research (Na+/K+ ATPase)", table_cell_style)],
    [Paragraph("Squill (Sea Onion)", table_cell_style),
     Paragraph("Urginea maritima (Drimia maritima)", table_cell_style),
     Paragraph("Asparagaceae", table_cell_style),
     Paragraph("Scillaren A & B, Proscillaridin — cardiac glycosides", table_cell_style),
     Paragraph("Rodenticide; cardiac arrhythmias; GI irritant", table_cell_style)],
    [Paragraph("Henbane", table_cell_style),
     Paragraph("Hyoscyamus niger", table_cell_style),
     Paragraph("Solanaceae", table_cell_style),
     Paragraph("Hyoscine (Scopolamine), Hyoscyamine, Atropine", table_cell_style),
     Paragraph("Similar to Dhatura (anticholinergic); used as poison and truth serum (Scopolamine)", table_cell_style)],
    [Paragraph("Water Hemlock", table_cell_style),
     Paragraph("Cicuta virosa / C. maculata", table_cell_style),
     Paragraph("Apiaceae", table_cell_style),
     Paragraph("Cicutoxin (polyacetylene compound)", table_cell_style),
     Paragraph("Most violently toxic plant in North America; severe convulsions, status epilepticus", table_cell_style)],
    [Paragraph("Yew (Taxus)", table_cell_style),
     Paragraph("Taxus baccata", table_cell_style),
     Paragraph("Taxaceae", table_cell_style),
     Paragraph("Taxine A & B (alkaloids), Paclitaxel (Taxol) at therapeutic doses", table_cell_style),
     Paragraph("Cardiac conduction block, ventricular arrhythmias, sudden death; forensically — undetected without specific testing", table_cell_style)],
    [Paragraph("Belladonna (Deadly Nightshade)", table_cell_style),
     Paragraph("Atropa belladonna", table_cell_style),
     Paragraph("Solanaceae", table_cell_style),
     Paragraph("Atropine (L-hyoscyamine), Scopolamine, Belladonnine", table_cell_style),
     Paragraph("Classic anticholinergic toxidrome; berries attractive to children; historical cosmetic use (pupil dilation)", table_cell_style)],
    [Paragraph("Monkshood (Wolfsbane)", table_cell_style),
     Paragraph("Aconitum napellus", table_cell_style),
     Paragraph("Ranunculaceae", table_cell_style),
     Paragraph("Aconitine, Pseudaconitine (most toxic)", table_cell_style),
     Paragraph("European variety of Aconite; same toxicology; absorbed through skin from plant handling", table_cell_style)],
    [Paragraph("Lily of the Valley", table_cell_style),
     Paragraph("Convallaria majalis", table_cell_style),
     Paragraph("Asparagaceae", table_cell_style),
     Paragraph("Convallatoxin, Convalloside — cardiac glycosides", table_cell_style),
     Paragraph("All parts toxic including water in which flowers are placed; atrial fibrillation, heart block", table_cell_style)],
]

misc_table = Table(misc_data, colWidths=[3.5*cm, 3.5*cm, 3*cm, 3.5*cm, 3.5*cm],
    style=TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), GREEN_DARK),
        ("TEXTCOLOR",     (0,0), (-1,0), WHITE),
        ("FONTNAME",      (0,0), (-1,0), "Helvetica-Bold"),
        ("FONTSIZE",      (0,0), (-1,-1), 8),
        ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GREEN_PALE]),
        ("GRID",          (0,0), (-1,-1), 0.4, colors.HexColor("#A8D8BA")),
        ("TOPPADDING",    (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("LEFTPADDING",   (0,0), (-1,-1), 5),
        ("VALIGN",        (0,0), (-1,-1), "TOP"),
    ]))
story.append(misc_table)
story.append(PageBreak())

# ============================================================
# SECTION 3: QUICK REFERENCE TABLE — Fatal Doses & Periods
# ============================================================
story.append(section_header("3. Quick Reference: Fatal Doses & Periods"))
story.append(Spacer(1, 4*mm))

fd_data = [
    [Paragraph("Poison", table_header_style),
     Paragraph("Fatal Dose", table_header_style),
     Paragraph("Fatal Period", table_header_style),
     Paragraph("Antidote", table_header_style)],
    [Paragraph("Aconite (Aconitine)", table_cell_style),
     Paragraph("2 mg (aconitine); 1–2 g root", table_cell_style),
     Paragraph("2–6 hours", table_cell_style),
     Paragraph("Atropine (bradycardia); anti-arrhythmics", table_cell_style)],
    [Paragraph("Dhatura (Atropine)", table_cell_style),
     Paragraph("100 seeds; atropine 100 mg", table_cell_style),
     Paragraph("24–36 hours", table_cell_style),
     Paragraph("Physostigmine (specific)", table_cell_style)],
    [Paragraph("Nux Vomica (Strychnine)", table_cell_style),
     Paragraph("30–60 mg strychnine; 1–2 g seeds", table_cell_style),
     Paragraph("1–2 hours", table_cell_style),
     Paragraph("None specific; diazepam, NMB", table_cell_style)],
    [Paragraph("Opium (Morphine)", table_cell_style),
     Paragraph("200 mg morphine oral; 60 mg IV", table_cell_style),
     Paragraph("6–12 hours", table_cell_style),
     Paragraph("Naloxone (specific)", table_cell_style)],
    [Paragraph("Castor Seeds (Ricin)", table_cell_style),
     Paragraph("1–2 seeds (child); 4–5 seeds (adult)", table_cell_style),
     Paragraph("3–5 days", table_cell_style),
     Paragraph("None specific; supportive", table_cell_style)],
    [Paragraph("Abrus (Abrin)", table_cell_style),
     Paragraph("90–120 mg; ½ to 1 crushed seed", table_cell_style),
     Paragraph("3–5 days", table_cell_style),
     Paragraph("Antiabrin antiserum", table_cell_style)],
    [Paragraph("Marking Nut (Bhilawa)", table_cell_style),
     Paragraph("5 g (internal)", table_cell_style),
     Paragraph("12–24 hours", table_cell_style),
     Paragraph("Symptomatic", table_cell_style)],
    [Paragraph("Digitalis (Digoxin)", table_cell_style),
     Paragraph("~3 mg digoxin; >2 ng/mL serum", table_cell_style),
     Paragraph("24–48 hours", table_cell_style),
     Paragraph("Digoxin-Fab (Digibind) — specific", table_cell_style)],
    [Paragraph("Oleander", table_cell_style),
     Paragraph("Few leaves (uncertain)", table_cell_style),
     Paragraph("24 hours", table_cell_style),
     Paragraph("Digoxin-Fab (cross-reactive)", table_cell_style)],
    [Paragraph("Calotropis", table_cell_style),
     Paragraph("Uncertain (juice)", table_cell_style),
     Paragraph("~12 hours", table_cell_style),
     Paragraph("Symptomatic", table_cell_style)],
    [Paragraph("HCN / Bitter Almonds", table_cell_style),
     Paragraph("1–3 mg/kg; 50–70 bitter almonds", table_cell_style),
     Paragraph("Minutes to 1–4 hours", table_cell_style),
     Paragraph("Hydroxocobalamin; Nitrite-Thiosulphate regimen", table_cell_style)],
    [Paragraph("Hemlock (Coniine)", table_cell_style),
     Paragraph("~150 mg coniine", table_cell_style),
     Paragraph("2–3 hours", table_cell_style),
     Paragraph("Ventilation; physostigmine", table_cell_style)],
    [Paragraph("Croton oil", table_cell_style),
     Paragraph("20 drops (adult)", table_cell_style),
     Paragraph("24–48 hours", table_cell_style),
     Paragraph("Demulcents; symptomatic", table_cell_style)],
    [Paragraph("Ergot (Ergotamine)", table_cell_style),
     Paragraph("Variable", table_cell_style),
     Paragraph("Days–weeks (chronic)", table_cell_style),
     Paragraph("Vasodilators; supportive", table_cell_style)],
    [Paragraph("Colchicine", table_cell_style),
     Paragraph("0.8 mg/kg body weight", table_cell_style),
     Paragraph("2–7 days (delayed multi-organ failure)", table_cell_style),
     Paragraph("No specific antidote; supportive", table_cell_style)],
    [Paragraph("Tobacco (Nicotine)", table_cell_style),
     Paragraph("40–60 mg nicotine (adult)", table_cell_style),
     Paragraph("Minutes to 1 hour (acute)", table_cell_style),
     Paragraph("Ganglionic blockers; supportive", table_cell_style)],
]

fd_table = Table(fd_data, colWidths=[4.5*cm, 4*cm, 4*cm, 4.5*cm],
    style=TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), GREEN_DARK),
        ("TEXTCOLOR",     (0,0), (-1,0), WHITE),
        ("FONTNAME",      (0,0), (-1,0), "Helvetica-Bold"),
        ("FONTSIZE",      (0,0), (-1,-1), 8.5),
        ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GREEN_PALE]),
        ("GRID",          (0,0), (-1,-1), 0.4, colors.HexColor("#A8D8BA")),
        ("TOPPADDING",    (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("LEFTPADDING",   (0,0), (-1,-1), 5),
        ("VALIGN",        (0,0), (-1,-1), "TOP"),
    ]))
story.append(fd_table)
story.append(PageBreak())

# ============================================================
# SECTION 4: POST-MORTEM FINDINGS SUMMARY
# ============================================================
story.append(section_header("4. Post-Mortem Findings in Plant Poisonings"))
story.append(Spacer(1, 4*mm))

pm_data = [
    [Paragraph("Poison", table_header_style),
     Paragraph("Gross Post-Mortem Findings", table_header_style),
     Paragraph("Specific Diagnostic Features", table_header_style)],
    [Paragraph("Aconite", table_cell_style),
     Paragraph("Congested organs, gastroenteritis, petechial haemorrhages", table_cell_style),
     Paragraph("No specific gross change; tingling sensation on tasting viscera (hazardous). LC-MS/MS on viscera.", table_cell_style)],
    [Paragraph("Dhatura", table_cell_style),
     Paragraph("Dilated pupils (persist PM), dry skin, flushed face", table_cell_style),
     Paragraph("Seeds may be found in stomach. Atropine/scopolamine on GC-MS urine/blood.", table_cell_style)],
    [Paragraph("Strychnine / Nux Vomica", table_cell_style),
     Paragraph("Asphyxial signs — petechiae on conjunctiva, pleura, pericardium. Pulmonary oedema. Cyanosis.", table_cell_style),
     Paragraph("Characteristic opisthotonus posture may persist. Strychnine detectable in blood/urine/viscera.", table_cell_style)],
    [Paragraph("Opium / Morphine", table_cell_style),
     Paragraph("Pinpoint pupils (diagnostic), pulmonary oedema, congested brain", table_cell_style),
     Paragraph("Pinpoint pupils most characteristic. Morphine in urine/blood/bile/hair. Signs of chronic abuse.", table_cell_style)],
    [Paragraph("Ricin / Abrin", table_cell_style),
     Paragraph("Haemorrhagic gastroenteritis, hepatic necrosis, nephritis, petechiae", table_cell_style),
     Paragraph("ELISA and LC-MS/MS for ricin/abrin in viscera. FSL analysis required.", table_cell_style)],
    [Paragraph("HCN / Cyanide", table_cell_style),
     Paragraph("Cherry-red lividity and blood, smell of bitter almonds, petechiae", table_cell_style),
     Paragraph("Bright red colour of blood and organs (most characteristic). Vitreous HCN analysis.", table_cell_style)],
    [Paragraph("Calotropis", table_cell_style),
     Paragraph("Vesication at contact sites, gastroenteritis, congested brain", table_cell_style),
     Paragraph("Blister fluid preserved in rectified spirit for FSL. Cardiac glycoside screening.", table_cell_style)],
    [Paragraph("Digitalis / Oleander", table_cell_style),
     Paragraph("Non-specific: congested organs, pulmonary oedema", table_cell_style),
     Paragraph("Immunoassay (RIA/ELISA) for cardiac glycosides; vitreous humour digoxin level.", table_cell_style)],
    [Paragraph("Marking Nut", table_cell_style),
     Paragraph("Blisters at application sites (acrid serum), gastric erosions, oedema", table_cell_style),
     Paragraph("Chemical analysis of blister fluid differentiates from true bruise (Table 38.1, Dikshit).", table_cell_style)],
]

pm_table = Table(pm_data, colWidths=[4*cm, 6.5*cm, 6.5*cm],
    style=TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), GREEN_DARK),
        ("TEXTCOLOR",     (0,0), (-1,0), WHITE),
        ("FONTNAME",      (0,0), (-1,0), "Helvetica-Bold"),
        ("FONTSIZE",      (0,0), (-1,-1), 8.5),
        ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GREEN_PALE]),
        ("GRID",          (0,0), (-1,-1), 0.4, colors.HexColor("#A8D8BA")),
        ("TOPPADDING",    (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("LEFTPADDING",   (0,0), (-1,-1), 5),
        ("VALIGN",        (0,0), (-1,-1), "TOP"),
    ]))
story.append(pm_table)
story.append(Spacer(1, 6*mm))

# ============================================================
# SECTION 5: MEDICOLEGAL MNEMONICS
# ============================================================
story.append(section_header("5. Medicolegal Mnemonics & Key Points"))
story.append(Spacer(1, 4*mm))

mnemonics = [
    ("Dhatura / Anticholinergic Toxidrome",
     '"Blind as a bat" (mydriasis) | "Dry as a bone" (anhidrosis, dry mouth) | '
     '"Red as a beet" (flushed skin) | "Mad as a hatter" (delirium) | "Hot as a hare" (hyperthermia)'),
    ("Strychnine (Nux Vomica)",
     "Consciousness preserved throughout convulsions — distinguishes it from epilepsy and tetanus. "
     "Reflex spasms triggered by any sensory stimulus. Opisthotonus is classic."),
    ("Opium / Opioid Triad",
     "Pinpoint pupils + Respiratory depression + Coma = Opioid poisoning until proven otherwise. "
     "Reversed by Naloxone (0.4–2 mg IV)."),
    ("Cyanide Recognition",
     "Cherry-red blood + Bitter almond smell + Rapid collapse = Cyanide. "
     "Treat empirically with Hydroxocobalamin without waiting for lab confirmation."),
    ("Most Homicidal Plant Poisons in India",
     "Aconite > Dhatura > Nux Vomica > Oleander (in order of forensic significance)"),
    ("Artificial Bruise Plants",
     "Semecarpus (Marking Nut) and Plumbago rosea — produce acrid serum blisters, "
     "chemically differentiable from true traumatic bruises."),
    ("Cattle Poison (Suis)",
     "Abrus precatorius (Ratti) seeds mixed with Datura + Opium + Onion + Spirit — "
     "used to poison cattle and occasionally humans."),
    ("Arrow Poisons",
     "Aconite (India), Abrus paste (India), Strophanthus ouabain (Africa), "
     "Curare/Tubocurarine (South America — Neuromuscular blockade)"),
]

for title, text in mnemonics:
    story.append(Table(
        [[Paragraph(f"<b>{title}</b>", ParagraphStyle("MnTitle", fontName="Helvetica-Bold",
            fontSize=10, textColor=GREEN_DARK, leading=14)),
          Paragraph(text, ParagraphStyle("MnBody", fontName="Helvetica", fontSize=9,
            textColor=BLACK, leading=13, alignment=TA_JUSTIFY))]],
        colWidths=[5*cm, 12*cm],
        style=TableStyle([
            ("BACKGROUND",    (0,0),(0,-1), GREEN_PALE),
            ("BACKGROUND",    (1,0),(1,-1), WHITE),
            ("GRID",          (0,0),(-1,-1), 0.4, colors.HexColor("#A8D8BA")),
            ("TOPPADDING",    (0,0),(-1,-1), 6),
            ("BOTTOMPADDING", (0,0),(-1,-1), 6),
            ("LEFTPADDING",   (0,0),(-1,-1), 7),
            ("VALIGN",        (0,0),(-1,-1), "MIDDLE"),
        ])
    ))
    story.append(Spacer(1, 1*mm))

story.append(Spacer(1, 6*mm))

# ── FOOTER ───────────────────────────────────────────────────────────────────
story.append(HRFlowable(width="100%", thickness=1, color=GREEN_MID))
story.append(Spacer(1, 2*mm))
story.append(Paragraph(
    "Sources: PC Dikshit Textbook of Forensic Medicine &amp; Toxicology | "
    "Parikh's Textbook of Medical Jurisprudence, Forensic Medicine &amp; Toxicology | "
    "The Essentials of Forensic Medicine &amp; Toxicology, 36th Ed (2026) | "
    "Katzung's Basic &amp; Clinical Pharmacology, 16th Ed | Goodman &amp; Gilman's, 13th Ed",
    ParagraphStyle("Footer", fontName="Helvetica-Oblique", fontSize=8,
        textColor=GREY, alignment=TA_CENTER, leading=12)
))

# ── BUILD ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
Running Command

cd /home/daytona/workspace/plant-poisons && python generate_pdf.py 2>&1

Running Command

ls -lh /home/daytona/workspace/plant-poisons/Plant_Poisons_Classification.pdf

Your PDF is ready for download:

Plant Poisons Classification

PDF Document · PDF


Here is what the PDF contains across 5 sections:
Section 1 - Classification Tables (3 schemes)
  • By Chemical Nature: Alkaloids, Glycosides, Resins/Resinoids, Toxalbumins, Fixed oils, Volatile oils, Organic acids
  • By Pharmacological Action: CNS stimulants, CNS depressants, Deliriants, Cardiac glycoside poisons, GI/Irritant poisons, Convulsants, Cyanogenic, Cholinergic, Hallucinogens, Uterotonic/Abortifacients, Vesicants, Hepatotoxic, Nephrotoxic
  • By Medicolegal Importance (Indian context): Homicidal, Suicidal, Cattle poison, Abortifacient, Malingering, Arrow/Ordeal poisons, Narcotic plants
Section 2 - Detailed Poison Profiles with active principles, fatal doses, symptoms, treatment, and medicolegal significance for:
  • Alkaloids: Aconite, Dhatura, Nux Vomica, Opium, Cannabis, Hemlock
  • Glycosides: Digitalis, Oleander, Calotropis, Bitter Almonds/HCN
  • Toxalbumins: Castor bean (Ricin), Abrus (Abrin)
  • Resins/Irritants: Marking Nut, Plumbago rosea, Croton
  • Additional table covering 14 more (Ergot, Veratrum, Colchicine, Physostigmine, Tobacco, Strophanthus, Squill, Henbane, Water Hemlock, Yew, Belladonna, etc.)
Section 3 - Quick Reference: Fatal doses, periods, and antidotes for 17 plant poisons
Section 4 - Post-Mortem Findings with specific diagnostic features per poison
Section 5 - Medicolegal Mnemonics: Classic mnemonics (Dhatura anticholinergic toxidrome, opioid triad, cyanide recognition) and forensic key points
Sources: PC Dikshit Textbook of Forensic Medicine & Toxicology, Parikh's Textbook, and The Essentials of FMT 36th Edition (2026).
This is a shared conversation. Sign in to Orris to start your own chat.