List out all the sections(BNS,BNSS,BSA) from the ks narayan reddy textbook of forensic medicine latest edition

Reading File
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Reading File
Reading File
Reading File
Finding Sources
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Finding Sources
I now have all the data needed from the textbook. Let me compile a comprehensive answer from all the sections read.
Here is the complete list of all BNS, BNSS, and BSA sections mentioned in K.S. Narayan Reddy's "The Essentials of Forensic Medicine and Toxicology," 36th Edition (2026), along with their corresponding old IPC/CrPC/IEA equivalents:

Overview of the Three New Laws

New LawFull NameAct No.Replaced
BNSBharatiya Nyaya SanhitaAct 45 of 2023Indian Penal Code (IPC), 1860
BNSSBharatiya Nagarika Suraksha SanhitaAct 46 of 2023Criminal Procedure Code (CrPC), 1973
BSABharatiya Sakshya AdhiniyamAct 47 of 2023Indian Evidence Act (IEA), 1872

BNS Sections

BNS SectionSubject/DescriptionOld IPC Equivalent
Section 2(24)Definition of "Offence"S. 40, IPC
Section 4Punishments authorized by law (death, life imprisonment, rigorous/simple imprisonment, fine)-
Section 72Printing/publishing identity of rape victim - imprisonment up to 2 yearsS. 228-A, IPC
Section 74Assault or criminal force to woman with intent to outrage modesty - imprisonment 1 to 5 yearsS. 354, IPC
Section 75Sexual harassment (physical contact, sexual advances, pornography) - imprisonment 1-3 years or fineS. 354-A, IPC
Section 76Assault/criminal force to disrobe a woman - imprisonment 3 to 7 yearsS. 354-B, IPC
Section 77VoyeurismS. 354-C, IPC
Section 79Insulting modesty of a woman by words, sounds, gestures - imprisonment up to 3 yearsS. 509, IPC
Section 81Cohabitation by deceitfully inducing belief of lawful marriage - imprisonment up to 10 yearsS. 493, IPC
Section 84Enticing or taking away a married woman with criminal intent - imprisonment up to 2 years or fineS. 498, IPC
Section 124Voluntarily causing grievous hurt by acid - imprisonment not less than 10 years, may extend to life; fine of ₹10 lakhS. 326-A, IPC
Section 124(2)Voluntarily throwing or attempting to throw acid - imprisonment 5 to 7 yearsS. 326-B, IPC
Section 144Trafficking of a minor for sexual exploitation - imprisonment not less than 5 years up to 7 yearsS. 370-A, IPC
Section 196Custody death/rape - mandatory magistrate inquest + autopsy when death/disappearance/rape occurs in police or court-authorized custodyS. 176(1A), CrPC
Sections 206-208Punishment for non-attendance in obedience to court summons - imprisonment up to 1 month or fine-
Section 208Non-attendance in obedience to court summons - imprisonment up to 1 month or fine-
Section 234Issuing or signing a false certificate - punishableS. 197, IPC
Section 296Obscene act in a public place - imprisonment up to 3 months or fineS. 294, IPC
Section 64 (clause a-m/n), Sub-section (2)Rape offences (referenced in BSA Section 120 for burden of proof)S. 376, IPC

BNSS Sections

BNSS SectionSubject/DescriptionOld CrPC Equivalent
Section 2(1)Definition of Cognizable and Noncognizable offences-
Section 2(n)Definition of OffenceS. 40, IPC
Section 18 & 19Public prosecutor examines witnesses in government prosecutionS. 24 & 25, CrPC
Section 35Arrest without warrant (noncognisable offence)S. 41, CrPC
Section 52Medical examination of victim of rape/attempted rape by a Registered Medical Practitioner (RMP)S. 53-A, CrPC
Sections 63-71Summons - issuance, service, and proceduresSs. 61-69, CrPC
Section 63Summons issued in writing, in duplicate, signed by presiding officerS. 61, CrPC
Section 64Service of summons on the witnessS. 62, CrPC
Section 68Summons to a government servant - sent to head of officeS. 66, CrPC
Section 90Warrant for securing presence of witness-
Section 94Production of documents (subpoena duces tectum)-
Sections 94 & 195Subpoena duces tectum - requiring witness to bring documentsS. 165, BSA
Section 173Cognisable offence - individual sent to doctor for medical examination-
Section 176Statement of rape/indecent assault victim to be recorded by woman police officer at victim's homeS. 157, CrPC
Section 180Statement of a woman against whom offence is committedS. 161, CrPC
Section 184Medical examination of rape victim - consent, report format, forwarding to magistrateS. 164-A, CrPC
Section 195Subpoena duces tectum-
Section 326Expert evidence - can be called without undue delay or unreasonable expense-
Section 328Reports of government scientific experts (Chemical Examiner etc.) as evidence-
Section 348Court may recall and re-examine any witness already examined-
Section 389Notice to witness who fails to attend court-
Sections 6 to 17Courts in India and their powers-

BSA Sections

BSA SectionSubject/DescriptionOld IEA Equivalent
Section 2Definition of "Fact"S. 3, IEA
Section 26Dying declaration - admissibility of statement by a deceased/unavailable person-
Section 39Expert witness opinion-
Section 54Facts (other than document contents) may be proved by oral evidenceS. 59, IEA
Section 55Oral evidence must be direct; expert opinion in treatiseS. 60, IEA
Sections 56 to 92Documentary evidence-
Section 56Primary and secondary evidence - document produced for inspection-
Section 60Oral evidence direct; Court may require production of material things (e.g., blood-stained weapon)S. 60, IEA
Section 94Subpoena duces tectum - compelling witness to bring documents-
Section 120Presumption as to absence of consent in rape (burden of proof shifts to accused in custodial rape/gang rape)S. 114-A, IEA
Section 124Competency of witnesses; mental capacity requirement-
Section 125Deaf-mute witness may testify by signs, writing, or interpreterS. 119, IEA
Section 142Examination-in-chief (direct examination) of witness-
Section 143Order of examination of witnesses-
Section 146Leading questions not allowed in examination-in-chief (except hostile witness)-
Section 155Hostile witness provisions-
Section 165Subpoena duces tectum - production of documents-
Section 168Court may recall and re-examine any already-examined witness for just decision-

Source: K.S. Narayan Reddy - The Essentials of Forensic Medicine and Toxicology, 36th Edition (2026), primarily from Chapter 1 (Legal Competencies, Medical Jurisprudence) and Chapter on Sexual Offences.
Note: The BNS, BNSS, and BSA came into force on 1 July 2024, replacing the IPC (1860), CrPC (1973), and Indian Evidence Act (1872) respectively. This 36th edition is the first edition to fully incorporate these three new laws throughout the text.

Create a comparison table of BNS vs old IPC sections for quick reference

Asking for Preferences
Reading File
Running Command

mkdir -p /tmp/workspace/bns-ipc-table && ls /tmp/workspace/bns-ipc-table/

Writing File

~/bns-ipc-table/generate_pdf.py

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

OUTPUT = "/tmp/workspace/bns-ipc-table/BNS_vs_IPC_Comparison.pdf"

doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=landscape(A4),
    rightMargin=1.5*cm,
    leftMargin=1.5*cm,
    topMargin=1.8*cm,
    bottomMargin=1.5*cm,
    title="BNS vs IPC – Forensic Medicine Quick Reference",
    author="KS Narayan Reddy 36th Edition"
)

styles = getSampleStyleSheet()

# Custom styles
title_style = ParagraphStyle(
    'Title',
    parent=styles['Normal'],
    fontSize=16,
    fontName='Helvetica-Bold',
    textColor=colors.HexColor('#1a237e'),
    alignment=TA_CENTER,
    spaceAfter=4,
)
subtitle_style = ParagraphStyle(
    'Subtitle',
    parent=styles['Normal'],
    fontSize=9,
    fontName='Helvetica',
    textColor=colors.HexColor('#555555'),
    alignment=TA_CENTER,
    spaceAfter=10,
)
section_header_style = ParagraphStyle(
    'SectionHeader',
    parent=styles['Normal'],
    fontSize=9,
    fontName='Helvetica-Bold',
    textColor=colors.white,
    alignment=TA_LEFT,
)
cell_style = ParagraphStyle(
    'Cell',
    parent=styles['Normal'],
    fontSize=8,
    fontName='Helvetica',
    leading=11,
    alignment=TA_LEFT,
)
cell_bold_style = ParagraphStyle(
    'CellBold',
    parent=styles['Normal'],
    fontSize=8,
    fontName='Helvetica-Bold',
    leading=11,
    alignment=TA_LEFT,
)
note_style = ParagraphStyle(
    'Note',
    parent=styles['Normal'],
    fontSize=7.5,
    fontName='Helvetica-Oblique',
    textColor=colors.HexColor('#444444'),
    alignment=TA_LEFT,
    spaceAfter=2,
)

# ─── DATA ────────────────────────────────────────────────────────────────────
# Each row: (BNS Section, Old IPC Section, Subject/Topic, Punishment/Key Points)

