Need a national immunisation schedule and details about each vaccine and transport system and adverse effects in a easy way to remember as a PDF for revision

Reading File
Finding Sources
Finding Sources
Reading File
Finding Sources
Finding Sources
Reading File
Finding Sources
Finding Sources
Reading File
Running Command

mkdir -p /tmp/workspace/immunisation-pdf && python3 << 'PYEOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import cm, mm 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 ListItem, ListFlowable OUTPUT = "/tmp/workspace/immunisation-pdf/National_Immunisation_Schedule_Revision.pdf" doc = SimpleDocTemplate( OUTPUT, pagesize=A4, rightMargin=1.5*cm, leftMargin=1.5*cm, topMargin=1.5*cm, bottomMargin=1.5*cm, title="National Immunisation Schedule - Quick Revision", author="Orris Medical" ) # ─── Colour palette ─────────────────────────────────────────────── NAVY = colors.HexColor('#1a237e') BLUE = colors.HexColor('#1565c0') LTBLUE = colors.HexColor('#e3f2fd') GREEN = colors.HexColor('#1b5e20') LTGREEN = colors.HexColor('#e8f5e9') ORANGE = colors.HexColor('#e65100') LTORANGE= colors.HexColor('#fff3e0') RED = colors.HexColor('#b71c1c') LTRED = colors.HexColor('#ffebee') TEAL = colors.HexColor('#004d40') LTTEAL = colors.HexColor('#e0f2f1') GREY = colors.HexColor('#37474f') LTGREY = colors.HexColor('#f5f5f5') WHITE = colors.white YELLOW = colors.HexColor('#fff9c4') styles = getSampleStyleSheet() def S(name, **kw): return ParagraphStyle(name, parent=styles['Normal'], **kw) # ─── Custom styles ──────────────────────────────────────────────── titleStyle = S('Title2', fontSize=22, textColor=WHITE, alignment=TA_CENTER, fontName='Helvetica-Bold', spaceAfter=4, leading=28) subtitleStyle= S('Subtitle2', fontSize=11, textColor=colors.HexColor('#bbdefb'), alignment=TA_CENTER, fontName='Helvetica', spaceAfter=2) h1 = S('H1', fontSize=13, textColor=WHITE, fontName='Helvetica-Bold', spaceAfter=2, leading=18, spaceBefore=8) h2 = S('H2', fontSize=11, textColor=NAVY, fontName='Helvetica-Bold', spaceAfter=3, spaceBefore=6) h3 = S('H3', fontSize=10, textColor=TEAL, fontName='Helvetica-Bold', spaceAfter=2, spaceBefore=4) body = S('Body2', fontSize=8.5, textColor=GREY, fontName='Helvetica', spaceAfter=3, leading=13) bodyBold = S('BodyBold', fontSize=8.5, textColor=GREY, fontName='Helvetica-Bold', spaceAfter=2, leading=13) small = S('Small', fontSize=7.5, textColor=GREY, fontName='Helvetica', spaceAfter=2, leading=11) mnemo = S('Mnemo', fontSize=9, textColor=ORANGE, fontName='Helvetica-Bold', spaceAfter=2, leading=13, backColor=LTORANGE) warn = S('Warn', fontSize=8.5, textColor=RED, fontName='Helvetica-Bold', spaceAfter=2, leading=13) def section_header(text, color=NAVY): data = [[Paragraph(text, h1)]] t = Table(data, colWidths=[17.5*cm]) t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), color), ('ROUNDEDCORNERS', [5,5,5,5]), ('TOPPADDING', (0,0), (-1,-1), 7), ('BOTTOMPADDING', (0,0), (-1,-1), 7), ('LEFTPADDING', (0,0), (-1,-1), 10), ])) return t def mnemonic_box(text, title="Memory Aid"): data = [[Paragraph(f'<b>🧠 {title}:</b> {text}', mnemo)]] t = Table(data, colWidths=[17.5*cm]) t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), LTORANGE), ('BOX', (0,0), (-1,-1), 1.5, ORANGE), ('TOPPADDING', (0,0), (-1,-1), 6), ('BOTTOMPADDING', (0,0), (-1,-1), 6), ('LEFTPADDING', (0,0), (-1,-1), 10), ('RIGHTPADDING', (0,0), (-1,-1), 10), ])) return t def tip_box(text): data = [[Paragraph(f'<b>Key Point:</b> {text}', S('tip', parent=styles['Normal'], fontSize=8.5, textColor=GREEN, fontName='Helvetica-Bold', leading=13))]] t = Table(data, colWidths=[17.5*cm]) t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), LTGREEN), ('BOX', (0,0), (-1,-1), 1.2, GREEN), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 10), ])) return t # ════════════════════════════════════════════════════════════════ # CONTENT # ════════════════════════════════════════════════════════════════ story = [] # ── COVER ────────────────────────────────────────────────────── cover_data = [[Paragraph("National Immunisation Schedule", titleStyle)], [Paragraph("India (UIP / NIS 2020) — Quick Revision Guide", subtitleStyle)], [Paragraph("Vaccines • Cold Chain • Adverse Effects • Memory Mnemonics", subtitleStyle)], [Paragraph("Source: Park's Textbook of Preventive and Social Medicine", S('src', parent=styles['Normal'], fontSize=8, textColor=colors.HexColor('#90caf9'), alignment=TA_CENTER, fontName='Helvetica-Oblique'))]] cover = Table(cover_data, colWidths=[17.5*cm]) cover.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), NAVY), ('TOPPADDING', (0,0), (-1,-1), 12), ('BOTTOMPADDING', (0,0), (-1,-1), 10), ('LEFTPADDING', (0,0), (-1,-1), 16), ('RIGHTPADDING', (0,0), (-1,-1), 16), ('ROUNDEDCORNERS', [8,8,8,8]), ])) story.append(cover) story.append(Spacer(1, 0.4*cm)) # ══════════════════════════════════════════════════════════════ # SECTION 1 – NATIONAL IMMUNISATION SCHEDULE (NIS 2020) # ══════════════════════════════════════════════════════════════ story.append(section_header("1. National Immunisation Schedule (NIS 2020) — India")) story.append(Spacer(1, 0.2*cm)) nis_header_style = S('nisH', fontSize=8.5, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=11) nis_body_style = S('nisB', fontSize=8, textColor=GREY, fontName='Helvetica', leading=11, alignment=TA_CENTER) nis_left_style = S('nisL', fontSize=8, textColor=GREY, fontName='Helvetica', leading=11) nis_bold_style = S('nisBold', fontSize=8, textColor=NAVY, fontName='Helvetica-Bold', leading=11) def P(t, st=nis_body_style): return Paragraph(t, st) def PL(t): return Paragraph(t, nis_left_style) def PB(t): return Paragraph(t, nis_bold_style) def PH(t): return Paragraph(t, nis_header_style) NIS_DATA = [ [PH("Age"), PH("Vaccine"), PH("Dose"), PH("Route"), PH("Site")], # Birth [PB("At Birth"), PL("BCG"), P("0.1 mL"), P("Intradermal"), P("Left upper arm")], [PB(""), PL("OPV-0 (birth dose)"), P("2 drops"), P("Oral"), P("Mouth")], [PB(""), PL("Hep B-1"), P("0.5 mL"), P("IM"), P("Anterolateral thigh")], # 6 weeks [PB("6 Weeks"), PL("OPV-1"), P("2 drops"), P("Oral"), P("Mouth")], [PB(""), PL("Pentavalent-1\n(DPT+HepB+Hib)"), P("0.5 mL"), P("IM"), P("Anterolateral thigh")], [PB(""), PL("Rotavirus-1*"), P("5 drops"), P("Oral"), P("Mouth")], [PB(""), PL("IPV-1 (fIPV 0.1 mL)*"), P("0.1 mL"), P("ID"), P("Right upper arm")], [PB(""), PL("PCV-1*"), P("0.5 mL"), P("IM"), P("Anterolateral thigh")], # 10 weeks [PB("10 Weeks"), PL("OPV-2"), P("2 drops"), P("Oral"), P("Mouth")], [PB(""), PL("Pentavalent-2"), P("0.5 mL"), P("IM"), P("Anterolateral thigh")], [PB(""), PL("Rotavirus-2*"), P("5 drops"), P("Oral"), P("Mouth")], [PB(""), PL("IPV-2 (fIPV 0.1 mL)*"), P("0.1 mL"), P("ID"), P("Right upper arm")], # 14 weeks [PB("14 Weeks"), PL("OPV-3"), P("2 drops"), P("Oral"), P("Mouth")], [PB(""), PL("Pentavalent-3"), P("0.5 mL"), P("IM"), P("Anterolateral thigh")], [PB(""), PL("Rotavirus-3*"), P("5 drops"), P("Oral"), P("Mouth")], [PB(""), PL("IPV (full dose 0.5 mL)*"), P("0.5 mL"), P("IM"), P("Anterolateral thigh")], [PB(""), PL("PCV-2*"), P("0.5 mL"), P("IM"), P("Anterolateral thigh")], # 9 months [PB("9–12 Months"), PL("Measles-Rubella (MR)-1"), P("0.5 mL"), P("SC"), P("Right upper arm")], [PB(""), PL("Vitamin A (1st dose)\n1 lakh IU"), P("1 mL"), P("Oral"), P("Mouth")], [PB(""), PL("PCV Booster*"), P("0.5 mL"), P("IM"), P("Anterolateral thigh")], # 16-24 months [PB("16–24 Months"), PL("DPT Booster-1"), P("0.5 mL"), P("IM"), P("Anterolateral thigh")], [PB(""), PL("OPV Booster"), P("2 drops"), P("Oral"), P("Mouth")], [PB(""), PL("MR-2"), P("0.5 mL"), P("SC"), P("Right upper arm")], [PB(""), PL("Vitamin A (2nd–9th dose)\n2 lakh IU every 6 months"), P("2 mL"), P("Oral"), P("Mouth")], # 5-6 years [PB("5–6 Years"), PL("DPT Booster-2"), P("0.5 mL"), P("IM"), P("Upper arm")], # 10 & 16 years [PB("10 & 16 Years"), PL("TT (Tetanus Toxoid)"), P("0.5 mL"), P("IM"), P("Upper arm")], # Pregnant women [PB("Pregnancy\n(TT/Td)"), PL("TT-1: early pregnancy\nTT-2: 4 wks after TT-1\nTT-Booster: if prev immunized"), P("0.5 mL"), P("IM"), P("Upper arm")], ] col_w = [2.4*cm, 4.5*cm, 2.0*cm, 2.0*cm, 3.5*cm] nis_table = Table(NIS_DATA, colWidths=col_w, repeatRows=1) row_colors = [] for i in range(1, len(NIS_DATA)): bg = LTBLUE if i % 2 == 0 else WHITE row_colors.append(('BACKGROUND', (0, i), (-1, i), bg)) nis_table.setStyle(TableStyle([ ('BACKGROUND', (0, 0), (-1, 0), BLUE), ('TEXTCOLOR', (0, 0), (-1, 0), WHITE), ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'), ('FONTSIZE', (0, 0), (-1, 0), 8.5), ('ROWBACKGROUNDS', (0, 1), (-1, -1), [WHITE, LTBLUE]), ('BOX', (0, 0), (-1, -1), 0.8, BLUE), ('INNERGRID', (0, 0), (-1, -1), 0.4, colors.HexColor('#b0bec5')), ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), ('TOPPADDING', (0, 0), (-1, -1), 4), ('BOTTOMPADDING', (0, 0), (-1, -1), 4), ('LEFTPADDING', (0, 0), (-1, -1), 5), ('RIGHTPADDING', (0, 0), (-1, -1), 5), # Span age groups ('SPAN', (0, 1), (0, 3)), # Birth ('SPAN', (0, 4), (0, 8)), # 6 weeks ('SPAN', (0, 9), (0, 12)), # 10 weeks ('SPAN', (0, 13), (0, 17)), # 14 weeks ('SPAN', (0, 18), (0, 20)), # 9-12 months ('SPAN', (0, 21), (0, 24)), # 16-24 months ('VALIGN', (0, 1), (0, -1), 'MIDDLE'), ('FONTNAME', (0, 1), (0, -1), 'Helvetica-Bold'), ('TEXTCOLOR', (0, 1), (0, -1), NAVY), ])) story.append(nis_table) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("* Phase-wise introduction across states. fIPV = fractional IPV.", small)) story.append(mnemonic_box( "<b>B</b>irth: BCG, OPV-0, HepB-1 | <b>6</b>W: OPV-1 + Penta-1 + Rota-1 + fIPV-1 + PCV-1 | " "<b>10</b>W: OPV-2 + Penta-2 + Rota-2 + fIPV-2 | <b>14</b>W: OPV-3 + Penta-3 + Rota-3 + IPV + PCV-2 | " "<b>9M</b>: MR-1 + Vit A | <b>16-24M</b>: DPT B1 + OPV B + MR-2 + Vit A 2nd | <b>5Y</b>: DPT B2 | <b>10/16Y</b>: TT", "NIS Quick Timeline")) story.append(Spacer(1, 0.3*cm)) # ══════════════════════════════════════════════════════════════ # SECTION 2 – INDIVIDUAL VACCINE DETAILS # ══════════════════════════════════════════════════════════════ story.append(PageBreak()) story.append(section_header("2. Individual Vaccine Details", TEAL)) story.append(Spacer(1, 0.25*cm)) vax_h_style = S('vaxH', fontSize=9, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=12) vax_b_style = S('vaxB', fontSize=8, textColor=GREY, fontName='Helvetica', leading=11) vax_bl_style = S('vaxBL', fontSize=8, textColor=GREY, fontName='Helvetica-Bold', leading=11) def VH(t): return Paragraph(t, vax_h_style) def VB(t): return Paragraph(t, vax_b_style) def VBL(t): return Paragraph(t, vax_bl_style) # ── 2a. BCG ─────────────────────────────────────────────────── story.append(Paragraph("BCG (Bacillus Calmette-Guerin)", h2)) bcg_data = [ [VH("Feature"), VH("Details")], [VBL("Type"), VB("Live attenuated (Mycobacterium bovis)")], [VBL("Strain"), VB("Danish 1331 strain used in India")], [VBL("Schedule"), VB("At birth (up to 1 year if missed); Single dose")], [VBL("Dose & Route"), VB("0.05 mL (<1 yr) / 0.1 mL (≥1 yr); Intradermal — left upper arm")], [VBL("Storage"), VB("2–8°C refrigerator; NEVER freeze; protect from light")], [VBL("Reconstitution"), VB("Use within 3 hours of reconstitution (discard if unused)")], [VBL("Protects against"), VB("TB meningitis, miliary TB, leprosy (partial)")], [VBL("Efficacy"), VB("~80% against severe forms in children")], [VBL("Adverse Effects"), VB("Normal: local ulcer → scar (4–6 wks). Abnormal: BCGitis — lymphadenitis, disseminated BCG disease (in immunocompromised)")], [VBL("Contraindications"), VB("Symptomatic HIV/AIDS, immunocompromised, eczema over site")], ] bcg_t = Table(bcg_data, colWidths=[3.5*cm, 14*cm]) bcg_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), TEAL), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTTEAL, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, TEAL), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#b2dfdb')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(bcg_t) story.append(mnemonic_box("BCG = <b>B</b>irth, <b>C</b>almette-Guérin, <b>G</b>ives scar — left arm, intraDERMAL, 0.1 mL. Scar = successful vaccination")) story.append(Spacer(1, 0.3*cm)) # ── 2b. OPV ────────────────────────────────────────────────── story.append(Paragraph("OPV — Oral Polio Vaccine (Sabin)", h2)) opv_data = [ [VH("Feature"), VH("Details")], [VBL("Type"), VB("Live attenuated trivalent / bivalent (bOPV — types 1 & 3 now used in India)")], [VBL("Schedule"), VB("Birth (OPV-0), 6W, 10W, 14W (primary); 16–24M (booster); Pulse Polio rounds")], [VBL("Dose"), VB("2 drops orally")], [VBL("Storage"), VB("-20°C (freezer); after thawing use within 30 days; VVM (Vaccine Vial Monitor) must be checked")], [VBL("Efficacy"), VB("~90% per dose; 3 doses give ~95% protection")], [VBL("Herd immunity"), VB("Spreads to unvaccinated contacts via fecal-oral route")], [VBL("VAPP"), VB("Vaccine-Associated Paralytic Polio: ~1 per 750,000 first doses — reason IPV added")], [VBL("Contraindications"), VB("Immunocompromised children, their household contacts; diarrhea (postpone, recount dose)")], ] opv_t = Table(opv_data, colWidths=[3.5*cm, 14*cm]) opv_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#4a148c')), ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.HexColor('#ede7f6'), WHITE]), ('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#4a148c')), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#ce93d8')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(opv_t) story.append(mnemonic_box("OPV = <b>O</b>ral, <b>P</b>olio, store at -<b>20</b>°C (freezer). VAPP = very rare complication — IPV added to prevent")) story.append(Spacer(1, 0.3*cm)) # ── 2c. IPV ────────────────────────────────────────────────── story.append(Paragraph("IPV — Inactivated Polio Vaccine (Salk)", h2)) ipv_data = [ [VH("Feature"), VH("Details")], [VBL("Type"), VB("Killed (inactivated); all 3 serotypes")], [VBL("Schedule (India)"), VB("fIPV 0.1 mL ID at 6W & 10W; full IPV 0.5 mL IM at 14W")], [VBL("Storage"), VB("2–8°C (refrigerator); DO NOT FREEZE (inactivates vaccine)")], [VBL("Advantage"), VB("No VAPP; can be given to immunocompromised; boosts gut immunity when combined with OPV")], [VBL("Adverse Effects"), VB("Local redness/swelling at injection site; fever (mild)")], ] ipv_t = Table(ipv_data, colWidths=[3.5*cm, 14*cm]) ipv_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#1a237e')), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTBLUE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#1a237e')), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#90caf9')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(ipv_t) story.append(Spacer(1, 0.3*cm)) # ── 2d. Pentavalent ─────────────────────────────────────────── story.append(Paragraph("Pentavalent Vaccine (DPT + HepB + Hib)", h2)) penta_data = [ [VH("Feature"), VH("Details")], [VBL("Components"), VB("Diphtheria Toxoid + Pertussis (killed) + Tetanus Toxoid + Hepatitis B + Hib conjugate")], [VBL("Type"), VB("Combined; Diphtheria/Tetanus = toxoid; Pertussis = killed whole cell; HepB = recombinant; Hib = conjugate polysaccharide")], [VBL("Schedule"), VB("6W, 10W, 14W (primary 3 doses); DPT booster at 16–24M and 5Y")], [VBL("Dose & Route"), VB("0.5 mL IM — anterolateral mid-thigh (infants); upper arm (older)")], [VBL("Storage"), VB("2–8°C refrigerator; DO NOT FREEZE (freezing causes flocculation — white clumps — discard)")], [VBL("Pertussis AE"), VB("Local pain/swelling/redness, fever, crying. Rare: encephalopathy (1:300,000), hypotonic-hyporesponsive episode (HHE), anaphylaxis")], [VBL("DT/TT AE"), VB("Local swelling (Arthus reaction with repeated doses); fever")], [VBL("Contraindications"), VB("Previous anaphylaxis to vaccine component; encephalopathy within 7 days of prior dose; progressive neurological disorder")], ] penta_t = Table(penta_data, colWidths=[3.5*cm, 14*cm]) penta_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#bf360c')), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTORANGE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#bf360c')), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#ffcc80')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(penta_t) story.append(mnemonic_box( "<b>PENTA</b> = <b>D</b>i<b>P</b>T<b>H</b>B — Diphtheria, Pertussis, Tetanus, Hep B, Hib. " "Freeze check: SHAKE TEST — if flocculation present = discard. Store at 2–8°C NOT in freezer.")) story.append(Spacer(1, 0.3*cm)) # ── 2e. MR / Measles ────────────────────────────────────────── story.append(Paragraph("MR Vaccine (Measles-Rubella)", h2)) mr_data = [ [VH("Feature"), VH("Details")], [VBL("Type"), VB("Live attenuated (replaced standalone measles vaccine in India's UIP)")], [VBL("Schedule"), VB("9M (MR-1), 16–24M (MR-2)")], [VBL("Dose & Route"), VB("0.5 mL subcutaneous (SC) — right upper arm")], [VBL("Storage"), VB("2–8°C or can be frozen; PROTECT FROM LIGHT (light-sensitive); discard within 4h of reconstitution")], [VBL("Adverse Effects"), VB("Fever (5–12 days post vaccination), mild rash, transient arthralgia (rubella component), febrile seizures (rare), thrombocytopenic purpura (very rare)")], [VBL("Contraindications"), VB("Pregnancy, immunocompromised, severe egg allergy (MMR), active febrile illness")], ] mr_t = Table(mr_data, colWidths=[3.5*cm, 14*cm]) mr_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#880e4f')), ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.HexColor('#fce4ec'), WHITE]), ('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#880e4f')), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#f48fb1')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(mr_t) story.append(mnemonic_box("MR = <b>9M</b>onths &amp; <b>16–24M</b>. SC right arm. LIGHT sensitive — store in dark. Post-vax fever at day 5–12 is normal (virus replicating)")) story.append(Spacer(1, 0.3*cm)) # ── 2f. Hepatitis B ─────────────────────────────────────────── story.append(Paragraph("Hepatitis B Vaccine", h2)) hepb_data = [ [VH("Feature"), VH("Details")], [VBL("Type"), VB("Recombinant DNA (yeast-derived HBsAg); NOT live")], [VBL("Schedule"), VB("Birth (within 24h), 6W (as pentavalent), 14W (as pentavalent) — 0, 6, 14 week schedule OR 0, 6, 10, 14 weeks")], [VBL("Dose & Route"), VB("0.5 mL (children) / 1 mL (adults); IM deltoid (adults) or anterolateral thigh (infants)")], [VBL("Storage"), VB("2–8°C; DO NOT FREEZE (freezing denatures protein → loss of efficacy)")], [VBL("Seroconversion"), VB(">95% after 3 doses; check anti-HBs titre >10 IU/L at 1–3 months post series")], [VBL("Adverse Effects"), VB("Local pain/swelling; mild fever; rare anaphylaxis")], [VBL("HBIG"), VB("Hepatitis B Immunoglobulin: give to HBsAg+ mother's newborn within 12–24h along with HepB vaccine at separate site")], ] hepb_t = Table(hepb_data, colWidths=[3.5*cm, 14*cm]) hepb_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#e65100')), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTORANGE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#e65100')), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#ffb74d')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(hepb_t) story.append(Spacer(1, 0.3*cm)) # ── 2g. Rotavirus ───────────────────────────────────────────── story.append(Paragraph("Rotavirus Vaccine (Rotavac / Rotasiil)", h2)) rota_data = [ [VH("Feature"), VH("Details")], [VBL("Type"), VB("Live attenuated oral vaccine (Rotavac = 116E strain; Rotasiil = bovine-human reassortant)")], [VBL("Schedule"), VB("6W, 10W, 14W (3 doses). Must start before 15 weeks of age")], [VBL("Dose"), VB("5 drops orally; DO NOT mix with food/milk")], [VBL("Storage"), VB("2–8°C refrigerator; can freeze Rotasiil but not Rotavac")], [VBL("Adverse Effects"), VB("Mild vomiting/diarrhoea. Rare: Intussusception (risk: 1–2/100,000 — associated with older Rotashield, not current vaccines)")], [VBL("Contraindications"), VB("SCID, previous intussusception, latex allergy; do not give if child has gastroenteritis")], ] rota_t = Table(rota_data, colWidths=[3.5*cm, 14*cm]) rota_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#1b5e20')), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTGREEN, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#1b5e20')), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#a5d6a7')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(rota_t) story.append(Spacer(1, 0.3*cm)) # ── 2h. PCV ─────────────────────────────────────────────────── story.append(Paragraph("PCV — Pneumococcal Conjugate Vaccine", h2)) pcv_data = [ [VH("Feature"), VH("Details")], [VBL("Type"), VB("Conjugate polysaccharide vaccine (PCV13 / PCV10 — 13 or 10 serotypes)")], [VBL("Schedule"), VB("6W, 14W (primary); 9–12M (booster) — 2+1 schedule in UIP")], [VBL("Dose & Route"), VB("0.5 mL IM — anterolateral thigh")], [VBL("Storage"), VB("2–8°C; DO NOT FREEZE")], [VBL("Protects against"), VB("Pneumonia, meningitis, septicaemia caused by S. pneumoniae")], [VBL("Adverse Effects"), VB("Local redness/swelling, fever; rare febrile seizures")], ] pcv_t = Table(pcv_data, colWidths=[3.5*cm, 14*cm]) pcv_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#006064')), ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.HexColor('#e0f7fa'), WHITE]), ('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#006064')), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#80deea')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(pcv_t) story.append(Spacer(1, 0.3*cm)) # ── 2i. TT/Td ──────────────────────────────────────────────── story.append(Paragraph("Tetanus Toxoid (TT) / Td for Pregnancy", h2)) tt_data = [ [VH("Feature"), VH("Details")], [VBL("Type"), VB("Toxoid (inactivated tetanus toxin); Td also contains diphtheria toxoid in reduced dose")], [VBL("Schedule — Children"), VB("10 years and 16 years")], [VBL("Schedule — Pregnancy"), VB("TT-1: early pregnancy; TT-2: ≥4 weeks after TT-1 (give ≥4 weeks before delivery); Booster: if immunized within 3 years")], [VBL("Dose & Route"), VB("0.5 mL IM — deltoid/upper arm")], [VBL("Storage"), VB("2–8°C; DO NOT FREEZE")], [VBL("Protection"), VB("TT in pregnancy protects against neonatal tetanus (MNT)")], [VBL("Adverse Effects"), VB("Local pain, Arthus reaction (with repeated doses — hypersensitivity nodule); rare fever")], ] tt_t = Table(tt_data, colWidths=[3.5*cm, 14*cm]) tt_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#33691e')), ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.HexColor('#f1f8e9'), WHITE]), ('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#33691e')), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#c5e1a5')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(tt_t) story.append(Spacer(1, 0.3*cm)) # ══════════════════════════════════════════════════════════════ # SECTION 3 – COLD CHAIN & TRANSPORT SYSTEM # ══════════════════════════════════════════════════════════════ story.append(PageBreak()) story.append(section_header("3. Cold Chain & Vaccine Transport System", colors.HexColor('#0d47a1'))) story.append(Spacer(1, 0.25*cm)) story.append(Paragraph("Definition", h2)) story.append(Paragraph( "The <b>cold chain</b> is the system of storing and transporting vaccines at recommended temperatures " "from the point of manufacture to the point of administration. Maintaining cold chain integrity is essential — " "vaccines that are heat-damaged or freeze-damaged cannot be detected by appearance alone.", body)) story.append(Spacer(1, 0.15*cm)) # Temperature chart story.append(Paragraph("Cold Chain Temperature Requirements", h2)) temp_data = [ [VH("Storage Level"), VH("Facility"), VH("Temperature"), VH("Duration")], [VBL("National/State Level"), VB("Walk-in cold rooms (WIC)\nWalk-in freezers (WIF)"), VB("+2 to +8°C\n-15 to -25°C"), VB("3–6 months")], [VBL("Regional/District"), VB("Ice-lined refrigerators (ILR)\nDeep freezers"), VB("+2 to +8°C\n-15 to -25°C"), VB("1–3 months")], [VBL("PHC / Sub-district"), VB("Ice-lined refrigerators (ILR)"), VB("+2 to +8°C"), VB("1 month")], [VBL("Sub-centre / Field"), VB("Vaccine carrier with ice packs"), VB("+2 to +8°C"), VB("1 session day")], ] temp_t = Table(temp_data, colWidths=[3.8*cm, 5.5*cm, 4*cm, 4.2*cm]) temp_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#0d47a1')), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTBLUE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#0d47a1')), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#90caf9')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(temp_t) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("Vaccine Storage Rules — Critical Points", h2)) vs_data = [ [VH("Vaccine"), VH("Temperature"), VH("Freeze-sensitive?"), VH("Light-sensitive?"), VH("Shelf life (reconstituted)")], [VB("BCG"), VB("2–8°C"), VB("Freeze OK if dry; reconstituted: NO"), VB("YES — protect from light"), VB("3–4 hours")], [VB("OPV"), VB("-20°C (freezer)\nor 2–8°C (short-term)"), VB("No (can freeze)"), VB("No"), VB("30 days after thawing")], [VB("IPV"), VB("2–8°C"), VB("YES — discard if frozen"), VB("No"), VB("N/A (multi-use vial)")], [VB("Pentavalent\n(DPT+HepB+Hib)"), VB("2–8°C"), VB("YES — shake test"), VB("No"), VB("Use same session / 4h")], [VB("MR / Measles"), VB("2–8°C or freeze"), VB("No"), VB("YES"), VB("4 hours")], [VB("Hepatitis B"), VB("2–8°C"), VB("YES"), VB("No"), VB("Multidose: 28 days")], [VB("TT / Td"), VB("2–8°C"), VB("YES — shake test"), VB("No"), VB("Multidose: 28 days")], [VB("Rotavirus"), VB("2–8°C"), VB("Some can freeze"), VB("No"), VB("Use same session")], [VB("PCV"), VB("2–8°C"), VB("YES"), VB("No"), VB("Multidose: 28 days")], ] vs_t = Table(vs_data, colWidths=[3.2*cm, 3.5*cm, 3.3*cm, 3.3*cm, 4.2*cm]) vs_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#0d47a1')), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTBLUE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#0d47a1')), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#90caf9')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), ('FONTSIZE', (0,0), (-1,-1), 7.5), ])) story.append(vs_t) story.append(Spacer(1, 0.15*cm)) story.append(Paragraph("Freeze-Sensitive Vaccines — Shake Test", h2)) story.append(Paragraph( "<b>Vaccines damaged by freezing:</b> DPT/Pentavalent, TT/Td, IPV, HepB, PCV. " "Freeze damage shows as loss of adjuvant adsorption (flocculation/clumping). " "<b>Shake Test:</b> Shake the suspect vial and a known frozen-and-thawed control. " "If suspect vial shows clumping/sedimentation faster than control → DISCARD.", body)) story.append(Spacer(1, 0.1*cm)) story.append(Paragraph("Vaccine Vial Monitor (VVM)", h2)) story.append(Paragraph( "A <b>heat-sensitive label</b> attached to every vaccine vial that changes colour irreversibly when heat exposure exceeds safe limits. " "<b>VVM stages:</b> Stage 1 (usable) → inner square lighter than outer ring; Stage 2 (usable but use first); " "Stage 3 (do NOT use — inner = outer ring); Stage 4 (discard — inner darker than outer ring). " "<b>Discard point: Stage 3 or beyond.</b>", body)) story.append(Spacer(1, 0.1*cm)) story.append(mnemonic_box( "<b>FREEZE kills</b>: DPT, TT, HepB, IPV, PCV — use SHAKE TEST. " "<b>HEAT kills</b>: OPV most heat-sensitive at room temp (use VVM). " "<b>LIGHT kills</b>: BCG, MR — keep covered. " "<b>NEVER</b> put OPV/freeze vaccines in door of fridge (warm zone).")) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("Cold Chain Equipment Summary", h2)) cce_data = [ [VH("Equipment"), VH("Use"), VH("Level")], [VBL("Walk-in Cold Room (WIC)"), VB("Large storage at 2–8°C"), VB("National / State")], [VBL("Walk-in Freezer (WIF)"), VB("Large freezer storage at -20°C"), VB("National / State")], [VBL("Ice-Lined Refrigerator (ILR)"), VB("Ice-lined walls maintain temp even on power cuts"), VB("District / PHC")], [VBL("Deep Freezer"), VB("Freeze OPV and ice packs"), VB("District / PHC")], [VBL("Vaccine Carrier"), VB("Carries vaccines to field; use 4 conditioned ice packs"), VB("Sub-centre / ASHAs")], [VBL("Cold Box"), VB("Larger field container; maintains temp for 48–72h"), VB("Field")], [VBL("Cold Pack / Ice Pack"), VB("Conditioned (not straight from freezer) — avoid freeze damage"), VB("All field levels")], [VBL("Thermometer"), VB("Log temperatures twice daily — maintain cold chain record"), VB("All levels")], ] cce_t = Table(cce_data, colWidths=[4.5*cm, 9*cm, 4*cm]) cce_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#0d47a1')), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTBLUE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#0d47a1')), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#90caf9')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(cce_t) story.append(Spacer(1, 0.2*cm)) # Conditioning ice packs story.append(tip_box( "CONDITIONING ice packs: Allow ice packs out of freezer at room temperature until you hear water sloshing inside " "(1–10 min depending on ambient temp). This prevents freeze damage to freeze-sensitive vaccines.")) story.append(Spacer(1, 0.2*cm)) # ══════════════════════════════════════════════════════════════ # SECTION 4 – ADVERSE EFFECTS (AEFI) # ══════════════════════════════════════════════════════════════ story.append(PageBreak()) story.append(section_header("4. Adverse Effects Following Immunisation (AEFI)", RED)) story.append(Spacer(1, 0.25*cm)) story.append(Paragraph("AEFI Classification (WHO)", h2)) aefi_class_data = [ [VH("Category"), VH("Definition"), VH("Examples")], [VBL("Vaccine product-related"), VB("Due to inherent properties of vaccine"), VB("OPV → VAPP; BCG → lymphadenitis; MMR → fever, rash")], [VBL("Vaccine quality defect"), VB("Manufacturing/storage defect"), VB("Sterile abscess (improperly stored/reconstituted vaccine)")], [VBL("Immunisation error\n(programme error)"), VB("Error in preparation, handling, administration"), VB("Contaminated vial → sepsis; wrong route → nerve damage; subcutaneous DPT → abscess")], [VBL("Immunisation anxiety"), VB("Psychogenic; not due to vaccine"), VB("Vasovagal syncope, hyperventilation")], [VBL("Coincidental"), VB("Occurs after vaccination but not caused by it"), VB("Febrile illness that was incubating")], ] aefi_class_t = Table(aefi_class_data, colWidths=[3.8*cm, 6*cm, 7.7*cm]) aefi_class_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), RED), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTRED, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, RED), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#ef9a9a')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(aefi_class_t) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("AEFI by Vaccine — Quick Reference", h2)) aefi_vax_data = [ [VH("Vaccine"), VH("Common AE"), VH("Serious/Rare AE"), VH("Timing")], [VBL("BCG"), VB("Local ulcer, scar formation"), VB("BCGitis, suppurative lymphadenitis, disseminated BCG (immunocompromised)"), VB("2–6 weeks post")], [VBL("OPV"), VB("Rare GI upset"), VB("VAPP — 1:750,000 first dose"), VB("7–30 days post")], [VBL("IPV"), VB("Local redness, pain, mild fever"), VB("Anaphylaxis (extremely rare)"), VB("Hours–2 days")], [VBL("DPT /\nPentavalent"), VB("Fever, local pain, swelling, redness, prolonged crying"), VB("HHE (hypotonic-hyporesponsive episode), encephalopathy 1:300K, anaphylaxis"), VB("0–3 days")], [VBL("MR / Measles"), VB("Fever day 5–12, mild rash"), VB("Febrile seizures (~1:3000), ITP (~1:30,000), encephalitis (1:1M)"), VB("5–14 days")], [VBL("Hepatitis B"), VB("Local pain, mild fever"), VB("Anaphylaxis (very rare); NOT associated with MS"), VB("Days")], [VBL("Rotavirus"), VB("Mild diarrhoea, vomiting"), VB("Intussusception (historical with old Rotashield); current risk minimal"), VB("1–7 days")], [VBL("PCV"), VB("Local swelling, fever"), VB("Febrile seizures (rare)"), VB("1–3 days")], [VBL("TT / Td"), VB("Local pain, induration"), VB("Arthus reaction (repeated doses), anaphylaxis"), VB("Hours–days")], [VBL("Vitamin A"), VB("Nausea, vomiting (transient)"), VB("Bulging fontanelle (very rare, resolves in 72h)"), VB("Hours")], ] aefi_vax_t = Table(aefi_vax_data, colWidths=[2.8*cm, 4.5*cm, 7*cm, 3.2*cm]) aefi_vax_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), RED), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTRED, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, RED), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#ef9a9a')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), ('FONTSIZE', (0,0), (-1,-1), 7.8), ])) story.append(aefi_vax_t) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("AEFI Reporting & Management", h2)) story.append(Paragraph( "<b>Report AEFIs</b> on AEFI reporting form at health facility. Serious AEFIs must be reported within <b>24 hours</b> " "to district immunisation officer. Cases of cluster AEFIs must be investigated immediately.", body)) mgmt_data = [ [VH("AEFI"), VH("Management")], [VBL("Mild local reaction"), VB("Cold compress; reassure parents; continue schedule")], [VBL("High fever >38.5°C"), VB("Paracetamol 10–15 mg/kg; tepid sponging")], [VBL("Anaphylaxis"), VB("Adrenaline 0.01 mg/kg IM (1:1000) immediately; oxygen; IV fluids; antihistamines; transfer")], [VBL("Febrile seizures"), VB("Position, airway; diazepam if >5 min; anti-pyretics; reassure (not epilepsy)")], [VBL("BCG lymphadenitis"), VB("Suppurative: needle aspiration; NOT incision. BCGitis: isoniazid 10 mg/kg for 3 months")], [VBL("HHE (DPT)"), VB("Recovers spontaneously; complete remaining schedule with acellular pertussis (aP) if available")], [VBL("VAPP"), VB("Report as AFP case; investigate; provide supportive care")], ] mgmt_t = Table(mgmt_data, colWidths=[3.8*cm, 13.7*cm]) mgmt_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), RED), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTRED, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, RED), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#ef9a9a')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(mgmt_t) story.append(Spacer(1, 0.2*cm)) # ══════════════════════════════════════════════════════════════ # SECTION 5 – MNEMONICS & QUICK RECALL # ══════════════════════════════════════════════════════════════ story.append(PageBreak()) story.append(section_header("5. Memory Mnemonics & Quick Recall", ORANGE)) story.append(Spacer(1, 0.25*cm)) # Mnemonic tables story.append(Paragraph("Vaccine Types", h2)) type_data = [ [VH("Category"), VH("Vaccines"), VH("Memory Hook")], [VBL("Live attenuated"), VB("BCG, OPV, Rotavirus, MR/MMR, Varicella, YF"), VB("'BORMVY' — these can replicate, stronger immunity, single dose often enough")], [VBL("Killed/inactivated"), VB("IPV (Salk), Whole cell pertussis, HepA"), VB("'IPP-HA' — cannot replicate, need boosters, safe in immunocompromised")], [VBL("Toxoid"), VB("Tetanus Toxoid (TT), Diphtheria Toxoid (DT)"), VB("Toxin inactivated by formaldehyde; memory: 'TOXOID = Toxin + aldehyde'")], [VBL("Recombinant"), VB("Hepatitis B, HPV"), VB("Made in YEAST; no live virus; safe in all")], [VBL("Conjugate"), VB("Hib, PCV, Meningococcal"), VB("Polysaccharide CONJUGATED to protein carrier — works in <2 year olds")], ] type_t = Table(type_data, colWidths=[3.5*cm, 5*cm, 9*cm]) type_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), ORANGE), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTORANGE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, ORANGE), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#ffcc80')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(type_t) story.append(Spacer(1, 0.2*cm)) story.append(mnemonic_box( "<b>Live vaccines — CONTRAINDICATED in immunocompromised & pregnancy:</b> " "BCG, OPV, MR/MMR, Rotavirus, Yellow Fever, Varicella — remember 'BORMYV'")) story.append(Spacer(1, 0.15*cm)) story.append(Paragraph("Routes of Administration", h2)) route_data = [ [VH("Route"), VH("Vaccine(s)"), VH("Mnemonic")], [VBL("Oral"), VB("OPV, Rotavirus, Vitamin A"), VB("<b>O</b>PV/<b>O</b>ral — both start with O")], [VBL("Intradermal (ID)"), VB("BCG, fIPV"), VB("<b>B</b>CG = <b>B</b>ubble under skin; Left arm for BCG")], [VBL("Subcutaneous (SC)"), VB("MR/Measles, Varicella"), VB("<b>M</b>R = <b>M</b>ake it Subcut (SC) — right upper arm")], [VBL("Intramuscular (IM)"), VB("DPT/Pentavalent, HepB, IPV, TT, PCV"), VB("Most injectables = IM; DPT in THIGH (infants), DELTOID (older)")], ] route_t = Table(route_data, colWidths=[3.5*cm, 5.5*cm, 8.5*cm]) route_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), ORANGE), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTORANGE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, ORANGE), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#ffcc80')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(route_t) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("Key Numbers to Remember", h2)) nums_data = [ [VH("Fact"), VH("Number"), VH("Mnemonic")], [VBL("VAPP risk (1st dose OPV)"), VB("1 per 750,000"), VB("7.5 = 750,000 — high enough dose for community benefit")], [VBL("BCG reconstitution shelf life"), VB("3–4 hours"), VB("BCG = short life after opening; use and discard")], [VBL("MR post-vax fever onset"), VB("Day 5–12"), VB("'Five to twelve' — delayed because it's live")], [VBL("TT doses in pregnancy"), VB("2 doses (or 1 booster)"), VB("T-T = Two Times (unless booster)")], [VBL("OPV — birth dose protection"), VB("Reduces viral shedding"), VB("Zero dose = ZERO spread")], [VBL("HepB seroprotection titre"), VB(">10 IU/L anti-HBs"), VB("Ten = Ten IU for protection")], [VBL("Cold chain: ILR temp"), VB("+2 to +8°C"), VB("2-8 = 'two to eight'; never go below 2 or above 8 in fridge")], [VBL("Deep freezer temp"), VB("-15 to -25°C"), VB("Negative fifteen to negative 25 — for OPV, ice packs")], [VBL("VVM discard stage"), VB("Stage 3 (or beyond)"), VB("Stage 3 = STOP; inner square matches outer ring")], [VBL("Pertussis encephalopathy risk"), VB("1:300,000"), VB("3 lakh — rare but serious; switch to aP if occurs")], ] nums_t = Table(nums_data, colWidths=[5.5*cm, 3.5*cm, 8.5*cm]) nums_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), ORANGE), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTORANGE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, ORANGE), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#ffcc80')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ('FONTSIZE', (0,0), (-1,-1), 8), ])) story.append(nums_t) story.append(Spacer(1, 0.2*cm)) story.append(mnemonic_box( "<b>ILP-BM</b> — Vaccines given at birth: I (HepB-I), L (look-BCG), P (Polio-OPV-0), B (BCG), M (mark date). " "Or: <b>'Born Pretty Healthy'</b> = BCG + Polio-0 + HepB-1")) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("Expanded Programme on Immunization (EPI) History", h2)) epi_data = [ [VH("Year"), VH("Milestone")], [VB("1974"), VB("WHO EPI launched globally — 6 diseases: TB, DPT, Polio, Measles")], [VB("1978"), VB("EPI launched in India (January)")], [VB("1985"), VB("Universal Immunization Programme (UIP) launched in India — Nov 19 (Indira Gandhi memorial)")], [VB("1990"), VB("Universal Child Immunization target (UCI) achieved")], [VB("2014"), VB("Pentavalent vaccine introduced in UIP nationally")], [VB("2015"), VB("IPV introduced alongside OPV")], [VB("2016"), VB("bOPV replaced tOPV (trivalent → bivalent)")], [VB("2017"), VB("MR vaccine replaced standalone measles in UIP")], [VB("2020"), VB("NIS 2020 — current schedule with PCV, Rotavirus, MR")], ] epi_t = Table(epi_data, colWidths=[2.5*cm, 15*cm]) epi_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), NAVY), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTBLUE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, NAVY), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#90caf9')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(epi_t) story.append(Spacer(1, 0.3*cm)) # ── Footer note ─────────────────────────────────────────────── footer_data = [[Paragraph( "Source: Park's Textbook of Preventive and Social Medicine | India NIS 2020 | " "WHO AEFI guidelines | Prepared for revision purposes only.", S('foot', parent=styles['Normal'], fontSize=7.5, textColor=colors.HexColor('#78909c'), fontName='Helvetica-Oblique', alignment=TA_CENTER))]] footer_t = Table(footer_data, colWidths=[17.5*cm]) footer_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), LTGREY), ('BOX', (0,0), (-1,-1), 0.5, colors.HexColor('#b0bec5')), ('TOPPADDING', (0,0), (-1,-1), 6), ('BOTTOMPADDING', (0,0), (-1,-1), 6), ])) story.append(footer_t) # ── Build ───────────────────────────────────────────────────── doc.build(story) print(f"PDF generated: {OUTPUT}") PYEOF

