Diet plan for pcod
"polycystic ovary syndrome" AND diet
PCOD PCOS diet plan evidence based 2024 2025
PMID: 38388374
| Category | Examples |
|---|---|
| Non-starchy vegetables | Spinach, broccoli, kale, cauliflower, cucumber, zucchini, capsicum, methi, drumstick |
| Low-GI carbs | Brown rice, quinoa, oats, barley, whole wheat roti, millets (jowar, bajra, ragi), sweet potato |
| Legumes & pulses | Lentils (dal), chickpeas, rajma, moong, black beans - rich in fiber and plant protein |
| Lean protein | Eggs, chicken breast, turkey, fish (especially fatty fish - salmon, mackerel, sardines), tofu, paneer (moderate), Greek yogurt |
| Healthy fats | Avocado, olive oil, nuts (walnuts, almonds), flaxseeds, chia seeds, sunflower seeds |
| Fruits | Berries (strawberry, blueberry), apple, pear, guava, papaya - lower-GI choices preferred |
| Low-fat dairy | Greek yogurt, low-fat milk, buttermilk (chaas) |
| Herbs & spices | Cinnamon (helps insulin sensitivity), turmeric, fenugreek (methi seeds) |
| Category | Why |
|---|---|
| Refined carbs | White bread, maida, white rice (in large portions), pasta - spike insulin sharply |
| Added sugars | Packaged sweets, cold drinks, fruit juices, candy, mithai |
| Trans fats & processed foods | Chips, bakery items, fast food, packaged snacks |
| Excess red meat | Increases inflammation and saturated fat load |
| Full-fat dairy in excess | Linked to androgen stimulation in some studies |
| Alcohol | Disrupts hormones, worsens insulin resistance |
| High-GI fruits | Mango, banana, grapes, chikoo in large amounts |
| Nutrient | Why It Matters | Sources |
|---|---|---|
| Inositol (Myo-inositol) | Improves insulin signaling, reduces androgen levels | Whole grains, legumes, citrus fruits |
| Omega-3 fatty acids | Reduces inflammation, lowers triglycerides | Fatty fish, flaxseeds, walnuts, chia |
| Vitamin D | Very commonly deficient in PCOS; affects insulin and ovulation | Sunlight, eggs, fish, fortified milk |
| Magnesium | Reduces insulin resistance | Nuts, seeds, dark leafy greens, whole grains |
| Zinc | Lowers androgens, reduces acne | Pumpkin seeds, chickpeas, eggs |
| Chromium | Improves blood sugar control | Broccoli, whole grains, eggs |
| Fiber | Slows glucose absorption, feeds gut microbiome | Vegetables, fruits, legumes, whole grains |
Generate pdf printable pcod meal plan with recipes what to eat or what to not eat
mkdir -p /tmp/workspace/pcod-meal-plan && ls /tmp/workspace/
~/pcod-meal-plan/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.platypus.flowables import BalancedColumns
from reportlab.graphics.shapes import Drawing, Rect, String
from reportlab.graphics import renderPDF
# ─── Colors ───────────────────────────────────────────────────────────────────
TEAL = colors.HexColor("#2E8B8A")
LIGHT_TEAL = colors.HexColor("#E6F5F5")
DARK_TEAL = colors.HexColor("#1A5F5F")
PINK = colors.HexColor("#E84393")
LIGHT_PINK = colors.HexColor("#FDE8F3")
ORANGE = colors.HexColor("#E87A2E")
LIGHT_ORANGE= colors.HexColor("#FEF3E8")
GREEN = colors.HexColor("#3A8C3F")
LIGHT_GREEN = colors.HexColor("#EAF5EB")
RED = colors.HexColor("#CC2222")
LIGHT_RED = colors.HexColor("#FDEAEA")
GOLD = colors.HexColor("#C9912A")
LIGHT_GOLD = colors.HexColor("#FDF6E3")
GRAY = colors.HexColor("#666666")
LIGHT_GRAY = colors.HexColor("#F7F7F7")
WHITE = colors.white
BLACK = colors.black
W, H = A4 # 595 x 842 pts
doc = SimpleDocTemplate(
"/tmp/workspace/pcod-meal-plan/PCOD_Meal_Plan.pdf",
pagesize=A4,
leftMargin=1.5*cm,
rightMargin=1.5*cm,
topMargin=1.5*cm,
bottomMargin=1.5*cm,
title="PCOD Meal Plan",
author="Orris Health",
)
styles = getSampleStyleSheet()
def style(name, **kw):
s = ParagraphStyle(name, **kw)
return s
H1 = style("H1", fontSize=26, textColor=WHITE, alignment=TA_CENTER,
fontName="Helvetica-Bold", leading=32, spaceAfter=4)
H2 = style("H2", fontSize=15, textColor=WHITE, alignment=TA_CENTER,
fontName="Helvetica-Bold", leading=20, spaceAfter=2)
SUBTITLE = style("SUBTITLE", fontSize=11, textColor=WHITE, alignment=TA_CENTER,
fontName="Helvetica", leading=15)
SECTION = style("SECTION", fontSize=13, textColor=WHITE, alignment=TA_LEFT,
fontName="Helvetica-Bold", leading=17, spaceBefore=4, spaceAfter=4)
BODY = style("BODY", fontSize=9, textColor=BLACK, alignment=TA_JUSTIFY,
fontName="Helvetica", leading=13, spaceAfter=3)
BODY_BOLD = style("BODY_BOLD", fontSize=9, textColor=BLACK, alignment=TA_LEFT,
fontName="Helvetica-Bold", leading=13)
SMALL = style("SMALL", fontSize=8, textColor=GRAY, alignment=TA_LEFT,
fontName="Helvetica", leading=11)
RECIPE_NAME = style("RECIPE_NAME", fontSize=10, textColor=DARK_TEAL, alignment=TA_LEFT,
fontName="Helvetica-Bold", leading=14, spaceAfter=2)
RECIPE_BODY = style("RECIPE_BODY", fontSize=8.5, textColor=BLACK, alignment=TA_LEFT,
fontName="Helvetica", leading=12, spaceAfter=2)
CELL_HEAD = style("CELL_HEAD", fontSize=9, textColor=WHITE, alignment=TA_CENTER,
fontName="Helvetica-Bold", leading=12)
CELL = style("CELL", fontSize=8.5, textColor=BLACK, alignment=TA_LEFT,
fontName="Helvetica", leading=12)
CELL_C = style("CELL_C", fontSize=8.5, textColor=BLACK, alignment=TA_CENTER,
fontName="Helvetica", leading=12)
DAYHEAD = style("DAYHEAD", fontSize=10, textColor=WHITE, alignment=TA_CENTER,
fontName="Helvetica-Bold", leading=14)
MEAL_LABEL = style("MEAL_LABEL", fontSize=8, textColor=TEAL, alignment=TA_LEFT,
fontName="Helvetica-Bold", leading=11)
MEAL_TEXT = style("MEAL_TEXT", fontSize=8, textColor=BLACK, alignment=TA_LEFT,
fontName="Helvetica", leading=11, spaceAfter=2)
story = []
CW = W - 3*cm # content width
# ══════════════════════════════════════════════════════════════════════════════
# HELPERS
# ══════════════════════════════════════════════════════════════════════════════
def banner(text, sub="", bg=TEAL):
tbl = Table(
[[Paragraph(text, H1)], [Paragraph(sub, SUBTITLE)] if sub else [""]],
colWidths=[CW]
)
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("ROUNDEDCORNERS", [8]),
("BOTTOMPADDING", (0,0), (-1,-1), 10),
("TOPPADDING", (0,0), (-1,-1), 10),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
]))
return tbl
def section_header(text, bg=TEAL):
tbl = Table([[Paragraph(text, SECTION)]], colWidths=[CW])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("ROUNDEDCORNERS", [5]),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 12),
]))
return tbl
def two_col(left_items, right_items, lbg=LIGHT_GREEN, rbg=LIGHT_RED,
ltitle="✅ EAT MORE", rtitle="❌ AVOID / LIMIT",
ltc=GREEN, rtc=RED):
"""Two-column food list table."""
def col_rows(title, items, bg, tc):
rows = [[Paragraph(title, style("TH", fontSize=10, textColor=WHITE,
fontName="Helvetica-Bold", leading=14,
alignment=TA_CENTER))]]
for item in items:
rows.append([Paragraph(f"• {item}", CELL)])
return rows, bg, tc
lrows, lbg_, _ = col_rows(ltitle, left_items, lbg, ltc)
rrows, rbg_, _ = col_rows(rtitle, right_items, rbg, rtc)
max_r = max(len(lrows), len(rrows))
while len(lrows) < max_r: lrows.append([""])
while len(rrows) < max_r: rrows.append([""])
merged = [[l[0], r[0]] for l, r in zip(lrows, rrows)]
hw = CW / 2 - 4
tbl = Table(merged, colWidths=[hw, hw], hAlign="CENTER")
style_cmds = [
("BACKGROUND", (0,0), (0,0), ltc),
("BACKGROUND", (1,0), (1,0), rtc),
("BACKGROUND", (0,1), (0,-1), lbg_),
("BACKGROUND", (1,1), (1,-1), rbg_),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
("GRID", (0,0), (-1,-1), 0.3, colors.HexColor("#CCCCCC")),
]
tbl.setStyle(TableStyle(style_cmds))
return tbl
def recipe_card(title, time, servings, ingredients, steps, note="", bg=LIGHT_TEAL, ac=TEAL):
meta = f"⏱ {time} | 🍽 {servings}"
ing_text = "\n".join(f"• {i}" for i in ingredients)
step_text = "\n".join(f"{n+1}. {s}" for n, s in enumerate(steps))
content = [
[Paragraph(title, style("RT", fontSize=10, textColor=ac,
fontName="Helvetica-Bold", leading=14))],
[Paragraph(meta, SMALL)],
[Paragraph("<b>Ingredients:</b>", BODY_BOLD)],
[Paragraph(ing_text, RECIPE_BODY)],
[Paragraph("<b>Method:</b>", BODY_BOLD)],
[Paragraph(step_text, RECIPE_BODY)],
]
if note:
content.append([Paragraph(f"💡 {note}", SMALL)])
tbl = Table(content, colWidths=[CW/2 - 6])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("ROUNDEDCORNERS", [6]),
("BOX", (0,0), (-1,-1), 0.5, ac),
]))
return tbl
def two_recipes(r1, r2):
"""Put two recipe cards side by side."""
tbl = Table([[r1, r2]], colWidths=[CW/2 - 4, CW/2 - 4], hAlign="CENTER")
tbl.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0), (-1,-1), 3),
("RIGHTPADDING", (0,0), (-1,-1), 3),
]))
return tbl
def meal_row(label, text):
return [Paragraph(label, MEAL_LABEL), Paragraph(text, MEAL_TEXT)]
# ══════════════════════════════════════════════════════════════════════════════
# PAGE 1 – COVER
# ══════════════════════════════════════════════════════════════════════════════
story.append(Spacer(1, 0.4*cm))
story.append(banner(
"🌸 PCOD Meal Plan",
"A Complete Guide to Eating Well with Polycystic Ovarian Disease",
bg=TEAL
))
story.append(Spacer(1, 0.4*cm))
# Intro paragraph
intro = (
"Polycystic Ovarian Disease (PCOD) is driven by <b>insulin resistance</b>, elevated androgens, "
"and chronic low-grade inflammation. The right diet directly targets all three — lowering insulin "
"spikes, reducing inflammation, and supporting healthy hormone balance. This plan is based on the "
"DASH diet framework, ranked #1 for PCOS management in a 2024 network meta-analysis of 19 RCTs "
"(Juhász et al., Reproductive Health 2024)."
)
story.append(Paragraph(intro, BODY))
story.append(Spacer(1, 0.3*cm))
# Key goals boxes
goals = [
("🩸", "Lower\nInsulin", "Reduce refined carbs\n& sugar"),
("🔥", "Fight\nInflammation", "Eat colorful veggies\n& omega-3 fats"),
("⚖️", "Balance\nHormones", "Adequate protein\n& healthy fats"),
("🌿", "Support\nGut Health", "Fiber, probiotics\n& prebiotics"),
]
goal_cells = []
for emoji, title, desc in goals:
goal_cells.append(
Paragraph(f"<b>{emoji}</b><br/><b>{title}</b><br/><font size=8>{desc}</font>",
style("GC", fontSize=9, textColor=DARK_TEAL, alignment=TA_CENTER,
fontName="Helvetica", leading=13))
)
gtbl = Table([goal_cells], colWidths=[CW/4]*4)
gtbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_TEAL),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING", (0,0), (-1,-1), 10),
("GRID", (0,0), (-1,-1), 0.4, TEAL),
("ROUNDEDCORNERS", [5]),
]))
story.append(gtbl)
story.append(Spacer(1, 0.4*cm))
# ── WHAT TO EAT / AVOID ───────────────────────────────────────────────────────
story.append(section_header("🥗 What to Eat & What to Avoid"))
story.append(Spacer(1, 0.2*cm))
eat = [
"Whole grains: brown rice, oats, quinoa, millets (jowar, bajra, ragi)",
"Legumes & pulses: dal, rajma, chana, moong, lentils",
"Vegetables: spinach, broccoli, kale, cauliflower, methi, drumstick",
"Lean protein: eggs, chicken breast, fish (salmon, mackerel), tofu, paneer",
"Healthy fats: avocado, olive oil, walnuts, almonds, flaxseeds, chia",
"Low-GI fruits: berries, apple, guava, pear, papaya",
"Low-fat dairy: Greek yogurt, buttermilk, low-fat milk",
"Spices: cinnamon, turmeric, methi seeds, ginger, jeera",
"Fermented foods: yogurt, idli/dosa batter, kanji",
"Green tea, herbal tea, jeera water, warm lemon water",
]
avoid = [
"White bread, maida (all-purpose flour), white rice in excess",
"Sugary drinks: cola, packaged juices, energy drinks",
"Sweets & mithai: gulab jamun, jalebi, barfi, chocolates",
"Packaged / ultra-processed snacks: chips, biscuits, namkeen",
"Trans fats: fast food, bakery items, margarine",
"Excess red & processed meat: sausages, salami, red meat daily",
"Alcohol — disrupts hormones & worsens insulin resistance",
"High-GI fruits in large portions: mango, banana, grapes, chikoo",
"Full-fat dairy in excess: cream, full-fat cheese, butter",
"Skipping meals — leads to blood sugar crashes & insulin spikes",
]
story.append(two_col(eat, avoid))
story.append(Spacer(1, 0.3*cm))
# ── KEY NUTRIENTS ──────────────────────────────────────────────────────────────
story.append(section_header("💊 Key Nutrients for PCOD", bg=GOLD))
story.append(Spacer(1, 0.2*cm))
nut_data = [
[Paragraph("Nutrient", CELL_HEAD), Paragraph("Role in PCOD", CELL_HEAD),
Paragraph("Best Food Sources", CELL_HEAD)],
[Paragraph("Myo-Inositol", CELL), Paragraph("Improves insulin signaling; reduces androgens", CELL),
Paragraph("Whole grains, legumes, citrus fruits", CELL)],
[Paragraph("Omega-3 Fatty Acids", CELL), Paragraph("Reduces inflammation; lowers triglycerides", CELL),
Paragraph("Salmon, mackerel, flaxseeds, walnuts, chia", CELL)],
[Paragraph("Vitamin D", CELL), Paragraph("Affects insulin & ovulation; often deficient in PCOS", CELL),
Paragraph("Sunlight, eggs, fish, fortified milk", CELL)],
[Paragraph("Magnesium", CELL), Paragraph("Reduces insulin resistance; improves sleep", CELL),
Paragraph("Nuts, seeds, dark leafy greens, whole grains", CELL)],
[Paragraph("Zinc", CELL), Paragraph("Lowers androgens; reduces acne & hair fall", CELL),
Paragraph("Pumpkin seeds, chickpeas, eggs, lentils", CELL)],
[Paragraph("Chromium", CELL), Paragraph("Improves blood sugar control", CELL),
Paragraph("Broccoli, whole grains, eggs", CELL)],
[Paragraph("Fiber", CELL), Paragraph("Slows glucose absorption; feeds gut microbiome", CELL),
Paragraph("Vegetables, fruits, legumes, oats, flaxseeds", CELL)],
]
ntbl = Table(nut_data, colWidths=[CW*0.22, CW*0.38, CW*0.40])
ntbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), GOLD),
("BACKGROUND", (0,1), (-1,1), LIGHT_GOLD),
("BACKGROUND", (0,2), (-1,2), WHITE),
("BACKGROUND", (0,3), (-1,3), LIGHT_GOLD),
("BACKGROUND", (0,4), (-1,4), WHITE),
("BACKGROUND", (0,5), (-1,5), LIGHT_GOLD),
("BACKGROUND", (0,6), (-1,6), WHITE),
("BACKGROUND", (0,7), (-1,7), LIGHT_GOLD),
("GRID", (0,0), (-1,-1), 0.3, colors.HexColor("#CCCCCC")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(ntbl)
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# PAGE 2 – 7-DAY MEAL PLAN
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("📅 7-Day PCOD Meal Plan"))
story.append(Spacer(1, 0.25*cm))
note_p = Paragraph(
"Each day targets: <b>~1600–1800 kcal</b> | <b>~30% protein</b> | "
"<b>~40% complex carbs</b> | <b>~30% healthy fats</b> | <b>30–35g fiber</b>. "
"Adjust portions based on your weight and activity level.",
style("NOTE", fontSize=8.5, textColor=GRAY, fontName="Helvetica", leading=12)
)
story.append(note_p)
story.append(Spacer(1, 0.2*cm))
week = [
{
"day": "Monday",
"early": "1 glass warm water + 1 tsp soaked methi seeds",
"breakfast": "Vegetable oats upma (½ cup oats, mixed veggies) + 2 boiled eggs + 1 cup buttermilk",
"snack1": "10 almonds + 1 small apple",
"lunch": "2 whole wheat rotis + 1 cup moong dal + mixed sabzi + salad + lassi (no sugar)",
"snack2": "Moong sprout chaat with lemon & jeera",
"dinner": "1 cup brown rice + 1 cup palak paneer + cucumber raita",
"bedtime": "Warm turmeric milk (low-fat)",
},
{
"day": "Tuesday",
"early": "Warm water with cinnamon + lemon",
"breakfast": "2 moong dal chilla with green chutney + 1 cup Greek yogurt (no sugar)",
"snack1": "1 pear + 5 walnuts",
"lunch": "1 cup quinoa + 1 cup rajma curry + green salad + chaas",
"snack2": "Roasted chana (handful) + cucumber slices",
"dinner": "2 jowar rotis + chicken/tofu stir-fry with capsicum & broccoli",
"bedtime": "Chamomile or spearmint tea",
},
{
"day": "Wednesday",
"early": "Jeera water (boil 1 tsp jeera in 1 cup water)",
"breakfast": "Overnight oats (½ cup oats + chia + berries + low-fat milk) + 1 boiled egg",
"snack1": "1 cup papaya cubes",
"lunch": "2 bajra rotis + 1 cup chana masala + methi sabzi + salad",
"snack2": "Vegetable soup (no cream, no corn flour)",
"dinner": "Grilled fish (100g) + 1 cup roasted vegetables + 1 roti",
"bedtime": "Warm water + 1 tsp flaxseed powder",
},
{
"day": "Thursday",
"early": "Green tea + soaked almonds (6)",
"breakfast": "Besan cheela (2) with tomato & onion + low-fat dahi",
"snack1": "Mixed nuts (5 almonds + 3 walnuts + pumpkin seeds)",
"lunch": "1 cup cooked brown rice + 1 cup toor dal + bhindi sabzi + salad",
"snack2": "Apple slices with 1 tbsp peanut butter (no added sugar)",
"dinner": "2 whole wheat rotis + egg curry / paneer bhurji + spinach sabzi",
"bedtime": "Warm turmeric milk",
},
{
"day": "Friday",
"early": "1 glass warm lemon water",
"breakfast": "Idli (3) + sambar (no potato) + coconut chutney (small portion)",
"snack1": "Guava (1 medium)",
"lunch": "1 cup millet khichdi + 1 cup dal + raita + salad",
"snack2": "Roasted makhana (fox nuts) – 1 cup",
"dinner": "2 ragi rotis + tofu/chicken tikka + cucumber-onion salad",
"bedtime": "Spearmint tea (helps reduce androgens)",
},
{
"day": "Saturday",
"early": "Methi-ajwain water (soak overnight)",
"breakfast": "Poha (1.5 cups, with peas & onion) + 1 boiled egg + green tea",
"snack1": "Strawberries (½ cup) + Greek yogurt",
"lunch": "2 whole wheat rotis + 1 cup kidney bean curry + cabbage sabzi + chaas",
"snack2": "Carrot & cucumber sticks with hummus (2 tbsp)",
"dinner": "1 cup brown rice + grilled salmon/tofu + sautéed broccoli & beans",
"bedtime": "Warm ginger-cinnamon tea",
},
{
"day": "Sunday",
"early": "Warm water + chia seeds (1 tsp soaked)",
"breakfast": "Vegetable dalia (broken wheat) with flaxseeds + 1 cup low-fat milk",
"snack1": "Mixed fruit bowl (apple, guava, papaya – avoid mango/banana)",
"lunch": "2 jowar/bajra rotis + chicken curry (light) / soya curry + dal + salad",
"snack2": "Dhokla (2–3 pieces) + green tea",
"dinner": "Vegetable khichdi (moong + rice 1:1) + baingan raita + side salad",
"bedtime": "Warm turmeric milk",
},
]
meal_labels = [
("🌅 Early Morning", "early"),
("🍳 Breakfast", "breakfast"),
("🍎 Mid-Morning Snack", "snack1"),
("🍱 Lunch", "lunch"),
("🫐 Evening Snack", "snack2"),
("🌙 Dinner", "dinner"),
("💤 Bedtime", "bedtime"),
]
day_colors = [TEAL, DARK_TEAL, colors.HexColor("#3A6EA5"),
GOLD, GREEN, PINK, colors.HexColor("#7B4F9E")]
for i, day in enumerate(week):
dc = day_colors[i]
# Day header
day_hdr = Table([[Paragraph(f" {day['day']}", DAYHEAD)]], colWidths=[CW])
day_hdr.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), dc),
("ROUNDEDCORNERS", [5]),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
]))
story.append(day_hdr)
# Meal rows
rows = [meal_row(lbl, day[key]) for lbl, key in meal_labels]
mtbl = Table(rows, colWidths=[CW*0.23, CW*0.77])
mtbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_GRAY),
("ROWBACKGROUNDS",(0,0), (-1,-1), [WHITE, LIGHT_GRAY]),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
("GRID", (0,0), (-1,-1), 0.2, colors.HexColor("#DDDDDD")),
]))
story.append(mtbl)
story.append(Spacer(1, 0.25*cm))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# PAGE 3 – RECIPES
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("👩🍳 PCOD-Friendly Recipes", bg=ORANGE))
story.append(Spacer(1, 0.25*cm))
recipes_data = [
# (title, time, servings, ingredients, steps, note, bg, ac)
(
"1. Moong Dal Chilla (Protein Pancakes)",
"20 min", "2 servings",
["1 cup moong dal (soaked 4 hrs)", "½ tsp ginger-green chilli paste",
"Handful spinach / grated zucchini", "Salt, jeera, turmeric to taste",
"Olive oil spray"],
["Blend soaked moong dal to smooth batter.",
"Add ginger paste, veggies, spices. Mix well.",
"Heat non-stick pan, spray oil, pour ladleful of batter.",
"Cook 2 min each side till golden.",
"Serve with green chutney or low-fat dahi."],
"High protein ~14g/serving. Low GI. Perfect breakfast.",
LIGHT_TEAL, TEAL
),
(
"2. Quinoa & Rajma Power Bowl",
"30 min", "2 servings",
["½ cup quinoa (rinsed)", "1 cup cooked rajma (kidney beans)",
"1 cup baby spinach", "½ cup cherry tomatoes",
"Dressing: 1 tbsp olive oil + lemon + cumin + salt"],
["Cook quinoa in 1 cup water for 15 min.",
"Sauté rajma with garlic, cumin, salt — 5 min.",
"Assemble: quinoa base, rajma, spinach, tomatoes.",
"Drizzle olive oil-lemon dressing. Toss gently.",
"Garnish with pumpkin seeds."],
"Complete protein bowl. Rich in fiber & iron.",
LIGHT_GREEN, GREEN
),
(
"3. Methi-Egg Scramble",
"15 min", "1 serving",
["2 whole eggs + 1 egg white", "½ cup fresh methi (fenugreek) leaves",
"1 small onion, chopped", "1 tomato, chopped",
"½ tsp turmeric, salt, pepper", "1 tsp olive oil"],
["Heat oil; sauté onion until soft (2 min).",
"Add tomato, methi leaves; cook 2 min.",
"Beat eggs with turmeric, salt, pepper.",
"Pour eggs over vegetables; scramble gently.",
"Serve with 1 whole wheat roti or as-is."],
"Methi improves insulin sensitivity naturally.",
LIGHT_GOLD, GOLD
),
(
"4. Spearmint-Cinnamon Detox Smoothie",
"5 min", "1 serving",
["1 cup low-fat Greek yogurt", "½ cup frozen berries",
"1 tsp flaxseeds (ground)", "¼ tsp cinnamon powder",
"5 fresh spearmint leaves", "½ cup water or low-fat milk"],
["Add all ingredients to a blender.",
"Blend until smooth.",
"Drink immediately without straining."],
"Spearmint reduces testosterone. Cinnamon lowers insulin. Berries = antioxidants.",
LIGHT_PINK, PINK
),
(
"5. Ragi (Finger Millet) Dosa",
"25 min", "3 dosas",
["1 cup ragi flour", "¼ cup urad dal batter (optional)",
"½ cup grated carrot + onion", "Salt, jeera, curry leaves",
"Olive oil spray"],
["Mix ragi flour with water to thin batter consistency.",
"Add urad dal batter for crispiness (optional).",
"Stir in vegetables, salt, jeera, curry leaves.",
"Rest 10 min. Heat non-stick tawa, spray oil.",
"Pour batter, spread thin, cook 2 min each side."],
"Ragi is iron-rich, calcium-rich, low GI — ideal PCOD grain.",
LIGHT_TEAL, TEAL
),
(
"6. Palak Paneer (Light Version)",
"30 min", "3 servings",
["200g low-fat paneer (cubed)", "4 cups spinach (blanched, blended)",
"1 small onion", "2 garlic cloves, 1 tsp ginger",
"½ tsp each: cumin, coriander, garam masala",
"1 tbsp olive oil, salt to taste"],
["Sauté onion-garlic-ginger in olive oil 3 min.",
"Add spices; cook 1 min.",
"Add blended spinach; simmer 5 min.",
"Add paneer cubes; cook 5 min on low heat.",
"Serve with 2 whole wheat or bajra rotis."],
"Use low-fat paneer and skip cream entirely.",
LIGHT_GREEN, GREEN
),
(
"7. Overnight Chia-Oat Pudding",
"5 min prep + overnight", "1 serving",
["¼ cup rolled oats", "1 tbsp chia seeds",
"1 cup low-fat milk or almond milk",
"½ tsp cinnamon", "1 tsp honey (optional)",
"Topping: berries, 1 tbsp walnuts"],
["Mix oats, chia, milk, cinnamon in a jar.",
"Stir well, seal, refrigerate overnight.",
"In the morning, stir; add berries & walnuts.",
"Eat cold or microwave 1 min if preferred."],
"Sustained energy all morning. ~8g protein, 6g fiber.",
LIGHT_GOLD, GOLD
),
(
"8. Millet Khichdi (One-Pot Meal)",
"35 min", "2 servings",
["½ cup foxtail millet", "¼ cup yellow moong dal",
"1 cup mixed vegetables (carrot, beans, peas)",
"1 tsp ghee (desi)", "Jeera, hing, turmeric, salt",
"2 cups water"],
["Wash millet and dal; soak 20 min.",
"Heat ghee in pressure cooker; add jeera, hing.",
"Add vegetables; sauté 2 min.",
"Add millet, dal, turmeric, salt, water.",
"Pressure cook 3 whistles. Rest 5 min. Serve warm.",
"Top with lime juice and coriander."],
"Ghee in small amounts helps with fat-soluble vitamin absorption.",
LIGHT_PINK, PINK
),
]
# Arrange in pairs
for i in range(0, len(recipes_data), 2):
r1data = recipes_data[i]
r1 = recipe_card(*r1data)
if i+1 < len(recipes_data):
r2data = recipes_data[i+1]
r2 = recipe_card(*r2data)
story.append(two_recipes(r1, r2))
else:
story.append(r1)
story.append(Spacer(1, 0.25*cm))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# PAGE 4 – TIPS, HYDRATION, LIFESTYLE
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_header("💡 Practical PCOD Diet Tips"))
story.append(Spacer(1, 0.2*cm))
tips = [
("🍽️ Eat Every 3–4 Hours", "Never skip meals. Fasting or skipping spikes cortisol and insulin. Eat 3 meals + 2 snacks daily."),
("🥚 Protein at Every Meal", "Aim for 25–30g protein per meal. Protein slows glucose absorption, keeps you full, and preserves muscle mass."),
("🥗 Fill Half Your Plate with Vegetables", "Non-starchy vegetables are low-calorie, high-fiber, and anti-inflammatory. Aim for 5+ servings per day."),
("🌾 Pair Carbs with Protein or Fat", "Never eat carbs alone. Always combine with protein/fat to reduce glycemic impact (e.g. roti + dal, oats + egg)."),
("💧 Stay Hydrated", "Drink 2.5–3 liters of water daily. Replace sugary drinks with green tea, spearmint tea, jeera water, or plain water."),
("🧂 Limit Salt & Processed Foods", "High sodium and ultra-processed foods worsen inflammation and bloating. Cook at home as much as possible."),
("🎯 5–10% Weight Loss Changes Everything", "Even modest weight loss in overweight PCOS women significantly restores ovulation and reduces androgens."),
("🌿 Use Functional Spices", "Cinnamon (½ tsp/day), methi seeds (1 tsp soaked), and spearmint tea all have small but real evidence for PCOS benefit."),
("🦠 Don't Ignore Gut Health", "Eat fermented foods daily: yogurt, buttermilk, idli, dosa. A 2024 systematic review confirmed synbiotics improve insulin resistance in PCOS."),
("🏃 Combine Diet with Movement", "150 min/week of moderate exercise (walking, yoga, cycling, strength training) amplifies all dietary benefits for PCOS."),
]
tip_rows = []
for emoji_title, desc in tips:
tip_rows.append([
Paragraph(f"<b>{emoji_title}</b>", style("TT", fontSize=9, fontName="Helvetica-Bold",
textColor=DARK_TEAL, leading=13)),
Paragraph(desc, BODY)
])
ttbl = Table(tip_rows, colWidths=[CW*0.30, CW*0.70])
ttbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), WHITE),
("ROWBACKGROUNDS",(0,0), (-1,-1), [LIGHT_TEAL, WHITE]),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
("GRID", (0,0), (-1,-1), 0.2, colors.HexColor("#DDDDDD")),
]))
story.append(ttbl)
story.append(Spacer(1, 0.35*cm))
# ── HYDRATION BOX ──────────────────────────────────────────────────────────────
story.append(section_header("💧 Recommended Daily Drinks", bg=colors.HexColor("#3A6EA5")))
story.append(Spacer(1, 0.2*cm))
drinks = [
["Drink", "When", "Benefit"],
["Warm water + lemon", "First thing AM", "Kickstarts digestion, alkaline pH"],
["Methi (fenugreek) seed water", "Early morning", "Improves insulin sensitivity"],
["Jeera (cumin) water", "Morning / after meals", "Reduces bloating, digestive aid"],
["Spearmint tea (2 cups/day)", "Morning & afternoon", "Reduces excess testosterone"],
["Cinnamon tea / water", "Post-lunch", "Lowers post-meal blood sugar spike"],
["Green tea", "Mid-morning", "Antioxidants, mild fat-burning"],
["Buttermilk / chaas (no salt)", "With lunch", "Probiotics, calcium, cooling"],
["Warm turmeric milk (low-fat)", "Bedtime", "Anti-inflammatory, improves sleep"],
]
dh = [Paragraph(c, CELL_HEAD) if i == 0 else Paragraph(c, CELL_C if j == 1 else CELL)
for i, row in enumerate(drinks) for j, c in enumerate(row)]
drink_data = [[Paragraph(c, CELL_HEAD if i==0 else (CELL_C if j==1 else CELL))
for j, c in enumerate(row)]
for i, row in enumerate(drinks)]
dtbl = Table(drink_data, colWidths=[CW*0.28, CW*0.28, CW*0.44])
drink_style = [
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#3A6EA5")),
("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), "TOP"),
("GRID", (0,0), (-1,-1), 0.3, colors.HexColor("#CCCCCC")),
]
for r in range(1, len(drinks)):
bg = colors.HexColor("#EBF3FC") if r % 2 == 1 else WHITE
drink_style.append(("BACKGROUND", (0,r), (-1,r), bg))
dtbl.setStyle(TableStyle(drink_style))
story.append(dtbl)
story.append(Spacer(1, 0.35*cm))
# ── QUICK SNACK IDEAS ──────────────────────────────────────────────────────────
story.append(section_header("🍎 Quick Healthy Snack Ideas", bg=GREEN))
story.append(Spacer(1, 0.2*cm))
snack_rows = [
["✅ Roasted chana (handful)", "✅ Sprout chaat with lemon & jeera", "✅ Apple + almond butter (1 tbsp)"],
["✅ Greek yogurt + berries", "✅ Carrot/cucumber sticks + hummus", "✅ Roasted makhana (fox nuts, 1 cup)"],
["✅ Mixed nuts (5 almonds + 3 walnuts)", "✅ Dhokla (2–3 pieces)", "✅ Boiled egg + black pepper"],
["✅ Chia pudding jar (small)", "✅ Pumpkin seeds + 1 fruit", "✅ Vegetable soup (no cream)"],
]
snack_data = [[Paragraph(c, CELL) for c in row] for row in snack_rows]
stbl = Table(snack_data, colWidths=[CW/3]*3)
stbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_GREEN),
("ROWBACKGROUNDS",(0,0), (-1,-1), [WHITE, LIGHT_GREEN]),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("GRID", (0,0), (-1,-1), 0.2, colors.HexColor("#CCDDCC")),
]))
story.append(stbl)
story.append(Spacer(1, 0.4*cm))
# ── FOOTER ─────────────────────────────────────────────────────────────────────
story.append(HRFlowable(width=CW, thickness=0.5, color=TEAL, spaceAfter=6))
footer_text = (
"<b>Evidence Source:</b> Juhász et al. (2024) — Ranking dietary interventions in PCOS management, "
"<i>Reproductive Health</i>. 19 RCTs, 727 patients. DASH diet ranked #1 for insulin resistance. "
"Gautam et al. (2025) — Lifestyle interventions in PCOS, <i>Nutrients</i>. "
"Martinez Guevara et al. (2024) — Synbiotics in PCOS, <i>Nutrients</i>.<br/>"
"⚠️ This meal plan is for educational purposes. Consult a registered dietitian for personalized advice."
)
story.append(Paragraph(footer_text, SMALL))
# ══════════════════════════════════════════════════════════════════════════════
# BUILD
# ══════════════════════════════════════════════════════════════════════════════
doc.build(story)
print("PDF created successfully.")
cd /tmp/workspace/pcod-meal-plan && python generate_pdf.py 2>&1
ls -lh /tmp/workspace/pcod-meal-plan/PCOD_Meal_Plan.pdf
PCOD Meal Plan
PDF Document · PDF
Diet plan for hypothyroidism same as above you had given in pdf and printable
"hypothyroidism" AND "diet" AND "nutrition"
hypothyroidism diet plan foods to eat avoid evidence based 2024 2025
~/pcod-meal-plan/generate_hypothyroid_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak
)
# ─── Colors ───────────────────────────────────────────────────────────────────
TEAL = colors.HexColor("#1A7A6E")
LIGHT_TEAL = colors.HexColor("#E4F4F1")
DARK_TEAL = colors.HexColor("#0F4F47")
BLUE = colors.HexColor("#2E6EA6")
LIGHT_BLUE = colors.HexColor("#E8F1FA")
PURPLE = colors.HexColor("#6B4F9E")
LIGHT_PURP = colors.HexColor("#F0EBF9")
ORANGE = colors.HexColor("#D4691E")
LIGHT_ORANGE= colors.HexColor("#FDF0E6")
GREEN = colors.HexColor("#2E7D32")
LIGHT_GREEN = colors.HexColor("#E8F5E9")
RED = colors.HexColor("#C62828")
LIGHT_RED = colors.HexColor("#FDEAEA")
GOLD = colors.HexColor("#B8860B")
LIGHT_GOLD = colors.HexColor("#FDF8E3")
GRAY = colors.HexColor("#555555")
LIGHT_GRAY = colors.HexColor("#F7F7F7")
WHITE = colors.white
BLACK = colors.black
W, H = A4
CW = W - 3*cm
doc = SimpleDocTemplate(
"/tmp/workspace/pcod-meal-plan/Hypothyroidism_Meal_Plan.pdf",
pagesize=A4,
leftMargin=1.5*cm, rightMargin=1.5*cm,
topMargin=1.5*cm, bottomMargin=1.5*cm,
title="Hypothyroidism Meal Plan",
author="Orris Health",
)
def sty(name, **kw):
return ParagraphStyle(name, **kw)
H1 = sty("H1", fontSize=25, textColor=WHITE, alignment=TA_CENTER, fontName="Helvetica-Bold", leading=31)
SUBTITLE= sty("SUB", fontSize=11, textColor=WHITE, alignment=TA_CENTER, fontName="Helvetica", leading=15)
SECTION = sty("SEC", fontSize=13, textColor=WHITE, alignment=TA_LEFT, fontName="Helvetica-Bold", leading=17)
BODY = sty("BODY", fontSize=9, textColor=BLACK, alignment=TA_JUSTIFY, fontName="Helvetica", leading=13, spaceAfter=3)
BODY_B = sty("BODY_B", fontSize=9, textColor=BLACK, alignment=TA_LEFT, fontName="Helvetica-Bold", leading=13)
SMALL = sty("SMALL", fontSize=8, textColor=GRAY, alignment=TA_LEFT, fontName="Helvetica", leading=11)
CELL_H = sty("CELL_H", fontSize=9, textColor=WHITE, alignment=TA_CENTER, fontName="Helvetica-Bold", leading=12)
CELL = sty("CELL", fontSize=8.5,textColor=BLACK, alignment=TA_LEFT, fontName="Helvetica", leading=12)
CELL_C = sty("CELL_C", fontSize=8.5,textColor=BLACK, alignment=TA_CENTER, fontName="Helvetica", leading=12)
DAYHEAD = sty("DAYH", fontSize=10, textColor=WHITE, alignment=TA_CENTER, fontName="Helvetica-Bold", leading=14)
MEAL_L = sty("MEAL_L", fontSize=8, textColor=TEAL, alignment=TA_LEFT, fontName="Helvetica-Bold", leading=11)
MEAL_T = sty("MEAL_T", fontSize=8, textColor=BLACK, alignment=TA_LEFT, fontName="Helvetica", leading=11, spaceAfter=2)
story = []
# ── helpers ────────────────────────────────────────────────────────────────────
def banner(text, sub="", bg=TEAL):
rows = [[Paragraph(text, H1)]]
if sub:
rows.append([Paragraph(sub, SUBTITLE)])
t = Table(rows, colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("ROUNDEDCORNERS",[8]),
("TOPPADDING", (0,0),(-1,-1), 10),
("BOTTOMPADDING", (0,0),(-1,-1), 10),
("LEFTPADDING", (0,0),(-1,-1), 12),
("RIGHTPADDING", (0,0),(-1,-1), 12),
]))
return t
def sec_hdr(text, bg=TEAL):
t = Table([[Paragraph(text, SECTION)]], colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("ROUNDEDCORNERS",[5]),
("TOPPADDING", (0,0),(-1,-1), 7),
("BOTTOMPADDING", (0,0),(-1,-1), 7),
("LEFTPADDING", (0,0),(-1,-1), 12),
]))
return t
def two_col(left_items, right_items,
ltitle="✅ EAT MORE", rtitle="❌ AVOID / LIMIT",
ltc=GREEN, rtc=RED, lbg=LIGHT_GREEN, rbg=LIGHT_RED):
hw = CW/2 - 4
def mk(title, items, hbg, bg):
rows = [[Paragraph(title, sty("TH2", fontSize=10, textColor=WHITE,
fontName="Helvetica-Bold", leading=14,
alignment=TA_CENTER))]]
for item in items:
rows.append([Paragraph(f"• {item}", CELL)])
return rows, hbg, bg
lr, lhbg, lbg2 = mk(ltitle, left_items, ltc, lbg)
rr, rhbg, rbg2 = mk(rtitle, right_items, rtc, rbg)
mx = max(len(lr), len(rr))
while len(lr) < mx: lr.append([""])
while len(rr) < mx: rr.append([""])
merged = [[l[0], r[0]] for l, r in zip(lr, rr)]
t = Table(merged, colWidths=[hw, hw])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(0,0), lhbg),
("BACKGROUND", (1,0),(1,0), rhbg),
("BACKGROUND", (0,1),(0,-1), lbg2),
("BACKGROUND", (1,1),(1,-1), rbg2),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 8),
("RIGHTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "TOP"),
("GRID", (0,0),(-1,-1), 0.3, colors.HexColor("#CCCCCC")),
]))
return t
def recipe_card(title, time_str, servings, ingredients, steps, note="", bg=LIGHT_TEAL, ac=TEAL):
meta = f"⏱ {time_str} | 🍽 {servings}"
ing_text = "\n".join(f"• {i}" for i in ingredients)
step_text = "\n".join(f"{n+1}. {s}" for n,s in enumerate(steps))
content = [
[Paragraph(title, sty("RT2", fontSize=10, textColor=ac,
fontName="Helvetica-Bold", leading=14))],
[Paragraph(meta, SMALL)],
[Paragraph("<b>Ingredients:</b>", BODY_B)],
[Paragraph(ing_text, sty("RB", fontSize=8.5, textColor=BLACK,
fontName="Helvetica", leading=12, spaceAfter=2))],
[Paragraph("<b>Method:</b>", BODY_B)],
[Paragraph(step_text, sty("RS", fontSize=8.5, textColor=BLACK,
fontName="Helvetica", leading=12, spaceAfter=2))],
]
if note:
content.append([Paragraph(f"💡 {note}", SMALL)])
t = Table(content, colWidths=[CW/2 - 6])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 10),
("RIGHTPADDING", (0,0),(-1,-1), 10),
("ROUNDEDCORNERS",[6]),
("BOX", (0,0),(-1,-1), 0.5, ac),
]))
return t
def two_recipes(r1, r2):
t = Table([[r1, r2]], colWidths=[CW/2-4, CW/2-4])
t.setStyle(TableStyle([
("VALIGN", (0,0),(-1,-1), "TOP"),
("LEFTPADDING", (0,0),(-1,-1), 3),
("RIGHTPADDING", (0,0),(-1,-1), 3),
]))
return t
# ══════════════════════════════════════════════════════════════════════════════
# PAGE 1 – COVER + FOOD GUIDE
# ══════════════════════════════════════════════════════════════════════════════
story.append(Spacer(1, 0.4*cm))
story.append(banner(
"🦋 Hypothyroidism Meal Plan",
"A Complete Nutrition Guide for Supporting Healthy Thyroid Function",
bg=TEAL
))
story.append(Spacer(1, 0.4*cm))
intro = (
"Hypothyroidism (underactive thyroid) slows metabolism, causes fatigue, weight gain, and affects "
"nearly every organ system. While <b>levothyroxine</b> remains the cornerstone of treatment, diet plays "
"a powerful supporting role — ensuring adequate supply of thyroid-essential nutrients (iodine, selenium, "
"zinc, iron, vitamin D), reducing inflammation, supporting gut health, and optimizing medication absorption. "
"This plan is built on evidence from a 2024 review in <i>Nutrients</i> (Shulhai et al., PMID: 39125376) "
"and guidelines from the American Thyroid Association."
)
story.append(Paragraph(intro, BODY))
story.append(Spacer(1, 0.3*cm))
# Key goals
goals = [
("🧪", "Support\nThyroid Hormones", "Iodine, selenium\n& zinc daily"),
("🔥", "Reduce\nInflammation", "Anti-inflammatory\nfoods & omega-3"),
("⚖️", "Manage\nWeight", "Fiber-rich, protein-\nfocused meals"),
("💊", "Maximize\nMedication", "Timing & food\ninteractions"),
]
gcells = [
Paragraph(f"<b>{e}</b><br/><b>{t}</b><br/><font size=8>{d}</font>",
sty("GC2", fontSize=9, textColor=DARK_TEAL, alignment=TA_CENTER,
fontName="Helvetica", leading=13))
for e, t, d in goals
]
gtbl = Table([gcells], colWidths=[CW/4]*4)
gtbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), LIGHT_TEAL),
("TOPPADDING", (0,0),(-1,-1), 10),
("BOTTOMPADDING", (0,0),(-1,-1), 10),
("GRID", (0,0),(-1,-1), 0.4, TEAL),
("ROUNDEDCORNERS",[5]),
]))
story.append(gtbl)
story.append(Spacer(1, 0.35*cm))
# ── IMPORTANT MEDICATION NOTE ─────────────────────────────────────────────────
med_note = (
"<b>⚠️ MEDICATION TIMING (Critical):</b> Take levothyroxine on an empty stomach, "
"<b>30–60 minutes BEFORE breakfast</b>. Avoid calcium-rich foods, coffee, high-fiber foods, "
"soy, and antacids within 4 hours of your medication — they all reduce absorption."
)
mntbl = Table([[Paragraph(med_note, sty("MN", fontSize=9, textColor=colors.HexColor("#7B0000"),
fontName="Helvetica", leading=13, alignment=TA_LEFT))]], colWidths=[CW])
mntbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), colors.HexColor("#FFF3CD")),
("TOPPADDING", (0,0),(-1,-1), 8),
("BOTTOMPADDING", (0,0),(-1,-1), 8),
("LEFTPADDING", (0,0),(-1,-1), 12),
("RIGHTPADDING", (0,0),(-1,-1), 12),
("BOX", (0,0),(-1,-1), 1, colors.HexColor("#E0A800")),
("ROUNDEDCORNERS",[4]),
]))
story.append(mntbl)
story.append(Spacer(1, 0.3*cm))
# ── FOOD GUIDE ─────────────────────────────────────────────────────────────────
story.append(sec_hdr("🥗 What to Eat & What to Avoid"))
story.append(Spacer(1, 0.2*cm))
eat = [
"Iodine-rich: iodized salt, seaweed (nori, wakame), fish, dairy (milk, yogurt, eggs)",
"Selenium-rich: Brazil nuts (1–2/day), tuna, sardines, chicken, turkey, cottage cheese",
"Zinc-rich: pumpkin seeds, chickpeas, lentils, beef (lean), cashews",
"Lean proteins: eggs, chicken breast, fish, turkey, paneer, tofu (moderate)",
"Whole grains: oats, brown rice, quinoa, millet, barley — rich in fiber & B vitamins",
"Colorful vegetables: carrots, bell peppers, beets, sweet potato, tomatoes, zucchini",
"Cruciferous veggies (COOKED): broccoli, cauliflower, cabbage — safe when cooked",
"Anti-inflammatory fats: olive oil, avocado, walnuts, flaxseeds, fatty fish",
"Vitamin D sources: sunlight, eggs, fish, fortified milk",
"Iron-rich foods: spinach, lentils, lean red meat (occasional), pumpkin seeds",
"Probiotic foods: Greek yogurt, kefir, idli/dosa batter, kimchi",
"Fruits: berries, pomegranate, kiwi, orange, papaya — antioxidant-rich",
]
avoid = [
"Raw cruciferous in large amounts: raw kale juice, raw cabbage in excess",
"Excess soy products: soy milk, tofu in large daily portions (eat soy 4 hrs away from meds)",
"Gluten (if Hashimoto's): wheat, barley, rye — linked to autoimmune flares",
"Processed & ultra-processed foods: fast food, chips, packaged snacks",
"Excess sugar: sweets, colas, packaged juices, candy, pastries",
"High-fiber foods close to medication: do not eat within 1–2 hrs of taking levothyroxine",
"Coffee/tea near medication: wait at least 30–60 min after taking pills",
"Calcium supplements / antacids near meds: wait 4 hours after medication",
"Excess alcohol: disrupts thyroid hormone metabolism",
"Highly salty processed foods: instant noodles, pickles, chips in excess",
]
story.append(two_col(eat, avoid))
story.append(Spacer(1, 0.3*cm))
# ── KEY NUTRIENTS ──────────────────────────────────────────────────────────────
story.append(sec_hdr("💊 Key Nutrients for Thyroid Health", bg=BLUE))
story.append(Spacer(1, 0.2*cm))
nut_data = [
[Paragraph("Nutrient", CELL_H), Paragraph("Role in Thyroid Function", CELL_H),
Paragraph("Best Food Sources", CELL_H)],
[Paragraph("Iodine", CELL), Paragraph("Essential raw material for T3 & T4 hormone synthesis", CELL),
Paragraph("Iodized salt, seaweed, fish, eggs, dairy", CELL)],
[Paragraph("Selenium", CELL), Paragraph("Converts T4 → active T3; protects thyroid from oxidative damage", CELL),
Paragraph("Brazil nuts (1–2/day), tuna, chicken, cottage cheese", CELL)],
[Paragraph("Zinc", CELL), Paragraph("Required for TSH production & T3/T4 synthesis", CELL),
Paragraph("Pumpkin seeds, chickpeas, lentils, lean meat", CELL)],
[Paragraph("Iron", CELL), Paragraph("Needed for thyroid peroxidase enzyme; deficiency impairs T4 synthesis", CELL),
Paragraph("Spinach, lentils, red meat (occasional), pumpkin seeds", CELL)],
[Paragraph("Vitamin D", CELL), Paragraph("Immune modulator; deficiency linked to Hashimoto's severity", CELL),
Paragraph("Sunlight, eggs, salmon, mackerel, fortified milk", CELL)],
[Paragraph("Omega-3 Fatty Acids", CELL), Paragraph("Reduces autoimmune inflammation; supports cellular thyroid receptor sensitivity", CELL),
Paragraph("Fatty fish, flaxseeds, walnuts, chia seeds", CELL)],
[Paragraph("Vitamin B12", CELL), Paragraph("Often deficient in hypothyroidism; needed for energy & nerve health", CELL),
Paragraph("Eggs, dairy, fish, meat, fortified cereals", CELL)],
[Paragraph("Tyrosine", CELL), Paragraph("Amino acid backbone for thyroid hormone structure (T3/T4)", CELL),
Paragraph("Chicken, turkey, fish, eggs, dairy, almonds", CELL)],
]
ntbl = Table(nut_data, colWidths=[CW*0.20, CW*0.43, CW*0.37])
nstyle = [
("BACKGROUND", (0,0),(-1,0), BLUE),
("GRID", (0,0),(-1,-1), 0.3, colors.HexColor("#CCCCCC")),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "TOP"),
]
for r in range(1, len(nut_data)):
bg = LIGHT_BLUE if r % 2 == 1 else WHITE
nstyle.append(("BACKGROUND", (0,r),(-1,r), bg))
ntbl.setStyle(TableStyle(nstyle))
story.append(ntbl)
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# PAGE 2 – 7-DAY MEAL PLAN
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("📅 7-Day Hypothyroidism Meal Plan"))
story.append(Spacer(1, 0.2*cm))
note_p = Paragraph(
"Each day targets: <b>~1500–1700 kcal</b> | <b>~25–30% protein</b> | "
"<b>~40% complex carbs</b> | <b>~30% healthy fats</b> | <b>28–35g fiber</b>. "
"Take levothyroxine <b>30–60 min before breakfast</b>. "
"Adjust portions to your weight and doctor's advice.",
sty("NOTE2", fontSize=8.5, textColor=GRAY, fontName="Helvetica", leading=12)
)
story.append(note_p)
story.append(Spacer(1, 0.2*cm))
week = [
{
"day": "Monday",
"early": "Take levothyroxine — wait 30–60 min. Then: warm water with lemon",
"breakfast": "Oats porridge (½ cup) with 1 tbsp flaxseeds + 1 tsp cinnamon + berries + low-fat milk | 2 boiled eggs",
"snack1": "1–2 Brazil nuts + 1 small apple",
"lunch": "1 cup brown rice + 1 cup moong dal + palak sabzi + cucumber salad + chaas (no salt)",
"snack2": "Roasted pumpkin seeds (1 tbsp) + 1 orange",
"dinner": "2 whole wheat rotis + grilled chicken/tofu + sautéed carrots & beans + raita",
"bedtime": "Warm turmeric milk (low-fat, no sugar)",
},
{
"day": "Tuesday",
"early": "Levothyroxine — then warm jeera water after 40 min",
"breakfast": "2 moong dal chilla with tomato & spinach filling + 1 cup Greek yogurt (unsweetened)",
"snack1": "Handful of walnuts (5–6) + kiwi (1)",
"lunch": "1 cup quinoa + 1 cup rajma curry + mixed veg sabzi + salad",
"snack2": "Carrot & cucumber sticks with 2 tbsp hummus",
"dinner": "2 bajra/jowar rotis + baked fish (100g) + broccoli & bell pepper stir-fry",
"bedtime": "Chamomile or ginger tea",
},
{
"day": "Wednesday",
"early": "Levothyroxine — then warm water with ½ tsp cinnamon after 40 min",
"breakfast": "Overnight oats (½ cup oats + chia + low-fat milk + berries) + 1 boiled egg",
"snack1": "Papaya cubes (1 cup) + 5 almonds",
"lunch": "2 whole wheat rotis + toor dal + methi sabzi + tomato-onion salad",
"snack2": "Vegetable soup (no cream) + 2 rice cakes",
"dinner": "1 cup brown rice + egg curry (2 eggs) + spinach sabzi",
"bedtime": "Warm turmeric milk",
},
{
"day": "Thursday",
"early": "Levothyroxine — then green tea (30–60 min after meds) + soaked almonds",
"breakfast": "Besan cheela (2) + low-fat dahi + 1 glass low-fat milk",
"snack1": "Mixed nuts (2 Brazil nuts + 4 almonds + seeds)",
"lunch": "1 cup millet khichdi (foxtail/bajra) + raita + salad",
"snack2": "Apple slices + 1 tbsp natural peanut butter",
"dinner": "2 ragi rotis + paneer bhurji (low-fat) + beans sabzi",
"bedtime": "Warm turmeric milk",
},
{
"day": "Friday",
"early": "Levothyroxine — then lemon-ginger warm water after 45 min",
"breakfast": "Poha (1.5 cups, with peas, turmeric, mustard seeds) + 1 boiled egg + green tea",
"snack1": "Guava (1 medium) + pumpkin seeds (1 tbsp)",
"lunch": "2 whole wheat rotis + chana masala + steamed beans & carrots + chaas",
"snack2": "Roasted chana (handful) + 1 small orange",
"dinner": "1 cup brown rice + sardines / grilled tuna (100g) + sautéed spinach",
"bedtime": "Warm low-fat milk with nutmeg",
},
{
"day": "Saturday",
"early": "Levothyroxine — then warm water after 40 min",
"breakfast": "Idli (3, fermented) + sambar (no potato) + coconut chutney (small) + 1 glass low-fat milk",
"snack1": "Strawberries (½ cup) + Greek yogurt (½ cup)",
"lunch": "1 cup cooked quinoa + chicken curry (light, 100g) / tofu curry + green salad",
"snack2": "Dhokla (2–3 pieces) + ginger tea",
"dinner": "2 jowar rotis + palak paneer (low-fat) + cucumber raita",
"bedtime": "Chamomile tea",
},
{
"day": "Sunday",
"early": "Levothyroxine — then warm water + 1 tsp soaked chia seeds after 45 min",
"breakfast": "Vegetable dalia (broken wheat) with flaxseeds + 1 boiled egg + 1 cup low-fat milk",
"snack1": "Mixed fruit bowl (apple, guava, pomegranate — avoid excess banana)",
"lunch": "2 bajra rotis + egg bhurji / soya curry + mixed veg + dal + salad",
"snack2": "Sprout chaat (moong) with lemon & black pepper",
"dinner": "Vegetable moong dal khichdi + baingan raita + side salad",
"bedtime": "Warm turmeric milk (low-fat)",
},
]
meal_labels = [
("🌅 Early Morning", "early"),
("🍳 Breakfast", "breakfast"),
("🍎 Mid-Morning", "snack1"),
("🍱 Lunch", "lunch"),
("🫐 Evening Snack", "snack2"),
("🌙 Dinner", "dinner"),
("💤 Bedtime", "bedtime"),
]
day_colors = [
TEAL, DARK_TEAL, BLUE,
colors.HexColor("#5C6BC0"), GREEN, ORANGE, PURPLE
]
for i, day in enumerate(week):
dc = day_colors[i]
dh = Table([[Paragraph(f" {day['day']}", DAYHEAD)]], colWidths=[CW])
dh.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), dc),
("ROUNDEDCORNERS",[5]),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
("LEFTPADDING", (0,0),(-1,-1), 10),
]))
story.append(dh)
rows = [[Paragraph(lbl, MEAL_L), Paragraph(day[key], MEAL_T)]
for lbl, key in meal_labels]
mt = Table(rows, colWidths=[CW*0.23, CW*0.77])
mt.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0),(-1,-1), [WHITE, LIGHT_GRAY]),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 8),
("RIGHTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "TOP"),
("GRID", (0,0),(-1,-1), 0.2, colors.HexColor("#DDDDDD")),
]))
story.append(mt)
story.append(Spacer(1, 0.25*cm))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# PAGE 3 – RECIPES
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("👩🍳 Thyroid-Friendly Recipes", bg=ORANGE))
story.append(Spacer(1, 0.25*cm))
recipes = [
(
"1. Selenium-Boost Tuna Salad Bowl",
"15 min", "1 serving",
["1 can tuna (drained, 100g)", "1 cup mixed greens (spinach + rocket)",
"½ cup cherry tomatoes", "¼ cucumber, sliced",
"1 boiled egg", "Dressing: olive oil + lemon + garlic + black pepper"],
["Arrange greens in a bowl.",
"Add tuna, tomatoes, cucumber, sliced egg.",
"Whisk dressing and drizzle over.",
"Optionally top with 1 tbsp pumpkin seeds."],
"High selenium (~92 mcg/serving) + iodine + protein. Supports T4→T3 conversion.",
LIGHT_TEAL, TEAL
),
(
"2. Thyroid Power Oats Bowl",
"10 min", "1 serving",
["½ cup rolled oats", "1 cup low-fat milk (iodine source)",
"1 tbsp ground flaxseeds (omega-3)", "½ tsp cinnamon",
"Handful of berries", "1–2 Brazil nuts (chopped, on top)"],
["Cook oats in milk on low heat 5 min.",
"Stir in flaxseeds and cinnamon.",
"Top with berries and chopped Brazil nuts.",
"Eat 40–60 min after taking levothyroxine."],
"1–2 Brazil nuts = full daily selenium need. Milk = iodine. Flax = omega-3.",
LIGHT_BLUE, BLUE
),
(
"3. Egg & Spinach Scramble",
"12 min", "1 serving",
["2 whole eggs + 1 egg white", "1 cup baby spinach",
"½ cup mushrooms (sliced)", "2 garlic cloves",
"½ tsp turmeric, salt, pepper", "1 tsp olive oil"],
["Heat olive oil; sauté garlic 1 min.",
"Add mushrooms and spinach; cook 2 min.",
"Beat eggs with turmeric, salt, pepper.",
"Pour over vegetables; scramble gently on low heat.",
"Serve with 1 slice whole wheat toast."],
"Eggs = iodine + selenium + vitamin D + tyrosine. Spinach = iron.",
LIGHT_GREEN, GREEN
),
(
"4. Anti-Inflammatory Salmon (Grilled)",
"20 min", "1 serving",
["120g salmon fillet", "1 tsp olive oil",
"½ tsp turmeric, ¼ tsp black pepper, garlic powder",
"Lemon juice", "Side: 1 cup roasted broccoli (cooked) + sweet potato"],
["Marinate salmon in olive oil, turmeric, pepper, garlic, lemon — 10 min.",
"Grill or bake at 200°C for 12–15 min.",
"Roast broccoli with olive oil at same temp.",
"Serve with ½ cup mashed sweet potato."],
"Salmon = omega-3 + selenium + vitamin D. Cooked broccoli = safe goitrogen.",
LIGHT_GOLD, GOLD
),
(
"5. Thyroid-Support Lentil Soup",
"30 min", "2 servings",
["1 cup red lentils (masoor dal)", "1 medium carrot, diced",
"1 tomato, chopped", "½ tsp cumin, turmeric, coriander",
"1 tsp olive oil", "4 cups water or vegetable stock",
"Lemon juice + coriander leaves to serve"],
["Heat oil; add cumin seeds, then carrot and tomato — 3 min.",
"Add lentils, spices, and water. Bring to boil.",
"Simmer 20 min until lentils are soft.",
"Blend partially for creamy texture. Adjust salt.",
"Finish with lemon juice and fresh coriander."],
"Iron + zinc + fiber. Lemon juice boosts iron absorption.",
LIGHT_TEAL, TEAL
),
(
"6. Greek Yogurt Parfait",
"5 min", "1 serving",
["¾ cup plain low-fat Greek yogurt",
"½ tsp cinnamon", "1 tsp honey (optional)",
"¼ cup pomegranate seeds / berries",
"1 tbsp walnuts (crushed)", "1 tsp chia seeds"],
["Layer yogurt in a glass or bowl.",
"Top with cinnamon and honey.",
"Add berries, walnuts, and chia seeds.",
"Eat at least 4 hours after morning medication."],
"Yogurt = iodine + probiotics + calcium. Berries = antioxidants. Walnuts = omega-3.",
LIGHT_PURP, PURPLE
),
(
"7. Millet & Vegetable Khichdi",
"35 min", "2 servings",
["½ cup foxtail millet or bajra", "¼ cup yellow moong dal",
"1 cup diced vegetables (carrot, beans, peas, spinach)",
"1 tsp ghee", "Jeera, hing, turmeric, ginger, salt",
"2 cups water"],
["Soak millet and dal 20 min.",
"Heat ghee; add jeera, hing, grated ginger.",
"Add vegetables; sauté 2 min.",
"Add millet, dal, spices, water. Pressure cook 3 whistles.",
"Rest 5 min. Serve warm with lime and coriander."],
"Millets are gluten-free & rich in iron, zinc, magnesium — ideal for Hashimoto's.",
LIGHT_GREEN, GREEN
),
(
"8. Cinnamon-Ginger Detox Smoothie",
"5 min", "1 serving",
["½ cup Greek yogurt (iodine source)", "½ cup frozen berries",
"1 tbsp ground flaxseeds", "½ tsp cinnamon",
"½ inch fresh ginger (grated)", "½ cup low-fat milk or almond milk"],
["Add all ingredients to blender.",
"Blend until smooth.",
"Drink as a snack — NOT near medication timing.",
"Best consumed 4+ hours after morning dose."],
"Cinnamon helps blood sugar. Ginger reduces inflammation. Flax = omega-3.",
LIGHT_ORANGE, ORANGE
),
]
for i in range(0, len(recipes), 2):
r1 = recipe_card(*recipes[i])
if i+1 < len(recipes):
r2 = recipe_card(*recipes[i+1])
story.append(two_recipes(r1, r2))
else:
story.append(r1)
story.append(Spacer(1, 0.25*cm))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# PAGE 4 – TIPS, DRINKS, SNACKS
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("💡 Practical Hypothyroidism Diet Tips"))
story.append(Spacer(1, 0.2*cm))
tips = [
("💊 Medication First", "Take levothyroxine on an empty stomach, 30–60 min BEFORE breakfast. This single habit has the biggest impact on treatment success."),
("🧀 Selenium Every Day", "1–2 Brazil nuts per day covers your full selenium requirement (~55 mcg/day). Selenium activates thyroid hormone (T4 → T3 conversion)."),
("🧂 Use Iodized Salt", "Switch to iodized salt. Iodine deficiency is the leading cause of hypothyroidism globally. Don't over-use, but don't avoid it."),
("🥦 Cook Goitrogenic Vegetables", "Broccoli, cauliflower, cabbage, kale are fine when COOKED — heat deactivates goitrins. Only raw juice in large amounts is a concern."),
("🌾 Prefer Gluten-Free Grains if Hashimoto's", "If you have Hashimoto's thyroiditis, reducing gluten may reduce autoimmune antibodies. Millets, quinoa, rice, and oats (certified GF) are great choices."),
("🍽️ Eat Regular Meals — Never Skip", "Hypothyroidism slows metabolism. Regular meals keep energy stable and prevent overeating. Aim for 3 meals + 2 snacks daily."),
("🥚 Prioritize Protein", "High-quality protein at each meal helps with satiety, muscle preservation, and thyroid enzyme function. Aim 25–30g per meal."),
("☕ Time Your Coffee Carefully", "Coffee significantly reduces levothyroxine absorption. Wait at least 30–60 min after your medication before having coffee or tea."),
("🦠 Support Gut Health", "Gut dysbiosis is linked to Hashimoto's. Eat fermented foods daily — yogurt, buttermilk, idli, dosa. Consider probiotic-rich meals."),
("🏃 Move Daily", "Exercise improves T3 cellular sensitivity and helps counter hypothyroidism weight gain. Aim for 30 min walking + 2x strength training per week."),
]
tip_rows = [[
Paragraph(f"<b>{et}</b>", sty("TT2", fontSize=9, fontName="Helvetica-Bold",
textColor=DARK_TEAL, leading=13)),
Paragraph(desc, BODY)
] for et, desc in tips]
ttbl = Table(tip_rows, colWidths=[CW*0.30, CW*0.70])
ttbl.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0),(-1,-1), [LIGHT_TEAL, WHITE]),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
("LEFTPADDING", (0,0),(-1,-1), 8),
("RIGHTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "TOP"),
("GRID", (0,0),(-1,-1), 0.2, colors.HexColor("#DDDDDD")),
]))
story.append(ttbl)
story.append(Spacer(1, 0.3*cm))
# ── DRINKS ─────────────────────────────────────────────────────────────────────
story.append(sec_hdr("💧 Best Daily Drinks", bg=BLUE))
story.append(Spacer(1, 0.2*cm))
drinks = [
["Drink", "When", "Why It Helps"],
["Warm lemon water", "30 min after meds", "Hydration, vitamin C, digestion boost"],
["Green tea (1–2 cups)", "Mid-morning (NOT near meds)", "Antioxidants; modest metabolic support"],
["Ginger tea", "After meals", "Reduces inflammation, aids digestion"],
["Cinnamon water/tea", "Post-lunch", "Lowers blood sugar, anti-inflammatory"],
["Jeera (cumin) water", "Morning or after meals", "Reduces bloating, digestive aid"],
["Low-fat milk (1 cup)", "With breakfast or bedtime", "Iodine + calcium + vitamin D"],
["Buttermilk / chaas", "With lunch", "Probiotics + calcium, gut health"],
["Turmeric milk (low-fat)", "Bedtime", "Anti-inflammatory, supports sleep"],
["Plain water (2.5–3 L)", "Throughout day", "Counteracts constipation common in hypothyroid"],
]
d_data = [[Paragraph(c, CELL_H if i==0 else (CELL_C if j==1 else CELL))
for j,c in enumerate(row)] for i,row in enumerate(drinks)]
dtbl = Table(d_data, colWidths=[CW*0.27, CW*0.28, CW*0.45])
dstyle = [
("BACKGROUND", (0,0),(-1,0), BLUE),
("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), "TOP"),
("GRID", (0,0),(-1,-1), 0.3, colors.HexColor("#CCCCCC")),
]
for r in range(1, len(drinks)):
dstyle.append(("BACKGROUND", (0,r),(-1,r),
LIGHT_BLUE if r%2==1 else WHITE))
dtbl.setStyle(TableStyle(dstyle))
story.append(dtbl)
story.append(Spacer(1, 0.3*cm))
# ── SNACK IDEAS ─────────────────────────────────────────────────────────────────
story.append(sec_hdr("🍎 Quick Healthy Snack Ideas", bg=GREEN))
story.append(Spacer(1, 0.2*cm))
snacks = [
["✅ 1–2 Brazil nuts + apple", "✅ Greek yogurt + berries + chia", "✅ Roasted pumpkin seeds (1 tbsp)"],
["✅ Tuna on whole wheat crackers", "✅ Boiled egg + black pepper", "✅ Carrot sticks + hummus (2 tbsp)"],
["✅ Mixed nuts (almonds + walnuts)", "✅ Roasted chana (handful)", "✅ Sprout chaat with lemon"],
["✅ Pomegranate seeds + walnuts", "✅ Rice cake + nut butter", "✅ Vegetable soup (no cream)"],
]
stbl = Table(
[[Paragraph(c, CELL) for c in row] for row in snacks],
colWidths=[CW/3]*3
)
stbl.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0),(-1,-1), [WHITE, LIGHT_GREEN]),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
("GRID", (0,0),(-1,-1), 0.2, colors.HexColor("#CCDDCC")),
]))
story.append(stbl)
story.append(Spacer(1, 0.4*cm))
# ── FOOTER ─────────────────────────────────────────────────────────────────────
story.append(HRFlowable(width=CW, thickness=0.5, color=TEAL, spaceAfter=6))
footer = (
"<b>Evidence Sources:</b> Shulhai AM et al. (2024) — The Role of Nutrition on Thyroid Function, "
"<i>Nutrients</i> (PMID: 39125376). Galanty A et al. (2024) — Brassica vegetables and thyroid function: "
"systematic review, <i>Int J Mol Sci</i> (PMID: 38612798). American Thyroid Association clinical guidelines.<br/>"
"⚠️ This plan is for educational purposes. Always follow your doctor's advice on medication and dosing. "
"Consult a registered dietitian for personalized recommendations."
)
story.append(Paragraph(footer, SMALL))
doc.build(story)
print("Hypothyroidism PDF created successfully.")
cd /tmp/workspace/pcod-meal-plan && python generate_hypothyroid_pdf.py 2>&1
ls -lh /tmp/workspace/pcod-meal-plan/Hypothyroidism_Meal_Plan.pdf
Hypothyroidism Meal Plan
PDF Document · PDF
Diet plan for diabetics mellitus and blood pressure same as above you had given what to eat what to not eat and proper diabetic diet in pdf and printable
"type 2 diabetes" AND "dietary intervention"
"hypertension" AND "DASH diet" AND "blood pressure"
diabetes mellitus hypertension diet plan evidence based 2024 2025 foods eat avoid
~/pcod-meal-plan/generate_diabetes_bp_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak
)
# ─── Color Palette ────────────────────────────────────────────────────────────
NAVY = colors.HexColor("#1A3A5C")
BLUE = colors.HexColor("#2563A8")
LIGHT_BLUE = colors.HexColor("#E8F1FA")
TEAL = colors.HexColor("#0E7C7B")
LIGHT_TEAL = colors.HexColor("#E4F5F4")
RED = colors.HexColor("#C0392B")
LIGHT_RED = colors.HexColor("#FDECEA")
GREEN = colors.HexColor("#1E7E34")
LIGHT_GREEN = colors.HexColor("#E8F5E9")
ORANGE = colors.HexColor("#C96A10")
LIGHT_ORANGE= colors.HexColor("#FDF0E4")
PURPLE = colors.HexColor("#6B3FA0")
LIGHT_PURP = colors.HexColor("#F2EDF9")
GOLD = colors.HexColor("#A07800")
LIGHT_GOLD = colors.HexColor("#FDF8E3")
CRIMSON = colors.HexColor("#8B0000")
WARN_BG = colors.HexColor("#FFF8E1")
WARN_BORDER = colors.HexColor("#F9A825")
GRAY = colors.HexColor("#555555")
LIGHT_GRAY = colors.HexColor("#F5F5F5")
WHITE = colors.white
BLACK = colors.black
W, H = A4
CW = W - 3*cm
doc = SimpleDocTemplate(
"/tmp/workspace/pcod-meal-plan/Diabetes_BP_Meal_Plan.pdf",
pagesize=A4,
leftMargin=1.5*cm, rightMargin=1.5*cm,
topMargin=1.5*cm, bottomMargin=1.5*cm,
title="Diabetes & Blood Pressure Meal Plan",
author="Orris Health",
)
def sty(name, **kw):
return ParagraphStyle(name, **kw)
H1 = sty("H1", fontSize=24, textColor=WHITE, alignment=TA_CENTER, fontName="Helvetica-Bold", leading=30)
SUB = sty("SUB", fontSize=10, textColor=WHITE, alignment=TA_CENTER, fontName="Helvetica", leading=15)
SEC = sty("SEC", fontSize=13, textColor=WHITE, alignment=TA_LEFT, fontName="Helvetica-Bold", leading=17)
BODY = sty("BOD", fontSize=9, textColor=BLACK, alignment=TA_JUSTIFY, fontName="Helvetica", leading=13, spaceAfter=3)
BODY_B = sty("BODB", fontSize=9, textColor=BLACK, alignment=TA_LEFT, fontName="Helvetica-Bold", leading=13)
SMALL = sty("SM", fontSize=8, textColor=GRAY, alignment=TA_LEFT, fontName="Helvetica", leading=11)
CELL_H = sty("CHD", fontSize=9, textColor=WHITE, alignment=TA_CENTER, fontName="Helvetica-Bold", leading=12)
CELL = sty("CEL", fontSize=8.5,textColor=BLACK, alignment=TA_LEFT, fontName="Helvetica", leading=12)
CELL_C = sty("CLC", fontSize=8.5,textColor=BLACK, alignment=TA_CENTER, fontName="Helvetica", leading=12)
DAYHEAD = sty("DYH", fontSize=10, textColor=WHITE, alignment=TA_CENTER, fontName="Helvetica-Bold", leading=14)
MEAL_L = sty("MLL", fontSize=8, textColor=NAVY, alignment=TA_LEFT, fontName="Helvetica-Bold", leading=11)
MEAL_T = sty("MLT", fontSize=8, textColor=BLACK, alignment=TA_LEFT, fontName="Helvetica", leading=11, spaceAfter=2)
WARN_T = sty("WRT", fontSize=9, textColor=CRIMSON, alignment=TA_LEFT, fontName="Helvetica", leading=13)
story = []
# ── HELPERS ────────────────────────────────────────────────────────────────────
def banner(text, sub="", bg=NAVY):
rows = [[Paragraph(text, H1)]]
if sub:
rows.append([Paragraph(sub, SUB)])
t = Table(rows, colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("ROUNDEDCORNERS",[8]),
("TOPPADDING", (0,0),(-1,-1), 10),
("BOTTOMPADDING", (0,0),(-1,-1), 10),
("LEFTPADDING", (0,0),(-1,-1), 12),
("RIGHTPADDING", (0,0),(-1,-1), 12),
]))
return t
def sec_hdr(text, bg=NAVY):
t = Table([[Paragraph(text, SEC)]], colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("ROUNDEDCORNERS",[5]),
("TOPPADDING", (0,0),(-1,-1), 7),
("BOTTOMPADDING", (0,0),(-1,-1), 7),
("LEFTPADDING", (0,0),(-1,-1), 12),
]))
return t
def warn_box(text, bg=WARN_BG, bc=WARN_BORDER, tc=CRIMSON):
t = Table([[Paragraph(text, sty("W2", fontSize=9, textColor=tc,
fontName="Helvetica", leading=13,
alignment=TA_LEFT))]], colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("TOPPADDING", (0,0),(-1,-1), 8),
("BOTTOMPADDING", (0,0),(-1,-1), 8),
("LEFTPADDING", (0,0),(-1,-1), 12),
("RIGHTPADDING", (0,0),(-1,-1), 12),
("BOX", (0,0),(-1,-1), 1, bc),
("ROUNDEDCORNERS",[4]),
]))
return t
def two_col(left_items, right_items,
ltitle="✅ EAT MORE", rtitle="❌ AVOID / LIMIT",
ltc=GREEN, rtc=RED, lbg=LIGHT_GREEN, rbg=LIGHT_RED):
hw = CW/2 - 4
def mk(title, items, hbg, bg):
rows = [[Paragraph(title, sty("TH3", fontSize=10, textColor=WHITE,
fontName="Helvetica-Bold", leading=14,
alignment=TA_CENTER))]]
for item in items:
rows.append([Paragraph(f"• {item}", CELL)])
return rows, hbg, bg
lr, lhbg, lbg2 = mk(ltitle, left_items, ltc, lbg)
rr, rhbg, rbg2 = mk(rtitle, right_items, rtc, rbg)
mx = max(len(lr), len(rr))
while len(lr) < mx: lr.append([""])
while len(rr) < mx: rr.append([""])
merged = [[l[0], r[0]] for l, r in zip(lr, rr)]
t = Table(merged, colWidths=[hw, hw])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(0,0), lhbg),
("BACKGROUND", (1,0),(1,0), rhbg),
("BACKGROUND", (0,1),(0,-1), lbg2),
("BACKGROUND", (1,1),(1,-1), rbg2),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 8),
("RIGHTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "TOP"),
("GRID", (0,0),(-1,-1), 0.3, colors.HexColor("#CCCCCC")),
]))
return t
def recipe_card(title, time_str, servings, ingredients, steps, note="", bg=LIGHT_BLUE, ac=BLUE):
ing_text = "\n".join(f"• {i}" for i in ingredients)
step_text = "\n".join(f"{n+1}. {s}" for n,s in enumerate(steps))
content = [
[Paragraph(title, sty("RT3", fontSize=10, textColor=ac,
fontName="Helvetica-Bold", leading=14))],
[Paragraph(f"⏱ {time_str} | 🍽 {servings}", SMALL)],
[Paragraph("<b>Ingredients:</b>", BODY_B)],
[Paragraph(ing_text, sty("RBI", fontSize=8.5, textColor=BLACK,
fontName="Helvetica", leading=12, spaceAfter=2))],
[Paragraph("<b>Method:</b>", BODY_B)],
[Paragraph(step_text, sty("RBS", fontSize=8.5, textColor=BLACK,
fontName="Helvetica", leading=12, spaceAfter=2))],
]
if note:
content.append([Paragraph(f"💡 {note}", SMALL)])
t = Table(content, colWidths=[CW/2 - 6])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 10),
("RIGHTPADDING", (0,0),(-1,-1), 10),
("ROUNDEDCORNERS",[6]),
("BOX", (0,0),(-1,-1), 0.5, ac),
]))
return t
def two_recipes(r1, r2):
t = Table([[r1, r2]], colWidths=[CW/2-4, CW/2-4])
t.setStyle(TableStyle([
("VALIGN", (0,0),(-1,-1), "TOP"),
("LEFTPADDING", (0,0),(-1,-1), 3),
("RIGHTPADDING",(0,0),(-1,-1), 3),
]))
return t
# ══════════════════════════════════════════════════════════════════════════════
# PAGE 1 — COVER + FOOD GUIDE
# ══════════════════════════════════════════════════════════════════════════════
story.append(Spacer(1, 0.4*cm))
story.append(banner(
"🩺 Diabetes & Blood Pressure\nMeal Plan",
"An Evidence-Based Nutrition Guide for Managing Diabetes Mellitus & Hypertension Together",
bg=NAVY
))
story.append(Spacer(1, 0.4*cm))
intro = (
"Diabetes mellitus (DM) and hypertension (HTN) commonly co-exist — up to <b>75% of people with Type 2 "
"diabetes also have high blood pressure</b>. Together they dramatically raise cardiovascular risk. "
"The <b>DASH diet</b> (Dietary Approaches to Stop Hypertension) is endorsed by the AHA, ACC, ADA, and "
"NIH as the #1 diet for both conditions — rated Best Diet for High Blood Pressure AND Best Diet for "
"Diabetes by U.S. News 2025. A 2025 Cochrane Review (Bensaaud et al., PMID: 40326569) confirmed "
"DASH reduces systolic BP by 1–13 mmHg. A 2025 meta-analysis (Lan et al., PMID: 40419389) confirmed "
"reduced carbohydrate intake significantly improves HbA1c and insulin resistance in Type 2 DM."
)
story.append(Paragraph(intro, BODY))
story.append(Spacer(1, 0.3*cm))
# 4 Key Goals
goals = [
("🩸", "Control\nBlood Sugar", "Low GI carbs\n& high fiber"),
("❤️", "Lower\nBlood Pressure", "DASH diet:\nlow sodium"),
("⚖️", "Manage\nWeight", "Calorie-aware\n& portion control"),
("🫀", "Protect\nHeart Health", "Omega-3 fats\n& antioxidants"),
]
gcells = [
Paragraph(f"<b>{e}</b><br/><b>{t}</b><br/><font size=8>{d}</font>",
sty("GC3", fontSize=9, textColor=NAVY, alignment=TA_CENTER,
fontName="Helvetica", leading=13))
for e, t, d in goals
]
gtbl = Table([gcells], colWidths=[CW/4]*4)
gtbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), LIGHT_BLUE),
("TOPPADDING", (0,0),(-1,-1), 10),
("BOTTOMPADDING", (0,0),(-1,-1), 10),
("GRID", (0,0),(-1,-1), 0.4, BLUE),
("ROUNDEDCORNERS",[5]),
]))
story.append(gtbl)
story.append(Spacer(1, 0.3*cm))
# Critical Notes
story.append(warn_box(
"⚠️ CRITICAL REMINDERS:\n"
"• Diabetes: Monitor blood glucose regularly. Never skip meals if on insulin or sulphonylureas — risk of hypoglycemia.\n"
"• Blood Pressure: Limit sodium to <1,500–2,300 mg/day. Avoid adding extra salt. Check food labels.\n"
"• Take all medications as prescribed. This diet SUPPORTS medication — it does not replace it.\n"
"• If you are on ACE inhibitors or ARBs, moderate high-potassium foods and discuss with your doctor."
))
story.append(Spacer(1, 0.3*cm))
# ── FOOD GUIDE ─────────────────────────────────────────────────────────────────
story.append(sec_hdr("🥗 What to Eat & What to Avoid"))
story.append(Spacer(1, 0.2*cm))
eat = [
"Non-starchy vegetables: spinach, broccoli, capsicum, cucumber, tomato, cauliflower, beans",
"Whole grains (low GI): oats, brown rice, quinoa, barley, millets (jowar, bajra, ragi)",
"Legumes & pulses: dal, rajma, chana, moong, lentils — high fiber + plant protein",
"Lean proteins: eggs (whites), chicken breast, fish (especially salmon, mackerel), tofu",
"Healthy fats: olive oil, avocado, walnuts, almonds, flaxseeds, chia seeds",
"Low-fat dairy: Greek yogurt (unsweetened), skimmed milk, low-fat paneer, buttermilk",
"Low-GI fruits: berries, apple, guava, pear, pomegranate, kiwi — in controlled portions",
"High-potassium foods (for BP): banana (small), sweet potato, spinach, avocado, tomatoes",
"High-magnesium foods: nuts, seeds, dark leafy greens, whole grains, legumes",
"Anti-inflammatory spices: turmeric, garlic, ginger, cinnamon, fenugreek (methi)",
"Fermented foods: yogurt, buttermilk, idli, dosa — gut microbiome support",
"Heart-healthy fish: fatty fish 2x/week (salmon, sardines, mackerel, tuna)",
]
avoid = [
"White rice, maida (white flour), white bread — high GI, blood sugar spikes",
"Added sugars: mithai, cold drinks, fruit juices, biscuits, ice cream, candy",
"High-sodium foods: papad, pickles, instant noodles, salted chips, processed meats",
"Trans fats & saturated fats: bakery items, fast food, full-fat ghee in excess, cream",
"Processed & packaged snacks — high in sodium, sugar, and refined carbs",
"Red & processed meats (daily): sausages, bacon, salami, organ meats",
"Full-fat dairy in excess: butter, cream, full-fat cheese",
"Alcohol: raises blood pressure, disrupts blood sugar control",
"High-GI fruits in large amounts: mango, banana (large), grapes, chikoo, litchi",
"Coconut oil & palm oil — high saturated fat, worsens cardiovascular risk",
"Frying — deep fried snacks add excess calories and saturated fat",
"Skipping meals — causes blood sugar crashes; dangerous if on insulin/sulphonylureas",
]
story.append(two_col(eat, avoid))
story.append(Spacer(1, 0.3*cm))
# ── THE PLATE METHOD ──────────────────────────────────────────────────────────
story.append(sec_hdr("🍽️ The Diabetes Plate Method (Every Meal)", bg=TEAL))
story.append(Spacer(1, 0.2*cm))
plate_data = [
[Paragraph("Section", CELL_H), Paragraph("What to Fill It With", CELL_H),
Paragraph("Why", CELL_H)],
[Paragraph("½ Plate\n(Non-starchy Veg)", sty("PL", fontSize=9, fontName="Helvetica-Bold",
textColor=GREEN, leading=12)),
Paragraph("Spinach, broccoli, capsicum, cucumber, tomato, beans, cauliflower", CELL),
Paragraph("Low calorie, high fiber, rich in potassium & magnesium — lowers BP & controls BG", CELL)],
[Paragraph("¼ Plate\n(Lean Protein)", sty("PL2", fontSize=9, fontName="Helvetica-Bold",
textColor=BLUE, leading=12)),
Paragraph("Eggs, chicken breast, fish, tofu, dal, paneer (low-fat)", CELL),
Paragraph("Slows glucose absorption, preserves muscle, promotes satiety", CELL)],
[Paragraph("¼ Plate\n(Complex Carbs)", sty("PL3", fontSize=9, fontName="Helvetica-Bold",
textColor=ORANGE, leading=12)),
Paragraph("Brown rice, whole wheat roti, millets, oats, quinoa, sweet potato", CELL),
Paragraph("Low GI carbs cause slower glucose rise; fiber content aids BP management", CELL)],
[Paragraph("Side: Healthy Fat", sty("PL4", fontSize=9, fontName="Helvetica-Bold",
textColor=GOLD, leading=12)),
Paragraph("1 tsp olive oil in cooking, handful of nuts, avocado slices", CELL),
Paragraph("Lowers LDL cholesterol, reduces cardiovascular risk in DM+HTN", CELL)],
]
ptbl = Table(plate_data, colWidths=[CW*0.22, CW*0.44, CW*0.34])
pstyle = [
("BACKGROUND", (0,0),(-1,0), TEAL),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
("LEFTPADDING", (0,0),(-1,-1), 8),
("RIGHTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "TOP"),
("GRID", (0,0),(-1,-1), 0.3, colors.HexColor("#CCCCCC")),
]
for r in range(1, len(plate_data)):
pstyle.append(("BACKGROUND", (0,r),(-1,r), LIGHT_TEAL if r%2==1 else WHITE))
ptbl.setStyle(TableStyle(pstyle))
story.append(ptbl)
story.append(Spacer(1, 0.3*cm))
# ── KEY NUTRIENTS ──────────────────────────────────────────────────────────────
story.append(sec_hdr("💊 Key Nutrients for Diabetes & Blood Pressure", bg=PURPLE))
story.append(Spacer(1, 0.2*cm))
nut_data = [
[Paragraph("Nutrient", CELL_H), Paragraph("Role", CELL_H),
Paragraph("Condition", CELL_H), Paragraph("Best Sources", CELL_H)],
[Paragraph("Dietary Fiber", CELL), Paragraph("Slows glucose absorption; lowers LDL & BP", CELL),
Paragraph("DM + HTN", CELL_C), Paragraph("Oats, legumes, vegetables, fruits, chia", CELL)],
[Paragraph("Potassium", CELL), Paragraph("Counteracts sodium; relaxes blood vessels; lowers BP", CELL),
Paragraph("HTN", CELL_C), Paragraph("Sweet potato, banana, spinach, avocado, tomato", CELL)],
[Paragraph("Magnesium", CELL), Paragraph("Improves insulin sensitivity; reduces BP", CELL),
Paragraph("DM + HTN", CELL_C), Paragraph("Nuts, seeds, leafy greens, whole grains, legumes", CELL)],
[Paragraph("Omega-3 Fatty Acids", CELL), Paragraph("Lowers triglycerides; reduces inflammation; protects heart", CELL),
Paragraph("DM + HTN", CELL_C), Paragraph("Salmon, mackerel, flaxseeds, walnuts, chia", CELL)],
[Paragraph("Chromium", CELL), Paragraph("Enhances insulin action; improves glucose tolerance", CELL),
Paragraph("DM", CELL_C), Paragraph("Broccoli, whole grains, eggs, nuts", CELL)],
[Paragraph("Calcium", CELL), Paragraph("Supports vessel contraction; modest BP lowering effect", CELL),
Paragraph("HTN", CELL_C), Paragraph("Low-fat dairy, leafy greens, sesame seeds, tofu", CELL)],
[Paragraph("Vitamin D", CELL), Paragraph("Improves insulin sensitivity; linked to BP regulation", CELL),
Paragraph("DM + HTN", CELL_C), Paragraph("Sunlight, eggs, fish, fortified milk", CELL)],
[Paragraph("Coenzyme Q10", CELL), Paragraph("Antioxidant; mild BP lowering; supports heart muscle", CELL),
Paragraph("HTN", CELL_C), Paragraph("Fatty fish, organ meat (small), spinach, broccoli", CELL)],
]
ntbl = Table(nut_data, colWidths=[CW*0.19, CW*0.36, CW*0.14, CW*0.31])
nstyle = [
("BACKGROUND", (0,0),(-1,0), PURPLE),
("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), "TOP"),
("GRID", (0,0),(-1,-1), 0.3, colors.HexColor("#CCCCCC")),
]
for r in range(1, len(nut_data)):
nstyle.append(("BACKGROUND", (0,r),(-1,r), LIGHT_PURP if r%2==1 else WHITE))
ntbl.setStyle(TableStyle(nstyle))
story.append(ntbl)
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# PAGE 2 — 7-DAY MEAL PLAN
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("📅 7-Day Diabetes & Blood Pressure Meal Plan"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Each day: <b>~1600–1800 kcal</b> | <b>~30% protein</b> | <b>~40% complex carbs (low GI)</b> | "
"<b>~30% healthy fats</b> | <b>30–40g fiber</b> | <b>Sodium <1,500–2,300 mg</b> | "
"<b>NO added salt at table</b>. Take medications as prescribed.",
sty("NP", fontSize=8.5, textColor=GRAY, fontName="Helvetica", leading=12)
))
story.append(Spacer(1, 0.2*cm))
week = [
{
"day": "Monday",
"early": "Warm water + ½ tsp cinnamon + lemon. Check blood glucose if monitoring.",
"breakfast": "Vegetable oats (½ cup rolled oats + carrot + peas) + 2 boiled eggs + 1 cup low-fat buttermilk",
"snack1": "10 almonds + 1 small apple (avoid juice)",
"lunch": "2 whole wheat rotis + 1 cup moong/masoor dal + spinach sabzi + salad (no salt, use lemon) + chaas",
"snack2": "Handful roasted pumpkin seeds + 1 small guava",
"dinner": "1 cup brown rice + grilled chicken / tofu (100g) + sautéed broccoli & capsicum + cucumber raita",
"bedtime": "Warm turmeric milk (low-fat, no sugar, pinch cinnamon)",
},
{
"day": "Tuesday",
"early": "Methi seeds water (1 tsp soaked overnight). Check BP if monitoring.",
"breakfast": "2 moong dal chilla with tomato-spinach filling + 1 cup unsweetened Greek yogurt",
"snack1": "5 walnuts + 1 kiwi",
"lunch": "1 cup quinoa + 1 cup rajma (no excess salt) + mixed veg sabzi + green salad",
"snack2": "Carrot & cucumber sticks + 2 tbsp hummus (low-salt)",
"dinner": "2 bajra rotis + baked/grilled fish (100g salmon/tuna) + steamed beans & tomato",
"bedtime": "Chamomile or hibiscus tea (hibiscus lowers BP)",
},
{
"day": "Wednesday",
"early": "Warm jeera water + lemon",
"breakfast": "Overnight oats (½ cup oats + chia + low-fat milk + berries) + 1 boiled egg",
"snack1": "Pomegranate seeds (½ cup) + 5 almonds",
"lunch": "2 whole wheat rotis + chana masala (no excess salt) + methi sabzi + onion-tomato salad",
"snack2": "Vegetable soup (homemade, no cream, low sodium)",
"dinner": "1 cup cooked millets (foxtail/bajra) + egg bhurji (2 eggs) + palak sabzi",
"bedtime": "Warm turmeric milk (low-fat)",
},
{
"day": "Thursday",
"early": "Green tea (no sugar) + soaked almonds (6)",
"breakfast": "Besan cheela (2, minimal oil) + low-fat dahi (unsweetened) + 1 glass skimmed milk",
"snack1": "1 small pear + 1 tbsp flaxseeds (sprinkled on yogurt)",
"lunch": "1 cup brown rice + toor dal + bhindi sabzi + salad + chaas",
"snack2": "Apple slices + 1 tbsp natural peanut butter (no added salt/sugar)",
"dinner": "2 ragi rotis + low-fat paneer bhurji + beans & carrot sabzi",
"bedtime": "Warm low-fat milk with nutmeg (no sugar)",
},
{
"day": "Friday",
"early": "Lemon-ginger warm water",
"breakfast": "Poha (1.5 cups, with peas, turmeric, mustard seeds, no salt added) + 1 boiled egg + green tea",
"snack1": "Roasted chana (handful) + 1 small orange",
"lunch": "2 whole wheat rotis + kidney bean curry (low sodium) + steamed cauliflower + salad",
"snack2": "Moong sprout chaat (lemon + jeera, no salt) + buttermilk",
"dinner": "1 cup brown rice + grilled mackerel/sardines (100g) + sautéed spinach & garlic",
"bedtime": "Hibiscus or chamomile tea",
},
{
"day": "Saturday",
"early": "Warm water + 1 tsp soaked chia seeds",
"breakfast": "Idli (3, fermented) + low-salt sambar + small coconut chutney + 1 cup skimmed milk",
"snack1": "Mixed berries (½ cup) + Greek yogurt (unsweetened)",
"lunch": "1 cup quinoa + chicken curry (light gravy, minimal salt) / tofu curry + green salad",
"snack2": "Dhokla (2 pieces, steamed not fried) + ginger-lemon tea (no sugar)",
"dinner": "2 jowar rotis + palak paneer (low-fat, low sodium) + cucumber raita",
"bedtime": "Warm turmeric milk",
},
{
"day": "Sunday",
"early": "Warm water with cinnamon + lemon",
"breakfast": "Vegetable dalia (broken wheat, with flaxseeds) + 2 boiled eggs + 1 cup low-fat milk",
"snack1": "Mixed fruit bowl (apple, guava, papaya — measured portion ~½ cup)",
"lunch": "2 bajra/jowar rotis + fish curry (low sodium) / soya masala + dal + salad",
"snack2": "Roasted makhana (fox nuts, 1 cup — unsalted)",
"dinner": "Moong dal khichdi (1 cup, with ghee ½ tsp) + low-fat raita + side salad",
"bedtime": "Warm turmeric milk (low-fat)",
},
]
meal_labels = [
("🌅 Early Morning", "early"),
("🍳 Breakfast", "breakfast"),
("🍎 Mid-Morning", "snack1"),
("🍱 Lunch", "lunch"),
("🫐 Evening Snack", "snack2"),
("🌙 Dinner", "dinner"),
("💤 Bedtime", "bedtime"),
]
day_colors = [NAVY, BLUE, TEAL, PURPLE, GREEN, ORANGE, colors.HexColor("#5C3A8C")]
for i, day in enumerate(week):
dc = day_colors[i]
dh = Table([[Paragraph(f" {day['day']}", DAYHEAD)]], colWidths=[CW])
dh.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), dc),
("ROUNDEDCORNERS",[5]),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
("LEFTPADDING", (0,0),(-1,-1), 10),
]))
story.append(dh)
rows = [[Paragraph(lbl, MEAL_L), Paragraph(day[key], MEAL_T)]
for lbl, key in meal_labels]
mt = Table(rows, colWidths=[CW*0.23, CW*0.77])
mt.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0),(-1,-1), [WHITE, LIGHT_BLUE]),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 8),
("RIGHTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "TOP"),
("GRID", (0,0),(-1,-1), 0.2, colors.HexColor("#DDDDDD")),
]))
story.append(mt)
story.append(Spacer(1, 0.25*cm))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# PAGE 3 — RECIPES
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("👩🍳 Diabetes & BP-Friendly Recipes", bg=TEAL))
story.append(Spacer(1, 0.25*cm))
recipes = [
(
"1. Oats Vegetable Upma (No Salt)",
"20 min", "1 serving",
["½ cup rolled oats", "½ cup mixed vegetables (carrot, peas, beans)",
"1 small onion (chopped)", "½ tsp mustard seeds, ¼ tsp turmeric",
"1 tsp olive oil", "Lemon juice (instead of salt)", "Coriander to garnish"],
["Heat oil; add mustard seeds until they splutter.",
"Add onion; sauté 2 min. Add vegetables & turmeric.",
"Add oats; mix well. Add ½ cup water.",
"Cook 3–4 min stirring. Add lemon juice.",
"Garnish with coriander. Eat with low-fat dahi."],
"Oats: soluble fiber (beta-glucan) lowers LDL, slows glucose absorption, and reduces BP.",
LIGHT_TEAL, TEAL
),
(
"2. Salmon & Spinach Salad Bowl",
"20 min", "1 serving",
["100g grilled salmon fillet", "2 cups baby spinach",
"½ cup cherry tomatoes", "¼ avocado (sliced)",
"1 tbsp pumpkin seeds",
"Dressing: 1 tsp olive oil + lemon + garlic + black pepper (no salt)"],
["Grill salmon with pepper, garlic, and lemon — 12 min.",
"Arrange spinach, tomatoes, avocado in bowl.",
"Flake salmon on top; add pumpkin seeds.",
"Drizzle olive oil-lemon dressing. Toss."],
"Omega-3 (salmon) + potassium (spinach, avocado) + magnesium (pumpkin seeds) = BP + DM combo.",
LIGHT_BLUE, BLUE
),
(
"3. Rajma (Kidney Bean) Curry — Low Sodium",
"35 min", "3 servings",
["1 cup cooked rajma (kidney beans)", "1 large tomato, blended",
"1 onion, finely chopped", "2 garlic cloves + ½ inch ginger",
"½ tsp each: cumin, coriander, turmeric, garam masala",
"1 tsp olive oil. NO added salt — use lemon/amchur for tang"],
["Heat oil; sauté onion, garlic, ginger until golden.",
"Add blended tomato; cook 5 min.",
"Add spices; cook 2 min.",
"Add rajma + ½ cup water; simmer 10 min.",
"Finish with lemon juice and coriander."],
"Rajma: 7g fiber + plant protein per serving. Fiber slows glucose & BP spike post-meal.",
LIGHT_GREEN, GREEN
),
(
"4. Ragi (Finger Millet) Roti",
"20 min", "4 rotis",
["1 cup ragi flour", "¼ cup warm water (approximately)",
"½ tsp ajwain (carom seeds)", "1 tbsp finely chopped methi leaves",
"Minimal olive oil for cooking"],
["Mix ragi flour, ajwain, methi with warm water.",
"Knead to smooth dough (add water gradually).",
"Divide into 4 balls; roll thin on floured board.",
"Cook on hot tawa 2 min each side.",
"Brush lightly with ½ tsp olive oil."],
"Ragi: rich in calcium, iron, magnesium; low GI; gluten-free. Ideal for DM + HTN.",
LIGHT_GOLD, GOLD
),
(
"5. Hibiscus-Cinnamon Cold Brew Tea (BP Lowering)",
"5 min + overnight", "2 glasses",
["2 tbsp dried hibiscus flowers (or 2 hibiscus tea bags)",
"1 cinnamon stick", "2 cups cold water",
"Squeeze of lemon juice", "Ice cubes"],
["Combine hibiscus, cinnamon stick, and cold water in jar.",
"Refrigerate overnight (cold brew, no boiling).",
"Strain; add lemon juice and ice.",
"Drink 1 glass daily in the morning or evening."],
"Hibiscus lowers systolic BP ~7 mmHg (RCT evidence). Cinnamon improves insulin sensitivity.",
LIGHT_ORANGE, ORANGE
),
(
"6. Moong Dal Chilla (Protein Pancake)",
"20 min", "2 servings",
["1 cup moong dal (soaked 4 hrs)", "Handful spinach",
"½ tsp ginger-green chilli paste",
"¼ tsp turmeric, jeera. NO salt — add lemon",
"Olive oil spray"],
["Blend soaked dal to smooth batter.",
"Mix in spinach, ginger paste, spices.",
"Heat non-stick pan, spray oil, pour batter.",
"Cook 2 min each side until golden.",
"Serve with green chutney (no-salt version)."],
"~14g protein/serving. Low GI. No sodium. Perfect for DM + HTN breakfast.",
LIGHT_TEAL, TEAL
),
(
"7. Overnight Chia-Oat Pudding",
"5 min + overnight", "1 serving",
["¼ cup rolled oats", "1 tbsp chia seeds",
"1 cup skimmed milk or unsweetened almond milk",
"½ tsp cinnamon", "¼ cup mixed berries",
"1 tsp walnuts (crushed)"],
["Combine oats, chia, milk, cinnamon in a jar.",
"Stir well; seal; refrigerate overnight.",
"In the morning, top with berries and walnuts.",
"Eat without added sugar — naturally sweet from berries."],
"~8g protein, ~7g fiber. Low sodium, low GI. Beta-glucan in oats lowers BP & BG.",
LIGHT_PURP, PURPLE
),
(
"8. Garlic-Turmeric Lentil Soup",
"25 min", "2 servings",
["1 cup red lentils (masoor dal)", "4 garlic cloves (minced)",
"1 tomato (chopped)", "1 carrot (diced)",
"½ tsp cumin, turmeric, black pepper",
"1 tsp olive oil. No added salt — use lemon",
"4 cups water"],
["Heat oil; sauté garlic until golden (1 min).",
"Add carrot, tomato; cook 3 min.",
"Add lentils, spices, and water; bring to boil.",
"Simmer 20 min until lentils are soft.",
"Finish with lemon juice and black pepper."],
"Garlic: proven BP-lowering agent. Lentils: fiber + plant protein. Zero added sodium.",
LIGHT_GREEN, GREEN
),
]
for i in range(0, len(recipes), 2):
r1 = recipe_card(*recipes[i])
if i+1 < len(recipes):
r2 = recipe_card(*recipes[i+1])
story.append(two_recipes(r1, r2))
else:
story.append(r1)
story.append(Spacer(1, 0.25*cm))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# PAGE 4 — TIPS, DRINKS, SNACKS
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("💡 Practical Tips for Diabetes & Blood Pressure"))
story.append(Spacer(1, 0.2*cm))
tips = [
("🩺 Monitor Regularly", "Check blood glucose before/after meals if prescribed. Check BP at same time each day. Log results to share with your doctor."),
("🍽️ Never Skip Meals", "Skipping meals causes blood sugar crashes (dangerous on insulin or sulphonylureas) and causes rebound overeating that spikes BP and BG."),
("🧂 Radically Reduce Sodium", "Target <1,500 mg sodium/day. Remove table salt. Avoid pickles, papad, chips, canned foods. Use lemon, herbs, garlic, and spices instead."),
("🌾 Choose Low-GI Every Time", "Every time you choose brown rice over white, whole wheat over maida, or oats over cornflakes — you are lowering your blood sugar response by 30–50%."),
("🧄 Eat Garlic Daily", "2–3 raw or cooked garlic cloves daily is supported by clinical evidence to reduce systolic BP by ~3–8 mmHg over time."),
("🫐 Eat the Rainbow", "Different colored vegetables provide different antioxidants, potassium, magnesium, and nitrates — all of which reduce oxidative stress and BP."),
("🏋️ Exercise is Non-Negotiable", "150 min/week of moderate activity (brisk walk + 2x strength training) improves insulin sensitivity and lowers BP as effectively as some medications."),
("🍷 No Alcohol", "Alcohol raises BP acutely, disrupts blood sugar control, interacts with diabetes medications, and adds empty calories. Avoid completely."),
("☕ Limit Coffee & Caffeine", "Caffeine can transiently raise BP. Limit to 1–2 cups/day, not on empty stomach. Switch to green tea or hibiscus tea for better BP outcomes."),
("⚖️ Lose Even 5% Body Weight", "Losing 5–10% of body weight reduces HbA1c by 0.5–1% and systolic BP by 5–10 mmHg. Modest calorie deficit (300 kcal/day below maintenance) achieves this safely."),
]
tip_rows = [[
Paragraph(f"<b>{et}</b>", sty("TP3", fontSize=9, fontName="Helvetica-Bold",
textColor=NAVY, leading=13)),
Paragraph(desc, BODY)
] for et, desc in tips]
ttbl = Table(tip_rows, colWidths=[CW*0.30, CW*0.70])
ttbl.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0),(-1,-1), [LIGHT_BLUE, WHITE]),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
("LEFTPADDING", (0,0),(-1,-1), 8),
("RIGHTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "TOP"),
("GRID", (0,0),(-1,-1), 0.2, colors.HexColor("#DDDDDD")),
]))
story.append(ttbl)
story.append(Spacer(1, 0.3*cm))
# ── DRINKS ─────────────────────────────────────────────────────────────────────
story.append(sec_hdr("💧 Best Daily Drinks", bg=TEAL))
story.append(Spacer(1, 0.2*cm))
drinks = [
["Drink", "When", "Why It Helps"],
["Warm lemon water (no sugar)", "First thing AM", "Alkaline, vitamin C, digestion; no glucose spike"],
["Hibiscus tea (2 cups/day)", "Morning & evening", "Lowers systolic BP ~7 mmHg (RCT evidence)"],
["Cinnamon water/tea", "Post-lunch", "Reduces post-meal blood sugar spike"],
["Green tea (1–2 cups)", "Mid-morning", "Antioxidants; improves insulin sensitivity"],
["Methi (fenugreek) seed water", "Early morning", "Improves insulin sensitivity, lowers BG"],
["Buttermilk / chaas (no salt)", "With lunch", "Probiotics + calcium; cooling; no sodium"],
["Coconut water (1 cup unsweetened)", "Evening snack", "Natural electrolytes; potassium for BP"],
["Warm turmeric milk (low-fat)", "Bedtime", "Anti-inflammatory; no glucose spike"],
["Plain water (3 L/day)", "Throughout day", "Prevents dehydration that worsens BP & BG"],
]
d_data = [[Paragraph(c, CELL_H if i==0 else (CELL_C if j==1 else CELL))
for j,c in enumerate(row)] for i,row in enumerate(drinks)]
dtbl = Table(d_data, colWidths=[CW*0.27, CW*0.27, CW*0.46])
dstyle = [
("BACKGROUND", (0,0),(-1,0), TEAL),
("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), "TOP"),
("GRID", (0,0),(-1,-1), 0.3, colors.HexColor("#CCCCCC")),
]
for r in range(1, len(drinks)):
dstyle.append(("BACKGROUND", (0,r),(-1,r), LIGHT_TEAL if r%2==1 else WHITE))
dtbl.setStyle(TableStyle(dstyle))
story.append(dtbl)
story.append(Spacer(1, 0.3*cm))
# ── SNACKS ──────────────────────────────────────────────────────────────────────
story.append(sec_hdr("🍎 Safe Snack Ideas (Low GI + Low Sodium)", bg=GREEN))
story.append(Spacer(1, 0.2*cm))
snacks = [
["✅ Roasted chana (unsalted)", "✅ Apple + 5 almonds", "✅ Greek yogurt (unsweetened)"],
["✅ Carrot sticks + low-salt hummus", "✅ Handful walnuts + kiwi", "✅ Boiled egg + black pepper"],
["✅ Sprout chaat (lemon only, no salt)", "✅ Roasted makhana (unsalted)", "✅ Pomegranate seeds + walnuts"],
["✅ Chia pudding (no sugar)", "✅ Pumpkin seeds + 1 guava", "✅ Veg soup (homemade, low sodium)"],
]
stbl = Table(
[[Paragraph(c, CELL) for c in row] for row in snacks],
colWidths=[CW/3]*3
)
stbl.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0),(-1,-1), [WHITE, LIGHT_GREEN]),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
("GRID", (0,0),(-1,-1), 0.2, colors.HexColor("#CCDDCC")),
]))
story.append(stbl)
story.append(Spacer(1, 0.3*cm))
# ── BLOOD SUGAR TARGET QUICK REFERENCE ─────────────────────────────────────────
story.append(sec_hdr("📊 Quick Reference: Target Ranges", bg=NAVY))
story.append(Spacer(1, 0.2*cm))
ref_data = [
[Paragraph("Parameter", CELL_H), Paragraph("Normal", CELL_H),
Paragraph("Diabetes Target", CELL_H), Paragraph("Notes", CELL_H)],
[Paragraph("Fasting Blood Glucose", CELL), Paragraph("70–100 mg/dL", CELL_C),
Paragraph("80–130 mg/dL", CELL_C), Paragraph("Check before breakfast; discuss target with doctor", CELL)],
[Paragraph("Post-meal (2 hr) Glucose", CELL), Paragraph("<140 mg/dL", CELL_C),
Paragraph("<180 mg/dL", CELL_C), Paragraph("2 hrs after first bite; diet choice impacts this most", CELL)],
[Paragraph("HbA1c (3-month average)", CELL), Paragraph("<5.7%", CELL_C),
Paragraph("<7.0% (most adults)", CELL_C), Paragraph("Check every 3 months", CELL)],
[Paragraph("Blood Pressure", CELL), Paragraph("<120/80 mmHg", CELL_C),
Paragraph("<130/80 mmHg (ADA)", CELL_C), Paragraph("Measure same time daily; low sodium diet key", CELL)],
[Paragraph("LDL Cholesterol", CELL), Paragraph("<100 mg/dL", CELL_C),
Paragraph("<70 mg/dL (high CVD risk)", CELL_C), Paragraph("Omega-3, fiber, and olive oil all help", CELL)],
[Paragraph("BMI", CELL), Paragraph("18.5–24.9", CELL_C),
Paragraph("Target normal range", CELL_C), Paragraph("5–10% weight loss significantly improves both conditions", CELL)],
]
rtbl = Table(ref_data, colWidths=[CW*0.24, CW*0.18, CW*0.24, CW*0.34])
rstyle = [
("BACKGROUND", (0,0),(-1,0), NAVY),
("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), "TOP"),
("GRID", (0,0),(-1,-1), 0.3, colors.HexColor("#CCCCCC")),
]
for r in range(1, len(ref_data)):
rstyle.append(("BACKGROUND", (0,r),(-1,r), LIGHT_BLUE if r%2==1 else WHITE))
rtbl.setStyle(TableStyle(rstyle))
story.append(rtbl)
story.append(Spacer(1, 0.35*cm))
# ── FOOTER ─────────────────────────────────────────────────────────────────────
story.append(HRFlowable(width=CW, thickness=0.5, color=NAVY, spaceAfter=6))
footer = (
"<b>Evidence Sources:</b> Bensaaud A et al. (2025) — DASH for cardiovascular prevention, "
"<i>Cochrane Database Syst Rev</i> (PMID: 40326569). "
"Lan J et al. (2025) — Dietary carbohydrate & glycaemic control in T2DM, "
"<i>Asia Pac J Clin Nutr</i> (PMID: 40419389). "
"Theodoridis X et al. (2023) — DASH adherence & hypertension risk meta-analysis, "
"<i>Nutrients</i> (PMID: 37513679). "
"2025 AHA/ACC Hypertension Guidelines. ADA Standards of Diabetes Care 2025.<br/>"
"⚠️ This plan is for educational purposes. Always follow your doctor's and dietitian's personalized advice. "
"Never adjust medications based on diet alone."
)
story.append(Paragraph(footer, SMALL))
doc.build(story)
print("Diabetes + BP PDF created successfully.")
cd /tmp/workspace/pcod-meal-plan && python generate_diabetes_bp_pdf.py 2>&1
ls -lh /tmp/workspace/pcod-meal-plan/Diabetes_BP_Meal_Plan.pdf
Diabetes BP Meal Plan
PDF Document · PDF
Diet plan for weight loss without muscle wasting same as above you had given in pdf and Printable for weight and fat loss at home
"weight loss" AND "muscle preservation" AND "high protein diet"
"fat loss" AND "lean mass" AND "caloric restriction"
weight loss without muscle loss diet plan high protein evidence based 2024 2025
"protein intake" AND "body composition" AND "weight loss"
~/pcod-meal-plan/generate_weightloss_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak
)
# ─── Color Palette ────────────────────────────────────────────────────────────
FOREST = colors.HexColor("#1B5E20")
MED_GREEN = colors.HexColor("#2E7D32")
LIGHT_GREEN = colors.HexColor("#E8F5E9")
ORANGE = colors.HexColor("#BF360C")
LIGHT_ORANGE= colors.HexColor("#FBE9E7")
AMBER = colors.HexColor("#E65100")
LIGHT_AMBER = colors.HexColor("#FFF3E0")
BLUE = colors.HexColor("#1565C0")
LIGHT_BLUE = colors.HexColor("#E3F2FD")
TEAL = colors.HexColor("#00695C")
LIGHT_TEAL = colors.HexColor("#E0F2F1")
PURPLE = colors.HexColor("#4A148C")
LIGHT_PURP = colors.HexColor("#F3E5F5")
RED = colors.HexColor("#B71C1C")
LIGHT_RED = colors.HexColor("#FFEBEE")
GOLD = colors.HexColor("#827717")
LIGHT_GOLD = colors.HexColor("#F9FBE7")
BROWN = colors.HexColor("#4E342E")
DARK_BROWN = colors.HexColor("#3E2723")
GRAY = colors.HexColor("#546E7A")
LIGHT_GRAY = colors.HexColor("#F5F5F5")
WHITE = colors.white
BLACK = colors.black
W, H = A4
CW = W - 3*cm
doc = SimpleDocTemplate(
"/tmp/workspace/pcod-meal-plan/WeightLoss_MusclePreservation_Plan.pdf",
pagesize=A4,
leftMargin=1.5*cm, rightMargin=1.5*cm,
topMargin=1.5*cm, bottomMargin=1.5*cm,
title="Weight & Fat Loss Meal Plan — Preserve Muscle",
author="Orris Health",
)
def sty(name, **kw):
return ParagraphStyle(name, **kw)
H1 = sty("H1", fontSize=23, textColor=WHITE, alignment=TA_CENTER, fontName="Helvetica-Bold", leading=29)
SUB = sty("SB", fontSize=10, textColor=WHITE, alignment=TA_CENTER, fontName="Helvetica", leading=15)
SEC = sty("SC", fontSize=13, textColor=WHITE, alignment=TA_LEFT, fontName="Helvetica-Bold", leading=17)
BODY = sty("BD", fontSize=9, textColor=BLACK, alignment=TA_JUSTIFY, fontName="Helvetica", leading=13, spaceAfter=3)
BODY_B = sty("BDB", fontSize=9, textColor=BLACK, alignment=TA_LEFT, fontName="Helvetica-Bold", leading=13)
SMALL = sty("SM", fontSize=8, textColor=GRAY, alignment=TA_LEFT, fontName="Helvetica", leading=11)
CELL_H = sty("CH", fontSize=9, textColor=WHITE, alignment=TA_CENTER, fontName="Helvetica-Bold", leading=12)
CELL = sty("CL", fontSize=8.5,textColor=BLACK, alignment=TA_LEFT, fontName="Helvetica", leading=12)
CELL_C = sty("CC", fontSize=8.5,textColor=BLACK, alignment=TA_CENTER, fontName="Helvetica", leading=12)
DAYHEAD = sty("DH", fontSize=10, textColor=WHITE, alignment=TA_CENTER, fontName="Helvetica-Bold", leading=14)
MEAL_L = sty("ML", fontSize=8, textColor=FOREST,alignment=TA_LEFT, fontName="Helvetica-Bold", leading=11)
MEAL_T = sty("MT", fontSize=8, textColor=BLACK, alignment=TA_LEFT, fontName="Helvetica", leading=11, spaceAfter=2)
story = []
def banner(text, sub="", bg=FOREST):
rows = [[Paragraph(text, H1)]]
if sub: rows.append([Paragraph(sub, SUB)])
t = Table(rows, colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("ROUNDEDCORNERS",[8]),
("TOPPADDING", (0,0),(-1,-1), 10),
("BOTTOMPADDING", (0,0),(-1,-1), 10),
("LEFTPADDING", (0,0),(-1,-1), 12),
("RIGHTPADDING", (0,0),(-1,-1), 12),
]))
return t
def sec_hdr(text, bg=FOREST):
t = Table([[Paragraph(text, SEC)]], colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("ROUNDEDCORNERS",[5]),
("TOPPADDING", (0,0),(-1,-1), 7),
("BOTTOMPADDING", (0,0),(-1,-1), 7),
("LEFTPADDING", (0,0),(-1,-1), 12),
]))
return t
def info_box(text, bg=LIGHT_AMBER, bc=AMBER, tc=DARK_BROWN):
t = Table([[Paragraph(text, sty("IB", fontSize=9, textColor=tc,
fontName="Helvetica", leading=13,
alignment=TA_LEFT))]], colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("TOPPADDING", (0,0),(-1,-1), 8),
("BOTTOMPADDING", (0,0),(-1,-1), 8),
("LEFTPADDING", (0,0),(-1,-1), 12),
("RIGHTPADDING", (0,0),(-1,-1), 12),
("BOX", (0,0),(-1,-1), 1, bc),
("ROUNDEDCORNERS",[4]),
]))
return t
def two_col(left_items, right_items,
ltitle="✅ EAT MORE", rtitle="❌ AVOID / LIMIT",
ltc=MED_GREEN, rtc=RED, lbg=LIGHT_GREEN, rbg=LIGHT_RED):
hw = CW/2 - 4
def mk(title, items, hbg, bg):
rows = [[Paragraph(title, sty("TC", fontSize=10, textColor=WHITE,
fontName="Helvetica-Bold", leading=14,
alignment=TA_CENTER))]]
for item in items: rows.append([Paragraph(f"• {item}", CELL)])
return rows, hbg, bg
lr, lhbg, lbg2 = mk(ltitle, left_items, ltc, lbg)
rr, rhbg, rbg2 = mk(rtitle, right_items, rtc, rbg)
mx = max(len(lr), len(rr))
while len(lr) < mx: lr.append([""])
while len(rr) < mx: rr.append([""])
merged = [[l[0], r[0]] for l, r in zip(lr, rr)]
t = Table(merged, colWidths=[hw, hw])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(0,0), lhbg),
("BACKGROUND", (1,0),(1,0), rhbg),
("BACKGROUND", (0,1),(0,-1), lbg2),
("BACKGROUND", (1,1),(1,-1), rbg2),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 8),
("RIGHTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "TOP"),
("GRID", (0,0),(-1,-1), 0.3, colors.HexColor("#CCCCCC")),
]))
return t
def recipe_card(title, time_str, servings, ingredients, steps, note="", bg=LIGHT_GREEN, ac=MED_GREEN):
ing_text = "\n".join(f"• {i}" for i in ingredients)
step_text = "\n".join(f"{n+1}. {s}" for n,s in enumerate(steps))
content = [
[Paragraph(title, sty("RT4", fontSize=10, textColor=ac,
fontName="Helvetica-Bold", leading=14))],
[Paragraph(f"⏱ {time_str} | 🍽 {servings}", SMALL)],
[Paragraph("<b>Ingredients:</b>", BODY_B)],
[Paragraph(ing_text, sty("RI", fontSize=8.5, textColor=BLACK,
fontName="Helvetica", leading=12, spaceAfter=2))],
[Paragraph("<b>Method:</b>", BODY_B)],
[Paragraph(step_text, sty("RS2", fontSize=8.5, textColor=BLACK,
fontName="Helvetica", leading=12, spaceAfter=2))],
]
if note: content.append([Paragraph(f"💡 {note}", SMALL)])
t = Table(content, colWidths=[CW/2 - 6])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 10),
("RIGHTPADDING", (0,0),(-1,-1), 10),
("ROUNDEDCORNERS",[6]),
("BOX", (0,0),(-1,-1), 0.5, ac),
]))
return t
def two_recipes(r1, r2):
t = Table([[r1, r2]], colWidths=[CW/2-4, CW/2-4])
t.setStyle(TableStyle([
("VALIGN", (0,0),(-1,-1), "TOP"),
("LEFTPADDING", (0,0),(-1,-1), 3),
("RIGHTPADDING",(0,0),(-1,-1), 3),
]))
return t
# ══════════════════════════════════════════════════════════════════════════════
# PAGE 1 — COVER + SCIENCE + FOOD GUIDE
# ══════════════════════════════════════════════════════════════════════════════
story.append(Spacer(1, 0.4*cm))
story.append(banner(
"🏋️ Weight & Fat Loss Plan\nPreserve Every Gram of Muscle",
"Evidence-Based Nutrition for Fat Loss at Home — Without Losing Muscle",
bg=FOREST
))
story.append(Spacer(1, 0.4*cm))
intro = (
"Most \"crash diets\" shrink the scale but destroy muscle — slowing your metabolism and making "
"weight regain inevitable. The solution is <b>high-protein, moderate calorie deficit eating</b> "
"combined with resistance exercise. A 2024 systematic review and meta-analysis by "
"<b>Kokura et al.</b> (<i>Clin Nutr ESPEN</i>, PMID: 39002131) covering adults with overweight/obesity "
"confirmed that <b>enhanced protein intake (≥1.2 g/kg body weight/day) significantly preserves "
"muscle mass, strength, and physical function during weight loss</b>. "
"A 2025 meta-analysis (Lan et al., PMID: 40419389) confirmed reduced carb intake improves "
"body composition. The goal: lose fat, keep muscle, boost metabolism."
)
story.append(Paragraph(intro, BODY))
story.append(Spacer(1, 0.3*cm))
# 4 Pillars
pillars = [
("🥩", "High Protein\n1.2–1.6 g/kg/day", "Preserves muscle\nduring deficit"),
("📉", "Calorie Deficit\n300–500 kcal/day", "Lose fat without\nstarvation mode"),
("🌾", "High Fiber\nCarbs (Low GI)", "Satiety without\nblood sugar spikes"),
("🏠", "Home Workouts\n3–4x per week", "Resistance training\nkeeps muscle intact"),
]
pcells = [
Paragraph(f"<b>{e}</b><br/><b>{t}</b><br/><font size=8>{d}</font>",
sty("PC", fontSize=9, textColor=FOREST, alignment=TA_CENTER,
fontName="Helvetica", leading=13))
for e, t, d in pillars
]
ptbl = Table([pcells], colWidths=[CW/4]*4)
ptbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), LIGHT_GREEN),
("TOPPADDING", (0,0),(-1,-1), 10),
("BOTTOMPADDING", (0,0),(-1,-1), 10),
("GRID", (0,0),(-1,-1), 0.4, MED_GREEN),
("ROUNDEDCORNERS",[5]),
]))
story.append(ptbl)
story.append(Spacer(1, 0.3*cm))
# Calorie & Macro Guide
story.append(info_box(
"📊 YOUR DAILY TARGETS (adjust to your body weight):\n"
"• Calories: Maintenance kcal MINUS 300–500 kcal/day (safe fat-loss deficit; ~0.5 kg/week fat loss)\n"
"• Protein: 1.2–1.6 g × your body weight in kg (e.g. 70 kg person = 84–112g protein/day)\n"
"• Carbs: 35–40% of calories — whole grains, legumes, vegetables ONLY. No refined carbs.\n"
"• Fat: 25–30% of calories — olive oil, nuts, avocado, fatty fish.\n"
"• Fiber: ≥30g/day — keeps you full, slows digestion, reduces fat absorption.\n"
"• Water: 2.5–3.5 L/day — dehydration mimics hunger and slows fat metabolism."
))
story.append(Spacer(1, 0.3*cm))
# ── FOOD GUIDE ─────────────────────────────────────────────────────────────────
story.append(sec_hdr("🥗 What to Eat & What to Avoid"))
story.append(Spacer(1, 0.2*cm))
eat = [
"Lean proteins: eggs (whole + whites), chicken breast, turkey, fish (tuna, salmon, cod)",
"Plant proteins: moong dal, masoor dal, rajma, chana, tofu, low-fat paneer, edamame",
"Greek yogurt & cottage cheese (paneer): high protein, satiating, low calorie",
"Whole grains (low GI): oats, quinoa, brown rice, millets, barley, whole wheat roti",
"Leafy & non-starchy veg: spinach, kale, broccoli, cauliflower, beans, zucchini, capsicum",
"Fiber-rich legumes: lentils, chickpeas, kidney beans — slow digestion, long satiety",
"Healthy fats (controlled portions): olive oil, avocado, walnuts, almonds, flaxseeds, chia",
"Low-calorie fruits: berries, apple, guava, pear, kiwi, watermelon, papaya",
"Green tea & black coffee (no sugar): thermogenic, mobilize stored fat",
"Spices: black pepper, cayenne, cinnamon, ginger, turmeric — boost metabolism",
"Leucine-rich foods: eggs, chicken, lentils — directly stimulate muscle protein synthesis",
"High water-content foods: cucumber, celery, lettuce, tomato, bottle gourd (lauki)",
]
avoid = [
"Refined carbs: white bread, maida, biscuits, white rice (excess), instant noodles",
"Added sugars: mithai, chocolates, cold drinks, packaged juices, ice cream, candy",
"Fried foods: samosas, pakoras, chips, puris — high calorie density, no nutrition",
"Ultra-processed snacks: biscuits, namkeen, crackers, frozen meals",
"Liquid calories: fruit juices, flavored milk, smoothies with added sugar, alcohol",
"Trans fats: bakery items, fast food, margarine, vanaspati ghee",
"Crash dieting / very low calorie (<1200 kcal): triggers muscle breakdown & metabolic slowdown",
"Skipping meals: leads to muscle catabolism and rebound overeating",
"Excess healthy fats: even olive oil and nuts are calorie-dense — measure portions",
"Protein supplements as a meal replacement: whole food first; supplement only if deficit",
]
story.append(two_col(eat, avoid))
story.append(Spacer(1, 0.3*cm))
# ── THE SCIENCE OF MUSCLE PRESERVATION ────────────────────────────────────────
story.append(sec_hdr("🔬 The Science: How to Lose Fat Without Losing Muscle", bg=BLUE))
story.append(Spacer(1, 0.2*cm))
science_data = [
[Paragraph("Strategy", CELL_H), Paragraph("How It Protects Muscle", CELL_H),
Paragraph("Evidence", CELL_H)],
[Paragraph("Eat 1.2–1.6 g protein/kg/day", CELL),
Paragraph("Provides amino acids for muscle protein synthesis; prevents catabolism during deficit", CELL),
Paragraph("Kokura et al. 2024 meta-analysis (PMID: 39002131)", CELL)],
[Paragraph("Spread protein across 3–4 meals", CELL),
Paragraph("Each dose of ~25–35g maximally stimulates muscle protein synthesis (MPS) via leucine threshold", CELL),
Paragraph("Areta et al. 2013; Phillips & Van Loon 2011", CELL)],
[Paragraph("Calorie deficit ≤500 kcal/day", CELL),
Paragraph("Larger deficits force body to burn muscle for energy. Moderate deficit burns fat preferentially", CELL),
Paragraph("Hall et al. — NIDDK energy balance research", CELL)],
[Paragraph("Resistance training (home workouts)", CELL),
Paragraph("Anabolic stimulus preserves and builds muscle even in calorie deficit — the most powerful signal", CELL),
Paragraph("Westcott 2012 review; AHA exercise guidelines", CELL)],
[Paragraph("Leucine-rich foods at each meal", CELL),
Paragraph("Leucine (branched-chain amino acid) directly activates mTOR pathway — key trigger for muscle synthesis", CELL),
Paragraph("Norton & Layman 2006; Devkota & Layman 2010", CELL)],
[Paragraph("Avoid prolonged fasting (>16 hrs)", CELL),
Paragraph("Extended fasting raises cortisol and reduces MPS; muscle becomes preferential fuel source", CELL),
Paragraph("Xie et al. 2024 meta-analysis (PMID: 39408357)", CELL)],
]
stbl = Table(science_data, colWidths=[CW*0.26, CW*0.44, CW*0.30])
sstyle = [
("BACKGROUND", (0,0),(-1,0), BLUE),
("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), "TOP"),
("GRID", (0,0),(-1,-1), 0.3, colors.HexColor("#CCCCCC")),
]
for r in range(1, len(science_data)):
sstyle.append(("BACKGROUND", (0,r),(-1,r), LIGHT_BLUE if r%2==1 else WHITE))
stbl.setStyle(TableStyle(sstyle))
story.append(stbl)
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# PAGE 2 — 7-DAY MEAL PLAN
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("📅 7-Day High-Protein Fat Loss Meal Plan"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Each day: <b>~1400–1600 kcal</b> (adjust to your TDEE - 400) | "
"<b>Protein: 100–130g (~30–35% cals)</b> | "
"<b>Carbs: 35–40% (complex only)</b> | "
"<b>Fats: 25–30% (healthy only)</b> | "
"<b>Fiber: ≥30g</b>. "
"<b>Home workout days:</b> Mon, Wed, Fri, Sun (bodyweight circuits — see tips page).",
sty("NP2", fontSize=8.5, textColor=GRAY, fontName="Helvetica", leading=12)
))
story.append(Spacer(1, 0.2*cm))
week = [
{
"day": "Monday 🏋️ Workout Day",
"early": "Warm water + lemon + pinch cayenne pepper (thermogenic). 10-min morning walk.",
"breakfast": "3-egg omelette (1 whole + 2 whites) with spinach & capsicum + 1 slice whole wheat toast + green tea",
"snack1": "1 cup Greek yogurt (unsweetened) + ½ cup berries + 1 tbsp chia seeds",
"lunch": "1 cup quinoa + 1 cup grilled chicken (120g) / tofu + large salad (spinach, cucumber, tomato) + lemon-olive oil dressing",
"snack2": "15 almonds + 1 small apple",
"dinner": "2 whole wheat rotis + 1 cup moong/masoor dal + sautéed broccoli & beans + cucumber raita (low-fat)",
"bedtime": "1 cup low-fat milk or casein (slow-digesting protein protects muscle overnight)",
},
{
"day": "Tuesday 🚶 Active Rest Day",
"early": "Warm water + cinnamon + lemon. 20-min brisk walk.",
"breakfast": "Overnight oats (½ cup oats + 1 tbsp chia + 1 cup skimmed milk + berries + 1 tbsp flaxseeds)",
"snack1": "2 boiled eggs + 1 small pear",
"lunch": "1 cup brown rice + 1 cup rajma (no extra oil) + methi/spinach sabzi + salad",
"snack2": "Moong sprout chaat (½ cup, lemon + jeera) + 1 cup buttermilk",
"dinner": "120g grilled fish (tuna/cod) + 1 sweet potato (medium, baked) + steamed broccoli & carrots",
"bedtime": "1 cup low-fat milk + ½ tsp cinnamon (no sugar)",
},
{
"day": "Wednesday 🏋️ Workout Day",
"early": "Black coffee (no sugar) or green tea — 30 min before workout (fat mobilization).",
"breakfast": "2 moong dal chilla + 1 cup low-fat Greek yogurt + ½ cup mixed berries",
"snack1": "1 banana (small) + 10 walnuts (post-workout muscle recovery)",
"lunch": "2 whole wheat rotis + 1 cup chana masala + cucumber raita + salad",
"snack2": "Roasted pumpkin seeds (1 tbsp) + 1 kiwi",
"dinner": "1 cup cooked millets + 120g paneer bhurji (low-fat) + spinach sabzi",
"bedtime": "Low-fat milk (1 cup) or unsweetened soy milk",
},
{
"day": "Thursday 🚶 Active Rest Day",
"early": "Warm lemon water + ginger slice. Gentle yoga or stretching 20 min.",
"breakfast": "Besan cheela (2) + 2 boiled eggs + 1 cup skimmed milk",
"snack1": "Roasted chana (3 tbsp) + 1 small guava",
"lunch": "1 cup brown rice + 1 cup toor/masoor dal + bhindi sabzi + salad",
"snack2": "1 cup Greek yogurt with 1 tsp flaxseeds and pinch cinnamon",
"dinner": "2 ragi rotis + 120g tofu/chicken stir-fry with vegetables (capsicum, beans, mushroom)",
"bedtime": "Warm low-fat turmeric milk (no sugar)",
},
{
"day": "Friday 🏋️ Workout Day",
"early": "Black coffee or green tea 30 min before workout.",
"breakfast": "Poha (1 cup, minimal oil) + 3 boiled egg whites + 1 cup buttermilk",
"snack1": "Cottage cheese (low-fat paneer, 50g) + 1 apple",
"lunch": "2 whole wheat rotis + 1 cup lentil soup (masoor) + salad + chaas",
"snack2": "Handful almonds + walnuts + 1 small orange",
"dinner": "120g grilled salmon + ½ cup quinoa + sautéed asparagus/broccoli",
"bedtime": "1 cup skimmed milk or low-fat dahi",
},
{
"day": "Saturday 🚶 Active Rest Day",
"early": "Warm water + lemon + 5 soaked almonds.",
"breakfast": "Idli (3) + egg white bhurji (3 whites) + low-fat sambar",
"snack1": "Protein smoothie: 1 cup skimmed milk + ½ banana + 1 tbsp chia + ½ cup berries",
"lunch": "1 cup quinoa + 1 cup chickpea masala (chana) + green salad",
"snack2": "Sprout chaat (½ cup moong sprouts) + chaas",
"dinner": "2 jowar rotis + fish curry (light gravy, 100g) / tofu sabzi + steamed greens",
"bedtime": "1 cup warm low-fat milk",
},
{
"day": "Sunday 🏋️ Workout Day + Meal Prep",
"early": "Lemon water + cayenne. Longer home workout (45 min).",
"breakfast": "3-egg omelette + sautéed vegetables + 1 whole wheat toast + green tea",
"snack1": "1 cup Greek yogurt + pomegranate seeds + 1 tsp walnuts",
"lunch": "1 cup brown rice + 120g chicken/tofu curry + large salad + raita",
"snack2": "Roasted makhana (1 cup, unsalted) + 1 tbsp pumpkin seeds",
"dinner": "Moong dal khichdi (1 cup, millet-based) + 2 egg whites (scrambled) + cucumber-tomato salad",
"bedtime": "1 cup casein-rich low-fat cottage cheese or warm milk",
},
]
meal_labels = [
("🌅 Early Morning", "early"),
("🍳 Breakfast", "breakfast"),
("🍎 Mid-Morning", "snack1"),
("🍱 Lunch", "lunch"),
("🫐 Evening Snack", "snack2"),
("🌙 Dinner", "dinner"),
("💤 Bedtime", "bedtime"),
]
day_colors = [
FOREST, MED_GREEN, TEAL,
colors.HexColor("#1A237E"), colors.HexColor("#004D40"),
AMBER, PURPLE
]
for i, day in enumerate(week):
dc = day_colors[i]
dh = Table([[Paragraph(f" {day['day']}", DAYHEAD)]], colWidths=[CW])
dh.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), dc),
("ROUNDEDCORNERS",[5]),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
("LEFTPADDING", (0,0),(-1,-1), 10),
]))
story.append(dh)
rows = [[Paragraph(lbl, MEAL_L), Paragraph(day[key], MEAL_T)]
for lbl, key in meal_labels]
mt = Table(rows, colWidths=[CW*0.23, CW*0.77])
mt.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0),(-1,-1), [WHITE, LIGHT_GREEN]),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING", (0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 8),
("RIGHTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "TOP"),
("GRID", (0,0),(-1,-1), 0.2, colors.HexColor("#DDDDDD")),
]))
story.append(mt)
story.append(Spacer(1, 0.25*cm))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# PAGE 3 — RECIPES
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("👩🍳 High-Protein Fat-Loss Recipes", bg=TEAL))
story.append(Spacer(1, 0.25*cm))
recipes = [
(
"1. Spinach-Egg White Omelette",
"10 min", "1 serving (~24g protein)",
["1 whole egg + 3 egg whites", "1 cup fresh spinach",
"½ cup mushrooms (sliced)", "¼ cup capsicum",
"1 garlic clove, minced", "Black pepper + herbs (no salt)"],
["Beat egg and whites together with black pepper.",
"Spray non-stick pan with oil; sauté garlic.",
"Add mushrooms, capsicum, spinach — cook 2 min.",
"Pour egg mixture; cook on low heat 3 min.",
"Fold in half; serve immediately."],
"24g protein, ~180 kcal. Leucine-rich — triggers muscle protein synthesis.",
LIGHT_TEAL, TEAL
),
(
"2. Greek Yogurt Protein Bowl",
"5 min", "1 serving (~22g protein)",
["¾ cup low-fat Greek yogurt", "½ cup mixed berries",
"1 tbsp chia seeds", "1 tsp ground flaxseeds",
"5 walnuts (crushed)", "½ tsp cinnamon"],
["Layer yogurt in a bowl.",
"Top with berries, chia, flaxseeds, and walnuts.",
"Sprinkle cinnamon on top.",
"Eat immediately or refrigerate overnight."],
"22g protein, ~250 kcal. Casein in yogurt digests slowly — ideal pre-sleep or snack.",
LIGHT_BLUE, BLUE
),
(
"3. Grilled Chicken Quinoa Bowl",
"30 min", "1 serving (~45g protein)",
["120g chicken breast (or tofu for veg)", "½ cup cooked quinoa",
"2 cups mixed greens (spinach, rocket)", "½ cup cherry tomatoes",
"¼ avocado (sliced)", "Dressing: 1 tsp olive oil + lemon + garlic + pepper"],
["Season chicken with garlic, lemon, pepper; grill 12 min.",
"Slice chicken; arrange over greens and quinoa.",
"Add tomatoes and avocado.",
"Drizzle dressing; toss gently."],
"45g protein, ~420 kcal. Quinoa provides complete amino acids alongside chicken.",
LIGHT_GREEN, MED_GREEN
),
(
"4. Masoor Dal Protein Soup",
"25 min", "2 servings (~18g protein each)",
["1 cup masoor (red lentils)", "1 tomato, chopped",
"½ onion, diced", "3 garlic cloves, minced",
"1 tsp cumin, turmeric, black pepper",
"1 tsp olive oil", "Lemon juice + coriander"],
["Heat oil; sauté garlic and onion 3 min.",
"Add tomato; cook 2 min.",
"Add lentils, spices, and 4 cups water.",
"Boil, then simmer 20 min until soft.",
"Finish with lemon and coriander."],
"18g protein + 15g fiber per serving. Fiber = prolonged satiety, fewer cravings.",
LIGHT_ORANGE, ORANGE
),
(
"5. Baked Spiced Salmon",
"25 min", "1 serving (~38g protein)",
["130g salmon fillet", "½ tsp turmeric, cumin, garlic powder",
"1 tsp olive oil", "Lemon juice + black pepper",
"Side: 1 cup roasted broccoli + ½ cup sweet potato"],
["Marinate salmon in olive oil, turmeric, cumin, garlic, lemon — 10 min.",
"Bake at 200°C for 15 min.",
"Toss broccoli in olive oil spray; roast alongside.",
"Serve with ½ cup baked sweet potato."],
"38g protein + omega-3 (anti-inflammatory). Reduces muscle soreness post-workout.",
LIGHT_GOLD, GOLD
),
(
"6. Moong Dal Chilla (Protein Pancakes)",
"20 min", "2 servings (~14g protein each)",
["1 cup moong dal (soaked 4 hrs)", "Handful spinach/grated zucchini",
"½ tsp ginger-green chilli paste",
"Jeera, turmeric", "Olive oil spray"],
["Blend soaked dal to smooth batter.",
"Mix in veggies, ginger, spices.",
"Heat non-stick pan, spray oil, pour batter.",
"Cook 2 min each side until golden.",
"Serve with low-fat dahi or green chutney."],
"14g protein/serving. Low GI. High fiber. Perfect fat-loss breakfast.",
LIGHT_TEAL, TEAL
),
(
"7. Overnight High-Protein Oats",
"5 min + overnight", "1 serving (~20g protein)",
["½ cup rolled oats", "1 tbsp chia seeds",
"1 cup low-fat milk (or skimmed)", "1 scoop plain protein powder (optional)",
"½ tsp cinnamon", "½ cup mixed berries",
"1 tbsp Greek yogurt on top"],
["Mix oats, chia, milk, cinnamon (and protein if using) in a jar.",
"Stir thoroughly; seal and refrigerate overnight.",
"In the morning, stir; top with berries and Greek yogurt."],
"20g protein, 8g fiber, ~350 kcal. Beta-glucan in oats reduces hunger hormones (ghrelin).",
LIGHT_PURP, PURPLE
),
(
"8. Tofu & Vegetable Stir-Fry",
"20 min", "1 serving (~28g protein)",
["150g firm tofu (pressed and cubed)", "1 cup broccoli florets",
"½ cup bell pepper (mixed colors)", "½ cup mushrooms",
"2 garlic cloves + ½ tsp ginger",
"1 tsp low-sodium soy sauce", "1 tsp sesame oil (or olive oil)"],
["Press tofu 10 min to remove water; cube and air-fry/pan-fry 5 min until crispy.",
"Heat oil in wok; add garlic and ginger.",
"Add vegetables; stir-fry on high 4 min.",
"Add tofu and soy sauce; toss 2 min.",
"Serve over ½ cup brown rice or millet."],
"28g protein. Tofu isoflavones also support fat loss and muscle retention.",
LIGHT_GREEN, MED_GREEN
),
]
for i in range(0, len(recipes), 2):
r1 = recipe_card(*recipes[i])
if i+1 < len(recipes):
r2 = recipe_card(*recipes[i+1])
story.append(two_recipes(r1, r2))
else:
story.append(r1)
story.append(Spacer(1, 0.25*cm))
story.append(PageBreak())
# ══════════════════════════════════════════════════════════════════════════════
# PAGE 4 — TIPS + HOME WORKOUT + DRINKS + SNACKS
# ══════════════════════════════════════════════════════════════════════════════
story.append(sec_hdr("💡 Practical Fat Loss + Muscle Preservation Tips"))
story.append(Spacer(1, 0.2*cm))
tips = [
("🥩 Protein at EVERY Meal", "Eat 25–35g of protein per meal across 3–4 meals. This 'leucine threshold' is the most powerful stimulus for muscle protein synthesis throughout the day."),
("📉 Moderate Deficit Only", "Aim for 300–500 kcal below your maintenance level. Bigger deficits (>700 kcal) cause muscle loss. Patience wins — 0.5–0.75 kg/week is ideal fat-loss speed."),
("🏋️ Lift or Resist Daily", "Bodyweight resistance training (push-ups, squats, lunges, planks) sends a powerful signal to retain muscle even in a calorie deficit. Do this 3–4x/week."),
("🌙 Eat Protein Before Bed", "Slow-digesting proteins (casein — found in low-fat milk, paneer, Greek yogurt) before sleep reduce overnight muscle breakdown by keeping amino acid levels elevated."),
("🚫 Never Skip Breakfast", "Skipping breakfast elevates cortisol (muscle-wasting hormone) and triggers muscle catabolism. A protein-rich breakfast sets the anabolic tone for the day."),
("💧 Drink Water Before Meals", "Drinking 500 ml water 30 min before meals reduces calorie intake by ~13% (RCT evidence). It also prevents false hunger signals."),
("🌿 Eat More Vegetables", "Non-starchy vegetables are nearly calorie-free but fill volume and provide fiber, vitamins, and antioxidants. Aim for 5+ cups daily."),
("☕ Strategic Caffeine", "Black coffee or green tea 30 min before home workouts raises epinephrine, mobilizes fat stores, and improves performance — helping you burn more fat per session."),
("😴 Sleep 7–9 Hours", "Poor sleep raises ghrelin (hunger hormone) by 25% and lowers leptin (fullness hormone). Sleep is when growth hormone (anabolic) peaks — critical for muscle preservation."),
("📅 Track Progress Smartly", "Weigh yourself 1x/week (same time, morning). Also measure waist circumference. Scale weight can fluctuate; waist loss is the true fat-loss marker."),
]
tip_rows = [[
Paragraph(f"<b>{et}</b>", sty("TP4", fontSize=9, fontName="Helvetica-Bold",
textColor=FOREST, leading=13)),
Paragraph(desc, BODY)
] for et, desc in tips]
ttbl = Table(tip_rows, colWidths=[CW*0.29, CW*0.71])
ttbl.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0),(-1,-1), [LIGHT_GREEN, WHITE]),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
("LEFTPADDING", (0,0),(-1,-1), 8),
("RIGHTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "TOP"),
("GRID", (0,0),(-1,-1), 0.2, colors.HexColor("#DDDDDD")),
]))
story.append(ttbl)
story.append(Spacer(1, 0.3*cm))
# ── HOME WORKOUT PLAN ──────────────────────────────────────────────────────────
story.append(sec_hdr("🏠 Home Workout Plan (No Equipment)", bg=AMBER))
story.append(Spacer(1, 0.2*cm))
workout_data = [
[Paragraph("Day", CELL_H), Paragraph("Workout Type", CELL_H),
Paragraph("Exercises (3 rounds)", CELL_H), Paragraph("Duration", CELL_H)],
[Paragraph("Monday", CELL_C), Paragraph("Upper Body + Core", CELL),
Paragraph("20 push-ups, 15 tricep dips (chair), 20 shoulder press (water bottles), 30-sec plank x3, 20 crunches", CELL),
Paragraph("30–40 min", CELL_C)],
[Paragraph("Wednesday", CELL_C), Paragraph("Lower Body + Glutes", CELL),
Paragraph("25 squats, 15 lunges each leg, 20 glute bridges, 20 calf raises, 30-sec wall sit", CELL),
Paragraph("30–40 min", CELL_C)],
[Paragraph("Friday", CELL_C), Paragraph("Full Body Circuit", CELL),
Paragraph("10 burpees, 20 jump squats, 15 push-ups, 20 mountain climbers, 30-sec plank, 15 dips", CELL),
Paragraph("35–45 min", CELL_C)],
[Paragraph("Sunday", CELL_C), Paragraph("Active Recovery + Core", CELL),
Paragraph("20-min brisk walk + 30 bicycle crunches, 20 leg raises, 3x 45-sec plank, 20 Superman holds", CELL),
Paragraph("40–50 min", CELL_C)],
[Paragraph("Tue/Thu/Sat", CELL_C), Paragraph("Active Rest", CELL),
Paragraph("30-min brisk walk, yoga, stretching, cycling, or swimming — stay moving!", CELL),
Paragraph("30 min", CELL_C)],
]
wtbl = Table(workout_data, colWidths=[CW*0.12, CW*0.20, CW*0.52, CW*0.16])
wstyle = [
("BACKGROUND", (0,0),(-1,0), AMBER),
("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), "TOP"),
("GRID", (0,0),(-1,-1), 0.3, colors.HexColor("#CCCCCC")),
]
for r in range(1, len(workout_data)):
wstyle.append(("BACKGROUND", (0,r),(-1,r), LIGHT_AMBER if r%2==1 else WHITE))
wtbl.setStyle(TableStyle(wstyle))
story.append(wtbl)
story.append(Spacer(1, 0.3*cm))
# ── DRINKS ──────────────────────────────────────────────────────────────────────
story.append(sec_hdr("💧 Best Drinks for Fat Loss", bg=TEAL))
story.append(Spacer(1, 0.15*cm))
drinks = [
["Drink", "When", "Fat-Loss Benefit"],
["Lemon water + cayenne (warm)", "First thing AM", "Kick-starts metabolism, mobilizes fat stores"],
["Black coffee (no sugar)", "30 min pre-workout", "Raises epinephrine, burns 10–15% more fat during exercise"],
["Green tea (2–3 cups)", "Morning / mid-morning", "EGCG + caffeine = enhanced fat oxidation"],
["Protein shake (milk-based)", "Post-workout", "Rapid amino acids stop muscle breakdown; rebuild muscle"],
["Apple cider vinegar water (1 tsp)", "Before lunch", "Improves insulin sensitivity; reduces post-meal glucose"],
["Buttermilk / chaas (no salt)", "After lunch", "Probiotics; low calorie; reduces bloating"],
["Ginger-cinnamon tea", "Evening", "Cinnamon improves insulin; ginger reduces inflammation & hunger"],
["Warm low-fat milk", "Bedtime", "Casein protein — slow-release amino acids prevent muscle breakdown overnight"],
["Plain water (3–3.5 L)", "Throughout day", "Prevents false hunger; required for fat metabolism (lipolysis)"],
]
d_data = [[Paragraph(c, CELL_H if i==0 else (CELL_C if j==1 else CELL))
for j,c in enumerate(row)] for i,row in enumerate(drinks)]
dtbl = Table(d_data, colWidths=[CW*0.27, CW*0.23, CW*0.50])
dstyle = [
("BACKGROUND", (0,0),(-1,0), TEAL),
("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), "TOP"),
("GRID", (0,0),(-1,-1), 0.3, colors.HexColor("#CCCCCC")),
]
for r in range(1, len(drinks)):
dstyle.append(("BACKGROUND", (0,r),(-1,r), LIGHT_TEAL if r%2==1 else WHITE))
dtbl.setStyle(TableStyle(dstyle))
story.append(dtbl)
story.append(Spacer(1, 0.25*cm))
# ── HIGH-PROTEIN SNACKS ────────────────────────────────────────────────────────
story.append(sec_hdr("🍎 High-Protein, Low-Calorie Snacks (<200 kcal each)", bg=MED_GREEN))
story.append(Spacer(1, 0.15*cm))
snacks = [
["✅ 2 boiled eggs (~12g protein, 140 kcal)", "✅ Greek yogurt + berries (~20g protein, 150 kcal)", "✅ Roasted chana (3 tbsp) + apple"],
["✅ Moong sprout chaat (~8g protein, 90 kcal)", "✅ Paneer cubes (50g) + black pepper", "✅ 15 almonds + 1 small fruit"],
["✅ Protein smoothie (milk + chia + berries)", "✅ Tuna on whole wheat crackers", "✅ Pumpkin seeds + kiwi"],
["✅ Roasted makhana (unsalted, 1 cup)", "✅ Edamame (½ cup, ~8g protein)", "✅ Cucumber + low-fat dahi dip"],
]
stbl = Table(
[[Paragraph(c, CELL) for c in row] for row in snacks],
colWidths=[CW/3]*3
)
stbl.setStyle(TableStyle([
("ROWBACKGROUNDS", (0,0),(-1,-1), [WHITE, LIGHT_GREEN]),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
("GRID", (0,0),(-1,-1), 0.2, colors.HexColor("#CCDDCC")),
]))
story.append(stbl)
story.append(Spacer(1, 0.3*cm))
# ── PROGRESS TRACKER BOX ──────────────────────────────────────────────────────
story.append(sec_hdr("📊 Expected Progress & Milestones", bg=BLUE))
story.append(Spacer(1, 0.15*cm))
prog_data = [
[Paragraph("Week", CELL_H), Paragraph("Expected Change", CELL_H), Paragraph("What's Happening", CELL_H)],
[Paragraph("Week 1–2", CELL_C), Paragraph("1–3 kg loss (mostly water + glycogen)", CELL),
Paragraph("Carb reduction = lower water retention. Motivation boost phase. Start workouts.", CELL)],
[Paragraph("Week 3–4", CELL_C), Paragraph("0.3–0.7 kg pure fat/week", CELL),
Paragraph("True fat burning begins. Hunger stabilizes. Energy improves. Stay consistent!", CELL)],
[Paragraph("Week 5–8", CELL_C), Paragraph("Clothes looser, waist shrinking", CELL),
Paragraph("Body composition improving. Muscle becoming more visible. BP & blood sugar improve.", CELL)],
[Paragraph("Month 3+", CELL_C), Paragraph("5–8 kg fat loss, muscle maintained or built", CELL),
Paragraph("Metabolism stays high (muscle preserved). Sustainable long-term lifestyle established.", CELL)],
]
prtbl = Table(prog_data, colWidths=[CW*0.14, CW*0.35, CW*0.51])
prstyle = [
("BACKGROUND", (0,0),(-1,0), BLUE),
("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), "TOP"),
("GRID", (0,0),(-1,-1), 0.3, colors.HexColor("#CCCCCC")),
]
for r in range(1, len(prog_data)):
prstyle.append(("BACKGROUND", (0,r),(-1,r), LIGHT_BLUE if r%2==1 else WHITE))
prtbl.setStyle(TableStyle(prstyle))
story.append(prtbl)
story.append(Spacer(1, 0.35*cm))
# ── FOOTER ─────────────────────────────────────────────────────────────────────
story.append(HRFlowable(width=CW, thickness=0.5, color=FOREST, spaceAfter=6))
footer = (
"<b>Evidence Sources:</b> Kokura Y et al. (2024) — Enhanced protein intake and muscle mass in overweight/obesity, "
"<i>Clin Nutr ESPEN</i> (PMID: 39002131). "
"Xie Y et al. (2024) — Time-restricted eating and fat loss, <i>Nutrients</i> (PMID: 39408357). "
"Lan J et al. (2025) — Dietary carbohydrate and glycaemic control, <i>Asia Pac J Clin Nutr</i> (PMID: 40419389). "
"Wycherley et al. 2012 meta-analysis (24 RCTs): high protein diet preserves REE and lean mass.<br/>"
"⚠️ This plan is for healthy adults. Consult your doctor before starting if you have existing medical conditions. "
"A registered dietitian can personalize calorie and protein targets to your exact body weight and goals."
)
story.append(Paragraph(footer, SMALL))
doc.build(story)
print("Weight Loss + Muscle Preservation PDF created successfully.")
cd /tmp/workspace/pcod-meal-plan && python generate_weightloss_pdf.py 2>&1
ls -lh /tmp/workspace/pcod-meal-plan/WeightLoss_MusclePreservation_Plan.pdf
WeightLoss MusclePreservation Plan
PDF Document · PDF
Diet plan for weight loss without muscle wasting same as above you had given in pdf and Printable
WeightLoss MusclePreservation Plan
PDF Document · PDF