from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
OUTPUT = "/tmp/workspace/Pregnancy_Physiology_Notes.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=2*cm, leftMargin=2*cm,
topMargin=2.5*cm, bottomMargin=2.5*cm,
title="Physiological Changes in Pregnancy - Complete Notes",
author="Orris Medical AI"
)
styles = getSampleStyleSheet()
# Custom styles
H1 = ParagraphStyle('H1', parent=styles['Heading1'],
fontSize=18, textColor=colors.HexColor('#1a3a5c'),
spaceAfter=10, spaceBefore=20, leading=22, fontName='Helvetica-Bold')
H2 = ParagraphStyle('H2', parent=styles['Heading2'],
fontSize=14, textColor=colors.HexColor('#2e6da4'),
spaceAfter=6, spaceBefore=14, leading=18, fontName='Helvetica-Bold')
H3 = ParagraphStyle('H3', parent=styles['Heading3'],
fontSize=12, textColor=colors.HexColor('#1a5276'),
spaceAfter=4, spaceBefore=10, leading=15, fontName='Helvetica-Bold')
H4 = ParagraphStyle('H4', parent=styles['Heading4'],
fontSize=11, textColor=colors.HexColor('#154360'),
spaceAfter=3, spaceBefore=8, leading=14, fontName='Helvetica-BoldOblique')
BODY = ParagraphStyle('Body', parent=styles['Normal'],
fontSize=10, leading=14, spaceAfter=5, fontName='Helvetica',
textColor=colors.HexColor('#2c2c2c'))
BULLET = ParagraphStyle('Bullet', parent=BODY,
leftIndent=14, bulletIndent=0, spaceAfter=3,
bulletFontName='Helvetica')
NOTE = ParagraphStyle('Note', parent=BODY,
fontSize=9, textColor=colors.HexColor('#555555'),
leftIndent=10, italic=True, fontName='Helvetica-Oblique')
SOURCE = ParagraphStyle('Source', parent=BODY,
fontSize=8.5, textColor=colors.HexColor('#666666'),
fontName='Helvetica-Oblique', spaceAfter=8)
COVER_TITLE = ParagraphStyle('CoverTitle',
fontSize=26, textColor=colors.HexColor('#1a3a5c'),
alignment=TA_CENTER, fontName='Helvetica-Bold', leading=32, spaceAfter=10)
COVER_SUB = ParagraphStyle('CoverSub',
fontSize=13, textColor=colors.HexColor('#2e6da4'),
alignment=TA_CENTER, fontName='Helvetica', leading=18, spaceAfter=6)
COVER_NOTE = ParagraphStyle('CoverNote',
fontSize=10, textColor=colors.HexColor('#555555'),
alignment=TA_CENTER, fontName='Helvetica-Oblique', leading=14)
# Table style helper
def make_table_style(header_color='#2e6da4'):
return TableStyle([
('BACKGROUND', (0,0), (-1,0), colors.HexColor(header_color)),
('TEXTCOLOR', (0,0), (-1,0), colors.white),
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
('FONTSIZE', (0,0), (-1,0), 9),
('ALIGN', (0,0), (-1,-1), 'LEFT'),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('FONTNAME', (0,1), (-1,-1), 'Helvetica'),
('FONTSIZE', (0,1), (-1,-1), 9),
('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.HexColor('#f0f4f8'), colors.white]),
('GRID', (0,0), (-1,-1), 0.4, colors.HexColor('#b0c4d8')),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 6),
('RIGHTPADDING', (0,0), (-1,-1), 6),
])
def hr():
return HRFlowable(width="100%", thickness=0.8, color=colors.HexColor('#2e6da4'), spaceAfter=8, spaceBefore=4)
def b(text):
return f"<b>{text}</b>"
def source(text):
return Paragraph(f"<i>Source: {text}</i>", SOURCE)
story = []
# ─────────────────── COVER PAGE ───────────────────
story.append(Spacer(1, 3*cm))
story.append(Paragraph("Physiological Changes in Pregnancy", COVER_TITLE))
story.append(Paragraph("Cardiovascular System, Heart Block & Anesthetic Management", COVER_SUB))
story.append(Spacer(1, 0.5*cm))
story.append(HRFlowable(width="60%", thickness=2, color=colors.HexColor('#2e6da4'), hAlign='CENTER'))
story.append(Spacer(1, 0.5*cm))
story.append(Paragraph("Complete Clinical Notes", COVER_SUB))
story.append(Spacer(1, 3*cm))
toc_data = [
["Topic", "Page"],
["1. CVS Physiological Changes in Pregnancy", "2"],
["2. Heart Block in Pregnancy & Anesthetic Management", "5"],
["3. Types of Heart Block (Classification)", "8"],
["4. Anesthetic Management of Heart Block - Deep Dive", "11"],
["5. Stroke Volume - Definition", "14"],
["6. Physiological Changes in Pregnancy - All Systems", "15"],
]
toc_table = Table(toc_data, colWidths=[13*cm, 2*cm])
toc_table.setStyle(make_table_style('#1a3a5c'))
story.append(toc_table)
story.append(Spacer(1, 1*cm))
story.append(Paragraph("Sources: Braunwald's Heart Disease | Fuster & Hurst's The Heart 15e | Morgan & Mikhail's Clinical Anesthesiology 7e | Harrison's Principles of Internal Medicine 22e | Miller's Anesthesia 10e | Frameworks for Internal Medicine | Creasy & Resnik's Maternal-Fetal Medicine", COVER_NOTE))
story.append(PageBreak())
# ─────────────────── TOPIC 1: CVS CHANGES ───────────────────
story.append(Paragraph("1. CVS Physiological Changes in Pregnancy", H1))
story.append(hr())
story.append(Paragraph("Pregnancy imposes dramatic, well-coordinated cardiovascular adaptations beginning as early as 5-6 weeks of gestation. Driven by hormonal changes (progesterone, estrogen, relaxin), placental vasodilation, and increased metabolic demand.", BODY))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("1.1 Blood Volume", H2))
bv_data = [
["Parameter", "Change"],
["Total blood volume", "+35% (~1000-1500 mL at term; 90 mL/kg)"],
["Plasma volume", "+40-55% (peaks at 24-28 weeks)"],
["Red blood cell mass", "+45%"],
["Result", "Physiological dilutional anaemia of pregnancy"],
["Haemoglobin", "Usually remains >11 g/dL"],
]
t = Table(bv_data, colWidths=[7*cm, 8*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("The disproportionate rise in plasma volume over RBC mass produces physiological dilutional anaemia. Reduced blood viscosity is a beneficial adaptation.", BODY))
story.append(Paragraph("1.2 Cardiac Output (CO)", H2))
story.append(Paragraph("The most important CVS change. CO rises 30-50% above pre-pregnancy baseline.", BODY))
co_data = [
["Parameter", "Change"],
["Cardiac output", "+40% at term"],
["Onset", "From 5 weeks after LMP"],
["Peak", "28-34 weeks gestation"],
["Stroke volume", "+30% (peaks 28-31 weeks)"],
["Heart rate", "+20% (~10-15 bpm above baseline)"],
["Twin pregnancy", "Additional +10-15% CO"],
]
t = Table(co_data, colWidths=[7*cm, 8*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("<b>Mechanism by trimester:</b> 1st & 2nd trimester: rise primarily due to increased stroke volume (+30-40%). 3rd trimester: rise primarily due to increased heart rate (+10-15 bpm). CO begins to decline in late 3rd trimester but does NOT return to pre-pregnancy values until 2-4 weeks postpartum.", BODY))
story.append(Paragraph("1.3 Blood Pressure", H2))
bp_data = [
["Parameter", "Change"],
["Systolic BP", "-5% (5-10 mmHg below baseline)"],
["Diastolic BP", "-15% (more pronounced fall)"],
["Onset", "6-8 weeks; nadir in 2nd trimester"],
["3rd trimester", "Gradually rises back to baseline"],
]
t = Table(bp_data, colWidths=[7*cm, 8*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("Driven by progesterone-mediated vasodilation, prostacyclin, and nitric oxide.", BODY))
story.append(Paragraph("1.4 Vascular Resistance", H2))
vr_data = [
["Parameter", "Change"],
["SVR (Systemic Vascular Resistance)", "-15 to -50%"],
["PVR (Pulmonary Vascular Resistance)", "-30%"],
["CVP / PAP / PCWP", "Unchanged"],
]
t = Table(vr_data, colWidths=[7*cm, 8*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("1.5 Cardiac Structure & Examination", H2))
for item in [
"All four cardiac chambers dilate; myocardial hypertrophy on echo",
"Diaphragm elevation → heart shifts left and upward → apparent cardiomegaly on CXR",
"Left axis deviation and T wave changes on ECG",
"Normal findings: Grade I-II ejection systolic murmur (flow murmur), exaggerated S1 splitting, audible S3, collapsing arterial pulses, laterally displaced apex",
"Small pericardial effusion in some (asymptomatic, normal)",
]:
story.append(Paragraph(f"• {item}", BULLET))
story.append(Paragraph("1.6 Hemodynamics During Labour & Delivery", H2))
labour_data = [
["Stage", "CO Increase vs. Prelabour"],
["Early labour", "+15 to 25%"],
["Active labour", "+50%"],
["Immediately postpartum", "+60 to 80%"],
]
t = Table(labour_data, colWidths=[7*cm, 8*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("Mechanisms: catecholamine surge, autotransfusion from uterine contractions (300-500 mL per contraction), relief of IVC compression, pain.", BODY))
story.append(Paragraph("1.7 Aortocaval Compression (from week 20)", H2))
for item in [
"Gravid uterus compresses IVC in supine position → ↓ venous return → ↓ CO",
"~5% of women at term develop supine hypotension syndrome (pallor, sweating, nausea, hypotension)",
"Aorta also compressed → ↓ uteroplacental perfusion",
"Management: Left lateral tilt >15° (wedge under right hip)",
"Chronic partial IVC obstruction → lower limb oedema, DVT risk, dilated epidural veins",
]:
story.append(Paragraph(f"• {item}", BULLET))
story.append(Paragraph("1.8 Postpartum Resolution", H2))
for item in [
"Heart rate falls ~14% within 48 hours of delivery",
"CO normalises by 2 weeks postpartum",
"Complete haemodynamic resolution may take up to 6 months",
"First week postpartum: fluid mobilisation can precipitate heart failure in susceptible women",
]:
story.append(Paragraph(f"• {item}", BULLET))
story.append(source("Braunwald's Heart Disease p.1062; Fuster & Hurst's The Heart 15e p.2209; Morgan & Mikhail's Clinical Anesthesiology 7e p.1572-1576"))
story.append(PageBreak())
# ─────────────────── TOPIC 2: HEART BLOCK IN PREGNANCY ───────────────────
story.append(Paragraph("2. Heart Block in Pregnancy & Anesthetic Management", H1))
story.append(hr())
story.append(Paragraph("2.1 Overview", H2))
story.append(Paragraph("Heart block in pregnancy falls into two categories:", BODY))
story.append(Paragraph("• <b>Maternal Heart Block</b> - AV conduction disease in the pregnant woman", BULLET))
story.append(Paragraph("• <b>Congenital Heart Block (Fetal/Neonatal)</b> - passively acquired by fetus from maternal anti-Ro/SSA antibodies", BULLET))
story.append(Paragraph("2.2 Why Pregnancy Is Challenging in Heart Block", H2))
story.append(Paragraph("Pregnancy requires a progressive rise in CO of 30-50%. In the 3rd trimester, CO augmentation depends predominantly on heart rate increase. In complete heart block, ventricular rate is fixed (35-55 bpm). The patient CANNOT augment heart rate in response to:", BODY))
for item in [
"Increased metabolic demand of pregnancy",
"Labour contractions (catecholamine surge)",
"Haemorrhage",
"Anaesthetic-induced vasodilation",
]:
story.append(Paragraph(f"• {item}", BULLET))
story.append(Paragraph("2.3 Management by Degree", H2))
mgmt_data = [
["Degree", "Features", "Management in Pregnancy"],
["1st degree", "PR >200 ms, all beats conducted", "Monitor for progression; no intervention"],
["2nd degree Mobitz I", "Progressive PR lengthening, dropped beats", "Usually benign; monitor"],
["2nd degree Mobitz II", "Fixed PR, sudden dropped beats, infranodal", "High risk - permanent pacemaker; TCP on standby"],
["3rd degree (CHB)", "Complete AV dissociation, escape rhythm", "See detailed management below"],
]
t = Table(mgmt_data, colWidths=[3*cm, 5.5*cm, 6.5*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("2.4 Complete Heart Block - Specific Management", H2))
chb_data = [
["Scenario", "Management"],
["Asymptomatic, pre-existing CHB", "Expectant management; NO prophylactic temporary pacing needed even with Valsalva"],
["Asymptomatic → develops symptoms during pregnancy", "Permanent pacemaker required"],
["Symptomatic at any point", "Permanent pacemaker"],
["Emergency", "Transcutaneous pacing until transvenous pacing possible"],
["Pacemaker implantation during pregnancy", "Echocardiographic guidance to minimise fetal radiation"],
]
t = Table(chb_data, colWidths=[6*cm, 9*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("Note: Whether pacemaker settings should be increased during pregnancy to augment CO remains under investigation. Prophylactic pacing of asymptomatic women provides no benefit.", NOTE))
story.append(Paragraph("2.5 Congenital Heart Block (Neonatal Lupus)", H2))
story.append(Paragraph("Mothers with anti-Ro/SSA and/or anti-La/SSB antibodies (SLE, Sjögren's) transfer these IgG antibodies across the placenta → inflammation and fibrosis of fetal AV node.", BODY))
cchb_data = [
["Scenario", "Risk of CCHB"],
["Anti-Ro/SSA positive, no prior history", "~2%"],
["Prior child with complete heart block", "15-20% recurrence"],
]
t = Table(cchb_data, colWidths=[9*cm, 6*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("<b>Prevention:</b> Hydroxychloroquine (HCQ) - PATCH study showed >50% reduction in CCHB recurrence. Fetal echo screening 16-26 weeks. Most neonates with CCHB require permanent pacemaker after birth.", BODY))
story.append(source("Fuster & Hurst's The Heart 15e p.2221; Creasy & Resnik's Maternal-Fetal Medicine p.2468-2470"))
story.append(PageBreak())
# ─────────────────── TOPIC 3: TYPES OF HEART BLOCK ───────────────────
story.append(Paragraph("3. Types of Heart Block - Full Classification", H1))
story.append(hr())
story.append(Paragraph("3.1 Anatomy of the AV Conduction System", H2))
for item in [
"AV nodal artery: from RCA in 80-90%, left circumflex in 10%, both in 10%",
"Bundle of His and bundle branches: dual supply from LAD septal perforators (LBB, proximal RBB) and posterior descending artery",
"AV node: richly innervated by sympathetic AND parasympathetic nerves",
"Bundle of His and distal conduction system: NOT influenced by autonomic tone → why atropine fails in Mobitz II / CHB",
]:
story.append(Paragraph(f"• {item}", BULLET))
story.append(Paragraph("3.2 First-Degree AV Block", H2))
fd_data = [
["Feature", "Detail"],
["Definition", "PR interval >200 ms; ALL beats conducted; no dropped beats"],
["Site of delay", "Usually AV node (can be atria, His bundle, or Purkinje)"],
["ECG", "Prolonged fixed PR; 1:1 P:QRS ratio"],
["Symptoms", "Usually none; severe (PR >300 ms): dyspnoea, light-headedness on exertion"],
["Causes", "Beta-blockers, digoxin, CCBs, inferior MI, Lyme disease, myocarditis, amyloidosis, athletes (vagal)"],
["Prognosis", "Benign; slight increased risk of AF and conduction progression"],
["Treatment", "Usually none; address reversible causes"],
["In pregnancy", "Well tolerated; monitor for progression"],
]
t = Table(fd_data, colWidths=[4*cm, 11*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("3.3 Second-Degree AV Block - Mobitz I (Wenckebach)", H2))
m1_data = [
["Feature", "Detail"],
["ECG pattern", "Progressive PR prolongation before a suddenly dropped QRS; PR resets after dropped beat; RR shortens before drop"],
["Site of block", "AV node (nodal)"],
["Associated MI", "Right coronary artery territory - inferior MI (ST elevation II, III, aVF)"],
["Symptoms", "Usually asymptomatic; mild palpitations/light-headedness"],
["Prognosis", "Haemodynamically stable; does NOT require pacing if asymptomatic"],
["Treatment", "Address reversible causes; pacing rarely needed"],
["In pregnancy", "Monitor; generally does not require intervention"],
]
t = Table(m1_data, colWidths=[4*cm, 11*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("3.4 Second-Degree AV Block - Mobitz II", H2))
m2_data = [
["Feature", "Detail"],
["ECG pattern", "Fixed PR interval; sudden unexpected dropped QRS with NO preceding PR prolongation; QRS often WIDE"],
["Site of block", "Below AV node - His-Purkinje system or bundle branches (infranodal)"],
["Associated MI", "LAD territory - anterior MI (ST elevation V1-V4)"],
["Symptoms", "Frequently symptomatic: dyspnoea, syncope, presyncope"],
["Prognosis", "Serious - high rate of progression to CHB; risk of sudden death"],
["Treatment", "Permanent pacemaker virtually always required (even if asymptomatic)"],
["In pregnancy", "High risk - permanent pacemaker; TCP standby during labour"],
]
t = Table(m2_data, colWidths=[4*cm, 11*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("3.5 Special Case: 2:1 AV Block", H2))
story.append(Paragraph("Alternating conducted and non-conducted beats. Cannot distinguish Mobitz I vs II on ECG alone.", BODY))
twone_data = [
["Feature", "Suggests Nodal (Mobitz I)", "Suggests Infranodal (Mobitz II)"],
["QRS width", "Narrow", "Wide"],
["PR interval", ">160 ms", "<160 ms"],
["Response to atropine", "Improves", "No improvement"],
["Response to exercise", "Conduction improves", "Conduction worsens"],
["Prognosis/treatment", "Often benign", "Permanent pacemaker required"],
]
t = Table(twone_data, colWidths=[4*cm, 5.5*cm, 5.5*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("3.6 Third-Degree (Complete) Heart Block", H2))
chb_data2 = [
["Feature", "Detail"],
["Definition", "Complete AV dissociation - NO atrial impulse reaches the ventricles"],
["ECG", "P waves at regular atrial rate; QRS complexes at slower escape rate; NO fixed P-QRS relationship"],
["Escape rhythm - narrow QRS", "Block in AV node/proximal His; 40-60 bpm junctional; more stable and reliable"],
["Escape rhythm - wide QRS", "Block in distal His/bundle branches; 20-40 bpm idioventricular; slow, unreliable, risk of asystole"],
["Symptoms", "Stokes-Adams attacks (syncope), severe dyspnoea, heart failure, presyncope; ventricular rate 35-55 bpm"],
["Causes", "Congenital (most common in young women), fibrosis (Lenègre/Lev), inferior/anterior MI, post-cardiac surgery, SLE/anti-Ro, Lyme disease, sarcoidosis, amyloidosis, drug toxicity (digoxin, beta-blockers)"],
["Treatment", "Permanent pacemaker in virtually all symptomatic patients; echoguided in pregnancy"],
]
t = Table(chb_data2, colWidths=[4.5*cm, 10.5*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(source("Harrison's Principles of Internal Medicine 22e p.1969; Frameworks for Internal Medicine p.47-49; Miller's Anesthesia 10e p.12222"))
story.append(PageBreak())
# ─────────────────── TOPIC 4: ANAESTHETIC MANAGEMENT DEEP DIVE ───────────────────
story.append(Paragraph("4. Anesthetic Management of Heart Block in Pregnancy - Deep Dive", H1))
story.append(hr())
story.append(Paragraph("4.1 Core Physiological Problem", H2))
story.append(Paragraph("In complete heart block, ventricular rate is fixed by the escape pacemaker. No compensatory tachycardia is possible. Any fall in BP or increase in demand cannot be corrected by reflex tachycardia. The only compensatory mechanism is increased stroke volume (preload-dependent) - and this too is limited.", BODY))
story.append(Paragraph("4.2 Pre-Anaesthetic Preparation", H2))
pre_data = [
["Assessment", "Detail"],
["ECG + Holter monitor", "Document escape rate range (typically 37-53 bpm in CHB)"],
["Echocardiography", "LV/RV function, wall motion, structural disease"],
["Electrolytes", "K⁺ >4.0 mEq/L, Mg²⁺ >2.0 mg/dL (normalise before any procedure)"],
["Blood group & cross-match", "Haemorrhage tolerated poorly with fixed heart rate"],
["Pacemaker check", "Verify settings and function if device in situ"],
["MDT planning", "OB + Cardiology + EP + Anaesthesia + Neonatology"],
]
t = Table(pre_data, colWidths=[5*cm, 10*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("4.3 Pacing Strategy", H2))
pac_data = [
["Patient Status", "Pacing Approach"],
["Asymptomatic, haemodynamically stable", "Transcutaneous pads on standby; NO prophylactic pacing needed"],
["Symptomatic (syncope, dyspnoea, haemodynamic compromise)", "Permanent pacemaker before or during pregnancy (echoguided)"],
["Emergency labour/LSCS without pacemaker", "Transcutaneous pacing immediately; convert to transvenous ASAP"],
["Pacemaker in situ", "Check settings; consider rate programming adjustment"],
]
t = Table(pac_data, colWidths=[6*cm, 9*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("Why atropine is INEFFECTIVE in Mobitz II and CHB: Atropine reverses vagal effects on the AV node only. In infranodal block (Mobitz II, CHB), there is NO vagal innervation below the AV node. Atropine cannot accelerate an idioventricular escape rhythm and may worsen the situation.", NOTE))
story.append(Paragraph("4.4 Drug Management of Bradycardia", H2))
drug_data = [
["Drug", "Dose", "Mechanism", "Role in Heart Block"],
["Atropine", "1 mg IV q3-5 min; max 3 mg\n(avoid <0.5 mg)", "Antimuscarinic - blocks vagal tone on AV node", "Only for NODAL block (Mobitz I, sinus brady). NOT effective for Mobitz II or CHB"],
["Dopamine", "2-20 mcg/kg/min IV", "Alpha + beta adrenergic; rate/inotropy at low dose, vasoconstriction >10 mcg/kg/min", "2nd line for bradycardia unresponsive to atropine"],
["Epinephrine", "2-10 mcg/min IV infusion", "Alpha + beta", "Severe bradycardia/cardiac arrest"],
["Isoproterenol", "2-10 mcg/min IV infusion", "Pure beta-1 and beta-2 agonist", "Accelerates ventricular escape rhythm; useful temporising in CHB while awaiting pacing; causes vasodilation"],
["Phenylephrine", "50-100 mcg IV boluses", "Pure alpha-1", "Treats hypotension WITHOUT increasing HR - 1st choice for neuraxial-induced hypotension"],
["Ephedrine", "5-10 mg IV", "Alpha + beta", "Treats hypotension + raises HR; use if bradycardia co-exists"],
]
t = Table(drug_data, colWidths=[2.8*cm, 3*cm, 4*cm, 5.2*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("4.5 Anaesthetic Technique", H2))
story.append(Paragraph("<b>For Labour Analgesia - Epidural (strongly preferred):</b>", H4))
for item in [
"Slow, titrated sympathectomy avoids sudden haemodynamic swings",
"0.2% ropivacaine at 10 mL/hr (or equivalent low-dose bupivacaine)",
"Blunts catecholamine surges of labour pain",
"Epidural catheter can be used for subsequent caesarean if needed",
]:
story.append(Paragraph(f"• {item}", BULLET))
story.append(Paragraph("<b>For Elective LSCS - Epidural top-up (preferred):</b>", H4))
for item in [
"Incremental boluses: e.g., 0.5% bupivacaine + 2% lidocaine in 5 mL increments to T4 level",
"Prophylactic atropine 0.2 mg IV before block establishment",
"Arterial line (radial artery, 20G) for beat-to-beat monitoring",
]:
story.append(Paragraph(f"• {item}", BULLET))
story.append(Paragraph("<b>For Emergency LSCS - Spinal (acceptable):</b>", H4))
for item in [
"Low-dose hyperbaric bupivacaine/levobupivacaine",
"CO-LOADING preferred over pre-loading (pre-loading risks fluid overload in fixed-rate heart)",
"Phenylephrine infusion to treat sympathectomy-induced hypotension",
"Transcutaneous pacing pads applied before spinal",
]:
story.append(Paragraph(f"• {item}", BULLET))
story.append(Paragraph("<b>General Anaesthesia (last resort only):</b>", H4))
for item in [
"RSI mandatory (aspiration risk) + antacid prophylaxis",
"Laryngoscopy can trigger vagal bradycardia - have vasopressors drawn up",
"Volatile agents depress escape rhythm - use lowest effective concentration",
"Avoid hypoxia, hypercarbia, acidosis - all worsen conduction and impair pacing capture",
"Transcutaneous/transvenous pacing immediately available",
]:
story.append(Paragraph(f"• {item}", BULLET))
story.append(Paragraph("4.6 Intraoperative Monitoring", H2))
mon_data = [
["Monitor", "Rationale"],
["Continuous ECG", "Detect rhythm changes, pacing capture failure"],
["Invasive arterial line (radial 20G)", "Beat-to-beat BP; HR unreliable from pulse in CHB"],
["2x Large-bore IV access (min 16G)", "Rapid drug administration and volume resuscitation"],
["Transcutaneous pacing pads", "Mandatory in all CHB patients - immediate pacing capability"],
["SpO₂", "Oxygenation monitoring"],
["Foley catheter", "Fluid balance"],
]
t = Table(mon_data, colWidths=[6*cm, 9*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("4.7 Labour & Postpartum Management", H2))
for item in [
"Vaginal delivery is feasible in haemodynamically stable, asymptomatic patients",
"Shorten second stage with instrumental delivery (forceps/vacuum) - avoid prolonged Valsalva",
"Left lateral tilt at all times to prevent aortocaval compression",
"Continuous CTG monitoring; avoid oxytocin boluses (use slow infusion)",
"Immediate postpartum: CO rises 60-80%; fluid mobilisation days 1-7 - risk of decompensation",
"Cardiology + EP follow-up mandatory; asymptomatic patients may need pacemaker postpartum",
]:
story.append(Paragraph(f"• {item}", BULLET))
story.append(source("Miller's Anesthesia 10e p.12222-12224; Fuster & Hurst's The Heart 15e p.2221; PMC11973396 (Anesthetic Considerations for Cesarean Delivery in CHB)"))
story.append(PageBreak())
# ─────────────────── TOPIC 5: STROKE VOLUME ───────────────────
story.append(Paragraph("5. Stroke Volume - Definition", H1))
story.append(hr())
story.append(Paragraph("Stroke volume (SV) is the volume of blood ejected by one ventricle per single contraction (heartbeat). Normal value is approximately 60-100 mL at rest.", BODY))
story.append(Paragraph("5.1 Formula", H2))
story.append(Paragraph("<b>SV = End-Diastolic Volume (EDV) − End-Systolic Volume (ESV)</b>", H3))
sv_data = [
["Variable", "Value", "Definition"],
["EDV (End-Diastolic Volume)", "~120-130 mL", "Volume in ventricle after filling (preload)"],
["ESV (End-Systolic Volume)", "~50-60 mL", "Volume remaining after ejection"],
["SV (Stroke Volume)", "~70 mL", "EDV minus ESV"],
["EF (Ejection Fraction)", "55-70%", "SV ÷ EDV × 100 (normal ≥55%)"],
]
t = Table(sv_data, colWidths=[5*cm, 3.5*cm, 6.5*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("5.2 Cardiac Output Relationship", H2))
story.append(Paragraph("<b>CO = SV × Heart Rate</b> (e.g., 70 mL × 72 bpm = ~5 L/min)", H3))
story.append(Paragraph("5.3 Three Determinants of Stroke Volume", H2))
det_data = [
["Determinant", "Definition", "Effect on SV"],
["Preload", "Ventricular filling pressure/stretch before contraction (EDV)", "↑ Preload → ↑ SV (Frank-Starling law)"],
["Afterload", "Resistance ventricle must overcome to eject blood (SVR/wall stress)", "↑ Afterload → ↓ SV"],
["Contractility", "Intrinsic force of myocardial contraction (inotropy), independent of pre/afterload", "↑ Contractility → ↑ SV"],
]
t = Table(det_data, colWidths=[3.5*cm, 5.5*cm, 6*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("5.4 In Pregnancy", H2))
story.append(Paragraph("SV increases by ~30%, peaking at 28-31 weeks, primarily driven by increased preload from expanded plasma volume (+55%). In the 3rd trimester, heart rate becomes the dominant mechanism for further CO augmentation.", BODY))
story.append(PageBreak())
# ─────────────────── TOPIC 6: ALL SYSTEM CHANGES ───────────────────
story.append(Paragraph("6. Physiological Changes in Pregnancy - All Systems", H1))
story.append(hr())
story.append(Paragraph("6.1 Master Summary Table", H2))
master_data = [
["System", "Parameter", "Change"],
["Neurological", "MAC (volatile anaesthetics)", "-40%"],
["Respiratory", "O₂ consumption", "+20 to 50%"],
["", "Minute ventilation", "+50%"],
["", "Tidal volume", "+40%"],
["", "Respiratory rate", "+15%"],
["", "FRC", "-20%"],
["", "Airway resistance", "-35%"],
["", "PaO₂", "+10%"],
["", "PaCO₂", "-15% (28-32 mmHg)"],
["", "HCO₃⁻", "-15% (compensatory)"],
["Cardiovascular", "Plasma volume", "+55%"],
["", "Blood volume", "+35%"],
["", "Cardiac output", "+40%"],
["", "Stroke volume", "+30%"],
["", "Heart rate", "+20%"],
["", "Systolic BP", "-5%"],
["", "Diastolic BP", "-15%"],
["", "SVR", "-15 to -50%"],
["", "PVR", "-30%"],
["Hematological", "Haemoglobin", "-20%"],
["", "Platelets", "-10%"],
["", "Clotting factors", "+30 to 250%"],
["Renal", "GFR", "+50%"],
["", "Serum creatinine", "↓ to 0.5 mg/dL"],
["", "BUN", "↓ to 9 mg/dL"],
]
t = Table(master_data, colWidths=[4*cm, 6*cm, 5*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("6.2 Neurological / CNS Changes", H2))
for item in [
"MAC falls -40% at term for ALL volatile agents; returns to normal by day 3 postdelivery",
"Mechanism: progesterone (rises 20× by term) is sedating; β-endorphin surge during labour",
"Enhanced sensitivity to local anaesthetics - neural blockade at reduced concentrations (up to 30% less)",
"IVC compression → engorged epidural venous plexus → ↓CSF volume, ↓epidural space volume → enhanced cephalad spread",
"Epidural pressure becomes POSITIVE (normally negative) in parturients",
"Increased risk of unintentional intravascular injection during epidural placement",
]:
story.append(Paragraph(f"• {item}", BULLET))
story.append(Paragraph("6.3 Respiratory Changes", H2))
resp_data = [
["Parameter", "Change", "Clinical Significance"],
["Minute ventilation", "+50%", "Hyperventilation state; driven mainly by progesterone"],
["Tidal volume", "+40%", "Primary driver of increased MV"],
["FRC", "-20%", "Rapid O₂ desaturation during apnea; mandatory preoxygenation"],
["PaCO₂", "-15% (28-32 mmHg)", "Respiratory alkalosis; compensated by ↓HCO₃⁻"],
["HCO₃⁻", "-15%", "Compensatory metabolic acidosis; normal pH ~7.44"],
["PaO₂", "+10%", "Slight improvement from hyperventilation"],
["Airway resistance", "-35%", "Progesterone-mediated bronchodilation"],
["2,3-DPG", "↑", "P50 rises 27→30 mmHg; rightward O₂-dissociation curve shift → enhanced O₂ delivery to fetus"],
["Airway mucosa", "Engorged, oedematous, friable", "Risk of bleeding/trauma; use 6-6.5 mm ETT; difficult airway risk"],
]
t = Table(resp_data, colWidths=[4*cm, 4*cm, 7*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("Key: Decreased FRC + increased O₂ consumption = rapid desaturation during apnea. Preoxygenation before GA is MANDATORY.", NOTE))
story.append(Paragraph("6.4 Renal Changes", H2))
ren_data = [
["Parameter", "Change"],
["Renal plasma flow", "+75%"],
["GFR", "+40-50%"],
["Serum creatinine", "↓ to 0.5 mg/dL (normal non-pregnant value = pathological in pregnancy)"],
["BUN", "↓ to 9 mg/dL"],
["Plasma osmolality", "↓ by 8-10 mOsm/kg"],
["Glycosuria (1-10 g/day)", "Common, normal (↓ tubular threshold)"],
["Proteinuria (<300 mg/day)", "Normal (>300 mg/day = pathological - suspect preeclampsia)"],
]
t = Table(ren_data, colWidths=[6*cm, 9*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("6.5 Gastrointestinal Changes", H2))
gi_data = [
["Feature", "Change", "Clinical Significance"],
["Gastric motility", "↓ Reduced", "Delayed gastric emptying"],
["Lower oesophageal sphincter", "↓ Tone (progesterone)", "Gastro-oesophageal reflux"],
["Stomach position", "Displaced upward/anteriorly by uterus", "LOS incompetence; aspiration risk"],
["Gastric acidity", "Unchanged", "-"],
["Gastric volume", "Unchanged", "-"],
]
t = Table(gi_data, colWidths=[4*cm, 4*cm, 7*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("→ RSI mandatory for GA in pregnancy; antacid prophylaxis (sodium citrate/H₂ antagonist/PPI) essential", NOTE))
story.append(Paragraph("6.6 Hepatic Changes", H2))
hep_data = [
["Parameter", "Change"],
["Hepatic blood flow", "Unchanged"],
["ALT/AST", "Minor elevation in 3rd trimester"],
["Alkaline phosphatase", "↑ (from placental secretion - NOT liver disease)"],
["Serum albumin", "↓ mild (dilutional)"],
["Colloid oncotic pressure", "↓ Reduced"],
["Pseudocholinesterase activity", "-25 to 30% at term; normalises by 6 weeks postpartum"],
["Gallbladder", "Incomplete emptying (progesterone inhibits CCK); risk of cholesterol gallstones"],
]
t = Table(hep_data, colWidths=[6*cm, 9*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("6.7 Hematological Changes", H2))
haem_data = [
["Parameter", "Change"],
["RBC mass", "+45%"],
["Plasma volume", "+55%"],
["Result", "Physiological dilutional anaemia (Hb >11 g/dL = normal)"],
["WBC (leukocytes)", "↑ Up to 21,000/μL in 3rd trimester - NORMAL"],
["Platelets", "-10% (gestational thrombocytopenia; usually >100,000/μL)"],
["Fibrinogen", "↑ markedly (+200-300 mg/dL)"],
["Factors VII, VIII, IX, X, XII", "All ↑"],
["Factor XI", "↓ (only coagulation factor that decreases)"],
["Protein S", "↓ (acquired resistance to anticoagulation)"],
["PAI-1 and PAI-2", "↑ (reduced fibrinolysis)"],
["Overall coagulation", "HYPERCOAGULABLE STATE → DVT/PE risk ×3-5"],
]
t = Table(haem_data, colWidths=[6*cm, 9*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Paragraph("6.8 Metabolic Changes", H2))
for item in [
"Diabetogenic state: insulin resistance increases progressively; insulin levels rise throughout",
"Human placental lactogen (hPL) is the key anti-insulin hormone",
"Maternal blood glucose and amino acids: LOWER (preferential transfer to fetus)",
"Maternal free fatty acids, ketones, triglycerides: HIGHER (maternal fat stores mobilised)",
"Resembles 'starvation' in the mother while fetus is well nourished",
"Thyroid: total T3/T4 elevated (increased TBG from oestrogen); free T3/T4 remain NORMAL",
"Basal metabolic rate: increased",
]:
story.append(Paragraph(f"• {item}", BULLET))
story.append(Paragraph("6.9 Key Anaesthetic Implications Summary", H2))
anaes_imp = [
["Change", "Anaesthetic Implication"],
["MAC -40%", "↓ Volatile agent dose required"],
["↑ Airway oedema/engorgement", "Smaller ETT (6-6.5 mm); gentle laryngoscopy; higher difficult airway risk"],
["↓ FRC + ↑ O₂ consumption", "Mandatory preoxygenation before GA; rapid desaturation"],
["Local anaesthetic sensitivity ↑", "Reduce epidural/spinal doses ~30%"],
["Engorged epidural veins", "Risk of intravascular injection; positive epidural pressure"],
["Aspiration risk", "RSI mandatory; antacid prophylaxis (Na citrate + ranitidine/PPI)"],
["↓ Pseudocholinesterase -25-30%", "Monitor suxamethonium duration"],
["Hypercoagulable", "DVT prophylaxis; timing of epidural catheter removal"],
["Aortocaval compression (>20 wks)", "Left lateral tilt at ALL times; avoid supine position"],
["Physiological anaemia", "Hb <11 g/dL pathological; Hb >11 g/dL physiological"],
]
t = Table(anaes_imp, colWidths=[5.5*cm, 9.5*cm])
t.setStyle(make_table_style())
story.append(t)
story.append(Spacer(1, 0.5*cm))
story.append(source("Morgan & Mikhail's Clinical Anesthesiology 7e pp.1572-1578; Braunwald's Heart Disease p.1062; Fuster & Hurst's The Heart 15e p.2209; Harrison's Principles of Internal Medicine 22e; Miller's Anesthesia 10e"))
story.append(Spacer(1, 1*cm))
story.append(HRFlowable(width="100%", thickness=1, color=colors.HexColor('#1a3a5c')))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("Generated by Orris Medical AI | Sources: Authoritative Medical Textbooks & Peer-Reviewed Literature | For educational use only", COVER_NOTE))
# Build PDF
doc.build(story)
print("PDF created successfully:", OUTPUT)