header_row = [
    Paragraph('<b>BNS Section\n(2023)</b>', ParagraphStyle('h', parent=styles['Normal'], fontSize=8.5, fontName='Helvetica-Bold', textColor=colors.white, alignment=TA_CENTER)),
    Paragraph('<b>Old IPC Section\n(1860)</b>', ParagraphStyle('h', parent=styles['Normal'], fontSize=8.5, fontName='Helvetica-Bold', textColor=colors.white, alignment=TA_CENTER)),
    Paragraph('<b>Subject / Topic</b>', ParagraphStyle('h', parent=styles['Normal'], fontSize=8.5, fontName='Helvetica-Bold', textColor=colors.white, alignment=TA_CENTER)),
    Paragraph('<b>Key Points / Punishment</b>', ParagraphStyle('h', parent=styles['Normal'], fontSize=8.5, fontName='Helvetica-Bold', textColor=colors.white, alignment=TA_CENTER)),
]

def row(bns, ipc, topic, key):
    return [
        Paragraph(bns, cell_bold_style),
        Paragraph(ipc, cell_style),
        Paragraph(topic, cell_style),
        Paragraph(key, cell_style),
    ]

data = [header_row]

# ── DEFINITIONS & GENERAL ─────────────────────────────────────────────────
data.append([
    Paragraph('DEFINITIONS & GENERAL', ParagraphStyle('cat', parent=styles['Normal'], fontSize=8, fontName='Helvetica-BoldOblique', textColor=colors.HexColor('#1a237e'), alignment=TA_LEFT)),
    '', '', ''
])
data += [
    row('S. 2(24)', 'S. 40', 'Definition of "Offence"',
        'Any act or omission made punishable by law; offences classified as bailable and non-bailable.'),
    row('S. 4', '—', 'Punishments authorised by law',
        'Death; imprisonment for life; rigorous imprisonment (with hard labour, including solitary confinement Ss. 11 & 12); simple imprisonment (S. 7); fine (S. 8(1)).'),
]

# ── SEXUAL OFFENCES ────────────────────────────────────────────────────────
data.append([
    Paragraph('SEXUAL OFFENCES', ParagraphStyle('cat', parent=styles['Normal'], fontSize=8, fontName='Helvetica-BoldOblique', textColor=colors.HexColor('#1a237e'), alignment=TA_LEFT)),
    '', '', ''
])
data += [
    row('S. 64 (clauses a–n, sub-s. 2)', 'S. 376',
        'Rape',
        'Penetration offences. BSA S. 120 shifts burden of proof to accused in custodial rape / gang rape if victim states absence of consent.'),
    row('S. 72', 'S. 228-A',
        'Publication of rape victim\'s identity',
        'Printing/publishing name or matter that discloses identity of rape victim → imprisonment up to 2 years.'),
    row('S. 74', 'S. 354',
        'Assault / criminal force to woman – outrage modesty',
        'Imprisonment not less than 1 year, may extend to 5 years + fine.'),
    row('S. 75', 'S. 354-A',
        'Sexual harassment',
        '(1) Physical contact with sexual overtures, (2) demand for sexual favours, (3) sexually coloured remarks, (4) showing pornography → imprisonment 1–3 years or fine or both.'),
    row('S. 76', 'S. 354-B',
        'Assault / criminal force to disrobe a woman',
        'Compelling a woman to be naked → imprisonment not less than 3 years, may extend to 7 years + fine.'),
    row('S. 77', 'S. 354-C',
        'Voyeurism',
        'Capturing or disseminating image of woman in private act.'),
    row('S. 79', 'S. 509',
        'Insulting modesty of woman – words, sounds, gestures',
        'Uttering offensive words/sounds/gestures; intruding on privacy → simple imprisonment up to 3 years + fine.'),
]

# ── MARRIAGE OFFENCES ──────────────────────────────────────────────────────
data.append([
    Paragraph('MARRIAGE & DOMESTIC OFFENCES', ParagraphStyle('cat', parent=styles['Normal'], fontSize=8, fontName='Helvetica-BoldOblique', textColor=colors.HexColor('#1a237e'), alignment=TA_LEFT)),
    '', '', ''
])
data += [
    row('S. 81', 'S. 493',
        'Cohabitation by deceit – inducing belief of lawful marriage',
        'Man deceitfully inducing a woman to believe a non-existent marriage → imprisonment up to 10 years.'),
    row('S. 84', 'S. 498',
        'Enticing / taking away a married woman',
        'Criminal intention to entice or detain a married woman → imprisonment up to 2 years or fine or both.'),
]

# ── ACID ATTACK ────────────────────────────────────────────────────────────
data.append([
    Paragraph('ACID ATTACKS', ParagraphStyle('cat', parent=styles['Normal'], fontSize=8, fontName='Helvetica-BoldOblique', textColor=colors.HexColor('#1a237e'), alignment=TA_LEFT)),
    '', '', ''
])
data += [
    row('S. 124', 'S. 326-A',
        'Voluntarily causing grievous hurt by acid',
        'Imprisonment not less than 10 years, may extend to life + fine of ₹10 lakh (payable to victim for medical expenses).'),
    row('S. 124(2)', 'S. 326-B',
        'Voluntarily throwing / attempting to throw acid',
        'Imprisonment not less than 5 years, may extend to 7 years + fine.'),
]

# ── TRAFFICKING ────────────────────────────────────────────────────────────
data.append([
    Paragraph('TRAFFICKING', ParagraphStyle('cat', parent=styles['Normal'], fontSize=8, fontName='Helvetica-BoldOblique', textColor=colors.HexColor('#1a237e'), alignment=TA_LEFT)),
    '', '', ''
])
data += [
    row('S. 144', 'S. 370-A',
        'Trafficking of a minor for sexual exploitation',
        'Knowingly engaging a trafficked minor for sexual exploitation → imprisonment not less than 5 years, may extend to 7 years + fine.'),
]

# ── CUSTODY DEATHS & INQUEST ───────────────────────────────────────────────
data.append([
    Paragraph('CUSTODY DEATHS & INQUEST', ParagraphStyle('cat', parent=styles['Normal'], fontSize=8, fontName='Helvetica-BoldOblique', textColor=colors.HexColor('#1a237e'), alignment=TA_LEFT)),
    '', '', ''
])
data += [
    row('S. 196', 'S. 176(1A) CrPC',
        'Death / disappearance / rape in police or court-authorized custody',
        'In addition to police inquest, a Judicial Magistrate inquest is mandatory; body to be sent for autopsy.'),
]

# ── COURT PROCESS & CONTEMPT ───────────────────────────────────────────────
data.append([
    Paragraph('COURT PROCESS & CONTEMPT', ParagraphStyle('cat', parent=styles['Normal'], fontSize=8, fontName='Helvetica-BoldOblique', textColor=colors.HexColor('#1a237e'), alignment=TA_LEFT)),
    '', '', ''
])
data += [
    row('Ss. 206–208', '—',
        'Non-attendance in obedience to court summons',
        'Willful non-appearance in court → imprisonment up to 1 month or fine or both.'),
    row('S. 208', '—',
        'Specific: Non-attendance (summons)',
        'Imprisonment up to 1 month or fine or both.'),
]

# ── PROFESSIONAL / MEDICAL ─────────────────────────────────────────────────
data.append([
    Paragraph('PROFESSIONAL / MEDICAL PRACTICE', ParagraphStyle('cat', parent=styles['Normal'], fontSize=8, fontName='Helvetica-BoldOblique', textColor=colors.HexColor('#1a237e'), alignment=TA_LEFT)),
    '', '', ''
])
data += [
    row('S. 234', 'S. 197',
        'Issuing or signing a false certificate',
        'Doctor issuing a false medical/death certificate → punishable under BNS.'),
]

# ── PUBLIC NUISANCE ────────────────────────────────────────────────────────
data.append([
    Paragraph('PUBLIC NUISANCE', ParagraphStyle('cat', parent=styles['Normal'], fontSize=8, fontName='Helvetica-BoldOblique', textColor=colors.HexColor('#1a237e'), alignment=TA_LEFT)),
    '', '', ''
])
data += [
    row('S. 296', 'S. 294',
        'Obscene act in a public place',
        '(a) Obscene act in public or (b) obscene songs/words near public place to the annoyance of others → imprisonment up to 3 months or fine or both.'),
]

# ─── COLUMN WIDTHS ───────────────────────────────────────────────────────────
page_w = landscape(A4)[0] - 3*cm   # usable width
col_widths = [
    page_w * 0.13,   # BNS Section
    page_w * 0.13,   # IPC Section
    page_w * 0.30,   # Topic
    page_w * 0.44,   # Key Points
]

# ─── TABLE STYLE ─────────────────────────────────────────────────────────────
HEADER_BG   = colors.HexColor('#1a237e')   # deep navy
CAT_BG      = colors.HexColor('#e8eaf6')   # light indigo tint
ODD_BG      = colors.HexColor('#ffffff')
EVEN_BG     = colors.HexColor('#f5f5ff')
GRID_COLOR  = colors.HexColor('#c5cae9')

