Hanging from latest fmt textbook
"Hanging is always suicidal in nature, unless otherwise the contrary is proved beyond reasonable doubt."
| Type | Description |
|---|---|
| Complete hanging | Body fully suspended without any part touching the ground |
| Partial hanging | Body partly suspended - toes/feet touch the ground, or body in sitting/kneeling/lying/prone posture with only head and chest off the ground. The weight of head (5-6 kg), chest and arms acts as constricting force. Only a comparatively slight force is enough to cause death. |
| Type | Description |
|---|---|
| Typical hanging | Knot over the central back of neck (occipital region); ligature runs symmetrically upward from midline above thyroid cartilage |
| Atypical hanging | Knot on right side, left side, or front of the neck (anywhere except the occiput) |
| Mechanism | Details |
|---|---|
| (1) Asphyxia | Ligature compresses laryngeal/tracheal lumina; root of tongue is forced against posterior pharyngeal wall; epiglottis folds over larynx entrance. A tension of 15 kg blocks the trachea. Marked asphyxia signs present. |
| (2) Venous congestion | Knot in chin area blocks jugular veins (compression of 2 kg sufficient) but arterial flow may continue, leading to cerebral venous congestion and unconsciousness. |
| (3) Combined asphyxia + venous congestion | Commonest cause |
| (4) Cerebral anemia | Knot at nape of neck: both arterial and venous flow cut off. Pressure on carotid arteries → cerebral anemia and coma in 10-15 seconds. Death slow; asphyxial features less marked. A tension of 4-5 kg blocks carotid arteries; 20 kg blocks vertebral arteries. |
| (5) Reflex vagal inhibition | Pressure on vagal sheath or carotid bodies. Fear, apprehension, alcohol heighten sensitivity. Release of catecholamines may sensitize myocardium to neurogenic stimulation. |
| (6) Cervical vertebral fracture/dislocation | Occurs with free fall + sudden jerk (e.g., judicial hanging). |

