Generate a materia medica reference card for Symphytum Officinal medicine
Symphytum officinale materia medica homeopathic remedy keynotes indications
https://www.materiamedica.info/en/materia-medica/john-henry-…
Symphytum officinale Boericke materia medica modalities potency dose repertory
| Full Name | Symphytum officinale L. |
| Common Names | Comfrey, Knitbone, Boneset, Bruisewort, Healing Herb, Beinwell (German), Große Wallwurz |
| Family | Boraginaceae |
| Abbreviation | Symph. |
| Part Used | Root (primarily); also leaves and aerial parts |
| Preparation | Mother tincture from fresh root; triturations and dilutions |
| Etymology | From Greek symphuo ("to grow together"); Latin confervo ("to knit together") - names that themselves describe the remedy's keynote action |
| Constituent | Action |
|---|---|
| Allantoin | Stimulates epithelial cell proliferation; promotes callus formation and wound healing |
| Rosmarinic acid | Anti-inflammatory, antioxidant |
| Phenolic acids | Anti-inflammatory |
| Pyrrolizidine alkaloids (PAs) | Hepatotoxic (cumulative); reason internal use is restricted in herbalism |
| Mucilage / tannins | Demulcent, astringent |
| Choline | Tissue-healing support |
Safety Note (Herbal/Conventional): Internal use of crude comfrey is associated with hepatic veno-occlusive disease (sinusoidal obstruction syndrome) due to pyrrolizidine alkaloids. Topical use is limited to 4-6 weeks. The EMA/HMPC sets maximum acceptable PA intake at 0.007 mcg/kg/day. In homeopathic potencies, PAs are diluted below toxicological significance. - Tintinalli's Emergency Medicine; Katzung's Basic and Clinical Pharmacology, 16th Ed.
| Worse (<) | Touch or pressure; motion; injuries and blows; sexual excess; sitting (navel area); walking (opposite spleen); stooping |
| Better (>) | Warmth; gentle motion (occasionally) |
| Indication | Potency | Frequency |
|---|---|---|
| Acute fracture (post-reduction) | 30C or 200C | Twice daily until healing confirmed |
| Periosteal pain (old injury) | 30C | 2-3 times daily |
| Non-union fracture | 200C or 1M | Once weekly |
| Eye trauma (blunt) | 30C | Every 2-4 hours acutely |
| Tincture (external, herbal) | Q (Mother Tincture) | Topical dressing for ulcers, sores, bruises |
| Remedy | Differentiating Feature |
|---|---|
| Arnica montana | Soft tissue injury, bruising with discoloration, sore/bruised/lame sensation, shock; Arn. precedes Symph. in sequence |
| Calcarea phosphorica | Fracture non-union especially in debilitated, slow-growing children; compare with Symph. in callus formation |
| Ruta graveolens | Periosteum and cartilage injuries; bruised bones; especially wrist and shin trauma |
| Hypericum | Nerve pain from injuries; crushed fingers, coccyx injuries - sharp shooting pain along nerve |
| Bryonia | Bone pain worse any motion; joints |
| Silicea | Bone caries, fistulae; spine; promotes expulsion of foreign bodies |
| Staphysagria | Bone/periosteum inflammation; worse touch |
| Ledum | Puncture wounds; blunt eye trauma (secondary choice) |
| Calendula | Soft tissue wounds; healing of lacerations |
| Hepar sulphuris | Bone/periosteum abscess with pus formation |
Create a PDF quick-reference card I can print and keep in my clinic
ls /home/daytona/workspace/ 2>/dev/null && mkdir -p /home/daytona/workspace/symp…
~/symphytum-card/generate_card.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm, cm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
# ── Colour Palette ──────────────────────────────────────────────────────────
DARK_GREEN = colors.HexColor("#1B4332") # header background
MID_GREEN = colors.HexColor("#2D6A4F") # section headers
LIGHT_GREEN = colors.HexColor("#D8F3DC") # alternating row tint
ACCENT = colors.HexColor("#40916C") # rule lines / borders
GOLD = colors.HexColor("#B7950B") # keynote highlight
CREAM = colors.HexColor("#FAFDF6") # page background
WARNING_RED = colors.HexColor("#922B21") # safety warning
PAGE_W, PAGE_H = A4 # 210 × 297 mm
OUTPUT = "/home/daytona/workspace/symphytum-card/Symphytum_Officinale_Reference_Card.pdf"
# ── Document ─────────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=12 * mm,
rightMargin=12 * mm,
topMargin=10 * mm,
bottomMargin=10 * mm,
title="Symphytum Officinale – Materia Medica Reference Card",
author="Clinic Reference",
)
# ── Base Styles ──────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
BODY = S("body",
fontName="Helvetica", fontSize=7.2, leading=10.5,
textColor=colors.HexColor("#1C1C1C"), spaceAfter=2)
BODY_BOLD = S("body_bold",
fontName="Helvetica-Bold", fontSize=7.2, leading=10.5,
textColor=colors.HexColor("#1C1C1C"), spaceAfter=2)
SEC_HEAD = S("sec_head",
fontName="Helvetica-Bold", fontSize=8.4, leading=11,
textColor=colors.white, spaceAfter=3, spaceBefore=6)
KEYNOTE = S("keynote",
fontName="Helvetica-Bold", fontSize=7.5, leading=11,
textColor=GOLD, spaceAfter=2)
CAUTION = S("caution",
fontName="Helvetica-BoldOblique", fontSize=7,
textColor=WARNING_RED, leading=10, spaceAfter=2)
SMALL = S("small",
fontName="Helvetica", fontSize=6.5, leading=9.5,
textColor=colors.HexColor("#444444"), spaceAfter=1)
ITALIC = S("italic",
fontName="Helvetica-Oblique", fontSize=7, leading=10,
textColor=colors.HexColor("#333333"), spaceAfter=2)
CENTERED = S("centered",
fontName="Helvetica", fontSize=7, leading=10,
textColor=colors.HexColor("#555555"), alignment=TA_CENTER)
# ── Helper: section header pill ──────────────────────────────────────────────
def section_header(title):
tbl = Table(
[[Paragraph(f"▶ {title}", SEC_HEAD)]],
colWidths=[186 * mm], rowHeights=[14]
)
tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), MID_GREEN),
("LEFTPADDING", (0, 0), (-1, -1), 6),
("RIGHTPADDING", (0, 0), (-1, -1), 6),
("TOPPADDING", (0, 0), (-1, -1), 2),
("BOTTOMPADDING",(0, 0), (-1, -1), 2),
("ROUNDEDCORNERS", [3, 3, 3, 3]),
]))
return tbl
def mini_header(title):
return Paragraph(f"<font color='#{MID_GREEN.hexval()[2:]}'>■</font> <b>{title}</b>",
S("mh", fontName="Helvetica-Bold", fontSize=7.5, leading=11,
textColor=MID_GREEN, spaceAfter=2))
def rule():
return HRFlowable(width="100%", thickness=0.5, color=ACCENT, spaceAfter=4, spaceBefore=2)
def row(col1, col2, bold_col1=False):
s1 = BODY_BOLD if bold_col1 else BODY
return [Paragraph(col1, s1), Paragraph(col2, BODY)]
# ── Build Story ──────────────────────────────────────────────────────────────
story = []
# ═══ HEADER BANNER ═══════════════════════════════════════════════════════════
header_tbl = Table(
[[
Paragraph("<font size=16><b>Symphytum Officinale</b></font><br/>"
"<font size=9 color='#D8F3DC'>Comfrey · Knitbone · Beinwell</font>",
S("ht", fontName="Helvetica-Bold", fontSize=16, leading=20,
textColor=colors.white, alignment=TA_LEFT)),
Paragraph(
"<font size=7.5 color='#D8F3DC'>"
"Family: Boraginaceae<br/>"
"Abbrev: Symph.<br/>"
"Part Used: Root (fresh)<br/>"
"Preparation: Mother tincture & potencies"
"</font>",
S("hr", fontName="Helvetica", fontSize=7.5, leading=12,
textColor=colors.HexColor("#D8F3DC"), alignment=TA_LEFT)),
]],
colWidths=[115 * mm, 71 * mm],
rowHeights=[38]
)
header_tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), DARK_GREEN),
("LEFTPADDING", (0, 0), (-1, -1), 10),
("RIGHTPADDING", (0, 0), (-1, -1), 10),
("TOPPADDING", (0, 0), (-1, -1), 6),
("BOTTOMPADDING",(0, 0), (-1, -1), 6),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
]))
story.append(header_tbl)
story.append(Spacer(1, 5))
# ═══ TWO-COLUMN LAYOUT ═══════════════════════════════════════════════════════
# We build each column as a list of flowables, then combine in a Table
# ─── LEFT COLUMN ─────────────────────────────────────────────────────────────
left = []
# 1. KEYNOTES
left.append(section_header("KEYNOTES (Capitals = most prominent)"))
left.append(Spacer(1, 2))
keynotes = [
("★", "FACILITATES UNION OF FRACTURED BONES", "Non-union; slow callus formation"),
("★", "LESSENS PRICKING / STITCHING PAIN AT FRACTURE SITE", "Characteristic periosteal irritability"),
("★", "INJURIES TO THE GLOBE OF THE EYE — blunt objects", "Snowball, cane tip, umbrella, infant's fist"),
("★", "PERIOSTEAL PAIN AFTER WOUNDS HAVE HEALED", "Old fracture / wound site still sore"),
("●", "IRRITABILITY AT POINT OF FRACTURE", "Persistent deep bone pain after injury"),
("●", "FAVORS PRODUCTION OF CALLUS", "Give after proper reduction confirmed"),
("●", "Irritable stump after amputation", "Pricking, phantom pains"),
("●", "Wounds penetrating to bone / periosteum", "Deep injuries, gunshot wounds"),
("●", "Psoas abscess; inflammation of bone", "Diseased spinous processes"),
]
for star, kw, detail in keynotes:
col = GOLD if star == "★" else MID_GREEN
left.append(Paragraph(
f"<font color='#{col.hexval()[2:]}'><b>{star}</b></font> <b>{kw}</b> — <i>{detail}</i>",
S("kn", fontName="Helvetica", fontSize=7, leading=10.5,
textColor=colors.HexColor("#1C1C1C"), spaceAfter=1.5)
))
left.append(Spacer(1, 3))
# 2. SPHERE OF ACTION
left.append(section_header("SPHERE OF ACTION"))
left.append(Spacer(1, 2))
soa_data = [
["Tissue / Organ", "Prominence"],
["Periosteum & bone cortex", "★★★★★"],
["Globe of the eye (blunt trauma)", "★★★★★"],
["Tendons & cartilage", "★★★★"],
["Gastric / duodenal mucosa", "★★★"],
["Spine (vertebral caries)", "★★★"],
["Urinary tract (stricture)", "★★"],
]
soa_tbl = Table(soa_data, colWidths=[110*mm, 30*mm])
soa_tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), ACCENT),
("TEXTCOLOR", (0, 0), (-1, 0), colors.white),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTSIZE", (0, 0), (-1, -1), 7),
("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, LIGHT_GREEN]),
("GRID", (0, 0), (-1, -1), 0.3, colors.HexColor("#CCCCCC")),
("LEFTPADDING", (0, 0), (-1, -1), 5),
("TOPPADDING", (0, 0), (-1, -1), 2),
("BOTTOMPADDING",(0, 0), (-1, -1), 2),
("ALIGN", (1, 0), (1, -1), "CENTER"),
]))
left.append(soa_tbl)
left.append(Spacer(1, 4))
# 3. MODALITIES
left.append(section_header("MODALITIES"))
left.append(Spacer(1, 2))
mod_data = [
["< WORSE", "Touch or pressure; motion; injuries and blows;\nsexual excess; sitting; stooping; walking"],
["> BETTER", "Warmth; gentle motion (occasionally)"],
]
mod_tbl = Table(mod_data, colWidths=[28*mm, 158*mm])
mod_tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (0, 0), WARNING_RED),
("BACKGROUND", (0, 1), (0, 1), colors.HexColor("#1A5276")),
("TEXTCOLOR", (0, 0), (0, -1), colors.white),
("FONTNAME", (0, 0), (-1, -1), "Helvetica-Bold"),
("FONTSIZE", (0, 0), (-1, -1), 7),
("GRID", (0, 0), (-1, -1), 0.3, colors.HexColor("#CCCCCC")),
("LEFTPADDING", (0, 0), (-1, -1), 5),
("TOPPADDING", (0, 0), (-1, -1), 3),
("BOTTOMPADDING",(0, 0), (-1, -1), 3),
("VALIGN", (0, 0), (-1, -1), "TOP"),
]))
left.append(mod_tbl)
left.append(Spacer(1, 4))
# 4. CHARACTERISTIC SENSATIONS
left.append(section_header("CHARACTERISTIC SENSATIONS & PAINS"))
left.append(Spacer(1, 2))
sens = [
"Pricking · stitching · jagging pains (never throbbing or burning)",
"As if a bone is broken; as if a joint is dislocated",
"As if upper eyelid passes over an elevation on closing eye",
"Local or general coldness at the injured part",
"Periosteal soreness persisting long after soft tissue has healed",
]
for s in sens:
left.append(Paragraph(f"◆ {s}", BODY))
left.append(Spacer(1, 4))
# 5. PRESCRIBING SEQUENCE
left.append(section_header("PRESCRIBING SEQUENCE IN TRAUMA"))
left.append(Spacer(1, 2))
seq_data = [
["Step", "Remedy", "Indication"],
["1", "Arnica montana", "Immediate trauma: bruising, soft tissue shock, sore/lame sensation, discoloration"],
["2", "Symphytum", "After Arnica: periosteal pain, pricking at fracture site, stimulate callus"],
["3", "Calcarea phosphorica", "Chronic non-union, debilitated patient, especially children"],
]
seq_tbl = Table(seq_data, colWidths=[10*mm, 38*mm, 138*mm])
seq_tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), ACCENT),
("TEXTCOLOR", (0, 0), (-1, 0), colors.white),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTNAME", (0, 1), (-1, -1), "Helvetica"),
("FONTSIZE", (0, 0), (-1, -1), 7),
("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, LIGHT_GREEN]),
("GRID", (0, 0), (-1, -1), 0.3, colors.HexColor("#CCCCCC")),
("LEFTPADDING", (0, 0), (-1, -1), 5),
("TOPPADDING", (0, 0), (-1, -1), 2),
("BOTTOMPADDING",(0, 0), (-1, -1), 2),
("VALIGN", (0, 0), (-1, -1), "TOP"),
("ALIGN", (0, 0), (0, -1), "CENTER"),
("FONTNAME", (1, 1), (1, -1), "Helvetica-Bold"),
]))
left.append(seq_tbl)
left.append(Spacer(1, 4))
# ─── RIGHT COLUMN ────────────────────────────────────────────────────────────
right = []
# 1. SYMPTOM PICTURE
right.append(section_header("SYMPTOM PICTURE BY SYSTEM"))
right.append(Spacer(1, 2))
systems = [
("Mind", "Almost no mentals — purely physical remedy; ~8 rubrics total."),
("Head", "Pain in occiput, vertex, forehead — changes place. Pain down bone of nose. Weight in forehead when stooping."),
("Eyes ★", "Pain after blunt trauma. Sensation: upper lid over elevation on closing. Spasm on waking post-injury. Cataract after eye injury. Blunt trauma to globe — foremost remedy (Boericke, Allen)."),
("Face / Jaw", "Inflammation of inferior maxillary bone; hard red swelling. Abscess of jawbone / tooth socket."),
("Stomach", "Allantoin stimulates gastric epithelium. Gastric & duodenal ulcers. Epigastric pains side-to-side."),
("Rectum", "Inflamed, bleeding piles. Dysentery with griping & bloody stool."),
("Urinary", "Stricture of urethra (certain forms). Renal / urinary ulceration."),
("Male", "Backache from sexual excess; spermatorrhoea. Painful tender testicles."),
("Female", "Amenorrhoea with headache, fever, weight in forehead. Leucorrhoea. Sore breasts."),
("Back / Spine", "Pain after fall or sexual excess. Pott's disease. Psoas abscess. Vertebral caries."),
("Bones ★", "Pricking / stitching at old injury sites. Non-union fractures. Periosteal irritability. Tendons, sinews, cartilage injuries. Neuralgia of knee."),
("Skin", "Itching without eruption. Bruised sensation. Foul ulcers (topically cleanses and heals)."),
]
sys_data = [[Paragraph(f"<b>{s}</b>", S("sh", fontName="Helvetica-Bold", fontSize=6.8,
textColor=MID_GREEN, leading=9.5)),
Paragraph(d, S("sd", fontName="Helvetica", fontSize=6.8, leading=9.5,
textColor=colors.HexColor("#1C1C1C")))]
for s, d in systems]
sys_tbl = Table(sys_data, colWidths=[22*mm, 69*mm])
sys_tbl.setStyle(TableStyle([
("ROWBACKGROUNDS", (0, 0), (-1, -1), [colors.white, LIGHT_GREEN]),
("GRID", (0, 0), (-1, -1), 0.3, colors.HexColor("#CCCCCC")),
("LEFTPADDING", (0, 0), (-1, -1), 4),
("TOPPADDING", (0, 0), (-1, -1), 2),
("BOTTOMPADDING",(0, 0), (-1, -1), 2),
("VALIGN", (0, 0), (-1, -1), "TOP"),
]))
right.append(sys_tbl)
right.append(Spacer(1, 4))
# 2. POTENCY & DOSE
right.append(section_header("POTENCY & DOSE"))
right.append(Spacer(1, 2))
pot_data = [
["Indication", "Potency", "Frequency"],
["Acute fracture (post-reduction)", "30C or 200C", "Twice daily until healing confirmed"],
["Periosteal pain — old injury", "30C", "2–3× daily"],
["Non-union fracture", "200C or 1M", "Once weekly"],
["Blunt eye trauma (acute)", "30C", "Every 2–4 hours acutely"],
["External herbal use", "Mother Tincture Q", "Topical dressing; intact skin only"],
]
pot_tbl = Table(pot_data, colWidths=[40*mm, 24*mm, 27*mm])
pot_tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), ACCENT),
("TEXTCOLOR", (0, 0), (-1, 0), colors.white),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTNAME", (0, 1), (-1, -1), "Helvetica"),
("FONTSIZE", (0, 0), (-1, -1), 6.8),
("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, LIGHT_GREEN]),
("GRID", (0, 0), (-1, -1), 0.3, colors.HexColor("#CCCCCC")),
("LEFTPADDING", (0, 0), (-1, -1), 4),
("TOPPADDING", (0, 0), (-1, -1), 2),
("BOTTOMPADDING",(0, 0), (-1, -1), 2),
("VALIGN", (0, 0), (-1, -1), "TOP"),
]))
right.append(pot_tbl)
right.append(Spacer(1, 4))
# 3. DIFFERENTIAL DIAGNOSIS
right.append(section_header("DIFFERENTIAL DIAGNOSIS"))
right.append(Spacer(1, 2))
diff_data = [
["Remedy", "Key Differentiator"],
["Arnica", "Soft tissue bruising; discoloration; sore/lame; precedes Symph."],
["Calcarea phosphorica", "Non-union especially in debilitated children; slow growth"],
["Ruta graveolens", "Periosteum & cartilage; wrist / shin / flexor tendons"],
["Hypericum", "Nerve-rich area injuries; shooting pain along nerve"],
["Bryonia", "Bone pain worse ANY motion; dry mucous membranes"],
["Silicea", "Bone caries with fistulae; promotes expulsion of foreign bodies"],
["Ledum", "Puncture wounds; bruised eye (secondary choice)"],
["Hepar sulphuris", "Bone/periosteum abscess with pus; hypersensitive to cold"],
["Staphysagria", "Bone inflammation worse touch; clean-cut surgical wounds"],
["Calendula", "Surface lacerations; promotes granulation tissue"],
]
diff_tbl = Table(diff_data, colWidths=[32*mm, 59*mm])
diff_tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), ACCENT),
("TEXTCOLOR", (0, 0), (-1, 0), colors.white),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTNAME", (0, 1), (0, -1), "Helvetica-Bold"),
("FONTNAME", (1, 1), (1, -1), "Helvetica"),
("FONTSIZE", (0, 0), (-1, -1), 6.8),
("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, LIGHT_GREEN]),
("GRID", (0, 0), (-1, -1), 0.3, colors.HexColor("#CCCCCC")),
("LEFTPADDING", (0, 0), (-1, -1), 4),
("TOPPADDING", (0, 0), (-1, -1), 2),
("BOTTOMPADDING",(0, 0), (-1, -1), 2),
("VALIGN", (0, 0), (-1, -1), "TOP"),
]))
right.append(diff_tbl)
right.append(Spacer(1, 4))
# 4. REMEDY RELATIONSHIPS
right.append(section_header("REMEDY RELATIONSHIPS"))
right.append(Spacer(1, 2))
right.append(Paragraph(
"<b>Follows well:</b> Arnica (when pricking pain remains after bruised soreness resolves) · "
"<b>Compare:</b> Arn., Calc-p., Ruta, Hyper., Sil., Led., Bry., Calen., Hep., Stp. · "
"<b>Antidote to:</b> Cantharides (Canthar.)",
BODY))
right.append(Spacer(1, 4))
# ═══ ASSEMBLE TWO-COLUMN BODY ════════════════════════════════════════════════
body_tbl = Table(
[[left, right]],
colWidths=[91*mm, 95*mm],
rowHeights=[None]
)
body_tbl.setStyle(TableStyle([
("VALIGN", (0, 0), (-1, -1), "TOP"),
("LEFTPADDING", (0, 0), (-1, -1), 0),
("RIGHTPADDING", (0, 0), (0, -1), 4),
("LEFTPADDING", (1, 0), (1, -1), 4),
]))
story.append(body_tbl)
# ═══ ACTIVE CONSTITUENTS (full width) ════════════════════════════════════════
story.append(Spacer(1, 4))
story.append(section_header("ACTIVE CONSTITUENTS (Phytochemistry)"))
story.append(Spacer(1, 2))
phyto_data = [
["Constituent", "Action / Note"],
["Allantoin", "Stimulates epithelial & bone cell proliferation; promotes callus formation and wound healing"],
["Rosmarinic acid", "Anti-inflammatory; antioxidant"],
["Phenolic acids", "Anti-inflammatory; antimicrobial"],
["Mucilage / Tannins", "Demulcent; astringent; soothes mucous membranes"],
["Choline", "Tissue-healing support; membrane integrity"],
["Pyrrolizidine alkaloids (PAs)", "⚠ HEPATOTOXIC (cumulative) — veno-occlusive disease; reason internal crude use is restricted in many countries"],
]
ph_tbl = Table(phyto_data, colWidths=[46*mm, 140*mm])
ph_tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), ACCENT),
("TEXTCOLOR", (0, 0), (-1, 0), colors.white),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTNAME", (0, 1), (0, -1), "Helvetica-Bold"),
("FONTNAME", (1, 1), (1, -1), "Helvetica"),
("FONTSIZE", (0, 0), (-1, -1), 7),
("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, LIGHT_GREEN]),
("GRID", (0, 0), (-1, -1), 0.3, colors.HexColor("#CCCCCC")),
("LEFTPADDING", (0, 0), (-1, -1), 5),
("TOPPADDING", (0, 0), (-1, -1), 2),
("BOTTOMPADDING",(0, 0), (-1, -1), 2),
("VALIGN", (0, 0), (-1, -1), "TOP"),
("TEXTCOLOR", (1, 6), (1, 6), WARNING_RED),
("FONTNAME", (1, 6), (1, 6), "Helvetica-BoldOblique"),
]))
story.append(ph_tbl)
# ═══ SAFETY BANNER ═══════════════════════════════════════════════════════════
story.append(Spacer(1, 5))
safety_tbl = Table(
[[Paragraph(
"⚠ SAFETY NOTE: In homeopathic potencies, Symphytum is considered safe — PAs are diluted below toxicological significance. "
"Crude herbal comfrey (root teas, capsules, poultices on broken skin) carries genuine hepatic veno-occlusive disease risk. "
"Topical use: limit to intact skin, max 4–6 weeks. Internal herbal use is regulated/prohibited in EU, USA, and Australia. "
"Always confirm bone reduction before prescribing to avoid risk of mal-union. "
"Sources: Tintinalli's Emergency Medicine; Katzung's Basic & Clinical Pharmacology 16th Ed.; Clarke; Boericke; Allen; Vithoulkas.",
S("saf", fontName="Helvetica", fontSize=6.5, textColor=colors.HexColor("#5D0000"),
leading=9.5))
]],
colWidths=[186 * mm]
)
safety_tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), colors.HexColor("#FDECEA")),
("LEFTPADDING", (0, 0), (-1, -1), 8),
("RIGHTPADDING",(0, 0), (-1, -1), 8),
("TOPPADDING", (0, 0), (-1, -1), 4),
("BOTTOMPADDING",(0, 0), (-1, -1), 4),
("BOX", (0, 0), (-1, -1), 0.8, WARNING_RED),
]))
story.append(safety_tbl)
# ═══ FOOTER ══════════════════════════════════════════════════════════════════
story.append(Spacer(1, 4))
story.append(Paragraph(
"Reference: Boericke W. Materia Medica with Repertory (9th Ed.) · Allen H.C. Materia Medica Keynotes · "
"Clarke J.H. Dictionary of Practical Materia Medica · Vithoulkas G. Materia Medica Viva | "
"Printed: Clinic Reference Card — For professional use",
CENTERED
))
# ── Build ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF written to: {OUTPUT}")
cd /home/daytona/workspace/symphytum-card && python generate_card.py 2>&1
ls -lh /home/daytona/workspace/symphytum-card/
Symphytum Officinale Reference Card
PDF Document · PDF
Search for recent clinical studies on Symphytum in bone fracture healing
Symphytum officinale fracture healing
comfrey bone fracture clinical trial
Symphytum officinale bone fracture healing clinical study evidence 2020 2024
Symphytum osteogenesis mesenchymal stem cells
comfrey root extract musculoskeletal clinical trial
Symphytum homeopathy fracture bone
PMID: 31672526
comfrey topical ointment randomized controlled trial pain
https://link.springer.com/article/10.1007/s11101-024-09977-1
PMID: 31672526
comfrey ankle sprain fracture RCT randomized
Symphytum homeopathic remedy case report fracture Vithoulkas
comfrey allantoin wound healing randomized trial
Evidence grade: In vitro study only - cannot be directly extrapolated to clinical fracture healing without confirmatory animal and human trials.
Evidence grade: In vitro / animal cell model only. Not indexed on PubMed at time of search.
Evidence grade: Tier 8 - Case series, no controls, no blinding, no radiological timeline data published in standardized form. Useful for hypothesis generation only.
| Study | Design | Population | Outcome |
|---|---|---|---|
| Grube et al. (2007) | RCT | Painful knee osteoarthritis | Comfrey root ointment significantly reduced pain vs. placebo |
| Barna et al. (2007) | RCT, n=278 | Fresh skin abrasions | 10% comfrey aerial part cream superior to 1% reference; faster wound healing |
| Kucera et al. (2005) | Clinical trial | Myalgia | Topical comfrey concentrate superior to placebo |
| Koll & Klingenburg (2002) | Observational, n=large | Bruises, sprains, muscle pain | High tolerability; significant pain/swelling reduction |
These trials validate comfrey's anti-inflammatory and analgesic effects topically, but the populations had soft tissue injuries, not fractures. They do not measure bone union or callus formation.
| Mechanism | Evidence Level |
|---|---|
| Allantoin stimulates cell proliferation (osteoblasts, fibroblasts, epithelium) | Well established in vitro |
| Rosmarinic acid inhibits COX-2 / LOX inflammatory pathways | Cell-free and animal studies |
| Homeopathic Symphytum upregulates Runx-2, Osteopontin, Osteocalcin gene expression | Dey et al. 2020 (PMID 31672526) |
| Alkaline phosphatase activity increase (marker of osteoblast function) | Dey 2020, Vaezi 2021 |
| Research Question | Evidence Available |
|---|---|
| Does Symphytum accelerate bone fracture union? | No RCTs; 2 in vitro studies; 1 case series |
| Does it reduce periosteal/fracture pain? | No controlled trials; extensive traditional use |
| Does it stimulate osteoblast activity? | Yes — in vitro (PMID 31672526; Vaezi 2021) |
| Is topical comfrey effective for musculoskeletal pain? | Yes — ~10 RCTs (soft tissue, not fractures) |
| Is it safe in homeopathic potency? | Yes — no toxicity concerns at diluted doses |