Make it easy and simple way for norcet 11 2026
| Classification | Systolic (SBP) | Diastolic (DBP) |
|---|---|---|
| β Normal | < 120 | < 80 |
| β οΈ Elevated | 120-129 | < 80 |
| π‘ Stage-1 HTN | 130-139 | 80-89 |
| π΄ Stage-2 HTN | β₯ 140 | β₯ 90 |
| π¨ Hypertensive Crisis | > 180 | > 120 |
| Primary | Secondary | |
|---|---|---|
| How common? | 95% (most common) | 5% (less common) |
| Cause? | Unknown (idiopathic) | Known cause |
| Why? | SNS imbalance, RAAS, insulin resistance | Renal failure, heart failure, vascular disorders |
| Risk factors | Family history, high salt, obesity, stress | Underlying pathology |
| Letter | Symptom |
|---|---|
| H | Headache + flushed face |
| E | Epistaxis (nosebleed) |
| A | (Any) chest pain |
| D | Dizziness + Tinnitus |
| T | Tinnitus |
| V | Visual disturbances |
| Letter | Complication |
|---|---|
| C | Coronary artery disease |
| O | Organ damage (heart, brain, kidneys, eyes) |
| B | Brain - Stroke / CVA |
| S | Systolic failure - CHF |
β Most common cause of CHF = HTN (high-yield exam point!)
Create a study guide PDF for hypertension complications and management
mkdir -p /tmp/workspace/hypertension-study-guide && ls /tmp/workspace/
~/hypertension-study-guide/build_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import Flowable
OUTPUT = "/tmp/workspace/hypertension-study-guide/Hypertension_Study_Guide_NORCET11.pdf"
# ββ Colour palette ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
DARK_BLUE = colors.HexColor("#1A237E")
MED_BLUE = colors.HexColor("#1565C0")
LIGHT_BLUE = colors.HexColor("#E3F2FD")
ACCENT_RED = colors.HexColor("#C62828")
ACCENT_AMBER= colors.HexColor("#F57F17")
GREEN = colors.HexColor("#1B5E20")
LIGHT_GREEN = colors.HexColor("#E8F5E9")
LIGHT_AMBER = colors.HexColor("#FFF8E1")
LIGHT_RED = colors.HexColor("#FFEBEE")
GRAY_DARK = colors.HexColor("#37474F")
GRAY_LIGHT = colors.HexColor("#ECEFF1")
WHITE = colors.white
# ββ Styles βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
styles = getSampleStyleSheet()
def make_style(name, parent="Normal", **kw):
return ParagraphStyle(name, parent=styles[parent], **kw)
title_style = make_style("DocTitle", fontSize=26, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER,
spaceAfter=4, leading=32)
subtitle_style = make_style("DocSubtitle", fontSize=13, textColor=LIGHT_BLUE,
fontName="Helvetica-Bold", alignment=TA_CENTER,
spaceAfter=2)
tag_style = make_style("Tag", fontSize=10, textColor=LIGHT_BLUE,
fontName="Helvetica", alignment=TA_CENTER)
sec_style = make_style("Section", fontSize=14, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_LEFT,
spaceAfter=2, leftIndent=6)
sub_style = make_style("SubSection", fontSize=11, textColor=MED_BLUE,
fontName="Helvetica-Bold", spaceAfter=4, spaceBefore=6)
body_style = make_style("Body", fontSize=9.5, textColor=GRAY_DARK,
fontName="Helvetica", leading=14, spaceAfter=3,
leftIndent=6)
bullet_style = make_style("Bullet", fontSize=9.5, textColor=GRAY_DARK,
fontName="Helvetica", leading=14, spaceAfter=2,
leftIndent=14, bulletIndent=6)
bold_body = make_style("BoldBody", fontSize=9.5, textColor=GRAY_DARK,
fontName="Helvetica-Bold", leading=14, spaceAfter=3,
leftIndent=6)
highlight_style = make_style("Highlight", fontSize=10, textColor=ACCENT_RED,
fontName="Helvetica-Bold", leading=14,
spaceAfter=3, leftIndent=6)
mnemonic_style = make_style("Mnemonic", fontSize=10, textColor=GREEN,
fontName="Helvetica-Bold", leading=15,
spaceAfter=3, leftIndent=6)
small_style = make_style("Small", fontSize=8, textColor=GRAY_DARK,
fontName="Helvetica", leading=11, spaceAfter=2,
leftIndent=6)
note_style = make_style("Note", fontSize=9, textColor=ACCENT_RED,
fontName="Helvetica-BoldOblique", leading=12,
spaceAfter=2, leftIndent=6)
# ββ Helpers βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def section_header(text, bg=MED_BLUE):
data = [[Paragraph(text, sec_style)]]
t = Table(data, colWidths=[17*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("ROUNDEDCORNERS", [5, 5, 5, 5]),
("TOPPADDING", (0,0),(-1,-1), 6),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
("LEFTPADDING", (0,0),(-1,-1), 10),
]))
return t
def info_box(text, bg=LIGHT_BLUE, border=MED_BLUE):
data = [[Paragraph(text, body_style)]]
t = Table(data, colWidths=[17*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("BOX", (0,0),(-1,-1), 1.2, border),
("TOPPADDING", (0,0),(-1,-1), 7),
("BOTTOMPADDING",(0,0),(-1,-1), 7),
("LEFTPADDING", (0,0),(-1,-1), 10),
]))
return t
def alert_box(text, bg=LIGHT_RED, border=ACCENT_RED):
data = [[Paragraph(text, highlight_style)]]
t = Table(data, colWidths=[17*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("BOX", (0,0),(-1,-1), 1.5, border),
("TOPPADDING", (0,0),(-1,-1), 7),
("BOTTOMPADDING",(0,0),(-1,-1), 7),
("LEFTPADDING", (0,0),(-1,-1), 10),
]))
return t
def tip_box(text, bg=LIGHT_GREEN, border=GREEN):
data = [[Paragraph(text, mnemonic_style)]]
t = Table(data, colWidths=[17*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("BOX", (0,0),(-1,-1), 1.2, border),
("TOPPADDING", (0,0),(-1,-1), 7),
("BOTTOMPADDING",(0,0),(-1,-1), 7),
("LEFTPADDING", (0,0),(-1,-1), 10),
]))
return t
def bullet(text):
return Paragraph(f"<bullet>•</bullet> {text}", bullet_style)
def sp(h=6):
return Spacer(1, h)
def hr():
return HRFlowable(width="100%", thickness=0.5, color=GRAY_LIGHT,
spaceAfter=4, spaceBefore=4)
# ββ Cover page builder ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def cover_page():
elems = []
# Title banner
title_data = [
[Paragraph("HYPERTENSION", title_style)],
[Paragraph("Complications & Management", subtitle_style)],
[Paragraph("NORCET 11 β 2026 | Quick Study Guide", tag_style)],
]
title_tbl = Table(title_data, colWidths=[17*cm])
title_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), DARK_BLUE),
("TOPPADDING", (0,0),(-1,-1), 12),
("BOTTOMPADDING",(0,0),(-1,-1), 12),
("LEFTPADDING", (0,0),(-1,-1), 14),
("RIGHTPADDING", (0,0),(-1,-1), 14),
("ROWBACKGROUNDS",(0,0),(-1,-1),[DARK_BLUE]),
]))
elems.append(title_tbl)
elems.append(sp(14))
# Quick-look definition box
elems.append(info_box(
"<b>What is Hypertension?</b> Persistently elevated arterial blood pressure (BP > 120/80 mmHg). "
"Called the <b>'Silent Killer'</b> because it is largely asymptomatic yet silently damages end-organs. "
"Affects ~1.28 billion adults worldwide (WHO 2023)."
))
elems.append(sp(10))
# AHA BP Classification Table
elems.append(Paragraph("AHA Blood Pressure Classification", sub_style))
bp_header = ["Classification", "Systolic (SBP)", "Diastolic (DBP)"]
bp_data = [
bp_header,
["Normal", "< 120 mmHg", "< 80 mmHg"],
["Elevated", "120-129 mmHg", "< 80 mmHg"],
["Stage 1 HTN", "130-139 mmHg", "80-89 mmHg"],
["Stage 2 HTN", "\u2265 140 mmHg", "\u2265 90 mmHg"],
["Hypertensive Crisis", "> 180 mmHg", "> 120 mmHg"],
]
row_colors = [
("BACKGROUND",(0,0),(-1,0), MED_BLUE), # header
("BACKGROUND",(0,1),(-1,1), colors.HexColor("#E8F5E9")), # normal
("BACKGROUND",(0,2),(-1,2), LIGHT_AMBER), # elevated
("BACKGROUND",(0,3),(-1,3), colors.HexColor("#FFF9C4")), # stage1
("BACKGROUND",(0,4),(-1,4), colors.HexColor("#FFCCBC")), # stage2
("BACKGROUND",(0,5),(-1,5), LIGHT_RED), # crisis
]
bp_tbl = Table(bp_data, colWidths=[6*cm, 5.5*cm, 5.5*cm])
style_cmds = [
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1),(-1,-1),"Helvetica"),
("FONTSIZE", (0,0),(-1,-1), 9),
("ALIGN", (0,0),(-1,-1), "CENTER"),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("ROWHEIGHT", (0,0),(-1,-1), 18),
("GRID", (0,0),(-1,-1), 0.5, colors.HexColor("#90A4AE")),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1),4),
] + list(row_colors)
bp_tbl.setStyle(TableStyle(style_cmds))
elems.append(bp_tbl)
elems.append(sp(6))
elems.append(Paragraph(
"<i>Source: American Heart Association (AHA) Guidelines</i>", small_style))
elems.append(sp(10))
elems.append(alert_box(
"EXAM ALERT: Diagnosis confirmed by 3 separate elevated BP readings "
"on 3 separate occasions using a sphygmomanometer."))
return elems
# ββ Page 2 β Types & Pathophysiology βββββββββββββββββββββββββββββββββββββββββ
def types_page():
elems = [PageBreak()]
elems.append(section_header("TYPES OF HYPERTENSION"))
elems.append(sp(8))
two_cols = [
[
Paragraph("<b>PRIMARY (Essential) HTN</b>", sub_style),
Paragraph("<b>SECONDARY HTN</b>", sub_style),
],
[
"\n".join([
"β’ Prevalence: ~95% of all HTN cases",
"β’ Cause: Unknown (idiopathic)",
"β’ Mechanism: SNS overactivity, RAAS",
" dysregulation, insulin resistance",
"β’ Risk Factors:",
" - Family history",
" - High sodium diet",
" - Obesity / overweight",
" - Stress",
" - Physical inactivity",
" - Advancing age",
]),
"\n".join([
"β’ Prevalence: ~5% of all HTN cases",
"β’ Cause: Known underlying disease",
"β’ Common Causes:",
" - Renal: CKD, renal artery stenosis",
" - Endocrine: Hyperaldosteronism,",
" Cushing syndrome, pheochromocytoma",
" - Cardiovascular: Coarctation of aorta",
" - Drugs: NSAIDs, OCPs, steroids",
" - Obstructive sleep apnoea",
"β’ Clue: Onset < 30 yrs or resistant HTN",
]),
]
]
col_data = [
[Paragraph(two_cols[0][0], sub_style), Paragraph(two_cols[0][1], sub_style)],
[Paragraph(two_cols[1][0].replace("\n","<br/>"), body_style),
Paragraph(two_cols[1][1].replace("\n","<br/>"), body_style)],
]
col_tbl = Table(col_data, colWidths=[8.3*cm, 8.7*cm])
col_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(0,0), LIGHT_BLUE),
("BACKGROUND", (1,0),(1,0), LIGHT_AMBER),
("BACKGROUND", (0,1),(0,1), colors.HexColor("#F0F4FF")),
("BACKGROUND", (1,1),(1,1), colors.HexColor("#FFFDE7")),
("BOX", (0,0),(0,-1),1, MED_BLUE),
("BOX", (1,0),(1,-1),1, ACCENT_AMBER),
("TOPPADDING", (0,0),(-1,-1),6),
("BOTTOMPADDING",(0,0),(-1,-1),6),
("LEFTPADDING", (0,0),(-1,-1),8),
("VALIGN", (0,0),(-1,-1),"TOP"),
]))
elems.append(col_tbl)
elems.append(sp(10))
elems.append(tip_box(
"MEMORY TRICK: PRIMARY = 95% = cause UNKNOWN | SECONDARY = 5% = cause KNOWN"
))
elems.append(sp(10))
# Malignant HTN box
elems.append(section_header("MALIGNANT HYPERTENSION (HYPERTENSIVE CRISIS)", bg=ACCENT_RED))
elems.append(sp(6))
mhtn = [
["Criteria", "SBP > 180 mmHg AND DBP > 120 mmHg"],
["Type", "Medical Emergency"],
["Risk", "Irreversible cardio-neuro-renal changes if untreated"],
["Drug of Choice","Sodium Nitroprusside (IV) β AIIMS Delhi 2015"],
["Other agents", "IV Labetalol, IV Nicardipine, IV Hydralazine"],
["Target", "Reduce MAP by max 25% in first hour; then gradual"],
]
mhtn_tbl = Table(mhtn, colWidths=[4.5*cm, 12.5*cm])
mhtn_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(0,-1), LIGHT_RED),
("BACKGROUND", (1,0),(1,-1), WHITE),
("FONTNAME", (0,0),(0,-1), "Helvetica-Bold"),
("FONTNAME", (1,0),(1,-1), "Helvetica"),
("FONTSIZE", (0,0),(-1,-1), 9),
("GRID", (0,0),(-1,-1), 0.5, colors.HexColor("#EF9A9A")),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
]))
elems.append(mhtn_tbl)
return elems
# ββ Page 3 β Signs, Symptoms & Diagnosis βββββββββββββββββββββββββββββββββββββ
def signs_page():
elems = [PageBreak()]
elems.append(section_header("SIGNS, SYMPTOMS & DIAGNOSIS"))
elems.append(sp(8))
elems.append(Paragraph("Signs & Symptoms", sub_style))
ss_data = [
["System", "Symptom / Sign"],
["Neurological", "Headache (especially occipital, morning)\nDizziness & Tinnitus\nVisual disturbances (blurred vision, papilloedema)"],
["Cardiac", "Chest pain / palpitations\nS4 gallop (LV hypertrophy)\nWidened pulse pressure"],
["ENT", "Epistaxis (nosebleed)"],
["General", "Flushed face, sweating\nFatigue"],
["Renal", "Nocturia, haematuria (in advanced disease)"],
]
ss_tbl = Table(ss_data, colWidths=[3.5*cm, 13.5*cm])
ss_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), MED_BLUE),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1),(-1,-1),"Helvetica"),
("FONTSIZE", (0,0),(-1,-1), 9),
("BACKGROUND", (0,1),(0,-1), LIGHT_BLUE),
("GRID", (0,0),(-1,-1), 0.5, colors.HexColor("#90A4AE")),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "TOP"),
("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, GRAY_LIGHT]),
]))
elems.append(ss_tbl)
elems.append(sp(6))
elems.append(tip_box(
'MNEMONIC for Symptoms: "HEAD-CTV" β '
'Headache | Epistaxis | Anxiety | Dizziness | Chest pain | Tinnitus | Visual disturbances'
))
elems.append(sp(10))
elems.append(Paragraph("Diagnosis", sub_style))
diag_data = [
["Method", "Detail"],
["Clinical Features", "Based on history and physical examination"],
["Sphygmomanometer", "3 separate readings on 3 separate occasions\n"
"Rest 5 min before each reading; seated position"],
["Ambulatory BP", "24-hour ABPM β gold standard for white-coat HTN"],
["Home BP", "HBPM β useful for ongoing monitoring"],
["Investigations", "ECG, Echo (LVH), Renal function (creatinine, eGFR),\n"
"Urinalysis, Fundoscopy, Lipid profile, Blood glucose"],
]
diag_tbl = Table(diag_data, colWidths=[4.5*cm, 12.5*cm])
diag_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), MED_BLUE),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1),(-1,-1),"Helvetica"),
("FONTSIZE", (0,0),(-1,-1), 9),
("BACKGROUND", (0,1),(0,-1), LIGHT_BLUE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, GRAY_LIGHT]),
("GRID", (0,0),(-1,-1), 0.5, colors.HexColor("#90A4AE")),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "TOP"),
]))
elems.append(diag_tbl)
return elems
# ββ Page 4 β Complications ββββββββββββββββββββββββββββββββββββββββββββββββββββ
def complications_page():
elems = [PageBreak()]
elems.append(section_header("COMPLICATIONS OF HYPERTENSION", bg=ACCENT_RED))
elems.append(sp(8))
elems.append(info_box(
"<b>Remember:</b> HTN causes target organ damage (TOD). The main targets are "
"Heart, Brain, Kidneys, Eyes, and Blood Vessels β <b>\"HBKEB\"</b>"
))
elems.append(sp(8))
comp_data = [
["ORGAN", "COMPLICATION", "KEY NOTES"],
["HEART\n(Cardiac)", "Left Ventricular Hypertrophy (LVH)\n"
"Coronary Artery Disease (CAD)\n"
"Heart Failure (HF)\n"
"Atrial Fibrillation",
"Most common cause of CHF = HTN\nECG: increased voltage\nEcho: LVH on imaging"],
["BRAIN\n(CNS)", "Stroke / CVA (ischaemic or haemorrhagic)\n"
"Hypertensive Encephalopathy\n"
"Transient Ischaemic Attack (TIA)\n"
"Vascular Dementia",
"HTN = #1 modifiable risk factor for stroke\nEncephalopathy: BP > 180/120 + confusion"],
["KIDNEYS\n(Renal)", "Hypertensive Nephropathy\n"
"Chronic Kidney Disease (CKD)\n"
"Renal Artery Stenosis\n"
"End-Stage Renal Disease (ESRD)",
"Proteinuria is early sign\nACE inhibitors / ARBs are renoprotective\nTarget BP in CKD: < 130/80"],
["EYES\n(Retinal)", "Hypertensive Retinopathy\n"
"Papilloedema\n"
"Retinal Haemorrhage\n"
"Visual disturbances / blindness",
"Keith-Wagener-Barker (KWB) grading\nGrade 4 = papilloedema = emergency\nFundoscopy is key examination"],
["VESSELS\n(Vascular)","Aortic Dissection\n"
"Peripheral Artery Disease (PAD)\n"
"Atherosclerosis (accelerated)\n"
"Aneurysm formation",
"Aortic dissection: tearing chest pain\nAnkle-Brachial Index (ABI) for PAD\nRisk doubles per 20/10 mmHg rise"],
]
comp_tbl = Table(comp_data, colWidths=[2.8*cm, 7.5*cm, 6.7*cm])
comp_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), ACCENT_RED),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1),(-1,-1),"Helvetica"),
("FONTSIZE", (0,0),(-1,-1), 8.5),
("BACKGROUND", (0,1),(0,-1), LIGHT_RED),
("FONTNAME", (0,1),(0,-1), "Helvetica-Bold"),
("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, GRAY_LIGHT]),
("GRID", (0,0),(-1,-1), 0.5, colors.HexColor("#EF9A9A")),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 6),
("VALIGN", (0,0),(-1,-1), "TOP"),
]))
elems.append(comp_tbl)
elems.append(sp(8))
# Hypertensive Retinopathy grading mini-table
elems.append(Paragraph("Hypertensive Retinopathy β KWB Grading (High Yield!)", sub_style))
ret_data = [
["Grade", "Findings"],
["Grade I", "Increased arteriolar light reflex (silver wiring)"],
["Grade II", "AV nipping / AV nicking (arteriovenous compression)"],
["Grade III","Flame haemorrhages, cotton wool spots, hard exudates"],
["Grade IV", "Papilloedema β EMERGENCY (Malignant HTN)"],
]
ret_tbl = Table(ret_data, colWidths=[3.5*cm, 13.5*cm])
ret_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), DARK_BLUE),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0),(-1,-1), 9),
("BACKGROUND", (0,4),(-1,4), LIGHT_RED),
("FONTNAME", (0,4),(-1,4), "Helvetica-Bold"),
("ROWBACKGROUNDS",(0,1),(-1,3),[WHITE, GRAY_LIGHT]),
("GRID", (0,0),(-1,-1), 0.5, colors.HexColor("#90A4AE")),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
]))
elems.append(ret_tbl)
return elems
# ββ Page 5 β Management (Non-pharmacological) ββββββββββββββββββββββββββββββββ
def management_nonpharm():
elems = [PageBreak()]
elems.append(section_header("MANAGEMENT OF HYPERTENSION", bg=GREEN))
elems.append(sp(6))
elems.append(Paragraph("A. Non-Pharmacological (Lifestyle) Management", sub_style))
elems.append(info_box(
"First-line therapy for all stages of HTN. For mild HTN, lifestyle changes alone "
"may be sufficient. For moderate-severe, used alongside drugs."
))
elems.append(sp(6))
lifestyle_data = [
["Intervention", "Recommendation", "BP Reduction"],
["Sodium Restriction", "< 2.3 g/day (100 mmol/day)", "2-8 mmHg"],
["DASH Diet", "Fruits, vegetables, low-fat dairy;\nreduce saturated fat", "8-14 mmHg"],
["Weight Reduction", "Target BMI 18.5-24.9 kg/mΒ²", "5-20 mmHg per 10 kg"],
["Aerobic Exercise", "30 min moderate exercise,\n5 days/week", "4-9 mmHg"],
["Alcohol Restriction", "Men: β€2 units/day; Women: β€1 unit/day","2-4 mmHg"],
["Smoking Cessation", "Stop completely", "CV risk reduction"],
["Stress Reduction", "Yoga, meditation, relaxation", "Variable"],
]
ls_tbl = Table(lifestyle_data, colWidths=[4.2*cm, 8.3*cm, 4.5*cm])
ls_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), GREEN),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1),(-1,-1),"Helvetica"),
("FONTSIZE", (0,0),(-1,-1), 8.5),
("BACKGROUND", (0,1),(0,-1), LIGHT_GREEN),
("FONTNAME", (0,1),(0,-1), "Helvetica-Bold"),
("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, GRAY_LIGHT]),
("GRID", (0,0),(-1,-1), 0.5, colors.HexColor("#A5D6A7")),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 6),
("VALIGN", (0,0),(-1,-1), "TOP"),
]))
elems.append(ls_tbl)
elems.append(sp(6))
elems.append(tip_box(
'MNEMONIC for Lifestyle Changes: "DASH-WES" β '
'Diet (DASH) | Alcohol reduce | Salt reduce | '
'Hypertension target weight | Weight exercise | Exercise | Smoking cessation'
))
return elems
# ββ Page 6 β Pharmacological Management βββββββββββββββββββββββββββββββββββββββ
def management_pharm():
elems = [PageBreak()]
elems.append(section_header("PHARMACOLOGICAL MANAGEMENT", bg=MED_BLUE))
elems.append(sp(6))
elems.append(Paragraph("B. First-Line Antihypertensive Drugs (4 Classes)", sub_style))
drug_data = [
["CLASS", "EXAMPLES", "KEY INDICATIONS / NOTES"],
["ACE Inhibitors\n(ACEi)", "Ramipril\nEnalapril\nLisinopril",
"DM + HTN (renoprotective)\nHeart failure, post-MI\nAVOID in pregnancy\nSide effect: Dry cough"],
["Angiotensin Receptor\nBlockers (ARBs)",
"Losartan\nValsartan\nIrbesartan",
"Same as ACEi but no cough\nUse if ACEi not tolerated\nAVOID in pregnancy\nRenoprotective in DM"],
["Calcium Channel\nBlockers (CCBs)",
"Amlodipine\nNifedipine\nDiltiazem",
"Elderly patients\nIsolated systolic HTN\nAngina + HTN\nSide effect: Ankle oedema"],
["Diuretics\n(Thiazide)", "Hydrochlorothiazide\nIndapamide\nChlortalidone",
"Elderly / Black patients\nHeart failure\nMonitor K+ and uric acid\nAvoid in gout"],
]
drug_tbl = Table(drug_data, colWidths=[3.8*cm, 4.5*cm, 8.7*cm])
drug_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), MED_BLUE),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1),(-1,-1),"Helvetica"),
("FONTSIZE", (0,0),(-1,-1), 8.5),
("BACKGROUND", (0,1),(0,-1), LIGHT_BLUE),
("FONTNAME", (0,1),(0,-1), "Helvetica-Bold"),
("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, GRAY_LIGHT]),
("GRID", (0,0),(-1,-1), 0.5, colors.HexColor("#90A4AE")),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 6),
("VALIGN", (0,0),(-1,-1), "TOP"),
]))
elems.append(drug_tbl)
elems.append(sp(8))
elems.append(Paragraph("C. Additional / Special Situation Drugs", sub_style))
add_data = [
["CLASS", "EXAMPLES", "SPECIAL INDICATION"],
["Beta-Blockers", "Metoprolol\nAtenolol\nCarvedilol",
"Post-MI, Heart failure, Tachyarrhythmia\nNOT first-line for uncomplicated HTN"],
["Alpha-Blockers", "Prazosin\nDoxazosin",
"HTN + BPH (enlarged prostate)\nPhaeochromocytoma (Phenoxybenzamine)"],
["Aldosterone Antagonists","Spironolactone\nEplerenone",
"Resistant HTN, Heart failure\nMonitor K+ (hyperkalemia risk)"],
["Centrally Acting", "Methyldopa\nClonidine",
"Methyldopa: Drug of choice in PREGNANCY HTN\nClonidine: Hypertensive urgency"],
["IV Emergency Drugs", "Sodium Nitroprusside\nLabetalol\nNicardipine",
"Nitroprusside: Malignant HTN (AIIMS 2015)\nLabetalol: Preferred in pregnancy crisis"],
]
add_tbl = Table(add_data, colWidths=[3.8*cm, 4.5*cm, 8.7*cm])
add_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), DARK_BLUE),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1),(-1,-1),"Helvetica"),
("FONTSIZE", (0,0),(-1,-1), 8.5),
("BACKGROUND", (0,1),(0,-1), LIGHT_BLUE),
("FONTNAME", (0,1),(0,-1), "Helvetica-Bold"),
("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, GRAY_LIGHT]),
("GRID", (0,0),(-1,-1), 0.5, colors.HexColor("#90A4AE")),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 6),
("VALIGN", (0,0),(-1,-1), "TOP"),
]))
elems.append(add_tbl)
elems.append(sp(8))
elems.append(alert_box(
"EXAM ALERT: Drug of choice in PREGNANCY HTN = Methyldopa | "
"Drug of choice in MALIGNANT HTN = Sodium Nitroprusside | "
"ACEi / ARBs are CONTRAINDICATED in pregnancy"
))
return elems
# ββ Page 7 β BP Targets & Special Populations ββββββββββββββββββββββββββββββββ
def targets_page():
elems = [PageBreak()]
elems.append(section_header("BP TARGETS & SPECIAL POPULATIONS", bg=DARK_BLUE))
elems.append(sp(8))
target_data = [
["PATIENT GROUP", "BP TARGET"],
["General population", "< 130/80 mmHg"],
["CKD (with or without DM)","< 130/80 mmHg"],
["CKD + Proteinuria > 1g/day","< 130/80 mmHg"],
["Elderly (> 65 years)", "< 130/80 (if tolerated); avoid < 110/70"],
["Pregnancy (pre-eclampsia)","< 140/90 mmHg (labetalol / methyldopa)"],
["Diabetes Mellitus", "< 130/80 mmHg"],
["Heart Failure", "< 130/80 mmHg (ACEi + Beta-blocker)"],
["Post Stroke / TIA", "< 130/80 mmHg"],
]
tgt_tbl = Table(target_data, colWidths=[9*cm, 8*cm])
tgt_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), DARK_BLUE),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1),(-1,-1),"Helvetica"),
("FONTSIZE", (0,0),(-1,-1), 9),
("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, GRAY_LIGHT]),
("GRID", (0,0),(-1,-1), 0.5, colors.HexColor("#90A4AE")),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
]))
elems.append(tgt_tbl)
elems.append(sp(10))
elems.append(section_header("NURSING MANAGEMENT OF HYPERTENSION", bg=GREEN))
elems.append(sp(6))
nursing_data = [
["NURSING ACTIONS", "RATIONALE"],
["Monitor BP every 1-4 hours (acute)", "Early detection of dangerous elevations"],
["Administer antihypertensives as ordered", "Achieve and maintain target BP"],
["Educate on DASH diet & sodium restriction","Lifestyle modification reduces BP"],
["Ensure medication adherence", "Non-compliance is #1 cause of uncontrolled HTN"],
["Monitor weight daily", "Fluid status assessment"],
["Fall precautions (orthostatic hypotension)","BP medications can cause dizziness/falls"],
["Monitor renal function (creatinine, eGFR)","ACEi/ARBs may affect kidney function"],
["Monitor potassium levels", "Diuretics cause hypokalaemia; ACEi cause hyperkalaemia"],
["Teach self-monitoring of BP at home", "Empowers patient; improves adherence"],
["Assess for TOD signs", "Headache, vision changes, chest pain = emergency"],
]
nr_tbl = Table(nursing_data, colWidths=[8.5*cm, 8.5*cm])
nr_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), GREEN),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1),(-1,-1),"Helvetica"),
("FONTSIZE", (0,0),(-1,-1), 8.5),
("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, GRAY_LIGHT]),
("GRID", (0,0),(-1,-1), 0.5, colors.HexColor("#A5D6A7")),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 6),
("VALIGN", (0,0),(-1,-1), "TOP"),
]))
elems.append(nr_tbl)
return elems
# ββ Page 8 β Quick Revision / Exam Points ββββββββββββββββββββββββββββββββββββ
def revision_page():
elems = [PageBreak()]
elems.append(section_header("QUICK REVISION β TOP EXAM POINTS", bg=ACCENT_RED))
elems.append(sp(8))
qr_data = [
["#", "HIGH-YIELD POINT", "ANSWER"],
["1", "HTN called ___?", "Silent Killer"],
["2", "Primary HTN prevalence?", "~95%"],
["3", "Secondary HTN prevalence?", "~5%"],
["4", "Diagnosis requires?", "3 readings on 3 separate occasions"],
["5", "Normal BP (AHA)?", "< 120/80 mmHg"],
["6", "Hypertensive crisis?", "> 180/120 mmHg"],
["7", "Drug of choice β Malignant HTN?", "Sodium Nitroprusside (IV)"],
["8", "Drug of choice β Pregnancy HTN?", "Methyldopa"],
["9", "ACEi side effect?", "Dry cough"],
["10", "Drug to avoid in gout?", "Thiazide diuretics"],
["11", "Most common cause of CHF?", "Hypertension"],
["12", "KWB Grade 4 finding?", "Papilloedema β emergency"],
["13", "ACEi / ARBs contraindicated in?", "Pregnancy"],
["14", "First-line for elderly / Black patients?", "CCB or Thiazide diuretic"],
["15", "BP target in CKD?", "< 130/80 mmHg"],
["16", "RAAS stands for?", "Renin-Angiotensin-Aldosterone System"],
["17", "Drug for HTN + BPH?", "Alpha-blocker (Prazosin/Doxazosin)"],
["18", "Resistant HTN drug add-on?", "Spironolactone (aldosterone antagonist)"],
["19", "Most common cause of secondary HTN?", "Renal parenchymal disease (CKD)"],
["20", "Best BP measurement method for white-coat HTN?", "24-hour Ambulatory BP Monitoring (ABPM)"],
]
qr_tbl = Table(qr_data, colWidths=[0.7*cm, 9*cm, 7.3*cm])
qr_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,0), ACCENT_RED),
("TEXTCOLOR", (0,0),(-1,0), WHITE),
("FONTNAME", (0,0),(-1,0), "Helvetica-Bold"),
("FONTNAME", (0,1),(-1,-1),"Helvetica"),
("FONTSIZE", (0,0),(-1,-1), 8.5),
("BACKGROUND", (0,1),(0,-1), LIGHT_RED),
("FONTNAME", (0,1),(0,-1), "Helvetica-Bold"),
("FONTNAME", (2,1),(2,-1), "Helvetica-Bold"),
("TEXTCOLOR", (2,1),(2,-1), MED_BLUE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, GRAY_LIGHT]),
("GRID", (0,0),(-1,-1), 0.5, colors.HexColor("#EF9A9A")),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 5),
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
]))
elems.append(qr_tbl)
elems.append(sp(10))
# Footer note
elems.append(tip_box(
"Sources: Braunwald's Heart Disease | Harrison's Principles (22E) | "
"AHA Guidelines | NORCET 11 Syllabus 2026"
))
elems.append(sp(6))
elems.append(Paragraph(
"<i>Study Guide compiled for NORCET 11 β 2026. "
"Always cross-check with latest guidelines before clinical practice.</i>",
small_style
))
return elems
# ββ Assemble & build βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def build():
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=1.5*cm, bottomMargin=1.5*cm,
title="Hypertension Study Guide β NORCET 11 2026",
author="Orris Medical AI",
subject="Hypertension Complications and Management",
)
story = []
story += cover_page()
story += types_page()
story += signs_page()
story += complications_page()
story += management_nonpharm()
story += management_pharm()
story += targets_page()
story += revision_page()
doc.build(story)
print(f"PDF created: {OUTPUT}")
build()
cd /tmp/workspace/hypertension-study-guide && python build_pdf.py 2>&1
~/hypertension-study-guide/build_pdf.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/hypertension-study-guide/build_pdf.py'
cd /tmp/workspace/hypertension-study-guide && python build_pdf.py 2>&1
ls -lh /tmp/workspace/hypertension-study-guide/Hypertension_Study_Guide_NORCET11.pdf
Hypertension Study Guide NORCET11
PDF Document Β· PDF
| Page | Content |
|---|---|
| Page 1 - Cover | AHA BP Classification Table, definition, diagnosis alert |
| Page 2 - Types | Primary vs Secondary HTN side-by-side + Malignant HTN emergency table |
| Page 3 - Signs & Diagnosis | Symptom table by system + diagnosis methods + mnemonic "HEAD-CTV" |
| Page 4 - Complications | Full organ damage table (Heart, Brain, Kidney, Eyes, Vessels) + KWB Retinopathy grading |
| Page 5 - Lifestyle Mgmt | DASH diet, sodium, exercise, alcohol - with expected BP reduction numbers |
| Page 6 - Drug Management | 4 first-line classes + special situation drugs + pregnancy/emergency drug alerts |
| Page 7 - BP Targets + Nursing | Targets for each special population + 10 nursing care actions with rationale |
| Page 8 - Quick Revision | 20 high-yield exam Q&A for last-minute revision |