table_style_cmds = [
    # Global
    ('FONTNAME',    (0,0), (-1,-1), 'Helvetica'),
    ('FONTSIZE',    (0,0), (-1,-1), 8),
    ('VALIGN',      (0,0), (-1,-1), 'TOP'),
    ('LEFTPADDING', (0,0), (-1,-1), 5),
    ('RIGHTPADDING',(0,0), (-1,-1), 5),
    ('TOPPADDING',  (0,0), (-1,-1), 4),
    ('BOTTOMPADDING',(0,0), (-1,-1), 4),
    ('GRID',        (0,0), (-1,-1), 0.4, GRID_COLOR),
    ('ROWBACKGROUNDS', (0,0), (-1,-1), [ODD_BG, EVEN_BG]),

    # Header row
    ('BACKGROUND', (0,0), (-1,0), HEADER_BG),
    ('FONTNAME',   (0,0), (-1,0), 'Helvetica-Bold'),
    ('FONTSIZE',   (0,0), (-1,0), 8.5),
    ('ALIGN',      (0,0), (-1,0), 'CENTER'),
    ('VALIGN',     (0,0), (-1,0), 'MIDDLE'),
    ('TOPPADDING', (0,0), (-1,0), 6),
    ('BOTTOMPADDING', (0,0), (-1,0), 6),
]

# Category separator rows
cat_rows = []
current_row = 1
for i, d in enumerate(data):
    if i == 0:
        continue
    # detect category rows: col 1-3 are empty strings
    if d[1] == '' and d[2] == '' and d[3] == '':
        cat_rows.append(current_row)
    current_row += 1

for r in cat_rows:
    table_style_cmds += [
        ('BACKGROUND',   (0,r), (-1,r), CAT_BG),
        ('SPAN',         (0,r), (-1,r)),
        ('TOPPADDING',   (0,r), (-1,r), 3),
        ('BOTTOMPADDING',(0,r), (-1,r), 3),
        ('LINEABOVE',    (0,r), (-1,r), 1.0, colors.HexColor('#7986cb')),
    ]

table = Table(data, colWidths=col_widths, repeatRows=1)
table.setStyle(TableStyle(table_style_cmds))

# ─── BUILD ────────────────────────────────────────────────────────────────────
elements = []

elements.append(Paragraph("BNS vs IPC — Forensic Medicine Quick Reference", title_style))
elements.append(Paragraph(
    "Bharatiya Nyaya Sanhita (BNS), Act 45 of 2023  |  Replaces: Indian Penal Code (IPC), 1860  |  "
    "Source: KS Narayan Reddy's Essentials of Forensic Medicine &amp; Toxicology, 36th Edition (2026)",
    subtitle_style))
elements.append(HRFlowable(width="100%", thickness=1.5, color=colors.HexColor('#1a237e'), spaceAfter=8))
elements.append(table)
elements.append(Spacer(1, 8))
elements.append(Paragraph(
    "Note: BNS, BNSS (replaces CrPC) and BSA (replaces IEA) came into force on 1 July 2024. "
    "Sections without an IPC equivalent are new provisions introduced by the BNS.",
    note_style))

doc.build(elements)
print(f"PDF saved to: {OUTPUT}")
Running Command

cd /tmp/workspace/bns-ipc-table && python generate_pdf.py

Your PDF is ready:

BNS vs IPC Comparison

PDF Document · PDF


What's inside the table (landscape A4, colour-coded):
The table is organised into 8 thematic categories with a deep navy header and alternating row shading for easy reading:
CategoryBNS Sections Covered
Definitions & GeneralS. 2(24), S. 4
Sexual OffencesS. 64, 72, 74, 75, 76, 77, 79
Marriage & Domestic OffencesS. 81, 84
Acid AttacksS. 124, 124(2)
TraffickingS. 144
Custody Deaths & InquestS. 196
Court Process & ContemptSs. 206-208
Professional / Medical PracticeS. 234
Public NuisanceS. 296
Each row shows: BNS Section → Old IPC Section → Topic → Punishment/Key Points, all drawn directly from KS Narayan Reddy 36th Edition (2026).

Create a similar table for BNSS vs CrPC procedural sections

Writing File

~/bns-ipc-table/generate_bnss_pdf.py

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

OUTPUT = "/tmp/workspace/bns-ipc-table/BNSS_vs_CrPC_Comparison.pdf"

doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=landscape(A4),
    rightMargin=1.5*cm,
    leftMargin=1.5*cm,
    topMargin=1.8*cm,
    bottomMargin=1.5*cm,
    title="BNSS vs CrPC – Forensic Medicine Quick Reference",
    author="KS Narayan Reddy 36th Edition"
)

styles = getSampleStyleSheet()

title_style = ParagraphStyle(
    'Title', parent=styles['Normal'],
    fontSize=16, fontName='Helvetica-Bold',
    textColor=colors.HexColor('#1b5e20'),
    alignment=TA_CENTER, spaceAfter=4,
)
subtitle_style = ParagraphStyle(
    'Subtitle', parent=styles['Normal'],
    fontSize=9, fontName='Helvetica',
    textColor=colors.HexColor('#555555'),
    alignment=TA_CENTER, spaceAfter=10,
)
cell_style = ParagraphStyle(
    'Cell', parent=styles['Normal'],
    fontSize=8, fontName='Helvetica',
    leading=11, alignment=TA_LEFT,
)
cell_bold_style = ParagraphStyle(
    'CellBold', parent=styles['Normal'],
    fontSize=8, fontName='Helvetica-Bold',
    leading=11, alignment=TA_LEFT,
)
note_style = ParagraphStyle(
    'Note', parent=styles['Normal'],
    fontSize=7.5, fontName='Helvetica-Oblique',
    textColor=colors.HexColor('#444444'),
    alignment=TA_LEFT, spaceAfter=2,
)
cat_label_style = ParagraphStyle(
    'CatLabel', parent=styles['Normal'],
    fontSize=8, fontName='Helvetica-BoldOblique',
    textColor=colors.HexColor('#1b5e20'),
    alignment=TA_LEFT,
)

# ─── HEADER ──────────────────────────────────────────────────────────────────
hdr_para = ParagraphStyle(
    'Hdr', parent=styles['Normal'],
    fontSize=8.5, fontName='Helvetica-Bold',
    textColor=colors.white, alignment=TA_CENTER,
)

def hdr(txt):
    return Paragraph(txt, hdr_para)

def row(bnss, crpc, topic, key):
    return [
        Paragraph(bnss, cell_bold_style),
        Paragraph(crpc, cell_style),
        Paragraph(topic, cell_style),
        Paragraph(key, cell_style),
    ]

def cat(label):
    return [Paragraph(label, cat_label_style), '', '', '']

# ─── DATA ────────────────────────────────────────────────────────────────────
header_row = [
    hdr('BNSS Section\n(2023)'),
    hdr('Old CrPC Section\n(1973)'),
    hdr('Subject / Topic'),
    hdr('Key Points / Procedural Details'),
]

data = [header_row]

# ── 1. DEFINITIONS ────────────────────────────────────────────────────────────
data.append(cat('DEFINITIONS'))
data += [
    row('S. 2(1)',  '—',
        'Cognizable & Noncognizable offence (defined)',
        'Cognizable offence: police can arrest without warrant (e.g. rape, murder, dowry death, sex offences, robbery, ragging, negligent death). '
        'Noncognizable offence: arrest only with magistrate warrant.'),
    row('S. 2(n)',  'S. 40, IPC',
        'Definition of "Offence"',
        'Any act or omission made punishable by law. [Cross-referenced with BNS S. 2(24)]'),
]

# ── 2. COURTS ─────────────────────────────────────────────────────────────────
data.append(cat('COURTS OF LAW'))
data += [
    row('Ss. 6–17', '—',
        'Courts in India and their powers',
        'Hierarchy: Supreme Court → High Court → Sessions Court → Magistrate\'s Court → Labour Court → Family Court → '
        'Executive Magistrate Court → Juvenile Justice Board.'),
]

# ── 3. ARREST ─────────────────────────────────────────────────────────────────
data.append(cat('ARREST'))
data += [
    row('S. 35',   'S. 41, CrPC',
        'Arrest without warrant – noncognizable offence',
        'In noncognizable offences, accused cannot be arrested without a warrant issued by the magistrate. '
        'Injured person may go directly to the doctor or file an affidavit before a magistrate who sends him for examination.'),
    row('S. 173',  '—',
        'Cognizable offence – medical examination by police',
        'Individual accused in a cognizable offence is sent by police to a doctor for medical examination and report.'),
]

# ── 4. SUMMONS ────────────────────────────────────────────────────────────────
data.append(cat('SUMMONS (SUBPOENA)'))
data += [
    row('Ss. 63–71', 'Ss. 61–69, CrPC',
        'Summons – issuance, service, and procedures',
        'General provisions governing summons to witnesses and accused persons.'),
    row('S. 63',   'S. 61, CrPC',
        'Issue of summons',
        'Issued in writing, in duplicate, signed by presiding officer of the court, bearing court seal. '
        'Crime number and name of accused mentioned.'),
    row('S. 64',   'S. 62, CrPC',
        'Service of summons on the witness',
        'Served by police officer, court officer or public servant; recipient signs receipt on back of duplicate copy. '
        'Can also be served by registered post or affixed on conspicuous part of residence.'),
    row('S. 68',   'S. 66, CrPC',
        'Summons to a government servant',
        'Court sends summons in duplicate to head of office; head serves it on the individual and returns it to court with endorsement.'),
    row('S. 90',   '—',
        'Bailable/non-bailable warrant to secure presence of witness',
        'Court may issue warrant if witness wilfully neglects to attend after hearing under S. 389.'),
    row('S. 94',   '—',
        'Subpoena duces tectum – witness to produce documents',
        'Requires witness to bring books, documents or things under his control that he is legally bound to produce. '
        '[Also cross-referenced: BSA S. 165]'),
    row('S. 389',  '—',
        'Notice to witness who fails to attend court',
        'If witness neglects attendance without justification after notice, court may sentence to fine or imprisonment, '
        'or issue bailable/non-bailable warrant.'),
]

