Metxl 12.5mg
Metxl 12.5mg metoprolol succinate uses dosage indications
| Indication | Role |
|---|---|
| Hypertension | Reduces blood pressure via decreased cardiac output |
| Stable angina pectoris | First-line antianginal; reduces frequency and severity of anginal attacks, improves exercise tolerance |
| Heart failure with reduced EF (HFrEF) | One of three beta-blockers proven to reduce mortality (alongside bisoprolol and carvedilol) |
| Post-MI (secondary prevention) | Reduces risk of death and reinfarction |
| Rate control in atrial fibrillation | Slows ventricular rate |
| Arrhythmias | Useful in SVTs, inappropriate sinus tachycardia |
| Indication | Starting Dose | Target/Max Dose |
|---|---|---|
| Heart failure (severe / NYHA III-IV) | 12.5 mg once daily | Up to 200 mg/day |
| Heart failure (NYHA II) | 25 mg once daily | 200 mg/day |
| Hypertension / Angina | 25-50 mg once daily | 100-200 mg/day |
| Parameter | Details |
|---|---|
| Metabolism | Extensive hepatic (CYP2D6) with high first-pass effect |
| Half-life (IR) | 4-6 hours |
| Formulation benefit (succinate ER) | Once-daily dosing due to controlled zero-order release |
| CYP2D6 poor metabolizers | Half-life doubled; ~5x more likely to have adverse effects |
| Effect | Notes |
|---|---|
| Bradycardia | Dose-dependent |
| Fatigue, lethargy | Very common |
| Cold extremities | Beta-2 blockade on peripheral vessels |
| Hypoglycemia masking | Blocks tachycardia response; sweating preserved (cholinergic) |
| Depression, insomnia | CNS effects |
| Worsening peripheral vascular disease | Use with caution |
| Initial HF worsening | Fluid retention may occur in first 3-5 days; manage with diuretics |
Create a PDF quick-reference guide for metoprolol in heart failure
ls /home/daytona/workspace/ 2>/dev/null && echo "---" && ls /home/daytona/skills/pdf/
mkdir -p /home/daytona/workspace/metoprolol-guide && python3 -c "import reportlab; print('reportlab ok')"
~/metoprolol-guide/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm, cm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus import PageBreak
OUTPUT = "/home/daytona/workspace/metoprolol-guide/Metoprolol_HF_Quick_Reference.pdf"
# Color palette
DARK_BLUE = colors.HexColor("#1A3A5C")
MED_BLUE = colors.HexColor("#2E6DA4")
LIGHT_BLUE = colors.HexColor("#D6E8F7")
TEAL = colors.HexColor("#1B7A6B")
LIGHT_TEAL = colors.HexColor("#D0EDE8")
RED = colors.HexColor("#C0392B")
LIGHT_RED = colors.HexColor("#FADBD8")
ORANGE = colors.HexColor("#D35400")
LIGHT_ORANGE= colors.HexColor("#FAE5D3")
YELLOW = colors.HexColor("#F5CBA7")
GRAY_BG = colors.HexColor("#F4F6F8")
GRAY_BORDER = colors.HexColor("#BDC3C7")
WHITE = colors.white
BLACK = colors.HexColor("#1C1C1C")
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.5*cm, leftMargin=1.5*cm,
topMargin=1.5*cm, bottomMargin=1.5*cm,
title="Metoprolol in Heart Failure - Quick Reference",
author="Orris Clinical Reference"
)
W, H = A4
CONTENT_W = W - 3*cm
styles = getSampleStyleSheet()
def style(name, **kwargs):
return ParagraphStyle(name, **kwargs)
# --- Custom styles ---
title_style = style("TitleS",
fontName="Helvetica-Bold", fontSize=20, textColor=WHITE,
leading=26, alignment=TA_CENTER, spaceAfter=0)
subtitle_style = style("SubtitleS",
fontName="Helvetica", fontSize=11, textColor=LIGHT_BLUE,
leading=16, alignment=TA_CENTER, spaceAfter=0)
section_hdr = style("SectionHdr",
fontName="Helvetica-Bold", fontSize=11, textColor=WHITE,
leading=14, alignment=TA_LEFT, spaceAfter=0,
leftIndent=6)
body = style("Body",
fontName="Helvetica", fontSize=9, textColor=BLACK,
leading=13, alignment=TA_LEFT)
body_small = style("BodySmall",
fontName="Helvetica", fontSize=8.5, textColor=BLACK,
leading=12, alignment=TA_LEFT)
bold_body = style("BoldBody",
fontName="Helvetica-Bold", fontSize=9, textColor=BLACK,
leading=13, alignment=TA_LEFT)
cell_hdr = style("CellHdr",
fontName="Helvetica-Bold", fontSize=8.5, textColor=WHITE,
leading=11, alignment=TA_CENTER)
cell_txt = style("CellTxt",
fontName="Helvetica", fontSize=8.5, textColor=BLACK,
leading=11, alignment=TA_LEFT)
cell_txt_c = style("CellTxtC",
fontName="Helvetica", fontSize=8.5, textColor=BLACK,
leading=11, alignment=TA_CENTER)
warning_txt = style("WarnTxt",
fontName="Helvetica-Bold", fontSize=8.5, textColor=RED,
leading=12, alignment=TA_LEFT)
note_txt = style("NoteTxt",
fontName="Helvetica-Oblique", fontSize=8, textColor=colors.HexColor("#555555"),
leading=11, alignment=TA_LEFT)
footer_txt = style("FooterTxt",
fontName="Helvetica-Oblique", fontSize=7.5, textColor=colors.HexColor("#777777"),
leading=10, alignment=TA_CENTER)
def section_header(text, bg=MED_BLUE):
tbl = Table([[Paragraph(text, section_hdr)]], colWidths=[CONTENT_W])
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), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("ROWBACKGROUNDS", (0,0), (-1,-1), [bg]),
]))
return tbl
def colored_box(content_rows, bg=GRAY_BG, border=GRAY_BORDER):
tbl = Table(content_rows, colWidths=[CONTENT_W])
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),
("BOX", (0,0), (-1,-1), 0.5, border),
]))
return tbl
story = []
# ═══════════════════════════════════════════════════════════════
# HEADER BANNER
# ═══════════════════════════════════════════════════════════════
header_data = [
[Paragraph("Metoprolol Succinate (ER) in Heart Failure", title_style)],
[Paragraph("Quick Reference Guide • Metxl / Toprol-XL / Met-XL", subtitle_style)],
[Paragraph("Cardioselective Beta-1 Adrenergic Receptor Blocker", subtitle_style)],
]
header_tbl = Table(header_data, colWidths=[CONTENT_W])
header_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (0,0), 14),
("TOPPADDING", (0,1), (0,1), 4),
("TOPPADDING", (0,2), (0,2), 2),
("BOTTOMPADDING", (0,2), (0,2), 14),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
("BOTTOMPADDING", (0,0), (0,0), 2),
]))
story.append(header_tbl)
story.append(Spacer(1, 5))
# ═══════════════════════════════════════════════════════════════
# TWO-COLUMN TOP SECTION: MECHANISM + KEY FACTS
# ═══════════════════════════════════════════════════════════════
col_w = CONTENT_W / 2 - 3
mech_rows = [
[Paragraph("MECHANISM OF ACTION", cell_hdr)],
[Paragraph("Competitively blocks <b>beta-1 (β₁) adrenergic receptors</b> in the myocardium, reducing:", cell_txt)],
[Paragraph("• Heart rate (negative chronotropy)", cell_txt)],
[Paragraph("• Myocardial contractility (negative inotropy)", cell_txt)],
[Paragraph("• Cardiac output & blood pressure", cell_txt)],
[Paragraph("• Myocardial oxygen demand", cell_txt)],
[Spacer(1,4)],
[Paragraph("In HF: counteracts chronic sympathetic overactivation, enables reverse LV remodeling, improves LVEF over months.", cell_txt)],
[Spacer(1,4)],
[Paragraph("50-100× less potent at β₂ than propranolol → cardioselective at therapeutic doses.", note_txt)],
]
mech_tbl = Table(mech_rows, colWidths=[col_w])
mech_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), MED_BLUE),
("BACKGROUND", (0,1), (-1,-1), LIGHT_BLUE),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("BOX", (0,0), (-1,-1), 0.5, MED_BLUE),
]))
facts_rows = [
[Paragraph("KEY DRUG FACTS", cell_hdr)],
[Paragraph("<b>Class:</b> Beta-1 selective blocker", cell_txt)],
[Paragraph("<b>Formulation:</b> Succinate ER (zero-order kinetics)", cell_txt)],
[Paragraph("<b>Dosing frequency:</b> Once daily", cell_txt)],
[Paragraph("<b>Metabolism:</b> Hepatic (CYP2D6), high first-pass", cell_txt)],
[Paragraph("<b>Half-life (ER):</b> ~24h effective duration", cell_txt)],
[Paragraph("<b>Renal adjustment:</b> Not required", cell_txt)],
[Spacer(1,4)],
[Paragraph("<b>CYP2D6 poor metabolizers:</b> t½ doubled; ~5× higher risk of adverse effects.", note_txt)],
[Paragraph("<b>Tartrate vs. Succinate:</b> Only succinate (ER) has proven HF mortality benefit.", note_txt)],
]
facts_tbl = Table(facts_rows, colWidths=[col_w])
facts_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL),
("BACKGROUND", (0,1), (-1,-1), LIGHT_TEAL),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("BOX", (0,0), (-1,-1), 0.5, TEAL),
]))
two_col = Table([[mech_tbl, facts_tbl]], colWidths=[col_w+3, col_w+3])
two_col.setStyle(TableStyle([
("LEFTPADDING", (0,0), (-1,-1), 0),
("RIGHTPADDING", (0,0), (-1,-1), 0),
("TOPPADDING", (0,0), (-1,-1), 0),
("BOTTOMPADDING", (0,0), (-1,-1), 0),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(two_col)
story.append(Spacer(1, 6))
# ═══════════════════════════════════════════════════════════════
# DOSING TABLE
# ═══════════════════════════════════════════════════════════════
story.append(KeepTogether([
section_header("DOSING IN HEART FAILURE (HFrEF)", MED_BLUE),
Spacer(1, 2),
]))
dose_hdr = [
Paragraph("NYHA Class / Condition", cell_hdr),
Paragraph("Starting Dose", cell_hdr),
Paragraph("Target Dose", cell_hdr),
Paragraph("Titration Interval", cell_hdr),
]
dose_data = [
dose_hdr,
[Paragraph("NYHA Class II (mild HF)", cell_txt),
Paragraph("25 mg once daily", cell_txt_c),
Paragraph("200 mg/day", cell_txt_c),
Paragraph("Every 2 weeks", cell_txt_c)],
[Paragraph("NYHA Class III–IV (severe HF)", cell_txt),
Paragraph("12.5 mg once daily\n(Metxl 12.5 dose)", cell_txt_c),
Paragraph("200 mg/day", cell_txt_c),
Paragraph("Every 2 weeks", cell_txt_c)],
[Paragraph("Hypertension / Angina", cell_txt),
Paragraph("25–50 mg once daily", cell_txt_c),
Paragraph("100–200 mg/day", cell_txt_c),
Paragraph("Every 4–5 days", cell_txt_c)],
[Paragraph("Post-MI (secondary prevention)", cell_txt),
Paragraph("25 mg once daily", cell_txt_c),
Paragraph("200 mg/day", cell_txt_c),
Paragraph("As tolerated", cell_txt_c)],
]
dose_tbl = Table(dose_data, colWidths=[CONTENT_W*0.35, CONTENT_W*0.22, CONTENT_W*0.20, CONTENT_W*0.23])
dose_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), MED_BLUE),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_BLUE]),
("GRID", (0,0), (-1,-1), 0.4, GRAY_BORDER),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
]))
story.append(dose_tbl)
story.append(Spacer(1, 3))
story.append(colored_box([
[Paragraph("⚑ Titrate slowly — dose up no sooner than every 2 weeks. Survival benefit is proportional to dose achieved and heart rate reduction.", body_small)],
[Paragraph("⚑ Optimize diuretics BEFORE initiating. Fluid retention may worsen in first 3–5 days; manage with diuretic dose increase.", body_small)],
[Paragraph("⚑ Start only in clinically stable (euvolemic) patients. Do NOT initiate during acute decompensation.", body_small)],
], bg=LIGHT_ORANGE, border=ORANGE))
story.append(Spacer(1, 6))
# ═══════════════════════════════════════════════════════════════
# EVIDENCE BASE
# ═══════════════════════════════════════════════════════════════
story.append(KeepTogether([
section_header("CLINICAL EVIDENCE", TEAL),
Spacer(1, 2),
]))
ev_hdr = [Paragraph("Trial", cell_hdr), Paragraph("Design", cell_hdr),
Paragraph("Key Finding", cell_hdr), Paragraph("Outcome", cell_hdr)]
ev_data = [
ev_hdr,
[Paragraph("MERIT-HF", bold_body),
Paragraph("RCT, 3,991 pts\nNYHA II–IV, EF ≤40%", cell_txt),
Paragraph("Metoprolol succinate CR/XL vs. placebo", cell_txt),
Paragraph("34% ↓ all-cause mortality; 38% ↓ SCD", cell_txt)],
[Paragraph("MDC Trial", bold_body),
Paragraph("RCT, dilated\ncardiomyopathy", cell_txt),
Paragraph("Metoprolol tartrate vs. placebo\n(pilot, shorter-acting)", cell_txt),
Paragraph("Trend toward improved outcomes; succinate ER preferred", cell_txt)],
[Paragraph("COMET", bold_body),
Paragraph("RCT, carvedilol\nvs. metoprolol", cell_txt),
Paragraph("Used metoprolol tartrate (suboptimal) — not succinate ER", cell_txt),
Paragraph("Succinate ER remains standard; tartrate formulation limitation noted", cell_txt)],
]
ev_tbl = Table(ev_data, colWidths=[CONTENT_W*0.15, CONTENT_W*0.22, CONTENT_W*0.35, CONTENT_W*0.28])
ev_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_TEAL]),
("GRID", (0,0), (-1,-1), 0.4, GRAY_BORDER),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(ev_tbl)
story.append(Spacer(1, 3))
story.append(colored_box([
[Paragraph("Only 3 beta-blockers have proven mortality benefit in HFrEF: metoprolol succinate (ER), bisoprolol, and carvedilol. These are NOT interchangeable as a class effect.", bold_body)],
], bg=LIGHT_TEAL, border=TEAL))
story.append(Spacer(1, 6))
# ═══════════════════════════════════════════════════════════════
# CONTRAINDICATIONS + ADVERSE EFFECTS (2-col)
# ═══════════════════════════════════════════════════════════════
story.append(KeepTogether([
section_header("CONTRAINDICATIONS & ADVERSE EFFECTS", RED),
Spacer(1, 2),
]))
ci_rows = [
[Paragraph("CONTRAINDICATIONS", cell_hdr)],
[Paragraph("✗ Clinically significant bradycardia (<50 bpm)", cell_txt)],
[Paragraph("✗ 2nd or 3rd degree AV block (without pacemaker)", cell_txt)],
[Paragraph("✗ Sick sinus syndrome", cell_txt)],
[Paragraph("✗ Decompensated HF / acute pulmonary edema", cell_txt)],
[Paragraph("✗ Cardiogenic shock", cell_txt)],
[Paragraph("✗ Severe reactive airway disease (asthma) — use with caution; nonselective BBs are higher risk", cell_txt)],
[Paragraph("✗ Vasospastic (Prinzmetal) angina — may worsen coronary spasm", cell_txt)],
]
ci_tbl = Table(ci_rows, colWidths=[col_w])
ci_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), RED),
("BACKGROUND", (0,1), (-1,-1), LIGHT_RED),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("BOX", (0,0), (-1,-1), 0.5, RED),
]))
ae_rows = [
[Paragraph("ADVERSE EFFECTS", cell_hdr)],
[Paragraph("<b>Bradycardia</b> — dose-dependent; monitor HR", cell_txt)],
[Paragraph("<b>Fatigue / lethargy</b> — most common complaint", cell_txt)],
[Paragraph("<b>Cold extremities</b> — peripheral vasoconstriction", cell_txt)],
[Paragraph("<b>Hypotension</b> — especially at initiation", cell_txt)],
[Paragraph("<b>Worsening HF symptoms</b> — fluid retention in first 3–5 days; increase diuretic", cell_txt)],
[Paragraph("<b>Hypoglycemia masking</b> — tachycardia blunted; diaphoresis preserved", cell_txt)],
[Paragraph("<b>Depression, insomnia</b> — CNS effects", cell_txt)],
]
ae_tbl = Table(ae_rows, colWidths=[col_w])
ae_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), ORANGE),
("BACKGROUND", (0,1), (-1,-1), LIGHT_ORANGE),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("BOX", (0,0), (-1,-1), 0.5, ORANGE),
]))
two_col2 = Table([[ci_tbl, ae_tbl]], colWidths=[col_w+3, col_w+3])
two_col2.setStyle(TableStyle([
("LEFTPADDING", (0,0), (-1,-1), 0),
("RIGHTPADDING", (0,0), (-1,-1), 0),
("TOPPADDING", (0,0), (-1,-1), 0),
("BOTTOMPADDING", (0,0), (-1,-1), 0),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(two_col2)
story.append(Spacer(1, 6))
# ═══════════════════════════════════════════════════════════════
# DRUG INTERACTIONS
# ═══════════════════════════════════════════════════════════════
story.append(KeepTogether([
section_header("DRUG INTERACTIONS", colors.HexColor("#6C3483")),
Spacer(1, 2),
]))
di_hdr = [Paragraph("Drug / Class", cell_hdr), Paragraph("Interaction", cell_hdr), Paragraph("Action", cell_hdr)]
di_data = [
di_hdr,
[Paragraph("Amiodarone, CYP2D6 inhibitors\n(fluoxetine, paroxetine, duloxetine)", cell_txt),
Paragraph("↑ Metoprolol plasma levels → severe bradycardia, hypotension", cell_txt),
Paragraph("Monitor HR/BP; reduce dose if needed", cell_txt)],
[Paragraph("Verapamil / Diltiazem (IV)", cell_txt),
Paragraph("Additive negative chronotropy; risk of AV block, asystole", cell_txt),
Paragraph("Avoid combination; use with extreme caution", cell_txt)],
[Paragraph("Insulin / Oral hypoglycemics", cell_txt),
Paragraph("Masks tachycardia of hypoglycemia; prolongs hypoglycemia", cell_txt),
Paragraph("Educate patient to monitor for diaphoresis", cell_txt)],
[Paragraph("NSAIDs", cell_txt),
Paragraph("Attenuate antihypertensive effect", cell_txt),
Paragraph("Minimize NSAID use; monitor BP", cell_txt)],
[Paragraph("Clonidine", cell_txt),
Paragraph("Abrupt clonidine withdrawal → rebound HTN, worsened by BB", cell_txt),
Paragraph("Taper BB before stopping clonidine", cell_txt)],
]
di_tbl = Table(di_data, colWidths=[CONTENT_W*0.32, CONTENT_W*0.42, CONTENT_W*0.26])
di_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#6C3483")),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, colors.HexColor("#F5EEF8")]),
("GRID", (0,0), (-1,-1), 0.4, GRAY_BORDER),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(di_tbl)
story.append(Spacer(1, 6))
# ═══════════════════════════════════════════════════════════════
# MONITORING + SPECIAL POPULATIONS (2-col)
# ═══════════════════════════════════════════════════════════════
story.append(KeepTogether([
section_header("MONITORING & SPECIAL POPULATIONS", colors.HexColor("#784212")),
Spacer(1, 2),
]))
mon_rows = [
[Paragraph("MONITORING PARAMETERS", cell_hdr)],
[Paragraph("• Heart rate: target resting HR 55–65 bpm in HF", cell_txt)],
[Paragraph("• Blood pressure at each dose titration step", cell_txt)],
[Paragraph("• Signs of worsening fluid retention (weight, edema, dyspnoea)", cell_txt)],
[Paragraph("• LVEF reassessment at 3–6 months (expect improvement)", cell_txt)],
[Paragraph("• Symptoms of bronchospasm in COPD/asthma patients", cell_txt)],
[Paragraph("• Blood glucose in diabetics (especially after fasting/surgery)", cell_txt)],
[Spacer(1,4)],
[Paragraph("Tip: 2–3 months of therapy required before significant improvement in LV function is seen.", note_txt)],
]
mon_tbl = Table(mon_rows, colWidths=[col_w])
mon_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#784212")),
("BACKGROUND", (0,1), (-1,-1), colors.HexColor("#FAF0E6")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("BOX", (0,0), (-1,-1), 0.5, colors.HexColor("#784212")),
]))
sp_rows = [
[Paragraph("SPECIAL POPULATIONS", cell_hdr)],
[Paragraph("<b>Elderly:</b> Start at lowest dose (12.5 mg); increased sensitivity to bradycardia", cell_txt)],
[Paragraph("<b>Renal impairment:</b> No dose adjustment needed (hepatic metabolism)", cell_txt)],
[Paragraph("<b>Hepatic impairment:</b> Use caution; reduced first-pass metabolism → higher drug levels", cell_txt)],
[Paragraph("<b>Diabetes:</b> Safe to use; counsel on hypoglycemia masking", cell_txt)],
[Paragraph("<b>COPD (mild):</b> Cardioselective BB acceptable with close monitoring", cell_txt)],
[Paragraph("<b>Asthma (active):</b> Generally avoid; if essential, use with extreme caution", cell_txt)],
[Paragraph("<b>Pregnancy:</b> Category C; use only if benefit outweighs risk. Monitor neonate for bradycardia", cell_txt)],
]
sp_tbl = Table(sp_rows, colWidths=[col_w])
sp_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#1A5276")),
("BACKGROUND", (0,1), (-1,-1), colors.HexColor("#EAF2F8")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("BOX", (0,0), (-1,-1), 0.5, colors.HexColor("#1A5276")),
]))
two_col3 = Table([[mon_tbl, sp_tbl]], colWidths=[col_w+3, col_w+3])
two_col3.setStyle(TableStyle([
("LEFTPADDING", (0,0), (-1,-1), 0),
("RIGHTPADDING", (0,0), (-1,-1), 0),
("TOPPADDING", (0,0), (-1,-1), 0),
("BOTTOMPADDING", (0,0), (-1,-1), 0),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(two_col3)
story.append(Spacer(1, 6))
# ═══════════════════════════════════════════════════════════════
# WITHDRAWAL + CRITICAL WARNINGS
# ═══════════════════════════════════════════════════════════════
story.append(KeepTogether([
section_header("CRITICAL WARNINGS", RED),
Spacer(1, 2),
]))
warn_data = [
[Paragraph("⚠ NEVER STOP ABRUPTLY", warning_txt),
Paragraph("Abrupt withdrawal causes rebound tachycardia, severe angina, MI, and hypertensive crisis. Taper over 2–3 weeks.", cell_txt)],
[Paragraph("⚠ VASOSPASTIC ANGINA", warning_txt),
Paragraph("Beta-blockers are ineffective and may worsen coronary spasm in Prinzmetal angina. Calcium channel blockers are preferred.", cell_txt)],
[Paragraph("⚠ FORMULATION MATTERS", warning_txt),
Paragraph("Metoprolol tartrate (IR) does NOT substitute for succinate ER in HF. Only the extended-release succinate formulation has proven mortality benefit.", cell_txt)],
[Paragraph("⚠ INITIAL HF WORSENING", warning_txt),
Paragraph("Beta-blockers have biphasic effects in HF — short-term negative inotropic effect before long-term improvement. Do not discontinue at first worsening; adjust diuretics.", cell_txt)],
]
warn_tbl = Table(warn_data, colWidths=[CONTENT_W*0.26, CONTENT_W*0.74])
warn_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_RED),
("ROWBACKGROUNDS", (0,0), (-1,-1), [LIGHT_RED, colors.HexColor("#FBECEC")]),
("GRID", (0,0), (-1,-1), 0.4, RED),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(warn_tbl)
story.append(Spacer(1, 6))
# ═══════════════════════════════════════════════════════════════
# COMPARISON TABLE
# ═══════════════════════════════════════════════════════════════
story.append(KeepTogether([
section_header("BETA-BLOCKERS WITH PROVEN HF MORTALITY BENEFIT", MED_BLUE),
Spacer(1, 2),
]))
comp_hdr = [Paragraph("Parameter", cell_hdr), Paragraph("Metoprolol Succinate", cell_hdr),
Paragraph("Bisoprolol", cell_hdr), Paragraph("Carvedilol", cell_hdr)]
comp_data = [
comp_hdr,
[Paragraph("Selectivity", cell_txt), Paragraph("Beta-1 selective", cell_txt),
Paragraph("Beta-1 selective", cell_txt), Paragraph("Alpha-1, Beta-1, Beta-2 (non-selective)", cell_txt)],
[Paragraph("Starting dose (HF)", cell_txt), Paragraph("12.5–25 mg OD", cell_txt),
Paragraph("1.25 mg OD", cell_txt), Paragraph("3.125 mg BD", cell_txt)],
[Paragraph("Target dose", cell_txt), Paragraph("200 mg OD", cell_txt),
Paragraph("10 mg OD", cell_txt), Paragraph("25–50 mg BD", cell_txt)],
[Paragraph("Trial", cell_txt), Paragraph("MERIT-HF", cell_txt),
Paragraph("CIBIS-II", cell_txt), Paragraph("COPERNICUS / US Carvedilol", cell_txt)],
[Paragraph("Renal clearance", cell_txt), Paragraph("Minimal", cell_txt),
Paragraph("~50% renal", cell_txt), Paragraph("Minimal", cell_txt)],
[Paragraph("Lipid solubility", cell_txt), Paragraph("Moderate", cell_txt),
Paragraph("Low", cell_txt), Paragraph("High", cell_txt)],
]
comp_tbl = Table(comp_data, colWidths=[CONTENT_W*0.22, CONTENT_W*0.26, CONTENT_W*0.22, CONTENT_W*0.30])
comp_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), MED_BLUE),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_BLUE]),
("GRID", (0,0), (-1,-1), 0.4, GRAY_BORDER),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
]))
story.append(comp_tbl)
story.append(Spacer(1, 8))
# ═══════════════════════════════════════════════════════════════
# FOOTER
# ═══════════════════════════════════════════════════════════════
story.append(HRFlowable(width=CONTENT_W, thickness=0.5, color=GRAY_BORDER))
story.append(Spacer(1, 4))
story.append(Paragraph(
"References: Katzung's Basic & Clinical Pharmacology 16e | Braunwald's Heart Disease | "
"Washington Manual of Medical Therapeutics | Lippincott Illustrated Reviews: Pharmacology | "
"MERIT-HF Trial (Lancet, 1999)",
footer_txt))
story.append(Spacer(1, 2))
story.append(Paragraph(
"For educational purposes only. Always consult current clinical guidelines and verify dosing for individual patients. "
"Generated by Orris Clinical Reference • July 2026",
footer_txt))
# Build PDF
doc.build(story)
print(f"PDF created: {OUTPUT}")
python3 /home/daytona/workspace/metoprolol-guide/generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/metoprolol-guide/
Metoprolol HF Quick Reference
PDF Document · PDF
| Section | Contents |
|---|---|
| Header banner | Drug name, class, formulation |
| Mechanism of Action | Beta-1 blockade, reverse remodeling, sympatholysis |
| Key Drug Facts | Metabolism, half-life, CYP2D6 note, tartrate vs. succinate |
| Dosing Table | Starting & target doses by indication (NYHA II vs. III-IV highlighted) |
| Clinical Evidence | MERIT-HF, MDC, COMET trial summaries |
| Contraindications | AV block, decompensated HF, asthma, vasospastic angina |
| Adverse Effects | Bradycardia, fatigue, hypoglycemia masking, early HF worsening |
| Drug Interactions | CYP2D6 inhibitors, verapamil, NSAIDs, clonidine |
| Monitoring + Special Populations | Elderly, renal/hepatic, diabetes, COPD, pregnancy |
| Critical Warnings | Never stop abruptly, formulation matters, initial HF worsening |
| Comparison Table | Metoprolol succinate vs. bisoprolol vs. carvedilol |
| Footer | References (MERIT-HF, Braunwald's, Katzung's, etc.) |