~/nacp-notes/generate_nacp_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import ListFlowable, ListItem
OUTPUT = "/tmp/workspace/nacp-notes/NACP_Park_SPM_Exam_Notes.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.8*cm, leftMargin=1.8*cm,
topMargin=2*cm, bottomMargin=2*cm,
title="National AIDS Control Programme - Park's SPM Notes",
author="Orris Medical Notes",
subject="NACP - Complete Exam Notes"
)
W, H = A4
# ── Colour palette ──────────────────────────────────────────────
NAVY = colors.HexColor("#1A3557")
TEAL = colors.HexColor("#1D6E8A")
GOLD = colors.HexColor("#C9960C")
LGRAY = colors.HexColor("#F0F4F8")
MGRAY = colors.HexColor("#D0DAE4")
RED = colors.HexColor("#B22222")
GREEN = colors.HexColor("#1E6B3C")
WHITE = colors.white
BLACK = colors.black
# ── Styles ───────────────────────────────────────────────────────
def make_styles():
base = getSampleStyleSheet()
cover_title = ParagraphStyle(
"CoverTitle", parent=base["Title"],
fontSize=28, textColor=WHITE, alignment=TA_CENTER,
spaceAfter=8, fontName="Helvetica-Bold", leading=34
)
cover_sub = ParagraphStyle(
"CoverSub", parent=base["Normal"],
fontSize=13, textColor=MGRAY, alignment=TA_CENTER,
spaceAfter=4, fontName="Helvetica"
)
cover_tag = ParagraphStyle(
"CoverTag", parent=base["Normal"],
fontSize=11, textColor=GOLD, alignment=TA_CENTER,
fontName="Helvetica-BoldOblique"
)
h1 = ParagraphStyle(
"H1", parent=base["Heading1"],
fontSize=14, textColor=WHITE, fontName="Helvetica-Bold",
spaceBefore=14, spaceAfter=6, leading=18,
backColor=NAVY, borderPadding=(5, 8, 5, 8),
leftIndent=-2, rightIndent=-2
)
h2 = ParagraphStyle(
"H2", parent=base["Heading2"],
fontSize=12, textColor=NAVY, fontName="Helvetica-Bold",
spaceBefore=10, spaceAfter=4, leading=15,
borderPadding=(2, 0, 2, 0),
leftIndent=0
)
h3 = ParagraphStyle(
"H3", parent=base["Heading3"],
fontSize=10.5, textColor=TEAL, fontName="Helvetica-Bold",
spaceBefore=7, spaceAfter=3, leading=14
)
body = ParagraphStyle(
"Body", parent=base["Normal"],
fontSize=9.5, textColor=BLACK, fontName="Helvetica",
spaceAfter=4, leading=14, alignment=TA_JUSTIFY
)
bullet = ParagraphStyle(
"Bullet", parent=base["Normal"],
fontSize=9.5, fontName="Helvetica",
spaceAfter=3, leading=13, leftIndent=14,
bulletIndent=4
)
subbullet = ParagraphStyle(
"SubBullet", parent=base["Normal"],
fontSize=9, fontName="Helvetica",
spaceAfter=2, leading=12, leftIndent=26,
bulletIndent=16
)
bold_label = ParagraphStyle(
"BoldLabel", parent=base["Normal"],
fontSize=9.5, fontName="Helvetica-Bold",
spaceAfter=3, leading=14
)
highlight = ParagraphStyle(
"Highlight", parent=base["Normal"],
fontSize=9.5, fontName="Helvetica-Bold",
textColor=RED, spaceAfter=3, leading=14
)
note = ParagraphStyle(
"Note", parent=base["Normal"],
fontSize=8.5, fontName="Helvetica-Oblique",
textColor=TEAL, spaceAfter=4, leading=12,
leftIndent=10, backColor=LGRAY,
borderPadding=(4, 6, 4, 6)
)
return dict(
cover_title=cover_title, cover_sub=cover_sub, cover_tag=cover_tag,
h1=h1, h2=h2, h3=h3, body=body, bullet=bullet,
subbullet=subbullet, bold_label=bold_label, highlight=highlight, note=note
)
S = make_styles()
def H1(text):
return Paragraph(f" {text}", S["h1"])
def H2(text):
return [
Paragraph(text, S["h2"]),
HRFlowable(width="100%", thickness=1, color=TEAL, spaceAfter=4)
]
def H3(text):
return Paragraph(text, S["h3"])
def B(text):
return Paragraph(f"• {text}", S["bullet"])
def SB(text):
return Paragraph(f"– {text}", S["subbullet"])
def P(text):
return Paragraph(text, S["body"])
def NOTE(text):
return Paragraph(f"📌 {text}", S["note"])
def SP(n=6):
return Spacer(1, n)
def divider():
return HRFlowable(width="100%", thickness=0.5, color=MGRAY, spaceAfter=6, spaceBefore=6)
def make_table(headers, rows, col_widths=None, header_bg=NAVY):
usable_w = W - 3.6*cm
if col_widths is None:
col_widths = [usable_w / len(headers)] * len(headers)
data = [[Paragraph(f"<b><font color='white'>{h}</font></b>", S["body"]) for h in headers]]
for i, row in enumerate(rows):
data.append([
Paragraph(str(c), S["body"]) for c in row
])
t = Table(data, colWidths=col_widths, repeatRows=1)
style = [
("BACKGROUND", (0,0), (-1,0), header_bg),
("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, LGRAY]),
("GRID", (0,0), (-1,-1), 0.4, MGRAY),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
]
t.setStyle(TableStyle(style))
return t
# ════════════════════════════════════════════════════════════════
# BUILD CONTENT
# ════════════════════════════════════════════════════════════════
story = []
# ── COVER PAGE ──────────────────────────────────────────────────
cover_table_data = [[
Paragraph("NATIONAL AIDS CONTROL<br/>PROGRAMME (NACP)", S["cover_title"]),
]]
cover_sub_data = [[
Paragraph("Complete Exam Notes | Park's Textbook SPM", S["cover_sub"]),
]]
cover_tag_data = [[
Paragraph("NACP-V (2021–26) | ICTC | IRCTC (Mobile ICTC) | Suraksha/SSK Clinic<br/>"
"PPTCT | HIV Surveillance | ART | STI Management", S["cover_tag"]),
]]
usable = W - 3.6*cm
def cover_block(para, bg):
t = Table([[para]], colWidths=[usable])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 18),
("BOTTOMPADDING", (0,0), (-1,-1), 18),
("LEFTPADDING", (0,0), (-1,-1), 14),
("RIGHTPADDING", (0,0), (-1,-1), 14),
("ROUNDEDCORNERS", [6]),
]))
return t
story.append(Spacer(1, 3.5*cm))
story.append(cover_block(cover_table_data[0][0], NAVY))
story.append(SP(12))
story.append(cover_block(cover_sub_data[0][0], TEAL))
story.append(SP(12))
story.append(cover_block(cover_tag_data[0][0], colors.HexColor("#1E3A5F")))
story.append(SP(20))
# badge strip
badges = [["Source: Park's Textbook of Preventive & Social Medicine + NACO Official Documents"]]
bt = Table(badges, colWidths=[usable])
bt.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), GOLD),
("FONTNAME", (0,0), (-1,-1), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9.5),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
]))
story.append(bt)
story.append(PageBreak())
# ── SECTION 1: BACKGROUND & LAUNCH ──────────────────────────────
story.append(H1("1. BACKGROUND & LAUNCH"))
story.append(SP(4))
for item in H2("Introduction"):
story.append(item)
story.append(P("The <b>National AIDS Control Programme (NACP)</b> was launched in India in <b>1987</b> in response "
"to the first detected case of HIV in 1986. The Ministry of Health and Family Welfare "
"established the <b>National AIDS Control Organization (NACO)</b> as a separate wing to "
"implement and closely monitor the various components of the programme."))
story.append(SP(4))
for item in H2("Aim of NACP"):
story.append(item)
story.append(B("Prevent further transmission of HIV"))
story.append(B("Decrease morbidity and mortality associated with HIV infection"))
story.append(B("Minimize the socio-economic impact resulting from HIV infection"))
# ── SECTION 2: MILESTONES ────────────────────────────────────────
story.append(SP(8))
story.append(H1("2. MILESTONES OF NACP"))
story.append(SP(4))
milestones = [
["1986", "First HIV case detected in India; AIDS Task Force set up by ICMR; National AIDS Committee established under Ministry of Health"],
["1987", "National AIDS Control Programme (NACP) launched"],
["1990", "Medium Term Plan launched for 4 states and 4 metros"],
["1992", "NACP-I launched; National AIDS Control Board constituted; NACO set up"],
["1999", "NACP-II begins — behaviour change, decentralisation, NGO involvement; State AIDS Control Societies established"],
["2002", "National AIDS Control Policy adopted; National Blood Policy adopted; PPTCT programme started"],
["2004", "Anti-Retroviral Treatment (ART) initiated"],
["2006", "National Council on AIDS constituted under PM; National Policy on Paediatric ART formulated"],
["2007", "NACP-III launched (2007–2012)"],
["2014", "NACP-IV launched (2012–2017, extended to 2021)"],
["2017", "HIV and AIDS (Prevention & Control) Act, 2017; NSP for HIV/AIDS & STIs 2017–2024"],
["2021", "NACP-V launched (2021–2026) — Current Phase"],
]
story.append(make_table(["Year", "Milestone"], milestones, col_widths=[1.8*cm, usable-1.8*cm]))
# ── SECTION 3: PHASES ────────────────────────────────────────────
story.append(SP(10))
story.append(H1("3. PHASES OF NACP"))
story.append(SP(4))
phases = [
["Medium Term Plan", "1990–92", "4 states + 4 metros; first structured response"],
["NACP-I", "1992–99", "Slow down spread of HIV infection"],
["NACP-II", "1999–2006", "Behaviour change, decentralisation, NGO involvement"],
["NACP-III", "2007–2012", "Halt and reverse epidemic; reduced new infections by 50%"],
["NACP-IV", "2012–2021", "Consolidate gains; integrate prevention with care-support-treatment"],
["NACP-V", "2021–2026", "End AIDS as public health threat by 2030; achieve 95-95-95"],
]
story.append(make_table(["Phase", "Period", "Focus"], phases,
col_widths=[2.4*cm, 2.2*cm, usable-4.6*cm]))
story.append(PageBreak())
# ── SECTION 4: NACP-V ────────────────────────────────────────────
story.append(H1("4. NACP-V (2021–2026) — CURRENT PHASE"))
story.append(SP(4))
for item in H2("Overview"):
story.append(item)
story.append(B("<b>Full name:</b> National AIDS and STD Control Programme, Phase-V"))
story.append(B("<b>Type:</b> Central Sector Scheme — 100% funded by Government of India"))
story.append(B("<b>Budget outlay:</b> Rs 15,471.94 crore"))
story.append(B("<b>Duration:</b> 2021–2026 (aligned with 15th Finance Commission)"))
story.append(B("<b>Aligned with:</b> UNAIDS Global AIDS Strategy 2021–26; WHO GHSS 2022–30; Global Fund 2021–24; UN SDG 3.3"))
story.append(SP(6))
for item in H2("Vision & Goal"):
story.append(item)
story.append(P("<b>Vision:</b> AIDS-free India"))
story.append(P("<b>Goal:</b> End the HIV/AIDS epidemic as a public health threat by 2030 through a comprehensive package of prevention, detection and treatment services."))
story.append(SP(6))
for item in H2("5 Goals of NACP-V"):
story.append(item)
goals = [
["Goal 1", "Reduce annual new HIV infections by 80% from 2010 baseline by 2025–26"],
["Goal 2", "Reduce AIDS-related mortalities by 80% from 2010 baseline by 2025–26"],
["Goal 3", "Eliminate vertical (mother-to-child) transmission of HIV and Syphilis"],
["Goal 4", "Promote universal access to quality STI/RTI services to at-risk and vulnerable populations"],
["Goal 5", "Eliminate HIV/AIDS-related stigma and discrimination"],
]
story.append(make_table(["Goal", "Description"], goals, col_widths=[1.8*cm, usable-1.8*cm],
header_bg=GREEN))
story.append(SP(8))
for item in H2("Specific Objectives of NACP-V"):
story.append(item)
story.append(H3("a. HIV/AIDS Prevention and Control"))
story.append(B("95% of people most at-risk of HIV use comprehensive prevention services"))
story.append(B("<b>95-95-95 target:</b>"))
story.append(SB("95% of PLHIV know their HIV status"))
story.append(SB("95% of those who know their status are on ART"))
story.append(SB("95% of those on ART have viral suppression"))
story.append(B("95% of pregnant and breastfeeding women living with HIV have suppressed viral load (for elimination of vertical transmission)"))
story.append(B("Less than 10% of PLHIV and key populations experience stigma and discrimination"))
story.append(SP(4))
story.append(H3("b. STI/RTI Prevention and Control"))
story.append(B("Universal access to quality STI/RTI services to at-risk and vulnerable populations"))
story.append(B("Attainment of dual elimination targets: vertical transmission of HIV and congenital syphilis"))
story.append(SP(8))
for item in H2("8 Guiding Principles of NACP-V"):
story.append(item)
principles = [
["1", "Keep beneficiary and community at centre"],
["2", "Break silos, build synergies"],
["3", "Augment strategic information-driven planning, implementation, M&E and mid-course corrections"],
["4", "Prioritize and optimize through high-impact programme management and review"],
["5", "Leverage technology and innovation as critical enablers"],
["6", "Enhance and harness partnerships (public, private, civil society)"],
["7", "Integrate gender-sensitive response"],
["8", "Continue fostering technical arrangements and institutions"],
]
story.append(make_table(["#", "Principle"], principles, col_widths=[0.7*cm, usable-0.7*cm],
header_bg=TEAL))
story.append(SP(8))
for item in H2("Key Gamechanger Initiatives (Built Upon in NACP-V)"):
story.append(item)
story.append(B("HIV and AIDS (Prevention and Control) Act, 2017 — cornerstone of national response"))
story.append(B("<b>Test and Treat Policy</b> — all PLHIV initiated on ART regardless of CD4 count"))
story.append(B("<b>Universal Viral Load Testing</b>"))
story.append(B("<b>Mission Sampark</b> — active tracing of PLHIV lost to follow-up"))
story.append(B("<b>Community-Based Screening</b> — ANMs at sub-centre level"))
story.append(B("Transition to <b>Dolutegravir (DTG)-based treatment regimen</b>"))
story.append(B("<b>Sampoorna Suraksha Kendras (SSK)</b> — NEW in NACP-V (see Section 10)"))
story.append(PageBreak())
# ── SECTION 5: ORGANIZATIONAL STRUCTURE ─────────────────────────
story.append(H1("5. ORGANIZATIONAL STRUCTURE (NACO)"))
story.append(SP(4))
for item in H2("National Level — NACO"):
story.append(item)
story.append(B("NACO is a division under the Ministry of Health and Family Welfare"))
story.append(B("Head: Additional Secretary (MoHFW) + Director General (NACO)"))
story.append(B("Technical divisions: headed by Deputy Director General / DGHS"))
story.append(B("Finance division: Director-Finance"))
story.append(B("Admin and Procurement: Joint Secretary, MoHFW"))
story.append(SP(4))
for item in H2("State Level"):
story.append(item)
story.append(B("State AIDS Control Societies (SACS) — established 1999 under NACP-II"))
story.append(B("Implement NACP at state level with 100% grant-in-aid from central government"))
story.append(SP(10))
# ── SECTION 6: DISTRICT CATEGORIZATION ──────────────────────────
story.append(H1("6. DISTRICT CATEGORIZATION (Epidemiological)"))
story.append(SP(4))
for item in H2("Classification Based on HIV Sentinel Surveillance Data (last 3 years)"):
story.append(item)
cat_data = [
["A", ">1% ANC/PTCT prevalence at any site", "156 districts"],
["B", "<1% ANC + >5% prevalence in any HRG (STD/CSW/MSM/IDU)", "39 districts"],
["C", "<1% ANC + <5% in all STD/HRG + known hot spots (migrants, truckers, factories, tourists)", "296 districts"],
["D", "<1% ANC + <5% HRG + no known hot spots OR poor HIV data", "118 districts"],
]
story.append(make_table(["Category", "Criteria", "No. of Districts"], cat_data,
col_widths=[1.5*cm, usable-3.8*cm, 2.3*cm]))
story.append(NOTE("Planning for HIV-related services is graded as per district category. This approach implemented since March 2007."))
story.append(SP(10))
# ── SECTION 7: HIV SURVEILLANCE ─────────────────────────────────
story.append(H1("7. HIV SURVEILLANCE"))
story.append(SP(4))
for item in H2("Types of Surveillance"):
story.append(item)
story.append(B("HIV Sentinel Surveillance <i>(main tool)</i>"))
story.append(B("HIV Sero-Surveillance"))
story.append(B("AIDS Case Surveillance"))
story.append(B("STD Surveillance"))
story.append(B("Behavioural Surveillance"))
story.append(B("Integration with surveillance of other diseases (e.g. TB)"))
story.append(SP(6))
for item in H2("HIV Sentinel Surveillance — Objectives"):
story.append(item)
story.append(B("Determine level of HIV infection among general population and HRGs in different states"))
story.append(B("Understand trends of HIV epidemic among general population and HRGs"))
story.append(B("Understand geographical spread and identify emerging pockets"))
story.append(B("Provide information for prioritization of programme resources and evaluation of programme impact"))
story.append(B("Estimate HIV prevalence and HIV burden in the country"))
story.append(SP(6))
for item in H2("Methodology — Sentinel Surveillance Round 2016–17"):
story.append(item)
surv_data = [
["HRG (IDU/MSM/FSW/TG)", "TI Projects", "250", "Once in 2 years", "Unlinked anonymous"],
["Bridge population (SMM/LDT)", "STD Clinic, TI Projects", "250", "Once in 2 years", "Consecutive"],
["General population (Pregnant women)", "ANC Clinic", "400", "Once in 2 years", "Consecutive"],
]
story.append(make_table(
["Population", "Site Type", "Sample Size", "Frequency", "Testing Method"],
surv_data,
col_widths=[3.5*cm, 3.2*cm, 1.8*cm, 2.5*cm, usable-11*cm]
))
story.append(SP(4))
story.append(P("<b>Total sentinel sites 2016–17: 1,323</b> (ANC-829, FSW-245, IDU-87, MSM-89, Truckers-28, Migrant-27, TG-18) | Age group: 15–49 years | Duration: 3 months"))
story.append(PageBreak())
# ── SECTION 8: COUNSELLING & TESTING SERVICES ───────────────────
story.append(H1("8. HIV COUNSELLING & TESTING SERVICES (HCTS)"))
story.append(SP(4))
story.append(P("Provided by the <b>Basic Service Division</b> of the Department of AIDS Control since <b>1997</b>. "
"Goal: identify as many PLHIV as early as possible and link them to prevention, care and treatment."))
story.append(SP(6))
for item in H2("Three Components"):
story.append(item)
story.append(B("<b>1.</b> Integrated Counselling and Testing Centres (ICTC)"))
story.append(B("<b>2.</b> Prevention of Parent-to-Child Transmission of HIV (PPTCT)"))
story.append(B("<b>3.</b> HIV/Tuberculosis Collaborative Activities"))
story.append(SP(8))
for item in H2("ICTC — Integrated Counselling and Testing Centres"):
story.append(item)
story.append(P("A person is counselled and tested for HIV at an ICTC either:"))
story.append(B("<b>Client-initiated</b> — of the person's own free will"))
story.append(B("<b>Provider-initiated (PITC)</b> — as advised by a service provider"))
story.append(SP(6))
story.append(H3("Types of ICTC Facilities"))
story.append(SP(4))
ictc_types = [
["Standalone ICTC\n(SA-ICTC)",
"High client load; full-time counsellor + laboratory technician; provides complete HIV counselling and testing; located at hospitals/healthcare facilities"],
["Facility-Integrated ICTC\n(F-ICTC)",
"Integrated within existing health facility service delivery; part of the regular health system"],
["Mobile ICTC\n(M-ICTC)\n— 'IRCTC' in exam context",
"Set up as temporary clinics in HARD-TO-REACH areas; FLEXIBLE working hours; provides wide range of services (HIV counselling, testing, referral); key outreach tool for inaccessible/migrant populations"],
]
story.append(make_table(
["Type", "Description"],
ictc_types,
col_widths=[3.5*cm, usable-3.5*cm]
))
story.append(NOTE("IRCTC = Mobile ICTC units deployed as temporary/roving clinics in hard-to-reach areas with flexible working hours. This is the term often used in exam questions."))
story.append(SP(6))
story.append(H3("Community-Based Screening"))
story.append(B("Conducted by frontline health workers — <b>Auxiliary Nurse Midwives (ANMs)</b> at sub-centre level"))
story.append(B("Focus: prevention of parent-to-child transmission"))
story.append(B("Community-based HIV screening expanded under NACP-V as a gamechanger initiative"))
story.append(PageBreak())
# ── SECTION 9: PPTCT ────────────────────────────────────────────
story.append(H1("9. PREVENTION OF PARENT-TO-CHILD TRANSMISSION (PPTCT)"))
story.append(SP(4))
for item in H2("Overview"):
story.append(item)
story.append(B("PPTCT programme started in <b>2002</b>"))
story.append(B("<b>>15,000 ICTCs</b> currently offer PPTCT services to pregnant women"))
story.append(B("<b>Aim:</b> Universal HIV testing for all pregnant women; eliminate mother-to-child transmission"))
story.append(SP(6))
for item in H2("Evolution of Strategy"):
story.append(item)
evol_data = [
["2002", "Single-dose Nevirapine (SD-NVP)", "During labour for mother + to newborn immediately after birth"],
["Sept 2012", "Multi-drug ARV prophylaxis (WHO Option B)", "Initially in AP, Karnataka and Tamil Nadu; later nationwide"],
["Dec 2013\nonwards", "Lifelong triple-drug ART\n(TDF + 3TC + EFV) — Option B+", "All HIV+ pregnant and breastfeeding women regardless of CD4 count or clinical stage"],
]
story.append(make_table(["Period", "Strategy", "Details"], evol_data,
col_widths=[2.5*cm, 3.5*cm, usable-6*cm], header_bg=GREEN))
story.append(SP(6))
for item in H2("Essential Package of PPTCT Services (10 Elements)"):
story.append(item)
story.append(B("Routine offer of HIV counselling and testing to all pregnant women with <b>'opt-out' option</b>"))
story.append(B("Shift from <b>'ANC-Centric' to 'Family-Centric' approach</b> — involve spouse and family members"))
story.append(B("Lifelong ART (<b>TDF + 3TC + EFV</b>) regardless of CD4 count or WHO clinical stage"))
story.append(B("Promotion of institutional deliveries of all HIV-infected pregnant women"))
story.append(B("Care for associated conditions (STI/RTI, TB and other opportunistic infections)"))
story.append(B("Nutrition, counselling and psychosocial support for HIV-infected pregnant women"))
story.append(B("Husband/partner involvement in PPTCT process"))
story.append(B("Infant feeding counselling"))
story.append(B("Follow-up and monitoring of HIV-exposed infants"))
story.append(B("Co-trimoxazole Prophylactic Therapy (CPT) + Early Infant Diagnosis (EID) using <b>HIV-DNA PCR at 6 weeks</b>; community follow-up through local networks"))
story.append(PageBreak())
# ── SECTION 10: SSK / SURAKSHA CLINIC ───────────────────────────
story.append(H1("10. SAMPOORNA SURAKSHA KENDRA (SSK) & SURAKSHA CLINICS"))
story.append(SP(4))
for item in H2("Sampoorna Suraksha Kendra (SSK) — NEW in NACP-V"):
story.append(item)
story.append(P("A <b>single-window model</b> for those 'at risk' for HIV and STI, introduced under NACP-V, covering the full <b>prevention–test–treat–care continuum</b>."))
story.append(B("Holistic set of services customised as per client's needs"))
story.append(B("Strong linkages and referrals within and outside health systems"))
story.append(B("Consolidates and augments ICTC + Suraksha Clinic + STI services under one roof"))
story.append(B("Serves key populations: FSW, MSM, TG, PWID, bridge populations and general at-risk individuals"))
story.append(NOTE("SSK is the upgraded, integrated successor to standalone ICTCs and designated STI/Suraksha clinics in NACP-V."))
story.append(SP(8))
for item in H2("Designated STI/RTI Clinics — 'Suraksha Clinics'"):
story.append(item)
story.append(P("Designated STI/RTI clinics set up by NACO across the country for <b>syndromic management</b> of STI/RTI. "
"These form the backbone of STI control under NACP and are now being integrated into SSKs under NACP-V."))
story.append(SP(4))
story.append(H3("Services Provided at Suraksha Clinics:"))
story.append(B("STI/RTI diagnosis and treatment using syndromic approach"))
story.append(B("HIV testing and referral to ICTC/ART centre"))
story.append(B("Condom promotion and distribution"))
story.append(B("Behaviour change counselling"))
story.append(SP(6))
for item in H2("Pre-packed Colour-Coded STI/RTI Kits (Syndromic Management)"):
story.append(item)
story.append(P("Centrally procured and supplied free of cost to all State AIDS Control Societies."))
story.append(SP(4))
kit_data = [
["Kit 1", "Grey", "Urethral discharge, ano-rectal discharge, cervicitis"],
["Kit 2", "Green", "Vaginitis"],
["Kit 3", "White", "Genital ulcers"],
["Kit 4", "Blue", "Genital ulcers"],
["Kit 5", "Red", "Genital ulcers"],
["Kit 6", "Yellow", "Lower abdominal pain"],
["Kit 7", "Black", "Inguinal bubo"],
]
story.append(make_table(["Kit No.", "Colour", "Indication"], kit_data,
col_widths=[1.6*cm, 2*cm, usable-3.6*cm], header_bg=RED))
story.append(PageBreak())
# ── SECTION 11: HIV-TB ───────────────────────────────────────────
story.append(H1("11. HIV–TB COORDINATION"))
story.append(SP(4))
story.append(B("Joint implementation by NACP and RNTCP since <b>2007–08</b>"))
story.append(B("Case fatality rate in HIV-infected TB: <b>13–14%</b> vs <4% in HIV-negative TB"))
story.append(B("HIV testing in <b>presumptive TB cases</b> rolled out October 2012 (Karnataka first, then MH, AP, TN)"))
story.append(B("<b>4-symptom complex screening</b> at every ART centre visit for TB (cough, fever, weight loss, night sweats)"))
story.append(B("<b>Isoniazid Prophylaxis Therapy (IPT)</b> given when TB is ruled out in PLHIV"))
story.append(B("Co-infected patients: <b>Anti-TB treatment first</b>, then ART"))
story.append(B("NACP and RNTCP jointly decided to offer HIV testing upstream — during TB symptoms evaluation"))
story.append(B("Strategy extended to high HIV prevalence A and B category districts; recommended for 25–54 year age group"))
story.append(SP(10))
# ── SECTION 12: CARE, SUPPORT & TREATMENT ───────────────────────
story.append(H1("12. CARE, SUPPORT & TREATMENT (CST)"))
story.append(SP(4))
for item in H2("Policy Package"):
story.append(item)
story.append(B("Free universal lifelong standardized ART"))
story.append(B("Free laboratory diagnostic and monitoring services (baseline tests, CD4 testing, targeted viral load)"))
story.append(B("Facilitating long-term retention in care"))
story.append(B("Prevention, diagnosis and management of opportunistic infections"))
story.append(B("Linkage to care and support services and social protection schemes"))
story.append(SP(6))
for item in H2("95-95-95 Fast Track Targets (NACP-V)"):
story.append(item)
ft_data = [
["First 95", "95% of PLHIV know their HIV status"],
["Second 95", "95% of PLHIV who know their status are on ART"],
["Third 95", "95% of PLHIV on ART achieve viral suppression (VL <1000 copies/mL)"],
["Overall goal", "End AIDS as a public health threat by 2030"],
]
story.append(make_table(["Target", "Description"], ft_data,
col_widths=[2.8*cm, usable-2.8*cm], header_bg=NAVY))
story.append(NOTE("NACP-IV used 90-90-90; NACP-V upgraded this to 95-95-95."))
story.append(SP(6))
for item in H2("ART Infrastructure (as of September 2019)"):
story.append(item)
infra_data = [
["ART Centres", "548"],
["Link ART Centres (LAC)", "1,236"],
["Centres of Excellence (CoE)", "17"],
["Paediatric Centres of Excellence", "7"],
["ART Plus Centres", "93"],
["Care and Support Centres", "310"],
]
story.append(make_table(["Facility", "Number"], infra_data,
col_widths=[usable-2.5*cm, 2.5*cm]))
story.append(SP(6))
for item in H2("ART Services"):
story.append(item)
story.append(B("<b>First-line ART:</b> Free for all eligible PLHIV; eligibility by clinical exam + CD4 count; 11.33 lakh on first-line ART (August 2017)"))
story.append(B("<b>Alternative first-line ART:</b> For patients with toxicity/intolerance to first-line — via CoE and ART Plus centres"))
story.append(B("<b>Second-line ART:</b> Through CoE and ART Plus centres"))
story.append(B("<b>Paediatric ART:</b> Including second-line at CoE/ART Plus centres"))
story.append(B("<b>NACP-V update:</b> Transition to <b>Dolutegravir (DTG)-based regimen</b>"))
story.append(B("<b>Follow-up:</b> Monthly basis — weight, clinical evaluation, OI screening; CD4 every 6 months; adherence counselling every visit"))
story.append(SP(6))
for item in H2("Management of Opportunistic Infections"):
story.append(item)
oi_data = [
["HIV–TB", "4-symptom screen; Anti-TB treatment first then ART; IPT when TB ruled out"],
["HIV–Hepatitis B", "TDF + 3TC/FTC (dual action against HIV + HBV); part of standard ART regimen"],
["HIV–Hepatitis C", "Direct-acting antivirals (DAAs): sofosbuvir, grazoprevir, glecaprevir"],
["HIV–Kala-azar", "Endemic in UP, Bihar, Jharkhand; screen all PLHIV with suggestive symptoms; refer for treatment"],
["Low CD4 / Other OIs", "Co-trimoxazole prophylaxis; screen and treat at ART centre or refer"],
]
story.append(make_table(["Co-infection", "Management"], oi_data,
col_widths=[2.8*cm, usable-2.8*cm]))
story.append(SP(6))
for item in H2("Early Infant Diagnosis (EID)"):
story.append(item)
story.append(B("Programme launched for confirmatory diagnosis of HIV-exposed children"))
story.append(B("HIV-DNA PCR test at <b>6 weeks</b> of age onwards"))
story.append(B("All children confirmed through EID linked to ART services"))
story.append(PageBreak())
# ── SECTION 13: PREVENTION SERVICES ────────────────────────────
story.append(H1("13. PREVENTION SERVICES"))
story.append(SP(4))
for item in H2("Package of Prevention Services (NACP)"):
story.append(item)
story.append(B("Targeted interventions for HRGs and bridge populations"))
story.append(B("Needle-syringe exchange programme (NSEP) and opioid substitution therapy (OST) for IDUs"))
story.append(B("Prevention interventions for migrants (source, transit, destination)"))
story.append(B("Link worker scheme for HRGs in rural areas"))
story.append(B("Prevention and control of STIs/RTIs"))
story.append(B("Blood safety"))
story.append(B("HIV counselling and testing services"))
story.append(B("Prevention of parent-to-child transmission (PPTCT)"))
story.append(B("Condom promotion"))
story.append(B("IEC, BCC, social mobilization, youth interventions"))
story.append(B("Mainstreaming HIV/AIDS response; workplace interventions"))
story.append(SP(6))
for item in H2("Targeted Interventions (TI) for High-Risk Groups"):
story.append(item)
story.append(P("<b>Objective:</b> Improve health-seeking behaviour of HRGs; reduce risk of STI and HIV acquisition."))
story.append(SP(4))
story.append(H3("HRGs Covered:"))
story.append(B("Female Sex Workers (FSW)"))
story.append(B("Men who have Sex with Men (MSM)"))
story.append(B("Transgenders / Hijras (TG)"))
story.append(B("Injecting Drug Users (IDU) / Persons Who Inject Drugs (PWID)"))
story.append(B("Bridge populations: Truckers and Migrants"))
story.append(SP(4))
story.append(H3("Components of TI:"))
story.append(B("Community organization and ownership building"))
story.append(B("<b>For IDUs/PWID:</b>"))
story.append(SB("Needle-Syringe Exchange Programme (NSEP)"))
story.append(SB("Abscess prevention and management"))
story.append(SB("Opioid Substitution Therapy (OST)"))
story.append(SB("Linkage to detoxification and rehabilitation services"))
story.append(SB("NACP-V: OST expansion in collaboration with Ministry of Social Justice and Empowerment"))
story.append(B("<b>For MSM/TG:</b>"))
story.append(SB("Provision of lubricants"))
story.append(SB("Project-based STI clinics"))
story.append(SB("Specific interventions for TG/Hijra populations"))
story.append(SP(6))
for item in H2("Link Worker Scheme"):
story.append(item)
story.append(B("<b>Nature:</b> Community-based outreach strategy for HIV prevention and care in rural areas"))
story.append(B("<b>Coverage:</b> 18 states, 163 highly vulnerable districts"))
story.append(B("Services: prevention info, condom promotion/distribution, referral, STI/OI counselling and treatment, reduce stigma"))
story.append(SP(6))
for item in H2("Condom Promotion"):
story.append(item)
story.append(B("Free distribution through social marketing channels and non-traditional outlets"))
story.append(B("Female condom promotion"))
story.append(B("Effective communication strategy linking prevention with care, support and treatment"))
story.append(PageBreak())
# ── SECTION 14: BLOOD TRANSFUSION ───────────────────────────────
story.append(H1("14. BLOOD TRANSFUSION SERVICES"))
story.append(SP(4))
story.append(B("Division renamed: Blood Safety → <b>Division of Blood Transfusion Services</b>"))
story.append(B("Blood Transfusion Councils set up at national and state levels"))
story.append(B("<b>Professional blood donation prohibited since 1st January 1998</b>"))
story.append(B("Only licensed blood banks permitted to operate; voluntary blood donation encouraged"))
story.append(B("<b>Mandatory testing of every blood unit for:</b> HIV, Hepatitis B, Hepatitis C, Malaria and Syphilis"))
story.append(SP(4))
for item in H2("NACO-Supported Blood Bank Infrastructure"):
story.append(item)
bb_data = [
["Total blood banks", "1,131"],
["Blood Component Separation Units (BCSU)", "590"],
["Model Blood Banks", "34"],
["Major blood banks", "108"],
["District-level blood banks", "591"],
]
story.append(make_table(["Facility", "Number"], bb_data, col_widths=[usable-2.5*cm, 2.5*cm]))
story.append(SP(4))
story.append(B("<b>Blood Storage Centres</b> established at First Referral Units (FRUs) at sub-district level for rural emergency obstetric and trauma care"))
story.append(SP(10))
# ── SECTION 15: IEC/BCC ──────────────────────────────────────────
story.append(H1("15. IEC / BCC AND SOCIAL MOBILIZATION"))
story.append(SP(4))
for item in H2("Communication Objectives"):
story.append(item)
story.append(B("Increase knowledge among general population (esp. youth and women) on safe sexual behaviour"))
story.append(B("Sustain behaviour change in HRGs and bridge populations"))
story.append(B("Generate demand for care, support and treatment services"))
story.append(B("Reduce stigma and discrimination through societal norm change"))
story.append(SP(6))
for item in H2("Key IEC Initiatives"):
story.append(item)
story.append(H3("Adolescence Education Programme (AEP)"))
story.append(B("For class IX and XI students in secondary and senior secondary schools"))
story.append(B("<b>16-hour sessions</b> scheduled during academic terms"))
story.append(B("Implemented in 23 states; 49,000 schools covered by March 2014"))
story.append(B("Builds life skills to cope with physical and psychological changes of growing up"))
story.append(SP(4))
story.append(H3("Red Ribbon Clubs"))
story.append(B("Formed in <b>colleges</b>"))
story.append(B("Purpose: peer-to-peer messaging on HIV prevention"))
story.append(B("Provides safe space for youth to seek clarifications on HIV/AIDS"))
story.append(PageBreak())
# ── SECTION 16: NSP 2017-2024 ────────────────────────────────────
story.append(H1("16. NATIONAL STRATEGIC PLAN (NSP) FOR HIV/AIDS AND STIs 2017–2024"))
story.append(SP(4))
story.append(P("<b>Vision:</b> AIDS-free India | <b>Mission:</b> Universal coverage of HIV prevention, testing, treatment to care continuum"))
story.append(P("<b>Goal:</b> Zero new infections + Zero AIDS-related deaths + Zero stigma and discrimination"))
story.append(SP(4))
for item in H2("Three Epidemiological Contexts (Strategic Framework)"):
story.append(item)
epi_data = [
["Mature", "High HIV incidence and prevalence in key/bridge populations; may extend to general population"],
["Emerging", "Relatively new and rising rates among key/bridge populations"],
["Low/Stable", "Still need focus on at-risk populations to maintain low rates and eliminate HIV transmission"],
]
story.append(make_table(["Context", "Description"], epi_data, col_widths=[2*cm, usable-2*cm]))
story.append(SP(6))
for item in H2("6 Objectives of NSP 2017–2024"):
story.append(item)
nsp_obj = [
["1", "Reduce new HIV infections by 80% (from 2010 baseline) by 2024"],
["2", "Ensure 95% of estimated PLHIV know their status by 2024"],
["3", "Ensure 95% PLHIV have ART initiation and retention by 2024 for sustained viral suppression"],
["4", "Eliminate mother-to-child transmission of HIV and syphilis by 2020"],
["5", "Eliminate HIV/AIDS-related stigma and discrimination by 2020"],
["6", "Facilitate sustainable NACP service delivery by 2024"],
]
story.append(make_table(["#", "Objective"], nsp_obj, col_widths=[0.7*cm, usable-0.7*cm]))
story.append(SP(10))
# ── SECTION 17: QUICK RECALL TABLE ──────────────────────────────
story.append(H1("17. QUICK RECALL — KEY FACTS & NUMBERS (MCQ Bullets)"))
story.append(SP(4))
qr_data = [
["NACP launched", "1987"],
["NACO set up", "1992"],
["HCTS services since", "1997"],
["PPTCT started", "2002"],
["ART initiated", "2004"],
["Professional blood donation prohibited", "1st January 1998"],
["NACP-V period", "2021–2026"],
["NACP-V budget", "Rs 15,471.94 crore (Central Sector Scheme)"],
["NACP-V fast track target", "95-95-95"],
["Infection/mortality reduction target (NACP-V)", "80% from 2010 baseline by 2025-26"],
["ICTCs offering PPTCT", ">15,000"],
["Total sentinel sites (2016-17)", "1,323"],
["ART centres (Sept 2019)", "548"],
["Link ART Centres", "1,236"],
["Blood banks supported by NACO", "1,131"],
["Link worker scheme coverage", "18 states, 163 districts"],
["EID test + timing", "HIV-DNA PCR at 6 weeks"],
["First-line ART (PPTCT)", "TDF + 3TC + EFV"],
["NACP-V ART regimen", "Dolutegravir (DTG)-based"],
["STI colour-coded kits", "7 kits"],
["IRCTC (exam term)", "Mobile ICTC — temporary clinics in hard-to-reach areas with flexible hours"],
["SSK", "Sampoorna Suraksha Kendra — single-window prevention-test-treat-care model (NACP-V)"],
["NACP-V ANC sample size", "400; HRG 250"],
["Sentinel surveillance frequency", "Once in 2 years"],
["Category A districts", "156 (>1% ANC prevalence)"],
]
story.append(make_table(["Fact", "Value / Detail"], qr_data,
col_widths=[4.5*cm, usable-4.5*cm]))
story.append(SP(10))
# ── FOOTER SUMMARY BOX ───────────────────────────────────────────
summary_text = (
"<b>EXAM SUMMARY SENTENCE:</b> NACP-V (2021–26) is a 100% centrally funded scheme (Rs 15,472 crore) "
"targeting 95-95-95, 80% reduction in new infections and AIDS deaths from 2010 baseline, "
"dual elimination of MTCT of HIV and syphilis, universal STI/RTI access, and zero stigma — "
"built on Test & Treat, Universal Viral Load, Mission Sampark, DTG regimen, "
"and the new Sampoorna Suraksha Kendras (SSK) as single-window prevention–test–treat–care centres."
)
summary_para = Paragraph(summary_text, ParagraphStyle(
"Summary", parent=getSampleStyleSheet()["Normal"],
fontSize=9, textColor=WHITE, fontName="Helvetica",
leading=14, backColor=NAVY,
borderPadding=(10, 12, 10, 12),
leftIndent=0, rightIndent=0
))
s_table = Table([[summary_para]], colWidths=[usable])
s_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING", (0,0), (-1,-1), 10),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
]))
story.append(s_table)
# ── BUILD ────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved: {OUTPUT}")