# ── 5. PROSECUTION & PUBLIC PROSECUTOR ────────────────────────────────────────
data.append(cat('PROSECUTION & PUBLIC PROSECUTOR'))
data += [
    row('Ss. 18 & 19', 'Ss. 24 & 25, CrPC',
        'Public Prosecutor – appointment and role',
        'In government prosecution cases, public prosecutor first examines the witness (examination-in-chief). '
        'Distinction between Public Prosecutor (Sessions Court) and Assistant Public Prosecutor (Magistrate\'s Court).'),
]

# ── 6. INVESTIGATION ──────────────────────────────────────────────────────────
data.append(cat('INVESTIGATION'))
data += [
    row('S. 52',   'S. 53-A, CrPC',
        'Medical examination of accused in rape / attempted rape',
        'Examination by a Registered Medical Practitioner (RMP) employed in a government or local authority hospital. '
        'In absence, any RMP, with consent. Woman to be sent to RMP within 24 hours.'),
    row('S. 176',  'S. 157, CrPC',
        'Recording victim\'s statement – rape / indecent assault',
        'Statement of rape/indecent assault victim to be recorded by a woman police officer at victim\'s residence '
        'or place of her choice, in presence of parents or guardians.'),
    row('S. 180',  'S. 161, CrPC',
        'Statement of woman against whom sexual offence committed',
        'Statement of a woman against whom an offence under BNS S. 376-A to E and S. 509 IPC has been alleged.'),
    row('S. 184',  'S. 164-A, CrPC',
        'Medical examination of rape victim – detailed procedure',
        '(1) RMP to examine without delay; prepare report with: name, age, address, who brought her, injuries, '
        'mental condition, all materials taken for investigation. (2) Report must state reasons for each conclusion. '
        '(3) Record that consent was obtained. (4) Note exact time of start and end of examination. '
        '(5) Forward report to investigating officer → forwarded to magistrate. (6) Examination without consent is unlawful.'),
    row('S. 195',  '—',
        'Subpoena duces tectum (in investigation context)',
        'Compelling production of documents / things during investigation.'),
]

# ── 7. EXPERT EVIDENCE ────────────────────────────────────────────────────────
data.append(cat('EXPERT EVIDENCE & SCIENTIFIC REPORTS'))
data += [
    row('S. 326',  '—',
        'Expert witness – can be called without undue delay or expense',
        'Witness can be called to give oral evidence without unreasonable expense or delay. '
        '[Cross-ref: BSA S. 55 / IEA S. 60]'),
    row('S. 328',  '—',
        'Reports of government scientific experts as evidence',
        'Written reports of government scientific experts (Chemical Examiner, Serologist, DNA analyst, etc.) '
        'are admissible as evidence without the expert needing to appear in person unless the court directs otherwise.'),
]

# ── 8. TRIAL PROCEDURE ────────────────────────────────────────────────────────
data.append(cat('TRIAL PROCEDURE'))
data += [
    row('S. 348',  '—',
        'Recall and re-examination of witness by court',
        'Court is empowered to recall and re-examine any witness already examined if his evidence is essential '
        'to the just decision of the case. [Cross-ref: BSA S. 168]'),
]

# ─── COLUMN WIDTHS ───────────────────────────────────────────────────────────
page_w = landscape(A4)[0] - 3*cm
col_widths = [
    page_w * 0.13,
    page_w * 0.13,
    page_w * 0.28,
    page_w * 0.46,
]

# ─── TABLE STYLE ─────────────────────────────────────────────────────────────
HEADER_BG  = colors.HexColor('#1b5e20')   # deep green
CAT_BG     = colors.HexColor('#e8f5e9')   # light green tint
ODD_BG     = colors.HexColor('#ffffff')
EVEN_BG    = colors.HexColor('#f1f8f1')
GRID_COLOR = colors.HexColor('#a5d6a7')

table_style_cmds = [
    ('FONTNAME',    (0,0), (-1,-1), 'Helvetica'),
    ('FONTSIZE',    (0,0), (-1,-1), 8),
    ('VALIGN',      (0,0), (-1,-1), 'TOP'),
    ('LEFTPADDING', (0,0), (-1,-1), 5),
    ('RIGHTPADDING',(0,0), (-1,-1), 5),
    ('TOPPADDING',  (0,0), (-1,-1), 4),
    ('BOTTOMPADDING',(0,0), (-1,-1), 4),
    ('GRID',        (0,0), (-1,-1), 0.4, GRID_COLOR),
    ('ROWBACKGROUNDS', (0,0), (-1,-1), [ODD_BG, EVEN_BG]),
    # Header
    ('BACKGROUND',    (0,0), (-1,0), HEADER_BG),
    ('FONTNAME',      (0,0), (-1,0), 'Helvetica-Bold'),
    ('FONTSIZE',      (0,0), (-1,0), 8.5),
    ('ALIGN',         (0,0), (-1,0), 'CENTER'),
    ('VALIGN',        (0,0), (-1,0), 'MIDDLE'),
    ('TOPPADDING',    (0,0), (-1,0), 6),
    ('BOTTOMPADDING', (0,0), (-1,0), 6),
]

# Identify and style category rows
cat_row_indices = []
for i, d in enumerate(data):
    if i == 0:
        continue
    if d[1] == '' and d[2] == '' and d[3] == '':
        cat_row_indices.append(i)

for r in cat_row_indices:
    table_style_cmds += [
        ('BACKGROUND',    (0,r), (-1,r), CAT_BG),
        ('SPAN',          (0,r), (-1,r)),
        ('TOPPADDING',    (0,r), (-1,r), 3),
        ('BOTTOMPADDING', (0,r), (-1,r), 3),
        ('LINEABOVE',     (0,r), (-1,r), 1.0, colors.HexColor('#66bb6a')),
    ]

table = Table(data, colWidths=col_widths, repeatRows=1)
table.setStyle(TableStyle(table_style_cmds))

# ─── BUILD ────────────────────────────────────────────────────────────────────
elements = []

elements.append(Paragraph(
    "BNSS vs CrPC — Forensic Medicine Procedural Quick Reference", title_style))
elements.append(Paragraph(
    "Bharatiya Nagarika Suraksha Sanhita (BNSS), Act 46 of 2023  |  Replaces: Code of Criminal Procedure (CrPC), 1973  |  "
    "Source: KS Narayan Reddy's Essentials of Forensic Medicine &amp; Toxicology, 36th Edition (2026)",
    subtitle_style))
elements.append(HRFlowable(
    width="100%", thickness=1.5,
    color=colors.HexColor('#1b5e20'), spaceAfter=8))
elements.append(table)
elements.append(Spacer(1, 8))
elements.append(Paragraph(
    "Note: BNSS (replaces CrPC), BNS (replaces IPC), and BSA (replaces IEA) all came into force on 1 July 2024. "
    "Sections without a CrPC equivalent are new provisions introduced by the BNSS. "
    "For BSA vs IEA comparison, refer to the companion table.",
    note_style))

doc.build(elements)
print(f"PDF saved to: {OUTPUT}")
Running Command

cd /tmp/workspace/bns-ipc-table && python generate_bnss_pdf.py

Your PDF is ready:

BNSS vs CrPC Comparison

PDF Document · PDF


What's inside — 8 thematic categories (deep green colour scheme, landscape A4):
CategoryBNSS Sections Covered
DefinitionsS. 2(1), S. 2(n)
Courts of LawSs. 6–17
ArrestS. 35, S. 173
Summons (Subpoena)Ss. 63–71, 63, 64, 68, 90, 94, 389
Prosecution & Public ProsecutorSs. 18 & 19
InvestigationS. 52, 176, 180, 184, 195
Expert Evidence & Scientific ReportsS. 326, 328
Trial ProcedureS. 348
The most detailed section is S. 184 (medical examination of rape victim) which spells out all 6 procedural requirements a doctor must follow - the most clinically important BNSS provision for forensic practitioners. All data sourced directly from KS Narayan Reddy 36th Edition (2026).

Arrange all the sections chapter wise

Finding Sources
Finding Sources
Reading File
Finding Sources
Reading File
Reading File
Finding Sources
Reading File
Reading File
Finding Sources
Finding Sources
Reading File
Finding Sources
Reading File
Finding Sources
Writing File

~/bns-ipc-table/generate_chapterwise.py

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

OUTPUT = "/tmp/workspace/bns-ipc-table/ChapterWise_BNS_BNSS_BSA.pdf"

doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=landscape(A4),
    rightMargin=1.5*cm, leftMargin=1.5*cm,
    topMargin=1.8*cm, bottomMargin=1.5*cm,
    title="Chapter-wise BNS / BNSS / BSA – KS Narayan Reddy 36th Ed.",
    author="KS Narayan Reddy 36th Edition (2026)"
)

styles = getSampleStyleSheet()

# ── Styles ────────────────────────────────────────────────────────────────────
def ps(name, **kw):
    return ParagraphStyle(name, parent=styles['Normal'], **kw)

title_s   = ps('T',  fontSize=16, fontName='Helvetica-Bold', textColor=colors.HexColor('#37474f'), alignment=TA_CENTER, spaceAfter=3)
sub_s     = ps('S',  fontSize=8.5, fontName='Helvetica', textColor=colors.HexColor('#555'), alignment=TA_CENTER, spaceAfter=10)
ch_s      = ps('CH', fontSize=12, fontName='Helvetica-Bold', textColor=colors.white, alignment=TA_LEFT)
hdr_s     = ps('H',  fontSize=8.5, fontName='Helvetica-Bold', textColor=colors.white, alignment=TA_CENTER)
cell_s    = ps('C',  fontSize=8,  fontName='Helvetica', leading=11, alignment=TA_LEFT)
bold_s    = ps('B',  fontSize=8,  fontName='Helvetica-Bold', leading=11, alignment=TA_LEFT)
law_bns   = ps('LB', fontSize=8,  fontName='Helvetica-Bold', textColor=colors.HexColor('#1a237e'), leading=11, alignment=TA_LEFT)
law_bnss  = ps('LN', fontSize=8,  fontName='Helvetica-Bold', textColor=colors.HexColor('#1b5e20'), leading=11, alignment=TA_LEFT)
law_bsa   = ps('LS', fontSize=8,  fontName='Helvetica-Bold', textColor=colors.HexColor('#4a148c'), leading=11, alignment=TA_LEFT)
note_s    = ps('N',  fontSize=7.5, fontName='Helvetica-Oblique', textColor=colors.HexColor('#444'), alignment=TA_LEFT, spaceAfter=2)

# Color palette
BNS_COL   = colors.HexColor('#1a237e')   # navy
BNSS_COL  = colors.HexColor('#1b5e20')   # dark green
BSA_COL   = colors.HexColor('#4a148c')   # dark purple
ODD_BG    = colors.HexColor('#ffffff')
EVEN_BG   = colors.HexColor('#f8f9ff')
GRID_C    = colors.HexColor('#cfd8dc')

def hdr(txt): return Paragraph(txt, hdr_s)

def row(law_type, sec, old, topic, details):
    law_styles = {'BNS': law_bns, 'BNSS': law_bnss, 'BSA': law_bsa}
    law_colors = {'BNS': colors.HexColor('#e8eaf6'), 'BNSS': colors.HexColor('#e8f5e9'), 'BSA': colors.HexColor('#f3e5f5')}
    return [
        Paragraph(law_type, law_styles.get(law_type, bold_s)),
        Paragraph(sec,  bold_s),
        Paragraph(old,  cell_s),
        Paragraph(topic, cell_s),
        Paragraph(details, cell_s),
    ], law_colors.get(law_type, ODD_BG)

HEADER_ROW = [hdr('Law'), hdr('New Section\n(2023)'), hdr('Old Section'), hdr('Topic / Subject'), hdr('Key Points / Punishment')]

PAGE_W = landscape(A4)[0] - 3*cm
COL_W  = [PAGE_W*0.07, PAGE_W*0.11, PAGE_W*0.13, PAGE_W*0.26, PAGE_W*0.43]

def make_table(rows_data):
    """rows_data = list of (row_cells, row_bg_color)"""
    table_data = [HEADER_ROW]
    row_colors = [None]  # header handled separately
    for cells, bg in rows_data:
        table_data.append(cells)
        row_colors.append(bg)

    cmds = [
        ('FONTNAME',      (0,0), (-1,-1), 'Helvetica'),
        ('FONTSIZE',      (0,0), (-1,-1), 8),
        ('VALIGN',        (0,0), (-1,-1), 'TOP'),
        ('LEFTPADDING',   (0,0), (-1,-1), 5),
        ('RIGHTPADDING',  (0,0), (-1,-1), 5),
        ('TOPPADDING',    (0,0), (-1,-1), 4),
        ('BOTTOMPADDING', (0,0), (-1,-1), 4),
        ('GRID',          (0,0), (-1,-1), 0.4, GRID_C),
        # header row
        ('BACKGROUND',    (0,0), (-1,0), colors.HexColor('#37474f')),
        ('FONTNAME',      (0,0), (-1,0), 'Helvetica-Bold'),
        ('ALIGN',         (0,0), (-1,0), 'CENTER'),
        ('VALIGN',        (0,0), (-1,0), 'MIDDLE'),
        ('TOPPADDING',    (0,0), (-1,0), 6),
        ('BOTTOMPADDING', (0,0), (-1,0), 6),
    ]
    for i, bg in enumerate(row_colors):
        if bg is not None and i > 0:
            cmds.append(('BACKGROUND', (0,i), (-1,i), bg))

    t = Table(table_data, colWidths=COL_W, repeatRows=1)
    t.setStyle(TableStyle(cmds))
    return t

def ch_banner(ch_num, ch_title, pages, color):
    data = [[Paragraph(f"<b>CHAPTER {ch_num}</b>  {ch_title}   <i>(pp. {pages})</i>", ch_s)]]
    t = Table(data, colWidths=[sum(COL_W)])
    t.setStyle(TableStyle([
        ('BACKGROUND',    (0,0), (-1,-1), color),
        ('TOPPADDING',    (0,0), (-1,-1), 7),
        ('BOTTOMPADDING', (0,0), (-1,-1), 7),
        ('LEFTPADDING',   (0,0), (-1,-1), 10),
    ]))
    return t

# ═══════════════════════════════════════════════════════════════════════════════
# DATA  (chapter → rows)
# ═══════════════════════════════════════════════════════════════════════════════

