Just tell me what to study in anatomy and how
| Week | Focus |
|---|---|
| 1-2 | Upper limb (gross + embryology of limbs) |
| 3 | Lower limb |
| 4 | Thorax + heart embryology |
| 5 | Abdomen + GI embryology |
| 6 | Head & neck + pharyngeal arch derivatives |
| 7 | Neuroanatomy (dedicate a full week - high yield) |
| 8 | Histology + revision of all diagrams |
| Ongoing | 20-30 MCQs daily from day 1 |
Create a NEET PG anatomy study schedule in PDF format
Create a neet pg 2027 exam daily schedule with 3 times proper study and 3times revision
mkdir -p /home/daytona/workspace/neet-pg-schedule
~/neet-pg-schedule/create_schedule.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT
from reportlab.platypus import KeepTogether
OUTPUT = "/home/daytona/workspace/neet-pg-schedule/NEET_PG_Anatomy_Schedule.pdf"
# ── Colours ──────────────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1A3A5C")
MID_BLUE = colors.HexColor("#2E6DA4")
LIGHT_BLUE = colors.HexColor("#D6E8F7")
ACCENT = colors.HexColor("#E8A020")
LIGHT_GREY = colors.HexColor("#F4F6F9")
MED_GREY = colors.HexColor("#C8D0DA")
GREEN = colors.HexColor("#1E7E34")
LIGHT_GREEN = colors.HexColor("#D4EDDA")
PURPLE = colors.HexColor("#6F42C1")
LIGHT_PURPLE= colors.HexColor("#EDE7F6")
RED = colors.HexColor("#C0392B")
LIGHT_RED = colors.HexColor("#FDECEA")
WHITE = colors.white
BLACK = colors.black
# ── Styles ───────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
title_style = S("MainTitle",
fontName="Helvetica-Bold", fontSize=22, textColor=WHITE,
alignment=TA_CENTER, spaceAfter=4, leading=28)
subtitle_style = S("SubTitle",
fontName="Helvetica", fontSize=12, textColor=LIGHT_BLUE,
alignment=TA_CENTER, spaceAfter=2)
section_head = S("SectionHead",
fontName="Helvetica-Bold", fontSize=13, textColor=WHITE,
alignment=TA_LEFT, leading=18, leftIndent=6)
body = S("Body",
fontName="Helvetica", fontSize=9, textColor=BLACK,
alignment=TA_LEFT, leading=13)
body_bold = S("BodyBold",
fontName="Helvetica-Bold", fontSize=9, textColor=DARK_BLUE,
alignment=TA_LEFT, leading=13)
small = S("Small",
fontName="Helvetica", fontSize=8, textColor=colors.HexColor("#444444"),
alignment=TA_LEFT, leading=11)
small_bold = S("SmallBold",
fontName="Helvetica-Bold", fontSize=8, textColor=DARK_BLUE,
alignment=TA_LEFT, leading=11)
cell_head = S("CellHead",
fontName="Helvetica-Bold", fontSize=8.5, textColor=WHITE,
alignment=TA_CENTER, leading=11)
cell_body = S("CellBody",
fontName="Helvetica", fontSize=8, textColor=BLACK,
alignment=TA_LEFT, leading=11)
cell_body_bold = S("CellBodyBold",
fontName="Helvetica-Bold", fontSize=8, textColor=DARK_BLUE,
alignment=TA_LEFT, leading=11)
note_style = S("Note",
fontName="Helvetica-Oblique", fontSize=8, textColor=colors.HexColor("#555555"),
alignment=TA_LEFT, leading=11)
footer_style = S("Footer",
fontName="Helvetica", fontSize=7.5, textColor=colors.HexColor("#888888"),
alignment=TA_CENTER)
# ── Helper: coloured banner paragraph ────────────────────────────────────────
def banner(text, bg=DARK_BLUE, style=section_head):
tbl = Table([[Paragraph(text, style)]], colWidths=[17.5*cm])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("ROUNDEDCORNERS", (0,0), (-1,-1), [4,4,4,4]),
]))
return tbl
# ── Daily time-block data ─────────────────────────────────────────────────────
# 3 × study sessions + 3 × revision sessions every day
daily_blocks = [
# (Time, Type, Label, Colour pair bg/fg)
("6:00 – 7:00 AM", "Warm-Up", "Wake up, freshen up, light breakfast, 10-min review of yesterday's notes", LIGHT_GREY, BLACK),
("7:00 – 9:30 AM", "STUDY 1", "New Topic — Gross Anatomy (deep reading + diagram drawing)", LIGHT_BLUE, DARK_BLUE),
("9:30 – 10:00 AM", "REVISION 1","Revise Study 1 material: re-draw diagrams from memory + 10 MCQs", LIGHT_GREEN, GREEN),
("10:00 – 10:15 AM","Break", "Short break — water, stretch", LIGHT_GREY, BLACK),
("10:15 AM – 12:45 PM","STUDY 2","New Topic — Neuroanatomy / Embryology (read + flashcard creation)", LIGHT_BLUE, DARK_BLUE),
("12:45 – 1:15 PM", "REVISION 2","Revise Study 2 material: active recall + 10 MCQs", LIGHT_GREEN, GREEN),
("1:15 – 2:15 PM", "Lunch + Rest","Meal + 30-min rest or nap (no screens)", LIGHT_GREY, BLACK),
("2:15 – 4:45 PM", "STUDY 3", "New Topic — Histology / Surface Anatomy / Clinical Applied (read + notes)", LIGHT_BLUE, DARK_BLUE),
("4:45 – 5:15 PM", "REVISION 3","Revise Study 3 material: Anki flashcards + 10 MCQs", LIGHT_GREEN, GREEN),
("5:15 – 5:45 PM", "Break", "Evening snack, walk, rest", LIGHT_GREY, BLACK),
("5:45 – 7:00 PM", "MCQ Practice","Solve 30 NEET PG/INI-CET PYQs (mixed topics)", LIGHT_PURPLE, PURPLE),
("7:00 – 8:00 PM", "Weekly Weak Zone","Target your weakest topic of the week — re-read + re-draw", LIGHT_RED, RED),
("8:00 – 9:00 PM", "Dinner + Relax","Dinner, family time, no study material", LIGHT_GREY, BLACK),
("9:00 – 10:00 PM", "Day Wrap-Up","Write a 1-page summary of everything studied today. Plan tomorrow.", colors.HexColor("#FFF8E1"), colors.HexColor("#7B4F00")),
("10:00 PM", "Sleep", "Minimum 7 hours of sleep — essential for memory consolidation", LIGHT_GREY, BLACK),
]
# ── 8-Week topic plan ─────────────────────────────────────────────────────────
weekly_plan = [
("Week 1\nJul 13–19", "Upper Limb",
"Bones & joints, Brachial plexus (Erb's, Klumpke's), Axilla, Cubital fossa, "
"Nerve injuries (radial/ulnar/median), Dermatomes",
"Study: BD Chaurasia Vol 1\nHistology: Bone & cartilage types\nEmbryology: Limb development\nMCQs: 70/week PYQs"),
("Week 2\nJul 20–26", "Lower Limb",
"Femoral triangle (NAVEL), Popliteal fossa, Sciatic nerve, Common peroneal nerve at fibular neck, "
"Hip joint, Knee joint, Foot arches",
"Study: BD Chaurasia Vol 1\nHistology: Muscle fibre types\nEmbryology: Lower limb rotation\nMCQs: 70/week PYQs"),
("Week 3\nJul 27 – Aug 2", "Thorax",
"Heart – conducting system, blood supply, surface markings, valves; Lung roots; Diaphragm openings "
"(T8/T10/T12); Mediastinum; Pericardium",
"Study: BD Chaurasia Vol 2\nHistology: Cardiac muscle vs skeletal\nEmbryology: Heart development, septal defects\nMCQs: 70/week PYQs"),
("Week 4\nAug 3–9", "Abdomen",
"Peritoneum, retroperitoneal organs (SAD PUCKER), Portal-systemic anastomoses, Inguinal canal "
"(direct vs indirect hernia), Lumbar plexus, Kidney & ureters",
"Study: BD Chaurasia Vol 2\nHistology: GI layers, goblet/Paneth/chief/parietal cells\nEmbryology: Gut rotation, Meckel's diverticulum\nMCQs: 70/week PYQs"),
("Week 5\nAug 10–16", "Head & Neck",
"Triangles of neck, Carotid arteries, Cranial nerves (overview), Cavernous sinus, Thyroid & parathyroid, "
"Parotid gland, Orbit, Pharynx & larynx",
"Study: BD Chaurasia Vol 3\nHistology: Salivary glands, thyroid follicles\nEmbryology: Pharyngeal arches & pouches\nMCQs: 70/week PYQs"),
("Week 6\nAug 17–23", "Neuroanatomy Part 1",
"Internal capsule (blood supply, limbs, lesions), Cerebral cortex areas, Basal ganglia, Thalamic nuclei, "
"Brainstem – levels, cranial nerve nuclei",
"Study: Snell's Neuroanatomy + BD Vol 3\nHistology: Neuron types, glial cells\nEmbryology: Neural tube defects\nMCQs: 70/week PYQs"),
("Week 7\nAug 24–30", "Neuroanatomy Part 2",
"Spinal cord tracts + syndromes (Brown-Sequard, syringomyelia, SACD, tabes dorsalis), "
"Cerebellum, Ventricular system & CSF pathway, Circle of Willis, Meninges & dural sinuses",
"Study: Snell's Neuroanatomy\nHistology: Cerebellum layers, blood-brain barrier\nEmbryology: Neural crest derivatives\nMCQs: 70/week PYQs"),
("Week 8\nAug 31 – Sep 6", "Full Revision + Histology",
"Rapid revision of all 7 weeks — diagram redraws only; Complete histology block "
"(skin, testis, liver, kidney, GI); Grand test: 100 anatomy MCQs timed",
"Revise all flashcard decks\nRedo all weak-zone topics\nTarget score: >70% in grand test\nPlan weeks 9–12 for other subjects"),
]
# ── Revision strategy table ───────────────────────────────────────────────────
revision_rules = [
("Revision 1\n(same day, 30 min)", "Right after Study 1", "Re-draw diagram from memory. Answer 10 MCQs from that topic."),
("Revision 2\n(same day, 30 min)", "Right after Study 2", "Active recall: close book, write key points. Answer 10 MCQs."),
("Revision 3\n(same day, 30 min)", "Right after Study 3", "Review Anki flashcards created that day. Answer 10 MCQs."),
("Weekly Review\n(Sunday, 2 hrs)", "Every Sunday morning", "Re-draw all diagrams of the week. Solve 50 PYQs (timed). Mark weak spots."),
("Monthly Grand Test\n(last Sunday of month)", "End of each month", "100-question timed test. Review all wrong answers the same day."),
("Spaced Repetition\n(Anki, daily 20 min)", "Every evening", "Review Anki cards due that day. Add new cards from today's study."),
]
# ── Key resources ─────────────────────────────────────────────────────────────
resources = [
("Gross Anatomy", "BD Chaurasia Vol 1–3 + Handbook"),
("Applied Anatomy","Snell's Clinical Anatomy (8th ed)"),
("Embryology", "Inderbir Singh — Human Embryology"),
("Histology", "Inderbir Singh — Textbook of Human Histology"),
("Atlas", "Netter's Atlas of Human Anatomy"),
("MCQ Bank", "Across / Amit Ashish Anatomy"),
("PYQs", "NEET PG + AIIMS PG previous 10 years"),
("Flashcards", "Anki (free app) — create your own cards"),
]
# ══════════════════════════════════════════════════════════════════════════════
# BUILD THE PDF
# ══════════════════════════════════════════════════════════════════════════════
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=1.8*cm, rightMargin=1.8*cm,
topMargin=2.0*cm, bottomMargin=2.0*cm,
)
story = []
W = 17.5*cm # usable width
# ─── COVER BLOCK ──────────────────────────────────────────────────────────────
cover_data = [[
Paragraph("NEET PG / INI-CET 2027", title_style),
Paragraph("ANATOMY STUDY SCHEDULE", title_style),
Paragraph("Complete 8-Week Daily Plan with 3 Study Sessions + 3 Revisions Per Day", subtitle_style),
Paragraph("Starting: July 13, 2026 | Target Exam: NEET PG 2027", subtitle_style),
]]
cover = Table(cover_data, colWidths=[W])
cover.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("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",(0,0), (-1,-1), [6,6,6,6]),
]))
story.append(cover)
story.append(Spacer(1, 0.4*cm))
# accent bar
story.append(Table([[""]], colWidths=[W], rowHeights=[4]))
story.append(Spacer(1, 0.3*cm))
# ─── EXAM OVERVIEW ────────────────────────────────────────────────────────────
story.append(banner(" EXAM OVERVIEW", DARK_BLUE))
story.append(Spacer(1, 0.2*cm))
overview_data = [
[Paragraph("<b>Exam</b>", cell_body_bold), Paragraph("NEET PG 2027 / INI-CET", cell_body)],
[Paragraph("<b>Anatomy weightage</b>", cell_body_bold), Paragraph("~10–15 questions | Focus: clinically applied anatomy", cell_body)],
[Paragraph("<b>Schedule duration</b>", cell_body_bold), Paragraph("8 weeks (July 13 – September 6, 2026)", cell_body)],
[Paragraph("<b>Daily study hours</b>", cell_body_bold), Paragraph("~9 hours active study + revision (6 AM – 10 PM with breaks)", cell_body)],
[Paragraph("<b>Study sessions/day</b>", cell_body_bold), Paragraph("3 × 2.5-hour study blocks (Gross, Neuro/Embryology, Histology)", cell_body)],
[Paragraph("<b>Revision sessions/day</b>", cell_body_bold), Paragraph("3 × 30-min revisions (immediately after each study block)", cell_body)],
[Paragraph("<b>MCQs/day</b>", cell_body_bold), Paragraph("30+ PYQs daily (10 after each study block + 30 MCQ practice slot)", cell_body)],
]
ov_tbl = Table(overview_data, colWidths=[5.5*cm, 12*cm])
ov_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,-1), LIGHT_BLUE),
("BACKGROUND", (1,0), (1,-1), WHITE),
("ROWBACKGROUNDS",(0,0), (-1,-1), [LIGHT_BLUE, LIGHT_GREY]),
("GRID", (0,0), (-1,-1), 0.4, MED_GREY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(ov_tbl)
story.append(Spacer(1, 0.4*cm))
# ─── DAILY SCHEDULE TABLE ─────────────────────────────────────────────────────
story.append(banner(" DAILY TIME SCHEDULE (Monday – Saturday)", MID_BLUE))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"This schedule repeats every weekday. Sunday is the weekly review day (see below).",
note_style))
story.append(Spacer(1, 0.2*cm))
# header row
daily_header = [
Paragraph("TIME", cell_head),
Paragraph("SESSION TYPE", cell_head),
Paragraph("ACTIVITY", cell_head),
]
daily_rows = [daily_header]
for (time, stype, activity, bg, fg) in daily_blocks:
row = [
Paragraph(f"<b>{time}</b>", S("t", fontName="Helvetica-Bold", fontSize=8, textColor=DARK_BLUE, leading=11)),
Paragraph(f"<b>{stype}</b>", S("s", fontName="Helvetica-Bold", fontSize=8, textColor=fg, leading=11)),
Paragraph(activity, S("a", fontName="Helvetica", fontSize=8, textColor=BLACK, leading=11)),
]
daily_rows.append(row)
daily_tbl = Table(daily_rows, colWidths=[3.5*cm, 3*cm, 11*cm])
row_bgs = []
for i, (_, stype, _, bg, _) in enumerate(daily_blocks, start=1):
row_bgs.append(("BACKGROUND", (0,i), (-1,i), bg))
daily_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("GRID", (0,0), (-1,-1), 0.4, MED_GREY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING",(0,0),(-1,-1), 7),
("RIGHTPADDING",(0,0),(-1,-1), 7),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [LIGHT_GREY, WHITE]),
] + row_bgs))
story.append(daily_tbl)
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
"★ STUDY 1 = Gross Anatomy | STUDY 2 = Neuroanatomy / Embryology | STUDY 3 = Histology / Surface / Clinical Applied",
note_style))
story.append(Spacer(1, 0.4*cm))
# ─── PAGE BREAK before weekly plan ───────────────────────────────────────────
story.append(PageBreak())
# ─── 8-WEEK TOPIC PLAN ────────────────────────────────────────────────────────
story.append(banner(" 8-WEEK TOPIC PLAN (July 13 – September 6, 2026)", DARK_BLUE))
story.append(Spacer(1, 0.2*cm))
week_header = [
Paragraph("WEEK", cell_head),
Paragraph("REGION / TOPIC", cell_head),
Paragraph("KEY AREAS TO COVER", cell_head),
Paragraph("NOTES", cell_head),
]
week_rows = [week_header]
alt = [LIGHT_BLUE, WHITE]
for i, (week, topic, areas, notes) in enumerate(weekly_plan):
bg = alt[i % 2]
week_rows.append([
Paragraph(f"<b>{week}</b>", S("w", fontName="Helvetica-Bold", fontSize=8, textColor=DARK_BLUE, alignment=TA_CENTER, leading=11)),
Paragraph(f"<b>{topic}</b>", S("tp", fontName="Helvetica-Bold", fontSize=8, textColor=MID_BLUE, leading=11)),
Paragraph(areas, S("ar", fontName="Helvetica", fontSize=7.5, textColor=BLACK, leading=11)),
Paragraph(notes, S("nt", fontName="Helvetica", fontSize=7.5, textColor=colors.HexColor("#333333"), leading=11)),
])
week_tbl = Table(week_rows, colWidths=[2.4*cm, 2.8*cm, 7.3*cm, 5*cm])
row_bgs_w = [("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_BLUE, WHITE])]
week_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("GRID", (0,0), (-1,-1), 0.4, MED_GREY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_BLUE, WHITE]),
]))
story.append(week_tbl)
story.append(Spacer(1, 0.4*cm))
# ─── SUNDAY PLAN ──────────────────────────────────────────────────────────────
story.append(banner(" SUNDAY – WEEKLY REVIEW DAY", colors.HexColor("#1E7E34")))
story.append(Spacer(1, 0.2*cm))
sunday_data = [
[Paragraph("7:00 – 9:00 AM", cell_body_bold), Paragraph("Re-draw all diagrams of the week from memory (no book)", cell_body)],
[Paragraph("9:00 – 10:30 AM", cell_body_bold), Paragraph("50 timed PYQ MCQs — all topics covered so far", cell_body)],
[Paragraph("10:30 – 11:00 AM", cell_body_bold), Paragraph("Review wrong answers. Add weak points to Anki.", cell_body)],
[Paragraph("11:00 AM – 12:00 PM", cell_body_bold), Paragraph("Target your 3 weakest topics — re-read only those pages", cell_body)],
[Paragraph("12:00 PM onward", cell_body_bold), Paragraph("Rest, recreation, light reading — no new anatomy topics", cell_body)],
]
sun_tbl = Table(sunday_data, colWidths=[4*cm, 13.5*cm])
sun_tbl.setStyle(TableStyle([
("ROWBACKGROUNDS",(0,0),(-1,-1),[LIGHT_GREEN, WHITE]),
("GRID", (0,0),(-1,-1), 0.4, MED_GREY),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
("RIGHTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
]))
story.append(sun_tbl)
story.append(Spacer(1, 0.4*cm))
# ─── PAGE BREAK ───────────────────────────────────────────────────────────────
story.append(PageBreak())
# ─── REVISION STRATEGY ────────────────────────────────────────────────────────
story.append(banner(" REVISION STRATEGY (3 Daily + Weekly + Monthly)", MID_BLUE))
story.append(Spacer(1, 0.2*cm))
rev_header = [
Paragraph("REVISION TYPE", cell_head),
Paragraph("WHEN", cell_head),
Paragraph("HOW", cell_head),
]
rev_rows = [rev_header]
for rt, when, how in revision_rules:
rev_rows.append([
Paragraph(f"<b>{rt}</b>", S("rh", fontName="Helvetica-Bold", fontSize=8, textColor=GREEN, leading=11)),
Paragraph(when, cell_body),
Paragraph(how, cell_body),
])
rev_tbl = Table(rev_rows, colWidths=[3.8*cm, 4.5*cm, 9.2*cm])
rev_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_GREEN, WHITE]),
("GRID", (0,0),(-1,-1), 0.4, MED_GREY),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 7),
("RIGHTPADDING", (0,0),(-1,-1), 7),
("VALIGN", (0,0),(-1,-1), "TOP"),
]))
story.append(rev_tbl)
story.append(Spacer(1, 0.4*cm))
# ─── HIGH-YIELD TOPICS ────────────────────────────────────────────────────────
story.append(banner(" HIGH-YIELD TOPICS FOR NEET PG / INI-CET", DARK_BLUE))
story.append(Spacer(1, 0.2*cm))
hy_categories = [
("Neuroanatomy", LIGHT_RED, RED, [
"Internal capsule — blood supply (lenticulostriate), limbs, lesion features",
"Spinal cord syndromes — Brown-Sequard, syringomyelia, SACD, tabes dorsalis",
"Brainstem syndromes — Weber, Wallenberg, Benedict, Millard-Gubler",
"Ventricular system — CSF pathway, foramina of Monro / Magendie / Luschka",
"Circle of Willis — MCA/ACA territory strokes",
"Cerebellum — peduncles, layers, flocculonodular lobe",
]),
("Gross Anatomy", LIGHT_BLUE, MID_BLUE, [
"Brachial plexus — roots-trunks-divisions-cords; Erb's & Klumpke's palsy",
"Femoral triangle — NAVEL order (lateral to medial)",
"Inguinal canal — walls, contents, direct vs indirect hernia",
"Diaphragm openings — T8 (IVC), T10 (oesophagus + vagus), T12 (aorta + thoracic duct)",
"Portal-systemic anastomoses — 4 sites and clinical relevance",
"Lymph drainage of testes — para-aortic nodes (NOT inguinal)",
]),
("Embryology", LIGHT_PURPLE, PURPLE, [
"Pharyngeal arches 1/2/3/4/6 — muscles, nerves, cartilages",
"Pharyngeal pouches — palatine tonsil, thymus, parathyroid, ultimobranchial body",
"Congenital heart defects — VSD most common; ASD ostium secundum most common",
"Gut rotation — malrotation, volvulus, Meckel's diverticulum (rule of 2s)",
"Neural tube defects — folate; spina bifida types",
"Wolffian vs Mullerian duct derivatives",
]),
("Histology", LIGHT_GREEN, GREEN, [
"GI cells — goblet cells, Paneth cells, chief cells (pepsinogen), parietal cells (HCl)",
"Liver cells — Kupffer cells (macrophages), Ito cells (store Vit A / hepatic fibrosis)",
"Testis — Sertoli cells (blood-testis barrier, inhibin), Leydig cells (testosterone)",
"Skin layers — Corneum, Lucidum, Granulosum, Spinosum, Basale (Come Let's Get Sun Burnt)",
"Cartilage types — hyaline (articular), elastic (ear/epiglottis), fibrocartilage (disc/pubis)",
"Bone — Haversian system (osteon), endosteum vs periosteum",
]),
]
for (cat_name, bg, fg, items) in hy_categories:
cat_hdr = Table([[Paragraph(f" {cat_name}", S("ch", fontName="Helvetica-Bold", fontSize=9, textColor=WHITE, leading=13))]], colWidths=[W])
cat_hdr.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), fg),
("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4),
("LEFTPADDING",(0,0),(-1,-1),10),("RIGHTPADDING",(0,0),(-1,-1),10),
]))
story.append(cat_hdr)
item_rows = [[Paragraph(f"• {it}", S("it", fontName="Helvetica", fontSize=8, textColor=BLACK, leading=11))] for it in items]
item_tbl = Table(item_rows, colWidths=[W])
item_tbl.setStyle(TableStyle([
("ROWBACKGROUNDS",(0,0),(-1,-1),[bg, WHITE]),
("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4),
("LEFTPADDING",(0,0),(-1,-1),12),("RIGHTPADDING",(0,0),(-1,-1),8),
("LINEBELOW",(0,0),(-1,-1),0.3, MED_GREY),
]))
story.append(item_tbl)
story.append(Spacer(1, 0.15*cm))
story.append(Spacer(1, 0.3*cm))
# ─── RESOURCES ────────────────────────────────────────────────────────────────
story.append(banner(" RECOMMENDED RESOURCES", DARK_BLUE))
story.append(Spacer(1, 0.2*cm))
res_header = [Paragraph("TOPIC", cell_head), Paragraph("RESOURCE", cell_head)]
res_rows = [res_header]
for topic, resource in resources:
res_rows.append([
Paragraph(f"<b>{topic}</b>", cell_body_bold),
Paragraph(resource, cell_body),
])
res_tbl = Table(res_rows, colWidths=[5*cm, 12.5*cm])
res_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_GREY, WHITE]),
("GRID", (0,0),(-1,-1), 0.4, MED_GREY),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
("RIGHTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
]))
story.append(res_tbl)
story.append(Spacer(1, 0.4*cm))
# ─── GOLDEN RULES ─────────────────────────────────────────────────────────────
story.append(banner(" 10 GOLDEN RULES FOR NEET PG ANATOMY", ACCENT))
story.append(Spacer(1, 0.2*cm))
rules = [
"Draw every diagram from memory — never just re-read.",
"After every topic, ask: 'What happens clinically when this is damaged?'",
"Solve PYQs the SAME day you study a topic — not next week.",
"Lymph drainage of testes = para-aortic (not inguinal) — guaranteed NEET question.",
"Spaced repetition (Anki) beats cramming every single time.",
"Do NOT skip embryology — it gives easy, predictable marks.",
"Neuroanatomy = highest yield; spend 2 full weeks on it minimum.",
"Surface anatomy and nerve injury patterns appear almost every year.",
"7 hours of sleep is non-negotiable — memory consolidation happens during sleep.",
"Never start a new topic without finishing the revision of the previous one.",
]
rule_rows = [[
Paragraph(f"<b>{i+1}.</b>", S("rn", fontName="Helvetica-Bold", fontSize=9, textColor=ACCENT, alignment=TA_CENTER, leading=13)),
Paragraph(rule, S("rb", fontName="Helvetica", fontSize=8.5, textColor=BLACK, leading=13)),
] for i, rule in enumerate(rules)]
rule_tbl = Table(rule_rows, colWidths=[1*cm, 16.5*cm])
rule_tbl.setStyle(TableStyle([
("ROWBACKGROUNDS",(0,0),(-1,-1),[colors.HexColor("#FFF8E1"), WHITE]),
("LINEBELOW",(0,0),(-1,-1),0.3, MED_GREY),
("TOPPADDING",(0,0),(-1,-1),5),("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),6),("RIGHTPADDING",(0,0),(-1,-1),8),
("VALIGN",(0,0),(-1,-1),"MIDDLE"),
]))
story.append(rule_tbl)
story.append(Spacer(1, 0.5*cm))
# ─── FOOTER ───────────────────────────────────────────────────────────────────
story.append(HRFlowable(width=W, thickness=1, color=MED_GREY))
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph(
"NEET PG 2027 Anatomy Study Schedule | Generated July 12, 2026 | 3 Study Sessions + 3 Revisions per Day",
footer_style))
# ─── BUILD ────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /home/daytona/workspace/neet-pg-schedule && python create_schedule.py
NEET PG Anatomy Schedule
PDF Document · PDF
No i need plan for 1 year for 2027 pg subject wise each subject should be studied 3 time and 3 revisions total please form a plan accordingly and i can study only 4-5hrs per day and ill start from 19
~/neet-pg-schedule/create_1year_schedule.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from datetime import date, timedelta
OUTPUT = "/home/daytona/workspace/neet-pg-schedule/NEET_PG_2027_1Year_Plan.pdf"
# ── Colours ───────────────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1A3A5C")
MID_BLUE = colors.HexColor("#2E6DA4")
LIGHT_BLUE = colors.HexColor("#D6E8F7")
ACCENT = colors.HexColor("#E8A020")
LIGHT_GREY = colors.HexColor("#F4F6F9")
MED_GREY = colors.HexColor("#C8D0DA")
GREEN = colors.HexColor("#1E7E34")
LIGHT_GREEN = colors.HexColor("#D4EDDA")
PURPLE = colors.HexColor("#6F42C1")
LIGHT_PURPLE = colors.HexColor("#EDE7F6")
RED = colors.HexColor("#C0392B")
LIGHT_RED = colors.HexColor("#FDECEA")
ORANGE = colors.HexColor("#E8A020")
LIGHT_ORANGE = colors.HexColor("#FFF3CD")
TEAL = colors.HexColor("#117A65")
LIGHT_TEAL = colors.HexColor("#D1F2EB")
WHITE = colors.white
BLACK = colors.black
# ── Styles ────────────────────────────────────────────────────────────────────
def S(name, **kw):
return ParagraphStyle(name, **kw)
title_s = S("T", fontName="Helvetica-Bold", fontSize=20, textColor=WHITE, alignment=TA_CENTER, leading=26, spaceAfter=3)
sub_s = S("Su", fontName="Helvetica", fontSize=11, textColor=colors.HexColor("#B0CCE8"), alignment=TA_CENTER, leading=15)
sh_s = S("SH", fontName="Helvetica-Bold", fontSize=11, textColor=WHITE, alignment=TA_LEFT, leading=15)
body_s = S("B", fontName="Helvetica", fontSize=8.5,textColor=BLACK, alignment=TA_LEFT, leading=12)
bold_s = S("Bb", fontName="Helvetica-Bold", fontSize=8.5,textColor=DARK_BLUE, alignment=TA_LEFT, leading=12)
small_s = S("Sm", fontName="Helvetica", fontSize=7.5,textColor=colors.HexColor("#444"), alignment=TA_LEFT, leading=10)
note_s = S("N", fontName="Helvetica-Oblique", fontSize=8, textColor=colors.HexColor("#555"), alignment=TA_LEFT, leading=11)
ch_s = S("Ch", fontName="Helvetica-Bold", fontSize=8.5,textColor=WHITE, alignment=TA_CENTER, leading=12)
foot_s = S("F", fontName="Helvetica", fontSize=7, textColor=colors.HexColor("#888"), alignment=TA_CENTER)
num_s = S("Nm", fontName="Helvetica-Bold", fontSize=8.5,textColor=ACCENT, alignment=TA_CENTER, leading=12)
W = 17.2*cm
def banner(text, bg=DARK_BLUE, style=sh_s):
tbl = Table([[Paragraph(text, style)]], colWidths=[W])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("TOPPADDING", (0,0),(-1,-1), 7),
("BOTTOMPADDING", (0,0),(-1,-1), 7),
("LEFTPADDING", (0,0),(-1,-1), 12),
("RIGHTPADDING", (0,0),(-1,-1), 12),
]))
return tbl
# ══════════════════════════════════════════════════════════════════════════════
# SCHEDULE DATA
#
# Start: July 19, 2026
# NEET PG 2027 estimated: ~January 25, 2027
# Total: ~27 weeks (Jul 19 – Jan 18, 2027)
#
# Structure:
# PHASE 1 – First Read (Pass 1) : Weeks 1–13 (Jul 19 – Oct 17)
# PHASE 2 – Second Read (Pass 2) : Weeks 14–22 (Oct 18 – Dec 19)
# PHASE 3 – Third Read (Pass 3) : Weeks 23–25 (Dec 20 – Jan 9)
# PHASE 4 – Grand Revision : Weeks 26–27 (Jan 10 – Jan 23)
# EXAM WEEK : Jan 25 (est.)
#
# Each phase has built-in revision slots.
# Total revisions per subject = 3 (end-of-phase rapid reviews)
# ══════════════════════════════════════════════════════════════════════════════
START = date(2026, 7, 19)
EXAM = date(2027, 1, 25)
def wdate(week_offset, day_offset=0):
"""Return date string for START + week_offset weeks + day_offset days."""
d = START + timedelta(weeks=week_offset, days=day_offset)
return d.strftime("%b %d")
def wrange(w_start, w_end):
d1 = START + timedelta(weeks=w_start)
d2 = START + timedelta(weeks=w_end) - timedelta(days=1)
return f"{d1.strftime('%b %d')} – {d2.strftime('%b %d, %Y')}"
# ── Subjects with weights & phase allocations ─────────────────────────────────
# (Subject, pass1_weeks, pass2_weeks, pass3_weeks, colour_bg, colour_fg, category)
# Total weeks available per pass:
# Pass 1: 13 weeks Pass 2: 9 weeks Pass 3: 3 weeks
# High yield = more time; short subjects = less time
subjects = [
# PRECLINICAL (heavy)
("Anatomy", 1.5, 1.0, 0.5, LIGHT_BLUE, MID_BLUE, "Pre-clinical"),
("Physiology", 1.5, 1.0, 0.5, LIGHT_BLUE, MID_BLUE, "Pre-clinical"),
("Biochemistry", 1.0, 0.5, 0.25,LIGHT_BLUE, MID_BLUE, "Pre-clinical"),
# PARA-CLINICAL (heavy)
("Pathology", 1.5, 1.0, 0.5, LIGHT_PURPLE, PURPLE, "Para-clinical"),
("Microbiology", 1.0, 0.75,0.25,LIGHT_PURPLE, PURPLE, "Para-clinical"),
("Pharmacology", 1.5, 1.0, 0.5, LIGHT_PURPLE, PURPLE, "Para-clinical"),
("Forensic Medicine", 0.5, 0.5, 0.25,LIGHT_PURPLE, PURPLE, "Para-clinical"),
# COMMUNITY MEDICINE
("PSM / Comm. Medicine",1.0, 0.75,0.25,LIGHT_GREEN, GREEN, "Community"),
# CLINICAL (major)
("Medicine", 1.5, 1.0, 0.5, LIGHT_RED, RED, "Clinical"),
("Surgery", 1.0, 0.75,0.25,LIGHT_RED, RED, "Clinical"),
("OBG", 0.75,0.5, 0.25,LIGHT_RED, RED, "Clinical"),
("Pediatrics", 0.75,0.5, 0.25,LIGHT_RED, RED, "Clinical"),
("Orthopedics", 0.5, 0.5, 0.25,LIGHT_RED, RED, "Clinical"),
# CLINICAL (short/high yield)
("Ophthalmology", 0.5, 0.5, 0.25,LIGHT_ORANGE, ORANGE, "Clinical"),
("ENT", 0.5, 0.5, 0.25,LIGHT_ORANGE, ORANGE, "Clinical"),
("Dermatology", 0.5, 0.5, 0.25,LIGHT_ORANGE, ORANGE, "Clinical"),
("Psychiatry", 0.5, 0.5, 0.25,LIGHT_ORANGE, ORANGE, "Clinical"),
("Radiology", 0.25,0.25,0.0, LIGHT_TEAL, TEAL, "Clinical"),
("Anesthesia", 0.25,0.25,0.0, LIGHT_TEAL, TEAL, "Clinical"),
]
# Assign cumulative start weeks for each pass
def assign_weeks(subj_list):
p1_cursor = 0.0 # starts at week 0 (Jul 19)
p2_cursor = 13.0 # starts at week 13 (Oct 18)
p3_cursor = 22.0 # starts at week 22 (Dec 20)
result = []
for (name, w1, w2, w3, bg, fg, cat) in subj_list:
p1_start = p1_cursor
p1_end = p1_cursor + w1
p2_start = p2_cursor
p2_end = p2_cursor + w2
p3_start = p3_cursor
p3_end = p3_cursor + w3
result.append({
"name": name, "bg": bg, "fg": fg, "cat": cat,
"w1": w1, "w2": w2, "w3": w3,
"p1s": p1_start, "p1e": p1_end,
"p2s": p2_start, "p2e": p2_end,
"p3s": p3_start, "p3e": p3_end,
})
p1_cursor = p1_end
p2_cursor = p2_end
p3_cursor = p3_end
return result
sched = assign_weeks(subjects)
# ══════════════════════════════════════════════════════════════════════════════
story = []
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
leftMargin=1.8*cm, rightMargin=1.8*cm,
topMargin=1.8*cm, bottomMargin=1.8*cm,
)
# ── COVER ─────────────────────────────────────────────────────────────────────
cover = Table([[
Paragraph("NEET PG 2027", title_s),
Paragraph("1-YEAR SUBJECT-WISE STUDY PLAN", title_s),
Paragraph("Each Subject: 3 Full Reads + 3 Revisions | 4–5 Hours/Day", sub_s),
Paragraph("Start: July 19, 2026 | Target Exam: January 2027", sub_s),
]], colWidths=[W])
cover.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), DARK_BLUE),
("TOPPADDING", (0,0),(-1,-1), 20),
("BOTTOMPADDING", (0,0),(-1,-1), 20),
("LEFTPADDING", (0,0),(-1,-1), 16),
("RIGHTPADDING", (0,0),(-1,-1), 16),
]))
story.append(cover)
story.append(Spacer(1, 0.35*cm))
# ── OVERALL PLAN STRUCTURE ────────────────────────────────────────────────────
story.append(banner(" OVERALL PLAN STRUCTURE", DARK_BLUE))
story.append(Spacer(1, 0.2*cm))
phases_data = [
[Paragraph("PHASE", ch_s), Paragraph("PERIOD", ch_s), Paragraph("WEEKS", ch_s),
Paragraph("WHAT YOU DO", ch_s), Paragraph("DAILY HOURS", ch_s)],
[Paragraph("Phase 1\nFirst Read", S("ph1", fontName="Helvetica-Bold", fontSize=8.5, textColor=MID_BLUE, leading=12)),
Paragraph(f"Jul 19 – Oct 17, 2026", body_s),
Paragraph("13 weeks", bold_s),
Paragraph("Read all 19 subjects once. Draw diagrams. Make short notes. 10 MCQs per topic after each session.", body_s),
Paragraph("3 hrs study\n+ 1 hr MCQ", bold_s)],
[Paragraph("Revision 1\n(End of Phase 1)", S("rv1", fontName="Helvetica-Bold", fontSize=8.5, textColor=GREEN, leading=12)),
Paragraph("Oct 18–24, 2026", body_s),
Paragraph("1 week", bold_s),
Paragraph("Rapid flip through all subjects. Re-read short notes only. 50 MCQs/day mixed topics.", body_s),
Paragraph("4–5 hrs/day", bold_s)],
[Paragraph("Phase 2\nSecond Read", S("ph2", fontName="Helvetica-Bold", fontSize=8.5, textColor=PURPLE, leading=12)),
Paragraph("Oct 25 – Dec 19, 2026", body_s),
Paragraph("8 weeks", bold_s),
Paragraph("Read all subjects a second time (faster). Focus on high-yield + weak areas. 20 MCQs/subject-day.", body_s),
Paragraph("3 hrs study\n+ 1 hr MCQ", bold_s)],
[Paragraph("Revision 2\n(End of Phase 2)", S("rv2", fontName="Helvetica-Bold", fontSize=8.5, textColor=GREEN, leading=12)),
Paragraph("Dec 20–26, 2026", body_s),
Paragraph("1 week", bold_s),
Paragraph("Second full rapid revision. Anki cards. 100 MCQs/day. Identify final weak zones.", body_s),
Paragraph("4–5 hrs/day", bold_s)],
[Paragraph("Phase 3\nThird Read", S("ph3", fontName="Helvetica-Bold", fontSize=8.5, textColor=RED, leading=12)),
Paragraph("Dec 27 – Jan 9, 2027", body_s),
Paragraph("2 weeks", bold_s),
Paragraph("Rapid third pass — short notes + diagrams only. No new reading. 30 MCQs/subject-day.", body_s),
Paragraph("2 hrs study\n+ 2 hrs MCQ", bold_s)],
[Paragraph("Revision 3\nGrand Revision", S("rv3", fontName="Helvetica-Bold", fontSize=8.5, textColor=RED, leading=12)),
Paragraph("Jan 10–24, 2027", body_s),
Paragraph("2 weeks", bold_s),
Paragraph("Full mock tests daily (180 Qs, 3.5 hrs). Review all wrong answers. No new topics.", body_s),
Paragraph("5 hrs/day", bold_s)],
[Paragraph("EXAM\n(Est.)", S("ex", fontName="Helvetica-Bold", fontSize=8.5, textColor=WHITE, leading=12)),
Paragraph("~Jan 25, 2027", S("ed", fontName="Helvetica-Bold", fontSize=8.5, textColor=WHITE, leading=12)),
Paragraph("—", S("dash", fontName="Helvetica", fontSize=8.5, textColor=WHITE, leading=12)),
Paragraph("NEET PG 2027 / INI-CET", S("exam", fontName="Helvetica-Bold", fontSize=8.5, textColor=WHITE, leading=12)),
Paragraph("EXAM DAY", S("ed2", fontName="Helvetica-Bold", fontSize=8.5, textColor=ACCENT, leading=12))],
]
phase_tbl = Table(phases_data, colWidths=[2.8*cm, 3.5*cm, 1.8*cm, 7.1*cm, 2*cm])
phase_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), DARK_BLUE),
("BACKGROUND", (0,-1),(-1,-1), RED),
("ROWBACKGROUNDS",(0,1),(-1,-2), [LIGHT_GREY, WHITE, LIGHT_GREEN, WHITE, LIGHT_RED, LIGHT_GREEN]),
("GRID", (0,0),(-1,-1), 0.4, MED_GREY),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
("LEFTPADDING", (0,0),(-1,-1), 7),
("RIGHTPADDING", (0,0),(-1,-1), 7),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
]))
story.append(phase_tbl)
story.append(Spacer(1, 0.35*cm))
# ── DAILY TIME SCHEDULE ───────────────────────────────────────────────────────
story.append(banner(" DAILY TIME SCHEDULE (4–5 Hours/Day)", MID_BLUE))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Adapt the time slots to your routine — the structure matters more than the exact clock times.", note_s))
story.append(Spacer(1, 0.15*cm))
daily = [
("TIME SLOT", "SESSION", "ACTIVITY", DARK_BLUE, WHITE),
("Morning\n(any 2 hrs)", "STUDY BLOCK 1", "Read new topic (textbook/notes). Draw 1 diagram. Write 5 key points.", LIGHT_BLUE, DARK_BLUE),
("After Block 1\n(20 min)", "MINI REVISION 1","Re-draw diagram from memory. Answer 10 MCQs on that topic.", LIGHT_GREEN, GREEN),
("Break\n(30 min)", "Rest / Meal", "Meal, water, short walk. No study material.", LIGHT_GREY, BLACK),
("Afternoon\n(1.5 hrs)", "STUDY BLOCK 2", "Continue topic or start next sub-topic. Make Anki flashcards.", LIGHT_BLUE, DARK_BLUE),
("After Block 2\n(20 min)","MINI REVISION 2","Active recall: close book, write key points. 10 MCQs.", LIGHT_GREEN, GREEN),
("Evening\n(45 min)", "MCQ PRACTICE", "Solve 20–30 PYQ MCQs (mixed subjects). Note wrong answers.", LIGHT_PURPLE, PURPLE),
("Night\n(10 min)", "Day Wrap-Up", "Write tomorrow's study target. Review Anki cards due today.", LIGHT_ORANGE, ORANGE),
]
day_rows = []
for row in daily:
time_, sess, act, bg, fg = row
if time_ == "TIME SLOT":
day_rows.append([Paragraph(time_, ch_s), Paragraph(sess, ch_s), Paragraph(act, ch_s)])
else:
day_rows.append([
Paragraph(f"<b>{time_}</b>", S("dt", fontName="Helvetica-Bold", fontSize=8, textColor=DARK_BLUE, leading=11)),
Paragraph(f"<b>{sess}</b>", S("ds", fontName="Helvetica-Bold", fontSize=8, textColor=fg, leading=11)),
Paragraph(act, small_s),
])
day_tbl = Table(day_rows, colWidths=[3*cm, 3.5*cm, 10.7*cm])
row_bgs_day = []
for i, row in enumerate(daily[1:], 1):
row_bgs_day.append(("BACKGROUND", (0,i),(-1,i), row[3]))
day_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), DARK_BLUE),
("GRID", (0,0),(-1,-1), 0.4, MED_GREY),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 7),
("RIGHTPADDING", (0,0),(-1,-1), 7),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
] + row_bgs_day))
story.append(day_tbl)
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Total: ~4 hrs study + 30 min MCQ practice = 4.5 hrs/day | Sunday = weekly review (revise weak topics + 50 MCQs)",
note_s))
story.append(Spacer(1, 0.3*cm))
story.append(PageBreak())
# ── PHASE 1 SUBJECT-WISE TABLE ────────────────────────────────────────────────
story.append(banner(" PHASE 1 — FIRST READ (Jul 19 – Oct 17, 2026) | 13 Weeks", DARK_BLUE))
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph(
"Read each subject for the FIRST time. Goal: understand, not memorize. Make short notes. Solve 10 MCQs after each topic.",
note_s))
story.append(Spacer(1, 0.2*cm))
p1_hdr = [Paragraph(h, ch_s) for h in ["#", "SUBJECT", "CATEGORY", "WEEKS", "DATES (2026)", "DAILY FOCUS"]]
p1_rows = [p1_hdr]
phase1_focus = {
"Anatomy": "Gross: draw diagrams. Neuro: tract/syndromes. Embryology. Histology cells.",
"Physiology": "Systems approach. CVS, Resp, Neuro, Endocrine. Normal values table.",
"Biochemistry": "Metabolic pathways (glycolysis, TCA). Enzymes. Vitamins. Genetics basics.",
"Pathology": "General pathology first (cell injury, inflammation). Then systemic.",
"Microbiology": "Bacteriology (high yield organisms). Virology. Immunology.",
"Pharmacology": "Drug classes, MOA, side effects. Autonomic NS first.",
"Forensic Medicine": "Cause/manner of death. Wounds. Toxicology basics. Legal aspects.",
"PSM / Comm. Medicine":"Epidemiology basics. Disease indices. National health programs.",
"Medicine": "CVS, Resp, GI, Neuro high-yield. ECG basics. Clinical scenarios.",
"Surgery": "Surgical anatomy. GI surgery. Hernias. Trauma basics.",
"OBG": "Normal obstetrics. Antenatal care. Gynaecology overview.",
"Pediatrics": "Growth/development milestones. Neonatal emergencies. Vaccines.",
"Orthopedics": "Fractures (upper + lower limb). Spine. Congenital anomalies.",
"Ophthalmology": "Anatomy of eye. Common eye diseases. Refractive errors.",
"ENT": "Ear anatomy. Hearing loss. Throat. Nasal disorders.",
"Dermatology": "Skin lesion morphology. Common disorders. Drugs in derm.",
"Psychiatry": "DSM classification. Schizophrenia, mood disorders, anxiety.",
"Radiology": "X-ray basics. CT/MRI signs. High-yield findings.",
"Anesthesia": "Pre-operative assessment. Drugs. Complications.",
}
cat_cols = {"Pre-clinical": LIGHT_BLUE, "Para-clinical": LIGHT_PURPLE,
"Community": LIGHT_GREEN, "Clinical": LIGHT_RED}
cat_fg = {"Pre-clinical": MID_BLUE, "Para-clinical": PURPLE,
"Community": GREEN, "Clinical": RED}
for i, s in enumerate(sched):
d1 = START + timedelta(weeks=s["p1s"])
d2 = START + timedelta(weeks=s["p1e"]) - timedelta(days=1)
weeks_str = f"{s['w1']:.1f} wks" if s['w1'] >= 0.5 else "3–4 days"
row = [
Paragraph(f"<b>{i+1}</b>", num_s),
Paragraph(f"<b>{s['name']}</b>", bold_s),
Paragraph(s["cat"], S("cat", fontName="Helvetica", fontSize=7.5, textColor=cat_fg.get(s["cat"], BLACK), leading=10)),
Paragraph(weeks_str, S("wk", fontName="Helvetica-Bold", fontSize=8, textColor=DARK_BLUE, alignment=TA_CENTER, leading=11)),
Paragraph(f"{d1.strftime('%b %d')} –\n{d2.strftime('%b %d')}", small_s),
Paragraph(phase1_focus.get(s["name"], ""), small_s),
]
p1_rows.append(row)
p1_tbl = Table(p1_rows, colWidths=[0.7*cm, 3.2*cm, 2.2*cm, 1.6*cm, 2.2*cm, 7.3*cm])
p1_row_bgs = []
for i, s in enumerate(sched, 1):
bg = cat_cols.get(s["cat"], LIGHT_GREY)
p1_row_bgs.append(("BACKGROUND", (0,i),(-1,i), bg if i%2==1 else WHITE))
p1_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), DARK_BLUE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_GREY, WHITE]),
("GRID", (0,0),(-1,-1), 0.4, MED_GREY),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 5),
("RIGHTPADDING", (0,0),(-1,-1), 5),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
] + p1_row_bgs))
story.append(p1_tbl)
story.append(Spacer(1, 0.2*cm))
# Revision 1 box
rev1 = Table([[Paragraph(
"<b>REVISION 1 | Oct 18–24, 2026 (1 week)</b> — Flip through short notes of all subjects. "
"Do NOT re-read full text. Solve 50 mixed MCQs/day. Mark your top 5 weak subjects.",
S("r1", fontName="Helvetica", fontSize=8.5, textColor=GREEN, leading=12)
)]], colWidths=[W])
rev1.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), LIGHT_GREEN),
("TOPPADDING",(0,0),(-1,-1),8),("BOTTOMPADDING",(0,0),(-1,-1),8),
("LEFTPADDING",(0,0),(-1,-1),10),("RIGHTPADDING",(0,0),(-1,-1),10),
("BOX",(0,0),(-1,-1),1.5, GREEN),
]))
story.append(rev1)
story.append(Spacer(1, 0.3*cm))
story.append(PageBreak())
# ── PHASE 2 SUBJECT-WISE TABLE ────────────────────────────────────────────────
story.append(banner(" PHASE 2 — SECOND READ (Oct 25 – Dec 19, 2026) | 8 Weeks", MID_BLUE))
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph(
"Second pass — faster. Focus on HIGH-YIELD topics and your marked weak areas. Solve 20 MCQs per subject-day.",
note_s))
story.append(Spacer(1, 0.2*cm))
p2_hdr = [Paragraph(h, ch_s) for h in ["#", "SUBJECT", "WEEKS", "DATES", "HIGH-YIELD FOCUS FOR PASS 2"]]
p2_rows = [p2_hdr]
phase2_focus = {
"Anatomy": "Internal capsule, brachial plexus, embryology arches/pouches, spinal cord syndromes",
"Physiology": "CVS physiology, spirometry, GFR, hormones — memorise normal values",
"Biochemistry": "Enzyme disorders, vitamin deficiencies, PCR/blot techniques, HbA1c",
"Pathology": "Tumour markers, granulomas, amyloid, renal pathology, haematology",
"Microbiology": "Culture media, special stains, TORCH, hepatitis serology, HIV",
"Pharmacology": "Drug interactions, contraindications, anti-TB, anti-malarials, anaesthetics",
"Forensic Medicine": "Rigor mortis, postmortem lividity, sexual offences, poisons (organophosphate)",
"PSM / Comm. Medicine":"Vaccines (schedule+cold chain), screening tests, vital statistics, nutrition",
"Medicine": "Murmurs, CXR patterns, liver disease, renal failure, electrolytes, ECG arrhythmias",
"Surgery": "GI bleed, pancreatitis, thyroid surgery, breast Ca, trauma ATLS",
"OBG": "Hypertension in pregnancy, APH/PPH, PCOS, Ca cervix screening",
"Pediatrics": "Congenital heart disease, neonatal jaundice, fever management, nutrition",
"Orthopedics": "Compartment syndrome, osteomyelitis, joint replacement, spine injuries",
"Ophthalmology": "Glaucoma, cataract, retinal detachment, diabetic retinopathy",
"ENT": "CSOM vs CSOM, cholesteatoma, vocal cord palsy, neck masses",
"Dermatology": "Pemphigus vs pemphigoid, SLE rash, scabies, leprosy, drug rashes",
"Psychiatry": "ECT, drug doses, ICD-11 criteria, suicide risk, substance use disorders",
"Radiology": "Classic X-ray signs (sail sign, double bubble, snowstorm), CT head",
"Anesthesia": "Spinal vs epidural, malignant hyperthermia, TIVA, pain management",
}
for i, s in enumerate(sched):
d1 = START + timedelta(weeks=s["p2s"])
d2 = START + timedelta(weeks=s["p2e"]) - timedelta(days=1)
weeks_str = f"{s['w2']:.2g} wks" if s['w2'] >= 0.5 else "3–4 days"
row = [
Paragraph(f"<b>{i+1}</b>", num_s),
Paragraph(f"<b>{s['name']}</b>", bold_s),
Paragraph(weeks_str, S("wk2", fontName="Helvetica-Bold", fontSize=8, textColor=PURPLE, alignment=TA_CENTER, leading=11)),
Paragraph(f"{d1.strftime('%b %d')} –\n{d2.strftime('%b %d')}", small_s),
Paragraph(phase2_focus.get(s["name"], ""), small_s),
]
p2_rows.append(row)
p2_tbl = Table(p2_rows, colWidths=[0.7*cm, 3.2*cm, 1.8*cm, 2.2*cm, 9.3*cm])
p2_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), MID_BLUE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_PURPLE, WHITE]),
("GRID", (0,0),(-1,-1), 0.4, MED_GREY),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 5),
("RIGHTPADDING", (0,0),(-1,-1), 5),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
]))
story.append(p2_tbl)
story.append(Spacer(1, 0.2*cm))
rev2 = Table([[Paragraph(
"<b>REVISION 2 | Dec 20–26, 2026 (1 week)</b> — Second rapid revision using short notes + Anki. "
"Solve 100 MCQs/day. Attempt 1 full mock test (180 Qs). Finalize your top 3 weak subjects.",
S("r2", fontName="Helvetica", fontSize=8.5, textColor=GREEN, leading=12)
)]], colWidths=[W])
rev2.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), LIGHT_GREEN),
("TOPPADDING",(0,0),(-1,-1),8),("BOTTOMPADDING",(0,0),(-1,-1),8),
("LEFTPADDING",(0,0),(-1,-1),10),("RIGHTPADDING",(0,0),(-1,-1),10),
("BOX",(0,0),(-1,-1),1.5, GREEN),
]))
story.append(rev2)
story.append(Spacer(1, 0.3*cm))
story.append(PageBreak())
# ── PHASE 3 ───────────────────────────────────────────────────────────────────
story.append(banner(" PHASE 3 — THIRD READ (Dec 27, 2026 – Jan 9, 2027) | 2 Weeks", RED))
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph(
"Rapid third pass — short notes, diagrams, and one-liners ONLY. No new reading. 30 MCQs per subject-day.",
note_s))
story.append(Spacer(1, 0.2*cm))
p3_hdr = [Paragraph(h, ch_s) for h in ["#", "SUBJECT", "DAYS", "DATES", "WHAT TO COVER IN PASS 3"]]
p3_rows = [p3_hdr]
phase3_focus = {
"Anatomy": "Diagrams only: brachial plexus, Circle of Willis, cord syndromes, embryology mnemonics",
"Physiology": "Normal values table, graph-based concepts, hormonal axes",
"Biochemistry": "Pathway summaries, vitamin deficiency table, enzyme disease table",
"Pathology": "Morphology one-liners, tumour markers, special stains",
"Microbiology": "Culture media table, serology patterns, vaccine types",
"Pharmacology": "Drug class + prototype + key ADR table",
"Forensic Medicine": "Time since death signs table, toxins table",
"PSM / Comm. Medicine":"Vaccine schedule poster, disease indices, program dates",
"Medicine": "ECG criteria, murmur table, drug treatment summary",
"Surgery": "Operative steps and complications one-liners",
"OBG": "Bishop score, Partogram, drug doses in obstetrics",
"Pediatrics": "Milestone table, vaccine schedule, neonatal emergencies",
"Orthopedics": "Fracture types + complications + management table",
"Ophthalmology": "IOP values, drug mnemonics, fundus findings",
"ENT": "Hearing loss types, tuning fork tests summary",
"Dermatology": "Lesion type + disease table, drug reactions",
"Psychiatry": "Diagnostic criteria one-liners, drug doses",
"Radiology": "Classic X-ray/CT signs list",
"Anesthesia": "Drug doses, stages of anaesthesia, complications",
}
p3_start_week = 23.0
# Group subjects into 2-week blocks based on p3 weeks
for i, s in enumerate(sched):
d1 = START + timedelta(weeks=s["p3s"])
d2 = START + timedelta(weeks=s["p3e"]) - timedelta(days=1)
if s["w3"] > 0:
days = int(s["w3"] * 7)
days_str = f"{days}d"
else:
days_str = "1–2 days"
d2 = d1 + timedelta(days=2)
row = [
Paragraph(f"<b>{i+1}</b>", num_s),
Paragraph(f"<b>{s['name']}</b>", bold_s),
Paragraph(days_str, S("d3", fontName="Helvetica-Bold", fontSize=8, textColor=RED, alignment=TA_CENTER, leading=11)),
Paragraph(f"{d1.strftime('%b %d')} –\n{d2.strftime('%b %d')}", small_s),
Paragraph(phase3_focus.get(s["name"], ""), small_s),
]
p3_rows.append(row)
p3_tbl = Table(p3_rows, colWidths=[0.7*cm, 3.2*cm, 1.5*cm, 2.2*cm, 9.6*cm])
p3_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), RED),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_RED, WHITE]),
("GRID", (0,0),(-1,-1), 0.4, MED_GREY),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 5),
("RIGHTPADDING", (0,0),(-1,-1), 5),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
]))
story.append(p3_tbl)
story.append(Spacer(1, 0.2*cm))
rev3 = Table([[Paragraph(
"<b>REVISION 3 / GRAND REVISION | Jan 10–24, 2027 (2 weeks)</b> — "
"Full mock tests EVERY DAY (180 Qs, 3.5 hrs). Review all wrong answers the same day. "
"No new topics. Sleep minimum 7 hours. Reach the exam centre 1 hour early.",
S("r3", fontName="Helvetica", fontSize=8.5, textColor=RED, leading=12)
)]], colWidths=[W])
rev3.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), LIGHT_RED),
("TOPPADDING",(0,0),(-1,-1),8),("BOTTOMPADDING",(0,0),(-1,-1),8),
("LEFTPADDING",(0,0),(-1,-1),10),("RIGHTPADDING",(0,0),(-1,-1),10),
("BOX",(0,0),(-1,-1),1.5, RED),
]))
story.append(rev3)
story.append(Spacer(1, 0.35*cm))
story.append(PageBreak())
# ── MONTHLY MILESTONE CALENDAR ────────────────────────────────────────────────
story.append(banner(" MONTHLY MILESTONES", DARK_BLUE))
story.append(Spacer(1, 0.2*cm))
milestones = [
("July 19–31\n2026", "Start", "Anatomy + Physiology (Pass 1 begins). Set up Anki deck. Solve 10 MCQs/day.", LIGHT_BLUE),
("August\n2026", "Pass 1", "Biochemistry + Pathology + Microbiology. Total MCQs this month: 300+.", LIGHT_BLUE),
("September\n2026", "Pass 1", "Pharmacology + Forensic + PSM + Medicine (Pass 1). Mid-month: first mock test.", LIGHT_BLUE),
("October\n2026", "Pass 1 → Rev1","Surgery + OBG + Peds + Ortho + short subjects. Oct 18–24: Revision 1 week.", LIGHT_GREEN),
("November\n2026", "Pass 2", "Pass 2 begins Oct 25. Heavy subjects (Anatomy → Medicine). 20 MCQs/subject-day.", LIGHT_PURPLE),
("December\n2026", "Pass 2 → Rev2","Complete Pass 2. Dec 20–26: Revision 2 week + first 100-Q mock daily.", LIGHT_GREEN),
("Dec 27 –\nJan 9, 2027","Pass 3", "Rapid third pass — short notes + diagrams only. 30 MCQs/subject-day.", LIGHT_RED),
("Jan 10–24\n2027", "Rev 3", "Grand revision: full mock every day. Review only wrong answers. No new topics.", LIGHT_RED),
("~Jan 25\n2027", "EXAM", "NEET PG 2027 / INI-CET. Rest well the night before. Trust your preparation.", colors.HexColor("#FFF3CD")),
]
ms_hdr = [Paragraph(h, ch_s) for h in ["PERIOD", "PHASE", "TARGETS", ""]]
ms_rows = [ms_hdr]
for period, phase, target, bg in milestones:
ms_rows.append([
Paragraph(f"<b>{period}</b>", bold_s),
Paragraph(f"<b>{phase}</b>", S("msp", fontName="Helvetica-Bold", fontSize=8, textColor=DARK_BLUE, leading=11)),
Paragraph(target, small_s),
Paragraph("", body_s),
])
ms_tbl = Table(ms_rows, colWidths=[2.5*cm, 2.2*cm, 12.5*cm, 0*cm])
ms_row_bgs = [("BACKGROUND",(0,i+1),(-1,i+1), milestones[i][3]) for i in range(len(milestones))]
ms_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), DARK_BLUE),
("GRID", (0,0),(-1,-1), 0.4, MED_GREY),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 7),
("RIGHTPADDING", (0,0),(-1,-1), 7),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
] + ms_row_bgs))
story.append(ms_tbl)
story.append(Spacer(1, 0.35*cm))
# ── SUBJECT PRIORITY + HIGH YIELD ────────────────────────────────────────────
story.append(banner(" SUBJECT PRIORITY & MARKS WEIGHTAGE (NEET PG)", DARK_BLUE))
story.append(Spacer(1, 0.2*cm))
priority_data = [
[Paragraph(h, ch_s) for h in ["PRIORITY", "SUBJECT", "EST. Qs", "WHY HIGH YIELD"]],
[Paragraph("★★★★★", S("st5", fontName="Helvetica-Bold", fontSize=9, textColor=ACCENT, leading=12)),
Paragraph("Medicine", bold_s), Paragraph("30–35", body_s),
Paragraph("Largest clinical subject. Single biggest scoring area.", body_s)],
[Paragraph("★★★★★", S("st5b", fontName="Helvetica-Bold", fontSize=9, textColor=ACCENT, leading=12)),
Paragraph("Pharmacology", bold_s), Paragraph("25–30", body_s),
Paragraph("High yield across all subjects. Drug knowledge tested in every specialty.", body_s)],
[Paragraph("★★★★", S("st4a", fontName="Helvetica-Bold", fontSize=9, textColor=MID_BLUE, leading=12)),
Paragraph("Pathology", bold_s), Paragraph("20–25", body_s),
Paragraph("Foundation for clinical diagnosis. High number of image-based Qs.", body_s)],
[Paragraph("★★★★", S("st4b", fontName="Helvetica-Bold", fontSize=9, textColor=MID_BLUE, leading=12)),
Paragraph("Surgery", bold_s), Paragraph("20–25", body_s),
Paragraph("Surgical anatomy + emergency management heavily tested.", body_s)],
[Paragraph("★★★★", S("st4c", fontName="Helvetica-Bold", fontSize=9, textColor=MID_BLUE, leading=12)),
Paragraph("OBG", bold_s), Paragraph("15–20", body_s),
Paragraph("Normal obstetrics + obstetric emergencies = guaranteed questions.", body_s)],
[Paragraph("★★★", S("st3a", fontName="Helvetica-Bold", fontSize=9, textColor=GREEN, leading=12)),
Paragraph("Anatomy / Physiology / Biochemistry / Microbiology / PSM / Pediatrics", bold_s),
Paragraph("10–15 each", body_s),
Paragraph("Moderate but consistent. Strong base improves all clinical subjects.", body_s)],
[Paragraph("★★", S("st2", fontName="Helvetica-Bold", fontSize=9, textColor=MED_GREY, leading=12)),
Paragraph("ENT / Ophthalmology / Derm / Psychiatry / Ortho / Forensic / Radio / Anaesthesia", bold_s),
Paragraph("5–10 each", body_s),
Paragraph("Short subjects — high ROI if studied well in Pass 2 and 3.", body_s)],
]
pri_tbl = Table(priority_data, colWidths=[2.5*cm, 5.5*cm, 1.8*cm, 7.4*cm])
pri_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), DARK_BLUE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_ORANGE, WHITE, LIGHT_BLUE, LIGHT_BLUE, LIGHT_RED, LIGHT_GREY, LIGHT_GREY]),
("GRID", (0,0),(-1,-1), 0.4, MED_GREY),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 6),
("RIGHTPADDING", (0,0),(-1,-1), 6),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
]))
story.append(pri_tbl)
story.append(Spacer(1, 0.35*cm))
# ── GOLDEN RULES ──────────────────────────────────────────────────────────────
story.append(banner(" 10 RULES FOR 4–5 HRS/DAY PREPARATION", ACCENT))
story.append(Spacer(1, 0.15*cm))
rules = [
"Never study more than 2.5 hours without a break — quality over quantity.",
"Solve at least 20 MCQs every single day, even on low-energy days.",
"Make short notes in a pocket diary — during revision, read ONLY those notes.",
"Anki flashcards every evening for 15 minutes beats weekend cramming.",
"Sunday = weak-topic day. Identify your 3 weakest subjects each week and attack them.",
"After each phase, mark every topic as: Strong / OK / Weak — then prioritize the Weak list.",
"Never skip a revision week — the 3 revision windows are what make it stick long-term.",
"Full mock tests must start by December. Exam stamina is a separate skill to build.",
"Sleep 7 hours minimum — memory consolidation happens only during sleep.",
"On exam day: attempt high-confidence questions first, flag the doubtful ones, review at the end.",
]
rule_rows = [[
Paragraph(f"<b>{i+1}.</b>", S("rn2", fontName="Helvetica-Bold", fontSize=9, textColor=ACCENT, alignment=TA_CENTER, leading=13)),
Paragraph(rule, S("rb2", fontName="Helvetica", fontSize=8.5, textColor=BLACK, leading=13)),
] for i, rule in enumerate(rules)]
rule_tbl = Table(rule_rows, colWidths=[0.9*cm, 16.3*cm])
rule_tbl.setStyle(TableStyle([
("ROWBACKGROUNDS",(0,0),(-1,-1),[colors.HexColor("#FFF8E1"), WHITE]),
("LINEBELOW",(0,0),(-1,-1),0.3, MED_GREY),
("TOPPADDING",(0,0),(-1,-1),5),("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),5),("RIGHTPADDING",(0,0),(-1,-1),8),
("VALIGN",(0,0),(-1,-1),"MIDDLE"),
]))
story.append(rule_tbl)
story.append(Spacer(1, 0.4*cm))
# ── FOOTER ────────────────────────────────────────────────────────────────────
story.append(HRFlowable(width=W, thickness=1, color=MED_GREY))
story.append(Spacer(1, 0.12*cm))
story.append(Paragraph(
"NEET PG 2027 | 1-Year Subject-Wise Plan | 4–5 hrs/day | 3 Reads + 3 Revisions per Subject | Generated July 12, 2026",
foot_s))
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /home/daytona/workspace/neet-pg-schedule && python create_1year_schedule.py
~/neet-pg-schedule/create_1year_schedule.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/neet-pg-schedule/create_1year_schedule.py'
cd /home/daytona/workspace/neet-pg-schedule && python create_1year_schedule.py
NEET PG 2027 1Year Plan
PDF Document · PDF