Hypertension
"hypertension" AND "management"
| Category | Systolic (mmHg) | Diastolic (mmHg) |
|---|---|---|
| Optimal | < 120 | and < 80 |
| Normal | 120-129 | and/or 80-84 |
| High normal | 130-139 | and/or 85-89 |
| Grade 1 HTN | 140-159 | and/or 90-99 |
| Grade 2 HTN | 160-179 | and/or 100-109 |
| Grade 3 HTN | ≥ 180 | and/or > 110 |
| Isolated systolic HTN | ≥ 140 | and < 90 |
When systolic and diastolic values fall into different categories, the higher category is used to classify BP. - Park's Textbook of Preventive and Social Medicine

| Organ | Complications |
|---|---|
| Heart | Left ventricular hypertrophy (LVH), heart failure, coronary artery disease, MI |
| Brain | Ischemic stroke, hemorrhagic stroke, hypertensive encephalopathy, dementia |
| Kidneys | Hypertensive nephrosclerosis, chronic kidney disease (CKD), microalbuminuria |
| Eyes | Hypertensive retinopathy (arteriolar narrowing, AV nicking, flame hemorrhages, papilledema in severe cases) |
| Arteries | Accelerated atherosclerosis, aortic dissection, PAD |
Although BP level and organ damage often correlate, they do not always: markedly high pressures may occur without organ damage, and organ damage may present with only moderate elevation. - Park's Textbook of Preventive and Social Medicine
| Intervention | Expected Benefit |
|---|---|
| Weight loss (if overweight/obese) | ~1 mmHg per kg lost |
| Sodium restriction | Reduction especially in salt-sensitive patients |
| Increased physical activity | Consistent benefit |
| Alcohol restriction (< 20g/day women; < 40g/day men) | Lowers BP |
| DASH diet (rich in fruits, vegetables, low-fat dairy) | 8-14 mmHg reduction |
| Smoking cessation | Reduces overall CV risk |