# ── CHAPTER 1 – Medical Jurisprudence & Legal Medicine (pp.17-109) ─────────────
ch1_rows = [
    row('BNS',  'S. 2(24)',       'S. 40, IPC',       'Definition of "Offence"',
        'Any act or omission made punishable by law. Offences classified as bailable and non-bailable.'),
    row('BNSS', 'S. 2(1)',        '—',                 'Cognizable & Noncognizable offence',
        'Cognizable: police can arrest without warrant (rape, murder, dowry death, sex offences, robbery, ragging, negligent death). '
        'Noncognizable: arrest only with magistrate warrant.'),
    row('BNSS', 'S. 2(n)',        'S. 40, IPC',        'Definition of "Offence" (BNSS)',
        'Offence defined in BNSS; cross-referenced with BNS S. 2(24).'),
    row('BNS',  'S. 4',           '—',                 'Punishments authorised by law',
        'Death; life imprisonment; rigorous imprisonment (Ss. 11 & 12); simple imprisonment (S. 7); fine (S. 8(1)).'),
    row('BNSS', 'Ss. 6–17',       '—',                 'Courts in India – constitution & powers',
        'Hierarchy: Supreme Court → High Court → Sessions Court → Magistrate Court → Labour / Family / Executive Magistrate / Juvenile Justice Board.'),
    row('BNSS', 'S. 35',          'S. 41, CrPC',       'Arrest without warrant – noncognizable offence',
        'Injured person may go directly to doctor or file affidavit before magistrate who sends him for examination.'),
    row('BNSS', 'S. 63',          'S. 61, CrPC',       'Issue of summons',
        'Issued in writing, in duplicate, signed by presiding officer, with court seal. Crime number and name of accused mentioned.'),
    row('BNSS', 'Ss. 63–71',      'Ss. 61–69, CrPC',   'Summons – general provisions',
        'All provisions governing issuance, service, and compliance of summons to witnesses and accused.'),
    row('BNSS', 'S. 64',          'S. 62, CrPC',       'Service of summons',
        'Served by police officer / court officer / public servant; recipient signs receipt on back of duplicate. '
        'Can be served by registered post or affixed on house.'),
    row('BNSS', 'S. 68',          'S. 66, CrPC',       'Summons to a government servant',
        'Court sends summons in duplicate to head of office; head serves it and returns to court with endorsement.'),
    row('BNSS', 'S. 90',          '—',                 'Warrant to secure presence of witness',
        'Bailable or non-bailable warrant issued if witness wilfully neglects attendance [after notice under S. 389].'),
    row('BNSS', 'S. 94',          '—',                 'Subpoena duces tectum – produce documents',
        'Requires witness to bring books, documents or things under his control legally bound to produce. [BSA S. 165]'),
    row('BNS',  'Ss. 206–208',    '—',                 'Non-attendance in obedience to court summons',
        'Wilful non-appearance in court → imprisonment up to 1 month or fine or both.'),
    row('BNSS', 'Ss. 18 & 19',    'Ss. 24 & 25, CrPC', 'Public Prosecutor – appointment & role',
        'In govt. prosecution, public prosecutor first examines witness (examination-in-chief). '
        'Distinct from Assistant PP (Magistrate\'s Court).'),
    row('BNSS', 'S. 173',         '—',                 'Cognizable offence – medical examination by police',
        'Accused in a cognizable offence is sent by police to a doctor for medical examination and report.'),
    row('BNSS', 'S. 194',         'S. 174, CrPC',      'Police Inquest',
        'Officer-in-charge (SI, not below head constable) conducts police inquest in cases of suicide, murder, accident, '
        'suspicious/unnatural death, unidentified bodies, etc.'),
    row('BNSS', 'S. 195',         'S. 175, CrPC',      'Police inquest – investigation report',
        'Police officer makes investigation in presence of two+ respectable persons (panchas) and prepares inquest report.'),
    row('BNSS', 'S. 196',         'S. 176, CrPC',      'Magistrate Inquest',
        'Magistrate inquest held: (a) custodial deaths/rape, (b) deaths in psychiatric facility, '
        '(c) unnatural deaths as specified. Body sent for autopsy. [See also BNS S. 196 / old S. 176(1A)]'),
    row('BSA',  'S. 2',           'S. 3, IEA',         'Definition of "Fact"',
        'Fact = anything perceptible by the senses, or any mental condition of which a person is conscious.'),
    row('BSA',  'S. 26(1)',        'S. 32, IEA',        'Dying declaration (Leterm mortem)',
        'Statement of a person who is dead, cannot be found, incapable of giving evidence, or attendance cannot be procured → admissible as evidence.'),
    row('BSA',  'Ss. 56–92',      '—',                 'Documentary evidence – general provisions',
        'Contents of documents may be proved by primary or secondary evidence.'),
    row('BSA',  'S. 56',          '—',                 'Primary & secondary evidence',
        'Primary evidence = document itself produced for inspection. Secondary = copy, oral account, etc. [S. 58 BSA]'),
    row('BSA',  'S. 54',          'S. 59, IEA',        'Oral evidence – general',
        'All facts (except document contents) may be proved by oral evidence.'),
    row('BSA',  'S. 55',          'S. 60, IEA',        'Oral evidence must be direct',
        'Must be from person who saw / heard / perceived the fact. Court may require production of material thing (e.g. blood-stained weapon). '
        'Expert opinion in treatise admitted if author dead/unavailable.'),
    row('BSA',  'S. 60',          'S. 60, IEA',        'Oral evidence – material things',
        'Court may require production of blood-stained weapon, poison eliminated, article of clothing, etc.'),
    row('BSA',  'Ss. 139–124',    '—',                 'Witnesses – general provisions',
        'All persons competent to testify unless prevented by tender years, extreme old age, or disease.'),
    row('BSA',  'S. 39',          '—',                 'Expert witness',
        'A trained / skilled person in technical or scientific subject capable of drawing opinions: doctor, firearms expert, '
        'fingerprints expert, handwriting expert, etc.'),
    row('BSA',  'Ss. 143–162',    '—',                 'Evidence recording procedure',
        'Governs oath, affirmation, and recording of witness evidence in court.'),
    row('BSA',  'S. 142',         '—',                 'Examination-in-Chief (Direct Examination)',
        'First examination of a witness by the lawyer for the side which summoned him. Leading questions not allowed except for hostile witness.'),
    row('BSA',  'S. 143',         '—',                 'Order of examination of witnesses',
        'Examination-in-chief → Cross-examination → Re-examination.'),
    row('BSA',  'S. 146',         '—',                 'Leading questions',
        'Suggests the desired answer to the witness. Not allowed in examination-in-chief; allowed in cross-examination. [Also S. 155 BSA]'),
    row('BSA',  'S. 149',         '—',                 'Cross-examination – purpose',
        'To test veracity; to contradict statements; to modify/explain what was said; to shake credit. '
        'Witness not obliged to answer questions that incriminate himself.'),
    row('BSA',  'S. 151',         '—',                 'Character of witness – attack in cross-examination',
        'Lawyer may attack character of witness; witness may be asked about bias or prior inconsistent statements.'),
    row('BSA',  'S. 155',         '—',                 'Hostile witness',
        'Leading questions allowed when judge satisfied that witness is hostile.'),
    row('BSA',  'S. 162',         '—',                 'Refreshing memory',
        'Expert may refresh memory by reference to professional treatises. A writing used to refresh memory may be produced.'),
    row('BSA',  'S. 165',         '—',                 'Subpoena duces tectum – produce documents',
        'Court can compel production of documents by subpoena. [Also BNSS Ss. 94 & 195]'),
    row('BSA',  'S. 168',         '—',                 'Recall and re-examination of witness',
        'Court may recall and re-examine any already-examined witness if essential to just decision. [BNSS S. 348]'),
    row('BNSS', 'S. 326',         '—',                 'Expert witness called without undue delay/expense',
        'Witness can be called to give oral evidence without unreasonable delay or expense.'),
    row('BNSS', 'S. 328',         '—',                 'Govt. scientific expert reports as evidence',
        'Written reports of Chemical Examiner, Serologist, DNA analyst, etc. admissible without expert appearing in person unless court directs.'),
    row('BNSS', 'S. 329',         '—',                 'Right to demand expert summons',
        'Party has right to demand the court to summon and examine any such government scientific expert.'),
    row('BNSS', 'S. 348',         '—',                 'Recall and re-examination of witness',
        'Court empowered to recall and re-examine any witness whose evidence is essential to the just decision. [BSA S. 168]'),
    row('BNSS', 'S. 383',         '—',                 'Perjury',
        'Giving false evidence [BSA Ss. 227 & 228, BNS]. Person is said to give false evidence when statement is intentionally false.'),
    row('BNS',  'Ss. 227 & 228',  '—',                 'Giving / fabricating false evidence (Perjury)',
        'BNS S. 227: giving false evidence. S. 228: fabricating false evidence. [BNSS S. 383]'),
    row('BNSS', 'S. 389',         '—',                 'Notice to witness – failure to attend court',
        'After hearing witness, if neglect without justification → fine, imprisonment, or bailable/non-bailable warrant.'),
    row('BNSS', 'S. 407',         '—',                 'Death sentence – confirmation by High Court',
        'When Sessions Court passes death sentence, proceedings submitted to High Court for confirmation.'),
    row('BNSS', 'S. 255',         '—',                 'Acquittal order',
        'If court finds no prima facie case, passes order of acquittal.'),
    row('BNSS', 'S. 180',         'S. 161, CrPC',      'Statement during investigation – answer in writing',
        'If questions cannot be answered verbally during investigation, answers given in writing.'),
    row('BNSS', 'S. 214',         '—',                 'Refusal to answer questions – punishment',
        'Refusal to answer investigator\'s questions → imprisonment up to 6 months.'),
    row('BSA',  'S. 124',         'S. 118, IEA',       'Competency of witness – mental capacity',
        'All persons competent unless unable to understand questions / give rational answers due to age, old age, or disease.'),
    row('BSA',  'S. 125',         'S. 119, IEA',       'Deaf-mute witness',
        'May testify by signs, writing, or through an interpreter.'),
    row('BSA',  'Ss. 132(1)/(2), 134', '—',            'Lawyer–client privilege',
        'Lawyer can claim privilege in court with regard to communications made to him by his client.'),
]

# ── CHAPTER 2 – Post-Mortem / Identification (pp.110-208) ──────────────────────
ch2_rows = [
    row('BNS',  'S. 301',         '—',                 'Indignity to a corpse',
        'Trespassing on burial ground with intent to wound feelings / insult religion → imprisonment up to 1 year or fine or both.'),
    row('BNSS', 'S. 196(4)',      '—',                 'Exhumation order',
        'Order for exhumation granted by Executive or Judicial Magistrate.'),
    row('BNSS', 'S. 196(5)',      '—',                 'Exhumation – witness presence',
        'Relatives or interested persons to be present at the exhumation enquiry.'),
    row('BSA',  'S. 110',         'S. 107, IEA',       'Presumption of life or death',
        'A person is presumed to be alive if evidence exists of their being alive within 30 years. '
        'Person not heard of for 7 years by those likely to know → presumed dead.'),
]

