Give me an elaborate discussion on anti glaucoma medications explaining in details the use, all the mechanisms of action in details , contraindications (ocular and systemic) , peak action , wash off period , dosage . Also fixed dose combination( how they work)
anti glaucoma medications peak action washout period fixed dose combinations 2024
https://eyesoneyecare.com/resources/heres-the-washout-period…
| Drug | Concentration | Dose |
|---|---|---|
| Latanoprost (Xalatan) | 0.005% | 1 drop once nightly (q.h.s.) |
| Travoprost (Travatan Z) | 0.004% | 1 drop once nightly |
| Bimatoprost (Lumigan) | 0.01% or 0.03% | 1 drop once nightly |
| Tafluprost (Zioptan) | 0.0015% | 1 drop once nightly (preservative-free) |
| Latanoprostene bunod (Vyzulta) | 0.024% | 1 drop once nightly |
| Unoprostone (Rescula) | 0.15% | 1 drop twice daily |
Nocturnal dosing is preferred because uveoscleral outflow is highest overnight and corneal penetration is better with reduced tearing.
| Drug | Concentration | Dose |
|---|---|---|
| Timolol (Timoptic) | 0.25%, 0.5% solution | 1 drop twice daily; gel: once daily |
| Levobunolol (Betagan) | 0.25%, 0.5% | 1 drop once or twice daily |
| Betaxolol (Betoptic S) | 0.25% suspension | 1 drop twice daily |
| Carteolol | 1% | 1 drop twice daily |
| Metipranolol | 0.3% | 1 drop twice daily |
Important note on systemic absorption: Topical timolol is absorbed through the conjunctiva and nasal mucosa, bypassing hepatic first-pass metabolism. This produces therapeutic systemic levels capable of causing bronchospasm, bradycardia, and hypotension. Nasolacrimal occlusion (gentle pressure at the inner canthus for 1-2 minutes after instillation) significantly reduces systemic absorption.
Brimonidine also has a neuroprotective role - α2 receptor activation has been associated with protection of retinal ganglion cells from apoptosis, making it valuable in glaucomatous neurodegeneration beyond just IOP lowering.
| Drug | Concentration | Dose |
|---|---|---|
| Brimonidine (Alphagan P) | 0.1%, 0.15%, 0.2% | 1 drop 2-3 times daily |
| Apraclonidine (Iopidine) | 0.5%, 1% | 1% used perioperatively; 0.5% t.i.d. for short-term use |
| Drug | Form | Dose |
|---|---|---|
| Acetazolamide (Diamox) | 125, 250 mg tabs; 500 mg ER | 125-250 mg q.i.d.; ER 500 mg b.i.d.; IV 500 mg stat |
| Methazolamide | 25, 50 mg tabs | 25-50 mg b.i.d. to t.i.d. |
| Dorzolamide (Trusopt) 2% | Solution | 1 drop t.i.d. (b.i.d. as adjunct) |
| Brinzolamide (Azopt) 1% | Suspension | 1 drop t.i.d. (b.i.d. as adjunct) |
| Drug | Concentration | Dose |
|---|---|---|
| Pilocarpine (Isopto Carpine) | 1%, 2%, 4% | 1 drop q.i.d. (4 times daily); start low (1-2%), titrate up |
| Echothiophate iodide | 0.03%-0.25% | 1 drop once or twice daily |
| Drug | Concentration | Dose |
|---|---|---|
| Netarsudil (Rhopressa) | 0.02% | 1 drop once nightly |
| Drug | Dose | Route |
|---|---|---|
| Mannitol 20% (Osmitrol) | 1.5-2 g/kg over 30 min | IV infusion |
| Glycerine | 1-2 g/kg | Oral (with ice, lemon to improve palatability) |
| Isosorbide | 1.5 g/kg | Oral (better for diabetics than glycerine) |
| Drug Class | Drug | Washout Period |
|---|---|---|
| Prostaglandin analogues | Latanoprost, Travoprost, Bimatoprost, Tafluprost, Latanoprostene bunod | 4.5 weeks |
| Unoprostone | 4 weeks | |
| Beta-blockers | Timolol, Levobunolol, Betaxolol, Carteolol, Metipranolol | 4 weeks |
| Alpha-2 agonists | Brimonidine, Apraclonidine | 5 weeks |
| Topical CAIs | Dorzolamide, Brinzolamide, Acetazolamide ER | 1 week |
| Miotics | Pilocarpine | 3 days |
| Rho-kinase inhibitors | Netarsudil | 4 weeks |
| Osmotic agents | Mannitol | 1 week |
| Patient Profile | Preferred FDC |
|---|---|
| Needs maximum IOP reduction, tolerates beta-blocker | DuoTrav, Xalacom, or Rocklatan |
| Cannot tolerate beta-blocker (asthma/COPD/bradycardia) | Simbrinza or Rocklatan |
| Needs t.i.d. dosing for better 24-hr coverage | Simbrinza |
| On PGA + CAI, want to simplify | Cosopt + separate PGA or Simbrinza |
| Pilocarpine intolerant but needs strong IOP control | Rocklatan |
| Class | Drugs | Mechanism | Dose | Peak Action | Washout | Key Contraindication |
|---|---|---|---|---|---|---|
| Prostaglandin analogues | Latanoprost, Travoprost, Bimatoprost, Tafluprost | ↑ Uveoscleral outflow (FP receptor, MMP activation) | Once nightly | 8-12 hrs | 4-4.5 wks | Pregnancy, uveitis, CME |
| Beta-blockers | Timolol, Levobunolol, Betaxolol | ↓ Aqueous production (β2 blockade, ↓cAMP) | Once-twice daily | 1-2 hrs | 4 wks | Asthma, COPD, heart block |
| Alpha-2 agonists | Brimonidine, Apraclonidine | ↓ Aqueous production + ↑ uveoscleral outflow | 2-3x daily | 2 hrs | 5 wks | MAOIs, infants |
| Topical CAIs | Dorzolamide, Brinzolamide | ↓ Aqueous production (CA-II inhibition, ↓HCO3-) | 2-3x daily | 2 hrs | 1 wk | Fuchs dystrophy, sulfa allergy (relative) |
| Systemic CAIs | Acetazolamide, Methazolamide | Same as topical, more potent | Varies | Oral: 4-8 hrs; IV: 15 min | 1 wk | Renal failure, sulfa allergy |
| Miotics | Pilocarpine, Echothiophate | ↑ Conventional outflow (ciliary muscle contraction on trabecular spur) | q.i.d. | 1-2 hrs | 3 days | Retinal holes, age <40, uveitis |
| ROCK inhibitors | Netarsudil | ↑ Conventional outflow (cytoskeletal relaxation), ↓ episcleral venous pressure, ↓ aqueous production | Once nightly | ~8 hrs | 4 wks | Ocular surface disease (relative) |
| Osmotic agents | Mannitol, Glycerine | ↓ Vitreous volume (osmotic gradient) | Acute/PRN | 30-60 min | 1 wk | Anuria, CHF, severe dehydration |
Make a pdf now of the above
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "workspace ready"
mkdir -p /tmp/workspace/antiglaucoma-pdf
~/antiglaucoma-pdf/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, PageBreak, KeepTogether)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus.flowables import HRFlowable
OUTPUT = "/tmp/workspace/antiglaucoma-pdf/Anti_Glaucoma_Medications.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=2*cm,
leftMargin=2*cm,
topMargin=2.5*cm,
bottomMargin=2*cm,
title="Anti-Glaucoma Medications: A Comprehensive Discussion",
author="Orris Medical Reference",
)
W, H = A4
# ── Colour palette ──────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1a3a5c")
MID_BLUE = colors.HexColor("#2c6fad")
LIGHT_BLUE = colors.HexColor("#dce8f5")
ACCENT = colors.HexColor("#e8731a")
LIGHT_GREY = colors.HexColor("#f5f5f5")
MID_GREY = colors.HexColor("#cccccc")
WHITE = colors.white
TEXT_BLACK = colors.HexColor("#1a1a1a")
# ── Styles ──────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
title_style = ParagraphStyle("DocTitle",
fontSize=20, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_CENTER,
spaceAfter=4, spaceBefore=0, leading=26)
subtitle_style = ParagraphStyle("Subtitle",
fontSize=11, fontName="Helvetica",
textColor=colors.HexColor("#b0cce8"), alignment=TA_CENTER,
spaceAfter=2, spaceBefore=0, leading=16)
h1_style = ParagraphStyle("H1",
fontSize=14, fontName="Helvetica-Bold",
textColor=WHITE, alignment=TA_LEFT,
spaceBefore=14, spaceAfter=4, leading=18,
leftIndent=0, backColor=DARK_BLUE,
borderPad=6)
h2_style = ParagraphStyle("H2",
fontSize=12, fontName="Helvetica-Bold",
textColor=DARK_BLUE, alignment=TA_LEFT,
spaceBefore=10, spaceAfter=3, leading=16)
h3_style = ParagraphStyle("H3",
fontSize=10.5, fontName="Helvetica-Bold",
textColor=MID_BLUE, alignment=TA_LEFT,
spaceBefore=8, spaceAfter=2, leading=14)
body_style = ParagraphStyle("Body",
fontSize=9.5, fontName="Helvetica",
textColor=TEXT_BLACK, alignment=TA_JUSTIFY,
spaceBefore=2, spaceAfter=2, leading=14, leftIndent=0)
bullet_style = ParagraphStyle("Bullet",
fontSize=9.5, fontName="Helvetica",
textColor=TEXT_BLACK, alignment=TA_LEFT,
spaceBefore=1, spaceAfter=1, leading=13,
leftIndent=12, bulletIndent=0)
note_style = ParagraphStyle("Note",
fontSize=9, fontName="Helvetica-Oblique",
textColor=colors.HexColor("#555555"), alignment=TA_LEFT,
spaceBefore=2, spaceAfter=2, leading=13,
leftIndent=8, borderPad=4)
bold_body = ParagraphStyle("BoldBody",
fontSize=9.5, fontName="Helvetica-Bold",
textColor=TEXT_BLACK, spaceAfter=2, spaceBefore=2, leading=14)
# ── Helper functions ─────────────────────────────────────────────────────────
def H1(text):
return [Spacer(1, 4*mm),
Table([[Paragraph(text, title_style)]],
colWidths=[W - 4*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("ROUNDEDCORNERS", [4]),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
])),
Spacer(1, 2*mm)]
def H2(text):
return [Spacer(1, 3*mm),
Paragraph(text, h2_style),
HRFlowable(width="100%", thickness=1.5, color=MID_BLUE, spaceAfter=2)]
def H3(text):
return [Paragraph(text, h3_style)]
def P(text):
return [Paragraph(text, body_style)]
def B(items):
"""Bullet list from a list of strings."""
out = []
for item in items:
out.append(Paragraph(f"• {item}", bullet_style))
return out
def NOTE(text):
return [Table([[Paragraph(f"<b>Note:</b> {text}", note_style)]],
colWidths=[W - 4*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_BLUE),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
])),
Spacer(1, 2*mm)]
def make_table(header, rows, col_widths=None):
"""Create a styled table."""
data = [[Paragraph(str(c), ParagraphStyle("TH", fontSize=9, fontName="Helvetica-Bold",
textColor=WHITE, leading=12))
for c in header]]
for row in rows:
data.append([Paragraph(str(c), ParagraphStyle("TD", fontSize=8.5, fontName="Helvetica",
textColor=TEXT_BLACK, leading=11))
for c in row])
available = W - 4*cm
if col_widths is None:
n = len(header)
col_widths = [available / n] * n
t = Table(data, colWidths=col_widths, repeatRows=1)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_GREY]),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING",(0,0), (-1,-1), 5),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
]))
return [t, Spacer(1, 3*mm)]
# ── Cover banner ─────────────────────────────────────────────────────────────
def cover_banner():
banner_data = [[
Paragraph("Anti-Glaucoma Medications", title_style),
"",
],[
Paragraph("A Comprehensive Discussion", subtitle_style),
"",
],[
Paragraph("Mechanisms · Dosage · Contraindications · Peak Action · Washout · Fixed-Dose Combinations",
subtitle_style),
"",
]]
t = Table(banner_data, colWidths=[W - 4*cm, 0])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("SPAN", (0,0), (-1,0)),
("SPAN", (0,1), (-1,1)),
("SPAN", (0,2), (-1,2)),
("LEFTPADDING",(0,0), (-1,-1), 16),
("RIGHTPADDING",(0,0),(-1,-1), 16),
("TOPPADDING", (0,0), (0,0), 20),
("BOTTOMPADDING",(0,2),(-1,2), 20),
("TOPPADDING", (0,1), (0,1), 4),
("TOPPADDING", (0,2), (0,2), 4),
]))
return [t, Spacer(1, 6*mm)]
# ────────────────────────────────────────────────────────────────────────────
# BUILD CONTENT
# ────────────────────────────────────────────────────────────────────────────
story = []
# COVER
story += cover_banner()
# INTRODUCTION
story += H2("Introduction & Aqueous Humor Dynamics")
story += P("Glaucoma is characterised by progressive optic nerve damage with visual field loss, "
"usually associated with elevated intraocular pressure (IOP). Normal IOP is 10-20 mmHg. "
"All pharmacological treatment targets IOP reduction, either by <b>decreasing aqueous humor "
"production</b> or <b>increasing aqueous humor outflow</b>.")
story += P("Aqueous humor is produced by the ciliary body epithelium via a beta-receptor mediated "
"cAMP-PKA pathway (ultrafiltration and active secretion). It drains primarily through:")
story += B([
"Trabecular meshwork → Schlemm's canal (conventional pathway, ~80%)",
"Uveoscleral pathway (unconventional, ~20%)",
])
story += P("Drugs either suppress production or enhance one or both outflow pathways.")
story.append(Spacer(1, 4*mm))
# ═══════════════════════════════════════════════════════════════
# CLASS 1 – PROSTAGLANDIN ANALOGUES
# ═══════════════════════════════════════════════════════════════
story += H1("CLASS 1: PROSTAGLANDIN ANALOGUES (PGAs)")
story += P("<b>Drugs:</b> Latanoprost, Travoprost, Bimatoprost, Tafluprost, Latanoprostene bunod, Unoprostone")
story += P("These are now the <b>first-line agents</b> for most forms of open-angle glaucoma due to "
"once-daily dosing, potent IOP lowering (25-35%), and favourable systemic safety profile.")
story += H2("Mechanism of Action")
story += P("PGF2α and its analogues are prodrugs (isopropyl ester form) hydrolysed by corneal esterases "
"to the free acid form after topical instillation. The free acid binds to <b>FP receptors</b> "
"(prostaglandin F receptors), G-protein coupled receptors linked to the "
"<b>Gα11-PLC-IP3-Ca²⁺</b> signalling pathway active in ciliary muscle cells.")
story += P("IOP-lowering works primarily via <b>increased uveoscleral outflow</b>:")
story += B([
"<b>Ciliary muscle remodelling:</b> FP receptor activation alters ciliary muscle tension, "
"widening spaces in the ciliary muscle bundles to facilitate uveoscleral outflow.",
"<b>MMP release:</b> FP receptor activation upregulates MMP-1, MMP-3, and MMP-9, which digest "
"extracellular matrix (collagen, fibronectin) in the ciliary muscle and trabecular meshwork, "
"reducing resistance to outflow.",
"<b>Trabecular meshwork effects:</b> Some enhancement of conventional outflow.",
"<b>Latanoprostene bunod (Vyzulta):</b> Has a nitric oxide (NO)-donating moiety. Released NO "
"activates soluble guanylate cyclase → increased cGMP → relaxation of trabecular meshwork "
"cytoskeleton → enhanced conventional trabecular outflow IN ADDITION to the latanoprost-mediated "
"uveoscleral effect. This dual mechanism makes it slightly more potent than standard latanoprost.",
])
story += H2("Dosage")
story += make_table(
["Drug (Brand)", "Concentration", "Frequency"],
[
["Latanoprost (Xalatan)", "0.005%", "1 drop once nightly (q.h.s.)"],
["Travoprost (Travatan Z)", "0.004%", "1 drop once nightly"],
["Bimatoprost (Lumigan)", "0.01% or 0.03%", "1 drop once nightly"],
["Tafluprost (Zioptan)", "0.0015%", "1 drop once nightly (preservative-free)"],
["Latanoprostene bunod (Vyzulta)", "0.024%", "1 drop once nightly"],
["Unoprostone (Rescula)", "0.15%", "1 drop twice daily"],
],
col_widths=[7*cm, 4*cm, 6*cm]
)
story += NOTE("Nocturnal dosing is preferred because uveoscleral outflow is highest overnight and "
"corneal penetration is better with reduced tearing.")
story += H2("Onset and Peak Action")
story += B([
"<b>Onset:</b> IOP begins to fall within 3-4 hours of first dose",
"<b>Peak IOP reduction:</b> 8-12 hours after instillation",
"<b>Maximum therapeutic effect:</b> After 3-6 weeks of continuous use (may plateau at 6-8 weeks)",
])
story += H2("Washout Period")
story += B([
"Latanoprost, Travoprost, Bimatoprost, Tafluprost, Latanoprostene bunod: <b>4.5 weeks</b>",
"Unoprostone: <b>4 weeks</b>",
])
story += H2("Contraindications")
story += H3("Ocular Contraindications")
story += B([
"Active uveitis or intraocular inflammation (PGs can exacerbate or trigger uveitis)",
"Cystoid macular edema (CME) — especially in aphakic/pseudophakic eyes",
"Herpes simplex keratitis (relative)",
])
story += H3("Systemic Contraindications")
story += B([
"<b>Pregnancy</b> (absolutely contraindicated — PGF2α is used to induce labour/abortion; may cause "
"uterine contractions and abortion)",
"Women wishing to conceive",
])
story += H3("Side Effects")
story += B([
"<b>Iris hyperpigmentation</b> (irreversible): Increased melanin synthesis in iris stromal melanocytes "
"via FP receptor. Highest risk in hazel/green/mixed-colour eyes. Patients must be informed.",
"Periorbital skin darkening (reversible on stopping)",
"Hypertrichosis of eyelashes: Longer, thicker, darker lashes",
"Conjunctival hyperemia",
"Deepening of upper eyelid sulcus (prostaglandin-associated periorbitopathy, PAP)",
"Drying of eyes, conjunctivitis",
])
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# CLASS 2 – BETA-BLOCKERS
# ═══════════════════════════════════════════════════════════════
story += H1("CLASS 2: BETA-ADRENERGIC RECEPTOR ANTAGONISTS (Beta-Blockers)")
story += P("<b>Non-selective:</b> Timolol, Levobunolol, Carteolol, Metipranolol "
"<b>β1-selective:</b> Betaxolol")
story += P("Previously first-line; now second-line after PGAs. Still widely used as monotherapy "
"or adjuncts.")
story += H2("Mechanism of Action")
story += P("Beta receptors in the <b>ciliary body epithelium</b> are predominantly <b>β2 subtype</b> "
"(75-90% of total). Normally, β-receptor activation → adenylyl cyclase → increased cAMP → "
"PKA activation → stimulates active secretion of aqueous humor.")
story += P("Beta-blockers blunt this pathway:")
story += B([
"<b>Primary:</b> Block β2 receptors on ciliary body non-pigmented epithelium → reduced cAMP-PKA "
"signalling → decreased active secretion of Na⁺, Cl⁻, HCO₃⁻ → decreased aqueous humor "
"production by 20-30%.",
"<b>Secondary hypothesis:</b> Beta-blockers decrease ocular blood flow → reduced ultrafiltration "
"(passive component of aqueous formation).",
"<b>Betaxolol</b> (β1-selective): Less efficacious (eye's receptors are mainly β2), but safer "
"in asthma/COPD (avoids pulmonary β2 blockade).",
"<b>Carteolol</b> has intrinsic sympathomimetic activity (ISA) — less likely to impair lipid profiles.",
"Beta-blockers do NOT affect pupil size or accommodation.",
])
story += H2("Dosage")
story += make_table(
["Drug (Brand)", "Concentration", "Frequency"],
[
["Timolol (Timoptic)", "0.25%, 0.5% solution; gel", "1 drop b.i.d.; gel once daily"],
["Levobunolol (Betagan)", "0.25%, 0.5%", "1 drop once or b.i.d."],
["Betaxolol (Betoptic S)", "0.25% suspension", "1 drop b.i.d."],
["Carteolol", "1%", "1 drop b.i.d."],
["Metipranolol", "0.3%", "1 drop b.i.d."],
],
col_widths=[7*cm, 4*cm, 6*cm]
)
story += H2("Onset and Peak Action")
story += B([
"<b>Onset:</b> IOP reduction begins within 30 minutes",
"<b>Peak IOP reduction:</b> 1-2 hours after instillation",
"<b>Duration:</b> 12-24 hours",
])
story += H2("Washout Period")
story += B(["All beta-blockers: <b>4 weeks</b> (reflects residual β-receptor down-regulation and "
"persistent systemic effects)"])
story += H2("Contraindications")
story += H3("Systemic (Absolute)")
story += B([
"<b>Asthma / reactive airway disease</b> — non-selective agents cause bronchospasm via β2 blockade",
"<b>COPD</b> — significant risk; betaxolol may be used with caution",
"<b>Second- or third-degree AV block, significant bradycardia, sick sinus syndrome</b>",
"<b>Decompensated/unstable congestive heart failure</b>",
])
story += H3("Systemic (Relative)")
story += B([
"Depression (CNS-penetrant agents)",
"Myasthenia gravis",
"Raynaud phenomenon",
"Insulin-dependent diabetes (masks hypoglycaemia symptoms)",
"Reduced exercise tolerance, sexual dysfunction, hypotension",
])
story += NOTE("Topical timolol is absorbed via nasal mucosa, bypassing hepatic first-pass metabolism, "
"producing therapeutic systemic levels. Nasolacrimal occlusion after instillation "
"significantly reduces systemic absorption.")
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# CLASS 3 – ALPHA-2 AGONISTS
# ═══════════════════════════════════════════════════════════════
story += H1("CLASS 3: ALPHA-2 ADRENERGIC AGONISTS")
story += P("<b>Drugs:</b> Brimonidine (Alphagan P), Apraclonidine (Iopidine)")
story += H2("Mechanism of Action")
story += P("Both drugs are <b>selective α2 adrenergic agonists</b> with a dual mechanism:")
story += B([
"<b>Reduced aqueous humor production:</b> Presynaptic α2 receptor activation on ciliary body → "
"decreased cAMP → reduced active secretion of aqueous humor.",
"<b>Enhanced uveoscleral outflow:</b> α2 stimulation may enhance uveoscleral outflow, possibly via "
"endogenous prostaglandin production; some conventional outflow enhancement also occurs.",
"<b>Brimonidine:</b> Highly lipophilic (excellent corneal penetration), more selective for α2 vs α1, "
"crosses the blood-brain barrier, may cause CNS depression especially in children.",
"<b>Apraclonidine:</b> Highly ionised at physiological pH → does NOT cross BBB → fewer CNS effects, "
"but high rate of tachyphylaxis (~40-48% by 3 months) and allergic conjunctivitis.",
"<b>Neuroprotection:</b> Brimonidine's α2 receptor activation has been associated with protection of "
"retinal ganglion cells from apoptosis — potential benefit beyond IOP lowering.",
])
story += H2("Dosage")
story += make_table(
["Drug (Brand)", "Concentration", "Frequency"],
[
["Brimonidine (Alphagan P)", "0.1%, 0.15%, 0.2%", "1 drop b.i.d. to t.i.d."],
["Apraclonidine (Iopidine)", "0.5%, 1%", "1% perioperatively; 0.5% t.i.d. (short-term, max 3 months)"],
],
col_widths=[6.5*cm, 4*cm, 6.5*cm]
)
story += H2("Onset and Peak Action")
story += B([
"<b>Onset:</b> 30-60 minutes",
"<b>Peak IOP reduction:</b> ~2 hours after instillation",
"<b>Duration:</b> 8-12 hours (b.i.d. to t.i.d. dosing required)",
])
story += H2("Washout Period")
story += B(["Brimonidine and Apraclonidine: <b>5 weeks</b> (longest of all individual agents)"])
story += H2("Contraindications")
story += H3("Systemic (Absolute)")
story += B([
"<b>MAOIs (monoamine oxidase inhibitors):</b> Risk of hypertensive crisis",
"<b>Tricyclic antidepressants:</b> Reduce efficacy of brimonidine",
"<b>Children under 2 years (absolute), under 5 years (relative):</b> Risk of apnoea, bradycardia, "
"CNS and cardiorespiratory depression",
])
story += H3("Side Effects")
story += B([
"Allergic blepharoconjunctivitis (~40% with apraclonidine — main reason it is limited to short-term use)",
"Follicular conjunctivitis",
"Upper eyelid retraction (Müller muscle stimulation by α agonism)",
"Dry mouth, headache, fatigue, drowsiness (brimonidine CNS effects)",
"Tachyphylaxis (apraclonidine — limits to 3 months use)",
"Rebound hypertension on abrupt discontinuation",
])
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# CLASS 4 – CAIs
# ═══════════════════════════════════════════════════════════════
story += H1("CLASS 4: CARBONIC ANHYDRASE INHIBITORS (CAIs)")
story += P("<b>Systemic:</b> Acetazolamide, Methazolamide "
"<b>Topical:</b> Dorzolamide (Trusopt), Brinzolamide (Azopt)")
story += H2("Mechanism of Action")
story += P("Carbonic anhydrase isoenzyme <b>CA-II</b> is expressed abundantly in the "
"<b>non-pigmented ciliary body epithelium</b>. It catalyses:")
story += P("<b>CO₂ + H₂O ⇌ H₂CO₃ ⇌ H⁺ + HCO₃⁻</b>")
story += P("Generated HCO₃⁻ is actively transported into the posterior chamber, drawing Na⁺ and "
"water with it to form aqueous humor. <b>CAIs block CA-II → reduced HCO₃⁻ production → "
"decreased aqueous humor production by 15-25%.</b>")
story += B([
"<b>Acetazolamide:</b> Most potent; used for acute IOP crises (IV 500 mg) or chronically oral",
"<b>Methazolamide:</b> Better CNS penetration, less potent, fewer GI side effects",
"<b>Dorzolamide 2%:</b> Topical; achieves adequate CA-II inhibition at ciliary body",
"<b>Brinzolamide 1%:</b> Topical suspension; less burning/stinging than dorzolamide (higher pH formulation)",
])
story += H2("Dosage")
story += make_table(
["Drug", "Form", "Dose"],
[
["Acetazolamide (Diamox)", "125, 250 mg tabs; 500 mg ER; IV", "125-250 mg q.i.d.; ER 500 mg b.i.d.; IV 500 mg stat"],
["Methazolamide", "25, 50 mg tabs", "25-50 mg b.i.d. to t.i.d."],
["Dorzolamide (Trusopt) 2%", "Solution", "1 drop t.i.d. (b.i.d. as adjunct)"],
["Brinzolamide (Azopt) 1%", "Suspension", "1 drop t.i.d. (b.i.d. as adjunct)"],
],
col_widths=[6*cm, 4.5*cm, 6.5*cm]
)
story += H2("Onset and Peak Action")
story += H3("Topical")
story += B(["Onset: 30 min | Peak: ~2 hours | Duration: 8-12 hours"])
story += H3("Oral Acetazolamide")
story += B(["Onset: 1-2 hours oral, immediate IV | Peak: 4-8 hours oral, 15 min IV | Duration: 6-8 hours (regular), 12-18 hours (ER)"])
story += H2("Washout Period")
story += B([
"Dorzolamide, Brinzolamide: <b>1 week</b>",
"Acetazolamide ER: <b>1 week</b>",
])
story += H2("Contraindications")
story += H3("Ocular")
story += B([
"<b>Fuchs corneal dystrophy</b> and post-keratoplasty: Topical CAIs may impair corneal endothelial "
"pump function → risk of corneal decompensation and oedema",
"Any corneal endothelial disease",
])
story += H3("Systemic (Absolute)")
story += B([
"<b>Sulfonamide hypersensitivity:</b> CAIs are sulfonamide derivatives — risk of Stevens-Johnson syndrome, "
"toxic epidermal necrolysis, aplastic anaemia",
"<b>Severe renal failure</b> (drug accumulates; metabolic acidosis cannot be compensated)",
"<b>Adrenal insufficiency (Addison disease):</b> Risk of severe hypokalaemia and acidosis",
"<b>First trimester of pregnancy</b> (teratogenic in animals)",
])
story += H3("Side Effects — Systemic CAIs")
story += B([
"Paresthesias of hands, feet, face (very common — CA inhibition in peripheral nerves)",
"GI upset, anorexia, weight loss",
"Metabolic acidosis, hypokalaemia",
"Kidney stones (alkaline urine → uric acid and calcium phosphate stones)",
"Aplastic anaemia (rare but life-threatening)",
"Stevens-Johnson syndrome (rare)",
])
story += H3("Side Effects — Topical CAIs")
story += B([
"Burning and stinging (dorzolamide > brinzolamide)",
"Bitter/metallic taste (drug drains into nasopharynx)",
"Superficial punctate keratopathy",
"Systemic effects extremely rare; no reported cases of aplastic anaemia from topical use",
])
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# CLASS 5 – MIOTICS
# ═══════════════════════════════════════════════════════════════
story += H1("CLASS 5: CHOLINERGIC AGENTS (MIOTICS)")
story += P("<b>Direct acting:</b> Pilocarpine <b>Indirect (anticholinesterase):</b> Echothiophate iodide")
story += P("Among the oldest antiglaucoma drugs; now used mainly as adjuncts, in angle-closure glaucoma, "
"or when other agents are contraindicated.")
story += H2("Mechanism of Action")
story += H3("Pilocarpine (muscarinic agonist, direct acting)")
story += B([
"Acts on <b>M3 muscarinic receptors</b> on the ciliary muscle and iris sphincter",
"Ciliary muscle contraction → pulls on trabecular meshwork scleral spur → opens trabecular meshwork "
"pores → <b>increases conventional (trabecular) outflow</b>",
"Iris sphincter contraction → <b>miosis</b> — pulls peripheral iris away from the angle → relieves "
"pupillary block in angle-closure glaucoma",
])
story += H3("Echothiophate iodide (irreversible anticholinesterase)")
story += B([
"Irreversibly inhibits acetylcholinesterase → accumulation of endogenous ACh → prolonged activation "
"of muscarinic receptors → sustained miosis and ciliary muscle contraction → sustained trabecular "
"outflow enhancement",
"<b>CRITICAL:</b> Must stop echothiophate 4-6 weeks before succinylcholine anaesthesia — it inhibits "
"plasma pseudocholinesterase → prolonged apnoea (classic exam question!)",
])
story += H2("Dosage")
story += make_table(
["Drug", "Concentration", "Frequency"],
[
["Pilocarpine (Isopto Carpine)", "1%, 2%, 4%", "1 drop q.i.d. (start 1-2%, titrate up)"],
["Echothiophate iodide", "0.03%-0.25%", "1 drop once or twice daily"],
],
col_widths=[6*cm, 4.5*cm, 6.5*cm]
)
story += H2("Onset and Peak Action")
story += B([
"<b>Onset:</b> 10-30 minutes",
"<b>Peak IOP reduction:</b> 1-2 hours",
"<b>Duration:</b> 4-8 hours (hence q.i.d. dosing for pilocarpine)",
"Echothiophate: longer duration due to irreversible mechanism",
])
story += H2("Washout Period")
story += B([
"Pilocarpine: <b>3 days</b> (shortest of all agents — reversible mechanism)",
"Echothiophate: Several weeks (irreversible inhibitor — requires new AChE synthesis)",
])
story += H2("Contraindications")
story += H3("Ocular")
story += B([
"<b>Retinal holes / lattice degeneration:</b> Miosis causes increased vitreoretinal traction → "
"risk of retinal detachment (contraindicated in known retinal tears; relative in high myopes, aphakes)",
"<b>Acute iritis/uveitis:</b> Ciliary muscle spasm worsens pain; miosis promotes posterior synechiae",
"Malignant glaucoma / certain pupillary block configurations (can worsen pupillary block)",
])
story += H3("Systemic")
story += B([
"Patients under 40 years: Accommodative spasm → induced myopia, browache, headache",
"Bradycardia, asthma (systemic cholinergic effects from nasal absorption)",
"Parkinson disease (relative)",
])
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# CLASS 6 – ROCK INHIBITORS
# ═══════════════════════════════════════════════════════════════
story += H1("CLASS 6: RHO-KINASE (ROCK) INHIBITORS")
story += P("<b>Drug:</b> Netarsudil (Rhopressa) — approved 2017")
story += H2("Mechanism of Action")
story += P("Rho-kinase (ROCK) promotes <b>actin-myosin cytoskeletal contraction and increased stiffness</b> "
"in trabecular meshwork cells, increasing resistance to conventional outflow.")
story += P("Netarsudil inhibits ROCK-1 and ROCK-2:")
story += B([
"<b>Cytoskeletal relaxation of trabecular meshwork cells</b> → reduces trabecular meshwork resistance "
"→ increases conventional (trabecular/Schlemm's canal) outflow — targets the PRIMARY dysfunctional "
"pathway in glaucoma",
"<b>Inhibits norepinephrine transporter (NET)</b> → reduces sympathetic tone in the eye → decreases "
"aqueous humor production",
"<b>Reduces episcleral venous pressure</b> → novel additional outflow-enhancing mechanism",
])
story += H2("Dosage")
story += make_table(
["Drug (Brand)", "Concentration", "Frequency"],
[["Netarsudil (Rhopressa)", "0.02%", "1 drop once nightly"]],
col_widths=[7*cm, 4*cm, 6*cm]
)
story += H2("Onset and Peak Action")
story += B([
"<b>Onset:</b> Within hours of instillation",
"<b>Peak effect:</b> ~8 hours",
"<b>Washout period:</b> 4 weeks",
])
story += H2("Side Effects")
story += B([
"<b>Conjunctival hyperemia</b> (most common — up to 50%; main limiting side effect)",
"Conjunctival haemorrhage (petechial/subconjunctival)",
"<b>Cornea verticillata</b> (whorl-like corneal deposits) — clinically insignificant, fully reversible on stopping",
"Corneal staining/oedema",
])
# ═══════════════════════════════════════════════════════════════
# CLASS 7 – OSMOTIC AGENTS
# ═══════════════════════════════════════════════════════════════
story += H1("CLASS 7: OSMOTIC AGENTS")
story += P("<b>Drugs:</b> Mannitol (IV), Glycerine/Glycerol (oral), Isosorbide (oral), Hypertonic saline")
story += P("Used for <b>acute IOP crises</b> (acute angle-closure attack, pre-operative IOP reduction). "
"NOT for chronic use.")
story += H2("Mechanism of Action")
story += P("These agents create an <b>osmotic gradient between blood and vitreous humor</b>. They raise "
"plasma osmolarity, drawing water out of the vitreous (and aqueous) into the circulation → "
"<b>reduces vitreous volume → decreases IOP acutely</b>. They do NOT affect aqueous "
"production or outflow pathways directly.")
story += H2("Dosage")
story += make_table(
["Drug", "Dose", "Route", "Notes"],
[
["Mannitol 20%", "1.5-2 g/kg over 30 min", "IV infusion", "Onset 30-60 min"],
["Glycerine", "1-2 g/kg", "Oral", "Give with ice/lemon; metabolises to glucose"],
["Isosorbide", "1.5 g/kg", "Oral", "Preferred over glycerine in diabetics"],
],
col_widths=[4.5*cm, 4.5*cm, 3.5*cm, 4.5*cm]
)
story += H2("Washout Period")
story += B(["Mannitol: <b>1 week</b>"])
story += H2("Contraindications")
story += B([
"<b>Anuria / severe renal failure:</b> Mannitol cannot be excreted → dangerous volume overload",
"<b>Decompensated heart failure / pulmonary oedema:</b> Acute volume expansion from osmotic shift",
"<b>Intracranial haemorrhage</b>",
"<b>Severe dehydration / hyponatraemia</b>",
"Diabetics: Avoid glycerine (metabolises to glucose) — use isosorbide instead",
])
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════
# WASHOUT REFERENCE TABLE
# ═══════════════════════════════════════════════════════════════
story += H1("COMPREHENSIVE WASHOUT PERIOD REFERENCE TABLE")
story += make_table(
["Drug Class", "Drug / Brand", "Washout Period"],
[
["Prostaglandin analogues", "Latanoprost (Xalatan), Travoprost (Travatan Z), Bimatoprost (Lumigan), Tafluprost (Zioptan), Latanoprostene bunod (Vyzulta)", "4.5 weeks"],
["Prostaglandin analogues", "Unoprostone (Rescula)", "4 weeks"],
["Beta-blockers", "Timolol (Timoptic), Levobunolol (Betagan), Betaxolol (Betoptic S), Carteolol, Metipranolol (Optipranolol)", "4 weeks"],
["Alpha-2 agonists", "Brimonidine (Alphagan P)", "5 weeks"],
["Alpha-2 agonists", "Apraclonidine (Iopidine)", "5 weeks"],
["Topical CAIs", "Dorzolamide (Trusopt), Brinzolamide (Azopt), Acetazolamide ER (Diamox)", "1 week"],
["Miotics", "Pilocarpine (Isopto Carpine)", "3 days"],
["ROCK inhibitors", "Netarsudil (Rhopressa)", "4 weeks"],
["Osmotic agents", "Mannitol (Osmitrol)", "1 week"],
["Fixed combinations", "Cosopt, Cosopt PF (Timolol + Dorzolamide)", "4 weeks"],
["Fixed combinations", "DuoTrav (Timolol + Travoprost), Xalacom (Timolol + Latanoprost), Rocklatan (Netarsudil + Latanoprost)", "4.5 weeks"],
["Fixed combinations", "Combigan (Timolol + Brimonidine), Simbrinza (Brimonidine + Brinzolamide)", "5 weeks"],
],
col_widths=[5*cm, 8.5*cm, 3.5*cm]
)
# ═══════════════════════════════════════════════════════════════
# FIXED-DOSE COMBINATIONS
# ═══════════════════════════════════════════════════════════════
story += H1("FIXED-DOSE COMBINATIONS (FDCs)")
story += P("FDCs combine two drugs from different classes in a single bottle, reducing dosing burden, "
"improving compliance, avoiding the washout effect between sequential drops, and often "
"providing <b>additive or synergistic IOP reduction</b> greater than either agent alone.")
story += H2("Why FDCs Work Better Than Sequential Drops")
story += B([
"When two drops are instilled sequentially, the second drop can wash out part of the first, "
"reducing bioavailability. FDCs deliver both agents simultaneously in a single instillation — "
"eliminating this washout effect.",
"Preservative load is halved, reducing ocular surface toxicity.",
"Improved patient compliance through reduced drop frequency.",
])
story += H2("1. Cosopt / Cosopt PF — Timolol 0.5% + Dorzolamide 2%")
story += B([
"<b>Mechanism:</b> Beta-blocker reduces aqueous production via cAMP-PKA inhibition; CAI reduces "
"aqueous production via CA-II inhibition. Additive dual suppression of aqueous formation through "
"two independent pathways.",
"<b>Dose:</b> 1 drop twice daily",
"<b>IOP reduction:</b> ~25-30%",
"<b>Washout:</b> 4 weeks",
"<b>Contraindications:</b> Asthma, COPD, heart block; Fuchs dystrophy; sulfa allergy (relative)",
])
story += H2("2. Combigan — Brimonidine 0.2% + Timolol 0.5%")
story += B([
"<b>Mechanism:</b> Complementary dual suppression of aqueous formation (α2 and β2 receptor pathways). "
"Brimonidine also enhances uveoscleral outflow for additional benefit.",
"<b>Dose:</b> 1 drop twice daily",
"<b>IOP reduction:</b> ~25-30%, greater than either component alone",
"<b>Washout:</b> 5 weeks",
"<b>Contraindications:</b> Asthma, COPD, heart block; MAOIs; children under 5 years",
])
story += H2("3. Simbrinza — Brimonidine 0.2% + Brinzolamide 1%")
story += B([
"<b>Mechanism:</b> α2 agonist reduces aqueous and increases uveoscleral outflow; CAI reduces aqueous "
"via CA-II inhibition. <b>Contains NO beta-blocker</b> — preferred FDC for asthma, COPD, bradycardia.",
"<b>Dose:</b> 1 drop 3 times daily",
"<b>IOP reduction:</b> Good 24-hour IOP control",
"<b>Washout:</b> 5 weeks",
"<b>Contraindications:</b> MAOIs; children under 5; sulfa allergy (relative); Fuchs dystrophy; renal failure",
])
story += H2("4. DuoTrav — Timolol 0.5% + Travoprost 0.004%")
story += B([
"<b>Mechanism:</b> PGA increases uveoscleral outflow via FP receptor-MMP pathway; beta-blocker reduces "
"aqueous production. Complementary mechanisms (one increases outflow, other decreases inflow) = "
"maximal IOP lowering.",
"<b>Dose:</b> 1 drop once daily (evening)",
"<b>IOP reduction:</b> ~30-35% (among highest of FDCs)",
"<b>Washout:</b> 4.5 weeks",
"<b>Contraindications:</b> Asthma, COPD, heart block; pregnancy; active uveitis; CME",
])
story += H2("5. Xalacom — Timolol 0.5% + Latanoprost 0.005%")
story += B([
"<b>Mechanism:</b> Identical rationale to DuoTrav — PGA + beta-blocker, complementary inflow/outflow targeting.",
"<b>Dose:</b> 1 drop once daily (evening)",
"<b>IOP reduction:</b> ~30-35%",
"<b>Washout:</b> 4.5 weeks",
])
story += H2("6. Rocklatan — Netarsudil 0.02% + Latanoprost 0.005%")
story += B([
"<b>Mechanism:</b> Most mechanistically comprehensive FDC available. Netarsudil enhances conventional "
"trabecular outflow (ROCK inhibition + reduces episcleral venous pressure + reduces aqueous production "
"via NET inhibition); Latanoprost enhances uveoscleral outflow. Together they target ALL THREE outflow "
"pathways simultaneously.",
"<b>Dose:</b> 1 drop once nightly",
"<b>IOP reduction:</b> ~30-36% — slightly superior to either component alone",
"<b>Beta-blocker FREE</b> — important advantage for patients with contraindications",
"<b>Washout:</b> 4.5 weeks",
"<b>Side effects:</b> Conjunctival hyperemia (most common), cornea verticillata, conjunctival haemorrhage, iris pigmentation",
])
story.append(PageBreak())
# FDC SELECTION GUIDE
story += H2("FDC Selection Guide")
story += make_table(
["Patient Profile", "Preferred FDC"],
[
["Needs maximum IOP reduction; tolerates beta-blocker", "DuoTrav, Xalacom, or Rocklatan"],
["Cannot tolerate beta-blocker (asthma / COPD / bradycardia)", "Simbrinza or Rocklatan"],
["Needs t.i.d. dosing for better 24-hour coverage", "Simbrinza"],
["Needs dual aqueous suppression (no PGA)", "Cosopt or Combigan"],
["Maximum outflow enhancement + no beta-blocker", "Rocklatan"],
],
col_widths=[10*cm, 7*cm]
)
# ═══════════════════════════════════════════════════════════════
# MASTER REFERENCE TABLE
# ═══════════════════════════════════════════════════════════════
story += H1("MASTER QUICK-REFERENCE TABLE")
story += make_table(
["Class", "Drugs", "Mechanism", "Dose", "Peak", "Washout", "Key Contraindication"],
[
["PG Analogues", "Latanoprost, Travoprost, Bimatoprost, Tafluprost", "↑ Uveoscleral outflow\n(FP receptor, MMP)", "Once nightly", "8-12 hrs", "4-4.5 wks", "Pregnancy, uveitis, CME"],
["Beta-blockers", "Timolol, Levobunolol, Betaxolol", "↓ Aqueous production\n(β2 blockade, ↓cAMP)", "Once-b.i.d.", "1-2 hrs", "4 wks", "Asthma, COPD, heart block"],
["α2 Agonists", "Brimonidine, Apraclonidine", "↓ Aqueous production\n+ ↑ uveoscleral outflow", "b.i.d.-t.i.d.", "2 hrs", "5 wks", "MAOIs, infants"],
["Topical CAIs", "Dorzolamide, Brinzolamide", "↓ Aqueous production\n(CA-II, ↓HCO₃⁻)", "b.i.d.-t.i.d.", "2 hrs", "1 wk", "Fuchs dystrophy; sulfa allergy (rel.)"],
["Systemic CAIs", "Acetazolamide, Methazolamide", "↓ Aqueous production\n(more potent)", "Varies", "IV: 15 min\nOral: 4-8 hrs", "1 wk", "Renal failure, sulfa allergy"],
["Miotics", "Pilocarpine, Echothiophate", "↑ Conventional outflow\n(ciliary muscle → spur)", "q.i.d.", "1-2 hrs", "3 days", "Retinal holes, uveitis, age <40"],
["ROCK inhibitors", "Netarsudil", "↑ Trabecular outflow\n↓ Episcleral venous P\n↓ Aqueous production", "Once nightly", "~8 hrs", "4 wks", "Ocular surface disease (rel.)"],
["Osmotic agents", "Mannitol, Glycerine", "↓ Vitreous volume\n(osmotic gradient)", "Acute/PRN", "30-60 min", "1 wk", "Anuria, CHF, dehydration"],
],
col_widths=[2.5*cm, 3.5*cm, 3.5*cm, 2.5*cm, 2*cm, 2*cm, 4*cm]
)
# ═══════════════════════════════════════════════════════════════
# STEPWISE APPROACH
# ═══════════════════════════════════════════════════════════════
story += H1("STEP-WISE APPROACH TO GLAUCOMA PHARMACOTHERAPY")
story += B([
"<b>Step 1 (First-line):</b> Prostaglandin analogue (once nightly; most potent, best systemic safety)",
"<b>Step 2 (Add-on or alternative first-line):</b> Beta-blocker (if PGA contraindicated)",
"<b>Step 3 (Second add-on):</b> Alpha-2 agonist (brimonidine) or topical CAI — or FDC of two agents",
"<b>Step 4 (Third add-on):</b> ROCK inhibitor (netarsudil) or Rocklatan (FDC)",
"<b>Step 5 (Specific situations):</b> Pilocarpine (angle-closure, plateau iris syndrome)",
"<b>Acute angle-closure crisis:</b> IV acetazolamide 500 mg + topical timolol 0.5% + topical "
"apraclonidine/brimonidine → if IOP persists after 1 hour: IV mannitol 1.5-2 g/kg over 30 min → "
"laser peripheral iridotomy (definitive treatment)",
])
story.append(Spacer(1, 6*mm))
# SOURCES
story += H2("Key References")
story += B([
"Goodman & Gilman's The Pharmacological Basis of Therapeutics, 14e — Chapter 74 (Ophthalmic Pharmacology)",
"Katzung's Basic and Clinical Pharmacology, 16e",
"The Wills Eye Manual, 8e",
"Tintinalli's Emergency Medicine, 9e — Acute Angle-Closure Glaucoma",
"Lippincott Illustrated Reviews: Pharmacology",
"Eyes on Eyecare — Washout Period Reference (eyesoneyecare.com)",
"EyeWiki — Review of Topical Glaucoma Medications (eyewiki.org)",
])
story.append(Spacer(1, 8*mm))
# Footer note
story.append(Paragraph(
"This document is intended as a clinical reference. Always consult current product information "
"and clinical guidelines for individual patient management decisions.",
ParagraphStyle("Footer", fontSize=8, fontName="Helvetica-Oblique",
textColor=colors.grey, alignment=TA_CENTER)))
# ── BUILD ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /tmp/workspace/antiglaucoma-pdf && python build_pdf.py 2>&1
ls -lh /tmp/workspace/antiglaucoma-pdf/Anti_Glaucoma_Medications.pdf
Anti Glaucoma Medications
PDF Document · PDF