| Structure | Findings |
|---|---|
| Underlying skin layers | Small hemorrhages from direct pressure |
| Strap muscles | Hemorrhages in ~25% |
| Platysma/sternomastoid | Ruptured in 5-10% (with significant violence) |
| Carotid arteries | Transverse intimal splits in 5-10% (ipsilateral to knot location); indicates victim was alive at time of hanging. Several horizontal tears at different levels seen with long-drop hanging |
| Vertebral arteries | Rupture, intimal tears, subintimal hemorrhages (some cases) |
| Trachea | Usually congested; injury unusual |
| Epiglottis/larynx/trachea | Petechial hemorrhages |
| Base of tongue deep muscles | Bruising from crushing against hard palate |
| Lymph nodes above/below ligature | Congested |
| Lungs | Congested, oedematous; exude bloody serum (constriction at end of expiration) - OR pale (constriction at end of inspiration); subpleural ecchymoses possible |
| Brain | Usually normal; may be pale or congested |
| Subarachnoid space | Effusions common |
| Lumbar vertebrae | Simon's hemorrhages - bleeding into outer layers of intervertebral discs (red stripes between vertebral bodies) - seen in bodies suspended for a long time |
| Abdominal organs | Usually congested |
| Feature | Hanging | Ligature Strangulation |
|---|---|---|
| Ligature mark direction | Oblique, upward toward knot | Horizontal |
| Suspension peak | Present (no mark at knot junction) | Absent |
| Level | Usually above thyroid cartilage | Usually at/below thyroid cartilage |
| Depth of groove | Less deep (broader ligature) | May be deeper |
| Manner | Usually suicidal | Usually homicidal |
Create a summary PDF guide on forensic findings in hanging cases
ls -la /tmp/workspace/ 2>/dev/null || echo "workspace does not exist"
mkdir -p /tmp/workspace/hanging-pdf && python3 -c "from reportlab.lib import colors; print('reportlab ok')"
~/hanging-pdf/build_pdf.py
"""
Forensic Findings in Hanging – Summary PDF Guide
Source: The Essentials of Forensic Medicine and Toxicology, 36th Edition (2026)
"""
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_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
# ── colour palette ──────────────────────────────────────────────────────────
C_DARK = colors.HexColor("#1a1a2e") # dark navy
C_MID = colors.HexColor("#16213e") # medium navy
C_ACCENT = colors.HexColor("#b5451b") # deep red/crimson
C_LIGHT = colors.HexColor("#e94560") # bright red highlight
C_BG = colors.HexColor("#f5f5f5") # light grey bg for tables
C_HDR = colors.HexColor("#1a1a2e") # table header navy
C_ROW1 = colors.HexColor("#ffffff")
C_ROW2 = colors.HexColor("#eef0f6")
C_WHITE = colors.white
C_BORDER = colors.HexColor("#c0c4d0")
W, H = A4
# ── document ─────────────────────────────────────────────────────────────────
OUTPUT = "/tmp/workspace/hanging-pdf/Forensic_Findings_Hanging.pdf"
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2.5*cm, bottomMargin=2*cm,
title="Forensic Findings in Hanging – Summary Guide",
author="Orris Medical AI",
subject="Forensic Medicine & Toxicology"
)
styles = getSampleStyleSheet()
# ── custom styles ─────────────────────────────────────────────────────────────
def make_styles():
s = {}
s["cover_title"] = ParagraphStyle("cover_title",
fontSize=28, leading=34, textColor=C_WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER, spaceAfter=6)
s["cover_sub"] = ParagraphStyle("cover_sub",
fontSize=13, leading=18, textColor=colors.HexColor("#dddddd"),
fontName="Helvetica", alignment=TA_CENTER, spaceAfter=4)
s["cover_src"] = ParagraphStyle("cover_src",
fontSize=9, leading=13, textColor=colors.HexColor("#aaaacc"),
fontName="Helvetica-Oblique", alignment=TA_CENTER)
s["section"] = ParagraphStyle("section",
fontSize=13, leading=17, textColor=C_WHITE,
fontName="Helvetica-Bold", alignment=TA_LEFT,
spaceBefore=14, spaceAfter=6,
backColor=C_ACCENT,
leftIndent=-8, rightIndent=-8,
borderPad=(4, 8, 4, 8))
s["subsection"] = ParagraphStyle("subsection",
fontSize=11, leading=15, textColor=C_MID,
fontName="Helvetica-Bold", alignment=TA_LEFT,
spaceBefore=10, spaceAfter=4,
borderPadding=(0, 0, 2, 0))
s["body"] = ParagraphStyle("body",
fontSize=9.5, leading=14, textColor=colors.HexColor("#222222"),
fontName="Helvetica", alignment=TA_JUSTIFY,
spaceBefore=3, spaceAfter=3)
s["bullet"] = ParagraphStyle("bullet",
fontSize=9.5, leading=14, textColor=colors.HexColor("#222222"),
fontName="Helvetica", alignment=TA_LEFT,
spaceBefore=2, spaceAfter=2,
leftIndent=14, bulletIndent=4)
s["note"] = ParagraphStyle("note",
fontSize=8.5, leading=12, textColor=colors.HexColor("#555555"),
fontName="Helvetica-Oblique", alignment=TA_LEFT,
spaceBefore=4, spaceAfter=4, leftIndent=10)
s["quote"] = ParagraphStyle("quote",
fontSize=10, leading=15, textColor=C_ACCENT,
fontName="Helvetica-BoldOblique", alignment=TA_CENTER,
spaceBefore=6, spaceAfter=6, leftIndent=20, rightIndent=20)
s["footer"] = ParagraphStyle("footer",
fontSize=7.5, leading=10, textColor=colors.HexColor("#888888"),
fontName="Helvetica", alignment=TA_CENTER)
s["toc_item"] = ParagraphStyle("toc_item",
fontSize=10, leading=16, textColor=C_MID,
fontName="Helvetica", alignment=TA_LEFT,
leftIndent=10)
return s
S = make_styles()
# ── helper: section header banner ────────────────────────────────────────────
def sec_header(text):
return [
Spacer(1, 6),
Table([[Paragraph(f" {text}", S["section"])]],
colWidths=[W - 4*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_ACCENT),
("ROUNDEDCORNERS", [4]),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
])),
Spacer(1, 4),
]
def subsec(text):
return [Paragraph(text, S["subsection"]),
HRFlowable(width="100%", thickness=0.6, color=C_BORDER, spaceAfter=4)]
def body(text):
return Paragraph(text, S["body"])
def bul(text):
return Paragraph(f"• {text}", S["bullet"])
def note(text):
return Paragraph(f"ℹ {text}", S["note"])
# ── table builder ─────────────────────────────────────────────────────────────
def make_table(headers, rows, col_widths=None):
table_data = []
# header row
hdr_row = [Paragraph(f"<b>{h}</b>", ParagraphStyle("th",
fontSize=9, leading=12, textColor=C_WHITE,
fontName="Helvetica-Bold", alignment=TA_LEFT))
for h in headers]
table_data.append(hdr_row)
for i, row in enumerate(rows):
styled = [Paragraph(str(cell), ParagraphStyle("td",
fontSize=9, leading=13, textColor=colors.HexColor("#222222"),
fontName="Helvetica", alignment=TA_LEFT))
for cell in row]
table_data.append(styled)
if col_widths is None:
cw = (W - 4*cm) / len(headers)
col_widths = [cw] * len(headers)
tbl = Table(table_data, colWidths=col_widths, repeatRows=1)
row_colors = []
for i in range(1, len(table_data)):
bg = C_ROW1 if i % 2 == 1 else C_ROW2
row_colors.append(("BACKGROUND", (0, i), (-1, i), bg))
tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), C_HDR),
("TEXTCOLOR", (0, 0), (-1, 0), C_WHITE),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING", (0, 0), (-1, -1), 5),
("LEFTPADDING", (0, 0), (-1, -1), 6),
("RIGHTPADDING", (0, 0), (-1, -1), 6),
("GRID", (0, 0), (-1, -1), 0.4, C_BORDER),
("ROWBACKGROUNDS", (0, 1), (-1, -1), [C_ROW1, C_ROW2]),
("VALIGN", (0, 0), (-1, -1), "TOP"),
] + row_colors))
return tbl
# ── page templates (header/footer) ───────────────────────────────────────────
def on_page(canvas, doc):
canvas.saveState()
# header bar
canvas.setFillColor(C_DARK)
canvas.rect(0, H - 1.4*cm, W, 1.4*cm, fill=1, stroke=0)
canvas.setFont("Helvetica-Bold", 9)
canvas.setFillColor(C_WHITE)
canvas.drawString(2*cm, H - 0.9*cm, "FORENSIC FINDINGS IN HANGING")
canvas.setFont("Helvetica", 8)
canvas.setFillColor(colors.HexColor("#aaaacc"))
canvas.drawRightString(W - 2*cm, H - 0.9*cm,
"Essentials of FMT, 36th Ed. (2026)")
# footer
canvas.setFillColor(colors.HexColor("#666666"))
canvas.setFont("Helvetica", 7.5)
canvas.drawCentredString(W/2, 1.2*cm, f"Page {doc.page}")
canvas.setFillColor(C_ACCENT)
canvas.rect(2*cm, 1.05*cm, W - 4*cm, 0.05*cm, fill=1, stroke=0)
canvas.restoreState()
def on_first_page(canvas, doc):
# no header/footer on cover
pass
# ══════════════════════════════════════════════════════════════════════════════
# BUILD CONTENT
# ══════════════════════════════════════════════════════════════════════════════
story = []
# ── COVER PAGE ───────────────────────────────────────────────────────────────
# Background
from reportlab.platypus import Flowable
class ColorRect(Flowable):
def __init__(self, w, h, color):
super().__init__()
self.w, self.h, self.color = w, h, color
def draw(self):
self.canv.setFillColor(self.color)
self.canv.rect(-2*cm, -2*cm, self.w + 4*cm, self.h + 2*cm, fill=1, stroke=0)
# Cover content as a table spanning the page
cover_content = [
Spacer(1, 3.5*cm),
Table([[Paragraph("FORENSIC FINDINGS IN", S["cover_title"])]],
colWidths=[W - 4*cm],
style=TableStyle([("BACKGROUND", (0,0), (-1,-1), C_DARK),
("TOPPADDING", (0,0), (-1,-1), 2),
("BOTTOMPADDING", (0,0), (-1,-1), 2)])),
Spacer(1, 0.1*cm),
Table([[Paragraph("HANGING", ParagraphStyle("big",
fontSize=52, leading=58, textColor=C_ACCENT,
fontName="Helvetica-Bold", alignment=TA_CENTER))]],
colWidths=[W - 4*cm],
style=TableStyle([("BACKGROUND", (0,0), (-1,-1), C_DARK),
("TOPPADDING", (0,0), (-1,-1), 0),
("BOTTOMPADDING", (0,0), (-1,-1), 0)])),
Spacer(1, 0.3*cm),
Table([[Paragraph("A Comprehensive Summary Guide", S["cover_sub"])]],
colWidths=[W - 4*cm],
style=TableStyle([("BACKGROUND", (0,0), (-1,-1), C_DARK)])),
Spacer(1, 0.8*cm),
HRFlowable(width="60%", thickness=1.5, color=C_ACCENT,
hAlign="CENTER", spaceAfter=10),
Spacer(1, 0.4*cm),
Table([[Paragraph(
"Source: The Essentials of Forensic Medicine and Toxicology<br/>"
"<b>36th Edition (2026)</b> — Chapter 13: Asphyxia", S["cover_src"])]],
colWidths=[W - 4*cm],
style=TableStyle([("BACKGROUND", (0,0), (-1,-1), C_DARK)])),
Spacer(1, 0.3*cm),
Table([[Paragraph("For Medical Students & Postgraduates", ParagraphStyle("sub2",
fontSize=10, textColor=colors.HexColor("#8888aa"),
fontName="Helvetica-Oblique", alignment=TA_CENTER))]],
colWidths=[W - 4*cm],
style=TableStyle([("BACKGROUND", (0,0), (-1,-1), C_DARK)])),
Spacer(1, 3*cm),
Table([[Paragraph("Compiled by Orris Medical AI • July 2026", ParagraphStyle("byline",
fontSize=8.5, textColor=colors.HexColor("#666688"),
fontName="Helvetica", alignment=TA_CENTER))]],
colWidths=[W - 4*cm],
style=TableStyle([("BACKGROUND", (0,0), (-1,-1), C_DARK)])),
]
# Wrap entire cover in a dark background table
cover_table = Table(
[[item] for item in cover_content],
colWidths=[W - 4*cm]
)
cover_table.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), C_DARK),
("TOPPADDING", (0, 0), (-1, -1), 0),
("BOTTOMPADDING", (0, 0), (-1, -1), 0),
("LEFTPADDING", (0, 0), (-1, -1), 0),
("RIGHTPADDING", (0, 0), (-1, -1), 0),
]))
story.append(cover_table)
story.append(PageBreak())
# ── PAGE 2: DEFINITION & CLASSIFICATION ──────────────────────────────────────
story += sec_header("1. DEFINITION")
story.append(body(
"<b>Hanging</b> is a <b>violent form of mechanical asphyxia</b> caused by "
"suspension of the body by a ligature which encircles the neck, the "
"<b>constricting force being the weight of the body</b> itself."
))
story.append(Spacer(1, 4))
story.append(Paragraph(
'"Hanging is always suicidal in nature, unless otherwise the contrary is '
'proved beyond reasonable doubt."',
S["quote"]
))
story.append(Spacer(1, 6))
story += sec_header("2. CLASSIFICATION")
story += subsec("A. By Degree of Suspension")
tbl1 = make_table(
["Type", "Description"],
[
["Complete Hanging",
"Body fully suspended without any part touching the ground."],
["Partial Hanging",
"Body partly suspended — toes/feet touch ground, or body in sitting/kneeling/"
"lying/prone posture with only head and chest off ground. Weight of head (5–6 kg), "
"chest and arms acts as the constricting force. Only slight force is needed to cause death."],
],
col_widths=[4.5*cm, 12.5*cm]
)
story.append(tbl1)
story.append(Spacer(1, 8))
story += subsec("B. By Position of the Knot")
tbl2 = make_table(
["Type", "Knot Location", "Description"],
[
["Typical Hanging", "Occipital (back of neck)",
"Ligature runs symmetrically upward from midline above thyroid cartilage."],
["Atypical Hanging", "Right side, left side, or front of neck",
"Knot anywhere except on the occiput."],
],
col_widths=[4*cm, 5*cm, 8*cm]
)
story.append(tbl2)
story.append(PageBreak())
# ── PAGE 3: SYMPTOMS & CAUSE OF DEATH ────────────────────────────────────────
story += sec_header("3. SYMPTOMS OF HANGING")
symptoms = [
"Loss of power; flashes of light, ringing/hissing noises in ears",
"Intense mental confusion; loss of logical thought",
"Loss of consciousness within <b>15 seconds</b> (thin rope) — regarded as a <b>painless death</b>",
"Stage of convulsions — face distorted, livid; eyes prominent; violent struggling",
"Respiration stops before the heart (heart continues for <b>10–15 minutes</b>)",
]
for s in symptoms:
story.append(bul(s))
story.append(Spacer(1, 8))
story += sec_header("4. CAUSE OF DEATH — MECHANISMS")
tbl3 = make_table(
["No.", "Mechanism", "Details", "Pressure Required"],
[
["1", "Asphyxia",
"Ligature compresses laryngeal/tracheal lumina; root of tongue forced against "
"posterior pharyngeal wall; epiglottis folds over larynx. Struggle = 'air hunger'.",
"15 kg to block trachea"],
["2", "Venous Congestion",
"Knot in chin area blocks jugular veins but arterial flow continues → cerebral "
"venous congestion → unconsciousness.",
"2 kg to close jugular veins"],
["3", "Combined (Asphyxia + Venous Congestion)",
"<b>COMMONEST cause</b> of death in hanging.",
"—"],
["4", "Cerebral Anemia",
"Knot at nape of neck compresses both arterial + venous flow. Coma in 10–15 sec; "
"death slow; fewer asphyxia signs. Cord sinks deeply into tissues.",
"4–5 kg (carotids); 20 kg (vertebrals)"],
["5", "Reflex Vagal Inhibition",
"Pressure on vagal sheath/carotid bodies → cardiac arrest. Fear, alcohol, "
"catecholamines heighten sensitivity.",
"—"],
["6", "Cervical Fracture/Dislocation",
"Free fall + sudden jerk (judicial hanging). Immediate death.",
"—"],
],
col_widths=[0.8*cm, 4*cm, 9.2*cm, 3*cm]
)
story.append(tbl3)
story.append(Spacer(1, 8))
story += sec_header("5. FATAL PERIOD")
fatal = [
"<b>Immediate</b> — cervical vertebrae fractured or heart inhibited",
"<b>Rapid</b> — asphyxia is the primary cause",
"<b>Least rapid</b> — coma is responsible",
"<b>Usual period: 3 to 5 minutes</b>",
]
for f in fatal:
story.append(bul(f))
story.append(PageBreak())
# ── PAGE 4: POSTMORTEM APPEARANCES — EXTERNAL ────────────────────────────────
story += sec_header("6. POSTMORTEM APPEARANCES — EXTERNAL")
story += subsec("A. Ligature Mark on the Neck (Most Important Finding)")
ligature_rows = [
["Direction", "Oblique, running upward toward the knot — classic INVERTED-V configuration"],
["Deepest point", "Opposite side to the knot (maximum pressure area)"],
["Suspension peak/point", "Junction of noose + vertical rope — NO mark left here. KEY feature distinguishing hanging from ligature strangulation."],
["Width", "Approximately equal to, or slightly less than, the width of the ligature"],
["Level (re: thyroid cartilage)", "ABOVE thyroid cartilage: 80% | AT level: ~15% | BELOW: ~5% (esp. partial suspension)"],
["Edges", "Narrow zone of congestion/hemorrhage (blood displaced laterally, NOT vital reaction)"],
["Lower margin", "May be pale; upper margin red from postmortem vessel distension"],
["Blisters", "May form from friction of tight noose (contain serum)"],
["Ecchymoses alone", "No significance for antemortem vs. postmortem hanging"],
["Abrasions + hemorrhage", "Strongly suggestive of antemortem suspension"],
["Tissue reaction (histology)", "Presence = antemortem hanging; Absence does NOT exclude antemortem hanging (Gordon et al.)"],
]
tbl4 = make_table(["Feature", "Details"], ligature_rows, col_widths=[5*cm, 12*cm])
story.append(tbl4)
story.append(Spacer(1, 8))
story += subsec("B. Horizontal Ligature Mark — When Seen")
horiz = [
"Running noose applied — weight causes noose to tighten mainly horizontally",
"Hanging from a low point of suspension",
"Partial hanging with body leaning forward",
]
for h in horiz:
story.append(bul(h))
story += subsec("C. Postmortem Lividity (Hypostasis)")
lividity_rows = [
[
"Early",
"Purple/bluish-red discoloration of face, neck, forearms, and hands (below ligature)"
],
[
"After 4–6 hours",
"Fluid gravitates to dependent parts of upper + lower limbs, and external genitalia"
],
[
"Penile turgidity",
"Apparent engorgement of penis in males due to long suspension"
],
]
tbl5 = make_table(["Timing", "Finding"], lividity_rows, col_widths=[3.5*cm, 13.5*cm])
story.append(tbl5)
story += subsec("D. Other External Findings")
ext_other = [
"Face: pale or congested, cyanosed",
"Tongue: may protrude between teeth",
"Eyes: may be open or closed; conjunctival congestion",
"Seminal fluid may ooze at time of death",
"Urination/defecation from loss of sphincter control",
]
for e in ext_other:
story.append(bul(e))
story.append(PageBreak())
# ── PAGE 5: POSTMORTEM — INTERNAL ────────────────────────────────────────────
story += sec_header("7. POSTMORTEM APPEARANCES — INTERNAL")
story.append(note("Neck must be examined AFTER removal of brain and viscera from chest and abdominal cavities."))
story.append(Spacer(1, 4))
internal_rows = [
["Underlying skin/tissue", "Small hemorrhages from direct pressure; no tissue reaction (dry, white, glistening with occasional ecchymoses)"],
["Strap muscles of neck", "Hemorrhages in ~25% of cases"],
["Platysma / Sternomastoid", "Rupture in 5–10% (with considerable violence)"],
["Carotid arteries", "Transverse intimal splits in 5–10% (ipsilateral to knot); indicates victim was alive. Multiple horizontal tears at different levels = long-drop hanging. Open to level of mandible to demonstrate tears."],
["Vertebral arteries", "Rupture, intimal tears, subintimal hemorrhages (some cases)"],
["Trachea", "Usually congested; injury unusual"],
["Epiglottis/Larynx/Trachea", "Petechial hemorrhages"],
["Base of tongue (deep muscles)", "Bruising from crushing against hard palate by upward push of ligature"],
["Lymph nodes", "Congested above and below the ligature mark"],
["Lungs", "Congested, oedematous, exude bloody serum (constriction at end of EXPIRATION)\nPale (constriction at end of INSPIRATION)\nSubpleural ecchymoses possible"],
["Brain", "Usually normal; may be pale or congested by mode of death"],
["Subarachnoid space", "Effusions common"],
["Simon's Hemorrhages", "Bleeding into outer layers of intervertebral discs of lumbar vertebrae (red stripes between vertebral bodies) — seen in bodies suspended for a long time"],
["Abdominal organs", "Usually congested"],
]
tbl6 = make_table(["Structure", "Findings"], internal_rows, col_widths=[5*cm, 12*cm])
story.append(tbl6)
story.append(PageBreak())
# ── PAGE 6: MEDICOLEGAL TYPES ─────────────────────────────────────────────────
story += sec_header("8. MEDICOLEGAL CLASSIFICATION OF HANGING")
story += subsec("A. Suicidal Hanging (Most Common)")
suicide_pts = [
"Most common method of suicide; hanging is <b>presumed suicidal</b> unless contrary proved",
"Only slight force required — partial hanging is still lethal",
"Ligature mark is antemortem",
"Ligature: rope, cord, saree, dhoti, belt, bed sheet, chain — anything readily available",
"Double suicide (pact), family pacts have been documented",
]
for p in suicide_pts:
story.append(bul(p))
story += subsec("B. Accidental Hanging")
accidental = [
"Children during play imitating judicial hanging; some padding between ligature and neck suggests accident",
"Workmen falling from scaffolding entangled in ropes",
"Boys climbing trees/railings — garment caught by branch/bar drawn tight around neck",
"Infants in restraining apparatus wriggling out and neck becomes caught",
"Athletes exhibiting hanging stunts",
]
for a in accidental:
story.append(bul(a))
story += subsec("C. Homicidal Hanging")
homicidal = [
"Rare; practically impossible in a conscious, non-intoxicated adult",
"More feasible in children or helpless/drugged/unconscious individuals",
"Must be differentiated from postmortem suspension (body hanged after murder to simulate suicide)",
"Key: look for other injuries, ligature mark characteristics, hypostasis pattern",
]
for h in homicidal:
story.append(bul(h))
story.append(Spacer(1, 8))
story += sec_header("9. DELAYED DEATHS AFTER RESCUE")
delayed = [
("Aspiration pneumonia", "Common cause of delayed death"),
("Oedema of lungs", "—"),
("Oedema of larynx", "Can cause airway compromise"),
("Hypoxic encephalopathy", "From prolonged cerebral hypoxia"),
("Infarction of brain", "Vascular compromise"),
("Abscess / Cerebral softening", "Secondary infection or ischemia"),
]
tbl7 = make_table(["Cause", "Note"], delayed, col_widths=[6*cm, 11*cm])
story.append(tbl7)
story.append(Spacer(1, 6))
story.append(note(
"Secondary effects in survivors: hemiplegia, epileptiform convulsions, amnesia, dementia, "
"decubitus ulcer, anemia, hypoproteinemia, cervical cellulitis, parotitis, retropharyngeal abscess."
))
story.append(PageBreak())
# ── PAGE 7: HANGING vs STRANGULATION ─────────────────────────────────────────
story += sec_header("10. HANGING vs. LIGATURE STRANGULATION — KEY DIFFERENCES")
comparison = [
["Ligature mark direction", "Oblique, upward toward knot (inverted-V)", "Horizontal"],
["Suspension peak", "PRESENT — no mark at knot junction", "ABSENT"],
["Level relative to thyroid", "Usually ABOVE thyroid cartilage (80%)", "Usually at/below thyroid cartilage"],
["Constricting force", "Weight of body", "External force applied by another person"],
["Depth of groove", "Less deep with broad ligature; deeper with thin cord", "Usually deeper, uniform"],
["Face appearance", "Less marked congestion (venous + arterial both compressed)", "Marked congestion (venous blocked, arterial open)"],
["Petechiae", "Less common", "More common (classic feature)"],
["Manner of death", "Usually SUICIDAL", "Usually HOMICIDAL"],
["Knot", "Usually present; tied by deceased", "May not have a knot; continuous pull"],
["Carotid intimal tears", "Present (antemortem indicator)", "Less common"],
]
tbl8 = make_table(
["Feature", "HANGING", "LIGATURE STRANGULATION"],
comparison,
col_widths=[5*cm, 7.5*cm, 4.5*cm]
)
story.append(tbl8)
story.append(Spacer(1, 10))
story += sec_header("11. LIGATURE EXAMINATION — DOCTOR'S CHECKLIST")
checklist = [
"Note nature and composition of ligature material",
"Measure width and assess if strong enough to bear weight + jerk",
"Describe texture, length, mode of application",
"Record location and type of knot",
"<b>Photograph before removing</b> the ligature from the neck",
"Assess whether the mark on neck corresponds with the ligature alleged to have been used",
"Note if rope broke/detached — victim may be found on ground with ligature still around neck",
]
for c in checklist:
story.append(bul(c))
story.append(PageBreak())
# ── PAGE 8: TREATMENT & QUICK REFERENCE ──────────────────────────────────────
story += sec_header("12. TREATMENT (PERSON RESCUED FROM HANGING)")
treatment = [
"<b>Step 1:</b> Cut the ligature immediately to remove neck constriction",
"<b>Step 2:</b> Artificial respiration (CPR if required)",
"<b>Step 3:</b> Stimulants as clinically indicated",
"<b>Step 4:</b> Monitor for delayed complications (see Section 9)",
]
for t in treatment:
story.append(bul(t))
story.append(Spacer(1, 8))
story += sec_header("13. QUICK REFERENCE — KEY NUMBERS TO REMEMBER")
numbers = [
["2 kg", "Closes jugular veins"],
["4–5 kg", "Blocks carotid arteries"],
["15 kg", "Blocks the trachea"],
["20 kg", "Blocks vertebral arteries"],
["5–6 kg", "Approximate weight of the head (acts as constricting force in partial hanging)"],
["15 seconds", "Time to loss of consciousness with thin rope"],
["10–15 min", "Heart may continue to beat after respiration stops"],
["3–5 minutes", "Usual fatal period"],
["80%", "Ligature mark found ABOVE level of thyroid cartilage"],
["~15%", "Ligature mark AT level of thyroid cartilage"],
["~5%", "Ligature mark BELOW thyroid cartilage (esp. partial suspension)"],
["25%", "Hemorrhages in strap muscles"],
["5–10%", "Platysma/sternomastoid rupture; carotid intimal splits"],
]
tbl9 = make_table(["Value", "Significance"], numbers, col_widths=[3.5*cm, 13.5*cm])
story.append(tbl9)
story.append(Spacer(1, 8))
story.append(Paragraph(
"Source: The Essentials of Forensic Medicine and Toxicology, 36th Edition (2026) — "
"Chapter 13: Asphyxia, pp. 334–342 • Compiled by Orris Medical AI, July 2026",
S["footer"]
))
# ── BUILD ─────────────────────────────────────────────────────────────────────
doc.build(story,
onFirstPage=on_first_page,
onLaterPages=on_page)
print(f"PDF saved to: {OUTPUT}")
cd /tmp/workspace/hanging-pdf && python3 build_pdf.py 2>&1
python3 -c " from pypdf import PdfReader r = PdfReader('/tmp/workspace/hanging-pdf/Forensic_Findings_Hanging.pdf') print(f'Pages: {len(r.pages)}') import os sz = os.path.getsize('/tmp/workspace/hanging-pdf/Forensic_Findings_Hanging.pdf') print(f'Size: {sz/1024:.1f} KB') "
Forensic Findings Hanging
PDF Document · PDF
| Section | Content |
|---|---|
| Cover | Dark-themed cover with title, edition, and date |
| 1. Definition | Definition + classic medicolegal quote |
| 2. Classification | Complete/partial hanging; typical/atypical (with tables) |
| 3. Symptoms | Chronological sequence of events |
| 4. Cause of Death | All 6 mechanisms with pressure values required |
| 5. Fatal Period | Timing by mechanism |
| 6. PM Appearances — External | Ligature mark features, lividity, penile turgidity |
| 7. PM Appearances — Internal | Neck dissection findings, Simon's hemorrhages |
| 8. Medicolegal Classification | Suicidal / Accidental / Homicidal with differentiating points |
| 9. Delayed Deaths | Post-rescue complications and sequelae |
| 10. Hanging vs. Ligature Strangulation | 10-point comparison table |
| 11. Ligature Examination Checklist | Step-by-step doctor's checklist |
| 12. Treatment | 4-step immediate management |
| 13. Quick Reference Numbers | All key values (pressures, %, timings) in one table |