| Class | Examples | Key Notes |
|---|---|---|
| Thiazide/thiazide-like diuretics | Chlorthalidone, HCTZ, indapamide | Chlorthalidone preferred over HCTZ |
| ACE inhibitors (ACEI) | Lisinopril, enalapril, ramipril | Avoid in pregnancy; monitor K+ and creatinine |
| Angiotensin Receptor Blockers (ARB) | Losartan, valsartan, candesartan | Alternative to ACEI (fewer side effects) |
| Calcium Channel Blockers (CCB) | Amlodipine, nifedipine (DHP); diltiazem, verapamil (non-DHP) | Useful in Black patients; DHP preferred in most |
If monotherapy is insufficient, evidence favors ACEI + CCB (amlodipine) as the best two-drug combination, based on the ACCOMPLISH trial. ACEI + thiazide is an acceptable alternative. - Textbook of Family Medicine 9e
| Comorbid Condition | Preferred Agent(s) |
|---|---|
| Heart failure | ACEI/ARB, β-blocker, MRA (spironolactone), diuretic |
| Post-MI / CAD / Angina | ACEI/ARB, β-blocker, CCB |
| CKD / Proteinuria / Diabetes | ACEI or ARB (renoprotective) |
| Previous stroke | ACEI/ARB, diuretic |
| LVH | ACEI/ARB, CCB |
| Pregnancy | Labetalol, methyldopa, nifedipine (avoid ACEI/ARB) |
| Black patients | CCB, thiazide (ACEI/ARB less effective as monotherapy) |
| Resistant HTN | Add spironolactone 25-50 mg/day (aldosterone blockade) |
| Feature | Hypertensive Emergency | Hypertensive Urgency |
|---|---|---|
| BP | Markedly elevated | Very high (e.g., >200/130) |
| Target organ damage | Present (encephalopathy, retinal hemorrhage/papilledema, AKI, MI, stroke) | Absent |
| Setting | ICU admission required | Can manage outpatient |
| Treatment | IV antihypertensives - immediate BP lowering to ~140/90 | Oral agents; reassess within days |
| Drug | Dose | Onset | Special Notes |
|---|---|---|---|
| Sodium nitroprusside | 0.25-10 µg/kg/min IV | Immediate | Most emergencies; caution with high ICP or azotemia |
| Nicardipine | 5-15 mg/hr IV | 5-10 min | Avoid in acute heart failure |
| Labetalol | 20-80 mg IV bolus q10min | 5-10 min | Good for aortic dissection |
| Hydralazine | 10-20 mg IV | 10-20 min | Preferred in eclampsia |
| Enalaprilat | 1.25-5 mg q6h IV | 15-30 min | Avoid in acute MI |
| Nitroglycerin | 5-100 µg/min IV | 2-5 min | ACS with HTN |
Give me in pdf
ls /home/daytona/workspace/ 2>/dev/null || mkdir -p /home/daytona/workspace
mkdir -p /home/daytona/workspace/hypertension && python3 -c "from reportlab.lib …
~/hypertension/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus import KeepTogether
OUTPUT = "/home/daytona/workspace/hypertension/Hypertension.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2.5*cm, bottomMargin=2.5*cm,
title="Hypertension - Clinical Overview",
author="Orris Medical Library"
)
W = A4[0] - 4*cm # usable width
# ── Colour palette ──────────────────────────────────────────────────────────
NAVY = colors.HexColor("#1a3a5c")
TEAL = colors.HexColor("#1a7a7a")
LTBLUE = colors.HexColor("#e8f4f8")
LTGRAY = colors.HexColor("#f5f5f5")
MIDGRAY= colors.HexColor("#cccccc")
RED = colors.HexColor("#c0392b")
WHITE = colors.white
# ── Styles ───────────────────────────────────────────────────────────────────
base = getSampleStyleSheet()
title_style = ParagraphStyle("DocTitle",
fontSize=26, leading=32, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER, spaceAfter=4)
subtitle_style = ParagraphStyle("DocSubtitle",
fontSize=11, leading=14, textColor=colors.HexColor("#d0e8f0"),
fontName="Helvetica", alignment=TA_CENTER)
h1 = ParagraphStyle("H1",
fontSize=13, leading=16, textColor=WHITE,
fontName="Helvetica-Bold", spaceBefore=14, spaceAfter=4,
leftIndent=6, rightIndent=6)
h2 = ParagraphStyle("H2",
fontSize=11, leading=14, textColor=NAVY,
fontName="Helvetica-Bold", spaceBefore=10, spaceAfter=3,
borderPad=2)
body = ParagraphStyle("Body",
fontSize=9.5, leading=14, textColor=colors.HexColor("#222222"),
fontName="Helvetica", alignment=TA_JUSTIFY, spaceAfter=5)
bullet = ParagraphStyle("Bullet",
fontSize=9.5, leading=13, textColor=colors.HexColor("#222222"),
fontName="Helvetica", leftIndent=14, bulletIndent=4,
spaceAfter=2)
note = ParagraphStyle("Note",
fontSize=8.5, leading=12, textColor=colors.HexColor("#555555"),
fontName="Helvetica-Oblique", leftIndent=10, spaceAfter=4)
source_style = ParagraphStyle("Source",
fontSize=8, leading=11, textColor=colors.HexColor("#888888"),
fontName="Helvetica-Oblique", alignment=TA_CENTER, spaceBefore=8)
def section_header(text, color=NAVY):
"""Returns a coloured section header bar."""
data = [[Paragraph(text, h1)]]
t = Table(data, colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("ROWBACKGROUNDS", (0,0), (-1,-1), [color]),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("ROUNDEDCORNERS", [4, 4, 4, 4]),
]))
return t
def info_box(text, bg=LTBLUE, border=TEAL):
data = [[Paragraph(text, body)]]
t = Table(data, colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 1, border),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
]))
return t
def make_table(headers, rows, col_widths=None, header_bg=NAVY):
if col_widths is None:
col_widths = [W / len(headers)] * len(headers)
data = [[Paragraph(f"<b>{h}</b>", ParagraphStyle("TH",
fontSize=9, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_CENTER)
) for h in headers]]
for i, row in enumerate(rows):
data.append([
Paragraph(str(cell), ParagraphStyle("TD",
fontSize=9, fontName="Helvetica",
textColor=colors.HexColor("#222222"),
leading=12)
) for cell in row
])
t = Table(data, colWidths=col_widths, repeatRows=1)
row_colors = []
for i in range(1, len(rows)+1):
bg = LTBLUE if i % 2 == 0 else WHITE
row_colors.append(("ROWBACKGROUNDS", (0,i), (-1,i), [bg]))
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), header_bg),
("GRID", (0,0), (-1,-1), 0.5, MIDGRAY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
*row_colors,
]))
return t
# ─────────────────────────────────────────────────────────────────────────────
# Build story
# ─────────────────────────────────────────────────────────────────────────────
story = []
# ── Cover banner ─────────────────────────────────────────────────────────────
cover_data = [
[Paragraph("HYPERTENSION", title_style)],
[Paragraph("A Comprehensive Clinical Overview", subtitle_style)],
[Paragraph("Based on Harrison's, Brenner & Rector's, Goodman & Gilman's, Guyton & Hall, Park's", subtitle_style)],
]
cover_table = Table(cover_data, colWidths=[W])
cover_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("TOPPADDING", (0,0), (-1,-1), 16),
("BOTTOMPADDING", (0,0), (-1,-1), 16),
("LEFTPADDING", (0,0), (-1,-1), 14),
("RIGHTPADDING", (0,0), (-1,-1), 14),
]))
story.append(cover_table)
story.append(Spacer(1, 0.5*cm))
# ── 1. Definition ─────────────────────────────────────────────────────────────
story.append(section_header("1. DEFINITION"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Hypertension (HTN) is a sustained elevation in arterial blood pressure above normal thresholds. "
"It affects approximately <b>one third of the adult population</b> worldwide, yet only ~50% of those "
"affected achieve adequate control. It is the leading modifiable risk factor for stroke, myocardial "
"infarction, heart failure, and chronic kidney disease.",
body))
story.append(Paragraph(
"Diagnosis requires confirmed elevated readings on <b>at least two separate occasions</b>, "
"in adults not on antihypertensive drugs and not acutely ill.",
body))
story.append(Spacer(1, 0.3*cm))
# ── 2. Classification ────────────────────────────────────────────────────────
story.append(section_header("2. CLASSIFICATION"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("<b>WHO / ESH Classification (International)</b>", h2))
cls_headers = ["Category", "Systolic (mmHg)", "Diastolic (mmHg)"]
cls_rows = [
["Optimal", "< 120", "and < 80"],
["Normal", "120–129", "and/or 80–84"],
["High Normal", "130–139", "and/or 85–89"],
["Grade 1 Hypertension", "140–159", "and/or 90–99"],
["Grade 2 Hypertension", "160–179", "and/or 100–109"],
["Grade 3 Hypertension", "≥ 180", "and/or > 110"],
["Isolated Systolic HTN", "≥ 140", "and < 90"],
]
story.append(make_table(cls_headers, cls_rows,
col_widths=[W*0.45, W*0.27, W*0.28]))
story.append(Paragraph(
"When systolic and diastolic values fall into different categories, the higher category is used. "
"— Park's Textbook of Preventive and Social Medicine",
note))
story.append(Spacer(1, 0.25*cm))
story.append(Paragraph("<b>ACC/AHA 2017 Classification (USA)</b>", h2))
story.append(Paragraph(
"The 2017 ACC/AHA guideline defines five categories: Normal (<120/<80), Elevated (120–129/<80), "
"Stage 1 HTN (130–139 or 80–89), Stage 2 HTN (≥140 or ≥90), each with progressively increasing "
"cardiovascular risk independent of other risk factors. The 'prehypertension' category was removed. "
"In CKD patients, all with BP >130/80 mmHg require lifestyle intervention AND pharmacotherapy. "
"— Brenner and Rector's The Kidney",
body))
story.append(Spacer(1, 0.3*cm))
# ── 3. Pathophysiology ───────────────────────────────────────────────────────
story.append(section_header("3. PATHOPHYSIOLOGY"))
story.append(Spacer(1, 0.2*cm))
story.append(info_box(
"<b>Blood Pressure = Cardiac Output × Total Peripheral Resistance</b><br/>"
"Three major systems govern long-term BP control: (1) Sympathetic Nervous System (SNS), "
"(2) Renin-Angiotensin-Aldosterone System (RAAS), (3) Renal salt and water handling."))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("<b>Primary (Essential) Hypertension (~90–95% of cases)</b>", h2))
for pt in [
"Impaired renal sodium excretion — pressure-natriuresis curve shifted rightward",
"Salt-sensitive vs salt-insensitive forms; salt sensitivity increases after age 50–60 as nephron mass declines",
"Genetic contributions (numerous loci identified)",
"Obesity and hyperinsulinemia increasing renal tubular sodium reabsorption",
"Positive feedback loop between SNS and RAAS (β-stimulated renin release; Ang II-stimulated NE release)",
]:
story.append(Paragraph(f"• {pt}", bullet))
story.append(Paragraph("<b>Secondary Hypertension (~5–10% of cases)</b>", h2))
sec_headers = ["Cause", "Notes"]
sec_rows = [
["Renal parenchymal disease", "Most common secondary cause; CKD, glomerulonephritis"],
["Renovascular / Renal artery stenosis", "Atherosclerotic (elderly) or fibromuscular dysplasia (young women)"],
["Primary hyperaldosteronism", "Found in 17–23% of resistant HTN; screen with aldosterone:renin ratio"],
["Obstructive sleep apnea (OSA)", "Prevalence 34% in newly diagnosed HTN referred to tertiary centres"],
["Pheochromocytoma", "Episodic HTN, headache, palpitations, sweating; urinary catecholamines"],
["Cushing syndrome", "Glucocorticoid excess; truncal obesity, striae, moon face"],
["Drug-induced", "NSAIDs, oral contraceptives, decongestants, stimulants, calcineurin inhibitors"],
]
story.append(make_table(sec_headers, sec_rows, col_widths=[W*0.38, W*0.62]))
story.append(Spacer(1, 0.3*cm))
# ── 4. Target Organ Damage ───────────────────────────────────────────────────
story.append(section_header("4. TARGET ORGAN DAMAGE & COMPLICATIONS"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Although BP level and organ damage often correlate, markedly high pressures may occur without "
"organ damage and vice versa. The presence of target organ damage confers increased CV risk at "
"any BP level. — Park's Textbook of Preventive and Social Medicine",
body))
tod_headers = ["Organ", "Complications"]
tod_rows = [
["Heart", "LVH, heart failure, coronary artery disease, MI, arrhythmias"],
["Brain", "Ischaemic stroke, haemorrhagic stroke, hypertensive encephalopathy, vascular dementia"],
["Kidneys", "Hypertensive nephrosclerosis, CKD progression, microalbuminuria, proteinuria"],
["Eyes", "Hypertensive retinopathy — arteriolar narrowing, AV nicking, flame haemorrhages, papilloedema (severe)"],
["Arteries","Accelerated atherosclerosis, aortic dissection, peripheral arterial disease (PAD)"],
]
story.append(make_table(tod_headers, tod_rows, col_widths=[W*0.18, W*0.82]))
story.append(Spacer(1, 0.3*cm))
# ── 5. BP Measurement ────────────────────────────────────────────────────────
story.append(section_header("5. BLOOD PRESSURE MEASUREMENT"))
story.append(Spacer(1, 0.2*cm))
for pt in [
"Patient rests <b>seated for ≥3–5 minutes</b> before measurement; legs uncrossed, back and arm supported",
"Neither patient nor examiner should talk during measurement",
"<b>Correct cuff size</b>: bladder should cover ≥80% of arm circumference; too-small cuff gives falsely high readings",
"Korotkoff <b>phase V</b> (disappearance of sound) used for diastolic reading",
"Confirm diagnosis on ≥2 readings on ≥2 separate occasions",
]:
story.append(Paragraph(f"• {pt}", bullet))
story.append(Spacer(1, 0.15*cm))
meas_headers = ["Method", "Threshold for HTN", "Key Advantage"]
meas_rows = [
["Office / Clinic BP", "≥140/90 mmHg", "Standard; but subject to white-coat effect"],
["Home BP Monitoring (HBPM)","≥135/85 mmHg", "Detects white-coat HTN; improves adherence"],
["24-h Ambulatory (ABPM)", "≥130/80 mmHg", "Most accurate; detects masked & nocturnal HTN"],
]
story.append(make_table(meas_headers, meas_rows,
col_widths=[W*0.33, W*0.27, W*0.40]))
story.append(Spacer(1, 0.3*cm))
# ── 6. Management ────────────────────────────────────────────────────────────
story.append(section_header("6. MANAGEMENT"))
story.append(Spacer(1, 0.2*cm))
# BP targets
story.append(Paragraph("<b>Blood Pressure Targets</b>", h2))
tgt_headers = ["Population", "BP Goal"]
tgt_rows = [
["General (most patients)", "< 140/90 mmHg"],
["High-risk (CKD, diabetes, CVD)", "< 130/80 mmHg"],
["Home BP monitoring", "< 135/85 mmHg"],
["24-hour ambulatory BP", "< 130/80 mmHg"],
["Elderly ≥60 years (some guidelines)","< 150/90 mmHg (avoid orthostatic hypotension)"],
]
story.append(make_table(tgt_headers, tgt_rows, col_widths=[W*0.55, W*0.45]))
story.append(info_box(
"A 10/5 mmHg reduction in BP produces approximately a <b>40% reduction in strokes</b> and a "
"<b>20% reduction in ischaemic heart disease events</b>. Risk reduction is predominantly driven "
"by the magnitude of BP reduction, not the specific drug class. — Textbook of Family Medicine 9e"))
story.append(Spacer(1, 0.2*cm))
# Lifestyle
story.append(Paragraph("<b>Step 1 — Lifestyle Modifications</b>", h2))
story.append(Paragraph(
"Indicated for ALL patients. May be sufficient as sole treatment for Grade 1 / Stage 1 HTN.", body))
life_headers = ["Intervention", "Recommendation / Expected Benefit"]
life_rows = [
["Weight loss", "~1 mmHg per kg lost; especially if BMI >25"],
["Sodium restriction", "Target <2.3 g/day; most beneficial in salt-sensitive individuals"],
["Increased physical activity", "≥150 min/week moderate aerobic exercise"],
["Alcohol restriction", "<20 g/day in women; <40 g/day in men"],
["DASH diet", "Rich in fruits, vegetables, low-fat dairy; ~8–14 mmHg reduction"],
["Smoking cessation", "Reduces overall CV risk substantially"],
["Bariatric surgery", "In grossly obese — can normalise BP and increase life expectancy"],
]
story.append(make_table(life_headers, life_rows, col_widths=[W*0.30, W*0.70]))
story.append(Spacer(1, 0.2*cm))
# Drug therapy
story.append(Paragraph("<b>Step 2 — Pharmacological Treatment</b>", h2))
story.append(Paragraph("<b>First-Line Drug Classes</b>", ParagraphStyle("SH", fontSize=10,
fontName="Helvetica-Bold", textColor=TEAL, spaceAfter=4, spaceBefore=4)))
drug_headers = ["Drug Class", "Examples", "Key Notes / Indications"]
drug_rows = [
["Thiazide / thiazide-like diuretics",
"Chlorthalidone, HCTZ, Indapamide",
"Chlorthalidone preferred over HCTZ; effective in Black patients & elderly"],
["ACE Inhibitors (ACEI)",
"Lisinopril, Enalapril, Ramipril",
"Preferred in CKD + proteinuria, diabetes, heart failure, post-MI; avoid in pregnancy; monitor K⁺ & creatinine; may cause dry cough"],
["Angiotensin Receptor Blockers (ARB)",
"Losartan, Valsartan, Candesartan",
"Use when ACEI not tolerated (no cough); same renal/cardiac indications"],
["Calcium Channel Blockers (CCB — DHP)",
"Amlodipine, Nifedipine",
"Effective in Black patients; useful in angina; preferred in elderly with ISH"],
["CCB (Non-DHP)",
"Diltiazem, Verapamil",
"Rate-slowing; useful in AF; avoid with heart failure or AV block"],
["β-Blockers",
"Metoprolol, Bisoprolol, Atenolol",
"NOT first-line in uncomplicated HTN; preferred post-MI, heart failure, angina; atenolol associated with excess stroke risk"],
["Mineralocorticoid Receptor Antagonists (MRA)",
"Spironolactone, Eplerenone",
"Add-on for resistant HTN; preferred in primary aldosteronism; monitor K⁺"],
]
story.append(make_table(drug_headers, drug_rows,
col_widths=[W*0.23, W*0.24, W*0.53]))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("<b>Combination Therapy Rules</b>", h2))
for pt in [
"If BP is >20/10 mmHg above target, <b>start two drugs simultaneously</b> (combination pill preferred)",
"~75% of patients ultimately require ≥2 medications",
"Best two-drug combination: <b>ACEI + CCB (amlodipine)</b> — ACCOMPLISH trial; ACEI + thiazide is an acceptable alternative",
"<b>AVOID:</b> ACEI + ARB dual RAAS blockade — almost always contraindicated",
"Monotherapy with β-blocker (especially atenolol) or α-blocker as first-line is discouraged in uncomplicated HTN",
]:
story.append(Paragraph(f"• {pt}", bullet))
story.append(Spacer(1, 0.2*cm))
# Compelling indications
story.append(Paragraph("<b>Compelling Indications — Drug Choice by Comorbidity</b>", h2))
ci_headers = ["Comorbid Condition", "Preferred Agent(s)"]
ci_rows = [
["Heart failure (reduced EF)", "ACEI/ARB + β-blocker + MRA + diuretic"],
["Post-MI / Coronary artery disease", "ACEI/ARB + β-blocker"],
["Stable angina", "β-blocker, CCB"],
["CKD / Proteinuria / Diabetes", "ACEI or ARB (renoprotective)"],
["Previous stroke", "ACEI/ARB + diuretic"],
["LVH", "ACEI/ARB, CCB"],
["Pregnancy", "Labetalol, Methyldopa, Nifedipine (AVOID ACEI/ARB)"],
["Black patients", "CCB or thiazide (ACEI/ARB less effective as monotherapy)"],
["Primary aldosteronism", "Spironolactone / Eplerenone"],
["Resistant HTN", "Add Spironolactone 25–50 mg/day"],
["Asymptomatic atherosclerosis", "CCB"],
["Microalbuminuria / Renal dysfunction","ACEI or ARB"],
]
story.append(make_table(ci_headers, ci_rows, col_widths=[W*0.45, W*0.55]))
story.append(Spacer(1, 0.3*cm))
# ── 7. HTN Emergency vs Urgency ──────────────────────────────────────────────
story.append(section_header("7. HYPERTENSIVE EMERGENCY vs. URGENCY", color=RED))
story.append(Spacer(1, 0.2*cm))
eu_headers = ["Feature", "Hypertensive Emergency", "Hypertensive Urgency"]
eu_rows = [
["BP level", "Markedly elevated", "Very high (e.g., >200/130 mmHg)"],
["Target organ damage", "<b>PRESENT</b>", "<b>ABSENT</b>"],
["Manifestations", "Encephalopathy, retinal haemorrhage, papilloedema, AKI, acute MI, stroke", "None"],
["Setting", "ICU admission required", "Outpatient management"],
["Treatment", "IV antihypertensives; lower SBP to ~140/90 mmHg gradually", "Oral agents; reassess within days"],
]
story.append(make_table(eu_headers, eu_rows,
col_widths=[W*0.22, W*0.40, W*0.38],
header_bg=RED))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("<b>IV Drugs for Hypertensive Emergencies</b>", h2))
iv_headers = ["Drug", "Dose", "Onset", "Special Notes"]
iv_rows = [
["Sodium nitroprusside", "0.25–10 µg/kg/min IV", "Immediate", "Most emergencies; caution with high ICP or azotaemia; risk of cyanide toxicity"],
["Nicardipine", "5–15 mg/hr IV", "5–10 min", "Most emergencies except acute heart failure; caution with coronary ischaemia"],
["Labetalol", "20–80 mg IV bolus q10 min", "5–10 min", "Aortic dissection; hypertensive encephalopathy; avoid in asthma"],
["Hydralazine", "10–20 mg IV / 10–50 mg IM", "10–20 min", "Eclampsia; caution with coronary ischaemia"],
["Enalaprilat", "1.25–5 mg q6h IV", "15–30 min", "Acute LV failure; avoid in acute MI"],
["Nitroglycerin", "5–100 µg/min IV", "2–5 min", "Acute coronary syndrome with HTN; pulmonary oedema"],
["Fenoldopam", "0.1–0.3 µg/kg/min IV", "< 5 min", "Renal protective; caution in glaucoma"],
]
story.append(make_table(iv_headers, iv_rows,
col_widths=[W*0.20, W*0.22, W*0.13, W*0.45]))
story.append(Spacer(1, 0.3*cm))
# ── 8. Resistant HTN ─────────────────────────────────────────────────────────
story.append(section_header("8. RESISTANT HYPERTENSION"))
story.append(Spacer(1, 0.2*cm))
story.append(info_box(
"Defined as BP above goal despite use of <b>3 or more antihypertensive drugs at optimal doses</b>, "
"including a diuretic. Affects ~10% of the hypertensive population."))
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph("<b>Before labelling resistant HTN, exclude:</b>", h2))
for pt in [
"Non-adherence to medications (most common cause of apparent resistance)",
"White-coat effect — confirm with ABPM",
"Secondary causes: primary aldosteronism (17–23%), OSA, renal artery stenosis, pheochromocytoma",
"Drug interactions: NSAIDs, decongestants, oral contraceptives, calcineurin inhibitors",
"Inadequate diuretic therapy or wrong diuretic choice",
]:
story.append(Paragraph(f"• {pt}", bullet))
story.append(Paragraph(
"Management: Add <b>spironolactone 25–50 mg/day</b> (aldosterone blockade) — strong evidence. "
"Renal denervation may be effective in well-defined cases (Sardar et al., 2019). "
"— Goodman & Gilman's / Textbook of Family Medicine 9e",
note))
story.append(Spacer(1, 0.3*cm))
# ── 9. Special Populations ───────────────────────────────────────────────────
story.append(section_header("9. SPECIAL POPULATIONS"))
story.append(Spacer(1, 0.2*cm))
sp_headers = ["Population", "Key Considerations"]
sp_rows = [
["Elderly",
"Isolated systolic HTN common (arterial stiffening). Target <150/90 (or <140/90). "
"Start low doses. Avoid orthostatic hypotension. Prefer thiazide or CCB."],
["Pregnancy",
"Preeclampsia: SBP ≥140 or DBP ≥90 after 20 weeks + proteinuria ≥300 mg/24h "
"(or end-organ features). Safe drugs: Labetalol, Methyldopa, Nifedipine. "
"ACEI and ARB are CONTRAINDICATED (teratogenic). Treat urgently if BP ≥160/105."],
["CKD",
"All with BP >130/80 require lifestyle + pharmacotherapy. ACEI/ARB preferred "
"(reduce proteinuria and slow progression). Monitor K⁺ and creatinine. "
"— Brenner and Rector's The Kidney"],
["Diabetes",
"Target <130/80 mmHg. ACEI/ARB first-line (nephroprotection). "
"Thiazides and β-blockers may worsen glycaemic control (use with caution)."],
["Black patients",
"Tend to have low-renin, salt-sensitive HTN. CCB and thiazide diuretics more "
"effective as monotherapy. ACEI/ARB less effective alone but can be combined."],
["Heart failure",
"Avoid CCB (non-DHP) and α-blockers. Use ACEI/ARB + β-blocker + MRA + diuretic. "
"Target BP <130/80 mmHg."],
]
story.append(make_table(sp_headers, sp_rows, col_widths=[W*0.20, W*0.80]))
story.append(Spacer(1, 0.3*cm))
# ── 10. Key Takeaways ────────────────────────────────────────────────────────
story.append(section_header("10. KEY TAKEAWAYS"))
story.append(Spacer(1, 0.2*cm))
for pt in [
"Hypertension affects ~1/3 of adults and is the leading modifiable risk factor for stroke, MI, heart failure, and CKD",
"Diagnosis requires confirmed elevated readings on ≥2 separate occasions",
"~90–95% is primary (essential); always exclude secondary causes in resistant or atypical presentations",
"Achieving goal BP is more important than which drug class is chosen in uncomplicated HTN",
"Most patients (~75%) need ≥2 drugs; ACEI + CCB (amlodipine) is the most evidence-backed two-drug combination (ACCOMPLISH trial)",
"NEVER combine ACEI + ARB (dual RAAS blockade) — contraindicated",
"β-blockers and α-blockers are NOT first-line in uncomplicated HTN",
"Hypertensive emergency = target organ damage → requires IV treatment in ICU",
"Lifestyle modifications are always part of treatment and can suffice in mild cases",
"Resistant HTN: consider primary aldosteronism, OSA, non-adherence; add spironolactone empirically",
]:
story.append(Paragraph(f"• {pt}", bullet))
story.append(Spacer(1, 0.3*cm))
story.append(HRFlowable(width=W, thickness=0.5, color=MIDGRAY))
story.append(Paragraph(
"Sources: Textbook of Family Medicine 9e • Brenner and Rector's The Kidney • "
"Goodman & Gilman's Pharmacological Basis of Therapeutics • "
"Guyton and Hall Textbook of Medical Physiology • "
"Park's Textbook of Preventive and Social Medicine • "
"Comprehensive Clinical Nephrology 7e",
source_style))
# ── Build ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved to: {OUTPUT}")
cd /home/daytona/workspace/hypertension && python3 generate_pdf.py
ls -lh /home/daytona/workspace/hypertension/Hypertension.pdf
Hypertension
PDF Document · PDF