Answer the following questions for psm mbbs exam
cd /tmp/workspace/attachments/76deeef0-3cf3-4e72-8788-7e0acd3f3282 && python3 -c " import pdfplumber with pdfplumber.open('PSM 2 short cases .pdf') as pdf: print(f'Total pages: {len(pdf.pages)}') for i, page in enumerate(pdf.pages[:5]): print(f'--- Page {i+1} ---') print(page.extract_text()) print() "
| Category | Factors |
|---|---|
| Genetic | Family history; certain gene variants affecting fat metabolism |
| Dietary factors | High caloric intake, high fat diet, excess refined carbohydrates, sugar-sweetened beverages |
| Physical inactivity | Sedentary occupation (as in this case), desk jobs, low leisure physical activity |
| Socioeconomic | Higher income in developing countries; lower income in developed nations; urbanization |
| Age | Increases with age; especially post-menopausal women (LPL activity shifts) |
| Sex | Women more prone post-menopause (premenopausal women have more gluteal/femoral fat) |
| Hormonal | Hypothyroidism, Cushing's syndrome, PCOS |
| Psychological | Stress eating, binge eating disorder |
| Gut microbiome | Dysbiosis associated with increased energy extraction |
| Medications | Corticosteroids, antipsychotics, insulin |
| Classification | BMI (kg/m²) | Risk of Comorbidities |
|---|---|---|
| Underweight | < 18.50 | Low (other risks increased) |
| Normal range | 18.50 - 24.99 | Average |
| Pre-obese (Overweight) | 25.00 - 29.99 | Increased |
| Obese Class I | 30.00 - 34.99 | Moderate |
| Obese Class II | 35.00 - 39.99 | Severe |
| Obese Class III (Morbid) | ≥ 40.00 | Very severe |
| Type | Weight for Age | Edema |
|---|---|---|
| Underweight | 60-80% | Absent |
| Kwashiorkor | 60-80% | Present |
| Marasmus | < 60% | Absent |
| Marasmic-Kwashiorkor | < 60% | Present |
| Grade | Weight for Age |
|---|---|
| Grade I (mild) | 75-90% |
| Grade II (moderate) | 60-74% |
| Grade III (severe) | < 60% |
| Grade | Weight for Age |
|---|---|
| Grade I | 71-80% |
| Grade II | 61-70% |
| Grade III | 51-60% |
| Grade IV | < 50% |
| Feature | Kwashiorkor | Marasmus |
|---|---|---|
| Cause | Predominantly protein deficiency (low P:E ratio) | Deficiency of both protein AND calories |
| Age | 1-3 years (weaning age) | <1 year (infancy) |
| Onset | Relatively sudden | Gradual |
| Edema | Present (hallmark) - bilateral pitting | Absent |
| Wasting | Present but masked by edema | Severe, marked |
| Subcutaneous fat | Preserved | Markedly reduced ("skin and bones") |
| Face | Moon face | Monkey/old man face |
| Skin | Dermatosis - flaky paint, pigmentation, depigmentation | Loose, wrinkled, dry |
| Hair | Depigmented (flag sign), sparse, easily plucked | Sparse, thin |
| Liver | Enlarged (fatty liver) | Normal or small |
| Appetite | Poor | Hungry, good appetite |
| Serum albumin | Markedly low (hypoalbuminemia) | Low but less markedly |
| Mood | Irritable, apathetic | Alert but miserable |
| Serum proteins | Markedly decreased | Less decreased |
| Stage | Classification |
|---|---|
| XN | Night blindness |
| X1A | Conjunctival xerosis |
| X1B | Bitot's spots with conjunctival xerosis |
| X2 | Corneal xerosis |
| X3A | Corneal ulceration/keratomalacia (<1/3 corneal surface) |
| X3B | Corneal ulceration/keratomalacia (≥1/3 corneal surface) |
| XS | Corneal scar |
| XF | Xerophthalmic fundus |
| Group | Hb Cut-off |
|---|---|
| Adult men | < 13 g/dL |
| Non-pregnant women | < 12 g/dL |
| Pregnant women | < 11 g/dL |
| Children 6-59 months | < 11 g/dL |
| Children 5-11 years | < 11.5 g/dL |
| Children 12-14 years | < 12 g/dL |
| Grade | Hb (g/dL) |
|---|---|
| Mild | 10-10.9 (non-pregnant); 10-10.9 |
| Moderate | 7-9.9 |
| Severe | < 7 |
| Very severe | < 4 |
Create a summary PDF with exam-focused tables for quick revision
ls -la /tmp/workspace/ 2>/dev/null || echo "workspace empty or missing"
mkdir -p /tmp/workspace/psm-revision && python3 -c "from reportlab.lib import colors; print('reportlab OK')"
~/psm-revision/generate_pdf.py
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.flowables import HRFlowable
OUTPUT = "/tmp/workspace/psm-revision/PSM_Short_Cases_Revision.pdf"
# ── Colour palette ────────────────────────────────────────────────
C_DEEP_BLUE = colors.HexColor("#1A3A5C")
C_MID_BLUE = colors.HexColor("#2563A8")
C_LIGHT_BLUE = colors.HexColor("#D6E4F0")
C_TEAL = colors.HexColor("#0B7A75")
C_TEAL_LIGHT = colors.HexColor("#D0EFED")
C_ORANGE = colors.HexColor("#E07B39")
C_ORANGE_LIGHT= colors.HexColor("#FDEBD0")
C_GREEN = colors.HexColor("#1E7A1E")
C_GREEN_LIGHT = colors.HexColor("#D5F0D5")
C_RED = colors.HexColor("#C0392B")
C_RED_LIGHT = colors.HexColor("#FADBD8")
C_PURPLE = colors.HexColor("#6C3483")
C_PURPLE_LIGHT= colors.HexColor("#E8DAEF")
C_YELLOW_LIGHT= colors.HexColor("#FEF9E7")
C_GRAY_LIGHT = colors.HexColor("#F5F5F5")
C_GRAY_MED = colors.HexColor("#CCCCCC")
C_BLACK = colors.black
C_WHITE = colors.white
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
topMargin=1.8*cm,
bottomMargin=1.8*cm,
leftMargin=1.5*cm,
rightMargin=1.5*cm,
)
W = A4[0] - 3.0*cm # usable width
styles = getSampleStyleSheet()
# ── Custom styles ─────────────────────────────────────────────────
def make_style(name, parent="Normal", **kw):
return ParagraphStyle(name, parent=styles[parent], **kw)
S_COVER_TITLE = make_style("CoverTitle",
fontSize=26, fontName="Helvetica-Bold",
textColor=C_WHITE, alignment=TA_CENTER, spaceAfter=8)
S_COVER_SUB = make_style("CoverSub",
fontSize=13, fontName="Helvetica",
textColor=C_LIGHT_BLUE, alignment=TA_CENTER, spaceAfter=4)
S_CASE_HEADER = make_style("CaseHdr",
fontSize=13, fontName="Helvetica-Bold",
textColor=C_WHITE, alignment=TA_LEFT, spaceAfter=0, leading=17)
S_SECTION_HDR = make_style("SecHdr",
fontSize=10.5, fontName="Helvetica-Bold",
textColor=C_DEEP_BLUE, spaceBefore=6, spaceAfter=3)
S_BODY = make_style("Body",
fontSize=9, fontName="Helvetica",
textColor=C_BLACK, leading=13, spaceAfter=3)
S_BODY_BOLD = make_style("BodyBold",
fontSize=9, fontName="Helvetica-Bold",
textColor=C_BLACK, leading=13, spaceAfter=3)
S_KEY = make_style("Key",
fontSize=8.5, fontName="Helvetica-Bold",
textColor=C_RED, leading=12)
S_NOTE = make_style("Note",
fontSize=8.5, fontName="Helvetica-Oblique",
textColor=C_TEAL, leading=12, spaceAfter=4)
S_FOOTER = make_style("Footer",
fontSize=7.5, fontName="Helvetica",
textColor=colors.grey, alignment=TA_CENTER)
S_TBL_HDR = make_style("TblHdr",
fontSize=8.5, fontName="Helvetica-Bold",
textColor=C_WHITE, alignment=TA_CENTER, leading=11)
S_TBL_CELL = make_style("TblCell",
fontSize=8.3, fontName="Helvetica",
textColor=C_BLACK, leading=11)
S_TBL_CELL_B = make_style("TblCellB",
fontSize=8.3, fontName="Helvetica-Bold",
textColor=C_BLACK, leading=11)
S_TBL_CELL_RED= make_style("TblCellRed",
fontSize=8.3, fontName="Helvetica-Bold",
textColor=C_RED, leading=11)
# ── Helper functions ──────────────────────────────────────────────
def case_banner(num, title, subtitle, bg_color):
"""Returns a Table acting as a coloured case header banner."""
inner = Table([
[Paragraph(f"CASE {num} | {title}", S_CASE_HEADER)],
[Paragraph(subtitle, make_style(f"CS{num}",
fontSize=8.5, fontName="Helvetica-Oblique",
textColor=C_LIGHT_BLUE, leading=11))],
], colWidths=[W])
inner.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg_color),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("TOPPADDING", (0,0), (0,0), 8),
("BOTTOMPADDING",(0,-1),(-1,-1), 8),
("ROUNDEDCORNERS", [6]),
]))
return inner
def section_label(text, color=C_DEEP_BLUE):
bar = Table([[Paragraph(text, make_style("SL",
fontSize=9.5, fontName="Helvetica-Bold",
textColor=C_WHITE, leading=12))]],
colWidths=[W])
bar.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), color),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 8),
]))
return bar
def make_table(headers, rows, col_widths, hdr_color=C_DEEP_BLUE, alt=True):
header_row = [Paragraph(h, S_TBL_HDR) for h in headers]
table_data = [header_row]
for r in rows:
table_data.append([Paragraph(str(c), S_TBL_CELL) if not str(c).startswith("**")
else Paragraph(str(c)[2:-2], S_TBL_CELL_B) for c in r])
t = Table(table_data, colWidths=col_widths, repeatRows=1)
style = [
("BACKGROUND", (0,0), (-1,0), hdr_color),
("TEXTCOLOR", (0,0), (-1,0), C_WHITE),
("GRID", (0,0), (-1,-1), 0.4, C_GRAY_MED),
("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"),
]
if alt:
for i in range(1, len(table_data)):
if i % 2 == 0:
style.append(("BACKGROUND", (0,i), (-1,i), C_GRAY_LIGHT))
t.setStyle(TableStyle(style))
return t
def highlight_box(text, bg=C_YELLOW_LIGHT, border=C_ORANGE):
t = Table([[Paragraph(text, S_BODY)]], colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("BOX", (0,0),(-1,-1), 1, border),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING",(0,0),(-1,-1), 6),
("LEFTPADDING", (0,0),(-1,-1), 10),
]))
return t
def mnemonic_box(mnemonic, meaning):
rows = [[Paragraph(f"<b>{m.strip()}</b>", S_TBL_CELL_B),
Paragraph(meaning[i].strip(), S_TBL_CELL)]
for i, m in enumerate(mnemonic)]
t = Table(rows, colWidths=[1.5*cm, W-1.5*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), C_YELLOW_LIGHT),
("GRID", (0,0),(-1,-1), 0.3, C_GRAY_MED),
("TOPPADDING", (0,0),(-1,-1), 3),
("BOTTOMPADDING",(0,0),(-1,-1), 3),
("LEFTPADDING", (0,0),(-1,-1), 5),
]))
return t
def sp(n=1): return Spacer(1, n*mm)
# ══════════════════════════════════════════════════════════════════
# BUILD CONTENT
# ══════════════════════════════════════════════════════════════════
story = []
# ── COVER PAGE ────────────────────────────────────────────────────
cover = Table([[
Paragraph("PSM SHORT CASES", S_COVER_TITLE),
Paragraph("Exam-Focused Quick Revision Summary", S_COVER_SUB),
Paragraph("MBBS Final Year | Preventive & Social Medicine", S_COVER_SUB),
Paragraph("Based on Park's Textbook of PSM (24th Ed.)", make_style("CV3",
fontSize=10, fontName="Helvetica-Oblique",
textColor=colors.HexColor("#A9CCE3"), alignment=TA_CENTER)),
Spacer(1, 6*mm),
Paragraph("Cases Covered:", make_style("CV4", fontSize=11,
fontName="Helvetica-Bold", textColor=C_ORANGE, alignment=TA_CENTER)),
Paragraph(
"1. Obesity • 2. Protein-Energy Malnutrition (PEM)"
" • 3. Vitamin A Deficiency<br/>"
"4. Nutritional Anaemia / IDA • 5. Endemic Fluorosis",
make_style("CV5", fontSize=10, fontName="Helvetica",
textColor=C_LIGHT_BLUE, alignment=TA_CENTER, leading=16)),
]], colWidths=[W])
cover.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), C_DEEP_BLUE),
("TOPPADDING", (0,0),(-1,-1), 28),
("BOTTOMPADDING",(0,0),(-1,-1), 28),
("LEFTPADDING", (0,0),(-1,-1), 20),
("RIGHTPADDING", (0,0),(-1,-1), 20),
("ROUNDEDCORNERS",[8]),
]))
story.append(cover)
story.append(sp(8))
story.append(Paragraph("Quick-Reference Summary | MedMayur | July 2026",
S_FOOTER))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════
# CASE 1 — OBESITY
# ══════════════════════════════════════════════════════════════════
story.append(case_banner(1, "OBESITY", "42F, BMI 48, HTN, IFG, knee pain, sleep apnea", C_DEEP_BLUE))
story.append(sp(4))
story.append(section_label("Q1. Definition of Obesity", C_MID_BLUE))
story.append(sp(2))
story.append(highlight_box(
"<b>Obesity</b> = Abnormal growth of adipose tissue due to:<br/>"
"• <b>Hypertrophic obesity</b> – enlargement of fat cell size<br/>"
"• <b>Hyperplastic obesity</b> – increase in fat cell number<br/>"
"• <b>Mixed</b> – combination of both<br/><br/>"
"Expressed as BMI (kg/m²). Overweight = BMI ≥25; Obesity = BMI ≥30."
))
story.append(sp(4))
story.append(section_label("Q2. Epidemiological Determinants of Obesity", C_MID_BLUE))
story.append(sp(2))
story.append(make_table(
["Category", "Key Determinants"],
[
["Genetic", "Family history; gene variants (FTO gene); heritable tendency for fat storage"],
["Dietary", "High caloric intake, saturated fats, refined sugars, sugar-sweetened beverages"],
["Physical activity", "Sedentary occupation (this case), desk jobs, screen time, low leisure activity"],
["Socioeconomic", "Higher income in developing countries; urbanization; processed food access"],
["Age & Sex", "Increases with age; post-menopausal women (shift in LPL activity)"],
["Hormonal", "Hypothyroidism, Cushing's syndrome, PCOS, hyperinsulinism"],
["Psychological", "Stress eating, binge eating disorder, night eating syndrome"],
["Medications", "Corticosteroids, antipsychotics (olanzapine), insulin, some antidepressants"],
["Gut microbiome", "Dysbiosis → increased energy extraction from diet"],
],
[3.2*cm, W-3.2*cm], C_DEEP_BLUE
))
story.append(sp(4))
story.append(section_label("Q3. Obesity Indices & Criteria for Assessment", C_MID_BLUE))
story.append(sp(2))
story.append(make_table(
["Index", "Formula", "Threshold"],
[
["**BMI (Quetelet's Index)**", "Weight (kg) / Height² (m²)", "Obesity ≥ 30"],
["Ponderal Index", "Height (cm) / ∛Weight (kg)", "Obesity < 12.5 (lower = obese)"],
["Brocca Index", "Height (cm) − 100 = ideal weight (kg)", "> 20% above ideal = obese"],
["Lorentz formula", "Ht−100−(Ht−150)/4 men; /2 women", "Ideal weight in kg"],
["Corpulence Index", "Actual weight / Desirable weight", "> 1.2 = overweight"],
["Waist Circumference", "Measured at umbilicus level", "Risk: ♀>88 cm, ♂>102 cm"],
["Waist-Hip Ratio (WHR)", "Waist / Hip circumference", "Risk: ♀>0.85, ♂>1.0"],
["Skinfold thickness", "Calipers at triceps, subscapular", "Best field estimate of body fat %"],
],
[4.5*cm, 6*cm, W-10.5*cm], C_TEAL
))
story.append(sp(3))
story.append(Paragraph("<b>WHO BMI Classification (Adults):</b>", S_SECTION_HDR))
story.append(make_table(
["Classification", "BMI (kg/m²)", "Comorbidity Risk"],
[
["Underweight", "< 18.5", "Low (but other risks ↑)"],
["Normal", "18.5 – 24.9", "Average"],
["Pre-obese (Overweight)", "25.0 – 29.9", "Increased"],
["Obese Class I", "30.0 – 34.9", "Moderate"],
["Obese Class II", "35.0 – 39.9", "Severe"],
["**Obese Class III (Morbid)**", "**≥ 40.0**", "**Very Severe**"],
],
[5*cm, 4*cm, W-9*cm], C_ORANGE
))
story.append(sp(2))
story.append(Paragraph(
"★ This patient (BMI 48) = Class III Morbid Obesity → very severe risk",
S_KEY))
story.append(sp(4))
story.append(section_label("Q4. Prevention of Obesity", C_MID_BLUE))
story.append(sp(2))
story.append(make_table(
["Level", "Intervention"],
[
["**Primary Prevention**",
"Dietary modification (↓ saturated fat, ↓ refined sugars, ↑ fiber); "
"≥30 min moderate activity most days; health education; school-based programs; "
"restriction of junk food advertising; workplace wellness"],
["**Secondary Prevention**",
"Regular BMI & waist circumference screening; target 5-10% weight loss initially; "
"behavioural therapy / CBT; pharmacotherapy (orlistat for BMI >30 with comorbidities)"],
["**Tertiary Prevention**",
"Bariatric surgery for BMI ≥40 or ≥35 with serious comorbidities; "
"management of HTN, T2DM, sleep apnoea, osteoarthritis"],
],
[3.5*cm, W-3.5*cm], C_GREEN
))
story.append(sp(2))
story.append(Paragraph(
"WHO Goal: Maintain BMI 18.5–24.9 throughout adulthood; prevent weight gain >5 kg in all adults.",
S_NOTE))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════
# CASE 2 — PEM
# ══════════════════════════════════════════════════════════════════
story.append(case_banner(2, "PROTEIN-ENERGY MALNUTRITION (PEM)",
"2-year-old child, wasting + bilateral pedal edema, recurrent diarrhea",
colors.HexColor("#5D4037")))
story.append(sp(4))
story.append(section_label("Q1. Diagnosis", colors.HexColor("#5D4037")))
story.append(sp(2))
story.append(highlight_box(
"<b>KWASHIORKOR</b> — Severe form of PEM<br/><br/>"
"Key diagnostic features: <b>Bilateral pedal edema</b> (hallmark) + <b>generalized wasting</b> + "
"lethargy + low albumin + inadequate protein intake + recurrent diarrhea + age 1–3 years.",
bg=C_RED_LIGHT, border=C_RED
))
story.append(sp(4))
story.append(section_label("Q2. Classification of PEM & Differentiation", colors.HexColor("#5D4037")))
story.append(sp(2))
story.append(Paragraph("<b>Wellcome Classification:</b>", S_SECTION_HDR))
story.append(make_table(
["Type", "% Standard Weight", "Edema"],
[
["Underweight", "60–80%", "Absent"],
["**Kwashiorkor**", "**60–80%**", "**Present**"],
["Marasmus", "< 60%", "Absent"],
["Marasmic-Kwashiorkor", "< 60%", "Present"],
],
[4.5*cm, 4*cm, W-8.5*cm], colors.HexColor("#5D4037")
))
story.append(sp(3))
story.append(Paragraph("<b>Gomez Classification (Weight-for-Age):</b>", S_SECTION_HDR))
story.append(make_table(
["Grade", "Weight for Age", "Severity"],
[
["Grade I", "75–90% of standard", "Mild"],
["Grade II", "60–74% of standard", "Moderate"],
["Grade III", "< 60% of standard", "Severe"],
],
[2.5*cm, 5*cm, W-7.5*cm], colors.HexColor("#795548")
))
story.append(sp(3))
story.append(Paragraph("<b>Kwashiorkor vs. Marasmus — High-Yield Differentiation:</b>", S_SECTION_HDR))
story.append(make_table(
["Feature", "Kwashiorkor", "Marasmus"],
[
["Cause", "Protein deficiency (low P:E ratio)", "Deficiency of protein + calories"],
["Age", "1–3 years (weaning age)", "< 1 year (infancy)"],
["**Edema**", "**Present (HALLMARK)**", "**Absent**"],
["Wasting", "Present but masked by edema", "Severe, very marked"],
["Subcutaneous fat", "Relatively preserved", "Markedly reduced ('skin & bones')"],
["Face", "Moon face", "Monkey/old man face"],
["Skin", "Flaky paint dermatosis, pigmentation", "Loose, wrinkled, dry"],
["Hair", "Depigmented, Flag sign, easily plucked", "Sparse, thin"],
["Liver", "Enlarged (fatty liver)", "Normal or small"],
["Appetite", "Poor, irritable", "Hungry, alert"],
["Serum albumin", "Markedly low", "Less markedly reduced"],
["Mood", "Apathetic, irritable", "Alert but miserable"],
],
[3.5*cm, 5.5*cm, W-9*cm], colors.HexColor("#5D4037")
))
story.append(sp(2))
story.append(Paragraph(
"★ Mnemonic for Kwashiorkor: EDEMA-MHFL = Edema, Depigmentation, "
"Enlarged liver, Moon face, Apathy, Muscle wasting (hidden), Hair changes, Fatty liver, Low albumin",
S_NOTE))
story.append(sp(4))
story.append(section_label("Q3. Epidemiology of PEM", colors.HexColor("#5D4037")))
story.append(sp(2))
story.append(make_table(
["Key Fact", "Data"],
[
["Child mortality", "Underlying cause in ~30% of under-5 deaths"],
["Stunting (low HFA)", "~27% of children in low-income countries"],
["Wasting (low WFH)", "~17% of children globally"],
["Mortality risk", "Severely wasted children 9× more likely to die"],
["High-risk age", "6 months – 3 years (weaning period)"],
["Key risk factors", "Poverty, low literacy, large family, diarrhea, measles, poor weaning foods"],
["India: high burden states", "UP, Bihar, Jharkhand, Rajasthan, MP"],
],
[5*cm, W-5*cm], colors.HexColor("#795548")
))
story.append(sp(4))
story.append(section_label("Q4. Prevention & Control of PEM", colors.HexColor("#5D4037")))
story.append(sp(2))
story.append(make_table(
["Strategy", "Measures"],
[
["Health Promotion",
"Exclusive breastfeeding ×6 months; low-cost weaning foods; "
"nutrition education; birth spacing; maternal supplementation; home economics"],
["Specific Protection",
"Protein & energy-rich diet (milk, eggs, fruits); immunization (measles); "
"food fortification"],
["Early Detection",
"Growth monitoring charts (weight-for-age); MUAC < 12.5 cm = severe malnutrition; "
"12.5–13.5 cm = mild-moderate"],
["Government Programs",
"ICDS (supplementary nutrition); Mid-Day Meal; Poshan Abhiyaan; "
"SAM management via NRCs (Nutrition Rehabilitation Centres)"],
],
[3.8*cm, W-3.8*cm], colors.HexColor("#5D4037")
))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════
# CASE 3 — VITAMIN A DEFICIENCY
# ══════════════════════════════════════════════════════════════════
story.append(case_banner(3, "VITAMIN A DEFICIENCY (XEROPHTHALMIA)",
"3-year-old, night blindness + Bitot's spots, no Vit.A supplementation",
C_TEAL))
story.append(sp(4))
story.append(section_label("Q1. Diagnosis", C_TEAL))
story.append(sp(2))
story.append(highlight_box(
"<b>XEROPHTHALMIA</b> due to Vitamin A Deficiency<br/><br/>"
"Stage: <b>XN (Night blindness) + X1B (Bitot's spots)</b><br/><br/>"
"Basis: Night blindness + bilateral foamy Bitot's spots + prolonged exclusive cereal weaning "
"(no Vit.A) + drought area (food scarcity) + age 3 years (highest risk: 6 months–6 years).",
bg=C_TEAL_LIGHT, border=C_TEAL
))
story.append(sp(4))
story.append(section_label("Q2. Clinical Features", C_TEAL))
story.append(sp(2))
story.append(Paragraph("<b>WHO Xerophthalmia Classification:</b>", S_SECTION_HDR))
story.append(make_table(
["Stage", "Code", "Feature"],
[
["Night blindness", "XN", "Earliest symptom; child cannot see in dim light"],
["Conjunctival xerosis", "X1A", "Dry, hazy, lusterless conjunctiva"],
["**Bitot's spots**", "**X1B**", "**Foamy, cheesy triangular white deposits on temporal conjunctiva**"],
["Corneal xerosis", "X2", "Dull, hazy cornea"],
["Corneal ulcer / keratomalacia (<1/3)", "X3A", "Partial corneal melt"],
["Corneal ulcer / keratomalacia (≥1/3)", "X3B", "Major corneal melt — emergency"],
["Corneal scar", "XS", "After healing — permanent"],
["Xerophthalmic fundus", "XF", "Rare fundus changes"],
],
[4.5*cm, 1.5*cm, W-6*cm], C_TEAL
))
story.append(sp(3))
story.append(Paragraph("<b>Systemic features:</b>", S_SECTION_HDR))
story.append(make_table(
["System", "Manifestation"],
[
["Skin", "Follicular hyperkeratosis (Phrynoderma / 'toad skin') — dry, rough, follicular plugging"],
["Immunity", "↑ susceptibility to respiratory & GI infections; 20% of VAD children at ↑ mortality risk"],
["Growth", "Growth retardation"],
["Blood", "Anaemia (often co-exists)"],
["Reproduction", "Reproductive failure in severe, prolonged deficiency"],
],
[3*cm, W-3*cm], C_TEAL
))
story.append(sp(4))
story.append(section_label("Q3. Methods to Prevent Vitamin A Deficiency", C_TEAL))
story.append(sp(2))
story.append(make_table(
["Approach", "Measures"],
[
["**Massive Dose Supplementation\n(Short-term — most impactful)**",
"• 9 months: 1,00,000 IU (with measles vaccine)\n"
"• Every 6 months up to age 5: 2,00,000 IU\n"
"• Xerophthalmia: treat at facility\n"
"• Measles cases: 1 dose Vit.A (if not received in past 1 month)\n"
"• SAM cases: 1 additional dose"],
["Food Fortification\n(Medium-term)",
"Edible oil / vanaspati with Vit.A (mandatory in India); "
"sugar (Central America model); milk (Vit.A+D)"],
["Dietary Diversification\n(Long-term)",
"Dark green leafy vegetables, yellow/orange fruits & veg, liver, eggs, milk, fish; "
"promote breastfeeding"],
["Infection Control",
"Immunization against measles; control diarrhea (safe water, sanitation); "
"treat infections promptly"],
],
[4.5*cm, W-4.5*cm], C_TEAL
))
story.append(sp(4))
story.append(section_label("Q4. Food Fortification", C_TEAL))
story.append(sp(2))
story.append(highlight_box(
"<b>Food Fortification</b> = Addition of one or more essential nutrients to a food "
"(whether or not normally present) to prevent/correct demonstrated deficiency in the population."
))
story.append(sp(2))
story.append(make_table(
["Type", "Definition", "Example"],
[
["Mass fortification", "Nutrients added to staple foods for general population",
"Iodized salt, Vitamin A in oil"],
["Targeted fortification", "For specific at-risk groups",
"Infant formula, complementary foods"],
["Market-driven", "Voluntary by food industry", "Fortified breakfast cereals"],
],
[3.5*cm, 5.5*cm, W-9*cm], C_TEAL
))
story.append(sp(2))
story.append(Paragraph("<b>Advantages:</b> No change in food habits needed | Reaches large populations "
"via existing distribution | Cost-effective | Sustainable | No medical infrastructure required<br/>"
"<b>FSSAI '+F' program</b>: Mandates fortification of oil (Vit A+D), flour (Fe+FA+B12), "
"milk, rice, and double-fortified salt.", S_BODY))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════
# CASE 4 — NUTRITIONAL ANAEMIA / IDA
# ══════════════════════════════════════════════════════════════════
story.append(case_banner(4, "IRON DEFICIENCY ANAEMIA (NUTRITIONAL ANAEMIA)",
"32F, menorrhagia, red-meat deficient diet, microcytic hypochromic, low ferritin",
C_RED))
story.append(sp(4))
story.append(section_label("Q1. Diagnosis", C_RED))
story.append(sp(2))
story.append(highlight_box(
"<b>Iron Deficiency Anaemia (IDA)</b> — most common nutritional anaemia<br/><br/>"
"WHO Definition: 'A condition where Hb is lower than normal due to deficiency of ≥1 essential "
"nutrients, regardless of cause.' (WHO)<br/><br/>"
"Key findings: Premenopausal + menorrhagia (↑ Fe loss) + diet lacking red meat (↓ Fe intake) "
"+ fatigue + pallor + <b>pagophagia (pica for ice)</b> + microcytic hypochromic + low serum ferritin.",
bg=C_RED_LIGHT, border=C_RED
))
story.append(sp(3))
story.append(Paragraph("<b>WHO Haemoglobin Cut-offs for Anaemia:</b>", S_SECTION_HDR))
story.append(make_table(
["Group", "Hb Cut-off (g/dL)"],
[
["Adult men", "< 13.0"],
["**Non-pregnant women**", "**< 12.0**"],
["Pregnant women", "< 11.0"],
["Children 6–59 months", "< 11.0"],
["Children 5–11 years", "< 11.5"],
["Children 12–14 years", "< 12.0"],
],
[6*cm, W-6*cm], C_RED
))
story.append(sp(2))
story.append(Paragraph("<b>Severity Classification (India, National Programme):</b>", S_SECTION_HDR))
story.append(make_table(
["Grade", "Hb (g/dL)", "Management"],
[
["Mild", "10.0 – 10.9", "IFA tablets at health facility"],
["Moderate", "7.0 – 9.9", "Refer to PHC"],
["Severe", "< 7.0", "Refer to hospital"],
["Very severe", "< 4.0", "Emergency referral"],
],
[2.5*cm, 4*cm, W-6.5*cm], colors.HexColor("#922B21")
))
story.append(sp(4))
story.append(section_label("Q2. Community Interventions to Control Nutritional Anaemia", C_RED))
story.append(sp(2))
story.append(make_table(
["Strategy", "Details"],
[
["**1. IFA Supplementation\n(Most immediate)**",
"• Pregnant/Lactating: 100 mg elemental Fe + 0.5 mg FA/day\n"
"• Children 6–60 months: 20 mg Fe + 0.1 mg FA (liquid) × 100 days\n"
"• Children 6–10 yrs: 30 mg Fe + 250 mcg FA × 100 days\n"
"• Adolescents: same as adults"],
["**2. Iron Fortification\n(Medium-term)**",
"Double Fortified Salt (DFS) with Fe + Iodine — universally consumed, no special delivery; "
"ferric ortho-phosphate in salt proven by NIN Hyderabad; "
"FSSAI mandates Fe-fortified wheat flour"],
["**3. Dietary Diversification\n(Long-term)**",
"↑ iron-rich foods (green leafy veg, meat, pulses, jaggery); "
"↑ Vitamin C (enhances Fe absorption); "
"avoid tea/coffee with meals (inhibit non-heme Fe absorption); "
"use iron cooking pots"],
["4. Parasite & Infection Control",
"Deworming (hookworm major cause of Fe loss); treatment of malaria; sanitation"],
["5. Other measures",
"Delayed cord clamping (retains 40–60 mL iron-rich blood); "
"nutrition education; health awareness"],
],
[3.8*cm, W-3.8*cm], C_RED
))
story.append(sp(4))
story.append(section_label("Q3. Anaemia Mukt Bharat (AMB)", C_RED))
story.append(sp(2))
story.append(make_table(
["Item", "Detail"],
[
["Full name", "Anaemia Mukt Bharat (AMB)"],
["Launched", "2018, Ministry of Health & Family Welfare"],
["Parent program", "POSHAN Abhiyaan + Intensified National Iron Plus Initiative (I-NIPI)"],
["Target", "Reduce anaemia by 3 percentage points per year across life cycle"],
["Framework", "6 × 6 × 6 Strategy"],
],
[4*cm, W-4*cm], colors.HexColor("#922B21")
))
story.append(sp(3))
story.append(Paragraph("<b>6 × 6 × 6 Strategy:</b>", S_SECTION_HDR))
story.append(make_table(
["6 Target Groups", "6 Interventions", "6 Delivery Platforms"],
[
["Children 6–59 months", "IFA supplementation", "ICDS / Anganwadi"],
["Children 5–9 years", "Deworming (Albendazole)", "School Health Programme"],
["Adolescent girls & boys", "Point-of-care Hb testing", "RBSK"],
["WRA 20–49 years", "Behaviour Change Communication", "RMNCHA+"],
["Pregnant women", "Delayed cord clamping", "RKSK (Adolescent Health)"],
["Lactating mothers", "Fortified rice via PDS/MDM/ICDS", "HWCs / Primary Healthcare"],
],
[(W/3), (W/3), (W/3)], C_RED
))
story.append(sp(2))
story.append(Paragraph(
"★ National Deworming Day: February 10 and August 10 annually | "
"AMB Tracker App for real-time monitoring",
S_NOTE))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════
# CASE 5 — ENDEMIC FLUOROSIS
# ══════════════════════════════════════════════════════════════════
story.append(case_banner(5, "ENDEMIC FLUOROSIS",
"50M, Rajasthan, borewell water, mottled teeth + spinal stiffness × 5 years",
C_PURPLE))
story.append(sp(4))
story.append(section_label("Q1. Diagnosis", C_PURPLE))
story.append(sp(2))
story.append(highlight_box(
"<b>Endemic Fluorosis</b> (Dental + Skeletal)<br/><br/>"
"• <b>Dental fluorosis</b>: brownish-yellow mottling and pitting of permanent teeth "
"(fluoride > 1.5 mg/L during tooth calcification)<br/>"
"• <b>Skeletal fluorosis</b>: progressive low back pain, morning spinal stiffness, "
"difficulty climbing stairs (fluoride 3–6 mg/L lifetime intake)<br/><br/>"
"Clue: Deep borewell water in fluoride-endemic Rajasthan + unaffected adult children who migrated "
"= environmental/water-borne, NOT genetic.",
bg=C_PURPLE_LIGHT, border=C_PURPLE
))
story.append(sp(2))
story.append(make_table(
["Fluoride Level", "Clinical Effect"],
[
["< 0.5 mg/L", "Dental caries (no protective effect)"],
["0.5–0.8 mg/L", "Safe; WHO/BIS permissible (optimal for caries prevention)"],
["1.5 mg/L", "Threshold for dental fluorosis (enamel mottling)"],
["3.0–6.0 mg/L", "Skeletal fluorosis (lifetime daily intake)"],
["> 10 mg/L", "Crippling fluorosis"],
],
[4*cm, W-4*cm], C_PURPLE
))
story.append(sp(4))
story.append(section_label("Q2. Sources of Fluoride", C_PURPLE))
story.append(sp(2))
story.append(make_table(
["Source Type", "Examples"],
[
["**Groundwater (MOST IMPORTANT)**",
"Deep borewells — fluoride leaches from fluorapatite/fluoride-containing rocks; "
"higher in groundwater than surface water"],
["Soil & Rocks", "Fluorapatite, cryolite, fluorite deposits in soil"],
["Food", "Tea leaves (very high), seafood, marine fish, some vegetables from fluoride-rich soil"],
["Industrial emissions", "Aluminium smelting, phosphate fertilizer plants, brick kilns, coal combustion"],
["Pesticides", "Some fluoride-containing agricultural chemicals"],
["Dental products", "Fluoride toothpaste/gels (NOT relevant in endemic areas; AVOID in children < 6 yrs)"],
["Intentional fluoridation", "Added at 0.7–1.0 mg/L for caries prevention in some developed countries"],
["Diet-related",
"Sorghum (jowar)-based diet promotes HIGHER fluoride retention compared to rice-based diet "
"(relevant in AP & TN genu valgum fluorosis)"],
],
[4.5*cm, W-4.5*cm], C_PURPLE
))
story.append(sp(2))
story.append(Paragraph(
"★ Endemic areas in India: Andhra Pradesh (Nellore, Nalgonda, Prakasam), "
"Punjab, Haryana, Karnataka, Kerala, Tamil Nadu, Rajasthan",
S_NOTE))
story.append(sp(4))
story.append(section_label("Q3. Clinical Features of Fluorosis", C_PURPLE))
story.append(sp(2))
story.append(Paragraph("<b>A. Dental Fluorosis (Threshold: > 1.5 mg/L; during first 7 years of life):</b>",
S_SECTION_HDR))
story.append(make_table(
["Stage", "Features"],
[
["Early", "Loss of shiny enamel; chalk-white patches (upper incisors most affected)"],
["Progressive", "White patches → yellow → brown → black"],
["Severe", "Pitting, corroded appearance, loss of enamel"],
["Key points",
"Confined to PERMANENT teeth | develops only during calcification period | "
"Dean's Index grades severity | mottling best on upper incisors"],
],
[3*cm, W-3*cm], C_PURPLE
))
story.append(sp(3))
story.append(Paragraph("<b>B. Skeletal Fluorosis (Threshold: 3–6 mg/L; lifetime exposure):</b>",
S_SECTION_HDR))
story.append(make_table(
["Stage", "Features"],
[
["Pre-skeletal",
"Backache, joint pains, muscle weakness (fatigue, burning, tingling sensations)"],
["Stage 1",
"Sporadic joint pain; slight stiffness; osteosclerosis on X-ray"],
["Stage 2",
"Chronic joint pain, arthritis; calcification of ligaments & tendons; "
"especially spinal (this patient's presentation)"],
["Stage 3 — Crippling\n(> 10 mg/L)",
"Permanent disability; kyphosis; flexion deformities; neurological compression"],
["X-ray findings",
"Osteosclerosis ('chalky white bones'); calcified interosseous membranes; "
"bamboo spine appearance"],
],
[3.5*cm, W-3.5*cm], C_PURPLE
))
story.append(sp(3))
story.append(Paragraph("<b>C. Genu Valgum Fluorosis (South India — AP, TN):</b>", S_SECTION_HDR))
story.append(highlight_box(
"Knock-knee deformity (genu valgum) + osteoporosis of lower limbs<br/>"
"Associated with <b>sorghum (jowar)</b>-based diet → promotes ↑ fluoride retention vs rice diet",
bg=C_PURPLE_LIGHT, border=C_PURPLE
))
story.append(sp(3))
story.append(section_label("Intervention / Control of Fluorosis", C_PURPLE))
story.append(sp(2))
story.append(make_table(
["Method", "Details"],
[
["Change water source", "Switch to surface water (< 0.8 mg/L); running surface water has less fluoride than deep wells"],
["**Nalgonda Technique**",
"Defluoridation: Add lime + alum in sequence → flocculation → sedimentation → filtration; "
"developed by NEERI Nagpur; moderately expensive"],
["Avoid fluoride products", "No fluoride toothpaste for children < 6 yrs in endemic areas; "
"no fluoride supplements for children drinking fluoridated water"],
["NPPCF", "National Programme for Prevention and Control of Fluorosis — MoHFW"],
],
[4*cm, W-4*cm], C_PURPLE
))
story.append(sp(5))
story.append(HRFlowable(W, thickness=1, color=C_GRAY_MED))
story.append(sp(3))
story.append(Paragraph(
"Summary prepared by MedMayur | Based on Park's Textbook of PSM, 24th Ed. | July 2026",
S_FOOTER))
# ── BUILD PDF ─────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved to: {OUTPUT}")
cd /tmp/workspace/psm-revision && python3 generate_pdf.py 2>&1
python3 -c " import pdfplumber with pdfplumber.open('/tmp/workspace/psm-revision/PSM_Short_Cases_Revision.pdf') as pdf: print(f'Pages: {len(pdf.pages)}') print('Page 1 preview:') print(pdf.pages[0].extract_text()[:500]) "
PSM Short Cases Revision
PDF Document · PDF
| Section | Content |
|---|---|
| Cover page | Colour-coded title with all 5 cases listed |
| Case 1 - Obesity | Definition, determinants table, all obesity indices (BMI/Brocca/WHR etc.), WHO BMI classification table, prevention levels |
| Case 2 - PEM | Kwashiorkor diagnosis box, Wellcome + Gomez classification tables, high-yield Kwashiorkor vs Marasmus comparison table (12 features), epidemiology stats, prevention strategies |
| Case 3 - Vitamin A Deficiency | WHO Xerophthalmia staging (XN to XF), systemic features, supplementation doses (100k IU / 200k IU schedule), food fortification types + FSSAI '+F' program |
| Case 4 - IDA / Nutritional Anaemia | WHO Hb cut-offs table, severity classification + management, 5 community interventions with IFA dosages, full AMB 6×6×6 table |
| Case 5 - Fluorosis | Fluoride level vs clinical effect table, sources of fluoride (groundwater highlighted), dental/skeletal/genu valgum features by stage, Nalgonda technique, NPPCF |