Different snake bites and images of snake classification and management general and specific
snake bite classification venomous snakes management treatment 2024

| Feature | Venomous | Non-Venomous |
|---|---|---|
| Head shape | Triangular/arrow-shaped | Rounded/oval |
| Pupil | Elliptical (slit) | Round |
| Heat-sensing pit | Present (pit vipers) | Absent |
| Fangs | Long, hollow or grooved | Absent or small |
| Subcaudal plates | Single row | Double row |
| Bite marks | Two distinct fang punctures | U-shaped row of teeth |

| Family | Examples | Venom Type | Geographic Distribution |
|---|---|---|---|
| Viperidae (vipers/adders) | Russell's viper, Puff adder, Saw-scaled viper | Vasculotoxic/Hemotoxic | Worldwide (except Australia) |
| Crotalidae (pit vipers) | Rattlesnakes, Copperhead, Cottonmouth/moccasin | Cytotoxic + Hemotoxic + Neurotoxic | Americas, Asia |
| Elapidae (elapids) | Cobra, Krait, Mamba, Coral snake, Taipan | Neurotoxic | All warm continents |
| Hydrophidae (sea snakes) | All sea snakes | Myotoxic + Neurotoxic | Pacific/Indian Oceans |
| Colubridae (rear-fanged) | Boomslang, Twig snake | Variable (mostly mild) | Worldwide |
| Region | Key Species | Common Name |
|---|---|---|
| North America | Crotalus adamanteus, C. atrox | Eastern/Western diamondback rattlesnake |
| Indian Subcontinent | Naja naja, Bungarus caeruleus, Vipera russelli, Echis carinatus | Cobra, Krait, Russell's viper, Saw-scaled viper |
| Africa | Echis carinatus, Bitis arietans, Dendroaspis spp. | Saw-scaled viper, Puff adder, Mambas |
| Australia | Oxyuranus scutellatus, Notechis scutatus, Acanthophis | Taipan, Tiger snake, Death adder |
| South America | Bothrops atrox, Crotalus durissus terrificus | Fer-de-lance, South American rattlesnake |
Key note: Up to 25% of crotaline bites are "dry bites" - no venom is injected. Most snake bites overall are from non-venomous snakes, and even in venomous bites, inadequate venom is injected in >50% of cases. - Tintinalli's Emergency Medicine



