This are the drug list that we are going to use it Tomorrow in wari medical camp So prepare a manual for these drugs by giving drugs name , its indication, dose , route frequency, and duration and contraindications in details fully and also highlights the main part , for quick reviews Also add skme common diseases in ehich i can prescribe that i will usually see in this camp
Generate this manual as a portable PDF or Word document to print for the camp
mkdir -p /tmp/workspace/wari-camp && ls /tmp/workspace/wari-camp/
~/wari-camp/generate_manual.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.lib import colors
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 import BaseDocTemplate, Frame, PageTemplate
OUTPUT = "/tmp/workspace/wari-camp/Wari_Camp_Drug_Manual.pdf"
# ─── Colours ────────────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1a3c5e")
MED_BLUE = colors.HexColor("#2563a8")
LIGHT_BLUE = colors.HexColor("#dbeafe")
TEAL = colors.HexColor("#0e7490")
TEAL_LIGHT = colors.HexColor("#cffafe")
RED = colors.HexColor("#b91c1c")
RED_LIGHT = colors.HexColor("#fee2e2")
GREEN = colors.HexColor("#15803d")
GREEN_LIGHT= colors.HexColor("#dcfce7")
ORANGE = colors.HexColor("#c2410c")
ORANGE_LIGHT=colors.HexColor("#ffedd5")
YELLOW_LIGHT=colors.HexColor("#fef9c3")
GRAY_LIGHT = colors.HexColor("#f1f5f9")
GRAY_MID = colors.HexColor("#94a3b8")
WHITE = colors.white
BLACK = colors.black
# ─── Page layout with header/footer ─────────────────────────────────────────
PAGE_W, PAGE_H = A4
MARGIN = 1.8*cm
def header_footer(canvas, doc):
canvas.saveState()
# Header bar
canvas.setFillColor(DARK_BLUE)
canvas.rect(0, PAGE_H - 1.1*cm, PAGE_W, 1.1*cm, fill=1, stroke=0)
canvas.setFillColor(WHITE)
canvas.setFont("Helvetica-Bold", 8)
canvas.drawString(MARGIN, PAGE_H - 0.75*cm,
"WARI MEDICAL CAMP | MIMER Medical College & Dr. BSTR Hospital")
canvas.setFont("Helvetica", 8)
canvas.drawRightString(PAGE_W - MARGIN, PAGE_H - 0.75*cm, "15 July 2026")
# Footer
canvas.setFillColor(DARK_BLUE)
canvas.rect(0, 0, PAGE_W, 0.85*cm, fill=1, stroke=0)
canvas.setFillColor(WHITE)
canvas.setFont("Helvetica", 7)
canvas.drawString(MARGIN, 0.28*cm,
"For use by qualified healthcare professionals only | Not for public distribution")
canvas.setFont("Helvetica-Bold", 8)
canvas.drawRightString(PAGE_W - MARGIN, 0.28*cm, f"Page {doc.page}")
canvas.restoreState()
doc = BaseDocTemplate(
OUTPUT, pagesize=A4,
leftMargin=MARGIN, rightMargin=MARGIN,
topMargin=1.5*cm, bottomMargin=1.5*cm,
)
frame = Frame(MARGIN, 1.5*cm, PAGE_W - 2*MARGIN, PAGE_H - 3.0*cm, id="main")
doc.addPageTemplates([PageTemplate(id="main", frames=[frame], onPage=header_footer)])
# ─── Styles ──────────────────────────────────────────────────────────────────
SS = getSampleStyleSheet()
def sty(name, parent="Normal", **kw):
s = ParagraphStyle(name, parent=SS[parent], **kw)
return s
s_title = sty("s_title", "Normal", fontSize=22, textColor=WHITE,
alignment=TA_CENTER, fontName="Helvetica-Bold", leading=28)
s_subtitle = sty("s_subtitle", "Normal", fontSize=11, textColor=LIGHT_BLUE,
alignment=TA_CENTER, fontName="Helvetica", leading=16)
s_h1 = sty("s_h1", "Normal", fontSize=14, textColor=WHITE,
fontName="Helvetica-Bold", leading=18, spaceBefore=8, spaceAfter=4)
s_h2 = sty("s_h2", "Normal", fontSize=11, textColor=DARK_BLUE,
fontName="Helvetica-Bold", leading=15, spaceBefore=6, spaceAfter=3)
s_h3 = sty("s_h3", "Normal", fontSize=10, textColor=TEAL,
fontName="Helvetica-Bold", leading=13, spaceBefore=4, spaceAfter=2)
s_body = sty("s_body", "Normal", fontSize=9, textColor=BLACK,
fontName="Helvetica", leading=13, spaceAfter=3)
s_bold = sty("s_bold", "Normal", fontSize=9, textColor=BLACK,
fontName="Helvetica-Bold", leading=13)
s_quick = sty("s_quick", "Normal", fontSize=9, textColor=TEAL,
fontName="Helvetica-BoldOblique", leading=13, spaceAfter=4)
s_warn = sty("s_warn", "Normal", fontSize=9, textColor=RED,
fontName="Helvetica-Bold", leading=13)
s_note = sty("s_note", "Normal", fontSize=8.5,textColor=ORANGE,
fontName="Helvetica-BoldOblique", leading=12, spaceAfter=4)
s_toc = sty("s_toc", "Normal", fontSize=9, textColor=DARK_BLUE,
fontName="Helvetica", leading=14)
s_section_header = sty("s_section_header", "Normal", fontSize=10, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER, leading=14)
s_disease = sty("s_disease", "Normal", fontSize=11, textColor=DARK_BLUE,
fontName="Helvetica-Bold", leading=15, spaceBefore=5, spaceAfter=3)
# ─── Helper builders ─────────────────────────────────────────────────────────
def section_banner(text, bg=DARK_BLUE, fg=WHITE):
"""Full-width coloured banner."""
return Table(
[[Paragraph(text, s_section_header)]],
colWidths=[PAGE_W - 2*MARGIN],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
])
)
def drug_table(rows):
"""2-col table for drug parameters."""
data = []
for k, v in rows:
data.append([
Paragraph(k, s_bold),
Paragraph(v, s_body)
])
col_w = PAGE_W - 2*MARGIN
t = Table(data, colWidths=[3.5*cm, col_w - 3.5*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,-1), LIGHT_BLUE),
("BACKGROUND", (1,0), (1,-1), WHITE),
("ROWBACKGROUNDS",(0,0), (-1,-1), [GRAY_LIGHT, WHITE]),
("GRID", (0,0), (-1,-1), 0.4, GRAY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
return t
def ci_box(items):
"""Red-bordered contraindication box."""
text = " • ".join(items)
return Table(
[[Paragraph("<b>⚠ CONTRAINDICATIONS:</b> " + text, s_warn)]],
colWidths=[PAGE_W - 2*MARGIN],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), RED_LIGHT),
("BOX", (0,0), (-1,-1), 0.8, RED),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
])
)
def highlight_box(text, bg=YELLOW_LIGHT, tc=BLACK):
return Table(
[[Paragraph("✦ " + text, sty("_hl", "Normal", fontSize=9,
textColor=tc, fontName="Helvetica-Bold",
leading=13))]],
colWidths=[PAGE_W - 2*MARGIN],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 0.6, GRAY_MID),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
])
)
def sp(h=4): return Spacer(1, h)
def hr(): return HRFlowable(width="100%", thickness=0.5, color=GRAY_MID, spaceAfter=4)
# ═══════════════════════════════════════════════════════════════════════════
# BUILD CONTENT
# ═══════════════════════════════════════════════════════════════════════════
story = []
# ── COVER ────────────────────────────────────────────────────────────────────
story.append(sp(30))
cover_tbl = Table(
[[Paragraph("🏥 WARI MEDICAL CAMP", s_title)],
[Paragraph("Drug Reference Manual", s_subtitle)],
[sp(6)],
[Paragraph("MAER MIT Pune's | MIMER Medical College & Dr. BSTR Hospital,<br/>Talegaon Dabhade", s_subtitle)],
[Paragraph("Date: 15 July 2026", s_subtitle)],
],
colWidths=[PAGE_W - 2*MARGIN],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 18),
("BOTTOMPADDING", (0,0), (-1,-1), 18),
("LEFTPADDING", (0,0), (-1,-1), 20),
("ALIGN", (0,0), (-1,-1), "CENTER"),
])
)
story.append(cover_tbl)
story.append(sp(20))
# Quick instruction box
story.append(Table(
[[Paragraph(
"<b>How to use this manual</b><br/>"
"Each drug entry has: Indication · Dose · Route · Frequency · Duration · Contraindications · Key Highlight.<br/>"
"Part 2 covers the 12 most common conditions seen at field medical camps with ready prescriptions.<br/>"
"The Quick Reference Card (last page) is designed for fast prescribing at the table.",
sty("_intro","Normal", fontSize=9, textColor=DARK_BLUE, fontName="Helvetica", leading=14)
)]],
colWidths=[PAGE_W - 2*MARGIN],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_BLUE),
("BOX", (0,0), (-1,-1), 1, MED_BLUE),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 10),
])
))
story.append(PageBreak())
# ── PART 1 HEADER ────────────────────────────────────────────────────────────
story.append(section_banner("PART 1 | DRUG PROFILES (20 Drugs)"))
story.append(sp(10))
# ═════════════════════ DRUGS DATA ════════════════════════════════════════════
drugs = [
{
"num": 1, "name": "CYCLOPAM",
"subtitle": "Dicyclomine 20mg + Paracetamol 500mg",
"quick": "Antispasmodic — use for colicky abdominal pain, IBS, dysmenorrhea",
"params": [
("Indication", "Abdominal colic, IBS, dysmenorrhea, renal/biliary colic, GI spasm"),
("Dose", "1 tablet (Dicyclomine 20mg + Paracetamol 500mg)"),
("Route", "Oral"),
("Frequency", "TDS — 3 times daily"),
("Duration", "3–5 days or till pain resolves"),
],
"ci": ["Closed-angle glaucoma","Urinary retention / BPH","Myasthenia gravis",
"Obstructive GI disease","Children < 6 months"],
"hl": "Do NOT use in suspected surgical abdomen (appendicitis, peritonitis). Stop and refer.",
},
{
"num": 2, "name": "METRONIDAZOLE 400mg",
"subtitle": "Antiprotozoal / Anaerobic Antibiotic",
"quick": "Amoebic dysentery, Giardiasis, infected wounds, anaerobic infections",
"params": [
("Indication", "Amoebic dysentery, Giardiasis, anaerobic infections, infected wounds, dental infections, trichomonas"),
("Dose", "400mg (adult) | 7.5 mg/kg in children"),
("Route", "Oral"),
("Frequency", "TDS — 3 times daily"),
("Duration", "5–7 days (dysentery) | 7–10 days (severe infection)"),
],
"ci": ["First trimester pregnancy","Active epilepsy / CNS disease (caution)",
"Hepatic encephalopathy (dose reduce)","Hypersensitivity to nitroimidazoles"],
"hl": "AVOID ALCOHOL during treatment and 48 hrs after — disulfiram-like reaction. Warn patient of metallic taste.",
},
{
"num": 3, "name": "GELUSIL",
"subtitle": "Aluminium Hydroxide + Magnesium Hydroxide + Simethicone",
"quick": "Antacid — acidity, gastritis, heartburn, GERD, flatulence",
"params": [
("Indication", "Hyperacidity, gastritis, GERD, peptic ulcer symptoms, flatulence"),
("Dose", "1–2 tablets (chewed) or 1–2 tsp syrup"),
("Route", "Oral"),
("Frequency", "After meals and at bedtime — QID"),
("Duration", "5–7 days or as needed"),
],
"ci": ["Severe renal failure (Mg accumulation)","Hypophosphatemia","Bowel obstruction"],
"hl": "Take AFTER meals. Separate from other drugs by at least 2 hours — reduces their absorption.",
},
{
"num": 4, "name": "CIPROFLOXACIN 500mg",
"subtitle": "Fluoroquinolone Broad-Spectrum Antibiotic",
"quick": "UTI, traveler's diarrhea, skin infections, typhoid, respiratory infections",
"params": [
("Indication", "UTI, traveler's diarrhea, typhoid, infected wounds, skin & soft tissue infections, respiratory infections"),
("Dose", "500mg (adult)"),
("Route", "Oral"),
("Frequency", "BD — twice daily"),
("Duration", "3–7 days (UTI) | 7–14 days (other infections)"),
],
"ci": ["Children & adolescents < 18 yrs (cartilage damage)","Pregnancy & breastfeeding",
"Myasthenia gravis","Epilepsy (lowers seizure threshold)","Known QT prolongation"],
"hl": "Avoid antacids within 2 hrs. Can cause tendon rupture — warn elderly. Causes photosensitivity — advise sun protection.",
},
{
"num": 5, "name": "MULTIVITAMIN",
"subtitle": "A, B-complex, C, D, E + Minerals",
"quick": "Nutritional deficiency, weakness, convalescence — give to all malnourished patients",
"params": [
("Indication", "Nutritional deficiency, general weakness, malnutrition, convalescence, pregnancy supplementation"),
("Dose", "1 tablet"),
("Route", "Oral"),
("Frequency", "OD — once daily"),
("Duration", "30 days or as advised"),
],
"ci": ["Hypervitaminosis A or D","Hypercalcemia"],
"hl": "Best taken after meals. Give routinely to children, pregnant women, elderly, patients with anemia or weakness.",
},
{
"num": 6, "name": "EMSET 4mg (Ondansetron)",
"subtitle": "5-HT3 Receptor Antagonist Anti-emetic",
"quick": "Nausea & vomiting from any cause — gastroenteritis, drug-induced, heat illness",
"params": [
("Indication", "Nausea and vomiting — gastroenteritis, drug-induced, motion sickness, post-procedure"),
("Dose", "4mg adult | 0.1 mg/kg children"),
("Route", "Oral (dissolve under tongue) — IV if available"),
("Frequency", "BD–TDS (every 8 hrs in severe vomiting)"),
("Duration", "1–3 days or till vomiting stops"),
],
"ci": ["Congenital long QT syndrome","Hypersensitivity to ondansetron",
"Hepatic impairment (dose reduce)","Children < 2 years (limited data)"],
"hl": "Give BEFORE starting ORS in patients with vomiting to ensure ORS retention. Max 16mg/day.",
},
{
"num": 7, "name": "DICLOMOL",
"subtitle": "Diclofenac 50mg + Paracetamol 500mg",
"quick": "NSAID + Antipyretic combination — fever with bodyache, joint pain, injury pain",
"params": [
("Indication", "Fever with body ache, musculoskeletal pain, joint pain, headache, dental pain, injury pain"),
("Dose", "1 tablet"),
("Route", "Oral — ALWAYS after food"),
("Frequency", "BD–TDS"),
("Duration", "3–5 days"),
],
"ci": ["Active peptic ulcer / GI bleed","Severe renal or hepatic disease",
"Bleeding disorders","Asthma exacerbated by NSAIDs",
"Pregnancy (3rd trimester)","Children < 14 years"],
"hl": "ALWAYS take after food — prevent GI ulceration. For fever in children use plain Paracetamol only, NOT Diclomol.",
},
{
"num": 8, "name": "PARACETAMOL 500mg",
"subtitle": "Analgesic / Antipyretic",
"quick": "Safest fever & pain drug — use in all ages, pregnancy, when NSAIDs are contraindicated",
"params": [
("Indication", "Fever, headache, body ache, mild-moderate pain (especially when NSAIDs contraindicated)"),
("Dose", "500mg–1g adult | 10–15 mg/kg/dose children"),
("Route", "Oral"),
("Frequency", "Every 4–6 hours (Max 4g/day adult | 5 doses/day children)"),
("Duration", "3–5 days or till fever resolves"),
],
"ci": ["Severe hepatic disease (dose reduce)","Alcoholism (hepatotoxicity risk)","Hypersensitivity"],
"hl": "Safest for fever in pregnancy and children. Do NOT exceed 4g/day. Warn: Diclomol already contains paracetamol — avoid double dosing.",
},
{
"num": 9, "name": "AMLODIPINE 5mg (Amlo 5mg)",
"subtitle": "Calcium Channel Blocker (Dihydropyridine)",
"quick": "Hypertension (most common camp use) and stable angina — once daily",
"params": [
("Indication", "Hypertension, stable angina"),
("Dose", "5mg (can be increased to 10mg by physician)"),
("Route", "Oral"),
("Frequency", "OD — once daily"),
("Duration", "Long-term / chronic — do not stop without medical advice"),
],
"ci": ["Severe hypotension (BP < 90/60)","Cardiogenic shock",
"Severe aortic stenosis","Hypersensitivity to dihydropyridines"],
"hl": "Do NOT stop abruptly in angina — risk of rebound ischemia. Side effects: pedal edema, flushing, headache. Check for drug duplication in known hypertensives.",
},
{
"num": 10, "name": "RANTAC 150mg (Ranitidine equivalent)",
"subtitle": "H2-Receptor Blocker — Acid Reducer",
"quick": "Acidity, GERD, peptic ulcer, gastric protection with NSAIDs",
"params": [
("Indication", "Peptic ulcer disease, GERD, gastritis, drug-induced gastric irritation"),
("Dose", "150mg"),
("Route", "Oral"),
("Frequency", "BD — morning and bedtime"),
("Duration", "4–8 weeks (ulcer) | Ongoing for GERD"),
],
"ci": ["Hypersensitivity","Renal impairment (dose reduce)","Porphyria"],
"hl": "Take 30 minutes before meals for best effect. Routinely co-prescribe with NSAIDs (Diclomol, Ciprofloxacin) to protect gastric mucosa.",
},
{
"num": 11, "name": "CETIRIZINE 10mg",
"subtitle": "Second-Generation H1 Antihistamine",
"quick": "Allergic rhinitis, urticaria, skin allergy, insect bites, allergic conjunctivitis",
"params": [
("Indication", "Allergic rhinitis, urticaria (hives), atopic dermatitis, allergic conjunctivitis, insect bites"),
("Dose", "10mg adult | 5mg children 2–6 years"),
("Route", "Oral"),
("Frequency", "OD — preferably at night"),
("Duration", "5–7 days (acute allergy) or as needed"),
],
"ci": ["Severe renal failure (dose reduce)","Hypersensitivity to cetirizine/hydroxyzine",
"Children < 2 years"],
"hl": "CAUSES DROWSINESS — warn patients, especially drivers/machine operators. Advise at bedtime. Minimal anticholinergic effects vs older antihistamines.",
},
{
"num": 12, "name": "BISACODYL 5mg",
"subtitle": "Stimulant Laxative",
"quick": "Constipation — short-term use only, rule out obstruction first",
"params": [
("Indication", "Constipation, bowel evacuation before procedures"),
("Dose", "5–10mg (1–2 tablets)"),
("Route", "Oral"),
("Frequency", "OD at bedtime"),
("Duration", "2–3 days MAX"),
],
"ci": ["Acute abdomen / appendicitis — NEVER GIVE","Intestinal obstruction",
"Acute IBD / colitis","Severe unexplained abdominal pain",
"Children < 3 years","Pregnancy (1st trimester)"],
"hl": "CRITICAL: Rule out surgical/obstructive cause before prescribing. Takes 6–12 hrs to act. Do not crush enteric-coated tablets. Avoid prolonged use.",
},
{
"num": 13, "name": "B-COMPLEX",
"subtitle": "B1, B2, B3, B5, B6, B12 + Folic Acid",
"quick": "Weakness, peripheral neuropathy, nutritional deficiency, supplement for diabetics & TB patients",
"params": [
("Indication", "B-vitamin deficiency, peripheral neuropathy, weakness, anemia, alcoholic neuropathy, pregnancy"),
("Dose", "1–2 tablets"),
("Route", "Oral"),
("Frequency", "OD or BD"),
("Duration", "30–90 days (deficiency states)"),
],
"ci": ["Hypersensitivity (rare)","Hypervitaminosis B"],
"hl": "Give to elderly, malnourished, diabetics, and patients on isoniazid (TB) to prevent neuropathy. Safe in pregnancy.",
},
{
"num": 14, "name": "CALCIUM (Calcium Carbonate 500mg–1g)",
"subtitle": "Mineral Supplement",
"quick": "Bone health, hypocalcemia, pregnancy & lactation, elderly patients, muscle cramps",
"params": [
("Indication", "Osteoporosis, calcium deficiency, pregnancy & lactation, growing children, post-menopausal women, muscle cramps"),
("Dose", "500mg–1g (elemental calcium)"),
("Route", "Oral"),
("Frequency", "BD — split doses for better absorption"),
("Duration", "30–90 days or long-term"),
],
"ci": ["Hypercalcemia","Renal stones (calcium oxalate — caution)","Severe renal failure",
"Sarcoidosis / hyperparathyroidism"],
"hl": "Take with or after meals. Separate from iron supplements by 2 hrs. Combine with Vitamin D for optimal absorption.",
},
{
"num": 15, "name": "COUGH SYRUP",
"subtitle": "Expectorant (Bromhexine/Ambroxol) or Antitussive (Dextromethorphan)",
"quick": "Productive cough = expectorant; Dry irritating cough = antitussive",
"params": [
("Indication", "Dry cough (antitussive) or productive cough (expectorant), URTI, bronchitis"),
("Dose", "10ml (2 tsp) adult | 5ml children 6–12 years"),
("Route", "Oral"),
("Frequency", "TDS — 3 times daily"),
("Duration", "3–5 days"),
],
"ci": ["Dextromethorphan: avoid with MAO inhibitors","Codeine: avoid in children < 12, asthma",
"Alcohol-containing: avoid in pregnancy, children, liver disease"],
"hl": "Do NOT suppress productive (mucus-producing) cough — give expectorant. Antitussive for dry, irritating cough only.",
},
{
"num": 16, "name": "LOPERAMIDE 2mg (Clonramide)",
"subtitle": "Opioid Receptor Agonist — Anti-diarrheal",
"quick": "Watery non-infective diarrhea only — NOT for bloody diarrhea or high fever",
"params": [
("Indication", "Non-infective acute watery diarrhea, traveler's diarrhea (no blood), IBS diarrhea"),
("Dose", "4mg initially, then 2mg after each loose stool"),
("Route", "Oral"),
("Frequency", "After each loose stool (as needed)"),
("Duration", "Max 2 days | Max 16mg/day"),
],
"ci": ["Bloody diarrhea / dysentery — NEVER GIVE (toxic megacolon risk)",
"Children under 2 years — NEVER",
"High fever with diarrhea","Acute ulcerative colitis / pseudomembranous colitis",
"Suspected bowel obstruction"],
"hl": "RULE: Diarrhea + fever + blood = Metronidazole + ORS. Watery diarrhea, no fever, no blood = Loperamide + ORS. Always hydrate!",
},
{
"num": 17, "name": "CIPRO EYE DROPS (Ciprofloxacin 0.3%)",
"subtitle": "Fluoroquinolone Ophthalmic Antibiotic",
"quick": "Bacterial conjunctivitis (pink eye), post-trauma eye infection, corneal ulcer",
"params": [
("Indication", "Bacterial conjunctivitis, post-trauma eye infection, corneal ulcer"),
("Dose", "1–2 drops per affected eye"),
("Route", "Topical (ophthalmic)"),
("Frequency", "Every 4 hours (Q4H) — 4–6 times daily"),
("Duration", "5–7 days"),
],
"ci": ["Viral eye infections e.g. herpes keratitis — will worsen","Fungal eye infections",
"Hypersensitivity to fluoroquinolones","Do not wear contact lenses during treatment"],
"hl": "Pull lower lid, instill in conjunctival sac, press inner corner 30 sec. Tip must NOT touch eye. RED EYE + VISION LOSS + SEVERE PAIN = REFER immediately.",
},
{
"num": 18, "name": "CLOTRIMAZOLE OINTMENT 1%",
"subtitle": "Imidazole Antifungal — Topical",
"quick": "Ringworm (Tinea), Candida skin infections, Pityriasis versicolor",
"params": [
("Indication", "Tinea corporis (ringworm), Tinea cruris (groin), Tinea pedis (athlete's foot), Candidal skin infection, Pityriasis versicolor"),
("Dose", "Thin layer over affected area + 1 cm beyond margin"),
("Route", "Topical"),
("Frequency", "BD — twice daily"),
("Duration", "2–4 weeks (continue 1 week after lesion clears to prevent relapse)"),
],
"ci": ["Ophthalmic use — do not use near eyes","Hypersensitivity",
"Nail infections alone — needs systemic treatment"],
"hl": "Common at camp: ring-shaped, itchy, scaly lesions in body folds. Advise: keep area clean and dry, use own towel, wear loose cotton clothes.",
},
{
"num": 19, "name": "DICLO GEL 1% (Diclofenac Gel)",
"subtitle": "Topical NSAID — Localized Pain Relief",
"quick": "Joint pain, sprains, strains, back pain, knee pain — use locally without GI risk",
"params": [
("Indication", "Localized musculoskeletal pain, joint pain, sprains, strains, back pain, mild osteoarthritis"),
("Dose", "1–2g (small amount) per application"),
("Route", "Topical"),
("Frequency", "TDS–QID (3–4 times daily)"),
("Duration", "5–7 days"),
],
"ci": ["Open wounds or broken skin","Eyes or mucous membranes",
"Children < 6 years","NSAID sensitivity/allergy"],
"hl": "Wash hands after application. Do NOT cover with occlusive bandage. Useful for elderly where oral NSAIDs are risky.",
},
{
"num": 20, "name": "DICLO SPRAY (Diclofenac Spray)",
"subtitle": "Topical NSAID — Spray Formulation",
"quick": "Same as Diclo Gel — use for hard-to-reach areas (shoulder, back)",
"params": [
("Indication", "Musculoskeletal pain, sprains, strains — especially shoulders, back, hard-to-reach areas"),
("Dose", "1–3 sprays on affected area"),
("Route", "Topical"),
("Frequency", "TDS–QID"),
("Duration", "5–7 days"),
],
"ci": ["Open wounds","Eyes, mouth, nose","NSAID allergy"],
"hl": "Spray from 10–15 cm distance. Keep away from face. Let air dry before covering.",
},
]
for drug in drugs:
block = []
# Drug heading
num_style = sty("_num","Normal", fontSize=9, textColor=WHITE,
fontName="Helvetica-Bold", leading=13)
name_style= sty("_nm", "Normal", fontSize=12, textColor=WHITE,
fontName="Helvetica-Bold", leading=16)
sub_style = sty("_sb", "Normal", fontSize=9, textColor=LIGHT_BLUE,
fontName="Helvetica", leading=12)
hdr = Table(
[[Paragraph(f"Drug {drug['num']:02d}", num_style),
Paragraph(drug['name'], name_style),
Paragraph(drug['subtitle'], sub_style)]],
colWidths=[1.6*cm, 6.5*cm, PAGE_W-2*MARGIN-8.1*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
])
)
block.append(hdr)
block.append(Table([[Paragraph("🔑 " + drug['quick'], s_quick)]],
colWidths=[PAGE_W-2*MARGIN],
style=TableStyle([
("BACKGROUND",(0,0),(-1,-1), TEAL_LIGHT),
("TOPPADDING",(0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING",(0,0),(-1,-1), 8),
])))
block.append(drug_table(drug['params']))
block.append(ci_box(drug['ci']))
block.append(highlight_box(drug['hl']))
block.append(sp(8))
story.append(KeepTogether(block))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════
# CONSUMABLES TABLE
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_banner("CONSUMABLES & SUPPLIES QUICK REFERENCE"))
story.append(sp(8))
cons_data = [
[Paragraph("Item", s_bold), Paragraph("Use", s_bold), Paragraph("Key Point", s_bold)],
["ORS", "Dehydration from diarrhea/vomiting/heat", "200–400 ml after each loose stool; dissolve 1 packet in 1 litre water"],
["Normal Saline (NS)", "IV fluids / wound irrigation", "For wound cleaning and IV replacement in severe dehydration"],
["Glucon-D", "Hypoglycemia, heat exhaustion, energy depletion", "Mix 2 tbsp in 200 ml water; for conscious patients only"],
["H2O2 3%", "Infected wound cleaning", "Dilute 1:1 with water; not for clean wounds — use NS instead"],
["Roller Bandage 4\"", "Upper limb wounds, dressing", "Wrap firmly but not too tight — check capillary refill"],
["Roller Bandage 6\"", "Lower limb wounds, splinting", "4\" for upper, 6\" for lower limb as rule of thumb"],
["Sterile Gauze Pad", "Wound coverage, dressing", "Change every 24–48 hrs; use NS to moisten if adherent"],
["Cotton Roll", "Padding under bandage, wound care", "Place between skin and bandage to prevent pressure sores"],
["Surgical Tape", "Securing dressings", "Do not apply over blisters or broken skin"],
["Gloves", "Universal precautions", "Wear for ALL wound procedures and examinations"],
["Diclo Spray", "Sprains, strains, topical pain", "Keep away from face; 10–15 cm spray distance"],
]
cons_table = Table(
[[Paragraph(str(r[0]) if i==0 else r[0], s_bold if i==0 else s_body),
Paragraph(str(r[1]), s_bold if i==0 else s_body),
Paragraph(str(r[2]), s_bold if i==0 else s_body)]
for i, r in enumerate(cons_data)],
colWidths=[3.8*cm, 5.2*cm, PAGE_W-2*MARGIN-9*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GRAY_LIGHT]),
("GRID", (0,0), (-1,-1), 0.4, GRAY_MID),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
])
)
story.append(cons_table)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════
# PART 2 — COMMON DISEASES
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_banner("PART 2 | COMMON CAMP CONDITIONS (12 Diseases)", bg=TEAL))
story.append(sp(10))
diseases = [
{
"num":1, "name":"ACUTE GASTROENTERITIS / DIARRHEA",
"symptoms":"Loose watery stools, vomiting, cramps, mild fever",
"rx":[
("Watery diarrhea, no fever, no blood", "ORS + Loperamide 4mg then 2mg/stool + Emset 4mg BD"),
("Diarrhea + fever (no blood)", "ORS + Ciprofloxacin 500mg BD x 5 days"),
("Blood/mucus in stool (Dysentery)", "ORS + Metronidazole 400mg TDS x 7 days"),
("Severe vomiting, can't take ORS", "Emset 4mg ODT first — then ORS when vomiting eases"),
("Profuse watery / cholera-like", "IV Normal Saline + URGENT REFERRAL"),
],
"flag": "Referral: Profuse watery stool + severe dehydration, altered consciousness, BP < 90/60"
},
{
"num":2, "name":"FEVER (Viral / Non-specific)",
"symptoms":"Temperature > 38°C, body ache, headache, fatigue, sore throat",
"rx":[
("Simple viral fever", "Paracetamol 500mg–1g TDS x 3 days"),
("Fever + body ache (adult)", "Diclomol 1 tab BD x 3 days AFTER FOOD + Rantac 150mg BD"),
("Fever in children", "Paracetamol syrup 10–15 mg/kg Q4–6H only — NOT Diclomol"),
("Fever + cough + sore throat", "Paracetamol + Cough syrup TDS + Rantac 150mg BD"),
("Fever > 3 days / rigors / chills", "Suspect Malaria — refer for RDT/blood smear"),
],
"flag": "Referral: Petechiae, confusion, neck stiffness, continuous vomiting, SpO2 < 94%, BP drop"
},
{
"num":3, "name":"UPPER RESPIRATORY TRACT INFECTION (URTI / Common Cold)",
"symptoms":"Runny nose, sneezing, sore throat, mild cough, low-grade fever",
"rx":[
("Standard URTI", "Cetirizine 10mg OD night + Paracetamol 500mg TDS (if fever) + Cough syrup TDS"),
("Productive cough","Expectorant cough syrup TDS x 5 days"),
("Dry cough only", "Antitussive cough syrup TDS x 5 days"),
("GI protection", "Rantac 150mg BD if on multiple drugs"),
],
"flag": "Advise: Warm fluids, steam inhalation, rest, hand hygiene. Refer if dyspnea or SpO2 < 94%"
},
{
"num":4, "name":"MUSCULOSKELETAL PAIN / BACK PAIN / JOINT PAIN",
"symptoms":"Pain in back, knees, feet, joints — especially after long walking (pilgrims)",
"rx":[
("Mild localized pain", "Diclo Gel or Diclo Spray TDS–QID"),
("Moderate–severe pain", "Diclomol 1 tab BD after food + Rantac 150mg BD x 5 days"),
("Elderly with bone pain", "Calcium 1g OD + B-Complex BD (nutritional support)"),
("Ankle sprain", "RICE: Rest, Ice, Compression (roller bandage), Elevation"),
],
"flag": "Referral: Foot drop, incontinence + back pain, unilateral leg weakness = suspect disc prolapse"
},
{
"num":5, "name":"HYPERTENSION",
"symptoms":"Headache, dizziness, raised BP — often detected on screening",
"rx":[
("BP 140–160 / known patient ran out of meds", "Amlodipine 5mg OD — continue existing regimen"),
("BP 140–160 / first detected", "Lifestyle counseling + refer to PHC for full workup"),
("BP > 180/110, no symptoms (urgency)", "Amlodipine 5mg stat + monitor + refer"),
("BP > 180/110 + symptoms", "EMERGENCY REFERRAL immediately"),
],
"flag": "Never restart antihypertensives without knowing prior drug history. Check for duplication."
},
{
"num":6, "name":"FUNGAL SKIN INFECTIONS (Tinea / Ringworm)",
"symptoms":"Ring-shaped, scaly, itchy lesion with central clearing — groin, body, feet",
"rx":[
("Standard treatment", "Clotrimazole 1% ointment BD x 2–4 weeks"),
("Severe itching", "Cetirizine 10mg OD night x 5–7 days"),
("No oral antifungal", "If no systemic drug available — refer for Fluconazole 150mg weekly x 4 weeks"),
],
"flag": "Advise: Keep area dry, loose cotton clothes, separate towels. Highly contagious in camp."
},
{
"num":7, "name":"HEAT EXHAUSTION / HEAT STROKE",
"symptoms":"Muscle cramps, dizziness, weakness, nausea, heavy sweating, or absent sweating (heat stroke)",
"rx":[
("Heat cramps", "Rest, shade, ORS / Glucon-D, cool compresses"),
("Heat exhaustion", "Move to shade, ORS, cool with wet cloth, rest"),
("Heat stroke (T > 40°C, confusion, no sweating)", "EMERGENCY: Cool immediately, IV NS, URGENT REFERRAL"),
],
"flag": "Heat stroke = Medical Emergency. Do NOT delay referral. Remove excess clothing, fan vigorously."
},
{
"num":8, "name":"WOUNDS / LACERATIONS / ABRASIONS",
"symptoms":"Cuts, abrasions, lacerations — from falls, footwear injuries, sharp objects",
"rx":[
("Clean/minor wound", "Irrigate with NS, cover with sterile gauze + bandage"),
("Dirty/contaminated wound", "Irrigate NS → clean with diluted H2O2 → Ciprofloxacin 500mg BD x 5–7 days"),
("Pain management", "Diclomol 1 tab BD after food + Rantac 150mg BD"),
("Tetanus", "Ask vaccination history — if unknown/unvaccinated, refer for TT injection"),
],
"flag": "Referral: Deep wounds needing suturing, suspected tendon/nerve injury, arterial bleed."
},
{
"num":9, "name":"ALLERGIC REACTIONS / URTICARIA",
"symptoms":"Itchy rash/hives, sneezing, watery eyes, running nose — from food, insect bites, pollen",
"rx":[
("Mild — urticaria only", "Cetirizine 10mg OD x 5–7 days"),
("Moderate — widespread hives", "Cetirizine 10mg BD + monitor"),
("Anaphylaxis (throat tightening, breathlessness, BP drop)", "EMERGENCY — Epinephrine (if available) + immediate referral"),
],
"flag": "Any throat swelling or difficulty breathing = ANAPHYLAXIS = immediate emergency."
},
{
"num":10, "name":"CONSTIPATION",
"symptoms":"No bowel movement > 2 days, hard stools, straining — common with dietary change, dehydration",
"rx":[
("First line", "Increase fluids (8–10 glasses/day) + fresh fruits + vegetables"),
("Drug treatment","Bisacodyl 5–10mg at bedtime x 2–3 days"),
("Exclusion", "RULE OUT obstruction/acute abdomen before prescribing ANY laxative"),
],
"flag": "Do NOT give Bisacodyl if patient has abdominal pain, distension, or not passing flatus."
},
{
"num":11, "name":"EYE INFECTIONS (Bacterial Conjunctivitis)",
"symptoms":"Red eye, purulent discharge, gritty sensation — no vision loss, no severe pain",
"rx":[
("Bacterial conjunctivitis", "Cipro Eye Drops 2 drops Q4H x 7 days (both eyes if bilateral)"),
("Allergic conjunctivitis", "Cetirizine 10mg OD + lubricant eye drops (if available)"),
("Clean discharge", "Clean from inner to outer corner with clean wet cloth"),
],
"flag": "RED EYE + VISION LOSS + SEVERE PAIN + PHOTOPHOBIA = REFER IMMEDIATELY — suspect corneal ulcer/uveitis."
},
{
"num":12, "name":"ABDOMINAL PAIN / COLIC",
"symptoms":"Cramp-like, colicky abdominal pain, bloating, gas, gurgling",
"rx":[
("Spasmodic colic / IBS", "Cyclopam 1 tab TDS x 3–5 days"),
("Gastritis / heartburn", "Gelusil after meals QID + Rantac 150mg BD"),
("Suspected infective cause", "Metronidazole 400mg TDS x 5 days"),
],
"flag": "REFERRAL: Guarding, rigidity, rebound tenderness, no bowel movement, vomiting bile, constant non-colicky pain = surgical emergency."
},
]
for d in diseases:
block = []
hdr = Table(
[[Paragraph(f" {d['num']:02d} ", sty("_dn","Normal",fontSize=11,
textColor=WHITE, fontName="Helvetica-Bold", leading=14)),
Paragraph(d['name'], sty("_dns","Normal",fontSize=11,
textColor=WHITE, fontName="Helvetica-Bold", leading=14)),
Paragraph(d['symptoms'], sty("_dss","Normal",fontSize=8.5,
textColor=TEAL_LIGHT, fontName="Helvetica-Oblique", leading=12))]],
colWidths=[1.3*cm, 6.0*cm, PAGE_W-2*MARGIN-7.3*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), TEAL),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
])
)
block.append(hdr)
# Rx table
rx_rows = [[Paragraph("Scenario", s_bold), Paragraph("Treatment", s_bold)]]
for sc, tx in d['rx']:
rx_rows.append([Paragraph(sc, s_body), Paragraph(tx, s_body)])
rx_t = Table(rx_rows,
colWidths=[5.0*cm, PAGE_W-2*MARGIN-5.0*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL_LIGHT),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GRAY_LIGHT]),
("GRID", (0,0), (-1,-1), 0.4, GRAY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
block.append(rx_t)
block.append(Table(
[[Paragraph("⚑ " + d['flag'],
sty("_flag","Normal",fontSize=8.5,textColor=RED,
fontName="Helvetica-Bold",leading=12))]],
colWidths=[PAGE_W-2*MARGIN],
style=TableStyle([
("BACKGROUND",(0,0),(-1,-1), RED_LIGHT),
("BOX",(0,0),(-1,-1),0.6, RED),
("TOPPADDING",(0,0),(-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING",(0,0),(-1,-1), 8),
])))
block.append(sp(8))
story.append(KeepTogether(block))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════
# QUICK REFERENCE CARD
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_banner("QUICK PRESCRIBING REFERENCE CARD", bg=ORANGE))
story.append(sp(8))
qr_data = [
[Paragraph("Condition", s_bold), Paragraph("First-Line Drug(s)", s_bold)],
["Watery loose motions (no blood)", "ORS + Loperamide 2–4mg + Emset 4mg"],
["Bloody/mucus diarrhea (dysentery)", "ORS + Metronidazole 400mg TDS x 7 days"],
["Fever (all ages)", "Paracetamol — 500mg–1g adult / 10–15 mg/kg child"],
["Fever + body ache (adult only)", "Diclomol 1 tab BD after food + Rantac 150mg BD"],
["Acidity / heartburn / gastritis", "Gelusil after meals OR Rantac 150mg BD"],
["Allergic rash / running nose", "Cetirizine 10mg OD at night"],
["Bacterial conjunctivitis (red eye)", "Cipro Eye Drops 2 drops Q4H x 7 days"],
["Fungal skin infection (ringworm)", "Clotrimazole 1% ointment BD x 3–4 weeks"],
["Productive cough", "Expectorant cough syrup 10ml TDS"],
["Dry irritating cough", "Antitussive cough syrup 10ml TDS"],
["Colicky abdominal pain", "Cyclopam 1 tab TDS x 3–5 days"],
["Nausea / vomiting", "Emset (Ondansetron) 4mg BD–TDS"],
["Localized joint/back pain", "Diclo Gel or Diclo Spray TDS + Diclomol if severe"],
["UTI / infected wound", "Ciprofloxacin 500mg BD x 5–7 days"],
["Hypertension (known patient)", "Amlodipine 5mg OD — continue"],
["Constipation", "Bisacodyl 5–10mg at bedtime (rule out obstruction first)"],
["Weakness / nutritional deficiency", "Multivitamin OD + B-Complex BD"],
["Bone pain / elderly / pregnancy", "Calcium 1g BD"],
["Heat exhaustion", "Shade + ORS + Glucon-D + cool compresses"],
["Heat stroke (T > 40°C, confusion)", "IV NS + EMERGENCY REFERRAL"],
]
col_w = PAGE_W - 2*MARGIN
qr_table = Table(
[[Paragraph(str(r[0]), s_bold if i==0 else s_body),
Paragraph(str(r[1]), s_bold if i==0 else s_body)]
for i, r in enumerate(qr_data)],
colWidths=[5.5*cm, col_w - 5.5*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,0), ORANGE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, ORANGE_LIGHT]),
("GRID", (0,0), (-1,-1), 0.4, GRAY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
])
)
story.append(qr_table)
story.append(sp(14))
# Emergency box
story.append(section_banner("⚠ EMERGENCY REFERRAL CRITERIA", bg=RED))
story.append(sp(4))
emergency_items = [
"Altered consciousness / confusion",
"Chest pain or severe breathlessness",
"SpO2 < 92% on air",
"BP > 180/120 with symptoms",
"Temperature > 40°C (heat stroke)",
"Rigid abdomen — peritonitis / surgical emergency",
"Throat swelling / stridor — anaphylaxis",
"Profuse uncontrolled bleeding",
"Vision loss with red eye",
"Suspected fracture with neurovascular compromise",
]
em_text = " • ".join(emergency_items)
story.append(Table(
[[Paragraph(em_text, sty("_em","Normal",fontSize=9,textColor=RED,
fontName="Helvetica-Bold",leading=14))]],
colWidths=[PAGE_W-2*MARGIN],
style=TableStyle([
("BACKGROUND",(0,0),(-1,-1), RED_LIGHT),
("BOX",(0,0),(-1,-1),1.2,RED),
("TOPPADDING",(0,0),(-1,-1), 8),
("BOTTOMPADDING",(0,0),(-1,-1), 8),
("LEFTPADDING",(0,0),(-1,-1), 10),
])
))
story.append(sp(14))
story.append(Table(
[[Paragraph(
"Manual prepared for Wari Medical Camp | MIMER Medical College & Dr. BSTR Hospital, Talegaon Dabhade | 15 July 2026<br/>"
"For use by qualified healthcare professionals only.",
sty("_footer","Normal",fontSize=8,textColor=GRAY_MID,
fontName="Helvetica-Oblique",alignment=TA_CENTER,leading=12)
)]],
colWidths=[PAGE_W-2*MARGIN],
style=TableStyle([
("TOPPADDING",(0,0),(-1,-1),5),
])
))
# ─── Build ────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF generated: {OUTPUT}")
cd /tmp/workspace/wari-camp && python generate_manual.py 2>&1
ls -lh /tmp/workspace/wari-camp/Wari_Camp_Drug_Manual.pdf
Wari Camp Drug Manual
PDF Document · PDF