Can you make pdf notes?
These should be notes worthy for the FACEM exams. The topic is Paracetamol toxicity
"paracetamol" AND "toxicity" AND "acetylcysteine"
FACEM exam paracetamol toxicity acetaminophen overdose management 2024 2025 guidelines Australia
https://aci.health.nsw.gov.au/networks/eci/clinical/tools/pa…
mkdir -p /home/daytona/workspace/facem-notes && ls /home/daytona/workspace/
~/facem-notes/generate_notes.py
#!/usr/bin/env python3
"""FACEM Notes: Paracetamol Toxicity - PDF Generator"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import mm, cm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus import ListFlowable, ListItem
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
# ── Colour palette ──────────────────────────────────────────────────────────
C_NAVY = colors.HexColor("#1B2A4A")
C_BLUE = colors.HexColor("#2E5FA3")
C_TEAL = colors.HexColor("#1A7B8C")
C_AMBER = colors.HexColor("#E8A020")
C_RED = colors.HexColor("#C0392B")
C_GREEN = colors.HexColor("#1E8449")
C_LGRAY = colors.HexColor("#F4F6FA")
C_MGRAY = colors.HexColor("#D5DCE8")
C_WHITE = colors.white
PAGE_W, PAGE_H = A4
MARGIN = 20 * mm
# ── Document ─────────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
"/home/daytona/workspace/facem-notes/Paracetamol_Toxicity_FACEM.pdf",
pagesize=A4,
leftMargin=MARGIN, rightMargin=MARGIN,
topMargin=22 * mm, bottomMargin=18 * mm,
title="Paracetamol Toxicity - FACEM Notes",
author="Orris Medical Notes"
)
# ── Styles ───────────────────────────────────────────────────────────────────
base = getSampleStyleSheet()
def S(name, parent="Normal", **kw):
return ParagraphStyle(name, parent=base[parent], **kw)
TITLE = S("TITLE", "Normal", fontSize=22, textColor=C_WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER, leading=28)
SUBTITLE= S("SUBTITLE","Normal", fontSize=11, textColor=C_MGRAY,
fontName="Helvetica", alignment=TA_CENTER, leading=16)
H1 = S("H1", "Normal", fontSize=13, textColor=C_WHITE,
fontName="Helvetica-Bold", leading=18, spaceAfter=2)
H2 = S("H2", "Normal", fontSize=10.5, textColor=C_NAVY,
fontName="Helvetica-Bold", leading=15, spaceBefore=6, spaceAfter=2)
H3 = S("H3", "Normal", fontSize=9.5, textColor=C_TEAL,
fontName="Helvetica-Bold", leading=13, spaceBefore=4, spaceAfter=1)
BODY = S("BODY", "Normal", fontSize=9, leading=13, spaceAfter=3,
textColor=colors.HexColor("#1C1C1C"))
BODYSM = S("BODYSM", "Normal", fontSize=8.5, leading=12, spaceAfter=2,
textColor=colors.HexColor("#1C1C1C"))
BULLET = S("BULLET", "Normal", fontSize=9, leading=13, leftIndent=10,
bulletIndent=0, spaceAfter=2, textColor=colors.HexColor("#1C1C1C"))
WARN = S("WARN", "Normal", fontSize=8.5, textColor=C_RED,
fontName="Helvetica-Bold", leading=12)
NOTE = S("NOTE", "Normal", fontSize=8.5, textColor=C_TEAL,
fontName="Helvetica-Oblique", leading=12)
FOOTER = S("FOOTER", "Normal", fontSize=7.5, textColor=colors.HexColor("#888888"),
alignment=TA_CENTER)
CELL_HD = S("CELL_HD", "Normal", fontSize=8.5, textColor=C_WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER, leading=11)
CELL = S("CELL", "Normal", fontSize=8.5, leading=11, alignment=TA_CENTER)
CELL_L = S("CELL_L", "Normal", fontSize=8.5, leading=11, alignment=TA_LEFT)
# ── Helpers ───────────────────────────────────────────────────────────────────
def section_header(text, color=C_BLUE):
t = Table([[Paragraph(text, H1)]], colWidths=[PAGE_W - 2*MARGIN])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("ROUNDEDCORNERS", [4]),
]))
return t
def box(content_rows, bg=C_LGRAY, border=C_MGRAY, padding=8):
"""Wrap a list of flowables in a coloured box table."""
inner = [[c] for c in content_rows]
# Flatten to single-cell table with a paragraph list
combined = Table([[r] for r in content_rows], colWidths=[PAGE_W - 2*MARGIN - 2*padding])
combined.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 0),
("RIGHTPADDING", (0,0), (-1,-1), 0),
("GRID", (0,0), (-1,-1), 0, bg),
]))
outer = Table([[combined]], colWidths=[PAGE_W - 2*MARGIN])
outer.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 1, border),
("TOPPADDING", (0,0), (-1,-1), padding),
("BOTTOMPADDING",(0,0), (-1,-1), padding),
("LEFTPADDING", (0,0), (-1,-1), padding),
("RIGHTPADDING", (0,0), (-1,-1), padding),
("ROUNDEDCORNERS", [4]),
]))
return outer
def alert_box(title, items, color=C_AMBER):
rows = [[Paragraph(f"<b>{title}</b>", S("ah","Normal",fontSize=9,
textColor=C_WHITE, fontName="Helvetica-Bold", leading=12))]]
for item in items:
rows.append([Paragraph(f"• {item}", S("ai","Normal",fontSize=8.5,
textColor=C_WHITE, leading=12))])
t = Table(rows, colWidths=[PAGE_W - 2*MARGIN])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("ROUNDEDCORNERS", [4]),
]))
return t
def two_col_table(headers, rows, col_widths=None, header_color=C_NAVY):
W = PAGE_W - 2*MARGIN
if col_widths is None:
col_widths = [W/len(headers)] * len(headers)
table_data = [[Paragraph(h, CELL_HD) for h in headers]]
for row in rows:
styles = [CELL_L if i == 0 else CELL for i in range(len(row))]
table_data.append([Paragraph(str(c), styles[i]) for i, c in enumerate(row)])
t = Table(table_data, colWidths=col_widths)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), header_color),
("BACKGROUND", (0,1), (-1,-1), C_LGRAY),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C_WHITE, C_LGRAY]),
("GRID", (0,0), (-1,-1), 0.5, C_MGRAY),
("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"),
]))
return t
def bp(text):
return Paragraph(f"• {text}", BULLET)
def sp(n=4):
return Spacer(1, n)
def hr(color=C_MGRAY):
return HRFlowable(width="100%", thickness=0.5, color=color, spaceAfter=4, spaceBefore=4)
# ═══════════════════════════════════════════════════════════════════════════════
# BUILD CONTENT
# ═══════════════════════════════════════════════════════════════════════════════
story = []
# ── COVER / TITLE ─────────────────────────────────────────────────────────────
cover = Table(
[[Paragraph("PARACETAMOL TOXICITY", TITLE)],
[Spacer(1, 4)],
[Paragraph("FACEM Examination Notes", SUBTITLE)],
[Paragraph("Emergency Medicine | Toxicology", SUBTITLE)],
[Spacer(1, 6)],
[Paragraph("Sources: Tintinalli's EM, Rosen's EM, Bailey & Love's Surgery • Aus/NZ Guidelines 2019 (Chiew et al.) • NSW ECI 2024", FOOTER)]],
colWidths=[PAGE_W - 2*MARGIN]
)
cover.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_NAVY),
("TOPPADDING", (0,0), (-1,-1), 18),
("BOTTOMPADDING", (0,0), (-1,-1), 18),
("LEFTPADDING", (0,0), (-1,-1), 16),
("RIGHTPADDING", (0,0), (-1,-1), 16),
("ROUNDEDCORNERS", [6]),
]))
story.append(cover)
story.append(sp(10))
# ── 1. BACKGROUND & PHARMACOKINETICS ─────────────────────────────────────────
story.append(section_header("1. BACKGROUND & PHARMACOKINETICS", C_NAVY))
story.append(sp(6))
story.append(Paragraph("Overview", H2))
story.append(bp("Paracetamol (acetaminophen/APAP) is the <b>most common drug overdose</b> presenting to Australian EDs"))
story.append(bp("Leading cause of <b>acute liver failure</b> in Australia, UK and USA"))
story.append(bp("Two main patterns: <b>acute single ingestion</b> vs <b>repeated supratherapeutic ingestion (RSTI)</b>"))
story.append(sp(4))
story.append(Paragraph("Therapeutic vs Toxic Doses", H2))
W = PAGE_W - 2*MARGIN
dose_table = two_col_table(
["Parameter", "Value"],
[
["Adult therapeutic dose", "500 mg – 1 g every 4–6 h; max 4 g/day"],
["Toxic threshold (single ingestion)", ">10 g or >200 mg/kg (whichever is less)"],
["Toxic threshold (>24 h period)", ">10 g or >200 mg/kg over 24 h"],
["RSTI threshold", ">6 g or >150 mg/kg/day for ≥2 consecutive days"],
["Children <6 yrs (single/8 h)", ">200 mg/kg"],
["Massive overdose", ">500 mg/kg; paracetamol level >750 mcg/mL"],
],
col_widths=[W*0.45, W*0.55]
)
story.append(dose_table)
story.append(sp(6))
story.append(Paragraph("Mechanism of Toxicity", H2))
story.append(Paragraph(
"At <b>therapeutic doses</b>: ~90% conjugated via glucuronidation/sulfation → non-toxic metabolites; "
"~5–10% oxidised by CYP2E1/CYP3A4 → <b>NAPQI</b> (N-acetyl-p-benzoquinoneimine), immediately "
"detoxified by hepatic <b>glutathione</b>.",
BODY))
story.append(sp(2))
story.append(Paragraph(
"At <b>overdose</b>: Glucuronidation and sulfation pathways become saturated. "
"NAPQI production overwhelms glutathione stores (when <30% normal). "
"Free NAPQI binds hepatic macromolecules → <b>centrilobular hepatic necrosis</b>. "
"Hepatocyte lysis occurs ~Day 2, releasing transaminases + NAPQI-protein adducts.",
BODY))
story.append(sp(4))
story.append(alert_box("High-Risk Populations for Enhanced Toxicity",
["Chronic alcohol use (CYP2E1 induction + depleted glutathione)",
"Hepatic enzyme inducers: rifampicin, phenytoin, carbamazepine",
"Malnutrition / anorexia nervosa / prolonged fasting (depleted glutathione)",
"HIV/AIDS on antiretroviral therapy",
"Chronic liver disease (pre-existing reduced synthetic function)"],
color=C_RED))
story.append(sp(8))
# ── 2. CLINICAL FEATURES: FOUR STAGES ──────────────────────────────────────
story.append(section_header("2. CLINICAL FEATURES: FOUR STAGES OF TOXICITY", C_TEAL))
story.append(sp(6))
W = PAGE_W - 2*MARGIN
stages = two_col_table(
["Stage", "Timing", "Clinical Features", "Investigations"],
[
["Stage 1\n(Early)", "0–24 h", "Nausea, vomiting, anorexia, malaise\nMay be ASYMPTOMATIC\n(No signs of hepatotoxicity)", "Paracetamol level\nPlot on Rumack-Matthew nomogram"],
["Stage 2\n(Latent)", "Days 2–3", "GI symptoms improve\nRUQ pain & tenderness\nSubclinical hepatotoxicity begins", "↑ ALT/AST\n↑ INR\n↑ Bilirubin (mild)"],
["Stage 3\n(Hepatic)", "Days 3–4", "Fulminant hepatic failure:\n- Metabolic acidosis\n- Coagulopathy (↑INR)\n- Renal failure\n- Encephalopathy\n- Recurrent GI symptoms\n- Jaundice", "Peak ALT/AST (may be >10,000)\nINR >6.5 → transplant criteria\nCreatinine ↑\nArterial lactate ↑"],
["Stage 4\n(Recovery)", "Day 5–2 wks", "Survivors begin hepatic recovery\nComplete resolution 1–3 months", "Gradual normalisation of LFTs"],
],
col_widths=[W*0.10, W*0.12, W*0.42, W*0.36]
)
story.append(stages)
story.append(sp(5))
story.append(alert_box("Massive Overdose (>500 mg/kg or level >750 mcg/mL)",
["Early-onset HIGH ANION GAP metabolic acidosis even WITHOUT liver failure",
"Raised lactate (5-oxoproline accumulation from glutathione depletion)",
"Altered sensorium independent of hepatic encephalopathy",
"Mechanism: inhibition of mitochondrial respiration by NAPQI metabolites"],
color=C_RED))
story.append(sp(5))
story.append(Paragraph("Extrahepatic Toxicity (rare)", H2))
story.append(bp("<b>Renal failure</b>: direct tubular toxicity via CYP450 enzymes in proximal tubule; can occur without hepatotoxicity"))
story.append(bp("<b>Pancreatitis</b>: rare, mechanism unclear"))
story.append(bp("<b>Cardiac toxicity</b>: rare"))
story.append(sp(8))
# ── 3. DIAGNOSIS & INVESTIGATIONS ───────────────────────────────────────────
story.append(section_header("3. DIAGNOSIS & INVESTIGATIONS", C_BLUE))
story.append(sp(6))
story.append(Paragraph("Check paracetamol level in ALL intentional overdoses", H2))
story.append(bp("Routinely measure paracetamol level in <b>all intentional overdose patients</b> — even if paracetamol not mentioned (often co-ingested and denied)"))
story.append(bp("Level is only interpretable on the Rumack-Matthew nomogram if drawn <b>4–24 h post-ingestion</b> from a single acute oral exposure"))
story.append(bp("Level drawn <b><4 h</b> cannot be plotted (absorption may not be complete)"))
story.append(sp(5))
story.append(Paragraph("Rumack-Matthew Nomogram", H2))
story.append(Paragraph(
"Derived from retrospective analysis of outcomes. Plots serum paracetamol concentration (4–24 h "
"post-ingestion) against time to predict risk of hepatotoxicity.",
BODY))
story.append(sp(2))
nomogram_table = two_col_table(
["Nomogram Line", "4-hour Concentration", "Clinical Significance"],
[
["Possible toxicity line (original)", "200 mcg/mL (1300 µmol/L)", "60% risk of hepatotoxicity without treatment"],
["Treatment line (modified - USE THIS)", "150 mcg/mL (1000 µmol/L)", "Treatment with NAC indicated if above this line"],
["Double-dose NAC line", "≥2x nomogram line (i.e. ~300 mcg/mL at 4h)", "Double-dose NAC second bag (see treatment)"],
["Triple-line / massive", "≥3x nomogram line", "Discuss with clinical toxicologist"],
],
col_widths=[W*0.28, W*0.28, W*0.44]
)
story.append(nomogram_table)
story.append(sp(3))
story.append(Paragraph(
"<b>Nomogram limitations</b>: Cannot be used for (1) levels drawn <4 h or >24 h; "
"(2) modified-release/extended-release formulations; (3) repeated/chronic ingestions; "
"(4) unknown time of ingestion.",
NOTE))
story.append(sp(6))
story.append(Paragraph("Recommended Investigations", H2))
inv_table = two_col_table(
["Investigation", "Rationale / Key Points"],
[
["Serum paracetamol level", "At 4 h post-ingestion (minimum); plot on nomogram"],
["ALT / AST", "Elevated from Day 2; peak Day 3–4; AST >1000 IU/L = hepatotoxicity"],
["INR / PT", "↑ INR is sensitive marker of hepatic synthetic dysfunction; INR >6.5 = transplant threshold"],
["Serum creatinine", "Renal failure in Stage 3; creatinine >301 µmol/L = transplant threshold"],
["Arterial blood gas", "Metabolic acidosis (pH <7.3 = transplant threshold); arterial lactate"],
["Serum bilirubin", "Rises in Stage 3"],
["Blood glucose", "Hypoglycaemia in fulminant hepatic failure"],
["Serum phosphate", "Hyperphosphataemia = poor prognostic marker for transplant-free survival"],
["FBC", "Baseline; thrombocytopaenia in ALF"],
["Paracetamol-hepatic adducts (APAP-CYS)", "Research marker; not routine clinical use"],
["Pregnancy test (females)", "Standard in reproductive-age women with OD"],
["Alcohol level + UDS", "Co-ingestion screen"],
],
col_widths=[W*0.32, W*0.68]
)
story.append(inv_table)
story.append(sp(8))
# ── 4. RISK STRATIFICATION ────────────────────────────────────────────────────
story.append(section_header("4. RISK STRATIFICATION", C_NAVY))
story.append(sp(6))
story.append(Paragraph("Acute Immediate-Release Ingestion (Single)", H2))
story.append(bp("Time of ingestion KNOWN → draw level at <b>4 h post-ingestion</b>, plot on Rumack-Matthew nomogram"))
story.append(bp("Level <b>above the treatment line</b> → start NAC"))
story.append(bp("Level below treatment line AND <b>ALT normal</b> → NAC not required"))
story.append(bp("If paracetamol level <b>not available within 8 h</b> of ingestion AND dose exceeds toxicity threshold → <b>start NAC empirically</b>"))
story.append(sp(4))
story.append(Paragraph("Modified-Release (MR/XR) Paracetamol Ingestion", H2))
story.append(bp("<b>All ingestions ≥10 g or ≥200 mg/kg</b> → full course of NAC"))
story.append(bp("Nomogram cannot be reliably used — delayed and prolonged absorption kinetics"))
story.append(bp("If first level <2 h from last dose → repeat level at 2 h to confirm no ongoing absorption"))
story.append(bp("Level AND ALT 4 h after last known dose; if either above nomogram line → start or continue NAC"))
story.append(sp(4))
story.append(Paragraph("Repeated Supratherapeutic Ingestion (RSTI)", H2))
story.append(bp("Nomogram CANNOT be used"))
story.append(bp("Risk assessment based on: total dose, duration, ALT, paracetamol level"))
story.append(bp("Measure serum paracetamol AND ALT in any patient with criteria for RSTI"))
story.append(bp("Elevated ALT regardless of paracetamol level → start NAC"))
story.append(sp(5))
story.append(alert_box("Start NAC Empirically (Do Not Wait for Level) If:",
["More than 8 hours since ingestion (or level won't be available within 8 h) AND dose exceeds threshold",
"Clinical signs of toxicity: nausea, vomiting, RUQ pain/tenderness",
"Modified-release ingestion ≥10 g or ≥200 mg/kg",
"Elevated ALT on presentation",
"Patient with pre-existing liver disease",
"Unknown time of ingestion with any concerning history"],
color=C_TEAL))
story.append(sp(8))
# ── 5. MANAGEMENT ─────────────────────────────────────────────────────────────
story.append(section_header("5. MANAGEMENT", C_GREEN))
story.append(sp(6))
story.append(Paragraph("A. Initial Resuscitation & Decontamination", H2))
story.append(bp("<b>DRSABCD</b> — ABCs first; manage haemodynamic instability"))
story.append(bp("<b>Activated charcoal (AC)</b>: consider if presentation ≤1–2 h post-ingestion AND patient alert/airway intact; most benefit in massive ingestions (≥40 g)"))
story.append(bp("AC is <b>NOT routinely recommended</b> for paracetamol OD given availability of NAC — use only if may prevent need for NAC (e.g. paediatric accidental ingestions)"))
story.append(bp("<b>Gastric lavage</b>: generally not recommended"))
story.append(bp("Contact <b>Poisons Information Centre: 13 11 26</b> (Australia) for all significant ingestions"))
story.append(sp(6))
story.append(Paragraph("B. N-Acetylcysteine (NAC) — Primary Antidote", H2))
story.append(Paragraph(
"NAC replenishes glutathione stores and scavenges NAPQI directly. "
"Most effective within 8 h of ingestion — risk of hepatotoxicity <1% and mortality approaches zero "
"when started within 8 h.",
BODY))
story.append(sp(4))
story.append(Paragraph("Australian/NZ Guidelines 2019 — Two-Bag IV Regimen (Standard)", H3))
nac_table = two_col_table(
["Bag", "Dose", "Diluent", "Duration"],
[
["Bag 1", "200 mg/kg (max 22 g)\nAdult ceiling weight: 110 kg", "500 mL glucose 5% or NaCl 0.9%\n(Paeds: 7 mL/kg up to 500 mL)", "4 hours"],
["Bag 2", "100 mg/kg (max 11 g)", "1000 mL glucose 5% or NaCl 0.9%\n(Paeds: 14 mL/kg up to 1000 mL)", "16 hours"],
],
col_widths=[W*0.10, W*0.28, W*0.38, W*0.24]
)
story.append(nac_table)
story.append(sp(3))
story.append(Paragraph(
"<b>Total duration: 20 hours</b> | Always prescribe BOTH bags together",
NOTE))
story.append(sp(4))
story.append(Paragraph("Double-Dose NAC Regimen", H3))
story.append(bp("Indicated when paracetamol level is <b>≥2× above the nomogram line</b> (massive overdose >30 g)"))
story.append(bp("Bag 1: 200 mg/kg over 4 h (same as standard)"))
story.append(bp("<b>Bag 2: 200 mg/kg</b> (double dose) over 16 h"))
story.append(bp("Level ≥3× nomogram line → discuss with clinical toxicologist (may require higher doses)"))
story.append(sp(4))
story.append(Paragraph("Duration of NAC / When to Stop / When to Continue", H3))
nac_stop = two_col_table(
["Situation", "Action"],
[
["Completed 20 h course, ALT normal, paracetamol level clearing", "Cease NAC — can be discharged if psychiatrically safe"],
["Completed 20 h course but ALT rising or remains elevated", "Continue NAC at 100 mg/kg per 16 h infusion until ALT trending down AND INR <2"],
["Hepatic failure (acidosis, coagulopathy, encephalopathy)", "Continue IV NAC INDEFINITELY — reduces mortality even with undetectable paracetamol"],
["AST >1000 IU/L at end of course (even if paracetamol undetectable)", "Continue NAC"],
["Patient vomiting, cannot tolerate oral NAC", "Use IV NAC exclusively"],
],
col_widths=[W*0.50, W*0.50]
)
story.append(nac_stop)
story.append(sp(5))
story.append(Paragraph("C. NAC Adverse Reactions", H2))
story.append(bp("<b>Anaphylactoid reaction</b>: most common (~20% with 3-bag, ~8% with 2-bag regimen); usually occurs during Bag 1 loading dose"))
story.append(bp("Features: flushing, urticaria, pruritus, nausea, vomiting, bronchospasm (rare: hypotension)"))
story.append(bp("<b>Management</b>: pause infusion, administer antihistamine (e.g. promethazine 25 mg IV) ± salbutamol if bronchospasm; "
"restart at slower rate once symptoms resolve"))
story.append(bp("True anaphylaxis (with hypotension/airway compromise) is very rare — treat with adrenaline"))
story.append(bp("Two-bag regimen significantly reduces adverse reactions vs. three-bag — key reason for guideline change"))
story.append(sp(5))
story.append(Paragraph("D. Oral NAC (if IV unavailable)", H2))
story.append(bp("Oral NAC regimen: 140 mg/kg loading dose, then 70 mg/kg every 4 h for 17 doses (total 72 h)"))
story.append(bp("Equally efficacious if started within 8 h, but IV preferred due to compliance and vomiting issues"))
story.append(bp("Avoid oral NAC in altered conscious state or severe vomiting"))
story.append(sp(5))
story.append(Paragraph("E. Haemodialysis — Indications (EXTRIP Guidelines)", H2))
story.append(bp("Not routinely indicated given highly effective antidote"))
story.append(alert_box("Indications for Emergent Haemodialysis (EXTRIP Consensus)",
["Paracetamol level >1000 mcg/mL AND NAC NOT administered",
"Altered mental status + metabolic acidosis + lactate elevated + level >700 mcg/mL AND NAC NOT given",
"Altered mental status + metabolic acidosis + lactate elevated + level >900 mcg/mL EVEN IF NAC given",
"Note: Continue NAC DURING haemodialysis"],
color=C_NAVY))
story.append(sp(8))
# ── 6. FULMINANT HEPATIC FAILURE ──────────────────────────────────────────────
story.append(section_header("6. ACUTE LIVER FAILURE & TRANSPLANT CRITERIA", C_RED))
story.append(sp(6))
story.append(Paragraph("Recognition of Acute Liver Failure (ALF)", H2))
story.append(bp("ALF = <b>coagulopathy (INR >1.5) + hepatic encephalopathy</b> in absence of pre-existing liver disease"))
story.append(bp("Paracetamol-induced ALF typically develops within 72–96 h of ingestion"))
story.append(bp("Poor prognostic signs: metabolic acidosis (pH <7.3), rising creatinine, encephalopathy, hyperlactataemia, hyperphosphataemia"))
story.append(sp(5))
story.append(Paragraph("King's College Criteria — Paracetamol-Induced ALF", H2))
story.append(Paragraph(
"Criteria met for liver transplant listing if:", BODY))
kcc_table = two_col_table(
["Criterion", "Threshold"],
[
["Arterial pH (after adequate resuscitation)", "<7.30 (alone is sufficient OR in combination below)"],
["INR", ">6.5 (PT >100 s)"],
["Serum creatinine", ">301 µmol/L (3.4 mg/dL)"],
["Hepatic encephalopathy grade", "Grade III or IV"],
["Additional poor prognostic markers", "Hyperlactataemia OR hyperphosphataemia"],
],
col_widths=[W*0.42, W*0.58]
)
story.append(kcc_table)
story.append(sp(3))
story.append(Paragraph(
"<b>Criteria met if</b>: Arterial pH <7.30 (alone) OR <b>ALL THREE of</b>: "
"INR >6.5 AND creatinine >301 µmol/L AND grade III/IV encephalopathy. "
"Addition of lactate/phosphate improves sensitivity.",
NOTE))
story.append(sp(5))
story.append(Paragraph("Hepatic Encephalopathy Grading", H2))
enc_table = two_col_table(
["Grade", "Clinical Features"],
[
["Grade I", "Inverted sleep pattern, agitation, forgetfulness, irritability, apraxia"],
["Grade II", "Lethargy, time/place disorientation, personality change, ataxia"],
["Grade III", "Somnolence to semistupor (responds to verbal stimuli), asterixis, hyperreflexia"],
["Grade IV", "Coma (no response to verbal stimuli)"],
],
col_widths=[W*0.12, W*0.88]
)
story.append(enc_table)
story.append(sp(5))
story.append(Paragraph("Management of ALF", H2))
story.append(bp("<b>ICU admission</b> + consideration for liver transplant listing"))
story.append(bp("<b>Continue IV NAC</b> — reduces mortality even in established ALF; decreases cerebral oedema, hypotension, and multiorgan failure"))
story.append(bp("<b>Hypoglycaemia</b>: IV dextrose; regular monitoring"))
story.append(bp("<b>Coagulopathy</b>: FFP only for active bleeding or invasive procedures (NOT routine); INR used as prognostic marker"))
story.append(bp("<b>Cerebral oedema</b>: elevate HOB 30°; avoid hypotension; consider mannitol/hypertonic saline for raised ICP"))
story.append(bp("<b>Infection surveillance</b>: immunocompromised state; early broad-spectrum antibiotics if sepsis"))
story.append(bp("<b>Renal replacement therapy</b>: CVVHDF preferred in haemodynamic instability"))
story.append(bp("<b>Early referral to transplant centre</b> if King's College Criteria approaching or met"))
story.append(sp(8))
# ── 7. SPECIAL SCENARIOS ──────────────────────────────────────────────────────
story.append(section_header("7. SPECIAL SCENARIOS", C_TEAL))
story.append(sp(6))
story.append(Paragraph("Pregnancy", H2))
story.append(bp("NAC crosses placenta — <b>use standard dosing</b>; NAC is safe in pregnancy"))
story.append(bp("Paracetamol toxicity in pregnancy associated with fetal loss, especially if maternal hepatotoxicity develops"))
story.append(bp("Low threshold for NAC treatment; consult obstetrics"))
story.append(bp("Fetal monitoring if >20 weeks gestation"))
story.append(sp(4))
story.append(Paragraph("Paediatric Considerations", H2))
story.append(bp("Children <6 yrs: level if >200 mg/kg ingested; take level ≥2 h after ingestion"))
story.append(bp("If 2–4 h level <150 mg/L (1000 µmol/L) → NAC not required"))
story.append(bp("Children more resistant to hepatotoxicity than adults (higher sulfation capacity)"))
story.append(bp("NAC dosing: same mg/kg dosing; use weight-based diluent volumes"))
story.append(sp(4))
story.append(Paragraph("Intravenous Paracetamol Toxicity", H2))
story.append(bp("Higher peak levels than oral — nomogram thresholds may not apply directly"))
story.append(bp("Treat with low threshold for NAC"))
story.append(sp(4))
story.append(Paragraph("Co-ingestions to Consider", H2))
story.append(bp("Opioids, benzodiazepines, alcohol — may mask symptoms and alter mental status"))
story.append(bp("Antimuscarinics (e.g. diphenhydramine): delayed gastric emptying → delayed paracetamol absorption → recheck level at 8 h if 4 h level below treatment line"))
story.append(bp("Always screen with paracetamol level regardless of history in intentional OD"))
story.append(sp(8))
# ── 8. INDICATIONS FOR TOXICOLOGY CONSULTATION ───────────────────────────────
story.append(section_header("8. WHEN TO CONSULT TOXICOLOGY / ESCALATE", C_AMBER))
story.append(sp(6))
consult_items = [
"Hepatotoxicity present at time of presentation",
"Pre-existing liver disease (cirrhosis, chronic hepatitis)",
"Level cannot be obtained within 8 h of ingestion",
"Supratherapeutic ingestion (RSTI) — complex risk assessment",
"Modified-release paracetamol ingestion",
"Massive ingestion / level ≥2–3× nomogram line",
"Patient develops ALF — contact transplant centre",
"Uncertain ingestion time",
"NAC anaphylactoid reaction not responding to standard management",
"Renal failure complicating overdose — consider haemodialysis",
"Paediatric overdose with concerns about dosing",
"All suspected paracetamol poisoning: call Poisons Info 13 11 26 (Aus)",
]
for item in consult_items:
story.append(bp(item))
story.append(sp(8))
# ── 9. DISPOSITION ─────────────────────────────────────────────────────────────
story.append(section_header("9. DISPOSITION", C_BLUE))
story.append(sp(6))
disp_table = two_col_table(
["Scenario", "Disposition"],
[
["Level below treatment line, ALT normal, asymptomatic", "Medical clearance possible; psychiatric assessment if intentional OD"],
["NAC commenced — completing 20-h course", "Admit to ED or short stay unit"],
["ALT elevated at end of 20-h course", "Admit; continue NAC; hepatology/toxicology review"],
["Evidence of hepatotoxicity / rising INR", "Admit to HDU/ICU; consider transplant centre referral"],
["King's College Criteria met", "Urgent transfer to liver transplant centre"],
["Modified-release or RSTI — complex risk", "Admit for monitoring; early toxicology input"],
["Any intentional overdose", "Mandatory psychiatric assessment before discharge"],
],
col_widths=[W*0.48, W*0.52]
)
story.append(disp_table)
story.append(sp(8))
# ── 10. HIGH-YIELD FACEM SUMMARY ──────────────────────────────────────────────
story.append(section_header("10. HIGH-YIELD FACEM SUMMARY", C_NAVY))
story.append(sp(6))
story.append(Paragraph("Key Numbers to Know", H2))
numbers_table = two_col_table(
["Parameter", "Key Number / Threshold"],
[
["NAC Bag 1", "200 mg/kg in 500 mL over 4 h"],
["NAC Bag 2", "100 mg/kg in 1000 mL over 16 h"],
["Double NAC bag 2 threshold", "Paracetamol level ≥2× nomogram line"],
["Nomogram treatment line (4 h)", "150 mcg/mL (1000 µmol/L)"],
["KCC pH", "<7.30 alone = sufficient for transplant listing"],
["KCC INR", ">6.5"],
["KCC creatinine", ">301 µmol/L"],
["KCC encephalopathy", "Grade III or IV"],
["Haemodialysis threshold (no NAC)", ">1000 mcg/mL"],
["Haemodialysis threshold (NAC given)", ">900 mcg/mL + AMS + acidosis + ↑lactate"],
["Toxic single dose", ">10 g or >200 mg/kg (whichever less)"],
["Time window for best NAC outcome", "<8 h from ingestion (hepatotoxicity <1%)"],
["4-hour level for nomogram", "Earliest valid time to plot"],
["NAC risk of hepatotox when started <8h", "<1%; mortality ≈ 0"],
],
col_widths=[W*0.50, W*0.50]
)
story.append(numbers_table)
story.append(sp(5))
story.append(Paragraph("FACEM Exam Traps", H2))
story.append(alert_box("Common Exam Traps",
["Modified-release paracetamol: nomogram does NOT apply — all ≥10g or ≥200mg/kg get NAC regardless",
"Level <4h post-ingestion CANNOT be plotted — do not use to rule out toxicity",
"Asymptomatic in Stage 1 does NOT mean safe — this is a classic false reassurance trap",
"RSTI: total daily dose matters, not a single spike — threshold is 6g/day for ≥2 days",
"NAC adverse reaction: PAUSE then RESTART at slower rate — do NOT abandon NAC",
"Continue NAC even if paracetamol level undetectable if ALT >1000 or ALF present",
"KCC acidosis criterion: pH <7.30 AFTER adequate fluid resuscitation",
"Hyperphosphataemia adds to KCC sensitivity — do not forget phosphate in ALF workup",
"Two-bag regimen (AUS/NZ 2019): NOT three-bag — know the current guideline change"],
color=C_RED))
story.append(sp(6))
story.append(Paragraph("References", H2))
story.append(Paragraph(
"1. Chiew AL et al. Updated guidelines for the management of paracetamol poisoning in Australia and NZ. "
"<i>Med J Aust</i> 2020;212(4):175–183. "
"2. Tintinalli JE et al. <i>Tintinalli's Emergency Medicine</i>, 9th ed. Chapter 190. "
"3. Walls R et al. <i>Rosen's Emergency Medicine</i>, 10th ed. Chapter 138. "
"4. Bailey & Love's <i>Short Practice of Surgery</i>, 28th ed. Chapter 69. "
"5. Nakatsu L et al. Two-bag vs three-bag acetylcysteine: systematic review and meta-analysis. "
"<i>Clin Toxicol</i> 2025 Mar. PMID: 40013897. "
"6. NSW ECI Paracetamol Overdose Management Tool, 2024.",
BODYSM))
story.append(sp(4))
story.append(hr(C_MGRAY))
story.append(Paragraph(
"Orris Medical Notes | FACEM Exam Preparation | Paracetamol Toxicity | June 2026 | "
"Always verify against current local guidelines and Poisons Information Centre (13 11 26)",
FOOTER))
# ── BUILD PDF ─────────────────────────────────────────────────────────────────
doc.build(story)
print("PDF generated successfully!")
cd /home/daytona/workspace/facem-notes && python3 generate_notes.py 2>&1
ls -lh /home/daytona/workspace/facem-notes/
Paracetamol Toxicity FACEM
PDF Document · PDF
| Section | Content |
|---|---|
| 1. Background & PK | Therapeutic vs toxic doses, NAPQI mechanism, high-risk populations |
| 2. Clinical Features | Four stages of toxicity with timing, features, and investigations per stage; massive overdose presentation |
| 3. Diagnosis & Investigations | Rumack-Matthew nomogram (with lines explained), full investigation list |
| 4. Risk Stratification | Acute IR, modified-release, RSTI - different approaches for each |
| 5. Management | Two-bag NAC regimen (AUS/NZ 2019), double-dose criteria, when to stop/continue, adverse reactions, haemodialysis (EXTRIP criteria) |
| 6. Acute Liver Failure | King's College Criteria (full table), hepatic encephalopathy grading, ALF management |
| 7. Special Scenarios | Pregnancy, paediatrics, IV paracetamol toxicity, co-ingestions |
| 8. When to Escalate | Toxicology consult indications, Poisons Info 13 11 26 |
| 9. Disposition | Clear decision table for each clinical scenario |
| 10. High-Yield Summary | Key numbers table + red-flag FACEM exam traps box |