| Snake | Antivenom |
|---|---|
| Crotaline (US) | Crotalidae Polyvalent Immune Fab (FabAV, ovine) OR Crotalidae Immune F(ab')2 (equine) |
| Coral snake | Antivenom (Micrurus fulvius) - 3-5 vials IV |
| Elapid (worldwide) | Species-specific monovalent or regional polyvalent |
| Sea snakes | Polyvalent sea snake antivenom (CSL Ltd., Melbourne) |

| Type | Timing | Features | Treatment |
|---|---|---|---|
| Early (anaphylactic) | Within 10 min - 2 h | Urticaria, itching, tachycardia, fever, bronchospasm | Adrenaline 0.5-1 mL of 1:1000 IM; antihistamine (chlorpheniramine 10 mg IV) |
| Pyrogenic | Later | Fever, rigors | Antipyretics, cooling |
| Late (serum sickness) | 5-24 days after | Urticaria, fever, arthralgia, lymphadenopathy, albuminuria | Antihistamine; prednisolone 5 mg QID × 5 days |
Pre-treatment skin or conjunctival tests are of no predictive value and should not be used. - Pye's Surgical Handicraft
| Feature | Crotaline (Pit Viper) | Elapid (Cobra/Krait) | Sea Snake | Viper (Russell's/Echis) |
|---|---|---|---|---|
| Local pain | Severe, immediate | Mild/minimal | Painless | Severe |
| Local swelling | Massive, rapid | Minimal (cobra: moderate) | None | Moderate-severe |
| Fang marks | 2 distinct punctures | Small marks | Tiny multiple | 2 distinct punctures |
| Neurotoxicity | Mild (some species) | Dominant feature | Yes (rapid) | Rare |
| Coagulopathy | Yes (DIC) | Australian species | No | Major feature |
| Rhabdomyolysis | Uncommon | Rare | Yes (hallmark) | Uncommon |
| Antivenom route | IV FabAV | IV (species-specific) | IV polyvalent | IV (polyvalent/mono) |
| Pressure bandage | Discouraged | Recommended | Recommended | Discouraged |
Remove page break

| Feature | Venomous | Non-Venomous |
|---|---|---|
| Head shape | Triangular/arrow-shaped | Rounded/oval |
| Pupil | Elliptical (slit) | Round |
| Heat-sensing pit | Present (pit vipers) | Absent |
| Fangs | Long, hollow or grooved | Absent or small |
| Subcaudal plates | Single row | Double row |
| Bite marks | Two distinct fang punctures | U-shaped row of teeth |

| Family | Examples | Venom Type | Geographic Distribution |
|---|---|---|---|
| Viperidae (vipers/adders) | Russell's viper, Puff adder, Saw-scaled viper | Vasculotoxic/Hemotoxic | Worldwide (except Australia) |
| Crotalidae (pit vipers) | Rattlesnakes, Copperhead, Cottonmouth/moccasin | Cytotoxic + Hemotoxic + Neurotoxic | Americas, Asia |
| Elapidae (elapids) | Cobra, Krait, Mamba, Coral snake, Taipan | Neurotoxic | All warm continents |
| Hydrophidae (sea snakes) | All sea snakes | Myotoxic + Neurotoxic | Pacific/Indian Oceans |
| Colubridae (rear-fanged) | Boomslang, Twig snake | Variable (mostly mild) | Worldwide |
| Region | Key Species | Common Name |
|---|---|---|
| North America | Crotalus adamanteus, C. atrox | Eastern/Western diamondback rattlesnake |
| Indian Subcontinent | Naja naja, Bungarus caeruleus, Vipera russelli, Echis carinatus | Cobra, Krait, Russell's viper, Saw-scaled viper |
| Africa | Echis carinatus, Bitis arietans, Dendroaspis spp. | Saw-scaled viper, Puff adder, Mambas |
| Australia | Oxyuranus scutellatus, Notechis scutatus, Acanthophis | Taipan, Tiger snake, Death adder |
| South America | Bothrops atrox, Crotalus durissus terrificus | Fer-de-lance, South American rattlesnake |
Key note: Up to 25% of crotaline bites are "dry bites" - no venom is injected. Most snake bites overall are from non-venomous snakes, and even in venomous bites, inadequate venom is injected in >50% of cases. - Tintinalli's Emergency Medicine



| Snake | Antivenom |
|---|---|
| Crotaline (US) | Crotalidae Polyvalent Immune Fab (FabAV, ovine) OR Crotalidae Immune F(ab')2 (equine) |
| Coral snake | Antivenom (Micrurus fulvius) - 3-5 vials IV |
| Elapid (worldwide) | Species-specific monovalent or regional polyvalent |
| Sea snakes | Polyvalent sea snake antivenom (CSL Ltd., Melbourne) |

| Type | Timing | Features | Treatment |
|---|---|---|---|
| Early (anaphylactic) | Within 10 min - 2 h | Urticaria, itching, tachycardia, fever, bronchospasm | Adrenaline 0.5-1 mL of 1:1000 IM; chlorpheniramine 10 mg IV |
| Pyrogenic | Later | Fever, rigors | Antipyretics, cooling |
| Late (serum sickness) | 5-24 days after | Urticaria, fever, arthralgia, lymphadenopathy, albuminuria | Antihistamine; prednisolone 5 mg QID × 5 days |
Pre-treatment skin or conjunctival tests are of no predictive value and should not be used. - Pye's Surgical Handicraft
| Feature | Crotaline (Pit Viper) | Elapid (Cobra/Krait) | Sea Snake | Viper (Russell's/Echis) |
|---|---|---|---|---|
| Local pain | Severe, immediate | Mild/minimal | Painless | Severe |
| Local swelling | Massive, rapid | Minimal (cobra: moderate) | None | Moderate-severe |
| Neurotoxicity | Mild (some species) | Dominant feature | Yes (rapid) | Rare |
| Coagulopathy | Yes (DIC) | Australian species | No | Major feature |
| Rhabdomyolysis | Uncommon | Rare | Yes (hallmark) | Uncommon |
| Antivenom | IV FabAV | IV species-specific | IV polyvalent | IV polyvalent/mono |
| Pressure bandage | Discouraged | Recommended | Recommended | Discouraged |
Remove all page break and make pdf
ls -la /home/daytona/workspace/
mkdir -p /home/daytona/workspace/snake-bite-pdf
~/snake-bite-pdf/generate_pdf.py
#!/usr/bin/env python3
"""Generate Snake Bite PDF using ReportLab with images downloaded from URLs."""
import urllib.request
import os
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
Image, HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import PageBreak
OUTPUT = "/home/daytona/workspace/snake-bite-pdf/Snake_Bites_Classification_Management.pdf"
IMG_DIR = "/home/daytona/workspace/snake-bite-pdf/images"
os.makedirs(IMG_DIR, exist_ok=True)
# Download images
IMAGES = {
"venomous_vs_nonvenomous.png": "https://emottawablog.com/wp-content/uploads/2024/02/Venomous-vs-nonvenomous-snakes-595x855.png",
"pit_viper_head.png": "https://cdn.orris.care/cdss_images/a655080c5295b752fada3e760bded349aed24bfdca24856ec59bd4c0e2b9d384.png",
"gum_bleeding.png": "https://cdn.orris.care/cdss_images/5d30cc46365132395696c3f9f26565a04de980bfa2db2b22e8253ee12d66f64a.png",
"pit_viper_bite.png": "https://cdn.orris.care/cdss_images/07367e6975ad14e2434b044d975e74b9f46c8a4a838e786aaddbfdc919deab06.png",
"antivenom_flowchart.png": "https://cdn.orris.care/cdss_images/ecc70e3410861be1c03741fc8c11f891207e6156e270145364dbdda57d5a8c06.png",
"symptoms_infographic.jpg": "https://my.clevelandclinic.org/-/scassets/images/org/health/articles/snake-bite.jpg",
}
print("Downloading images...")
downloaded = {}
for fname, url in IMAGES.items():
path = os.path.join(IMG_DIR, fname)
try:
urllib.request.urlretrieve(url, path)
downloaded[fname] = path
print(f" OK: {fname}")
except Exception as e:
print(f" FAILED: {fname} - {e}")
downloaded[fname] = None
# ---------------------------------------------------------------------------
# Document setup
# ---------------------------------------------------------------------------
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2*cm, bottomMargin=2*cm,
title="Snake Bites: Classification, Clinical Features & Management",
author="Orris Medical"
)
W, H = A4
CONTENT_W = W - 4*cm
styles = getSampleStyleSheet()
# Custom styles
title_style = ParagraphStyle(
"DocTitle",
parent=styles["Title"],
fontSize=22,
leading=28,
textColor=colors.HexColor("#1a3a5c"),
spaceAfter=8,
alignment=TA_CENTER,
fontName="Helvetica-Bold"
)
subtitle_style = ParagraphStyle(
"DocSubtitle",
parent=styles["Normal"],
fontSize=11,
leading=14,
textColor=colors.HexColor("#4a6741"),
spaceAfter=4,
alignment=TA_CENTER,
fontName="Helvetica-Oblique"
)
h1_style = ParagraphStyle(
"H1",
parent=styles["Heading1"],
fontSize=15,
leading=20,
textColor=colors.white,
backColor=colors.HexColor("#1a3a5c"),
spaceBefore=14,
spaceAfter=8,
leftIndent=-0.3*cm,
rightIndent=-0.3*cm,
borderPad=6,
fontName="Helvetica-Bold"
)
h2_style = ParagraphStyle(
"H2",
parent=styles["Heading2"],
fontSize=12,
leading=16,
textColor=colors.HexColor("#1a3a5c"),
spaceBefore=10,
spaceAfter=4,
borderPad=2,
fontName="Helvetica-Bold",
borderWidth=0,
borderColor=colors.HexColor("#1a3a5c"),
)
h3_style = ParagraphStyle(
"H3",
parent=styles["Heading3"],
fontSize=11,
leading=15,
textColor=colors.HexColor("#2e6b4f"),
spaceBefore=8,
spaceAfter=3,
fontName="Helvetica-Bold"
)
body_style = ParagraphStyle(
"Body",
parent=styles["Normal"],
fontSize=10,
leading=14,
spaceBefore=2,
spaceAfter=4,
alignment=TA_JUSTIFY,
fontName="Helvetica"
)
bullet_style = ParagraphStyle(
"Bullet",
parent=body_style,
leftIndent=14,
bulletIndent=4,
spaceBefore=1,
spaceAfter=2,
)
caption_style = ParagraphStyle(
"Caption",
parent=styles["Normal"],
fontSize=8.5,
leading=12,
textColor=colors.HexColor("#555555"),
alignment=TA_CENTER,
fontName="Helvetica-Oblique",
spaceAfter=8,
spaceBefore=2
)
note_style = ParagraphStyle(
"Note",
parent=body_style,
backColor=colors.HexColor("#fff8e1"),
borderColor=colors.HexColor("#f0ad4e"),
borderWidth=1,
borderPad=6,
leftIndent=8,
rightIndent=8,
fontSize=9.5,
leading=14
)
source_style = ParagraphStyle(
"Source",
parent=styles["Normal"],
fontSize=8,
leading=12,
textColor=colors.HexColor("#777777"),
fontName="Helvetica-Oblique",
spaceBefore=2,
spaceAfter=2,
)
def hr():
return HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#cccccc"), spaceAfter=4, spaceBefore=4)
def section_header(text):
return Paragraph(f" {text}", h1_style)
def img_block(fname, caption, width=None, height=None):
path = downloaded.get(fname)
items = []
if path and os.path.exists(path):
try:
if width and height:
im = Image(path, width=width, height=height)
elif width:
im = Image(path, width=width)
elif height:
im = Image(path, height=height)
else:
im = Image(path, width=CONTENT_W * 0.7)
im.hAlign = "CENTER"
items.append(im)
except Exception as e:
items.append(Paragraph(f"[Image: {caption}]", caption_style))
items.append(Paragraph(caption, caption_style))
return items
# ---------------------------------------------------------------------------
# Build story
# ---------------------------------------------------------------------------
story = []
# Title block
story.append(Spacer(1, 0.4*cm))
story.append(Paragraph("Snake Bites", title_style))
story.append(Paragraph("Classification, Clinical Features & Management", subtitle_style))
story.append(Paragraph("Sources: Tintinalli's Emergency Medicine · Pye's Surgical Handicraft · Forensic Medicine & Toxicology", source_style))
story.append(Spacer(1, 0.3*cm))
story.append(hr())
story.append(Spacer(1, 0.2*cm))
# ---------------------------------------------------------------------------
# SECTION 1: IDENTIFYING VENOMOUS vs NON-VENOMOUS
# ---------------------------------------------------------------------------
story.append(section_header("1. Identifying Venomous vs. Non-Venomous Snakes"))
# Side-by-side: diagram + table
id_table_data = [
[Paragraph("<b>Feature</b>", body_style), Paragraph("<b>Venomous</b>", body_style), Paragraph("<b>Non-Venomous</b>", body_style)],
[Paragraph("Head shape", body_style), Paragraph("Triangular/arrow-shaped", body_style), Paragraph("Rounded/oval", body_style)],
[Paragraph("Pupil", body_style), Paragraph("Elliptical (slit)", body_style), Paragraph("Round", body_style)],
[Paragraph("Heat-sensing pit", body_style), Paragraph("Present (pit vipers)", body_style), Paragraph("Absent", body_style)],
[Paragraph("Fangs", body_style), Paragraph("Long, hollow or grooved", body_style), Paragraph("Absent or small", body_style)],
[Paragraph("Subcaudal plates", body_style), Paragraph("Single row", body_style), Paragraph("Double row", body_style)],
[Paragraph("Bite marks", body_style), Paragraph("Two distinct fang punctures", body_style), Paragraph("U-shaped row of teeth", body_style)],
]
id_table = Table(id_table_data, colWidths=[4*cm, 5.5*cm, 5.5*cm])
id_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a3a5c")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#f0f4f8"), colors.white]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aaaaaa")),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
]))
# Image of venomous vs nonvenomous
vvn_path = downloaded.get("venomous_vs_nonvenomous.png")
if vvn_path and os.path.exists(vvn_path):
vvn_img = Image(vvn_path, width=6*cm, height=8.6*cm)
layout = Table([[id_table, vvn_img]], colWidths=[CONTENT_W - 6.5*cm, 6.5*cm])
layout.setStyle(TableStyle([("VALIGN", (0,0), (-1,-1), "TOP"), ("LEFTPADDING", (1,0), (1,0), 8)]))
story.append(layout)
else:
story.append(id_table)
story.append(Paragraph("Figure 1. Comparison of venomous vs. non-venomous snake features (Ottawa EM Blog)", caption_style))
story.append(Spacer(1, 0.2*cm))
story.extend(img_block("pit_viper_head.png",
"Figure 2. Pit viper head showing the characteristic elliptical slit pupil and heat-sensing pit (Tintinalli's Emergency Medicine)",
width=10*cm))
# ---------------------------------------------------------------------------
# SECTION 2: CLASSIFICATION
# ---------------------------------------------------------------------------
story.append(section_header("2. Classification of Venomous Snakes"))
story.append(Paragraph("By Family", h2_style))
fam_data = [
[Paragraph("<b>Family</b>", body_style), Paragraph("<b>Examples</b>", body_style),
Paragraph("<b>Venom Type</b>", body_style), Paragraph("<b>Distribution</b>", body_style)],
[Paragraph("Viperidae", body_style), Paragraph("Russell's viper, Puff adder, Saw-scaled viper", body_style),
Paragraph("Vasculotoxic / Hemotoxic", body_style), Paragraph("Worldwide (except Australia)", body_style)],
[Paragraph("Crotalidae (pit vipers)", body_style), Paragraph("Rattlesnakes, Copperhead, Cottonmouth", body_style),
Paragraph("Cytotoxic + Hemotoxic + Neurotoxic", body_style), Paragraph("Americas, Asia", body_style)],
[Paragraph("Elapidae", body_style), Paragraph("Cobra, Krait, Mamba, Coral snake, Taipan", body_style),
Paragraph("Neurotoxic", body_style), Paragraph("All warm continents", body_style)],
[Paragraph("Hydrophidae (sea snakes)", body_style), Paragraph("All sea snakes", body_style),
Paragraph("Myotoxic + Neurotoxic", body_style), Paragraph("Pacific / Indian Oceans", body_style)],
[Paragraph("Colubridae (rear-fanged)", body_style), Paragraph("Boomslang, Twig snake", body_style),
Paragraph("Variable (mostly mild)", body_style), Paragraph("Worldwide", body_style)],
]
fam_table = Table(fam_data, colWidths=[3.5*cm, 4.5*cm, 4*cm, 3*cm])
fam_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a3a5c")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#f0f4f8"), colors.white]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aaaaaa")),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
]))
story.append(fam_table)
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("Medically Important Species by Region", h2_style))
reg_data = [
[Paragraph("<b>Region</b>", body_style), Paragraph("<b>Key Species</b>", body_style), Paragraph("<b>Common Name</b>", body_style)],
[Paragraph("North America", body_style), Paragraph("Crotalus adamanteus, C. atrox", body_style), Paragraph("Eastern/Western diamondback rattlesnake", body_style)],
[Paragraph("Indian Subcontinent", body_style), Paragraph("Naja naja, Bungarus caeruleus, Vipera russelli, Echis carinatus", body_style), Paragraph("Cobra, Krait, Russell's viper, Saw-scaled viper", body_style)],
[Paragraph("Africa", body_style), Paragraph("Echis carinatus, Bitis arietans, Dendroaspis spp.", body_style), Paragraph("Saw-scaled viper, Puff adder, Mambas", body_style)],
[Paragraph("Australia", body_style), Paragraph("Oxyuranus scutellatus, Notechis scutatus, Acanthophis", body_style), Paragraph("Taipan, Tiger snake, Death adder", body_style)],
[Paragraph("South America", body_style), Paragraph("Bothrops atrox, Crotalus durissus terrificus", body_style), Paragraph("Fer-de-lance, South American rattlesnake", body_style)],
[Paragraph("Europe", body_style), Paragraph("Vipera berus, Vipera ammodytes", body_style), Paragraph("Common viper/adder, Long-nosed viper", body_style)],
]
reg_table = Table(reg_data, colWidths=[3.5*cm, 6.5*cm, 5*cm])
reg_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a3a5c")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#f0f4f8"), colors.white]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aaaaaa")),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
]))
story.append(reg_table)
# ---------------------------------------------------------------------------
# SECTION 3: VENOM TYPES
# ---------------------------------------------------------------------------
story.append(section_header("3. Types of Venom and Mechanisms"))
venom_data = [
["Neurotoxic\n(Elapidae, Hydrophidae)",
"d-Tubocurarine-like neuromuscular blockade → flaccid paralysis. Targets respiratory & cardiac centres. Rich in cholinesterase; little/no proteolytic activity.",
"Cobras, kraits, mambas, coral snakes, sea snakes"],
["Vasculotoxic/\nHemotoxic\n(Viperidae, Crotalidae)",
"Intravascular hemolysis, coagulopathy (DIC), thrombocytopenia. Contains proteases (Russell's viper activates clotting cascade via two proteases), hyaluronidase, L-amino acid oxidase, hemorrhagins.",
"Russell's viper, puff adder, rattlesnakes, saw-scaled viper"],
["Myotoxic\n(Hydrophidae)",
"Rhabdomyolysis → myoglobinuria → acute kidney injury. Venom spreads via lymphatics and superficial veins.",
"All sea snakes"],
["Cytotoxic\n(mixed)",
"Local tissue destruction, necrosis, and blistering.",
"Spitting cobras, cottonmouth, copperhead"],
]
venom_table = Table(
[[Paragraph("<b>Venom Type</b>", body_style), Paragraph("<b>Mechanism</b>", body_style), Paragraph("<b>Examples</b>", body_style)]] +
[[Paragraph(r[0], body_style), Paragraph(r[1], body_style), Paragraph(r[2], body_style)] for r in venom_data],
colWidths=[3.5*cm, 8*cm, 3.5*cm]
)
venom_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#2e6b4f")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#f0f9f4"), colors.white]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aaaaaa")),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
]))
story.append(venom_table)
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"<b>Key note:</b> Up to 25% of crotaline bites are \"dry bites\" — no venom is injected. Most snake bites overall are from non-venomous snakes, and even in venomous bites, inadequate venom is injected in >50% of cases.",
note_style))
# ---------------------------------------------------------------------------
# SECTION 4: CLINICAL FEATURES
# ---------------------------------------------------------------------------
story.append(section_header("4. Clinical Features by Snake Type"))
story.append(Paragraph("Symptoms at a Glance", h2_style))
symp_path = downloaded.get("symptoms_infographic.jpg")
if symp_path and os.path.exists(symp_path):
symp_img = Image(symp_path, width=7*cm, height=10.5*cm)
symp_img.hAlign = "CENTER"
story.append(symp_img)
story.append(Paragraph("Figure 3. Snake bite symptoms overview (Cleveland Clinic)", caption_style))
story.append(Paragraph("Crotaline (Pit Viper) Bite", h3_style))
for b in [
"<b>Local:</b> Fang marks, immediate pain, progressive edema (within 15–30 min), ecchymosis, hemorrhagic blebs — entire limb can swell within 1 hour in severe cases",
"<b>Systemic:</b> Nausea/vomiting, weakness, oral numbness/tingling, metallic taste, tachycardia, hypotension",
"<b>Hematologic:</b> Elevated PT, hypofibrinogenemia, thrombocytopenia (DIC); rapid-onset angioedema possible",
]:
story.append(Paragraph(f"• {b}", bullet_style))
story.append(Paragraph("Elapid (Cobra / Krait / Mamba) Bite", h3_style))
for b in [
"<b>Cobra:</b> Small reddish-blue wheal; burning pain; minimal swelling; systemic onset ~30 min. Ptosis (first sign) → ophthalmoplegia → progressive flaccid paralysis (legs → trunk → respiratory muscles)",
"<b>Krait:</b> Often painless; no local swelling; profound drowsiness; albuminuria. Often bites sleeping victims at night",
"<b>Coral snake:</b> Neurologic dysfunction only — no significant local injury; effects may be delayed hours",
"<b>Spitting cobra:</b> Venom ophthalmia (eye pain, corneal injury, temporary blindness) if spit into eyes",
]:
story.append(Paragraph(f"• {b}", bullet_style))
story.append(Paragraph("Russell's Viper / Saw-scaled Viper Bite", h3_style))
# side by side for gum + pit viper images
gum_path = downloaded.get("gum_bleeding.png")
bite_path = downloaded.get("pit_viper_bite.png")
for b in [
"Severe pain within 8 minutes; red/painful area; persistent bleeding from bite site",
"Blisters at ~12 hours, progressing to involve entire limb",
"Spontaneous systemic bleeding: gums, nose, skin (hallmark of hemotoxic DIC)",
"Acute kidney injury common",
]:
story.append(Paragraph(f"• {b}", bullet_style))
img_row = []
cap_row = []
if gum_path and os.path.exists(gum_path):
img_row.append(Image(gum_path, width=6*cm, height=4.5*cm))
cap_row.append(Paragraph("Figure 4. Gum bleeding after saw-scaled viper (Echis carinatus) bite — classic hemotoxic sign (Pye's Surgical Handicraft)", caption_style))
else:
img_row.append(Paragraph("", body_style))
cap_row.append(Paragraph("", caption_style))
if bite_path and os.path.exists(bite_path):
img_row.append(Image(bite_path, width=5*cm, height=7.5*cm))
cap_row.append(Paragraph("Figure 5. Extensive swelling, bruising, blistering and early necrosis 48h after Malayan pit viper bite (Pye's Surgical Handicraft)", caption_style))
else:
img_row.append(Paragraph("", body_style))
cap_row.append(Paragraph("", caption_style))
if len(img_row) == 2:
img_layout = Table([img_row, cap_row], colWidths=[CONTENT_W/2, CONTENT_W/2])
img_layout.setStyle(TableStyle([
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 4),
]))
story.append(img_layout)
story.append(Paragraph("Sea Snake Bite", h3_style))
for b in [
"Initially painless — wading fishermen may not notice",
"Severe myalgia within 2–3 hours; myoglobinuria; elevated creatine kinase",
"Neurotoxic symptoms: flaccid paralysis, respiratory failure",
"If no symptoms by 6–8 hours, envenomation is unlikely",
]:
story.append(Paragraph(f"• {b}", bullet_style))
# ---------------------------------------------------------------------------
# SECTION 5: GENERAL MANAGEMENT
# ---------------------------------------------------------------------------
story.append(section_header("5. General Management"))
story.append(Paragraph("Step 1: First Aid (Pre-hospital)", h2_style))
do_data = [
[Paragraph("<b>DO</b>", body_style), Paragraph("<b>DO NOT</b>", body_style)],
[
Paragraph(
"• Reassure and calm the patient<br/>"
"• Immobilize bitten limb below heart level (splint/sling)<br/>"
"• Transport quickly and passively to hospital<br/>"
"• Remove rings, watches, tight clothing<br/>"
"• Establish IV access in contralateral limb<br/>"
"• Administer oxygen en route<br/>"
"• <b>Elapid/sea snake ONLY:</b> pressure immobilization bandage (elastic bandage proximal to bite + splint)",
bullet_style
),
Paragraph(
"• Cut or incise the wound<br/>"
"• Apply suction (ineffective and harmful)<br/>"
"• Apply ice / cold water (worsens injury)<br/>"
"• Apply electric shock<br/>"
"• Use tourniquets for viper/crotaline bites (causes ischemia)<br/>"
"• Give alcohol or herbal remedies<br/>"
"• Try to catch or handle the snake",
bullet_style
),
]
]
do_table = Table(do_data, colWidths=[CONTENT_W/2, CONTENT_W/2])
do_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), colors.HexColor("#2e6b4f")),
("BACKGROUND", (1,0), (1,0), colors.HexColor("#8b0000")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("BACKGROUND", (0,1), (0,1), colors.HexColor("#f0f9f4")),
("BACKGROUND", (1,1), (1,1), colors.HexColor("#fff0f0")),
("GRID", (0,0), (-1,-1), 0.5, colors.HexColor("#aaaaaa")),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 8),
]))
story.append(do_table)
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("Step 2: Hospital Assessment", h2_style))
story.append(Paragraph("<b>Examine for:</b> Fang marks, wound edema, ecchymosis, bullae; ptosis (earliest neurotoxic sign); respiratory muscle strength (inability to raise head from supine = imminent respiratory failure); gingival/nasal bleeding; regional lymphadenopathy.", body_style))
story.append(Paragraph("Laboratory Workup:", h3_style))
lab_items = [
"CBC, platelet count", "INR/prothrombin time, PTT, fibrinogen", "Serum electrolytes, glucose, BUN, creatinine",
"Creatine kinase", "Fibrin degradation products", "ABG (if respiratory compromise)",
"ECG (patients >50 y or cardiac history)", "Urinalysis (myoglobinuria in sea snake bites)",
]
lab_rows = [lab_items[i:i+2] for i in range(0, len(lab_items), 2)]
lab_table = Table(
[[Paragraph(f"• {c}", bullet_style) for c in row] for row in lab_rows],
colWidths=[CONTENT_W/2, CONTENT_W/2]
)
lab_table.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS", (0,0), (-1,-1), [colors.HexColor("#f7f9fc"), colors.white]),
("GRID", (0,0), (-1,-1), 0.3, colors.HexColor("#dddddd")),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
]))
story.append(lab_table)
story.append(Paragraph("<b>Observe all patients for minimum 8–12 hours</b> (24 hours for most). Absence of all three clinical parameters (local, systemic, hematologic) over 8–12 hours = dry bite.", note_style))
# ---------------------------------------------------------------------------
# SECTION 6: ANTIVENOM
# ---------------------------------------------------------------------------
story.append(section_header("6. Specific Treatment: Antivenom"))
story.append(Paragraph("Antivenom is the <b>only specific and effective treatment</b> for snake envenomation.", body_style))
story.append(Paragraph("Indications for Antivenom", h2_style))
for b in [
"Hypotension, shock, cardiovascular toxicity",
"Neurotoxicity: ptosis, paralysis, respiratory compromise",
"Spontaneous systemic bleeding",
"Non-clotting blood (DIC)",
"Rhabdomyolysis",
"Local: swelling >50% of bitten limb, rapid progression, digit bite",
]:
story.append(Paragraph(f"• {b}", bullet_style))
story.append(Paragraph("Antivenom Types", h2_style))
av_data = [
[Paragraph("<b>Snake</b>", body_style), Paragraph("<b>Antivenom</b>", body_style)],
[Paragraph("Crotaline (US)", body_style), Paragraph("Crotalidae Polyvalent Immune Fab (FabAV, ovine) OR Crotalidae Immune F(ab')2 (equine)", body_style)],
[Paragraph("Coral snake", body_style), Paragraph("Antivenom (Micrurus fulvius) — 3–5 vials IV", body_style)],
[Paragraph("Elapid (worldwide)", body_style), Paragraph("Species-specific monovalent or regional polyvalent", body_style)],
[Paragraph("Sea snakes", body_style), Paragraph("Polyvalent sea snake antivenom (CSL Ltd., Melbourne, Australia)", body_style)],
]
av_table = Table(av_data, colWidths=[4*cm, 11*cm])
av_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a3a5c")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#f0f4f8"), colors.white]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aaaaaa")),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
]))
story.append(av_table)
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("FabAV Dosing Protocol", h2_style))
story.extend(img_block("antivenom_flowchart.png",
"Figure 6. Antivenom (FabAV) dosing flowchart for pit viper envenomation (Tintinalli's Emergency Medicine)",
width=10*cm))
for b in [
"<b>Initial dose:</b> 4–6 vials of FabAV IV to establish \"initial control\" (cessation of progression of local, systemic, and hematologic effects)",
"<b>If initial control achieved:</b> additional 2-vial maintenance doses at 6, 12, and 18 hours",
"<b>If initial control not achieved:</b> repeat the 4–6 vial dose",
"Dilute in crystalloid and infuse over 1 hour IV",
"Children require the <b>same number of vials</b> as adults — only reduce total infusion volume if needed",
"Initial dose for most antivenoms = minimum <b>5 × 10 mL ampoules</b>",
"For procoagulant venoms: repeat initial dose every 6 hours until blood coagulability restored",
]:
story.append(Paragraph(f"• {b}", bullet_style))
story.append(Paragraph("Antivenom Reactions", h2_style))
rxn_data = [
[Paragraph("<b>Type</b>", body_style), Paragraph("<b>Timing</b>", body_style),
Paragraph("<b>Features</b>", body_style), Paragraph("<b>Treatment</b>", body_style)],
[Paragraph("Early (anaphylactic)", body_style), Paragraph("10 min – 2 h", body_style),
Paragraph("Urticaria, itching, tachycardia, fever, bronchospasm", body_style),
Paragraph("Adrenaline 0.5–1 mL of 1:1000 IM; chlorpheniramine 10 mg IV", body_style)],
[Paragraph("Pyrogenic", body_style), Paragraph("Later", body_style),
Paragraph("Fever, rigors", body_style),
Paragraph("Antipyretics, cooling", body_style)],
[Paragraph("Late (serum sickness)", body_style), Paragraph("5–24 days after", body_style),
Paragraph("Urticaria, fever, arthralgia, lymphadenopathy, albuminuria", body_style),
Paragraph("Antihistamine; prednisolone 5 mg QID × 5 days", body_style)],
]
rxn_table = Table(rxn_data, colWidths=[3*cm, 2.5*cm, 5.5*cm, 4*cm])
rxn_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#8b0000")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#fff0f0"), colors.white]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aaaaaa")),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
]))
story.append(rxn_table)
story.append(Paragraph(
"<b>Note:</b> Pre-treatment skin or conjunctival tests are of no predictive value and should not be used.",
note_style))
# ---------------------------------------------------------------------------
# SECTION 7: SPECIFIC SUPPORTIVE
# ---------------------------------------------------------------------------
story.append(section_header("7. Specific & Supportive Measures"))
story.append(Paragraph("Neurotoxic (Elapid) Bites", h3_style))
for b in [
"<b>Neostigmine test:</b> 1.5–2 mg IM (with atropine 0.6 mg) — may dramatically reverse paralysis for post-synaptic neurotoxins (cobra); does not work on pre-synaptic toxins (mamba, krait, taipan)",
"Endotracheal intubation + mechanical ventilation for respiratory failure",
"Prolonged ventilatory support may be needed for days to weeks (kraits)",
"Serial pulmonary function monitoring (inspiratory pressure, vital capacity) for coral snake bites",
]:
story.append(Paragraph(f"• {b}", bullet_style))
story.append(Paragraph("Hemotoxic (Viper) Bites", h3_style))
for b in [
"IV crystalloids for hypovolemia — up to 1/3 of circulating blood volume may extravasate into swollen limb",
"Whole blood clotting test (WBCT) every 6 hours to monitor DIC",
"Fresh frozen plasma or cryoprecipitate if indicated",
"Avoid heparin unless specifically indicated",
]:
story.append(Paragraph(f"• {b}", bullet_style))
story.append(Paragraph("Sea Snake Bites", h3_style))
for b in [
"Pressure immobilization with elastic bandage",
"ICU monitoring of renal, metabolic, and respiratory functions",
"Dialysis if acute kidney injury develops",
]:
story.append(Paragraph(f"• {b}", bullet_style))
story.append(Paragraph("Surgical Aspects", h3_style))
for b in [
"<b>Fasciotomy:</b> Only for confirmed compartment syndrome with measured pressures >30–40 mmHg — not routine",
"Debridement of necrotic tissue",
"Split-skin grafting for large necrotic areas",
"Amputation only in severe irreversible cases",
]:
story.append(Paragraph(f"• {b}", bullet_style))
# ---------------------------------------------------------------------------
# SECTION 8: QUICK REFERENCE TABLE
# ---------------------------------------------------------------------------
story.append(section_header("8. Quick Reference Summary"))
qr_data = [
[Paragraph("<b>Feature</b>", body_style),
Paragraph("<b>Crotaline (Pit Viper)</b>", body_style),
Paragraph("<b>Elapid (Cobra/Krait)</b>", body_style),
Paragraph("<b>Sea Snake</b>", body_style),
Paragraph("<b>Viper (Russell's/Echis)</b>", body_style)],
[Paragraph("Local pain", body_style), Paragraph("Severe, immediate", body_style),
Paragraph("Mild/minimal", body_style), Paragraph("Painless", body_style), Paragraph("Severe", body_style)],
[Paragraph("Local swelling", body_style), Paragraph("Massive, rapid", body_style),
Paragraph("Minimal (cobra: moderate)", body_style), Paragraph("None", body_style), Paragraph("Moderate–severe", body_style)],
[Paragraph("Neurotoxicity", body_style), Paragraph("Mild (some species)", body_style),
Paragraph("Dominant feature", body_style), Paragraph("Yes (rapid)", body_style), Paragraph("Rare", body_style)],
[Paragraph("Coagulopathy", body_style), Paragraph("Yes (DIC)", body_style),
Paragraph("Australian species", body_style), Paragraph("No", body_style), Paragraph("Major feature", body_style)],
[Paragraph("Rhabdomyolysis", body_style), Paragraph("Uncommon", body_style),
Paragraph("Rare", body_style), Paragraph("Yes (hallmark)", body_style), Paragraph("Uncommon", body_style)],
[Paragraph("Antivenom", body_style), Paragraph("IV FabAV", body_style),
Paragraph("IV species-specific", body_style), Paragraph("IV polyvalent", body_style), Paragraph("IV polyvalent/mono", body_style)],
[Paragraph("Pressure bandage", body_style), Paragraph("DISCOURAGED", body_style),
Paragraph("RECOMMENDED", body_style), Paragraph("RECOMMENDED", body_style), Paragraph("DISCOURAGED", body_style)],
]
qr_table = Table(qr_data, colWidths=[3.2*cm, 3.2*cm, 3.3*cm, 2.8*cm, 3.5*cm])
qr_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a3a5c")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#f0f4f8"), colors.white]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#aaaaaa")),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
# Highlight the pressure bandage row
("BACKGROUND", (1,7), (1,7), colors.HexColor("#ffe0e0")),
("BACKGROUND", (2,7), (3,7), colors.HexColor("#e0ffe0")),
("BACKGROUND", (4,7), (4,7), colors.HexColor("#ffe0e0")),
("FONTNAME", (1,7), (-1,7), "Helvetica-Bold"),
]))
story.append(qr_table)
# ---------------------------------------------------------------------------
# SOURCES
# ---------------------------------------------------------------------------
story.append(Spacer(1, 0.4*cm))
story.append(hr())
story.append(Paragraph("<b>Sources</b>", h3_style))
for s in [
"Tintinalli's Emergency Medicine: A Comprehensive Study Guide — Chapters 212 & 213",
"Pye's Surgical Handicraft (22nd ed.) — Chapter 28",
"The Essentials of Forensic Medicine and Toxicology (36th ed.)",
"Mulholland and Greenfield's Surgery (7th ed.)",
]:
story.append(Paragraph(f"• {s}", source_style))
# ---------------------------------------------------------------------------
# Build
# ---------------------------------------------------------------------------
doc.build(story)
print(f"\nPDF created: {OUTPUT}")
cd /home/daytona/workspace/snake-bite-pdf && python3 generate_pdf.py
~/snake-bite-pdf/generate_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/snake-bite-pdf/generate_pdf.py'
~/snake-bite-pdf/generate_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/snake-bite-pdf/generate_pdf.py'
~/snake-bite-pdf/generate_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/snake-bite-pdf/generate_pdf.py'
~/snake-bite-pdf/generate_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/snake-bite-pdf/generate_pdf.py'
cd /home/daytona/workspace/snake-bite-pdf && python3 generate_pdf.py 2>&1
Snake Bites Classification Management
PDF Document · PDF
Do you know what is marrow app
Marrow app medical education India NEET PG features 2024
| Feature | Details |
|---|---|
| Video Classes | 810+ hours across all 19 medical subjects |
| QBank | 18,500+ high-yield MCQs including previous years' questions |
| Test Series | 390+ tests including 130+ Grand Tests; pan-India mock exams with 1 lakh+ participants |
| Magic Module | Curated list of MCQs you got wrong - for targeted revision |
| Schema | Visual map of high-yield and frequently asked topics at a glance |
| Pearls | Quick-read high-yield facts for rapid revision |
| Performance Analytics | Tracks your rank, weak areas, and improvement over time |
| Recent Updates | Covers the latest guideline changes relevant to exams |