Here is the complete Python script to generate the NTEP PDF. Copy it, run it locally with pip install reportlab, and it will produce the PDF.
import os
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import mm, cm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
# ββ Output path ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
OUTPUT = "NTEP_Park_28e_Summary.pdf"
# ββ Document βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=18*mm, leftMargin=18*mm,
topMargin=20*mm, bottomMargin=20*mm,
title="NTEP - Park's 28th Edition Summary",
author="Orris Study Notes",
)
W = A4[0] - 36*mm # usable width
# ββ Colour palette βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
NAVY = colors.HexColor("#0D2B6E")
TEAL = colors.HexColor("#0B7A75")
AMBER = colors.HexColor("#E8A21A")
RED = colors.HexColor("#C0392B")
LGREY = colors.HexColor("#F2F4F8")
MGREY = colors.HexColor("#D5D8DC")
WHITE = colors.white
BLACK = colors.black
GREEN = colors.HexColor("#1A7A3C")
PURPLE = colors.HexColor("#6C3483")
# ββ Styles βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
base = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
sty = {
"cover_title": S("cover_title",
fontName="Helvetica-Bold", fontSize=28, textColor=WHITE,
alignment=TA_CENTER, spaceAfter=6),
"cover_sub": S("cover_sub",
fontName="Helvetica", fontSize=13, textColor=WHITE,
alignment=TA_CENTER, spaceAfter=4),
"cover_badge": S("cover_badge",
fontName="Helvetica-Bold", fontSize=11, textColor=AMBER,
alignment=TA_CENTER, spaceAfter=2),
"h1": S("h1",
fontName="Helvetica-Bold", fontSize=16, textColor=WHITE,
backColor=NAVY, borderPad=6, spaceBefore=14, spaceAfter=4,
leftIndent=-2, rightIndent=-2, leading=20),
"h2": S("h2",
fontName="Helvetica-Bold", fontSize=13, textColor=NAVY,
spaceBefore=10, spaceAfter=3, borderPad=2,
borderColor=TEAL, borderWidth=0),
"h3": S("h3",
fontName="Helvetica-Bold", fontSize=11, textColor=TEAL,
spaceBefore=7, spaceAfter=2),
"h4": S("h4",
fontName="Helvetica-Bold", fontSize=10, textColor=PURPLE,
spaceBefore=5, spaceAfter=2),
"body": S("body",
fontName="Helvetica", fontSize=9.5, leading=14,
spaceAfter=3, alignment=TA_JUSTIFY),
"bullet": S("bullet",
fontName="Helvetica", fontSize=9.5, leading=13,
leftIndent=12, bulletIndent=2, spaceAfter=2),
"bullet2": S("bullet2",
fontName="Helvetica", fontSize=9, leading=12,
leftIndent=24, bulletIndent=14, spaceAfter=1),
"note": S("note",
fontName="Helvetica-Oblique", fontSize=9, textColor=NAVY,
backColor=colors.HexColor("#EAF0FB"), borderPad=5,
leftIndent=8, rightIndent=8, spaceAfter=4, leading=13),
"warn": S("warn",
fontName="Helvetica-Bold", fontSize=9, textColor=RED,
backColor=colors.HexColor("#FDEDEC"), borderPad=5,
leftIndent=8, rightIndent=8, spaceAfter=4, leading=13),
"fire": S("fire",
fontName="Helvetica-Bold", fontSize=9, textColor=GREEN,
backColor=colors.HexColor("#EAFAF1"), borderPad=5,
leftIndent=8, rightIndent=8, spaceAfter=4, leading=13),
"box": S("box",
fontName="Courier", fontSize=8.5, leading=12,
backColor=LGREY, borderPad=6, leftIndent=6, rightIndent=6,
spaceAfter=4),
"code": S("code",
fontName="Courier-Bold", fontSize=8, leading=11,
backColor=colors.HexColor("#EFF0F1"), borderPad=5,
spaceAfter=4),
"tbl_hdr": S("tbl_hdr",
fontName="Helvetica-Bold", fontSize=9, textColor=WHITE,
alignment=TA_CENTER),
"tbl_cell": S("tbl_cell",
fontName="Helvetica", fontSize=8.8, leading=12),
"tbl_cell_c": S("tbl_cell_c",
fontName="Helvetica", fontSize=8.8, leading=12,
alignment=TA_CENTER),
"mono": S("mono",
fontName="Courier", fontSize=8.8, leading=12),
"rapid": S("rapid",
fontName="Courier", fontSize=8.2, leading=11.5,
backColor=colors.HexColor("#FDFEFE"), borderPad=6,
leftIndent=4, spaceAfter=2),
"footer": S("footer",
fontName="Helvetica-Oblique", fontSize=7.5,
textColor=colors.HexColor("#7F8C8D"), alignment=TA_CENTER),
}
# ββ Helpers βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def h1(text):
return Paragraph(f" {text}", sty["h1"])
def h2(text):
return Paragraph(text, sty["h2"])
def h3(text):
return Paragraph(text, sty["h3"])
def h4(text):
return Paragraph(text, sty["h4"])
def p(text, style="body"):
return Paragraph(text, sty[style])
def bl(text, level=1):
style = "bullet" if level == 1 else "bullet2"
return Paragraph(f"β’ {text}", sty[style])
def sp(h=4):
return Spacer(1, h*mm)
def hr(color=TEAL, thickness=0.8):
return HRFlowable(width="100%", thickness=thickness, color=color,
spaceAfter=3, spaceBefore=3)
def note(text):
return Paragraph(f"π {text}", sty["note"])
def warn(text):
return Paragraph(f"β {text}", sty["warn"])
def fire(text):
return Paragraph(f"π₯ {text}", sty["fire"])
def star(text):
return Paragraph(f"β {text}", sty["note"])
def code_box(text):
return Paragraph(text.replace("\n", "<br/>"), sty["box"])
# ββ Table builder βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def make_table(headers, rows, col_widths=None, hdr_color=NAVY):
if col_widths is None:
col_widths = [W / len(headers)] * len(headers)
data = [[Paragraph(h, sty["tbl_hdr"]) for h in headers]]
for row in rows:
data.append([Paragraph(str(c), sty["tbl_cell"]) for c in row])
t = Table(data, colWidths=col_widths, repeatRows=1)
style = TableStyle([
("BACKGROUND", (0,0), (-1,0), hdr_color),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("ALIGN", (0,0), (-1,0), "CENTER"),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 9),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LGREY]),
("GRID", (0,0), (-1,-1), 0.4, MGREY),
("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),
])
t.setStyle(style)
return t
# ββ Cover page ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def cover_page():
cover_data = [[
Paragraph(
"<br/><br/>π« NTEP<br/>National Tuberculosis Elimination Programme",
sty["cover_title"]),
Paragraph(
"Park's Textbook of Preventive & Social Medicine β 28th Edition",
sty["cover_sub"]),
Paragraph(
"Comprehensive High-Yield Chapter Summary",
sty["cover_sub"]),
Spacer(1, 10*mm),
Paragraph("β MBBS University Exams β’ π₯ INICET / NEET PG", sty["cover_badge"]),
Spacer(1, 8*mm),
Paragraph("Generated by Orris AI Study Assistant", sty["cover_badge"]),
Paragraph("July 2026", sty["cover_badge"]),
]]
cover_table = Table(cover_data, colWidths=[W + 4*mm])
cover_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("TOPPADDING", (0,0), (-1,-1), 20),
("BOTTOMPADDING",(0,0), (-1,-1), 20),
("LEFTPADDING", (0,0), (-1,-1), 14),
("RIGHTPADDING",(0,0), (-1,-1), 14),
("ROUNDEDCORNERS", [6]),
]))
return [cover_table, PageBreak()]
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# CONTENT BUILDER
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def build_content():
E = [] # elements list
# ββ Cover ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += cover_page()
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION 1: Introduction / Definition
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("SECTION 1: TUBERCULOSIS β THE DISEASE"), sp(2)]
E += [
star("<b>Definition:</b> Tuberculosis is a specific infectious disease caused by "
"<i>Mycobacterium tuberculosis</i>. Primarily affects the lungs (pulmonary TB). "
"Also affects intestine, meninges, bones & joints, lymph glands, skin. "
"<i>M. bovis</i> causes bovine TB (communicable to humans)."),
sp(2),
]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION 2: Problem Statement
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("SECTION 2: PROBLEM STATEMENT β EPIDEMIOLOGY"), sp(2)]
E += [h2("2A. Global Statistics (2019)")]
E += [make_table(
["Statistic", "Value"],
[
["Global TB cases", "10 million"],
["TB deaths (HIV-negative)", "1.2 million"],
["TB deaths (HIV-positive)", "208,000"],
["Men β₯15 yrs", "56% of cases"],
["Women", "32% of cases"],
["Children <15 yrs", "12% of cases"],
["People with HIV among TB cases", "8.2%"],
["1/3 of world population infected (latent)", "~2.5 billion"],
["% who develop clinical disease (lifetime)", "5β10% of infected"],
["Annual infection risk (high-burden countries)", "0.5β2%"],
["Infectious patient infects others per year", "10β15 persons"],
["New cases with MDR/RR-TB", "3.3%"],
["Previously treated with MDR/RR-TB", "18%"],
],
col_widths=[W*0.65, W*0.35],
), sp(3)]
E += [h2("2B. India Statistics")]
E += [make_table(
["Indicator", "Value"],
[
["India's share of global TB burden", "~26% (HIGHEST globally)"],
["TB incidence (India, 2019)", "~2.64 million"],
["TB mortality (India)", "~4.4 lakh/year"],
["Female infertility due to TB (India)", "~1/3 of all female infertility"],
["Children dropping school due to parent's TB", "~3 lakh"],
["Recovery time = income loss", "3β4 months"],
["Economic burden β primary cause", "Loss of life (>90%), not morbidity"],
["Female cases before age 34 yrs", ">50% of female cases"],
],
col_widths=[W*0.62, W*0.38],
), sp(2)]
E += [
fire("HIV is the <b>MOST POTENT risk factor</b> for progression of TB infection "
"to active disease. TB = earliest & most common opportunistic infection in HIV."),
warn("TB kills MORE women in reproductive age than ALL causes of maternal mortality "
"combined."),
sp(2),
]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION 3: Epidemiological Indices
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("SECTION 3: EPIDEMIOLOGICAL INDICES"), sp(2)]
E += [make_table(
["Index", "Definition"],
[
["Annual Risk of TB Infection (ARTI)",
"Probability of a person being infected with TB in a year; "
"used to estimate TB incidence. ARTI 1% β 50 smear-positive cases/1,00,000 pop."],
["Incidence", "New cases per 1,00,000 population per year"],
["Prevalence", "Total active cases per 1,00,000 at a point in time"],
["Case Detection Rate (CDR)", "% of estimated cases detected and notified"],
["Treatment Success Rate (TSR)", "% of Cured + Completed from treatment cohort"],
],
col_widths=[W*0.38, W*0.62],
), sp(2)]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION 4: Case Definitions
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("SECTION 4: REVISED TB CASE DEFINITIONS (2013)"), sp(2)]
E += [h2("4A. By Bacteriological Status")]
E += [make_table(
["Type", "Definition"],
[
["Bacteriologically Confirmed TB",
"Biological specimen positive by smear microscopy, culture, or WHO-approved "
"rapid diagnostic (e.g. Xpert MTB/RIF)"],
["Clinically Diagnosed TB",
"Does NOT meet bacteriological criteria; diagnosed by clinician based on "
"symptoms, signs, X-ray, histology, etc."],
],
col_widths=[W*0.35, W*0.65],
), sp(2)]
E += [h2("4B. By Site of Disease")]
E += [make_table(
["Type", "Definition"],
[
["Pulmonary TB (PTB)",
"TB of lung parenchyma or tracheobronchial tree (includes smear +ve & -ve). "
"MILIARY TB = classified as PTB."],
["Extrapulmonary TB (EPTB)",
"TB of organs other than lungs: pleura, lymph nodes, abdomen, GU tract, "
"skin, joints, bones, meninges. If both PTB + EPTB β classified as PTB."],
],
col_widths=[W*0.28, W*0.72],
), sp(2)]
E += [warn("β Miliary TB = classified as PTB (lungs involved). "
"Tuberculous pleural effusion alone = EPTB. Both PTB+EPTB present β PTB.")]
E += [h2("4C. By History of Previous TB Treatment")]
E += [make_table(
["Category", "Definition"],
[
["New", "Never treated for TB OR treated for <1 month"],
["Relapse",
"Previously declared cured/treatment completed; now bacteriologically confirmed again"],
["Treatment after failure",
"Started treatment after failing previous regimen (smear/culture +ve at month 5+)"],
["Treatment after LFU",
"Previously lost to follow-up (interrupted β₯2 months); now returning"],
["Previously treated, unknown outcome",
"Treated β₯1 month but outcome unknown to reporting unit"],
["Transfer in", "Transferred from another treatment unit"],
],
col_widths=[W*0.36, W*0.64],
), sp(2)]
E += [h2("4D. By Drug Resistance")]
E += [make_table(
["Type", "Definition"],
[
["Mono-resistant TB", "Resistant to ONE first-line drug"],
["Poly-resistant TB", "Resistant to >1 first-line drug, NOT both H+R"],
["MDR-TB", "Resistant to BOTH Isoniazid (H) + Rifampicin (R)"],
["RR-TB", "Rifampicin-resistant by any method, with/without other resistance"],
["XDR-TB",
"MDR-TB + resistant to any fluoroquinolone + at least one of 3 second-line "
"injectables (amikacin, kanamycin, capreomycin)"],
["TDR-TB", "Resistant to ALL drugs tested (totally drug resistant)"],
],
col_widths=[W*0.28, W*0.72],
), sp(2)]
E += [fire("Mnemonic for increasing resistance: Mono β Poly β MDR β XDR β TDR")]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION 5: Treatment Outcomes
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("SECTION 5: TREATMENT OUTCOME DEFINITIONS"), sp(2)]
E += [h2("5A. Drug-Sensitive TB (DS-TB)")]
E += [make_table(
["Outcome", "Definition"],
[
["Cured",
"Bacteriologically confirmed TB; smear/culture-NEGATIVE in LAST month of treatment "
"AND on at least ONE previous occasion"],
["Treatment Completed",
"Completed treatment without evidence of failure BUT no smear/culture results "
"available (tests not done or results unavailable)"],
["Treatment Failed",
"Smear/culture POSITIVE at month 5 or LATER during treatment"],
["Died", "Died for ANY reason before starting or during treatment"],
["Lost to Follow-up (LFU)",
"Did not start treatment OR treatment interrupted for β₯2 CONSECUTIVE months"],
["Not Evaluated",
"No outcome assigned β includes 'transferred out' and unknown outcomes"],
["Treatment Success", "SUM of CURED + TREATMENT COMPLETED"],
["Cohort",
"Group of patients diagnosed and registered for treatment in a specified period; "
"forms the DENOMINATOR for treatment outcome calculations"],
],
col_widths=[W*0.28, W*0.72],
), sp(2)]
E += [fire("Treatment Success = Cured + Treatment Completed | "
"LFU = interrupted for β₯2 consecutive months | "
"Failed = smear positive at month 5 or later")]
E += [h2("5B. RR-TB / MDR-TB / XDR-TB (Second-Line Treatment)")]
E += [make_table(
["Outcome", "Key Difference vs DS-TB"],
[
["Cured",
"Completed as per national policy + 3 or MORE consecutive cultures taken "
"β₯30 days apart are NEGATIVE after intensive phase"],
["Treatment Completed",
"Completed without failure BUT no 3 consecutive negative cultures documented"],
["Treatment Failed",
"Termination or permanent change of β₯2 drugs due to: lack of conversion by end of IP; "
"bacteriological reversion in CP; evidence of additional acquired resistance; "
"or adverse drug reactions"],
],
col_widths=[W*0.25, W*0.75],
), sp(2)]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION 6: Natural History
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("SECTION 6: NATURAL HISTORY OF TUBERCULOSIS"), sp(2)]
E += [h2("6A. Agent Factors")]
E += [make_table(
["Feature", "Details"],
[
["Causative agent", "Mycobacterium tuberculosis (Koch's bacillus)"],
["Type", "Obligate aerobe, acid-fast bacillus (AFB)"],
["Size", "2β4 Β΅m long"],
["Acid-fastness", "Due to mycolic acid in cell wall"],
["Doubling time", "~15β20 hours (very slow growth)"],
["Survival outside host", "Days to weeks in dark, moist conditions"],
["Killed by", "UV light, heat, 70% alcohol"],
["Main virulence factor", "Cord factor (trehalose dimycolate)"],
["Other species", "M. bovis (bovine TB), M. africanum, M. microti"],
],
col_widths=[W*0.38, W*0.62],
), sp(2)]
E += [h3("4 Populations of TB Bacilli (basis of treatment)")]
E += [make_table(
["Population", "Location", "Best Killed By"],
[
["Large, actively dividing", "Extracellular (cavity walls)", "Isoniazid (INH)"],
["Slow-growing / intermittently active", "Closed lesions", "Rifampicin"],
["Intracellular bacilli", "Inside macrophages (acidic pH)", "Pyrazinamide"],
["Dormant / persisters", "Semi-dormant lesions", "Rifampicin + INH (long course)"],
],
col_widths=[W*0.32, W*0.38, W*0.30],
), sp(2)]
E += [h2("6B. Host Factors")]
E += [make_table(
["Risk Factor", "Notes"],
[
["Age", "Young adults + infants (highest risk); elderly also vulnerable"],
["Sex", "Males > Females (2:1); females disproportionately affected <34 yrs"],
["Nutritional status", "Malnutrition = major independent risk factor"],
["HIV", "MOST POTENT risk factor for LTBI β active TB"],
["Diabetes mellitus", "3Γ increased risk"],
["Silicosis", "High risk β synergistic with TB"],
["Steroids / immunosuppressants", "TNF-Ξ± inhibitors especially high risk"],
["Pregnancy", "Increases risk of developing active TB"],
["BCG vaccination", "Protects against severe forms; less effective for PTB"],
],
col_widths=[W*0.38, W*0.62],
), sp(2)]
E += [h2("6C. Mode of Transmission")]
E += [
star("PRIMARY route: Airborne β <b>droplet nuclei</b> (Wells droplets, 1β5 Β΅m)"),
bl("Produced by coughing, sneezing, speaking, singing"),
bl("Float in air for hours; reach alveoli of susceptible host"),
bl("One infectious patient can infect <b>10β15 persons/year</b>"),
bl("Other routes (rare): Ingestion (M. bovis from unpasteurized milk), "
"Skin inoculation, Transplacental (congenital TB)"),
sp(2),
]
E += [h2("6D. Incubation Period")]
E += [make_table(
["Interval", "Duration"],
[
["Infection β TST positivity", "4β12 weeks (usually 6β8 weeks)"],
["Infection β Active disease", "Months to years (lifetime risk of reactivation)"],
],
col_widths=[W*0.5, W*0.5],
), sp(2)]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION 7: Control / Case Finding
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("SECTION 7: CONTROL OF TUBERCULOSIS β CASE FINDING"), sp(2)]
E += [make_table(
["Approach", "Description"],
[
["Passive Case Finding",
"Patient presents with symptoms β health facility investigates. "
"MOST COMMON method under NTEP."],
["Active Case Finding (ACF)",
"Health system proactively screens community β house-to-house, camps."],
["Intensified Case Finding (ICF)",
"Active screening in special settings: prisons, mines, slums, TB contacts, "
"HIV clinics, DM clinics."],
],
col_widths=[W*0.32, W*0.68],
), sp(2)]
E += [h3("High-Risk / Vulnerable Groups for Screening")]
groups = [
"Household contacts of bacteriologically-confirmed TB patients",
"HIV-positive individuals (PLHIV)",
"Prisoners / inmates of correctional facilities",
"Healthcare workers (regular screening)",
"Malnourished patients",
"Diabetics",
"Silica-exposed workers",
"Children <5 yrs in TB-affected households",
"Residents of tribal/backward areas and slums",
"Migrant labourers",
]
for g in groups:
E.append(bl(g))
E.append(sp(2))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION 8: Diagnosis
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("SECTION 8: CASE-FINDING TOOLS β DIAGNOSIS"), sp(2)]
E += [h2("8A. Sputum Collection")]
E += [make_table(
["Day", "Sample", "Instructions"],
[
["Day 1", "Sample 1 (Spot)",
"On-the-spot sample under supervision at the health facility"],
["Day 2", "Sample 2 (Early morning)",
"Patient brings early morning sample (most bacteria-rich)"],
["Long-distance patient", "2 Spot samples",
"Both collected at the facility with a 1-hour gap between them"],
],
col_widths=[W*0.18, W*0.22, W*0.60],
), sp(2)]
E += [h2("8B. Ziehl-Neelsen (ZN) Staining β AFB")]
E += [make_table(
["Step", "Procedure"],
[
["1. Fix smear", "Pass slide 3Γ through flame (smear side up)"],
["2. Primary stain", "Carbol fuchsin β steam GENTLY for 5 min over flame "
"(or 20 min over water bath). Do NOT boil/dry."],
["3. Wash", "Deionized water"],
["4. Decolorize", "3% acid-alcohol (95% ethanol + 3% HCl) until faint pink"],
["5. Wash", "Water"],
["6. Counter stain", "Loeffler's methylene blue β 1 minute"],
["7. Dry & Examine", "At 1000Γ (oil immersion)"],
],
col_widths=[W*0.28, W*0.72],
), sp(1)]
E += [fire("AFB appear RED/PINK on BLUE background under ZN stain"), sp(2)]
E += [h2("8C. Slide Reporting at 1000Γ Magnification")]
E += [make_table(
["AFB Count", "Per", "Result Reported"],
[
["None", "per 100 oil immersion fields", "0 (Negative)"],
["1β9", "per 100 oil immersion fields", "Scanty (report actual number)"],
["10β99", "per 100 oil immersion fields", "1+ (one plus)"],
["1β10", "per single oil immersion field", "2+ (two plus)"],
[">10", "per single oil immersion field", "3+ (three plus)"],
],
col_widths=[W*0.18, W*0.52, W*0.30],
), sp(1)]
E += [warn("NOTE the denominator switch: Scanty and 1+ use 'per 100 fields'; "
"2+ and 3+ use 'per single field'. Common exam trap!"), sp(2)]
E += [h2("8D. Rapid Diagnostic Tools β NTEP Endorsed")]
E += [make_table(
["Tool", "Details"],
[
["Xpert MTB/RIF (CBNAAT)",
"Cartridge-Based NAAT; detects MTB AND Rifampicin resistance in ~2 hours; "
"WHO FIRST-LINE recommended initial diagnostic test under NTEP"],
["Xpert MTB/RIF Ultra",
"More sensitive than original Xpert; especially useful in paucibacillary "
"disease and HIV-positive patients"],
["TrueNat",
"Indian point-of-care NAAT; detects MTB; add-on chip for RIF resistance; "
"usable at peripheral level (district/sub-district)"],
["FL-LPA (First-Line LPA)",
"Line Probe Assay; detects resistance to H + R; GenoType MTBDRplus"],
["SL-LPA (Second-Line LPA)",
"Detects resistance to fluoroquinolones (FQ) + second-line injectables (SLI)"],
],
col_widths=[W*0.27, W*0.73],
), sp(2)]
E += [h3("NTEP Diagnostic Algorithm (Order of Tests)")]
E += [make_table(
["Step", "Test"],
[
["Step 1 (Initial)", "NAAT β Xpert MTB/RIF or TrueNat"],
["Step 2 (If NAAT +ve)", "FL-LPA (First-Line LPA) for H+R resistance"],
["Step 3 (If MDR/RR-TB confirmed)", "SL-LPA for FQ + SLI resistance"],
["Step 4 (Confirmation/Extended DST)", "Liquid Culture + DST"],
],
col_widths=[W*0.35, W*0.65],
), sp(2)]
E += [h2("8E. Tuberculin Skin Test (Mantoux / TST)")]
E += [make_table(
["Parameter", "Detail"],
[
["Antigen used",
"PPD (Purified Protein Derivative) β 5 TU (international standard); "
"2 TU RT23 (used in India NTEP)"],
["Route", "Intradermal (inner forearm)"],
["Reading time", "48β72 hours after injection"],
["Measure", "INDURATION (not erythema) β in millimetres"],
],
col_widths=[W*0.30, W*0.70],
), sp(2)]
E += [h3("TST Positivity Cut-offs")]
E += [make_table(
["Induration", "Positive In"],
[
["β₯5 mm",
"HIV-positive; recent close TB contact; fibrotic changes on CXR; "
"immunosuppressed (organ transplant, TNF-Ξ± inhibitors); children at high risk"],
["β₯10 mm",
"Recent immigrants from high-burden countries; IV drug users; "
"congregate settings; healthcare workers; children <5 yrs; "
"DM, renal failure, malnutrition"],
["β₯15 mm", "Low-risk individuals in general population"],
],
col_widths=[W*0.18, W*0.82],
), sp(2)]
E += [h3("Causes of False Negative TST")]
fn_tst = ["HIV / Immunosuppression (most important)", "Overwhelming TB (miliary, meningitis)",
"Malnutrition", "Viral infections (measles, influenza)", "Recent infection (<8β10 weeks β window period)",
"Steroids / immunosuppressants", "Improper technique or storage of PPD"]
for f in fn_tst:
E.append(bl(f))
E += [sp(1), note("BCG vaccination causes FALSE POSITIVE TST (up to 15 mm) "
"but does NOT affect IGRA"), sp(2)]
E += [h2("8F. Two-Step TST Testing")]
E += [p("Used for baseline TST in healthcare workers. If 1st TST negative β repeat in 1β3 weeks. "
"A positive 2nd test = boosted reaction (not new infection). Done to avoid falsely "
"attributing a 'boosted' reaction to new occupational exposure."), sp(2)]
E += [h2("8G. IGRA (Interferon Gamma Release Assay)")]
E += [make_table(
["Feature", "IGRA", "TST"],
[
["Antigens used", "ESAT-6, CFP-10 (absent in BCG strain)", "PPD (shared with BCG)"],
["Affected by BCG vaccination", "NO", "YES (false positive)"],
["Visits needed", "1 (blood draw)", "2 (injection + reading)"],
["Tests available", "QuantiFERON-TB Gold; T-SPOT.TB", "Mantoux"],
["Specificity", "Higher (BCG does NOT cross-react)", "Lower"],
["Distinguishes active vs latent TB", "NO", "NO"],
["Cost", "Higher", "Lower"],
["Use in India (NTEP)", "Not routine; mainly research", "Programme standard"],
],
col_widths=[W*0.38, W*0.32, W*0.30],
), sp(2)]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION 9: Anti-TB Drugs
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("SECTION 9: ANTI-TUBERCULOSIS DRUGS"), sp(2)]
E += [note("Mnemonic for 1st-line drugs: RIPES β Rifampicin, INH, Pyrazinamide, "
"Ethambutol, Streptomycin")]
E += [h2("9A. First-Line Drugs")]
E += [make_table(
["Drug", "Mechanism", "Type", "Key Side Effects"],
[
["Isoniazid (H/INH)",
"Inhibits mycolic acid synthesis (InhA enzyme)",
"Bactericidal",
"Peripheral neuropathy (prevent with pyridoxine/Vit B6), hepatotoxicity, lupus-like syndrome"],
["Rifampicin (R/RMP)",
"Inhibits RNA polymerase (Ξ² subunit)",
"Bactericidal",
"Hepatotoxicity, orange discoloration of urine/secretions, enzyme INDUCER (βOCP efficacy), flu-like syndrome"],
["Pyrazinamide (Z/PZA)",
"Converted to pyrazinoic acid; disrupts membrane transport",
"Bactericidal (acidic pH, intracellular)",
"Hepatotoxicity, hyperuricemia/gout, arthralgia"],
["Ethambutol (E/EMB)",
"Inhibits arabinosyl transferase (cell wall)",
"BACTERIOSTATIC",
"Optic neuritis (retrobulbar); dose-related, reversible; red-green colour vision loss"],
["Streptomycin (S/SM)",
"Inhibits protein synthesis (30S ribosome)",
"Bactericidal",
"Ototoxicity (vestibular > auditory), nephrotoxicity; CONTRAINDICATED in pregnancy"],
],
col_widths=[W*0.18, W*0.26, W*0.16, W*0.40],
), sp(2)]
E += [warn("Hepatotoxic 1st-line drugs: H + R + Z (NOT E or S primarily). "
"If hepatotoxicity β STOP all three. Can use S+E temporarily.")]
E += [warn("STREPTOMYCIN is CONTRAINDICATED in PREGNANCY (ototoxicity to fetus)")]
E += [warn("ETHAMBUTOL = Eyes (optic neuritis). Check visual acuity before and during Rx."),
sp(2)]
E += [h2("9B. Key Second-Line Drugs")]
E += [make_table(
["Group / Drug", "Key Features"],
[
["Fluoroquinolones (Levofloxacin/Moxifloxacin)",
"Bactericidal. PREFERRED FQ for MDR-TB. DO NOT use Ciprofloxacin (suboptimal for TB)."],
["Injectable agents (Amikacin, Kanamycin, Capreomycin)",
"Nephrotoxic + ototoxic. Being phased out in favour of all-oral regimens (WHO 2019)."],
["Bedaquiline (Bdq)",
"Diarylquinoline; inhibits mycobacterial ATP synthase; bactericidal. "
"CI: pregnancy, cardiac arrhythmia. Half-life up to 5.5 months post-stopping."],
["Delamanid (Dlm)",
"Nitroimidazole; inhibits methoxymycolic + ketomycolic acid synthesis (cell wall). "
"Duration: 24 weeks. CI: pregnancy, severe hepatic impairment."],
["Linezolid (Lzd)",
"Oxazolidinone; protein synthesis inhibitor. Important in XDR-TB. "
"Side effect: myelosuppression, peripheral neuropathy."],
["Clofazimine (Cfz)",
"Riminophenazine; multiple mechanisms. Used in MDR/XDR regimens."],
["Cycloserine (Cs)",
"Mainly bacteriostatic; inhibits cell wall synthesis. "
"Side effects: CNS/psychiatric effects."],
["Thioacetazone",
"Bacteriostatic. NEVER use in HIV patients β can cause SEVERE and FATAL skin reactions."],
],
col_widths=[W*0.35, W*0.65],
), sp(2)]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION 10: Treatment Regimens
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("SECTION 10: TREATMENT REGIMENS β NTEP 2019 GUIDELINES"), sp(2)]
E += [h2("10A. DOTS β Five Elements")]
dots_elements = [
"Political commitment with increased and sustained financing",
"Case detection by quality sputum smear microscopy (now NAAT)",
"Standardized short-course chemotherapy under direct observation",
"Regular uninterrupted supply of quality anti-TB drugs",
"Standardized recording and reporting system (Nikshay)",
]
for i, d in enumerate(dots_elements, 1):
E.append(bl(f"<b>{i}.</b> {d}"))
E += [fire("NTEP 2019 change: Switched from THRICE-WEEKLY (3x/week) DOTS to DAILY DOSE regimen"), sp(2)]
E += [h2("10B. Two-Phase Chemotherapy")]
E += [make_table(
["Phase", "Duration", "Purpose", "Drugs (DS-TB)"],
[
["Intensive Phase (IP)",
"2 months",
"Kill actively dividing bacilli; achieve rapid sputum conversion",
"H + R + Z + E (daily)"],
["Continuation Phase (CP)",
"4 months",
"Eliminate remaining/dormant bacilli; prevent relapse",
"H + R (daily)"],
],
col_widths=[W*0.24, W*0.14, W*0.34, W*0.28],
), sp(2)]
E += [h2("10C. Standard DS-TB Regimen: 2HRZE + 4HR (Daily)")]
E += [make_table(
["Phase", "Duration", "Drugs", "Follow-up"],
[
["Intensive Phase", "2 months", "H + R + Z + E daily (FDC)",
"Sputum smear at END of IP"],
["Continuation Phase", "4 months", "H + R daily (FDC)",
"Sputum smear at END of treatment"],
],
col_widths=[W*0.22, W*0.17, W*0.30, W*0.31],
), sp(1)]
E += [fire("If smear POSITIVE at end of IP: Do NOT extend IP. Perform NAAT/Xpert. "
"Proceed with CP and investigate for DR-TB."), sp(2)]
E += [h2("10D. Adult Daily Dose (Weight-Based)")]
E += [make_table(
["Drug", "Daily Dose (mg/kg)", "Range", "Maximum"],
[
["Isoniazid (H)", "5 mg/kg/day", "4β6 mg/kg", "300 mg/day"],
["Rifampicin (R)", "10 mg/kg/day", "8β12 mg/kg", "600 mg/day"],
["Pyrazinamide (Z)", "25 mg/kg/day", "20β30 mg/kg", "β"],
["Ethambutol (E)", "15 mg/kg/day", "15β20 mg/kg", "β"],
["Streptomycin (S)", "15 mg/kg/day", "12β18 mg/kg", "1 g/day (IM)"],
],
col_widths=[W*0.25, W*0.25, W*0.25, W*0.25],
), sp(2)]
E += [h2("10E. Adult FDC Compositions")]
E += [make_table(
["Phase", "FDC Composition", "Tablet Content"],
[
["Intensive Phase", "HRZE",
"H 75 mg + R 150 mg + Z 400 mg + E 275 mg"],
["Continuation Phase", "HR",
"H 75 mg + R 150 mg"],
["Alternative CP", "HRE",
"H 75 mg + R 150 mg + E 275 mg"],
],
col_widths=[W*0.27, W*0.20, W*0.53],
), sp(2)]
E += [h2("10F. Paediatric TB Treatment")]
E += [
bl("Regimen: <b>2HRZE + 4HR</b> (same structure as adults)"),
bl("Dispersible FDC tablets used for children"),
bl("Weight bands: 4β7 kg, 8β11 kg, 12β15 kg, 16β24 kg, 25β29 kg, 30β39 kg"),
bl("Pyridoxine: <b>10 mg/day</b> for ALL children on INH-containing therapy"),
bl("Nikshay entry mandatory: treatment card opened + all events recorded digitally"),
sp(2),
]
E += [h2("10G. Follow-up of Treatment")]
E += [make_table(
["Component", "Schedule"],
[
["Clinical follow-up", "Monthly"],
["Sputum smear microscopy", "End of Intensive Phase + End of Treatment"],
["Weight monitoring", "Monthly"],
["Adverse drug reaction monitoring", "Every visit"],
],
col_widths=[W*0.45, W*0.55],
), sp(2)]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION 11: DR-TB Management
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("SECTION 11: MANAGEMENT OF DRUG-RESISTANT TB (DR-TB)"), sp(2)]
E += [h2("11A. Drug Groups for MDR-TB (WHO Revised)")]
E += [make_table(
["Group", "Drugs", "Priority"],
[
["Group A (Core β include all 3 if possible)",
"Levofloxacin OR Moxifloxacin, Bedaquiline (Bdq), Linezolid (Lzd)",
"HIGHEST"],
["Group B (Add to strengthen regimen)",
"Clofazimine (Cfz), Cycloserine (Cs) / Terizidone",
"HIGH"],
["Group C (Add when Groups A+B insufficient)",
"Ethambutol (E), Delamanid (Dlm), Pyrazinamide (Z), "
"Imipenem-cilastatin, Amikacin (Am), Ethionamide/Prothionamide, PAS",
"SUPPLEMENTAL"],
],
col_widths=[W*0.32, W*0.45, W*0.23],
), sp(2)]
E += [fire("Injectable agents (Kanamycin, Amikacin) largely PHASED OUT from MDR-TB regimens. "
"All-oral regimens now preferred (WHO 2019 update).")]
E += [h2("11B. MDR-TB Regimens")]
E += [make_table(
["Regimen", "Duration", "Notes"],
[
["Shorter MDR-TB regimen",
"9β12 months",
"IP (4β6 mo): Bdq+Mfx/Lfx+Cfz+Z+E+H+Eto β CP (5 mo): Mfx/Lfx+Cfz+Z+E"],
["All-oral longer MDR-TB regimen",
"18β20 months",
"IP (6β8 mo): Bdq+Lfx/Mfx+Lzd+Cfz (+/-Cs) β CP (10 mo): Lfx/Mfx+Cfz+Lzd/Cs"],
["All-oral H mono-poly DR-TB regimen",
"6 months",
"Lfx + R + Z + E daily"],
],
col_widths=[W*0.30, W*0.17, W*0.53],
), sp(2)]
E += [h2("11C. Bedaquiline (Bdq) β Inclusion & Exclusion")]
E += [make_table(
["Criteria", "Details"],
[
["Inclusion (eligible patients)",
"MDR/RR-TB with resistance to any FQ or SLI; XDR-TB; "
"Mixed pattern resistant TB; Treatment failure of MDR-TB+FQ/SLI resistance"],
["Age", "β₯18 years required"],
["Contraindications (Exclusion)",
"Pregnancy; Cardiac arrhythmia / prolonged QTc; Age <18 years; "
"Severe hepatic impairment; Hormonal contraception not reliable (non-hormonal required)"],
],
col_widths=[W*0.30, W*0.70],
), sp(2)]
E += [h2("11D. Pretreatment Evaluation for DR-TB")]
pre_tx = ["NAAT + FL-LPA + SL-LPA + Liquid Culture + DST",
"ECG (baseline QTc β mandatory for Bdq/Dlm use)",
"Audiometry (for second-line injectable use)",
"Renal function tests (creatinine, eGFR)",
"Liver function tests",
"Visual acuity and colour vision (for Ethambutol/Linezolid)",
"HIV testing + CD4 count",
"Pregnancy test in women of reproductive age",
"Baseline weight and nutritional status"]
for item in pre_tx:
E.append(bl(item))
E.append(sp(2))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION 12: NTEP Programme Structure
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("SECTION 12: NTEP β PROGRAMME STRUCTURE & KEY FEATURES"), sp(2)]
E += [h2("12A. NTEP Key Features")]
E += [make_table(
["Feature", "Details"],
[
["Old name", "RNTCP (Revised National TB Control Programme)"],
["New name", "NTEP (National Tuberculosis Elimination Programme)"],
["Renamed in", "2020"],
["Goal", "Eliminate TB from India by 2025 (SDG global target = 2030)"],
["Vision", "TB-Free India"],
["Strategy", "National Strategic Plan (NSP) 2017β2025"],
["NSP pillars", "FIND β TREAT β PREVENT β BUILD"],
],
col_widths=[W*0.30, W*0.70],
), sp(2)]
E += [h2("12B. NSP 2017β2025 Pillars β FTPB")]
E += [make_table(
["Pillar", "Focus"],
[
["FIND", "Universal access to early, accurate diagnosis of ALL TB cases"],
["TREAT", "Effective treatment with patient support; prevent LFU; DR-TB management"],
["PREVENT",
"TB preventive therapy (TPT) for contacts/PLHIV; infection control; BCG; "
"address social determinants"],
["BUILD",
"Health system strengthening; research & innovation; accountability; "
"engagement of private sector"],
],
col_widths=[W*0.15, W*0.85],
), sp(2)]
E += [h2("12C. NTEP Organogram")]
E += [make_table(
["Level", "Unit / Body", "Head / Key Staff", "Population Coverage"],
[
["National", "Central TB Division (CTD), MoHFW, New Delhi", "Deputy Director General (TB)", "Entire India"],
["State", "State TB Cell (STC)", "State TB Officer (STO)", "Entire state"],
["District", "District TB Centre (DTC)", "District TB Officer (DTO)", "Entire district"],
["Sub-district/Block", "Tuberculosis Unit (TU)", "Senior Treatment Supervisor (STS) + Senior TB Lab Supervisor (STLS)",
"2.5 lakh (rural) / 4 lakh (urban)"],
["Peripheral", "Designated Microscopy Centre (DMC)", "Lab Technician", "1 lakh (rural) / 50,000 (urban)"],
["Community/Village", "ASHA, ANM, MPHW, Treatment Supporter", "β", "Village level"],
],
col_widths=[W*0.18, W*0.27, W*0.27, W*0.28],
), sp(2)]
E += [h2("12D. Key Programme Indicators")]
E += [make_table(
["Indicator", "Target"],
[
["Case Detection Rate (CDR)", "β₯90%"],
["Treatment Success Rate (TSR)", "β₯90%"],
["ARTI target by 2025", "<1%"],
["Treatment default rate", "<5%"],
["Mandatory notification", "ALL TB cases (public + private) since 2012"],
],
col_widths=[W*0.55, W*0.45],
), sp(2)]
E += [h2("12E. NIKSHAY β National TB Information System")]
E += [
bl("<b>Nikshay</b> = web-based national IT platform for TB patient management"),
bl("Mandatory registration of ALL TB patients (public AND private sector)"),
bl("Real-time tracking: notification β diagnosis β treatment start β follow-up β outcome"),
bl("Enables <b>Nikshay Poshan Yojana</b>: Direct Benefit Transfer of "
"<b>βΉ500/month</b> to patient's bank account for nutritional support"),
bl("All treatment events recorded digitally β replaces paper registers"),
sp(2),
]
E += [h2("12F. TB Preventive Treatment (TPT)")]
E += [make_table(
["Regimen", "Details"],
[
["6H", "Isoniazid 5 mg/kg/day Γ 6 months"],
["9H", "Isoniazid Γ 9 months"],
["3HP", "Weekly INH + Rifapentine Γ 3 months"],
["1HP", "Daily INH + Rifapentine Γ 1 month (newer shorter regimen)"],
],
col_widths=[W*0.18, W*0.82],
), sp(1)]
E += [note("Who receives TPT under NTEP: (1) Household contacts <5 yrs of bacteriologically-confirmed "
"PTB β regardless of TST result; (2) PLHIV (all HIV+ve patients); "
"(3) TST/IGRA positive individuals in high-risk groups"), sp(2)]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION 13: BCG Vaccination
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("SECTION 13: BCG VACCINATION"), sp(2)]
E += [make_table(
["Feature", "Details"],
[
["Full form", "Bacille Calmette-GuΓ©rin"],
["Organism", "Attenuated Mycobacterium bovis"],
["Developed by", "Calmette and GuΓ©rin (France, 1921)"],
["Route", "Intradermal (ID) β left upper arm"],
["Age (UIP)", "At birth"],
["Dose", "0.1 mL (infants >1 month); 0.05 mL (neonates β€1 month)"],
["Efficacy β Miliary TB", "~80% protective"],
["Efficacy β TB Meningitis", "~70β80% protective"],
["Efficacy β Pulmonary TB", "Variable (0β80%); less reliable"],
["Duration of protection", "~10β15 years"],
["Side effects",
"Local ulceration (expected/normal); BCGitis; Disseminated BCG (in immunocompromised)"],
["Contraindications",
"Symptomatic HIV; immunocompromised state; immunosuppressive therapy; "
"widespread skin disease"],
],
col_widths=[W*0.35, W*0.65],
), sp(2)]
E += [warn("BCG does NOT prevent TB infection β it prevents progression to SEVERE/DISSEMINATED "
"disease. TB persists even in BCG-vaccinated populations.")]
E += [note("BCG scar appears 2β4 weeks after injection. BCG vaccination causes FALSE POSITIVE "
"TST but does NOT affect IGRA results."), sp(2)]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION 14: Prevention Levels
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("SECTION 14: LEVELS OF PREVENTION IN TB"), sp(2)]
E += [make_table(
["Level", "Measures"],
[
["Primordial Prevention",
"Poverty reduction; improved living standards; nutrition; reduce overcrowding"],
["Primary Prevention",
"BCG vaccination; health education; infection control; "
"TB preventive therapy (TPT) for contacts and PLHIV"],
["Secondary Prevention",
"Early case detection (DOTS/NAAT); prompt effective treatment; "
"contact tracing and screening"],
["Tertiary Prevention",
"Rehabilitation; management of complications; "
"prevent disability from sequelae"],
],
col_widths=[W*0.28, W*0.72],
), sp(2)]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION 15: Infection Control
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("SECTION 15: INFECTION CONTROL IN TB"), sp(2)]
E += [make_table(
["Hierarchy", "Controls", "Examples"],
[
["1st (Most Important)", "Administrative Controls",
"Fast-track TB suspects; separate infectious patients; "
"cough etiquette; respiratory hygiene; screen HCW for TB"],
["2nd", "Environmental Controls",
"Natural ventilation (open windows); mechanical ventilation (exhaust fans); "
"UV germicidal irradiation (UVGI); negative pressure rooms"],
["3rd", "Personal Protective Equipment (PPE)",
"N95 respirators for HCW in high-risk areas; "
"surgical masks for TB patients"],
],
col_widths=[W*0.22, W*0.25, W*0.53],
), sp(1)]
E += [fire("N95 respirator = protects the WEARER (HCW). "
"Surgical mask = protects OTHERS from patient's secretions."), sp(2)]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# MNEMONICS
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("MNEMONICS & MEMORY AIDS"), sp(2)]
E += [make_table(
["Topic", "Mnemonic / Memory Aid"],
[
["1st-line TB drugs",
"RIPES β Rifampicin, INH, Pyrazinamide, Ethambutol, Streptomycin"],
["DOTS 5 elements",
"PCS-DS β Political commitment, Case detection (NAAT), Short-course DOT, "
"Drug supply, Standardized recording"],
["NSP pillars", "FTPB β Find, Treat, Prevent, Build"],
["MDR-TB Group A drugs", "BLL β Bedaquiline, Levofloxacin/Moxifloxacin, Linezolid"],
["Drug side effects",
"E = Eyes (optic neuritis) | S = Stops in pregnancy (CI) | "
"H = Helps with B6 (peripheral neuropathy needs pyridoxine) | "
"R = Red urine + enzyme inducer | Z = uriZa (hyperuricemia)"],
["DR-TB progression",
"Mono β Poly β MDR β XDR β TDR (increasing resistance)"],
["TST false negatives",
"NIMM β No immunity (HIV), Immature system (newborn), Miliary/meningeal TB, Medications (steroids)"],
["Rifampicin side effects",
"RHOS β Red/orange urine/secretions, Hepatotoxicity, OCP failure (enzyme inducer), Stevens-Johnson/flu-like"],
],
col_widths=[W*0.30, W*0.70],
), sp(2)]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# COMMONLY CONFUSED CONCEPTS
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("β FREQUENTLY CONFUSED CONCEPTS"), sp(2)]
confused = [
("DOTS vs NTEP", "DOTS is the treatment strategy; NTEP is the national programme framework"),
("RNTCP vs NTEP", "Same programme β RNTCP was renamed NTEP in 2020"),
("Smear-negative PTB vs EPTB", "Both can be clinically diagnosed β they are NOT the same"),
("Miliary TB classification", "Miliary TB = PTB (lungs involved), NOT EPTB, even though disseminated"),
("Cured vs Treatment Completed",
"Cured = bacteriological confirmation (negative smear/culture); "
"Treatment Completed = clinical completion without bacteriological proof"),
("TST positivity cut-off",
"Different thresholds: β₯5 mm (HIV), β₯10 mm (HCW/congregate), β₯15 mm (general). "
"NOT a single universal cut-off"),
("IGRA vs TST for active vs latent",
"NEITHER IGRA nor TST can distinguish ACTIVE TB from LTBI"),
("BCG and TST",
"BCG causes false-positive TST (up to 15 mm) but does NOT affect IGRA"),
("IP extension in DS-TB",
"IP extension NOT recommended even if smear positive at end of 2 months (new guideline)"),
("Thioacetazone in HIV",
"Thioacetazone is CONTRAINDICATED in HIV β causes severe and FATAL skin reactions"),
("N95 vs Surgical mask",
"N95 = protects the HCW (wearer); Surgical mask = protects others from the patient"),
("LFU definition",
"LFU = interrupted β₯2 CONSECUTIVE months β not just missing a few doses"),
]
E += [make_table(
["Confused Pair / Concept", "Correct Distinction"],
confused,
col_widths=[W*0.32, W*0.68],
), sp(2)]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# RAPID REVISION SHEET (one page)
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [PageBreak()]
E += [h1("π ONE-PAGE RAPID REVISION SHEET"), sp(2)]
rapid_lines = [
"NTEP = National TB Elimination Programme | Renamed from RNTCP in 2020 | Goal: Eliminate TB by 2025",
"Causative agent: M. tuberculosis (acid-fast, obligate aerobe, slow-growing β doubling time 15-20 hrs)",
"India = ~26% of global TB burden (HIGHEST) | 2.64M cases/yr | 4.4 lakh deaths/yr",
"GLOBAL (2019): 10 million cases | 1.2M deaths (HIV-neg) | 208,000 deaths (HIV+)",
"1/3 world infected asymptomatically | 5-10% develop active disease lifetime",
"Transmission: Airborne DROPLET NUCLEI (1-5 Β΅m) | One patient infects 10-15/year",
"Incubation to TST positivity: 4-12 weeks (usually 6-8 weeks)",
"βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ",
"DIAGNOSIS: NAAT (Xpert/TrueNat) = First-line initial test under NTEP",
"ZN stain: Carbol fuchsin (primary) β 3% acid-alcohol (decolorize) β Methylene blue (counter)",
"SLIDE REPORTING: Scanty=1-9/100 fields | 1+=10-99/100 fields | 2+=1-10/field | 3+=>10/field",
"TST: Intradermal PPD | Read 48-72 hrs | Measure INDURATION (not redness)",
"TST +ve: β₯5mm (HIV) | β₯10mm (HCW/congregate) | β₯15mm (general population)",
"IGRA: Uses ESAT-6/CFP-10 | NOT affected by BCG | 1 visit needed",
"βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ",
"CASE DEFINITIONS: New | Relapse | After Failure | After LFU | Transfer In",
"MDR-TB = Resistant to H + R | XDR-TB = MDR + FQ + SLI",
"βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ",
"TREATMENT OUTCOMES: Cured | Completed | Failed (smear+ at Mo 5+) | Died | LFU (β₯2 months) | Not evaluated",
"TREATMENT SUCCESS = Cured + Treatment Completed",
"βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ",
"DS-TB REGIMEN (2019): 2HRZE + 4HR (DAILY; FDC tablets)",
"Adult doses: H=5mg/kg | R=10mg/kg | Z=25mg/kg | E=15mg/kg | max: H=300mg, R=600mg",
"MDR-TB Group A: Bdq + Lfx/Mfx + Lzd | Group B: Cfz + Cs | Group C as needed",
"Shorter MDR regimen: 9-12 months | Longer all-oral regimen: 18-20 months",
"βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ",
"DRUG SIDE EFFECTS: E=Optic neuritis | S=Ototoxic/Nephrotoxic/CI in pregnancy",
"H=Peripheral neuropathy (give Vit B6) | R=Orange urine+enzyme inducer | Z=Hyperuricemia",
"Bdq=inhibits ATP synthase | CI: pregnancy+arrhythmia | Thioacetazone=CI in HIV",
"βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ",
"BCG: Attenuated M. bovis | ID at birth (left arm) | Protects: Miliary TB (80%), TBM (70-80%)",
"BCG does NOT prevent infection β prevents severe/disseminated disease",
"βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ",
"NTEP STRUCTURE: CTD (National) β STC (State) β DTC (District) β TU β DMC",
"TU = 2.5 lakh population (rural) | DMC = 1 lakh (rural) / 50,000 (urban)",
"NSP PILLARS: Find - Treat - Prevent - Build",
"Nikshay = mandatory notification + βΉ500/month (Nikshay Poshan Yojana) DBT",
"TPT: 6H or 3HP for contacts <5 yrs + ALL PLHIV",
"KEY INDICATORS: CDR β₯90% | TSR β₯90% | Default <5%",
]
for line in rapid_lines:
E.append(Paragraph(line, sty["rapid"]))
E.append(sp(2))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# TOP 25 POINTS
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [PageBreak()]
E += [h1("π TOP 25 MOST IMPORTANT POINTS"), sp(2)]
top25 = [
"NTEP = renamed from RNTCP in 2020; goal = TB elimination by 2025",
"TB caused by M. tuberculosis β acid-fast, obligate aerobe, doubling time 15-20 hrs",
"1/3 of world population infected (latent); only 5-10% develop active disease lifetime",
"India accounts for ~26% of global TB burden β HIGHEST globally",
"HIV = most potent risk factor for progression of LTBI to active TB",
"Transmission: Airborne droplet NUCLEI (1-5 Β΅m), not large droplets",
"Incubation (infection β TST positivity) = 4-12 weeks (usually 6-8 weeks)",
"NTEP diagnostic algorithm: NAAT first (Xpert MTB/RIF or TrueNat)",
"ZN staining: Carbol fuchsin β acid-alcohol decolorize β methylene blue (AFB = red on blue)",
"Slide reporting: Scanty (1-9/100 fields) | 1+ (10-99/100) | 2+ (1-10/field) | 3+ (>10/field)",
"TST thresholds: β₯5 mm (HIV), β₯10 mm (HCW/congregate), β₯15 mm (general)",
"IGRA uses ESAT-6/CFP-10 β NOT affected by BCG vaccination",
"MDR-TB = resistant to BOTH H and R; XDR-TB = MDR + FQ + SLI",
"Treatment Success = Cured + Treatment Completed",
"LFU = treatment interrupted for β₯2 consecutive months",
"Treatment Failed = smear/culture positive at month 5 or LATER",
"Current DS-TB regimen: 2HRZE + 4HR (daily dose, FDCs) β not thrice-weekly",
"Ethambutol = optic neuritis (check vision); Streptomycin = contraindicated in pregnancy",
"Bedaquiline: inhibits mycobacterial ATP synthase; CI = pregnancy + cardiac arrhythmia",
"IP extension NOT recommended even if smear positive at end of 2 months",
"BCG = attenuated M. bovis; ID at birth; best protects against miliary TB (80%) + TBM (70-80%)",
"TU covers 2.5 lakh (rural); DMC covers 1 lakh (rural) / 50,000 (urban)",
"NSP 2017-2025 = FIND, TREAT, PREVENT, BUILD",
"Nikshay Poshan Yojana = βΉ500/month DBT to TB patients for nutritional support",
"TPT (6H or 3HP) for contacts <5 yrs AND ALL PLHIV (regardless of TST result)",
]
for i, pt in enumerate(top25, 1):
E.append(bl(f"<b>{i}.</b> {pt}"))
E.append(sp(2))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# TOP 20 MCQ FACTS
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("π₯ TOP 20 MCQ FACTS"), sp(2)]
E += [make_table(
["#", "Question Stem", "Answer"],
[
["1", "India's TB elimination goal year", "2025 (SDG = 2030)"],
["2", "India's share of global TB burden", "~26%"],
["3", "Most potent risk factor for LTBI β active TB", "HIV"],
["4", "Most important social determinant of TB", "Overcrowding"],
["5", "One infectious patient infects per year", "10β15 persons"],
["6", "ZN stain β primary stain", "Carbol fuchsin"],
["7", "ZN stain β counter stain", "Loeffler's methylene blue"],
["8", "1+ smear microscopy result", "10β99 AFB per 100 oil immersion fields"],
["9", "Current first-line TB diagnostic test in NTEP", "NAAT (Xpert MTB/RIF or TrueNat)"],
["10", "MDR-TB definition", "Resistant to both Isoniazid (H) AND Rifampicin (R)"],
["11", "Treatment failure definition", "Smear/culture positive at month 5 or later"],
["12", "Lost to follow-up definition", "Treatment interrupted β₯2 consecutive months"],
["13", "Current DS-TB regimen (NTEP 2019)", "2HRZE + 4HR (daily dose)"],
["14", "Drug causing optic neuritis", "Ethambutol"],
["15", "Drug contraindicated in pregnancy", "Streptomycin"],
["16", "Bedaquiline mechanism of action", "Inhibits mycobacterial ATP synthase"],
["17", "Drug contraindicated in HIV patients (TB treatment)", "Thioacetazone"],
["18", "BCG protects best against", "Miliary TB and TB Meningitis"],
["19", "TST positive in HIV patients", "β₯5 mm induration"],
["20", "Nikshay Poshan Yojana amount", "βΉ500 per month (DBT)"],
],
col_widths=[W*0.06, W*0.50, W*0.44],
), sp(2)]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# TOP 10 SAQ/LAQ
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("π TOP 10 UNIVERSITY SAQ/LAQ QUESTIONS"), sp(2)]
saqs = [
("[LAQ] Describe the epidemiology of TB in India. Discuss NTEP in detail including "
"objectives, structure, diagnostic algorithm, and treatment regimens."),
("[LAQ] Write in detail about the diagnosis of tuberculosis including sputum smear "
"microscopy, NAAT, tuberculin test, and IGRA. Add a note on slide reporting."),
("[SAQ] Write short notes on DOTS β components and current changes under NTEP."),
("[SAQ] Discuss the classification of tuberculosis cases under the revised 2013 definitions."),
("[SAQ] Write about treatment outcome definitions in tuberculosis."),
("[SAQ] Describe MDR-TB and XDR-TB β definitions, causes, and management."),
("[SAQ] Write a note on Bedaquiline and Delamanid in drug-resistant TB."),
("[SAQ] Describe the tuberculin skin test (Mantoux test) β procedure, interpretation, "
"and significance."),
("[SAQ] What is LTBI? How is TB preventive treatment given under NTEP?"),
("[SAQ] Write about BCG vaccination β organism, efficacy, schedule, and limitations."),
]
for i, q in enumerate(saqs, 1):
E.append(bl(f"<b>Q{i}.</b> {q}"))
E.append(sp(2))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# TOP 10 VIVA QUESTIONS
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("π£οΈ TOP 10 VIVA QUESTIONS"), sp(2)]
E += [make_table(
["#", "Question", "Key Answer"],
[
["1", "What is NTEP and when was it renamed?",
"National TB Elimination Programme; renamed from RNTCP in 2020"],
["2", "What is the goal of NTEP?",
"Eliminate TB by 2025 (SDG target = 2030)"],
["3", "What is MDR-TB?",
"Resistant to both Isoniazid (H) AND Rifampicin (R)"],
["4", "What is XDR-TB?",
"MDR-TB + resistant to any fluoroquinolone + any second-line injectable"],
["5", "How do you define treatment failure in DS-TB?",
"Sputum smear/culture positive at month 5 or later during treatment"],
["6", "How does Bedaquiline work?",
"Inhibits mycobacterial ATP synthase β the energy-generating enzyme"],
["7", "Which TB drug is contraindicated in HIV patients?",
"Thioacetazone (causes severe, potentially fatal skin reactions)"],
["8", "What is the current first-line test for TB under NTEP?",
"NAAT β Xpert MTB/RIF or TrueNat (not sputum smear microscopy)"],
["9", "What are the 5 elements of DOTS?",
"Political commitment; Sputum/NAAT diagnostics; Short-course DOT; Drug supply; Standardized recording"],
["10", "What is Nikshay Poshan Yojana?",
"βΉ500/month Direct Benefit Transfer (DBT) to TB patients for nutritional support"],
],
col_widths=[W*0.06, W*0.44, W*0.50],
), sp(2)]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# COMMON MISTAKES
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("β COMMON MISTAKES STUDENTS MAKE"), sp(2)]
mistakes = [
"Confusing DOTS with NTEP β DOTS is a treatment strategy; NTEP is the national programme",
"Saying IP should be extended if smear positive at end of 2 months β WRONG under new guidelines; proceed with CP and do NAAT",
"Wrong slide reporting denominator β confusing 'per 100 fields' (Scanty/1+) with 'per single field' (2+/3+)",
"Missing TST cut-off for HIV β it is β₯5 mm, NOT β₯10 mm",
"Saying BCG prevents infection β BCG prevents progression to severe disease, NOT the initial infection itself",
"Wrong RNTCPβNTEP year β it was renamed in 2020, not earlier",
"Classifying Miliary TB as EPTB β Miliary TB = PTB (lungs are primarily involved)",
"Saying IGRA is affected by BCG β IGRA is NOT affected by BCG (uses ESAT-6/CFP-10 not present in BCG)",
"Confusing MDR and XDR definitions β XDR requires FQ resistance PLUS SLI resistance IN ADDITION to MDR",
"Forgetting Streptomycin is contraindicated in pregnancy β classic MCQ and viva trap",
]
for i, m in enumerate(mistakes, 1):
E.append(bl(f"<b>{i}.</b> {m}"))
E.append(sp(2))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# LAST-MINUTE CHECKLIST
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
E += [h1("β
LAST-MINUTE REVISION CHECKLIST"), sp(2)]
checklist = [
"NTEP renamed 2020, goal = 2025",
"India = 26% global TB burden",
"Transmission = droplet NUCLEI (airborne)",
"Incubation to TST positivity = 4β12 weeks",
"ZN stain steps: carbol fuchsin β acid-alcohol β methylene blue",
"Slide reporting: Scanty / 1+ / 2+ / 3+ (with correct denominators)",
"Case definitions: bacteriologically confirmed vs clinically diagnosed",
"Classification: New / Relapse / After failure / After LFU / Transfer in",
"MDR-TB = H+R resistant | XDR-TB = MDR + FQ + SLI resistant",
"Treatment outcomes: Cured / Completed / Failed / Died / LFU / Not evaluated",
"LFU = β₯2 consecutive months interruption",
"Failed = positive at month 5 or later",
"DS-TB regimen = 2HRZE + 4HR (daily, FDC)",
"Drug side effects: E=Eye, S=Ear+Preg CI, H=Neuropathy (Vit B6), R=Enzyme inducer+Orange, Z=Uricemia",
"Bdq: ATP synthase inhibitor | CI: pregnancy + arrhythmia",
"BCG: attenuated M. bovis | ID at birth | Miliary TB (80%) + TBM (70-80%)",
"TST: 5 mm (HIV) | 10 mm (HCW) | 15 mm (general)",
"IGRA: NOT affected by BCG | ESAT-6/CFP-10",
"NTEP structure: CTD β STC β DTC β TU β DMC",
"TU = 2.5 lakh (rural) | DMC = 1 lakh (rural)",
"NSP pillars: FTPB (Find-Treat-Prevent-Build)",
"Nikshay Poshan Yojana = βΉ500/month DBT",
"TPT: 6H or 3HP for contacts <5 yrs + ALL PLHIV",
"Thioacetazone = CI in HIV (fatal skin reactions)",
"NAAT (Xpert/TrueNat) = first-line diagnostic test under NTEP (not smear microscopy)",
]
for i, item in enumerate(checklist, 1):
E.append(bl(f"{'β'} <b>{i}.</b> {item}"))
E.append(sp(4))
# Footer note
E += [
hr(color=NAVY),
p("<i>Source: Park's Textbook of Preventive and Social Medicine, 28th Edition β "
"TUBERCULOSIS / NTEP Chapter. Summary generated by Orris AI Study Assistant, July 2026.</i>",
"footer"),
]
return E
# ββ Page numbering ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def add_page_number(canvas, doc):
canvas.saveState()
canvas.setFont("Helvetica", 8)
canvas.setFillColor(colors.HexColor("#7F8C8D"))
page_num = canvas.getPageNumber()
canvas.drawString(18*mm, 10*mm, "NTEP β Park's 28th Edition | High-Yield Summary")
canvas.drawRightString(A4[0] - 18*mm, 10*mm, f"Page {page_num}")
canvas.restoreState()
# ββ Build βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
print("Building NTEP PDF...")
elements = build_content()
doc.build(elements, onFirstPage=add_page_number, onLaterPages=add_page_number)
print(f"Done! Saved to: {OUTPUT}")
To generate the PDF:
- Save the script above as
generate_ntep_pdf.py
- Install the dependency (if not already installed):
pip install reportlab
- Run it:
python generate_ntep_pdf.py
- The file
NTEP_Park_28e_Summary.pdf will appear in the same folder.
The PDF includes:
- Colour-coded section headers (navy/teal)
- All 15 content sections with formatted tables
- Highlighted notes, warnings, and high-yield callouts
- Mnemonics, rapid revision sheet, top 25 points, top 20 MCQs, SAQ/LAQ questions, viva Q&A, common mistakes, and last-minute checklist
- Page numbers and footer on every page