Pm findings in aluminum phospnide poisoning

| Organ | Histopathology |
|---|---|
| Stomach | Congestion, edema, leucocytic infiltration, sloughing of gastric mucosa |
| Lungs | Congestion, edema, desquamation of respiratory epithelium, thickened alveoli, lymphocytic infiltration |
| Kidneys | Congestion, necrosis, tubular degeneration and regeneration |
| Adrenals | Congestion, hemorrhage, necrosis, areas of lipid depletion in cortex |
| Heart | Congestion, edema, fragmentation of fibers, focal necrosis, leucocytic infiltration |
| Brain | Congestion, edema |
Create a detailed autopsy report template for AlP poisoning cases
mkdir -p /home/daytona/workspace/alp-autopsy && ls /home/daytona/workspace/alp-a…
~/alp-autopsy/generate_report.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.platypus import PageBreak
from reportlab.lib.colors import HexColor, black, white
OUTPUT = "/home/daytona/workspace/alp-autopsy/AlP_Autopsy_Report_Template.pdf"
PAGE_W, PAGE_H = A4
# Color palette
DARK_BLUE = HexColor("#1a2e4a")
MID_BLUE = HexColor("#2c5282")
LIGHT_BLUE = HexColor("#ebf4ff")
ACCENT_RED = HexColor("#c53030")
ACCENT_GOLD = HexColor("#b7791f")
TABLE_HEADER_BG = HexColor("#2d3748")
ROW_ALT = HexColor("#f7fafc")
BORDER_GRAY = HexColor("#cbd5e0")
TEXT_DARK = HexColor("#1a202c")
TEXT_MID = HexColor("#4a5568")
SECTION_BG = HexColor("#2c5282")
styles = getSampleStyleSheet()
def style(name, **kw):
s = ParagraphStyle(name, **kw)
return s
# Define all styles
TITLE_STYLE = style("Title",
fontSize=20, fontName="Helvetica-Bold", textColor=white,
alignment=TA_CENTER, spaceAfter=4, leading=24)
SUBTITLE_STYLE = style("Subtitle",
fontSize=11, fontName="Helvetica", textColor=HexColor("#bee3f8"),
alignment=TA_CENTER, spaceAfter=2, leading=14)
SECTION_HEADER = style("SectionHeader",
fontSize=11, fontName="Helvetica-Bold", textColor=white,
alignment=TA_LEFT, spaceAfter=0, leading=14,
leftIndent=6)
FIELD_LABEL = style("FieldLabel",
fontSize=9, fontName="Helvetica-Bold", textColor=TEXT_DARK,
spaceAfter=2, leading=12)
FIELD_VALUE = style("FieldValue",
fontSize=9, fontName="Helvetica", textColor=TEXT_MID,
spaceAfter=2, leading=12)
BODY_STYLE = style("Body",
fontSize=9, fontName="Helvetica", textColor=TEXT_DARK,
spaceAfter=4, leading=13, alignment=TA_JUSTIFY)
CHECKBOX_STYLE = style("Check",
fontSize=9, fontName="Helvetica", textColor=TEXT_DARK,
leading=13, spaceAfter=2)
NOTE_STYLE = style("Note",
fontSize=8, fontName="Helvetica-Oblique", textColor=HexColor("#718096"),
leading=11, spaceAfter=3, leftIndent=8)
WARN_STYLE = style("Warn",
fontSize=8.5, fontName="Helvetica-Bold", textColor=ACCENT_RED,
leading=12, spaceAfter=3)
FOOTER_STYLE = style("Footer",
fontSize=7.5, fontName="Helvetica", textColor=HexColor("#718096"),
alignment=TA_CENTER, leading=10)
VERDICT_STYLE = style("Verdict",
fontSize=9, fontName="Helvetica-Bold", textColor=TEXT_DARK,
leading=13, spaceAfter=3)
def section_header(text):
"""Returns a table that looks like a colored section header bar."""
tbl = Table([[Paragraph(text, SECTION_HEADER)]], colWidths=[17*cm])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), SECTION_BG),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("ROWBACKGROUNDS",(0,0), (-1,-1), [SECTION_BG]),
]))
return tbl
def blank_row(label, width_label=5.5, width_value=11.5):
"""A labeled blank fill-in row."""
return Table(
[[Paragraph(label, FIELD_LABEL), Paragraph("_" * 60, FIELD_VALUE)]],
colWidths=[width_label*cm, width_value*cm]
)
def two_col_row(label1, label2, w1=4, w2=4.5, w3=4, w4=4.5):
return Table(
[[Paragraph(label1, FIELD_LABEL), Paragraph("_"*40, FIELD_VALUE),
Paragraph(label2, FIELD_LABEL), Paragraph("_"*40, FIELD_VALUE)]],
colWidths=[w1*cm, w2*cm, w3*cm, w4*cm]
)
def checkbox_row(items, cols=3):
"""Creates a row of checkboxes."""
row = []
for item in items:
row.append(Paragraph(f"☐ {item}", CHECKBOX_STYLE))
# pad to multiple of cols
while len(row) % cols != 0:
row.append(Paragraph("", CHECKBOX_STYLE))
col_w = 17 / cols
data = [row[i:i+cols] for i in range(0, len(row), cols)]
tbl = Table(data, colWidths=[col_w*cm]*cols)
tbl.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
("TOPPADDING", (0,0), (-1,-1), 2),
("BOTTOMPADDING",(0,0), (-1,-1), 2),
]))
return tbl
def field_table(rows, col_widths=None):
"""Generic table for structured field rows."""
if col_widths is None:
col_widths = [5*cm, 12*cm]
tbl = Table(rows, colWidths=col_widths)
tbl.setStyle(TableStyle([
("VALIGN", (0,0),(-1,-1),"TOP"),
("TOPPADDING", (0,0),(-1,-1), 3),
("BOTTOMPADDING",(0,0),(-1,-1), 3),
("LEFTPADDING", (0,0),(-1,-1), 4),
("RIGHTPADDING", (0,0),(-1,-1), 4),
("LINEBELOW", (1,0),(1,-1), 0.4, BORDER_GRAY),
("ROWBACKGROUNDS",(0,0),(-1,-1),[white, ROW_ALT]),
]))
return tbl
def grading_table(title, items):
"""Grading/severity table with Present/Absent/Degree columns."""
header = [
Paragraph("Finding", FIELD_LABEL),
Paragraph("Absent", FIELD_LABEL),
Paragraph("Present (+)", FIELD_LABEL),
Paragraph("Degree / Description", FIELD_LABEL),
]
data = [header]
for item in items:
data.append([
Paragraph(item, CHECKBOX_STYLE),
Paragraph("☐", CHECKBOX_STYLE),
Paragraph("☐", CHECKBOX_STYLE),
Paragraph("_"*30, FIELD_VALUE),
])
tbl = Table(data, colWidths=[6*cm, 2*cm, 2.5*cm, 6.5*cm])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TABLE_HEADER_BG),
("TEXTCOLOR", (0,0), (-1,0), white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ALIGN", (1,0), (2,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("ROWBACKGROUNDS",(0,1),(-1,-1),[white, ROW_ALT]),
("GRID", (0,0), (-1,-1), 0.4, BORDER_GRAY),
("LINEBELOW", (0,0), (-1,0), 1, DARK_BLUE),
]))
return tbl
def on_page(canvas, doc):
"""Header/footer on every page."""
canvas.saveState()
w, h = A4
# Top header bar
canvas.setFillColor(DARK_BLUE)
canvas.rect(0, h - 20*mm, w, 20*mm, fill=1, stroke=0)
canvas.setFillColor(white)
canvas.setFont("Helvetica-Bold", 10)
canvas.drawString(1.5*cm, h - 13*mm, "MEDICOLEGAL AUTOPSY REPORT — ALUMINUM PHOSPHIDE POISONING")
canvas.setFont("Helvetica", 8)
canvas.drawRightString(w - 1.5*cm, h - 13*mm, f"Page {doc.page}")
# Top accent line
canvas.setFillColor(ACCENT_RED)
canvas.rect(0, h - 21.5*mm, w, 1.5*mm, fill=1, stroke=0)
# Bottom footer
canvas.setFillColor(HexColor("#f7fafc"))
canvas.rect(0, 0, w, 12*mm, fill=1, stroke=0)
canvas.setFillColor(BORDER_GRAY)
canvas.rect(0, 12*mm, w, 0.3*mm, fill=1, stroke=0)
canvas.setFillColor(TEXT_MID)
canvas.setFont("Helvetica", 7)
canvas.drawCentredString(w/2, 4*mm,
"CONFIDENTIAL — MEDICOLEGAL DOCUMENT | This template is based on standard forensic pathology protocols for AlP poisoning")
canvas.restoreState()
def build_pdf():
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=1.5*cm, rightMargin=1.5*cm,
topMargin=2.4*cm, bottomMargin=1.8*cm,
title="AlP Autopsy Report Template",
author="Forensic Medicine Department",
)
story = []
sp = lambda n=4: Spacer(1, n*mm)
hr = lambda: HRFlowable(width="100%", thickness=0.5, color=BORDER_GRAY, spaceAfter=3, spaceBefore=3)
# ── TITLE BLOCK ─────────────────────────────────────────────────────────────
title_data = [[
Paragraph("MEDICOLEGAL AUTOPSY REPORT", TITLE_STYLE),
Paragraph("ALUMINUM PHOSPHIDE (ALP) POISONING", SUBTITLE_STYLE),
Paragraph("Forensic Medicine & Toxicology Department", SUBTITLE_STYLE),
]]
title_tbl = Table([[
Paragraph("MEDICOLEGAL AUTOPSY REPORT", TITLE_STYLE),
]], colWidths=[17*cm])
title_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
]))
story.append(title_tbl)
sub_tbl = Table([[
Paragraph("ALUMINUM PHOSPHIDE (ALP / CELPHOS) POISONING", SUBTITLE_STYLE),
Paragraph("Forensic Medicine & Toxicology | Template v1.0", SUBTITLE_STYLE),
]], colWidths=[9.5*cm, 7.5*cm])
sub_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), MID_BLUE),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("LINEBELOW", (0,0), (-1,-1), 2, ACCENT_RED),
]))
story.append(sub_tbl)
story.append(sp(5))
# Warning box
warn_tbl = Table([[
Paragraph("⚠ IMPORTANT: This is a template. All fields marked with underlines must be completed by the examining forensic pathologist. "
"This document is a CONFIDENTIAL medicolegal record.", WARN_STYLE)
]], colWidths=[17*cm])
warn_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), HexColor("#fff5f5")),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("BOX", (0,0), (-1,-1), 1, ACCENT_RED),
]))
story.append(warn_tbl)
story.append(sp(5))
# ── SECTION 1: CASE IDENTIFICATION ──────────────────────────────────────────
story.append(section_header("SECTION 1 — CASE IDENTIFICATION & ADMINISTRATIVE DETAILS"))
story.append(sp(3))
id_data = [
[Paragraph("Autopsy No.", FIELD_LABEL), Paragraph("_"*40, FIELD_VALUE),
Paragraph("Date of Autopsy:", FIELD_LABEL), Paragraph("_"*30, FIELD_VALUE)],
[Paragraph("Name of Deceased:", FIELD_LABEL), Paragraph("_"*40, FIELD_VALUE),
Paragraph("Time of Autopsy:", FIELD_LABEL), Paragraph("_"*30, FIELD_VALUE)],
[Paragraph("Age / Sex:", FIELD_LABEL), Paragraph("_"*40, FIELD_VALUE),
Paragraph("Date of Death:", FIELD_LABEL), Paragraph("_"*30, FIELD_VALUE)],
[Paragraph("Address:", FIELD_LABEL), Paragraph("_"*40, FIELD_VALUE),
Paragraph("Time of Death:", FIELD_LABEL), Paragraph("_"*30, FIELD_VALUE)],
[Paragraph("Occupation:", FIELD_LABEL), Paragraph("_"*40, FIELD_VALUE),
Paragraph("Religion/Caste:", FIELD_LABEL), Paragraph("_"*30, FIELD_VALUE)],
[Paragraph("Police Station:", FIELD_LABEL), Paragraph("_"*40, FIELD_VALUE),
Paragraph("FIR / Inquest No.:", FIELD_LABEL), Paragraph("_"*30, FIELD_VALUE)],
[Paragraph("Requisition From:", FIELD_LABEL), Paragraph("_"*40, FIELD_VALUE),
Paragraph("Requisition Date:", FIELD_LABEL), Paragraph("_"*30, FIELD_VALUE)],
[Paragraph("Autopsy Surgeon:", FIELD_LABEL), Paragraph("_"*40, FIELD_VALUE),
Paragraph("Designation:", FIELD_LABEL), Paragraph("_"*30, FIELD_VALUE)],
[Paragraph("Witness(es):", FIELD_LABEL), Paragraph("_"*40, FIELD_VALUE),
Paragraph("Identification:", FIELD_LABEL), Paragraph("_"*30, FIELD_VALUE)],
]
id_tbl = Table(id_data, colWidths=[4*cm, 4.5*cm, 4*cm, 4.5*cm])
id_tbl.setStyle(TableStyle([
("VALIGN", (0,0),(-1,-1),"TOP"),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 4),
("RIGHTPADDING", (0,0),(-1,-1), 4),
("LINEBELOW", (1,0),(1,-1), 0.4, BORDER_GRAY),
("LINEBELOW", (3,0),(3,-1), 0.4, BORDER_GRAY),
("ROWBACKGROUNDS",(0,0),(-1,-1),[white, ROW_ALT]),
]))
story.append(id_tbl)
story.append(sp(4))
# Manner of death
story.append(Paragraph("Suspected Manner of Death:", FIELD_LABEL))
story.append(checkbox_row(["Suicidal", "Accidental", "Homicidal", "Undetermined"], cols=4))
story.append(sp(4))
# ── SECTION 2: HISTORY ───────────────────────────────────────────────────────
story.append(section_header("SECTION 2 — CLINICAL HISTORY & CIRCUMSTANCES"))
story.append(sp(3))
hist_rows = [
[Paragraph("History from Police:", FIELD_LABEL),
Paragraph("_"*80, FIELD_VALUE)],
[Paragraph("", FIELD_LABEL), Paragraph("_"*80, FIELD_VALUE)],
[Paragraph("Suspected substance:", FIELD_LABEL),
Paragraph("Aluminum Phosphide (Celphos / Alphos / Quickphos / Phostoxin / Phosphotex)", BODY_STYLE)],
[Paragraph("Route of exposure:", FIELD_LABEL),
Paragraph("", FIELD_VALUE)],
[Paragraph("Time of ingestion:", FIELD_LABEL),
Paragraph("_"*50 + " Amount ingested: _"*20, FIELD_VALUE)],
[Paragraph("Hospitalized:", FIELD_LABEL),
Paragraph("☐ Yes ☐ No If yes, Hospital: _"*20, FIELD_VALUE)],
[Paragraph("Treatment given:", FIELD_LABEL),
Paragraph("_"*80, FIELD_VALUE)],
[Paragraph("Duration of illness\nbefore death:", FIELD_LABEL),
Paragraph("_"*50, FIELD_VALUE)],
[Paragraph("Witnesses to\ningestion:", FIELD_LABEL),
Paragraph("_"*80, FIELD_VALUE)],
]
hdr = Table(hist_rows, colWidths=[4.5*cm, 12.5*cm])
hdr.setStyle(TableStyle([
("VALIGN", (0,0),(-1,-1),"TOP"),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 4),
("RIGHTPADDING", (0,0),(-1,-1), 4),
("LINEBELOW", (1,0),(1,-1), 0.4, BORDER_GRAY),
("ROWBACKGROUNDS",(0,0),(-1,-1),[white, ROW_ALT]),
]))
story.append(hdr)
story.append(sp(3))
# Route checkboxes
story.append(Paragraph("Route of Exposure:", FIELD_LABEL))
story.append(checkbox_row(["Oral ingestion", "Inhalation", "Dermal", "Combined oral + inhalation", "Unknown"], cols=3))
story.append(sp(5))
story.append(PageBreak())
# ── SECTION 3: EXTERNAL EXAM ─────────────────────────────────────────────────
story.append(section_header("SECTION 3 — EXTERNAL EXAMINATION"))
story.append(sp(3))
story.append(Paragraph("A. General Condition", FIELD_LABEL))
story.append(sp(2))
gen_rows = [
[Paragraph("Build / Nutrition:", FIELD_LABEL), Paragraph("_"*35, FIELD_VALUE),
Paragraph("Height:", FIELD_LABEL), Paragraph("_"*20 + " cm", FIELD_VALUE)],
[Paragraph("Rigor mortis:", FIELD_LABEL), Paragraph("_"*35, FIELD_VALUE),
Paragraph("Weight:", FIELD_LABEL), Paragraph("_"*20 + " kg", FIELD_VALUE)],
[Paragraph("Livor mortis (PM staining):", FIELD_LABEL), Paragraph("_"*35, FIELD_VALUE),
Paragraph("Decomposition:", FIELD_LABEL), Paragraph("_"*20, FIELD_VALUE)],
[Paragraph("PM staining color:", FIELD_LABEL),
Paragraph("☐ Pink ☐ Bluish-purple ☐ Yellowish ☐ Other: ______", FIELD_VALUE),
Paragraph("Skin:", FIELD_LABEL), Paragraph("_"*20, FIELD_VALUE)],
]
gen_tbl = Table(gen_rows, colWidths=[4.5*cm, 4*cm, 3*cm, 5.5*cm])
gen_tbl.setStyle(TableStyle([
("VALIGN",(0,0),(-1,-1),"TOP"),
("TOPPADDING",(0,0),(-1,-1),3),("BOTTOMPADDING",(0,0),(-1,-1),3),
("LEFTPADDING",(0,0),(-1,-1),4),("RIGHTPADDING",(0,0),(-1,-1),4),
("LINEBELOW",(1,0),(1,-1),0.4,BORDER_GRAY),
("LINEBELOW",(3,0),(3,-1),0.4,BORDER_GRAY),
("ROWBACKGROUNDS",(0,0),(-1,-1),[white,ROW_ALT]),
]))
story.append(gen_tbl)
story.append(sp(3))
# Key external signs
story.append(Paragraph("B. Key External Signs of AlP Poisoning", FIELD_LABEL))
story.append(sp(2))
story.append(grading_table("", [
"GARLIC / FISHY ODOR — mouth and nostrils (pathognomonic)",
"Blood-stained froth at mouth and/or nostrils",
"Cyanosis (lips, nail beds, skin)",
"Conjunctival congestion / petechial hemorrhages",
"Icterus / jaundice",
"Pallor",
"Excoriation / burns around mouth (corrosive effect)",
"Injuries / signs of struggle (note if present)",
"Clothing stains — color, odor",
]))
story.append(sp(3))
story.append(Paragraph("C. Clothing & Scene Evidence", FIELD_LABEL))
story.append(sp(2))
clothing_data = [
[Paragraph("Clothing condition:", FIELD_LABEL), Paragraph("_"*60, FIELD_VALUE)],
[Paragraph("Tablet remnants / packets found on/near body:", FIELD_LABEL),
Paragraph("☐ Yes ☐ No Description: _"*20, FIELD_VALUE)],
[Paragraph("Vomitus present:", FIELD_LABEL),
Paragraph("☐ Yes ☐ No Odor: ___________ Color: ___________", FIELD_VALUE)],
]
c_tbl = Table(clothing_data, colWidths=[5.5*cm, 11.5*cm])
c_tbl.setStyle(TableStyle([
("VALIGN",(0,0),(-1,-1),"TOP"),
("TOPPADDING",(0,0),(-1,-1),3),("BOTTOMPADDING",(0,0),(-1,-1),3),
("LEFTPADDING",(0,0),(-1,-1),4),("RIGHTPADDING",(0,0),(-1,-1),4),
("LINEBELOW",(1,0),(1,-1),0.4,BORDER_GRAY),
("ROWBACKGROUNDS",(0,0),(-1,-1),[white,ROW_ALT]),
]))
story.append(c_tbl)
story.append(sp(5))
story.append(PageBreak())
# ── SECTION 4: INTERNAL EXAM ─────────────────────────────────────────────────
story.append(section_header("SECTION 4 — INTERNAL EXAMINATION (ORGAN-WISE)"))
story.append(sp(3))
# 4A - GIT
story.append(Paragraph("A. Gastrointestinal Tract", FIELD_LABEL))
story.append(sp(2))
story.append(Paragraph(
"Note: The GIT shows the most characteristic findings. The gastric mucosa is typically congested, "
"hemorrhagic and eroded. Congestion decreases progressively from stomach → duodenum → small intestine.",
NOTE_STYLE))
story.append(sp(2))
story.append(grading_table("", [
"GASTRIC CONTENTS — garlic/fishy odor (pathognomonic)",
"Gastric mucosa: congestion and hemorrhage",
"Gastric mucosa: erosion / ulceration",
"Gastric mucosa: sloughing / necrosis",
"Lower esophagus: congestion / erosion",
"Duodenum: congestion",
"Small intestine: congestion (decreasing gradient distally)",
"Large intestine: congestion",
"Undigested tablet fragments in stomach",
]))
story.append(sp(2))
story.append(Paragraph("Gastric contents volume (approx.): _________ mL Color: _____________ pH: _______", BODY_STYLE))
story.append(sp(4))
# 4B - Lungs
story.append(Paragraph("B. Respiratory System", FIELD_LABEL))
story.append(sp(2))
story.append(grading_table("", [
"PULMONARY EDEMA (hallmark finding)",
"Lungs: congestion",
"Frothy fluid in airways / trachea",
"Pulmonary hemorrhage / petechiae",
"Pleural effusion",
"ARDS pattern (heavy, firm lungs)",
]))
story.append(sp(2))
lung_data = [
[Paragraph("Right lung weight:", FIELD_LABEL), Paragraph("________ g", FIELD_VALUE),
Paragraph("Left lung weight:", FIELD_LABEL), Paragraph("________ g", FIELD_VALUE)],
[Paragraph("Cut surface:", FIELD_LABEL),
Paragraph("☐ Frothy fluid oozes ☐ Congested ☐ Edematous ☐ Normal", FIELD_VALUE),
Paragraph("", FIELD_LABEL), Paragraph("", FIELD_VALUE)],
]
ltbl = Table(lung_data, colWidths=[4.5*cm, 4*cm, 4*cm, 4.5*cm])
ltbl.setStyle(TableStyle([
("VALIGN",(0,0),(-1,-1),"TOP"),("TOPPADDING",(0,0),(-1,-1),3),("BOTTOMPADDING",(0,0),(-1,-1),3),
("LEFTPADDING",(0,0),(-1,-1),4),("RIGHTPADDING",(0,0),(-1,-1),4),
("LINEBELOW",(1,0),(1,-1),0.4,BORDER_GRAY),("LINEBELOW",(3,0),(3,-1),0.4,BORDER_GRAY),
("ROWBACKGROUNDS",(0,0),(-1,-1),[white,ROW_ALT]),
]))
story.append(ltbl)
story.append(sp(4))
# 4C - Heart
story.append(Paragraph("C. Cardiovascular System", FIELD_LABEL))
story.append(sp(2))
story.append(grading_table("", [
"Cardiac congestion",
"Myocardial edema",
"Subepicardial / subendocardial petechiae",
"Focal myocardial necrosis",
"Pericardial effusion",
"Pericarditis",
"Right heart dilatation (acute cor pulmonale)",
"Coronary artery atherosclerosis (pre-existing)",
]))
story.append(sp(2))
ht_data = [
[Paragraph("Heart weight:", FIELD_LABEL), Paragraph("________ g", FIELD_VALUE),
Paragraph("Left ventricle thickness:", FIELD_LABEL), Paragraph("________ cm", FIELD_VALUE)],
[Paragraph("Right ventricle thickness:", FIELD_LABEL), Paragraph("________ cm", FIELD_VALUE),
Paragraph("Valves:", FIELD_LABEL), Paragraph("_____________", FIELD_VALUE)],
]
htt = Table(ht_data, colWidths=[4.5*cm, 4*cm, 4*cm, 4.5*cm])
htt.setStyle(TableStyle([
("VALIGN",(0,0),(-1,-1),"TOP"),("TOPPADDING",(0,0),(-1,-1),3),("BOTTOMPADDING",(0,0),(-1,-1),3),
("LEFTPADDING",(0,0),(-1,-1),4),("RIGHTPADDING",(0,0),(-1,-1),4),
("LINEBELOW",(1,0),(1,-1),0.4,BORDER_GRAY),("LINEBELOW",(3,0),(3,-1),0.4,BORDER_GRAY),
("ROWBACKGROUNDS",(0,0),(-1,-1),[white,ROW_ALT]),
]))
story.append(htt)
story.append(sp(4))
story.append(PageBreak())
# 4D - Liver
story.append(section_header("SECTION 4 (continued) — INTERNAL EXAMINATION"))
story.append(sp(3))
story.append(Paragraph("D. Liver", FIELD_LABEL))
story.append(sp(2))
story.append(grading_table("", [
"Hepatic congestion",
"CENTRIZONAL HEMORRHAGIC NECROSIS (characteristic finding)",
"Hepatomegaly",
"Fatty change",
"Icterus / jaundice staining",
"Subcapsular hemorrhage",
]))
story.append(sp(2))
liver_data = [
[Paragraph("Liver weight:", FIELD_LABEL), Paragraph("________ g (Normal: 1200–1600 g)", FIELD_VALUE),
Paragraph("Color / texture:", FIELD_LABEL), Paragraph("_____________", FIELD_VALUE)],
]
livt = Table(liver_data, colWidths=[3.5*cm, 7*cm, 3*cm, 3.5*cm])
livt.setStyle(TableStyle([
("VALIGN",(0,0),(-1,-1),"TOP"),("TOPPADDING",(0,0),(-1,-1),3),("BOTTOMPADDING",(0,0),(-1,-1),3),
("LEFTPADDING",(0,0),(-1,-1),4),("RIGHTPADDING",(0,0),(-1,-1),4),
("ROWBACKGROUNDS",(0,0),(-1,-1),[ROW_ALT]),
]))
story.append(livt)
story.append(sp(4))
# 4E - Kidneys
story.append(Paragraph("E. Kidneys", FIELD_LABEL))
story.append(sp(2))
story.append(grading_table("", [
"Renal congestion",
"Cortical pallor / tubular necrosis",
"Swelling / enlargement",
"Petechial hemorrhages on surface",
]))
story.append(sp(2))
kd_data = [
[Paragraph("Right kidney weight:", FIELD_LABEL), Paragraph("________ g", FIELD_VALUE),
Paragraph("Left kidney weight:", FIELD_LABEL), Paragraph("________ g", FIELD_VALUE)],
[Paragraph("Cortex:", FIELD_LABEL), Paragraph("_______________________", FIELD_VALUE),
Paragraph("Medulla:", FIELD_LABEL), Paragraph("_______________________", FIELD_VALUE)],
]
kdt = Table(kd_data, colWidths=[4.5*cm, 4*cm, 4*cm, 4.5*cm])
kdt.setStyle(TableStyle([
("VALIGN",(0,0),(-1,-1),"TOP"),("TOPPADDING",(0,0),(-1,-1),3),("BOTTOMPADDING",(0,0),(-1,-1),3),
("LEFTPADDING",(0,0),(-1,-1),4),("RIGHTPADDING",(0,0),(-1,-1),4),
("LINEBELOW",(1,0),(1,-1),0.4,BORDER_GRAY),("LINEBELOW",(3,0),(3,-1),0.4,BORDER_GRAY),
("ROWBACKGROUNDS",(0,0),(-1,-1),[white,ROW_ALT]),
]))
story.append(kdt)
story.append(sp(4))
# 4F - Brain
story.append(Paragraph("F. Brain", FIELD_LABEL))
story.append(sp(2))
story.append(grading_table("", [
"Cerebral congestion",
"Cerebral edema",
"Petechial hemorrhages",
"Other findings",
]))
story.append(sp(2))
br_data = [[Paragraph("Brain weight:", FIELD_LABEL), Paragraph("________ g (Normal: ~1300 g)", FIELD_VALUE),
Paragraph("Herniation:", FIELD_LABEL), Paragraph("☐ Yes ☐ No", FIELD_VALUE)]]
brt = Table(br_data, colWidths=[3.5*cm, 7*cm, 3*cm, 3.5*cm])
brt.setStyle(TableStyle([("VALIGN",(0,0),(-1,-1),"TOP"),("TOPPADDING",(0,0),(-1,-1),3),
("BOTTOMPADDING",(0,0),(-1,-1),3),("LEFTPADDING",(0,0),(-1,-1),4),("RIGHTPADDING",(0,0),(-1,-1),4),
("ROWBACKGROUNDS",(0,0),(-1,-1),[ROW_ALT])]))
story.append(brt)
story.append(sp(4))
# 4G - Adrenals & Spleen
story.append(Paragraph("G. Adrenal Glands", FIELD_LABEL))
story.append(sp(2))
story.append(grading_table("", [
"Adrenal congestion",
"Cortical hemorrhage",
"Cortical necrosis",
"Lipid depletion in cortex (microscopy)",
]))
story.append(sp(3))
story.append(Paragraph("H. Spleen — Weight: ________ g (Normal ~150 g) Congestion: ☐ Yes ☐ No Petechiae: ☐ Yes ☐ No", BODY_STYLE))
story.append(sp(5))
story.append(PageBreak())
# ── SECTION 5: HISTOPATHOLOGY ────────────────────────────────────────────────
story.append(section_header("SECTION 5 — HISTOPATHOLOGICAL (MICROSCOPIC) FINDINGS"))
story.append(sp(3))
story.append(Paragraph(
"Tissue blocks must be collected from: stomach, lungs, liver, kidneys, heart, brain, adrenals, spleen. "
"Fix in 10% neutral buffered formalin. Special stains: H&E (routine), PAS (tubular), Masson Trichrome (myocardial fibrosis).",
NOTE_STYLE))
story.append(sp(3))
histo_header = [
Paragraph("Organ", FIELD_LABEL),
Paragraph("Histopathological Findings", FIELD_LABEL),
Paragraph("Grade (0–3)", FIELD_LABEL),
]
histo_rows = [histo_header]
organs_histo = [
("Stomach",
"Congestion ☐ Edema ☐ Leucocytic infiltration ☐\nSloughing of gastric mucosa ☐ Hemorrhagic erosion ☐"),
("Lungs",
"Congestion ☐ Edema ☐ Desquamation of respiratory epithelium ☐\nThickened alveolar walls ☐ Lymphocytic infiltration ☐ Hyaline membranes ☐"),
("Liver",
"Congestion ☐ Centrizonal hemorrhagic necrosis ☐ Fatty change ☐\nHepatocyte vacuolation ☐ Portal inflammation ☐"),
("Kidneys",
"Congestion ☐ Tubular degeneration ☐ Tubular necrosis ☐\nTubular regeneration ☐ Glomerular changes ☐"),
("Heart",
"Congestion ☐ Edema ☐ Fragmentation of myofibers ☐\nFocal necrosis ☐ Leucocytic infiltration ☐ Contraction bands ☐"),
("Adrenals",
"Congestion ☐ Hemorrhage ☐ Necrosis ☐\nLipid depletion in cortex ☐"),
("Brain",
"Congestion ☐ Edema (perivascular) ☐\nNeuronal changes ☐ Petechiae ☐"),
("Spleen",
"Congestion ☐ Lymphoid depletion ☐ Hemorrhage ☐"),
]
for organ, findings in organs_histo:
histo_rows.append([
Paragraph(organ, VERDICT_STYLE),
Paragraph(findings, CHECKBOX_STYLE),
Paragraph("_____", FIELD_VALUE),
])
histo_tbl = Table(histo_rows, colWidths=[3*cm, 11.5*cm, 2.5*cm])
histo_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), TABLE_HEADER_BG),
("TEXTCOLOR", (0,0),(-1,0), white),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,-1), 8.5),
("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),
("ROWBACKGROUNDS",(0,1),(-1,-1),[white, ROW_ALT]),
("GRID", (0,0),(-1,-1), 0.4, BORDER_GRAY),
("LINEBELOW", (0,0),(-1,0), 1, DARK_BLUE),
("ALIGN", (2,0),(2,-1), "CENTER"),
]))
story.append(histo_tbl)
story.append(sp(5))
story.append(PageBreak())
# ── SECTION 6: CHEMICAL / TOXICOLOGY ────────────────────────────────────────
story.append(section_header("SECTION 6 — CHEMICAL & TOXICOLOGICAL ANALYSIS"))
story.append(sp(3))
story.append(Paragraph("A. Samples Collected at Autopsy", FIELD_LABEL))
story.append(sp(2))
samples = [
["Sample", "Volume / Amount", "Container", "Preservative", "Sealed / Labelled"],
["Gastric contents", "_______ mL", "Glass jar", "None / 1% NaF", "☐ Yes ☐ No"],
["Blood (heart)", "_______ mL", "Vacutainer", "EDTA / NaF-oxalate", "☐ Yes ☐ No"],
["Blood (femoral)", "_______ mL", "Vacutainer", "NaF-oxalate", "☐ Yes ☐ No"],
["Urine", "_______ mL", "Glass jar", "None", "☐ Yes ☐ No"],
["Liver tissue", "_______ g", "Glass jar", "No formalin", "☐ Yes ☐ No"],
["Kidney tissue", "_______ g", "Glass jar", "No formalin", "☐ Yes ☐ No"],
["Brain tissue", "_______ g", "Glass jar", "No formalin", "☐ Yes ☐ No"],
["Lung tissue", "_______ g", "Glass jar", "No formalin", "☐ Yes ☐ No"],
["Vitreous humor", "_______ mL", "Sealed vial", "None", "☐ Yes ☐ No"],
["Hair / Nail samples", "_____________", "Envelope", "None", "☐ Yes ☐ No"],
["Suspected tablets / packets", "_____________", "Paper bag", "None", "☐ Yes ☐ No"],
["Vomitus", "_______ mL", "Glass jar", "None", "☐ Yes ☐ No"],
]
s_tbl = Table(samples, colWidths=[4*cm, 3*cm, 3*cm, 3*cm, 4*cm])
s_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), TABLE_HEADER_BG),
("TEXTCOLOR", (0,0),(-1,0), white),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 5),
("RIGHTPADDING", (0,0),(-1,-1), 5),
("ROWBACKGROUNDS",(0,1),(-1,-1),[white, ROW_ALT]),
("GRID", (0,0),(-1,-1), 0.4, BORDER_GRAY),
("LINEBELOW", (0,0),(-1,0), 1, DARK_BLUE),
("ALIGN", (4,0),(4,-1), "CENTER"),
]))
story.append(s_tbl)
story.append(sp(4))
# Chemical tests
story.append(Paragraph("B. Chemical Tests for Phosphine (PH₃)", FIELD_LABEL))
story.append(sp(2))
story.append(Paragraph(
"Silver Nitrate Paper Test: Mix 5 mL gastric aspirate + 15 mL water in a flask. "
"Cover with 0.1 N silver nitrate-impregnated filter paper. Heat at 50°C for 15–20 minutes.",
NOTE_STYLE))
story.append(sp(2))
chem_rows = [
[Paragraph("AgNO₃ paper test (gastric):", FIELD_LABEL),
Paragraph("☐ Positive (paper turns BLACK — PH₃ confirmed) ☐ Negative ☐ Not done", CHECKBOX_STYLE)],
[Paragraph("Smell test (odor):", FIELD_LABEL),
Paragraph("☐ Garlic/fishy smell present ☐ Absent Intensity: _____________", CHECKBOX_STYLE)],
[Paragraph("Gas chromatography:", FIELD_LABEL),
Paragraph("☐ Done ☐ Pending Result: _____________ PH₃ level: _______ ppm", CHECKBOX_STYLE)],
[Paragraph("GC-MS / LC-MS (blood):", FIELD_LABEL),
Paragraph("☐ Done ☐ Pending Result: ___________________________", CHECKBOX_STYLE)],
[Paragraph("Radioimmunoassay:", FIELD_LABEL),
Paragraph("☐ Done ☐ Pending Result: ___________________________", CHECKBOX_STYLE)],
]
c_tbl2 = Table(chem_rows, colWidths=[4.5*cm, 12.5*cm])
c_tbl2.setStyle(TableStyle([
("VALIGN",(0,0),(-1,-1),"TOP"),("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4),
("LEFTPADDING",(0,0),(-1,-1),4),("RIGHTPADDING",(0,0),(-1,-1),4),
("LINEBELOW",(1,0),(1,-1),0.4,BORDER_GRAY),
("ROWBACKGROUNDS",(0,0),(-1,-1),[white,ROW_ALT]),
]))
story.append(c_tbl2)
story.append(sp(5))
story.append(PageBreak())
# ── SECTION 7: OPINION ───────────────────────────────────────────────────────
story.append(section_header("SECTION 7 — OPINION & CAUSE OF DEATH"))
story.append(sp(3))
# Cause of death certificate format
cod_header = [Paragraph("CAUSE OF DEATH CERTIFICATE", style("CoDHeader",
fontSize=10, fontName="Helvetica-Bold", textColor=DARK_BLUE,
alignment=TA_CENTER))]
cod_tbl = Table([[cod_header]], colWidths=[17*cm])
cod_tbl.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),LIGHT_BLUE),
("TOPPADDING",(0,0),(-1,-1),6),("BOTTOMPADDING",(0,0),(-1,-1),6),
("BOX",(0,0),(-1,-1),1,MID_BLUE),
]))
story.append(cod_tbl)
story.append(sp(2))
cod_items = [
["Ia. Immediate cause of death (final disease/condition):",
"Cardiorespiratory failure due to phosphine toxicity"],
["Ib. Underlying cause:",
"Aluminum phosphide (ALP) poisoning"],
["Ic. Antecedent cause (if applicable):",
"_________________________________________________"],
["II. Other significant conditions:",
"_________________________________________________"],
]
cod_table = Table(cod_items, colWidths=[8*cm, 9*cm])
cod_table.setStyle(TableStyle([
("VALIGN",(0,0),(-1,-1),"TOP"),("TOPPADDING",(0,0),(-1,-1),5),("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),6),("RIGHTPADDING",(0,0),(-1,-1),6),
("FONTNAME",(0,0),(0,-1),"Helvetica-Bold"),("FONTSIZE",(0,0),(-1,-1),9),
("ROWBACKGROUNDS",(0,0),(-1,-1),[white,ROW_ALT]),
("GRID",(0,0),(-1,-1),0.5,BORDER_GRAY),
("LINEBELOW",(0,1),(-1,1),1,MID_BLUE),
]))
story.append(cod_table)
story.append(sp(4))
# Opinion fields
story.append(Paragraph("Summary Opinion:", FIELD_LABEL))
summary_tbl = Table([[Paragraph(
"Based on external examination, internal organ findings, histopathology, and chemical tests, "
"in my opinion the deceased died due to ______________________________ as a result of ingestion/inhalation "
"of aluminum phosphide (ALP). The manner of death is ____________________________. "
"The time since death is estimated to be ____________________________.",
BODY_STYLE)]], colWidths=[17*cm])
summary_tbl.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),LIGHT_BLUE),
("TOPPADDING",(0,0),(-1,-1),8),("BOTTOMPADDING",(0,0),(-1,-1),8),
("LEFTPADDING",(0,0),(-1,-1),10),("RIGHTPADDING",(0,0),(-1,-1),10),
("BOX",(0,0),(-1,-1),1,MID_BLUE),
]))
story.append(summary_tbl)
story.append(sp(4))
# Checklist for features supporting diagnosis
story.append(Paragraph("Features Supporting Diagnosis of AlP Poisoning (tick all present):", FIELD_LABEL))
story.append(sp(2))
features = [
"Garlic/fishy odor at autopsy (mouth, nostrils, gastric contents)",
"Blood-stained froth at mouth / nostrils",
"Gastric mucosal congestion and hemorrhagic erosion",
"Pulmonary edema",
"Centrizonal hemorrhagic necrosis of liver",
"Congestion of all viscera",
"Petechial hemorrhages in multiple organs",
"AgNO₃ paper test positive for PH₃",
"Tablet remnants / packaging found",
"History consistent with AlP ingestion/exposure",
]
story.append(checkbox_row(features, cols=2))
story.append(sp(5))
story.append(PageBreak())
# ── SECTION 8: SIGNATURE ─────────────────────────────────────────────────────
story.append(section_header("SECTION 8 — DECLARATION & SIGNATURES"))
story.append(sp(4))
story.append(Paragraph(
"I, Dr. _________________________________, do hereby certify that I have performed the autopsy on the body "
"identified as _________________________________ (Age/Sex: ___________) on "
"_________________________________ (date and time) and the above findings are true to the best of my "
"knowledge and belief.",
BODY_STYLE))
story.append(sp(6))
sig_rows = [
[Paragraph("Signature of Autopsy Surgeon", FIELD_LABEL),
Paragraph("", FIELD_LABEL),
Paragraph("Counter Signature (HOD / Supervisor)", FIELD_LABEL)],
[Paragraph("\n\n_______________________________", FIELD_VALUE),
Paragraph("", FIELD_LABEL),
Paragraph("\n\n_______________________________", FIELD_VALUE)],
[Paragraph("Name: _________________________", FIELD_VALUE),
Paragraph("", FIELD_LABEL),
Paragraph("Name: _________________________", FIELD_VALUE)],
[Paragraph("Designation: ___________________", FIELD_VALUE),
Paragraph("", FIELD_LABEL),
Paragraph("Designation: ___________________", FIELD_VALUE)],
[Paragraph("Date: _________________________", FIELD_VALUE),
Paragraph("", FIELD_LABEL),
Paragraph("Date: _________________________", FIELD_VALUE)],
[Paragraph("Seal / Stamp:", FIELD_VALUE),
Paragraph("", FIELD_LABEL),
Paragraph("Seal / Stamp:", FIELD_VALUE)],
[Paragraph("\n\n\n", FIELD_VALUE),
Paragraph("", FIELD_LABEL),
Paragraph("\n\n\n", FIELD_VALUE)],
]
sig_tbl = Table(sig_rows, colWidths=[7*cm, 3*cm, 7*cm])
sig_tbl.setStyle(TableStyle([
("VALIGN",(0,0),(-1,-1),"TOP"),
("TOPPADDING",(0,0),(-1,-1),3),("BOTTOMPADDING",(0,0),(-1,-1),3),
("LEFTPADDING",(0,0),(-1,-1),4),("RIGHTPADDING",(0,0),(-1,-1),4),
]))
story.append(sig_tbl)
story.append(sp(5))
story.append(hr())
story.append(sp(3))
# ── SECTION 9: REFERENCE SUMMARY ────────────────────────────────────────────
story.append(section_header("SECTION 9 — QUICK REFERENCE: AlP POISONING SUMMARY"))
story.append(sp(3))
ref_data = [
["Parameter", "Details"],
["Chemical", "Aluminum Phosphide (AlP) → releases Phosphine gas (PH₃) on contact with moisture"],
["Trade names", "Celphos, Alphos, Quickphos, Phostoxin, Phosphotex (India)"],
["Fatal dose", "1–3 g (1–3 tablets); inhalation at 400–600 ppm fatal within 1 hour"],
["Fatal period", "6–12 hours (most deaths within 24 hours)"],
["Mechanism", "Inhibits cytochrome oxidase → blocks electron transport chain → multi-organ failure"],
["Odor (pathognomonic)", "Garlic-like / fishy odor from mouth, nostrils, and gastric contents"],
["Cause of death", "Cardiorespiratory failure (cardiac failure in most cases)"],
["Antidote", "NO specific antidote available"],
["Common route", "Oral (suicidal ingestion most common in India)"],
["PM hypostasis", "May appear yellowish (like phosphorus poisoning)"],
["Key organ findings", "GIT congestion + erosion > Pulmonary edema > Centrizonal liver necrosis > Congestion all organs"],
["Histopathology signature", "Stomach: sloughing; Lung: alveolar edema; Liver: centrizonal hemorrhagic necrosis;\nKidney: tubular necrosis; Heart: fiber fragmentation + focal necrosis; Adrenal: lipid depletion in cortex"],
["Confirmatory test", "Silver nitrate paper test → turns BLACK in presence of PH₃; GC-MS for quantification"],
]
ref_tbl = Table(ref_data, colWidths=[4.5*cm, 12.5*cm])
ref_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), TABLE_HEADER_BG),
("TEXTCOLOR", (0,0),(-1,0), white),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTNAME", (0,0),(0,-1), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,-1), 8.5),
("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),
("ROWBACKGROUNDS",(0,1),(-1,-1),[white, ROW_ALT]),
("GRID", (0,0),(-1,-1), 0.4, BORDER_GRAY),
("LINEBELOW", (0,0),(-1,0), 1, DARK_BLUE),
("TEXTCOLOR", (0,1),(0,-1), MID_BLUE),
]))
story.append(ref_tbl)
story.append(sp(4))
story.append(Paragraph(
"References: The Essentials of Forensic Medicine and Toxicology, 36th Ed. (2026) | "
"P C Dikshit Textbook of Forensic Medicine and Toxicology | "
"Parikh's Textbook of Medical Jurisprudence, Forensic Medicine and Toxicology",
NOTE_STYLE))
# Build
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print(f"PDF generated: {OUTPUT}")
build_pdf()
cd /home/daytona/workspace/alp-autopsy && python generate_report.py 2>&1
ls -lh /home/daytona/workspace/alp-autopsy/AlP_Autopsy_Report_Template.pdf
AlP Autopsy Report Template
PDF Document · PDF
| Section | Contents |
|---|---|
| 1 - Case Identification | Autopsy No., deceased details, FIR/inquest no., manner of death checkboxes |
| 2 - Clinical History | Route of exposure, amount ingested, hospital treatment, duration of illness |
| 3 - External Examination | Garlic/fishy odor, froth at mouth, cyanosis, PM staining color, clothing/scene evidence |
| 4 - Internal Examination | Organ-by-organ graded tables: GIT, Lungs, Heart, Liver, Kidneys, Brain, Adrenals, Spleen - each with Present/Absent/Degree checkboxes |
| 5 - Histopathology | Tissue collection guide + microscopic checkbox findings for all 8 organs (stomach sloughing, alveolar edema, centrizonal liver necrosis, tubular necrosis, cardiac fiber fragmentation, adrenal lipid depletion) |
| 6 - Toxicology | Sample collection table (13 sample types with containers/preservatives), AgNO₃ paper test recording, GC-MS, RIA fields |
| 7 - Opinion | WHO-format cause of death certificate (Ia/Ib/Ic), summary opinion paragraph, 10-point diagnostic checklist |
| 8 - Signatures | Dual signature block (autopsy surgeon + HOD countersignature) with seal space |
| 9 - Quick Reference | Condensed AlP toxicology summary table (fatal dose, mechanism, PM findings, confirmatory tests) |