# ── CHAPTER 3 – Medical Ethics / Negligence / Consent (pp. within block 1) ─────
ch3_rows = [
    row('BNS',  'S. 2(11)',       '—',                 'Good Faith',
        'Nothing is said to be done in good faith which is done without due care and attention.'),
    row('BNS',  'Ss. 25–31',      '—',                 'Legal protection to medical doctors',
        'Provides legal defences/protection to registered medical practitioners in various clinical situations.'),
    row('BNS',  'S. 27',          '—',                 'Act done in good faith for benefit of child',
        'Protection for acts done in good faith for benefit of child or insane person by guardian/person in charge.'),
    row('BNS',  'S. 28',          '—',                 'Consent given under fear of injury',
        'Consent given by person under fear of injury, or under misconception of fact, is not valid consent that protects the doctor.'),
    row('BNS',  'S. 30',          'S. 92, IPC',        'Harm caused in good faith for person\'s benefit',
        'Any harm caused to a person for his own benefit with consent → protected if done in good faith.'),
    row('BNS',  'S. 31',          '—',                 'Emergency extension of surgical consent',
        'Doctor may extend procedure beyond scope of consent to treat a life-threatening emergency.'),
    row('BNS',  'S. 58',          '—',                 'Concealing design to commit offence',
        'Concealing design to commit offence punishable with death or life imprisonment → imprisonment 3 months (offence not committed) / 7 years (offence committed).'),
    row('BNS',  'S. 106',         '—',                 'Causing death by negligence (medical negligence)',
        'Death by rash/negligent act → imprisonment up to 2 years or fine or both. '
        '[Culpable homicide not amounting to murder for medical negligence]'),
    row('BNS',  'S. 125',         '—',                 'Rash/negligent acts endangering human life',
        'Rash or negligent acts that endanger human life or personal safety → imprisonment 3 months to 2 years or fine or both.'),
    row('BNS',  'S. 211',         '—',                 'Omission to give notice/information to public servant',
        'Person legally bound to give information to public servant but fails to do so → imprisonment up to 1 month or fine or both.'),
    row('BNSS', 'S. 33',          '—',                 'Duty to report a serious crime',
        'Every person aware of commission / intention to commit any cognizable offence must inform the nearest magistrate or police officer. '
        'Doctor knowing of a serious crime (e.g. poisoning, culpable homicide, unlawful abortion) must report. [Also BNS S. 211]'),
    row('BNS',  'S. 212',         '—',                 'Furnishing false information',
        'Imprisonment up to 6 months or fine or both.'),
    row('BNS',  'S. 216',         '—',                 'False statement on oath / affirmation to public servant',
        'Imprisonment up to 3 years + fine.'),
    row('BNS',  'S. 229',         '—',                 'Punishment for giving false evidence (Perjury)',
        'Imprisonment up to 7 years or life imprisonment.'),
    row('BNS',  'S. 234',         'S. 197, IPC',       'Issuing or signing a false certificate',
        'Doctor issuing false medical / death certificate → imprisonment up to 7 years.'),
    row('BNS',  'S. 238',         '—',                 'Causing disappearance of evidence / giving false info',
        'Hiding evidence of an offence or giving false info to screen offenders → imprisonment up to 10 years.'),
    row('BNS',  'S. 239',         '—',                 'Intentional omission to give info of offence',
        'Imprisonment up to 6 months or fine or both.'),
    row('BNS',  'S. 240',         '—',                 'Giving false information respecting an offence',
        'Imprisonment up to 2 years or fine or both.'),
    row('BNS',  'S. 241',         '—',                 'Destruction of document / electronic record',
        'To prevent production as evidence → imprisonment up to 2 years or fine or both.'),
    row('BNS',  'S. 257',         '—',                 'Disciplinary control – NMC / Medical Council',
        'Covered under "infamous conduct" provisions alongside Ss. 229 and 267 BNS.'),
    row('BNS',  'S. 267',         '—',                 'Disciplinary control – NMC / Medical Council',
        'Covered under disciplinary control with Ss. 229 and 257 BNS.'),
    row('BNS',  'S. 271',         '—',                 'Negligent act likely to spread dangerous disease',
        'Imprisonment up to 6 months or fine or both.'),
    row('BNS',  'S. 272',         '—',                 'Malignant act likely to spread dangerous disease',
        'Imprisonment up to 2 years or fine or both.'),
    row('BNS',  'S. 286',         '—',                 'Negligent conduct with poisonous substances',
        'Imprisonment up to 6 months or fine or both.'),
    row('BNSS', 'S. 337',         '—',                 'Defense – Res judicata',
        'If question of negligence against a doctor has already been decided by a competent court, cannot be re-tried.'),
    row('BNSS', 'S. 357C',        'S. 357C, CrPC',     'Free treatment of sexual assault victims (all hospitals)',
        'All hospitals (public or private, Central/State/local authority/any person) to provide free first-aid / medical treatment to victims of sexual assault and inform police. Imprisonment up to 1 year or fine or both for non-compliance.'),
    row('BNSS', 'S. 397',         'S. 357C, CrPC',     'Free treatment – all hospitals (BNSS numbering)',
        'Same provision as above under BNSS numbering. Failure to provide free treatment is punishable.'),
]

# ── CHAPTER 4 – Identification (line 6313 block 1, Age section at 7760) ────────
ch4_rows = [
    row('BNS',  'S. 20',          'S. 82, IPC',        'Age below 7 years – no criminal responsibility',
        'A child under 7 years of age is not an offence [doli incapax]. '
        'Child 7–12 with immature understanding: partial protection. Over 12: full responsibility.'),
    row('BSA',  'S. 110',         'S. 107, IEA',       'Presumption of life or death (age/identification context)',
        'Person not heard of for 7 years by those likely to know is presumed dead. '
        'Used in identification cases, missing persons, age estimation.'),
]

# ── CHAPTER: Sexual Offences (block 5, pp.404-492) ─────────────────────────────
ch_sex_rows = [
    row('BNS',  'S. 64 (cls. a–n, sub-s.2)', 'S. 376, IPC', 'Rape',
        'Penetration offences. BSA S. 120 shifts burden of proof to accused in custodial rape / gang rape '
        'if victim states absence of consent.'),
    row('BNS',  'S. 72',          'S. 228-A, IPC',     'Publication of rape victim\'s identity',
        'Printing / publishing name or matter disclosing identity of rape victim → imprisonment up to 2 years.'),
    row('BNS',  'S. 74',          'S. 354, IPC',       'Assault / criminal force to woman – outrage modesty',
        'Imprisonment not less than 1 year, may extend to 5 years + fine.'),
    row('BNS',  'S. 75',          'S. 354-A, IPC',     'Sexual harassment',
        '(1) Physical contact with sexual overtures; (2) demand for sexual favours; (3) sexually coloured remarks; '
        '(4) showing pornography → imprisonment 1–3 years or fine or both.'),
    row('BNS',  'S. 76',          'S. 354-B, IPC',     'Assault / criminal force to disrobe a woman',
        'Compelling woman to be naked → imprisonment not less than 3 years, up to 7 years + fine.'),
    row('BNS',  'S. 77',          'S. 354-C, IPC',     'Voyeurism',
        'Capturing or disseminating image of woman in private act without consent.'),
    row('BNS',  'S. 78',          'S. 354-D, IPC',     'Stalking',
        'Following a woman and contacting or attempting to contact her despite clear indication of disinterest; '
        'monitoring use of internet / electronic communication.'),
    row('BNS',  'S. 79',          'S. 509, IPC',       'Insulting modesty of woman – words / sounds / gestures',
        'Uttering offensive words / sounds / gestures; intruding on privacy → simple imprisonment up to 3 years + fine.'),
    row('BNS',  'S. 81',          'S. 493, IPC',       'Cohabitation by deceit – belief of lawful marriage',
        'Man deceitfully inducing woman to believe a non-existent marriage and cohabiting → imprisonment up to 10 years.'),
    row('BNS',  'S. 84',          'S. 498, IPC',       'Enticing / taking away a married woman',
        'Criminal intent to entice or detain married woman → imprisonment up to 2 years or fine or both.'),
    row('BNS',  'S. 93',          'S. 317, IPC',       'Exposure / abandonment of child under 12 years',
        'Exposure or abandonment by parent or person having care → imprisonment up to 7 years or fine or both.'),
    row('BNS',  'S. 124',         'S. 326-A, IPC',     'Voluntarily causing grievous hurt by acid',
        'Imprisonment not less than 10 years, may extend to life + fine of ₹10 lakh (for victim\'s medical expenses).'),
    row('BNS',  'S. 124(2)',      'S. 326-B, IPC',     'Voluntarily throwing / attempting to throw acid',
        'Imprisonment not less than 5 years, up to 7 years + fine.'),
    row('BNS',  'S. 144',         'S. 370-A, IPC',     'Trafficking minor for sexual exploitation',
        'Knowingly engaging trafficked minor for sexual exploitation → imprisonment not less than 5 years, up to 7 years + fine.'),
    row('BNS',  'S. 196',         'S. 176(1A), CrPC',  'Custody death/disappearance/rape – mandatory magistrate inquest',
        'Death, disappearance, or rape in police/court custody → in addition to police inquest, '
        'Judicial Magistrate inquest mandatory; body sent for autopsy.'),
    row('BNS',  'S. 296',         'S. 294, IPC',       'Obscene act in public place / sexual paraphilias',
        'Obscene act in public or obscene songs/words near public place to annoyance of others → imprisonment up to 3 months or fine.'),
    row('BNSS', 'S. 52',          'S. 53-A, CrPC',     'Medical examination of accused in rape / attempted rape',
        'Examination by RMP in govt./local authority hospital; in absence, any RMP with consent. '
        'Woman to be referred within 24 hours.'),
    row('BNSS', 'S. 176',         'S. 157, CrPC',      'Recording rape victim\'s statement',
        'Statement recorded by woman police officer at victim\'s residence or place of her choice, '
        'in presence of parents / guardians.'),
    row('BNSS', 'S. 180',         'S. 161, CrPC',      'Statement of woman against whom sexual offence committed',
        'Statement of woman against whom offence under BNS Ss. 376-A to E / S. 509 IPC has been alleged.'),
    row('BNSS', 'S. 184',         'S. 164-A, CrPC',    'Medical examination of rape victim – full procedure',
        '(1) Name, age, address, who brought her, injuries, mental condition, all materials taken for investigation. '
        '(2) Reasons for each conclusion. (3) Record consent obtained. '
        '(4) Exact time start/end of examination. (5) Forward report to IO → magistrate. '
        '(6) Examination without consent = unlawful.'),
    row('BSA',  'S. 120',         'S. 114-A, IEA',     'Presumption as to absence of consent – rape burden of proof',
        'If victim states she did not consent in custodial rape or gang rape, Court presumes she did not consent. '
        'Burden of proof of consent shifts to accused.'),
    row('BNS',  'S. 377 (deleted)', 'S. 377, IPC',     'Unnatural offences – deleted in BNS',
        'Section 377 IPC (consensual homosexual acts between adults) has been deleted in BNS. '
        'Non-consensual acts still punishable under relevant rape / assault provisions.'),
]

