Types of fractures in fmt
types of fractures forensic medicine toxicology FMT classification medicolegal
https://med.sohag-univ.edu.eg/main/wp-content/uploads/2023/0…

| Type | Description |
|---|---|
| Greenstick | Incomplete fracture; bone bends and cracks on one side only. Common in children with pliable bones. |
| Transverse | Fracture line runs perpendicular to the bone axis. Caused by direct force. |
| Oblique | Fracture line runs at an angle across the bone. |
| Spiral | Fracture line spirals around the bone shaft. Classic for torsion/twisting injuries. Medicolegally important in child abuse. |
| Comminuted | Bone breaks into three or more fragments. Caused by significant force. |
| Compound (Open) | Bone fragments pierce the skin, creating external wound and infection risk. |
| Simple (Closed) | Overlying skin is intact. |
| Impacted | One fragment is driven into another. |
| Avulsion | Fragment pulled off by forceful muscle/ligament contraction. |
| Stress/Fatigue | Results from repeated low-force loading (e.g., march fracture of the metatarsal). |
| Pathological | Occurs through diseased bone (e.g., metastasis, osteoporosis) with minimal force. |

| Type | Key Features |
|---|---|
| Ring Fracture | Encircles the foramen magnum; caused by fall from height onto feet - kinetic energy transmitted up spine, raming into occipital bone |
| Hinge Fracture | Transverse fracture across the base, dividing skull into front and back halves; caused by lateral compression (crushing between two objects) |
| Anterior Cranial Fossa | Fractures through orbital plates; signs - bilateral periorbital ecchymosis ("raccoon eyes"), CSF rhinorrhea |
| Middle Cranial Fossa | Fracture through temporal bone; signs - Battle's sign (mastoid ecchymosis), CSF otorrhea, hemotympanum |
| Posterior Cranial Fossa | Fractures extend toward foramen magnum; blows to occipital region |
Create pdf with images
mkdir -p /home/daytona/workspace/fmt-fractures && cd /home/daytona/workspace/fmt…
~/fmt-fractures/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Image, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import Flowable
import os
OUTPUT = "/home/daytona/workspace/fmt-fractures/Types_of_Fractures_FMT.pdf"
IMG_BONE = "/home/daytona/workspace/fmt-fractures/bone_fractures.png"
IMG_SKULL = "/home/daytona/workspace/fmt-fractures/skull_fractures.png"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=2*cm,
leftMargin=2*cm,
topMargin=2.5*cm,
bottomMargin=2*cm,
title="Types of Fractures in Forensic Medicine & Toxicology",
author="Orris Medical",
)
W, H = A4
CW = W - 4*cm # content width
styles = getSampleStyleSheet()
# Custom styles
title_style = ParagraphStyle(
"Title",
parent=styles["Title"],
fontSize=20,
textColor=colors.HexColor("#1a2a4a"),
spaceAfter=4,
spaceBefore=0,
alignment=TA_CENTER,
fontName="Helvetica-Bold",
)
subtitle_style = ParagraphStyle(
"Subtitle",
parent=styles["Normal"],
fontSize=11,
textColor=colors.HexColor("#4a6080"),
spaceAfter=12,
alignment=TA_CENTER,
fontName="Helvetica-Oblique",
)
h1_style = ParagraphStyle(
"H1",
parent=styles["Heading1"],
fontSize=14,
textColor=colors.white,
backColor=colors.HexColor("#1a2a4a"),
spaceBefore=14,
spaceAfter=6,
leftIndent=-2,
rightIndent=-2,
fontName="Helvetica-Bold",
borderPad=5,
)
h2_style = ParagraphStyle(
"H2",
parent=styles["Heading2"],
fontSize=12,
textColor=colors.HexColor("#1a2a4a"),
spaceBefore=10,
spaceAfter=4,
fontName="Helvetica-Bold",
borderPad=2,
)
h3_style = ParagraphStyle(
"H3",
parent=styles["Heading3"],
fontSize=10.5,
textColor=colors.HexColor("#2e5090"),
spaceBefore=8,
spaceAfter=3,
fontName="Helvetica-Bold",
)
body_style = ParagraphStyle(
"Body",
parent=styles["Normal"],
fontSize=9.5,
textColor=colors.HexColor("#222222"),
spaceAfter=4,
spaceBefore=2,
leading=14,
alignment=TA_JUSTIFY,
fontName="Helvetica",
)
bullet_style = ParagraphStyle(
"Bullet",
parent=body_style,
leftIndent=14,
bulletIndent=4,
spaceAfter=2,
spaceBefore=1,
)
caption_style = ParagraphStyle(
"Caption",
parent=styles["Normal"],
fontSize=8.5,
textColor=colors.HexColor("#555555"),
spaceAfter=6,
alignment=TA_CENTER,
fontName="Helvetica-Oblique",
)
note_style = ParagraphStyle(
"Note",
parent=body_style,
fontSize=8.5,
textColor=colors.HexColor("#555555"),
fontName="Helvetica-Oblique",
)
def b(text):
return f"<b>{text}</b>"
def heading_block(text):
"""Returns a shaded heading paragraph."""
return Paragraph(f" {text}", h1_style)
def bullet(text):
return Paragraph(f"• {text}", bullet_style)
story = []
# ── TITLE PAGE ──────────────────────────────────────────────────────────────
story.append(Spacer(1, 1.5*cm))
story.append(Paragraph("Types of Fractures", title_style))
story.append(Paragraph("Forensic Medicine & Toxicology (FMT)", title_style))
story.append(Spacer(1, 0.3*cm))
story.append(HRFlowable(width="80%", thickness=2, color=colors.HexColor("#2e5090"), hAlign="CENTER"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Based on P.C. Dikshit Textbook of Forensic Medicine and Toxicology & "
"The Essentials of Forensic Medicine and Toxicology, 36th Ed. (2026)",
subtitle_style
))
story.append(Spacer(1, 0.8*cm))
# ── INTRO ─────────────────────────────────────────────────────────────────
story.append(Paragraph(
"Fractures are among the most important topics in Forensic Medicine & Toxicology, "
"covering both general bone fractures and skull fractures. The mechanism, pattern, "
"and timing of a fracture carry significant medicolegal implications including identification "
"of the weapon, cause of death, and whether the injury was antemortem, perimortem, or postmortem.",
body_style
))
story.append(Spacer(1, 0.3*cm))
# ── SECTION A: GENERAL ────────────────────────────────────────────────────
story.append(heading_block("A. GENERAL CLASSIFICATION OF BONE FRACTURES"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Fracture is classified based on five major forces that act on bone: "
"<b>tension (stretching), compression, torsion (twisting), flexion (bending), and shearing</b>. "
"A combination of these forces causes most injuries.",
body_style
))
story.append(Spacer(1, 0.3*cm))
# Bone fractures image
img_bone = Image(IMG_BONE, width=CW * 0.85, height=CW * 0.85 * (559/1181))
img_bone.hAlign = "CENTER"
story.append(img_bone)
story.append(Paragraph("Fig. 1: Types of bone fractures (Greenstick, Transverse, Comminuted, Spiral, Compound)", caption_style))
story.append(Spacer(1, 0.3*cm))
# General fracture table
gen_data = [
[b("Type"), b("Description"), b("Medicolegal Note")],
["Greenstick", "Incomplete fracture; bone bends and cracks on one side only.", "Common in children; pliable bones."],
["Transverse", "Fracture line perpendicular to bone axis.", "Caused by direct force."],
["Oblique", "Fracture line runs at an angle across the bone.", "Angulated force mechanism."],
["Spiral", "Fracture spirals around the bone shaft.", "Torsion/twisting injury. Key sign of child abuse."],
["Comminuted", "Bone broken into 3+ fragments.", "Significant force; vehicle accidents, falls."],
["Compound (Open)", "Bone fragments pierce the skin.", "Risk of infection; external wound present."],
["Simple (Closed)", "Overlying skin intact.", "No external wound."],
["Impacted", "One fragment driven into another.", "Seen in falls from height."],
["Avulsion", "Fragment pulled off by muscle/ligament force.", "Sports injuries; tendon attachment sites."],
["Stress/Fatigue", "Repeated low-force loading.", "March fracture (2nd metatarsal)."],
["Pathological", "Through diseased bone with minimal force.", "Metastasis, osteoporosis, TB of bone."],
["Greenstick (Pond)", "Concave dent in infant skull; no fracture line.", "Obstetric forceps; birth trauma."],
]
gen_col_widths = [CW*0.22, CW*0.44, CW*0.34]
gen_table = Table(gen_data, colWidths=gen_col_widths, repeatRows=1)
gen_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a2a4a")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 9),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#f4f7fb"), colors.white]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#b0bdd0")),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("WORDWRAP", (0,0), (-1,-1), True),
]))
story.append(gen_table)
story.append(Spacer(1, 0.4*cm))
# Timing table
story.append(Paragraph(b("Timing Classification (Medicolegal Importance):"), h3_style))
timing_data = [
[b("Timing"), b("Features")],
["Antemortem", "Evidence of bone repair: callus, periosteal reaction (visible after 10-14 days). Hemorrhage in soft tissue."],
["Perimortem", "Fracture around time of death. Edges appear wet/green, bone bends before breaking. No healing response."],
["Postmortem", "Edges appear dry, irregular, jagged. No bleeding. Often incomplete fracture lines."],
]
timing_col_widths = [CW*0.22, CW*0.78]
timing_table = Table(timing_data, colWidths=timing_col_widths, repeatRows=1)
timing_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#2e5090")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 9),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#eef2f8"), colors.white]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#b0bdd0")),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
]))
story.append(timing_table)
story.append(Spacer(1, 0.2*cm))
story.append(PageBreak())
# ── SECTION B: SKULL FRACTURES ───────────────────────────────────────────
story.append(heading_block("B. TYPES OF SKULL FRACTURES"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Skull fractures are the most important topic in FMT exams. They are divided into "
"<b>fractures of the cranial vault</b> and <b>fractures of the skull base</b>.",
body_style
))
story.append(Spacer(1, 0.3*cm))
# Skull fractures image
img_skull = Image(IMG_SKULL, width=CW * 0.72, height=CW * 0.72 * (900/800))
img_skull.hAlign = "CENTER"
story.append(img_skull)
story.append(Paragraph(
"Fig. 2: Types of skull fractures — (A) Diastatic, (B) Depressed, (C) Linear, (D) Basilar\n"
"(The Essentials of Forensic Medicine and Toxicology, 36th Ed.)",
caption_style
))
story.append(Spacer(1, 0.4*cm))
# ── B1: Cranial Vault ────────────────────────────────────────────────────
story.append(Paragraph("B.1 Fractures of the Cranial Vault", h2_style))
vault_fractures = [
(
"I. Linear (Fissured) Fracture",
"Most common (~70% of all skull fractures). Straight or curved fracture lines of considerable length.",
[
"May involve one or both tables of the skull",
"Common in weak areas: temporal, frontal, parietal, occipital bones",
"Caused by forcible contact with a broad surface (ground), or fall on feet/buttocks",
"Fracture line may extend to base of skull or across supraorbital ridges",
"Also called 'motorcyclist's fracture'",
]
),
(
"II. Diastatic (Sutural) Fracture",
"Linear fracture that passes into a suture line, causing separation (diastasis) of bones at the suture.",
[
"Most commonly involves the sagittal suture; metopic suture may reopen",
"More common in children and young adults",
"Medicolegally important: marker of child abuse syndrome",
]
),
(
"III. Depressed Fracture ('Fracture a la Signature' / Signature Fracture)",
"Produced by an object with relatively large kinetic energy but small surface area. Fractured bone is driven inward into the skull cavity.",
[
"Outer table driven into the diploe; inner table fractured more extensively",
"Shape often resembles the weapon — hence 'signature fracture'",
"Hammer blow → circular fracture arc",
"Firearm butt (full face) → rectangular fracture",
"Stone → irregular/triangular fracture",
"Deepest part of depression = where weapon first struck; 'terracing' at margins",
"Antemortem depressed fractures in homicide show shelving inward of the outer table",
]
),
(
"IV. Elevated Fracture",
"One end of fractured fragment is elevated above skull surface; the other is depressed into cranial cavity.",
[
"Caused by a blow from a heavy sharp weapon (axe, chopper)",
"Fragment elevated due to lateral pull of weapon while retrieving it",
]
),
(
"V. Comminuted Fracture",
"Two or more intersecting lines divide the skull into three or more fragments.",
[
"Caused by significant force over broad area: crushing head injuries, vehicle accidents, fall from height",
"Also from repeated blows with heavy instruments (iron bar, poker, axe, thick stick)",
"When no displacement: resembles spider's web or mosaic pattern",
"Often a complication of fissured or depressed fracture",
]
),
(
"VI. Pond (Indented) Fracture",
"Shallow depressed fracture forming a concave 'pond'. Most common in pliable bones of infants.",
[
"Depression can occur without a fracture line",
"Analogous to squeezing a table tennis ball",
"Caused by obstetric forceps blade or birth trauma",
]
),
(
"VII. Mosaic (Spider Web) Fracture",
"Comminuted depressed fracture with multiple fissures radiating from it, forming a spider web or mosaic pattern.",
[
"Results when severe local impact causes both focal and general deformation of skull",
"Classic appearance: central depression with radiating and concentric fracture lines",
]
),
(
"VIII. Gutter Fracture",
"A groove-like or trough-shaped fracture caused by a tangential/grazing bullet.",
[
"Bullet does not penetrate skull; creates a furrow along the outer table",
"The groove runs in the direction of the bullet",
]
),
(
"IX. Perforating Fracture",
"A small circular hole punched through the skull, classically from a firearm projectile.",
[
"Entry wound: small, clean, punched-out, internal beveling (inner table beveled more than outer)",
"Exit wound: larger, irregular, external beveling (outer table beveled more than inner)",
"Entry–Exit pattern helps determine direction of fire",
]
),
(
"X. Blow-out Fracture",
"Fracture of the orbital floor/walls due to blunt trauma to the eye causing increased intraorbital pressure.",
[
"Orbital contents herniate into maxillary sinus",
"Signs: diplopia, enophthalmos, infraorbital nerve anaesthesia",
]
),
]
for title, desc, bullets in vault_fractures:
block = []
block.append(Paragraph(title, h3_style))
block.append(Paragraph(desc, body_style))
for b_text in bullets:
block.append(bullet(b_text))
block.append(Spacer(1, 0.15*cm))
story.append(KeepTogether(block))
story.append(PageBreak())
# ── B2: Skull Base ───────────────────────────────────────────────────────
story.append(heading_block("C. FRACTURES OF THE SKULL BASE"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Skull base fractures are often caused by indirect force transmission (falls from height, "
"crush injuries) and carry characteristic clinical signs that are important medicolegally.",
body_style
))
story.append(Spacer(1, 0.3*cm))
base_data = [
[b("Type"), b("Mechanism"), b("Clinical / Medicolegal Signs")],
[
"Ring Fracture",
"Fall from height onto feet or buttocks. Kinetic energy travels up cervical spine, ramming it into the occipital bone.",
"Encircles the foramen magnum. Indicates fall from considerable height.",
],
[
"Hinge Fracture",
"Lateral compression of skull between two objects (e.g., car wheel and road). Divides skull into front and back halves.",
"Transverse fracture across base. Seen in run-over cases.",
],
[
"Anterior Cranial Fossa",
"Blow to frontal region; fractures through orbital plates.",
"Raccoon eyes (bilateral periorbital ecchymosis), CSF rhinorrhea, anosmia.",
],
[
"Middle Cranial Fossa",
"Blow to temporal region; fractures through petrous temporal bone.",
"Battle's sign (mastoid ecchymosis), CSF/blood otorrhea, hemotympanum, facial nerve palsy.",
],
[
"Posterior Cranial Fossa",
"Blow to occipital region; fractures extend toward foramen magnum.",
"Nuchal bruising, lower cranial nerve palsies.",
],
]
base_col_widths = [CW*0.20, CW*0.38, CW*0.42]
base_table = Table(base_data, colWidths=base_col_widths, repeatRows=1)
base_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1a2a4a")),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 9),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 8.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#f4f7fb"), colors.white]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#b0bdd0")),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
]))
story.append(base_table)
story.append(Spacer(1, 0.5*cm))
# ── SECTION D: MEDICOLEGAL IMPORTANCE ───────────────────────────────────
story.append(heading_block("D. MEDICOLEGAL IMPORTANCE OF FRACTURES"))
story.append(Spacer(1, 0.2*cm))
ml_points = [
("<b>Signature (Depressed) fractures</b> can identify the weapon/agent used based on shape and dimensions of the depression.",),
("<b>Spiral fractures</b> in children raise strong suspicion of non-accidental injury (child abuse).",),
("<b>Ring fractures</b> indicate fall from height onto feet or buttocks.",),
("<b>Diastatic fractures</b> are common in child abuse syndrome (sagittal suture separation).",),
("<b>Timing</b> (ante-, peri-, postmortem) determines whether injury occurred before or after death — critical for reconstructing events.",),
("<b>Direction of force:</b> Linear fractures run parallel to the direction of force when head is free; from point of impact outward when head is supported.",),
("<b>Perforating fractures:</b> Beveling of tables identifies entry vs. exit wound and direction of fire.",),
("<b>Hinge fractures</b> are seen in run-over cases (vehicle running over the head).",),
("<b>Force estimation:</b> ~5 foot-pounds causes a simple fissured fracture; falling from erect posture generates ~60 ft/lb and can produce skull fractures.",),
("<b>Scalp and hair</b> markedly cushion the impact on the vault — a much heavier blow is required to cause vault fracture compared to base fracture.",),
]
for (pt,) in ml_points:
story.append(bullet(pt))
story.append(Spacer(1, 0.5*cm))
# ── COMPLICATIONS ─────────────────────────────────────────────────────────
story.append(Paragraph("Complications of Skull Fractures", h2_style))
comp_points = [
"Injury to brain: direct damage at fracture site or contrecoup.",
"Haemorrhage: if fracture passes through the middle meningeal artery → extradural haematoma (fatal).",
"Traumatic epilepsy: late complication of depressed fracture impinging on motor cortex.",
"Meningitis: basal skull fractures communicate with sinuses/middle ear → CSF leak → ascending infection.",
"Cranial nerve palsy: depending on location of base fracture.",
]
for c in comp_points:
story.append(bullet(c))
story.append(Spacer(1, 0.5*cm))
story.append(HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#b0bdd0")))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Sources: P.C. Dikshit Textbook of Forensic Medicine and Toxicology; "
"The Essentials of Forensic Medicine and Toxicology, 36th Ed. (2026); "
"Forensic Anthropology: A Comprehensive Introduction, 2nd Ed.",
note_style
))
# ── BUILD ─────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
python /home/daytona/workspace/fmt-fractures/generate_pdf.py
ls -lh /home/daytona/workspace/fmt-fractures/Types_of_Fractures_FMT.pdf
Types of Fractures FMT
PDF Document · PDF
/ handwritten notes fracture
fc-list | grep -i -E "hand|write|cursive|caveat|patrick|indie|shadows|dancing|pa…
fc-list | head -30 && echo "---" && python3 -c "from reportlab.pdfbase import pd…
cd /home/daytona/workspace/fmt-fractures && curl -sL "https://github.com/google/…
~/fmt-fractures/generate_handwritten_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Image, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.platypus import Flowable
from reportlab.lib.utils import ImageReader
import os
# ── Register handwriting fonts ──────────────────────────────────────────────
BASE = "/home/daytona/workspace/fmt-fractures"
pdfmetrics.registerFont(TTFont("Caveat", f"{BASE}/Caveat-Regular.ttf"))
pdfmetrics.registerFont(TTFont("CaveatBold", f"{BASE}/Caveat-Bold.ttf"))
OUTPUT = f"{BASE}/Types_of_Fractures_FMT_Handwritten.pdf"
IMG_BONE = f"{BASE}/bone_fractures.png"
IMG_SKULL = f"{BASE}/skull_fractures.png"
W, H = A4
CW = W - 4.2*cm # content width
# ── Colours ─────────────────────────────────────────────────────────────────
INK = colors.HexColor("#1a1a1a") # near-black ink
HEAD_INK = colors.HexColor("#0d2a6e") # dark blue heading ink
ACCENT = colors.HexColor("#c0392b") # red accent (underlining, bullet)
BOX_BG = colors.HexColor("#f9f6f0") # cream box background
BOX_BORDER = colors.HexColor("#aaaaaa") # light border
TABLE_HEAD = colors.HexColor("#1a3a6a") # table header bg
TABLE_ALT = colors.HexColor("#eef1f7") # table alt row
# ── Flowable: horizontal rule drawn by canvas ─────────────────────────────
class RuleFlowable(Flowable):
def __init__(self, width, color=ACCENT, thickness=1.2, dash=None):
Flowable.__init__(self)
self.width = width
self.color = color
self.thickness = thickness
self.dash = dash
self.height = thickness + 2
def draw(self):
self.canv.saveState()
self.canv.setStrokeColor(self.color)
self.canv.setLineWidth(self.thickness)
if self.dash:
self.canv.setDash(*self.dash)
self.canv.line(0, self.thickness/2, self.width, self.thickness/2)
self.canv.restoreState()
# ── Styles ───────────────────────────────────────────────────────────────────
def S(name, font, size, color=INK, align=TA_LEFT,
leading=None, spaceBefore=0, spaceAfter=4,
leftIndent=0, rightIndent=0):
return ParagraphStyle(
name,
fontName=font,
fontSize=size,
textColor=color,
alignment=align,
leading=leading or (size * 1.45),
spaceBefore=spaceBefore,
spaceAfter=spaceAfter,
leftIndent=leftIndent,
rightIndent=rightIndent,
)
title_s = S("title", "CaveatBold", 28, HEAD_INK, TA_CENTER, spaceAfter=2)
sub_s = S("sub", "Caveat", 15, colors.HexColor("#4a6080"), TA_CENTER, spaceAfter=14)
h1_s = S("h1", "CaveatBold", 22, HEAD_INK, spaceAfter=4, spaceBefore=16)
h2_s = S("h2", "CaveatBold", 17, HEAD_INK, spaceAfter=3, spaceBefore=12)
h3_s = S("h3", "CaveatBold", 14, ACCENT, spaceAfter=2, spaceBefore=8)
body_s = S("body", "Caveat", 12, INK, TA_JUSTIFY, spaceAfter=3, spaceBefore=1)
bullet_s = S("bullet", "Caveat", 12, INK, spaceAfter=2, leftIndent=16)
caption_s = S("caption", "Caveat", 10, colors.HexColor("#555555"), TA_CENTER, spaceAfter=6)
note_s = S("note", "Caveat", 10, colors.HexColor("#777777"), spaceAfter=4)
table_h_s = S("th", "CaveatBold", 11, colors.white, TA_CENTER, spaceAfter=2)
table_b_s = S("td", "Caveat", 11, INK, spaceAfter=2)
def bul(text):
return Paragraph(f"→ {text}", bullet_s)
def bold(text):
return f'<font name="CaveatBold">{text}</font>'
def red(text):
return f'<font color="#c0392b">{text}</font>'
# ── Table helper ──────────────────────────────────────────────────────────
def make_table(data, col_widths, header_rows=1):
styled = []
for ri, row in enumerate(data):
sr = []
for ci, cell in enumerate(row):
sty = table_h_s if ri < header_rows else table_b_s
sr.append(Paragraph(str(cell), sty))
styled.append(sr)
t = Table(styled, colWidths=col_widths, repeatRows=header_rows)
n = len(data)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1, header_rows-1), TABLE_HEAD),
("TEXTCOLOR", (0,0), (-1, header_rows-1), colors.white),
("FONTNAME", (0,0), (-1, header_rows-1), "CaveatBold"),
("FONTSIZE", (0,0), (-1, header_rows-1), 11),
("ROWBACKGROUNDS",(0, header_rows), (-1,-1), [TABLE_ALT, colors.white]),
("FONTNAME", (0, header_rows), (-1,-1), "Caveat"),
("FONTSIZE", (0, header_rows), (-1,-1), 11),
("GRID", (0,0), (-1,-1), 0.5, colors.HexColor("#c0c8d8")),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("LINEBELOW", (0,0), (-1,0), 1.2, ACCENT),
]))
return t
# ── Document ──────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=2.1*cm, leftMargin=2.1*cm,
topMargin=2.4*cm, bottomMargin=2*cm,
title="Types of Fractures in FMT – Handwritten Notes",
author="Orris Medical",
)
story = []
# ─── TITLE ────────────────────────────────────────────────────────────────
story.append(Spacer(1, 0.6*cm))
story.append(Paragraph("Types of Fractures", title_s))
story.append(Paragraph("Forensic Medicine & Toxicology (FMT)", title_s))
story.append(RuleFlowable(CW * 0.85, color=ACCENT, thickness=2))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Based on P.C. Dikshit FMT & The Essentials of FMT, 36th Ed. (2026)",
sub_s
))
story.append(Spacer(1, 0.5*cm))
story.append(Paragraph(
"Fractures in FMT cover " + bold("general bone fractures") + " and " +
bold("skull fractures") + ". The mechanism, pattern & timing carry significant "
"medicolegal implications — identifying the weapon, cause of death, and whether "
"the injury was " + red("antemortem, perimortem, or postmortem") + ".",
body_s
))
story.append(Spacer(1, 0.4*cm))
# ─── SECTION A ────────────────────────────────────────────────────────────
story.append(Paragraph("A. General Classification of Bone Fractures", h1_s))
story.append(RuleFlowable(CW, color=HEAD_INK, thickness=1.5))
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph(
"Fracture forces: " + bold("Tension · Compression · Torsion · Flexion · Shearing") +
" (usually a combination)",
body_s
))
story.append(Spacer(1, 0.35*cm))
# Bone image
img_b = Image(IMG_BONE, width=CW * 0.88, height=CW * 0.88 * (559/1181))
img_b.hAlign = "CENTER"
story.append(img_b)
story.append(Paragraph(
"Fig. 1 Types of bone fractures — Greenstick, Transverse, Comminuted, Spiral, Compound",
caption_s
))
story.append(Spacer(1, 0.35*cm))
gen_data = [
[bold("Type"), bold("Description"), bold("Medicolegal Note")],
["Greenstick", "Incomplete; bone bends, cracks one side. Children.", "Pliable bones of infants/children."],
["Transverse", "Fracture ⊥ bone axis.", "Direct force."],
["Oblique", "Fracture at angle across bone.", "Angulated force."],
["Spiral", "Spirals around shaft. Torsion/twisting.", red("Key sign of child abuse (NAI).")],
["Comminuted", "3+ fragments. Significant force.", "Vehicles, falls, repeated blows."],
["Compound (Open)", "Bone pierces skin. External wound.", "Infection risk."],
["Simple (Closed)", "Skin intact.", "No external wound."],
["Impacted", "One fragment driven into another.", "Falls from height."],
["Avulsion", "Fragment pulled off by muscle/ligament.", "Tendon attachment sites."],
["Stress/Fatigue", "Repeated low-force loading.", "March fracture (2nd metatarsal)."],
["Pathological", "Through diseased bone with minimal force.", "Metastasis, osteoporosis, TB."],
]
story.append(make_table(gen_data, [CW*0.20, CW*0.45, CW*0.35]))
story.append(Spacer(1, 0.35*cm))
# Timing
story.append(Paragraph("Timing Classification", h2_s))
story.append(RuleFlowable(CW*0.4, color=ACCENT, thickness=1))
story.append(Spacer(1, 0.1*cm))
timing_data = [
[bold("Timing"), bold("Features")],
[red("Antemortem"), "Evidence of bone repair: callus, periosteal reaction (after 10–14 days). Hemorrhage in soft tissue."],
[red("Perimortem"), "Around time of death. Edges wet/green, bone bends before breaking. No healing."],
[red("Postmortem"), "Edges dry, irregular, jagged. No bleeding. Incomplete fracture lines."],
]
story.append(make_table(timing_data, [CW*0.20, CW*0.80]))
story.append(Spacer(1, 0.2*cm))
story.append(PageBreak())
# ─── SECTION B ────────────────────────────────────────────────────────────
story.append(Paragraph("B. Types of Skull Fractures", h1_s))
story.append(RuleFlowable(CW, color=HEAD_INK, thickness=1.5))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
bold("Most important topic in FMT exams.") +
" Divided into " + bold("cranial vault") + " and " + bold("skull base") + " fractures.",
body_s
))
story.append(Spacer(1, 0.35*cm))
# Skull image
img_s = Image(IMG_SKULL, width=CW * 0.70, height=CW * 0.70 * (900/800))
img_s.hAlign = "CENTER"
story.append(img_s)
story.append(Paragraph(
"Fig. 2 Types of skull fractures — (A) Diastatic (B) Depressed (C) Linear (D) Basilar\n"
"The Essentials of Forensic Medicine and Toxicology, 36th Ed.",
caption_s
))
story.append(Spacer(1, 0.4*cm))
# B.1 Vault
story.append(Paragraph("B.1 Fractures of the Cranial Vault", h2_s))
story.append(RuleFlowable(CW*0.55, color=ACCENT, thickness=1))
story.append(Spacer(1, 0.1*cm))
vault = [
(
"I. Linear (Fissured) Fracture",
bold("Most common") + " — ~70% of all skull fractures. Straight/curved lines of considerable length.",
[
"Involves one or both tables of skull",
"Common in " + bold("temporal, frontal, parietal, occipital") + " (weak unsupported areas)",
"Caused by forcible contact with broad surface (ground) or fall on feet/buttocks",
"Fracture line may extend to skull base or across supraorbital ridges",
red("Also called 'Motorcyclist's fracture'"),
]
),
(
"II. Diastatic (Sutural) Fracture",
"Linear fracture passing into a suture line → " + bold("separation (diastasis)") + " of bones.",
[
"Most commonly involves " + bold("sagittal suture"); metopic suture may reopen",
"Common in children and young adults",
red("Important ML sign of child abuse syndrome"),
]
),
(
"III. Depressed Fracture " + red("('Fracture à la signature')"),
"High kinetic energy, small surface area → bone driven " + bold("inward") + " into skull cavity.",
[
"Outer table → diploe; inner table fractured more extensively",
bold("Shape = weapon signature:") + " Hammer → circular arc | Gun butt → rectangular | Stone → irregular/triangular",
"Deepest part = point of first contact; " + bold("'terracing'") + " at margins",
"Antemortem homicide fractures: shelving inward of outer table along fracture edges",
red("Medicolegally = identifies the weapon used"),
]
),
(
"IV. Elevated Fracture",
"One end of fragment " + bold("elevated above") + " skull; other end depressed into cranial cavity.",
[
"Caused by heavy sharp weapon (axe, chopper)",
"Fragment elevated by lateral pull while retrieving the weapon",
]
),
(
"V. Comminuted Fracture",
"≥2 intersecting lines → " + bold("3+ fragments") + ".",
[
"Crushing head injuries, vehicle accidents, fall from height, repeated heavy blows",
"When no displacement → resembles " + bold("spider's web / mosaic"),
"Often a complication of fissured or depressed fracture",
]
),
(
"VI. Pond (Indented) Fracture",
"Shallow concave " + bold("dent") + " in skull without true fracture line.",
[
"Most common in " + bold("pliable infant bones"),
"Analogous to squeezing a table tennis ball",
red("Caused by obstetric forceps blade / birth trauma"),
]
),
(
"VII. Mosaic (Spider Web) Fracture",
"Comminuted depressed fracture with fissures radiating outward — " + bold("spider web / mosaic") + " pattern.",
[
"Severe local impact → both focal and general skull deformation",
"Central depression + radiating + concentric fracture lines",
]
),
(
"VIII. Gutter Fracture",
"Groove/trough-shaped fracture from " + bold("tangential/grazing bullet") + ".",
[
"Bullet does not penetrate skull; creates furrow along outer table",
"Groove runs in " + bold("direction of the bullet"),
]
),
(
"IX. Perforating Fracture",
bold("Circular hole") + " punched through skull — classic firearm injury.",
[
red("Entry:") + " small, clean, punched-out; " + bold("internal beveling") + " (inner table > outer table)",
red("Exit:") + " larger, irregular; " + bold("external beveling") + " (outer table > inner table)",
"Entry–Exit pattern → determines direction of fire",
]
),
(
"X. Blow-out Fracture",
bold("Orbital floor/wall") + " fracture from blunt trauma to eye → raised intraorbital pressure.",
[
"Orbital contents herniate into maxillary sinus",
"Signs: diplopia, enophthalmos, infraorbital nerve anaesthesia",
]
),
]
for (title, desc, bullets) in vault:
block = []
block.append(Paragraph(title, h3_s))
block.append(Paragraph(desc, body_s))
for bt in bullets:
block.append(bul(bt))
block.append(Spacer(1, 0.18*cm))
story.append(KeepTogether(block))
story.append(PageBreak())
# B.2 Skull Base
story.append(Paragraph("B.2 Fractures of the Skull Base", h2_s))
story.append(RuleFlowable(CW*0.55, color=ACCENT, thickness=1))
story.append(Spacer(1, 0.15*cm))
base_data = [
[bold("Type"), bold("Mechanism"), bold("Clinical / ML Signs")],
["Ring Fracture",
"Fall from height onto feet/buttocks. Energy up spine → rams into occipital bone.",
"Encircles foramen magnum. " + red("Indicates fall from height.")],
["Hinge Fracture",
"Lateral compression between two objects. Divides skull into front/back.",
"Transverse base fracture. " + red("Seen in run-over cases.")],
["Anterior Cranial Fossa",
"Blow to frontal region; fracture through orbital plates.",
red("Raccoon eyes") + ", CSF rhinorrhea, anosmia."],
["Middle Cranial Fossa",
"Blow to temporal region; fracture through petrous temporal bone.",
red("Battle's sign") + ", CSF/blood otorrhea, hemotympanum, VII nerve palsy."],
["Posterior Cranial Fossa",
"Blow to occipital region; fractures extend to foramen magnum.",
"Nuchal bruising, lower CN palsies."],
]
story.append(make_table(base_data, [CW*0.20, CW*0.40, CW*0.40]))
story.append(Spacer(1, 0.5*cm))
# ─── SECTION C ────────────────────────────────────────────────────────────
story.append(Paragraph("C. Medicolegal Importance", h1_s))
story.append(RuleFlowable(CW, color=HEAD_INK, thickness=1.5))
story.append(Spacer(1, 0.15*cm))
ml_points = [
bold("Signature (Depressed) fractures") + " → identify weapon/agent from shape & dimensions.",
bold("Spiral fractures in children") + " → " + red("non-accidental injury / child abuse (NAI)."),
bold("Ring fractures") + " → fall from height onto feet or buttocks.",
bold("Diastatic fractures") + " → sagittal suture separation; " + red("child abuse syndrome."),
bold("Timing") + " (ante-/peri-/postmortem) → determines whether injury occurred before or after death.",
bold("Direction of force:") + " fracture runs parallel to force when head is free; radially from impact when supported.",
bold("Perforating fractures:") + " entry vs. exit beveling → determines direction of fire.",
bold("Hinge fractures") + " → run-over cases (vehicle wheel over the head).",
bold("Force estimation:") + " ~5 ft·lb → simple fissured fracture; falling from standing → ~60 ft·lb.",
bold("Scalp & hair") + " cushion vault — far heavier impact needed to fracture vault vs. skull base.",
]
for pt in ml_points:
story.append(bul(pt))
story.append(Spacer(1, 0.4*cm))
# Complications
story.append(Paragraph("Complications of Skull Fractures", h2_s))
story.append(RuleFlowable(CW*0.50, color=ACCENT, thickness=1))
story.append(Spacer(1, 0.1*cm))
comps = [
"Brain injury — direct or contrecoup.",
red("Extradural haemorrhage") + " — if fracture crosses " + bold("middle meningeal artery") + " (temporal fossa). Fatal.",
bold("Traumatic epilepsy") + " — late complication of depressed fracture impinging on motor cortex.",
bold("Meningitis") + " — basal fractures communicate with sinuses/middle ear → CSF leak → ascending infection.",
"Cranial nerve palsy — depending on location of base fracture.",
]
for c in comps:
story.append(bul(c))
story.append(Spacer(1, 0.6*cm))
story.append(RuleFlowable(CW, color=colors.HexColor("#aaaaaa"), thickness=0.7))
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph(
"Sources: P.C. Dikshit Textbook of Forensic Medicine and Toxicology · "
"The Essentials of Forensic Medicine and Toxicology, 36th Ed. (2026) · "
"Forensic Anthropology: A Comprehensive Introduction, 2nd Ed.",
note_s
))
# ── BUILD ─────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
python /home/daytona/workspace/fmt-fractures/generate_handwritten_pdf.py 2>&1
~/fmt-fractures/generate_handwritten_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/fmt-fractures/generate_handwritten_pdf.py'
python /home/daytona/workspace/fmt-fractures/generate_handwritten_pdf.py 2>&1
cd /home/daytona/workspace/fmt-fractures && rm -f Caveat-Regular.ttf Caveat-Bold…
cd /home/daytona/workspace/fmt-fractures && python3 -c " import requests, os # …
python3 -c " # Try to find any cursive/handwriting-like fonts already available …
python3 -c " import matplotlib import matplotlib.font_manager as fm # Check if a…
~/fmt-fractures/generate_hw_mpl.py
"""
Generates a handwritten-style PDF for Types of Fractures in FMT
using matplotlib's xkcd() mode (sketchy/hand-drawn rendering).
"""
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib.patches import FancyBboxPatch
from matplotlib.backends.backend_pdf import PdfPages
from PIL import Image as PILImage
import numpy as np
import textwrap, os
OUTPUT = "/home/daytona/workspace/fmt-fractures/Types_of_Fractures_FMT_Handwritten.pdf"
IMG_BONE = "/home/daytona/workspace/fmt-fractures/bone_fractures.png"
IMG_SKULL = "/home/daytona/workspace/fmt-fractures/skull_fractures.png"
INK = "#1a1a2e"
BLUE = "#0a2a6e"
RED = "#c0392b"
CREAM = "#fffdf5"
LTBLUE = "#d6e4f0"
LTRED = "#fdecea"
def new_page(pdf):
fig, ax = plt.subplots(figsize=(8.27, 11.69)) # A4
ax.set_xlim(0, 100)
ax.set_ylim(0, 100)
ax.axis("off")
fig.patch.set_facecolor(CREAM)
ax.set_facecolor(CREAM)
return fig, ax
def save_page(pdf, fig):
pdf.savefig(fig, bbox_inches="tight", facecolor=CREAM)
plt.close(fig)
def hw_text(ax, x, y, text, size=11, color=INK, bold=False, ha="left", style="normal"):
weight = "bold" if bold else "normal"
ax.text(x, y, text, fontsize=size, color=color, ha=ha, va="top",
weight=weight, style=style,
fontfamily="DejaVu Sans",
transform=ax.transData)
def section_bar(ax, y, label, color=BLUE):
ax.add_patch(FancyBboxPatch((0, y-4.5), 100, 5.5,
boxstyle="square,pad=0", linewidth=0,
facecolor=color, alpha=0.92))
ax.text(1.5, y+0.4, label, fontsize=13, color="white", weight="bold",
va="top", fontfamily="DejaVu Sans")
def divider(ax, y, color=RED, lw=1.2):
ax.plot([0, 100], [y, y], color=color, lw=lw, solid_capstyle="round")
def bullet_point(ax, x, y, text, size=9.8, color=INK, indent=2.5, wrap=90):
lines = textwrap.wrap(text, wrap)
ax.text(x, y, "→", fontsize=size, color=RED, va="top",
fontfamily="DejaVu Sans")
for i, line in enumerate(lines):
ax.text(x + indent, y - i * (size * 0.35), line,
fontsize=size, color=color, va="top",
fontfamily="DejaVu Sans")
return y - len(lines) * (size * 0.35) - 1.0
def draw_table(ax, x, y, headers, rows, col_widths, row_h=4.5, head_color=BLUE,
alt_color="#eef2f8", font_size=9):
cx = x
# Header row
for h, w in zip(headers, col_widths):
ax.add_patch(FancyBboxPatch((cx, y - row_h), w, row_h,
boxstyle="square,pad=0", linewidth=0.5,
facecolor=head_color, edgecolor="#aaaaaa"))
lines = textwrap.wrap(h, int(w * 1.5))
for li, ln in enumerate(lines[:2]):
ax.text(cx + 0.5, y - 0.7 - li * 2.8, ln,
fontsize=font_size, color="white", weight="bold", va="top",
fontfamily="DejaVu Sans")
cx += w
y -= row_h
# Data rows
for ri, row in enumerate(rows):
bg = alt_color if ri % 2 == 0 else "white"
cx = x
# calc row height from content
max_lines = max(len(textwrap.wrap(str(cell), int(w * 1.5))) for cell, w in zip(row, col_widths))
rh = max(row_h, max_lines * 2.8 + 1.5)
for cell, w in zip(row, col_widths):
ax.add_patch(FancyBboxPatch((cx, y - rh), w, rh,
boxstyle="square,pad=0", linewidth=0.4,
facecolor=bg, edgecolor="#c0c8d8"))
lines = textwrap.wrap(str(cell), int(w * 1.5))
for li, ln in enumerate(lines):
ax.text(cx + 0.5, y - 0.6 - li * 2.6, ln,
fontsize=font_size - 0.5, color=INK, va="top",
fontfamily="DejaVu Sans")
cx += w
y -= rh
return y # returns y after table
def img_section(ax, img_path, x, y, w, caption):
try:
img = PILImage.open(img_path)
iw, ih = img.size
h = w * ih / iw
ax.imshow(np.array(img), extent=[x, x + w, y - h, y], aspect="auto",
interpolation="bilinear")
ax.text(50, y - h - 1.5, caption, fontsize=8.5, color="#555555",
ha="center", va="top", style="italic", fontfamily="DejaVu Sans")
return y - h - 4.5
except Exception as e:
ax.text(x, y - 2, f"[Image: {caption}]", fontsize=9, color="#888888", va="top")
return y - 10
# ══════════════════════════════════════════════════════════════════════════════
# BUILD PDF
# ══════════════════════════════════════════════════════════════════════════════
with plt.xkcd(scale=0.6, length=100, randomness=2):
with PdfPages(OUTPUT) as pdf:
# ─────────────────────────────────────────────────────────────────────
# PAGE 1: Title + Section A
# ─────────────────────────────────────────────────────────────────────
fig, ax = new_page(pdf)
# Title
ax.text(50, 98, "Types of Fractures", fontsize=22, color=BLUE,
ha="center", va="top", weight="bold", fontfamily="DejaVu Sans")
ax.text(50, 93, "Forensic Medicine & Toxicology (FMT)", fontsize=14,
color=BLUE, ha="center", va="top", fontfamily="DejaVu Sans")
divider(ax, 90, RED, 2.0)
ax.text(50, 89.2, "Based on P.C. Dikshit FMT & The Essentials of FMT, 36th Ed. (2026)",
fontsize=9, color="#555555", ha="center", va="top", style="italic",
fontfamily="DejaVu Sans")
ax.text(2, 87, (
"Fractures in FMT cover general bone fractures and skull fractures. "
"The mechanism, pattern & timing carry\n"
"significant medicolegal implications — identifying the weapon, cause of death, and whether the injury was\n"
"antemortem, perimortem, or postmortem."
), fontsize=9.5, color=INK, va="top", fontfamily="DejaVu Sans", linespacing=1.5)
# Section A bar
section_bar(ax, 80.5, "A. General Classification of Bone Fractures", BLUE)
ax.text(2, 78.5,
"Forces on bone: Tension · Compression · Torsion · Flexion · Shearing (usually a combination)",
fontsize=9.5, color=INK, weight="bold", va="top", fontfamily="DejaVu Sans")
# Bone image
y_after = img_section(ax, IMG_BONE, 8, 76.5, 84,
"Fig. 1 Types of bone fractures — Greenstick, Transverse, Comminuted, Spiral, Compound")
# General table (truncated to fit)
headers = ["Type", "Description", "Medicolegal Note"]
rows = [
["Greenstick", "Incomplete; bone bends, cracks one side.", "Children's pliable bones."],
["Transverse", "Fracture ⊥ bone axis.", "Direct force."],
["Oblique", "Fracture at angle across bone.", "Angulated force."],
["Spiral", "Spirals around shaft. Torsion/twisting.", "★ Child abuse (NAI) sign."],
["Comminuted", "3+ fragments. High force.", "Vehicles, falls, blows."],
["Compound (Open)", "Bone pierces skin.", "Infection risk."],
["Simple (Closed)", "Skin intact.", "No external wound."],
["Impacted", "One fragment driven into another.", "Falls from height."],
["Avulsion", "Fragment pulled off by muscle/ligament.", "Tendon attachments."],
["Stress/Fatigue", "Repeated low-force loading.", "March fracture."],
["Pathological", "Minimal force through diseased bone.", "Metastasis, TB, osteoporosis."],
]
y_after = draw_table(ax, 2, y_after - 1, headers, rows,
[22, 44, 32], row_h=4.2, font_size=8.8)
save_page(pdf, fig)
# ─────────────────────────────────────────────────────────────────────
# PAGE 2: Timing + Skull Fracture intro + skull image
# ─────────────────────────────────────────────────────────────────────
fig, ax = new_page(pdf)
# Timing section
ax.text(2, 98, "Timing Classification (Medicolegal Importance)", fontsize=12,
color=BLUE, weight="bold", va="top", fontfamily="DejaVu Sans")
divider(ax, 95.5, RED)
timing_rows = [
["Antemortem", "Evidence of bone repair: callus, periosteal reaction (after 10-14 days). Haemorrhage in soft tissue."],
["Perimortem", "Around time of death. Edges wet/green, bone bends before breaking. No healing response."],
["Postmortem", "Edges dry, irregular, jagged. No bleeding. Incomplete fracture lines."],
]
y_t = draw_table(ax, 2, 94.5, ["Timing", "Features"], timing_rows,
[20, 78], row_h=5.5, head_color="#2e5090", font_size=9)
# Section B bar
section_bar(ax, y_t - 2, "B. Types of Skull Fractures", BLUE)
ax.text(2, y_t - 8,
"Most important topic in FMT exams. Divided into cranial vault and skull base fractures.",
fontsize=9.5, color=INK, va="top", fontfamily="DejaVu Sans")
# Skull image
y_after_skull = img_section(ax, IMG_SKULL, 15, y_t - 10, 70,
"Fig. 2 (A) Diastatic (B) Depressed (C) Linear (D) Basilar\n"
"The Essentials of Forensic Medicine and Toxicology, 36th Ed.")
save_page(pdf, fig)
# ─────────────────────────────────────────────────────────────────────
# PAGE 3: Vault fractures I–V
# ─────────────────────────────────────────────────────────────────────
fig, ax = new_page(pdf)
ax.text(2, 98, "B.1 Fractures of the Cranial Vault", fontsize=13,
color=BLUE, weight="bold", va="top", fontfamily="DejaVu Sans")
divider(ax, 95.5, BLUE, 1.3)
vault_items = [
("I. Linear (Fissured) Fracture", RED,
"Most common — ~70% of skull fractures. Straight/curved lines of considerable length.",
[
"Involves one or both tables of skull",
"Common in temporal, frontal, parietal, occipital bones (weak unsupported areas)",
"Caused by broad surface contact (ground) or fall on feet/buttocks",
"Fracture may extend to skull base or across supraorbital ridges",
"Also called 'Motorcyclist's fracture'",
]),
("II. Diastatic (Sutural) Fracture", RED,
"Linear fracture passing into suture line → separation (diastasis) of bones.",
[
"Most commonly involves sagittal suture; metopic suture may reopen",
"Common in children and young adults",
"★ Important ML sign of child abuse syndrome",
]),
("III. Depressed Fracture ['Fracture à la Signature']", RED,
"High kinetic energy, small surface area → bone driven inward into skull cavity.",
[
"Outer table → diploe; inner table fractured more extensively",
"Shape = weapon signature: Hammer→ circular | Gun butt→ rectangular | Stone→ triangular",
"Deepest point = first contact; 'terracing' at margins",
"★ Medicolegally identifies the weapon used",
]),
("IV. Elevated Fracture", RED,
"One end of fragment elevated above skull surface; other end depressed into cranial cavity.",
[
"Heavy sharp weapon (axe, chopper)",
"Fragment elevated by lateral pull when retrieving the weapon",
]),
("V. Comminuted Fracture", RED,
"≥2 intersecting lines → 3+ fragments.",
[
"Crushing head injuries, vehicle accidents, fall from height, repeated heavy blows",
"When no displacement → resembles spider's web / mosaic",
"Often complicates fissured or depressed fracture",
]),
]
y = 94.5
for title, tc, desc, bullets in vault_items:
ax.text(2, y, title, fontsize=10.5, color=tc, weight="bold",
va="top", fontfamily="DejaVu Sans")
y -= 4.0
# desc wrapped
for line in textwrap.wrap(desc, 100):
ax.text(3, y, line, fontsize=9.3, color=INK, va="top",
fontfamily="DejaVu Sans")
y -= 3.2
for b in bullets:
y = bullet_point(ax, 4, y, b, size=9, wrap=92)
y -= 1.2
if y < 5:
break
save_page(pdf, fig)
# ─────────────────────────────────────────────────────────────────────
# PAGE 4: Vault fractures VI–X + Base fractures table
# ─────────────────────────────────────────────────────────────────────
fig, ax = new_page(pdf)
ax.text(2, 98, "B.1 (continued) + B.2 Skull Base Fractures", fontsize=13,
color=BLUE, weight="bold", va="top", fontfamily="DejaVu Sans")
divider(ax, 95.5, BLUE, 1.3)
vault_cont = [
("VI. Pond (Indented) Fracture", RED,
"Shallow concave dent in skull without a true fracture line.",
[
"Most common in pliable infant bones",
"Analogous to squeezing a table tennis ball",
"★ Caused by obstetric forceps blade / birth trauma",
]),
("VII. Mosaic (Spider Web) Fracture", RED,
"Comminuted depressed fracture with radiating fissures → spider web / mosaic pattern.",
[
"Severe local impact → focal + general skull deformation",
"Central depression + radiating + concentric fracture lines",
]),
("VIII. Gutter Fracture", RED,
"Groove/trough-shaped fracture from a tangential/grazing bullet.",
[
"Bullet does not penetrate skull; creates furrow along outer table",
"Groove runs in direction of the bullet",
]),
("IX. Perforating Fracture", RED,
"Circular hole punched through skull — classic firearm injury.",
[
"Entry: small, clean, punched-out; internal beveling (inner table > outer table)",
"Exit: larger, irregular; external beveling (outer table > inner table)",
"Entry-Exit pattern → determines direction of fire",
]),
("X. Blow-out Fracture", RED,
"Orbital floor/wall fracture from blunt trauma to eye → raised intraorbital pressure.",
[
"Orbital contents herniate into maxillary sinus",
"Signs: diplopia, enophthalmos, infraorbital nerve anaesthesia",
]),
]
y = 94.5
for title, tc, desc, bullets in vault_cont:
ax.text(2, y, title, fontsize=10.5, color=tc, weight="bold",
va="top", fontfamily="DejaVu Sans")
y -= 4.0
for line in textwrap.wrap(desc, 100):
ax.text(3, y, line, fontsize=9.3, color=INK, va="top",
fontfamily="DejaVu Sans")
y -= 3.2
for b in bullets:
y = bullet_point(ax, 4, y, b, size=9, wrap=92)
y -= 1.2
# Skull Base table
y -= 1
ax.text(2, y, "B.2 Fractures of the Skull Base", fontsize=11,
color=BLUE, weight="bold", va="top", fontfamily="DejaVu Sans")
divider(ax, y - 3, RED)
y -= 4.5
base_rows = [
["Ring Fracture",
"Fall from height onto feet/buttocks. Energy up spine → occipital bone.",
"Encircles foramen magnum. ★ Indicates fall from height."],
["Hinge Fracture",
"Lateral compression between two objects.",
"Transverse base fracture. ★ Run-over cases."],
["Anterior Fossa",
"Blow to frontal region; fracture through orbital plates.",
"Raccoon eyes, CSF rhinorrhea, anosmia."],
["Middle Fossa",
"Blow to temporal region; fracture through petrous bone.",
"Battle's sign, CSF otorrhea, hemotympanum, VII nerve palsy."],
["Posterior Fossa",
"Blow to occipital region; fracture toward foramen magnum.",
"Nuchal bruising, lower cranial nerve palsies."],
]
y = draw_table(ax, 2, y, ["Type", "Mechanism", "Clinical / ML Signs"],
base_rows, [22, 40, 36], row_h=5.5, font_size=8.8)
save_page(pdf, fig)
# ─────────────────────────────────────────────────────────────────────
# PAGE 5: Medicolegal Importance + Complications
# ─────────────────────────────────────────────────────────────────────
fig, ax = new_page(pdf)
section_bar(ax, 98, "C. Medicolegal Importance of Fractures", BLUE)
divider(ax, 92.5, RED)
ml = [
"Signature (Depressed) fractures → identify weapon/agent from shape & dimensions of depression.",
"Spiral fractures in children → ★ Non-Accidental Injury (NAI) / child abuse.",
"Ring fractures → fall from height onto feet or buttocks.",
"Diastatic fractures → sagittal suture separation; ★ child abuse syndrome.",
"Timing (ante-/peri-/postmortem) → determines whether injury occurred before or after death.",
"Direction of force: fracture runs parallel to force when head free; radially from impact when head supported.",
"Perforating fractures: entry vs. exit beveling → determines direction of fire.",
"Hinge fractures → run-over cases (vehicle wheel running over the head).",
"Force estimation: ~5 ft·lb → simple fissured fracture; falling from standing → ~60 ft·lb.",
"Scalp & hair cushion vault — far heavier impact needed for vault vs. skull base fracture.",
]
y = 91.0
for pt in ml:
y = bullet_point(ax, 3, y, pt, size=9.8, wrap=95)
y -= 0.3
y -= 2
ax.text(2, y, "Complications of Skull Fractures", fontsize=11,
color=BLUE, weight="bold", va="top", fontfamily="DejaVu Sans")
divider(ax, y - 3, RED)
y -= 5
comps = [
"Brain injury — direct damage at fracture site or contrecoup.",
"★ Extradural haemorrhage — fracture crosses middle meningeal artery (temporal fossa). Fatal.",
"Traumatic epilepsy — late complication of depressed fracture impinging on motor cortex.",
"Meningitis — basal fractures communicate with sinuses/middle ear → CSF leak → ascending infection.",
"Cranial nerve palsy — depending on location of base fracture.",
]
for c in comps:
y = bullet_point(ax, 3, y, c, size=9.8, wrap=95)
y -= 0.3
# Footer
divider(ax, 4.5, "#aaaaaa", 0.6)
ax.text(50, 3.8,
"Sources: P.C. Dikshit Textbook of FMT · The Essentials of FMT, 36th Ed. (2026) · Forensic Anthropology: A Comprehensive Intro, 2nd Ed.",
fontsize=7.5, color="#777777", ha="center", va="top", style="italic",
fontfamily="DejaVu Sans")
save_page(pdf, fig)
print(f"Done: {OUTPUT}")
python /home/daytona/workspace/fmt-fractures/generate_hw_mpl.py 2>&1
ls -lh /home/daytona/workspace/fmt-fractures/Types_of_Fractures_FMT_Handwritten.…
Types of Fractures FMT Handwritten
PDF Document · PDF
| Page | Content |
|---|---|
| 1 | Title + Section A — General bone fracture types table + bone diagram image |
| 2 | Timing classification (ante/peri/postmortem) + Section B intro + skull fracture diagram image |
| 3 | Vault fractures I–V (Linear, Diastatic, Depressed/Signature, Elevated, Comminuted) |
| 4 | Vault fractures VI–X (Pond, Mosaic, Gutter, Perforating, Blow-out) + Skull Base fractures table |
| 5 | Medicolegal importance + Complications |
xkcd sketchy/hand-drawn mode on a cream background - all text, lines, table borders, and arrows have a slight hand-drawn wobble that mimics real notes. Red arrows (→) are used as bullet markers, and section headers are styled with dark blue filled bars.