Running Command

mkdir -p /tmp/workspace/immunisation-pdf && python3 << 'PYEOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import cm from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, PageBreak) from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY OUTPUT = "/tmp/workspace/immunisation-pdf/National_Immunisation_Schedule_Revision.pdf" doc = SimpleDocTemplate( OUTPUT, pagesize=A4, rightMargin=1.5*cm, leftMargin=1.5*cm, topMargin=1.5*cm, bottomMargin=1.5*cm, title="National Immunisation Schedule - Quick Revision", author="Orris Medical" ) NAVY = colors.HexColor('#1a237e') BLUE = colors.HexColor('#1565c0') LTBLUE = colors.HexColor('#e3f2fd') GREEN = colors.HexColor('#1b5e20') LTGREEN = colors.HexColor('#e8f5e9') ORANGE = colors.HexColor('#e65100') LTORANGE= colors.HexColor('#fff3e0') RED = colors.HexColor('#b71c1c') LTRED = colors.HexColor('#ffebee') TEAL = colors.HexColor('#004d40') LTTEAL = colors.HexColor('#e0f2f1') GREY = colors.HexColor('#37474f') LTGREY = colors.HexColor('#f5f5f5') WHITE = colors.white base = getSampleStyleSheet()['Normal'] def mkstyle(name, **kw): return ParagraphStyle(name, **kw) titleStyle = mkstyle('TitleS', fontSize=22, textColor=WHITE, alignment=TA_CENTER, fontName='Helvetica-Bold', spaceAfter=4, leading=28) subtitleStyle= mkstyle('SubtS', fontSize=11, textColor=colors.HexColor('#bbdefb'), alignment=TA_CENTER, fontName='Helvetica', spaceAfter=2, leading=16) h1_s = mkstyle('H1S', fontSize=13, textColor=WHITE, fontName='Helvetica-Bold', spaceAfter=2, leading=18, spaceBefore=8) h2_s = mkstyle('H2S', fontSize=11, textColor=NAVY, fontName='Helvetica-Bold', spaceAfter=3, spaceBefore=6, leading=16) body_s = mkstyle('BodyS', fontSize=8.5, textColor=GREY, fontName='Helvetica', spaceAfter=3, leading=13) small_s = mkstyle('SmallS', fontSize=7.5, textColor=GREY, fontName='Helvetica', spaceAfter=2, leading=11) mnemo_s = mkstyle('MnemoS', fontSize=8.5, textColor=ORANGE, fontName='Helvetica-Bold', spaceAfter=2, leading=13) warn_s = mkstyle('WarnS', fontSize=8.5, textColor=RED, fontName='Helvetica-Bold', spaceAfter=2, leading=13) tip_s = mkstyle('TipS', fontSize=8.5, textColor=GREEN, fontName='Helvetica-Bold', spaceAfter=2, leading=13) # table cell styles TH_s = mkstyle('TH', fontSize=8.5, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=12) TB_s = mkstyle('TB', fontSize=8, textColor=GREY, fontName='Helvetica', leading=11) TBc_s = mkstyle('TBc', fontSize=8, textColor=GREY, fontName='Helvetica', leading=11, alignment=TA_CENTER) TBb_s = mkstyle('TBb', fontSize=8, textColor=NAVY, fontName='Helvetica-Bold', leading=11) foot_s= mkstyle('FootS', fontSize=7.5, textColor=colors.HexColor('#78909c'), fontName='Helvetica-Oblique', alignment=TA_CENTER) def TH(t): return Paragraph(t, TH_s) def TB(t): return Paragraph(t, TB_s) def TBc(t): return Paragraph(t, TBc_s) def TBb(t): return Paragraph(t, TBb_s) def section_header(text, color=NAVY): t = Table([[Paragraph(text, h1_s)]], colWidths=[17.5*cm]) t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), color), ('TOPPADDING', (0,0), (-1,-1), 7), ('BOTTOMPADDING', (0,0), (-1,-1), 7), ('LEFTPADDING', (0,0), (-1,-1), 10), ])) return t def mnemonic_box(text, title="Memory Aid"): full = f'<b>MEMORY: {title}:</b> {text}' t = Table([[Paragraph(full, mnemo_s)]], colWidths=[17.5*cm]) t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), LTORANGE), ('BOX', (0,0), (-1,-1), 1.5, ORANGE), ('TOPPADDING', (0,0), (-1,-1), 6), ('BOTTOMPADDING', (0,0), (-1,-1), 6), ('LEFTPADDING', (0,0), (-1,-1), 10), ('RIGHTPADDING', (0,0), (-1,-1), 10), ])) return t def tip_box(text): t = Table([[Paragraph(f'<b>Key Point:</b> {text}', tip_s)]], colWidths=[17.5*cm]) t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), LTGREEN), ('BOX', (0,0), (-1,-1), 1.2, GREEN), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 10), ])) return t def std_table(data, col_w, header_color=BLUE, row_colors=(LTBLUE, WHITE), border_color=None): if border_color is None: border_color = header_color t = Table(data, colWidths=col_w, repeatRows=1) t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), header_color), ('ROWBACKGROUNDS', (0,1), (-1,-1), list(row_colors)), ('BOX', (0,0), (-1,-1), 0.8, border_color), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#b0bec5')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ])) return t story = [] # ── COVER ── cover_data = [ [Paragraph("National Immunisation Schedule", titleStyle)], [Paragraph("India (UIP / NIS 2020) — Quick Revision Guide", subtitleStyle)], [Paragraph("Vaccines • Cold Chain • Adverse Effects • Memory Mnemonics", subtitleStyle)], [Paragraph("Source: Park's Textbook of Preventive and Social Medicine", mkstyle('cs', fontSize=8, textColor=colors.HexColor('#90caf9'), alignment=TA_CENTER, fontName='Helvetica-Oblique'))], ] cover = Table(cover_data, colWidths=[17.5*cm]) cover.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), NAVY), ('TOPPADDING', (0,0), (-1,-1), 12), ('BOTTOMPADDING', (0,0), (-1,-1), 10), ('LEFTPADDING', (0,0), (-1,-1), 16), ('RIGHTPADDING', (0,0), (-1,-1), 16), ])) story += [cover, Spacer(1, 0.4*cm)] # ══ SECTION 1: NIS 2020 SCHEDULE ══ story.append(section_header("1. National Immunisation Schedule (NIS 2020) — India")) story.append(Spacer(1, 0.2*cm)) TH2_s = mkstyle('TH2', fontSize=8.5, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER, leading=12) TB2_s = mkstyle('TB2', fontSize=8, textColor=GREY, fontName='Helvetica', leading=11, alignment=TA_CENTER) TBL2_s= mkstyle('TBL2', fontSize=8, textColor=GREY, fontName='Helvetica', leading=11) TBB2_s= mkstyle('TBB2', fontSize=8, textColor=NAVY, fontName='Helvetica-Bold', leading=11) def TH2(t): return Paragraph(t, TH2_s) def TB2(t): return Paragraph(t, TB2_s) def TBL2(t): return Paragraph(t, TBL2_s) def TBB2(t): return Paragraph(t, TBB2_s) NIS = [ [TH2("Age"), TH2("Vaccine"), TH2("Dose"), TH2("Route"), TH2("Site")], [TBB2("At Birth"), TBL2("BCG"), TB2("0.1 mL"), TB2("Intradermal"), TB2("Left upper arm")], [TBB2(""), TBL2("OPV-0"), TB2("2 drops"), TB2("Oral"), TB2("Mouth")], [TBB2(""), TBL2("Hep B-1"), TB2("0.5 mL"), TB2("IM"), TB2("Anterolateral thigh")], [TBB2("6 Weeks"), TBL2("OPV-1"), TB2("2 drops"), TB2("Oral"), TB2("Mouth")], [TBB2(""), TBL2("Pentavalent-1 (DPT+HepB+Hib)"), TB2("0.5 mL"), TB2("IM"), TB2("Anterolateral thigh")], [TBB2(""), TBL2("Rotavirus-1 *"), TB2("5 drops"), TB2("Oral"), TB2("Mouth")], [TBB2(""), TBL2("fIPV-1 *"), TB2("0.1 mL"), TB2("ID"), TB2("Right upper arm")], [TBB2(""), TBL2("PCV-1 *"), TB2("0.5 mL"), TB2("IM"), TB2("Anterolateral thigh")], [TBB2("10 Weeks"), TBL2("OPV-2"), TB2("2 drops"), TB2("Oral"), TB2("Mouth")], [TBB2(""), TBL2("Pentavalent-2"), TB2("0.5 mL"), TB2("IM"), TB2("Anterolateral thigh")], [TBB2(""), TBL2("Rotavirus-2 *"), TB2("5 drops"), TB2("Oral"), TB2("Mouth")], [TBB2(""), TBL2("fIPV-2 *"), TB2("0.1 mL"), TB2("ID"), TB2("Right upper arm")], [TBB2("14 Weeks"), TBL2("OPV-3"), TB2("2 drops"), TB2("Oral"), TB2("Mouth")], [TBB2(""), TBL2("Pentavalent-3"), TB2("0.5 mL"), TB2("IM"), TB2("Anterolateral thigh")], [TBB2(""), TBL2("Rotavirus-3 *"), TB2("5 drops"), TB2("Oral"), TB2("Mouth")], [TBB2(""), TBL2("IPV (full dose) *"), TB2("0.5 mL"), TB2("IM"), TB2("Anterolateral thigh")], [TBB2(""), TBL2("PCV-2 *"), TB2("0.5 mL"), TB2("IM"), TB2("Anterolateral thigh")], [TBB2("9-12 Months"), TBL2("MR-1 (Measles-Rubella)"), TB2("0.5 mL"), TB2("SC"), TB2("Right upper arm")], [TBB2(""), TBL2("Vitamin A-1 (1 lakh IU)"), TB2("1 mL"), TB2("Oral"), TB2("Mouth")], [TBB2(""), TBL2("PCV Booster *"), TB2("0.5 mL"), TB2("IM"), TB2("Anterolateral thigh")], [TBB2("16-24 Months"), TBL2("DPT Booster-1"), TB2("0.5 mL"), TB2("IM"), TB2("Anterolateral thigh")], [TBB2(""), TBL2("OPV Booster"), TB2("2 drops"), TB2("Oral"), TB2("Mouth")], [TBB2(""), TBL2("MR-2"), TB2("0.5 mL"), TB2("SC"), TB2("Right upper arm")], [TBB2(""), TBL2("Vitamin A-2 to 9 (2 lakh IU every 6M)"), TB2("2 mL"), TB2("Oral"), TB2("Mouth")], [TBB2("5-6 Years"), TBL2("DPT Booster-2"), TB2("0.5 mL"), TB2("IM"), TB2("Upper arm")], [TBB2("10 & 16 Years"), TBL2("Tetanus Toxoid (TT)"), TB2("0.5 mL"), TB2("IM"), TB2("Upper arm")], [TBB2("Pregnancy"), TBL2("TT-1: early pregnancy\nTT-2: 4 wks after TT-1\nBooster if prev immunized"), TB2("0.5 mL"), TB2("IM"), TB2("Upper arm")], ] nis_t = Table(NIS, colWidths=[2.5*cm, 5*cm, 1.8*cm, 2.2*cm, 6*cm], repeatRows=1) nis_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), BLUE), ('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, LTBLUE]), ('BOX', (0,0), (-1,-1), 0.8, BLUE), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#b0bec5')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), # Span age rows ('SPAN', (0,1), (0,3)), # Birth ('SPAN', (0,4), (0,8)), # 6 weeks ('SPAN', (0,9), (0,12)), # 10 weeks ('SPAN', (0,13), (0,17)), # 14 weeks ('SPAN', (0,18), (0,20)), # 9-12 months ('SPAN', (0,21), (0,24)), # 16-24 months ('VALIGN', (0,1), (0,-1), 'MIDDLE'), ])) story.append(nis_t) story += [Spacer(1, 0.15*cm), Paragraph("* Phase-wise rollout — PCV: selected states; Rotavirus: selected states; IPV: national since 2015.", small_s), mnemonic_box( "<b>Birth:</b> BCG + OPV-0 + HepB-1 | " "<b>6W:</b> OPV + Penta + Rota + fIPV + PCV | " "<b>10W:</b> OPV + Penta + Rota + fIPV | " "<b>14W:</b> OPV + Penta + Rota + IPV + PCV | " "<b>9M:</b> MR-1 + VitA | <b>16-24M:</b> DPT-B + OPV-B + MR-2 + VitA | " "<b>5Y:</b> DPT-B2 | <b>10/16Y:</b> TT | <b>Pregnancy:</b> TT x2", "NIS Timeline Recall")] ] story.append(Spacer(1, 0.3*cm)) # ══ SECTION 2: VACCINE DETAILS ══ story.append(PageBreak()) story.append(section_header("2. Individual Vaccine Details", TEAL)) story.append(Spacer(1, 0.2*cm)) def vax_table(rows, hdr_col=TEAL, row_c=(LTTEAL, WHITE)): data = [[TH("Property"), TH("Details")]] + rows t = Table(data, colWidths=[3.5*cm, 14*cm], repeatRows=1) t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), hdr_col), ('ROWBACKGROUNDS', (0,1), (-1,-1), list(row_c)), ('BOX', (0,0), (-1,-1), 0.8, hdr_col), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#b0bec5')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) return t # BCG story.append(Paragraph("BCG (Bacillus Calmette-Guerin)", h2_s)) story.append(vax_table([ [TBb("Type"), TB("Live attenuated Mycobacterium bovis (Danish 1331 strain)")], [TBb("Schedule"), TB("At birth (up to 1 year if missed); single dose")], [TBb("Dose / Route"), TB("0.05 mL (<1 yr) / 0.1 mL (>=1 yr) — Intradermal (ID), LEFT upper arm")], [TBb("Storage"), TB("2-8 deg C; NEVER freeze reconstituted vaccine; protect from light")], [TBb("Reconstitution"), TB("Use within 3-4 hours; discard unused portion")], [TBb("Protects against"), TB("TB meningitis, miliary TB, leprosy (partial)")], [TBb("Normal reaction"), TB("Local ulcer at site -> scar in 4-6 weeks = successful vaccination")], [TBb("Adverse effects"), TB("Suppurative lymphadenitis (most common AEFI). Disseminated BCGitis in immunocompromised")], [TBb("Contraindications"), TB("Symptomatic HIV/AIDS, immunocompromised, eczema at injection site")], ], TEAL, (LTTEAL, WHITE))) story.append(mnemonic_box("BCG = <b>B</b>irth vaccine, <b>C</b>almette-Guerin, <b>G</b>ives scar. Left arm, intraDERMAL. Scar = Success. Protect from LIGHT.")) story.append(Spacer(1, 0.25*cm)) # OPV story.append(Paragraph("OPV - Oral Polio Vaccine (Sabin)", h2_s)) story.append(vax_table([ [TBb("Type"), TB("Live attenuated; bOPV (bivalent — types 1 & 3) used in India since 2016")], [TBb("Schedule"), TB("OPV-0 at birth; OPV 1/2/3 at 6/10/14 weeks; Booster at 16-24 months; Pulse Polio")], [TBb("Dose"), TB("2 drops orally")], [TBb("Storage"), TB("FREEZER -20 deg C; VVM must be checked before use; after thawing use within 30 days")], [TBb("Advantage"), TB("Cheap, oral, gut immunity, herd immunity (spreads to contacts via fecal-oral)")], [TBb("VAPP risk"), TB("Vaccine-Associated Paralytic Polio: ~1 per 750,000 first doses; reason for adding IPV")], [TBb("Contraindications"), TB("Immunocompromised child; household contacts of immunocompromised; active diarrhea (postpone)")], ], colors.HexColor('#4a148c'), (colors.HexColor('#ede7f6'), WHITE))) story.append(mnemonic_box("OPV = <b>O</b>ral, stored at -<b>20</b>C (FREEZER). VAPP risk 1:750,000. VVM check mandatory.")) story.append(Spacer(1, 0.25*cm)) # IPV story.append(Paragraph("IPV - Inactivated Polio Vaccine (Salk)", h2_s)) story.append(vax_table([ [TBb("Type"), TB("Killed (inactivated); all 3 serotypes (types 1, 2, 3)")], [TBb("Schedule — India"), TB("fIPV 0.1 mL ID at 6W & 10W; full IPV 0.5 mL IM at 14W")], [TBb("Storage"), TB("2-8 deg C refrigerator; DO NOT FREEZE — freezing inactivates the vaccine")], [TBb("Advantage"), TB("No VAPP; safe in immunocompromised; boosts mucosal immunity when combined with OPV")], [TBb("Adverse effects"), TB("Local redness/swelling at injection site; mild fever")], ], BLUE, (LTBLUE, WHITE))) story.append(mnemonic_box("IPV = Inactivated (Salk), store at 2-8 deg C (fridge). NO VAPP. fIPV = fractional dose ID at 6W & 10W.")) story.append(Spacer(1, 0.25*cm)) # Pentavalent story.append(Paragraph("Pentavalent Vaccine (DPT + HepB + Hib)", h2_s)) story.append(vax_table([ [TBb("Components"), TB("Diphtheria toxoid + Pertussis (killed whole cell) + Tetanus toxoid + Hepatitis B (recombinant) + Hib conjugate")], [TBb("Schedule"), TB("6W, 10W, 14W (primary 3 doses); DPT booster only at 16-24M and 5Y (no HepB/Hib booster)")], [TBb("Dose / Route"), TB("0.5 mL IM — anterolateral mid-thigh (infants); deltoid/upper arm (older children)")], [TBb("Storage"), TB("2-8 deg C; DO NOT FREEZE — freeze causes flocculation (white clumps) = DISCARD")], [TBb("Freeze check"), TB("SHAKE TEST: shake suspect vial; compare sedimentation with frozen-thawed control; faster sedimentation = discard")], [TBb("Pertussis AE"), TB("Local pain/swelling/redness, fever, prolonged crying. Rare: HHE (hypotonic-hyporesponsive episode), encephalopathy 1:300,000, anaphylaxis")], [TBb("Contraindications"), TB("Prior anaphylaxis to component; encephalopathy within 7 days of prior dose; progressive neurological disorder")], ], colors.HexColor('#bf360c'), (LTORANGE, WHITE))) story.append(mnemonic_box( "<b>PENTA = DiPTHB</b>: Diphtheria, Pertussis, Tetanus, Hep B, Hib. " "Freeze-sensitive = SHAKE TEST. Pertussis encephalopathy = 1:300,000 doses.")) story.append(Spacer(1, 0.25*cm)) # MR story.append(Paragraph("MR Vaccine (Measles-Rubella)", h2_s)) story.append(vax_table([ [TBb("Type"), TB("Live attenuated (replaced standalone measles vaccine in UIP, India)")], [TBb("Schedule"), TB("MR-1 at 9 months; MR-2 at 16-24 months")], [TBb("Dose / Route"), TB("0.5 mL subcutaneous (SC) — RIGHT upper arm")], [TBb("Storage"), TB("2-8 deg C or freezer; LIGHT-SENSITIVE — keep in dark; discard within 4h of reconstitution")], [TBb("Post-vax fever"), TB("Day 5-12 (virus replicating) — reassure parents; treat with paracetamol if >38.5 C")], [TBb("Adverse effects"), TB("Mild rash, transient joint pain (rubella component), febrile seizures (~1:3000), ITP (1:30,000)")], [TBb("Contraindications"), TB("Pregnancy (teratogenic), immunocompromised, severe egg allergy (MMR), active febrile illness")], ], colors.HexColor('#880e4f'), (colors.HexColor('#fce4ec'), WHITE))) story.append(mnemonic_box("MR = 9M and 16-24M. SC right arm. LIGHT-sensitive (keep covered). Fever day 5-12 is NORMAL for live vaccine.")) story.append(Spacer(1, 0.25*cm)) # HepB story.append(Paragraph("Hepatitis B Vaccine", h2_s)) story.append(vax_table([ [TBb("Type"), TB("Recombinant DNA vaccine (yeast-derived HBsAg); NOT a live vaccine")], [TBb("Schedule"), TB("Birth dose (within 24h) + 6W + 14W as pentavalent (0-6-14 week schedule) OR 0-6-10-14 schedule")], [TBb("Dose / Route"), TB("0.5 mL (children) / 1 mL (adults); IM — anterolateral thigh (infants) or deltoid (adults)")], [TBb("Storage"), TB("2-8 deg C; DO NOT FREEZE (protein denaturation)")], [TBb("Seroconversion"), TB(">95% after 3-dose series; anti-HBs titre >10 IU/L = protected")], [TBb("HBIG use"), TB("HBsAg+ mother's newborn: give HepB vaccine + HBIG (0.5 mL IM) at different sites within 12-24h of birth")], [TBb("Adverse effects"), TB("Local pain/swelling; mild fever; anaphylaxis very rare")], ], colors.HexColor('#e65100'), (LTORANGE, WHITE))) story.append(mnemonic_box("HepB = Recombinant (YEAST), 2-8 deg C, 3 doses, anti-HBs >10 IU/L. HBIG for babies of infected mothers.")) story.append(Spacer(1, 0.25*cm)) # Rotavirus story.append(Paragraph("Rotavirus Vaccine (Rotavac / Rotasiil)", h2_s)) story.append(vax_table([ [TBb("Type"), TB("Live attenuated oral vaccine; Rotavac (116E strain, India-made); Rotasiil (bovine-human reassortant)")], [TBb("Schedule"), TB("6W, 10W, 14W (3 oral doses); MUST start before 15 weeks of age")], [TBb("Dose"), TB("5 drops orally; do NOT mix with food or milk")], [TBb("Storage"), TB("2-8 deg C; Rotasiil can be frozen; Rotavac — keep at 2-8 deg C only")], [TBb("Adverse effects"), TB("Mild vomiting/diarrhoea (transient). Intussusception: minimal risk with current vaccines (historical with old Rotashield)")], [TBb("Contraindications"), TB("SCID, previous intussusception, active gastroenteritis, latex allergy")], ], GREEN, (LTGREEN, WHITE))) story.append(mnemonic_box("Rotavirus = 3 ORAL doses by 14W (start before 15W). 5 drops. No food/milk. Watch for intussusception (rare).")) story.append(Spacer(1, 0.25*cm)) # PCV story.append(Paragraph("PCV - Pneumococcal Conjugate Vaccine", h2_s)) story.append(vax_table([ [TBb("Type"), TB("Conjugate polysaccharide vaccine; PCV13 (13 serotypes) or PCV10 used in India UIP")], [TBb("Schedule"), TB("6W + 14W (primary 2 doses) + Booster at 9-12M = 2+1 schedule")], [TBb("Dose / Route"), TB("0.5 mL IM — anterolateral thigh")], [TBb("Storage"), TB("2-8 deg C; DO NOT FREEZE")], [TBb("Protects against"), TB("S. pneumoniae: pneumonia, meningitis, otitis media, septicaemia in children")], [TBb("Adverse effects"), TB("Local redness/swelling; fever; rare febrile seizures")], ], colors.HexColor('#006064'), (colors.HexColor('#e0f7fa'), WHITE))) story.append(Spacer(1, 0.25*cm)) # TT/Td story.append(Paragraph("Tetanus Toxoid (TT) / Td", h2_s)) story.append(vax_table([ [TBb("Type"), TB("Toxoid (tetanus toxin inactivated by formalin); Td = diphtheria + tetanus toxoid in reduced dose")], [TBb("Schedule — Children"), TB("10 years and 16 years")], [TBb("Schedule — Pregnancy"), TB("TT-1: early pregnancy; TT-2: >=4 weeks after TT-1 (give >=4 wks before EDD); Booster: if immunized within 3 years")], [TBb("Dose / Route"), TB("0.5 mL IM — deltoid/upper arm")], [TBb("Storage"), TB("2-8 deg C; DO NOT FREEZE")], [TBb("Pregnancy protection"), TB("TT in pregnancy prevents Maternal and Neonatal Tetanus (MNT)")], [TBb("Adverse effects"), TB("Local pain; Arthus reaction (hypersensitivity nodule with repeated doses); rare fever; anaphylaxis")], ], colors.HexColor('#33691e'), (colors.HexColor('#f1f8e9'), WHITE))) story.append(mnemonic_box("TT in pregnancy = 2 doses (4W apart) OR booster. Toxoid = safe in pregnancy. Arthus reaction = too many boosters.")) story.append(Spacer(1, 0.25*cm)) # Vitamin A story.append(Paragraph("Vitamin A Supplementation (UIP)", h2_s)) story.append(vax_table([ [TBb("Schedule"), TB("1st dose: 9-12 months (with MR-1); then every 6 months up to 5 years (total 9 doses)")], [TBb("Dose"), TB("1st dose: 1 lakh IU (1 mL); subsequent doses: 2 lakh IU (2 mL); given orally")], [TBb("Adverse effects"), TB("Nausea/vomiting (transient); bulging fontanelle (very rare, resolves in 72h)")], [TBb("Benefit"), TB("Reduces measles severity, diarrhoea mortality, night blindness")], ], colors.HexColor('#f57f17'), (colors.HexColor('#fffde7'), WHITE))) story.append(Spacer(1, 0.3*cm)) # ══ SECTION 3: COLD CHAIN ══ story.append(PageBreak()) story.append(section_header("3. Cold Chain & Vaccine Transport System", colors.HexColor('#0d47a1'))) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("Definition", h2_s)) story.append(Paragraph( "The <b>cold chain</b> is the entire system of storing and transporting vaccines at recommended temperatures " "from point of manufacture to point of use. " "Vaccines that are heat-damaged or freeze-damaged cannot be detected by visual inspection alone — " "hence VVM and shake tests are essential.", body_s)) story.append(Spacer(1, 0.15*cm)) story.append(Paragraph("Cold Chain Levels & Equipment", h2_s)) cc_data = [ [TH("Level"), TH("Equipment"), TH("Temperature"), TH("Storage Duration")], [TBb("National / State"), TB("Walk-in Cold Room (WIC)\nWalk-in Freezer (WIF)"), TB("+2 to +8 deg C\n-15 to -25 deg C"), TB("3-6 months")], [TBb("Regional / District"), TB("Ice-Lined Refrigerator (ILR)\nDeep Freezer"), TB("+2 to +8 deg C\n-15 to -25 deg C"), TB("1-3 months")], [TBb("PHC Level"), TB("Ice-Lined Refrigerator (ILR)"), TB("+2 to +8 deg C"), TB("1 month")], [TBb("Sub-centre / Field"), TB("Vaccine Carrier (4 ice packs)"), TB("+2 to +8 deg C"), TB("1 session day")], ] cc_t = Table(cc_data, colWidths=[3.8*cm, 5.5*cm, 4*cm, 4.2*cm], repeatRows=1) cc_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#0d47a1')), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTBLUE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#0d47a1')), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#90caf9')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(cc_t) story.append(Spacer(1, 0.15*cm)) story.append(Paragraph("Vaccine Storage Temperature Reference", h2_s)) vs_data = [ [TH("Vaccine"), TH("Required Temp"), TH("Freeze-Sensitive?"), TH("Light-Sensitive?"), TH("After Opening/Recon")], [TBb("BCG"), TB("2-8 deg C"), TB("NO (dry); YES (reconstituted)"), TB("YES"), TB("3-4 hours; discard")], [TBb("OPV"), TB("-20 deg C (can freeze)"), TB("NO"), TB("NO"), TB("30 days after thawing")], [TBb("IPV"), TB("2-8 deg C"), TB("YES"), TB("NO"), TB("Multi-dose: 28 days")], [TBb("Pentavalent"), TB("2-8 deg C"), TB("YES - shake test"), TB("NO"), TB("Same session (4h)"), ], [TBb("MR / Measles"), TB("2-8 deg C or freeze"), TB("NO"), TB("YES"), TB("4 hours")], [TBb("Hepatitis B"), TB("2-8 deg C"), TB("YES"), TB("NO"), TB("Multi-dose: 28 days")], [TBb("TT / Td"), TB("2-8 deg C"), TB("YES - shake test"), TB("NO"), TB("Multi-dose: 28 days")], [TBb("Rotavirus"), TB("2-8 deg C"), TB("Rotavac: NO freeze"), TB("NO"), TB("Same session")], [TBb("PCV"), TB("2-8 deg C"), TB("YES"), TB("NO"), TB("Multi-dose: 28 days")], ] vs_t = Table(vs_data, colWidths=[2.8*cm, 3.3*cm, 3.3*cm, 3.0*cm, 5.1*cm], repeatRows=1) vs_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#0d47a1')), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTBLUE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#0d47a1')), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#90caf9')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), ('FONTSIZE', (0,0), (-1,-1), 7.8), ])) story.append(vs_t) story.append(Spacer(1, 0.15*cm)) story.append(mnemonic_box( "<b>FREEZE kills:</b> DPT, TT, HepB, IPV, PCV — use SHAKE TEST to detect. " "<b>HEAT kills:</b> OPV fastest at room temp — use VVM. " "<b>LIGHT kills:</b> BCG, MR — keep covered. " "OPV goes in FREEZER; all others in REFRIGERATOR (2-8 deg C).")) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("Vaccine Vial Monitor (VVM)", h2_s)) vvm_data = [ [TH("VVM Stage"), TH("Appearance"), TH("Action")], [TBb("Stage 1"), TB("Inner square LIGHTER than outer ring"), TB("SAFE to use")], [TBb("Stage 2"), TB("Inner square same shade as outer ring (starting to change)"), TB("USE FIRST (still valid but deteriorating)")], [TBb("Stage 3"), TB("Inner square SAME colour as outer ring"), TB("DO NOT USE — discard point reached")], [TBb("Stage 4"), TB("Inner square DARKER than outer ring"), TB("DISCARD immediately")], ] vvm_t = Table(vvm_data, colWidths=[3*cm, 8*cm, 6.5*cm], repeatRows=1) vvm_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#0d47a1')), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTBLUE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#0d47a1')), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#90caf9')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(vvm_t) story.append(Spacer(1, 0.1*cm)) story.append(mnemonic_box("VVM: Lighter = OK; Same = STOP; Darker = Danger. Discard at Stage 3 onwards.")) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("Freeze Test / Shake Test", h2_s)) story.append(Paragraph( "<b>Vaccines damaged by freezing:</b> Pentavalent/DPT, TT/Td, IPV, HepB, PCV. " "Freeze damage = loss of adsorption of adjuvant; forms visible flocculation/clumps. " "<b>Shake Test Procedure:</b> (1) Take a known damaged (frozen-then-thawed) control vial. " "(2) Shake both control and suspect vials vigorously. " "(3) Watch sedimentation: if the suspect vial sediments FASTER than control — DISCARD. " "If both sediment at same rate — vaccine is still usable.", body_s)) story.append(Spacer(1, 0.1*cm)) story.append(tip_box("CONDITIONING ice packs: Before use in vaccine carrier, leave ice packs at room temp until you hear water sloshing inside (partial thaw). This prevents freeze damage to freeze-sensitive vaccines.")) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("Key Cold Chain Rules", h2_s)) rules_data = [ [TH("Rule"), TH("Detail")], [TBb("Temperature logging"), TB("Twice daily (morning and evening); maintain cold chain records")], [TBb("ILR door"), TB("Do NOT store vaccines in the door of the refrigerator (temperature fluctuates most there)")], [TBb("Open vial policy"), TB("Multi-dose vials (OPV, MR, DPT, TT, HepB) can be used in subsequent sessions IF VVM is OK, cap is intact, stored at 2-8 deg C, no contamination")], [TBb("Reconstituted vials"), TB("BCG and MR: discard within 3-4 hours after reconstitution; DO NOT use remaining reconstituted vaccine next session")], [TBb("Power cut"), TB("ILR can maintain temperature for 6-8 hours with ice lining — do not open unnecessarily")], [TBb("Transport sequence"), TB("Vaccines transported from higher to lower levels in cold boxes/vaccine carriers with conditioned ice packs")], ] rules_t = Table(rules_data, colWidths=[4*cm, 13.5*cm], repeatRows=1) rules_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#0d47a1')), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTBLUE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, colors.HexColor('#0d47a1')), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#90caf9')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(rules_t) story.append(Spacer(1, 0.3*cm)) # ══ SECTION 4: AEFI ══ story.append(PageBreak()) story.append(section_header("4. Adverse Events Following Immunisation (AEFI)", RED)) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("AEFI Classification (WHO 2012)", h2_s)) aefi_class = [ [TH("Category"), TH("Definition"), TH("Examples")], [TBb("Vaccine product-related"), TB("Inherent properties of the vaccine"), TB("VAPP (OPV), BCG lymphadenitis, MR fever/rash")], [TBb("Vaccine quality defect"), TB("Manufacturing or storage defect"), TB("Sterile abscess from poorly stored/reconstituted vaccine")], [TBb("Immunisation error\n(Programme error)"), TB("Error in preparation, handling or administration"), TB("Contaminated vial, wrong route, wrong dose, DPT given SC instead of IM -> sterile abscess")], [TBb("Immunisation anxiety"), TB("Psychogenic, not caused by vaccine"), TB("Vasovagal syncope, hyperventilation")], [TBb("Coincidental"), TB("Temporal association only; not caused by vaccine"), TB("Febrile illness that was incubating before vaccination")], ] aefi_ct = Table(aefi_class, colWidths=[4*cm, 5.5*cm, 8*cm], repeatRows=1) aefi_ct.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), RED), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTRED, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, RED), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#ef9a9a')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(aefi_ct) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("AEFI Quick Reference Table — By Vaccine", h2_s)) aefi_vax = [ [TH("Vaccine"), TH("Common / Expected"), TH("Serious / Rare"), TH("Timing")], [TBb("BCG"), TB("Local ulcer, scar"), TB("BCGitis, suppurative lymphadenitis, disseminated BCG"), TB("2-6 weeks")], [TBb("OPV"), TB("Rare GI upset"), TB("VAPP 1:750,000 first doses"), TB("7-30 days")], [TBb("IPV"), TB("Local redness, pain"), TB("Anaphylaxis (very rare)"), TB("Hours-2 days")], [TBb("DPT / Pentavalent"), TB("Fever, local pain/swelling, prolonged crying"), TB("HHE, encephalopathy 1:300,000, anaphylaxis"), TB("0-3 days")], [TBb("MR"), TB("Fever day 5-12, mild rash"), TB("Febrile seizures 1:3000, ITP 1:30,000, encephalitis 1:1M"), TB("5-14 days")], [TBb("Hepatitis B"), TB("Local pain, mild fever"), TB("Anaphylaxis (very rare)"), TB("Days")], [TBb("Rotavirus"), TB("Mild diarrhoea, vomiting"), TB("Intussusception (minimal with current vaccines)"), TB("1-7 days")], [TBb("PCV"), TB("Local swelling, fever"), TB("Febrile seizures (rare)"), TB("1-3 days")], [TBb("TT / Td"), TB("Local pain, induration"), TB("Arthus reaction, anaphylaxis"), TB("Hours-days")], [TBb("Vitamin A"), TB("Nausea, vomiting (transient)"), TB("Bulging fontanelle (very rare, resolves in 72h)"), TB("Hours")], ] aefi_vt = Table(aefi_vax, colWidths=[3*cm, 4.5*cm, 7*cm, 3*cm], repeatRows=1) aefi_vt.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), RED), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTRED, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, RED), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#ef9a9a')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), ('FONTSIZE', (0,0), (-1,-1), 7.8), ])) story.append(aefi_vt) story.append(Spacer(1, 0.15*cm)) story.append(Paragraph("AEFI Management Quick Guide", h2_s)) mgmt = [ [TH("AEFI"), TH("Management")], [TBb("Mild local reaction (pain, swelling)"), TB("Cold compress; reassure parents; complete immunisation schedule as planned")], [TBb("High fever (>38.5 deg C)"), TB("Paracetamol 10-15 mg/kg; tepid sponging; continue schedule")], [TBb("Anaphylaxis"), TB("ADRENALINE 0.01 mg/kg IM (1:1000 dilution) IMMEDIATELY; airway; oxygen; IV fluids; antihistamines; transfer to hospital urgently")], [TBb("Febrile seizures"), TB("Safe position, secure airway; diazepam PR if seizure >5 min; anti-pyretics; reassure (not epilepsy); no contraindication to future vaccines)")], [TBb("BCG lymphadenitis\n(suppurative)"), TB("Needle aspiration — DO NOT incise. BCGitis: isoniazid 10 mg/kg/day for 3 months")], [TBb("HHE (after DPT)"), TB("Recovers spontaneously within hours; complete schedule with acellular pertussis (aP) if available")], [TBb("VAPP"), TB("Report as Acute Flaccid Paralysis (AFP); investigate; supportive care; report to authorities")], [TBb("Intussusception"), TB("Immediate surgical/paediatric referral; air or hydrostatic enema reduction")], ] mgmt_t = Table(mgmt, colWidths=[4.5*cm, 13*cm], repeatRows=1) mgmt_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), RED), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTRED, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, RED), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#ef9a9a')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(mgmt_t) story.append(Spacer(1, 0.1*cm)) story.append(tip_box("AEFI Reporting: Serious AEFIs must be reported within 24 hours to District Immunisation Officer. Cluster AEFIs need immediate field investigation.")) story.append(Spacer(1, 0.3*cm)) # ══ SECTION 5: MNEMONICS ══ story.append(PageBreak()) story.append(section_header("5. Mnemonics & Quick Recall Summary", ORANGE)) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("Vaccine Types at a Glance", h2_s)) types = [ [TH("Type"), TH("Vaccines"), TH("Key Rule")], [TBb("Live attenuated"), TB("BCG, OPV, Rotavirus, MR/MMR, Varicella, Yellow Fever"), TB("CONTRAINDICATED in immunocompromised & pregnancy. Need 1-2 doses. Stronger immunity.")], [TBb("Killed / Inactivated"), TB("IPV (Salk), whole-cell pertussis, Hepatitis A"), TB("Safe in immunocompromised. Need multiple doses + boosters.")], [TBb("Toxoid"), TB("TT, DT (diphtheria toxoid)"), TB("Toxin treated with formalin. Safe in pregnancy (TT).")], [TBb("Recombinant"), TB("Hepatitis B, HPV"), TB("Made in YEAST. No live virus. Safe in all including immunocompromised.")], [TBb("Conjugate polysaccharide"), TB("Hib, PCV, Meningococcal"), TB("Works in <2 year olds (plain polysaccharide does NOT). Conjugated to protein carrier.")], ] types_t = Table(types, colWidths=[3.5*cm, 6*cm, 8*cm], repeatRows=1) types_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), ORANGE), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTORANGE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, ORANGE), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#ffcc80')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(types_t) story.append(Spacer(1, 0.15*cm)) story.append(mnemonic_box( "<b>Live vaccines CONTRAINDICATED in immunocompromised + pregnancy:</b> " "BCG, OPV, Rotavirus, MR/MMR, Varicella, Yellow Fever — remember '<b>BORMYV</b>' or '<b>Born MaRried, Young Venturous</b>'")) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("Routes of Administration", h2_s)) routes = [ [TH("Route"), TH("Vaccines"), TH("Mnemonic")], [TBb("Oral"), TB("OPV, Rotavirus, Vitamin A"), TB("O = Oral (easy: OPV and Rotavirus both given by mouth)")], [TBb("Intradermal (ID)"), TB("BCG, fIPV"), TB("BCG left arm ID = 'BIG bump under skin'; fIPV right arm ID")], [TBb("Subcutaneous (SC)"), TB("MR, Varicella"), TB("MR = SC right upper arm; think 'SC = Subcutaneous, right arm, pinch skin'")], [TBb("Intramuscular (IM)"), TB("DPT/Pentavalent, HepB, IPV (full), TT, PCV"), TB("Most injectables = IM. Infants: anterolateral THIGH. Older: DELTOID.")], ] routes_t = Table(routes, colWidths=[3.5*cm, 5.5*cm, 8.5*cm], repeatRows=1) routes_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), ORANGE), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTORANGE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, ORANGE), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#ffcc80')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(routes_t) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("Critical Numbers to Remember", h2_s)) nums = [ [TH("Fact"), TH("Value"), TH("Memory Hook")], [TBb("VAPP risk (1st dose OPV)"), TB("1 per 750,000"), TB("7-5-0 (think 750 thousand — rare but it happens)")], [TBb("BCG shelf life after reconstitution"), TB("3-4 hours"), TB("BCG = 3-4h. SHORT life. Use fast.")], [TBb("MR post-vax fever onset"), TB("Day 5-12"), TB("Five to Twelve — delayed because live virus replicates first")], [TBb("Anti-HBs seroprotection threshold"), TB(">10 IU/L"), TB("TEN = protected against Hepatitis B")], [TBb("DPT encephalopathy risk"), TB("1 per 300,000"), TB("3 lakh — rare, but switch to aP if it happens")], [TBb("ILR refrigerator temperature"), TB("+2 to +8 deg C"), TB("2 to 8 = 'two eight' fridge — never below 2 or above 8")], [TBb("Deep freezer temperature"), TB("-15 to -25 deg C"), TB("OPV in MINUS 20 zone — negative, like polio outcome without vaccine")], [TBb("VVM discard point"), TB("Stage 3 (inner=outer ring)"), TB("Stage 3 = STOP. Three = no more.")], [TBb("TT doses in pregnancy"), TB("2 doses (TT-1 + TT-2) or 1 booster"), TB("T-T = Two Times (unless immunized within 3 years = booster only)")], [TBb("Rotavirus — age limit to start"), TB("Before 15 weeks"), TB("Fifteen weeks = deadline for first Rota dose")], [TBb("MR reconstituted vial shelf life"), TB("4 hours"), TB("MR = 4h only. Live = short shelf life.")], ] nums_t = Table(nums, colWidths=[5.5*cm, 3.3*cm, 8.7*cm], repeatRows=1) nums_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), ORANGE), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTORANGE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, ORANGE), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#ffcc80')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ('FONTSIZE', (0,0), (-1,-1), 8), ])) story.append(nums_t) story.append(Spacer(1, 0.2*cm)) story.append(mnemonic_box( "<b>Birth vaccines:</b> 'Born Pretty Healthy' = BCG + Polio-0 + HepB-1 | " "<b>6W:</b> 'OPP-RF-P' = OPV + Penta + Rota + fIPV + PCV | " "<b>9M:</b> MR + Vitamin A | " "<b>Freeze-sensitive:</b> 'DIT-HP' = DPT, IPV, TT, HepB, PCV")) story.append(Spacer(1, 0.2*cm)) story.append(Paragraph("EPI / UIP Milestones in India", h2_s)) epi = [ [TH("Year"), TH("Milestone")], [TBb("1974"), TB("WHO EPI launched globally — 6 diseases: TB, DPT, Polio, Measles")], [TBb("1978"), TB("EPI launched in India (January) — same 6 diseases")], [TBb("1985"), TB("Universal Immunization Programme (UIP) launched — Nov 19 (Indira Gandhi memorial)")], [TBb("1990"), TB("Universal Child Immunization (UCI) target — coverage of all children")], [TBb("2014"), TB("Pentavalent vaccine introduced nationally in UIP")], [TBb("2015"), TB("IPV introduced alongside OPV in schedule")], [TBb("2016"), TB("Switch from tOPV (trivalent) to bOPV (bivalent — types 1 & 3)")], [TBb("2017"), TB("MR (Measles-Rubella) vaccine replaced standalone measles in UIP")], [TBb("2020"), TB("NIS 2020: current schedule including PCV, Rotavirus, MR, IPV comprehensively")], ] epi_t = Table(epi, colWidths=[2.5*cm, 15*cm], repeatRows=1) epi_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), NAVY), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LTBLUE, WHITE]), ('BOX', (0,0), (-1,-1), 0.8, NAVY), ('INNERGRID', (0,0), (-1,-1), 0.4, colors.HexColor('#90caf9')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(epi_t) story.append(Spacer(1, 0.3*cm)) # ── Footer ── footer = Table([[Paragraph( "Source: Park's Textbook of Preventive and Social Medicine | India NIS 2020 | WHO AEFI Guidelines 2012 | " "Prepared for revision purposes only | Orris Medical", foot_s)]], colWidths=[17.5*cm]) footer.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), LTGREY), ('BOX', (0,0), (-1,-1), 0.5, colors.HexColor('#b0bec5')), ('TOPPADDING', (0,0), (-1,-1), 6), ('BOTTOMPADDING', (0,0), (-1,-1), 6), ])) story.append(footer) doc.build(story) print(f"SUCCESS: {OUTPUT}") PYEOF

This is a shared conversation. Sign in to Orris to start your own chat.