# ── CHAPTER: Psychiatry / Mental Responsibility (block 5) ──────────────────────
ch_psych_rows = [
    row('BNSS', 'Ss. 367–378',    'Ss. 328–339, CrPC', 'Provisions for mentally ill accused during trial',
        'Procedure when accused appears to be of unsound mind: inquiry, medical examination, '
        'adjournment, safe custody, disposal of person acquitted on ground of mental illness.'),
    row('BNSS', 'Ss. 369, 374',   'Ss. 330, 335, CrPC','Mentally ill accused – safe custody / discharge',
        'Admission under Army Act (1950), Navy Act (1957), or BNSS Ss. 369/374 when accused is found of unsound mind.'),
    row('BNS',  '—',              '—',                 'M\'Naghten rules in BNS',
        'Legal test for criminal responsibility / insanity accepted in India under BNS. '
        'Defense must prove insanity under BSA.'),
    row('BSA',  'S. 105 (BSA)',   'S. 105, IEA',       'Burden of proof – insanity defense',
        'In criminal cases where mental illness is pleaded as defense, defense must prove it.'),
    row('BSA',  'S. 124',         'S. 118, IEA',       'Competency of insane witness',
        'All persons competent to testify unless unable to understand questions or give rational answers '
        'due to disease, age, etc.'),
    row('BNS',  'S. 20',          'S. 82, IPC',        'Criminal responsibility – child below 7 years',
        'Child under 7 years: no criminal responsibility (doli incapax).'),
    row('BSA',  'S. 2/34 (BNS)',  'S. 31, IPC',        'Definition of "Will" – testamentary capacity',
        '"Will" denotes any testamentary document BNS 2/34. Requirements of valid will linked to testamentary capacity.'),
]

# ── CHAPTER: Toxicology (block 6, pp.493-595) ──────────────────────────────────
ch_tox_rows = [
    row('BNS',  'S. 124(1)',      'S. 326-A, IPC',     'Acid poisoning – causing permanent / partial damage',
        'Throwing or administering acid with intention and knowledge that it is likely to cause permanent or partial damage → '
        'imprisonment not less than 10 years up to life + fine.'),
    row('BNS',  'S. 106',         '—',                 'Rash & negligent act causing death – toxicology context',
        'Death caused by negligent administration of drug / poison (therapeutic misadventure) → '
        'imprisonment up to 2 years or fine or both.'),
    row('BNS',  '—',              'S. 309, IPC',       'Attempted suicide – deleted in BNS',
        'BNS deleted S. 309 IPC (attempt to commit suicide). Suicide attempt is no longer a criminal offence. '
        'Not included in BNSS S. 2(33) list of offences for which information must be given.'),
    row('BNSS', 'S. 2(33)',       'S. 39, CrPC',       'Duty to inform police – list of offences',
        'Suicide attempt (BNS deleted S. 309 IPC) is no longer in the list of offences for which '
        'information must be given to police.'),
]

# ═══════════════════════════════════════════════════════════════════════════════
# BUILD PDF
# ═══════════════════════════════════════════════════════════════════════════════
elements = []

# Title block
elements.append(Paragraph("Chapter-wise BNS / BNSS / BSA Reference Table", title_s))
elements.append(Paragraph(
    "KS Narayan Reddy's Essentials of Forensic Medicine &amp; Toxicology, 36th Edition (2026)  |  "
    "BNS = Bharatiya Nyaya Sanhita (Act 45/2023) replaces IPC  |  "
    "BNSS = Bharatiya Nagarika Suraksha Sanhita (Act 46/2023) replaces CrPC  |  "
    "BSA = Bharatiya Sakshya Adhiniyam (Act 47/2023) replaces IEA", sub_s))

# Legend
legend_data = [[
    Paragraph('<b><font color="#1a237e">■ BNS</font></b>  (replaces IPC, substantive criminal law)', cell_s),
    Paragraph('<b><font color="#1b5e20">■ BNSS</font></b>  (replaces CrPC, procedural law)', cell_s),
    Paragraph('<b><font color="#4a148c">■ BSA</font></b>  (replaces IEA, evidence law)', cell_s),
]]
leg_t = Table(legend_data, colWidths=[sum(COL_W)/3]*3)
leg_t.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), colors.HexColor('#eceff1')),
    ('LEFTPADDING', (0,0), (-1,-1), 10),
    ('TOPPADDING', (0,0), (-1,-1), 5),
    ('BOTTOMPADDING', (0,0), (-1,-1), 5),
    ('BOX', (0,0), (-1,-1), 0.5, colors.HexColor('#90a4ae')),
]))
elements.append(leg_t)
elements.append(Spacer(1, 10))

def add_chapter(ch_num, ch_title, pages, color, rows_data):
    if not rows_data:
        return
    elements.append(KeepTogether([
        ch_banner(ch_num, ch_title, pages, color),
        Spacer(1, 4),
        make_table(rows_data),
        Spacer(1, 14),
    ]))

DARK_BLUE   = colors.HexColor('#1a237e')
DARK_GREEN  = colors.HexColor('#1b5e20')
DARK_PURPLE = colors.HexColor('#4a148c')
TEAL        = colors.HexColor('#00695c')
BROWN       = colors.HexColor('#4e342e')
GREY        = colors.HexColor('#37474f')

add_chapter(1,  "Medical Jurisprudence, Legal Medicine & Medical Evidence",
            "pp. 17–109", DARK_BLUE, ch1_rows)
add_chapter(2,  "Post-Mortem Examination, Exhumation & Identification",
            "pp. 110–208", TEAL, ch2_rows)
add_chapter(3,  "Medical Ethics, Negligence, Consent & Professional Responsibilities",
            "pp. (within block 1–5)", DARK_GREEN, ch3_rows)
add_chapter(4,  "Identification – Age & Criminal Responsibility",
            "pp. (within block 1)", BROWN, ch4_rows)
add_chapter("—", "Sexual Offences",
            "pp. 404–492", DARK_PURPLE, ch_sex_rows)
add_chapter("—", "Psychiatry & Mental Responsibility",
            "pp. (block 5)", colors.HexColor('#6a1b9a'), ch_psych_rows)
add_chapter("—", "Toxicology",
            "pp. 493–595", colors.HexColor('#bf360c'), ch_tox_rows)

# Footer note
elements.append(HRFlowable(width="100%", thickness=0.8, color=GREY, spaceAfter=5))
elements.append(Paragraph(
    "All three laws (BNS, BNSS, BSA) came into force on 1 July 2024. "
    "Sections without an old equivalent are new provisions. "
    "Where the old column shows a CrPC section, the law type is BNSS; IPC → BNS; IEA → BSA.",
    note_s))

doc.build(elements)
print(f"PDF saved to: {OUTPUT}")
Running Command

cd /tmp/workspace/bns-ipc-table && python generate_chapterwise.py 2>&1

Your chapter-wise PDF is ready:

ChapterWise BNS BNSS BSA

PDF Document · PDF


What's inside - all three laws in one landscape PDF, colour-coded by law type:
ColourLawReplaces
🟦 NavyBNSIPC 1860
🟩 GreenBNSSCrPC 1973
🟪 PurpleBSAIEA 1872
7 chapter banners, each with its own colour header:
ChapterSections countCoverage
Ch. 1 - Medical Jurisprudence & Legal Evidence~50 sectionsOffence definitions, punishments, courts, summons, inquest, witnesses, examination order, dying declaration, oral/documentary evidence
Ch. 2 - Post-Mortem & Exhumation4 sectionsIndignity to corpse, exhumation orders, presumption of death
Ch. 3 - Ethics, Negligence & Consent~25 sectionsGood faith protections, medical negligence punishment, false certificates, duty to report, penal provisions table
Ch. 4 - Identification & Age2 sectionsCriminal responsibility by age, presumption of life/death
Sexual Offences~22 sectionsRape, POCSO, acid attack, trafficking, stalking, voyeurism, medical exam procedure
Psychiatry & Mental Responsibility6 sectionsInsanity defense, M'Naghten rules, mentally ill accused, testamentary capacity
Toxicology4 sectionsAcid poisoning, negligent death, suicide (S.309 deleted)
This is a shared conversation. Sign in to Orris to start your own chat.