Describe in detail the classification of exposure, post-exposure prophylaxis, and wound management of dog bite cases. Add a note on advantages of intradermal administration of cell culture vaccines.
| Category | Type of Contact with Suspect Rabid Animal | PEP Measures |
|---|---|---|
| Category I | Touching or feeding animals; licks on intact skin | None required |
| Category II | Nibbling of uncovered skin; minor scratches or abrasions without bleeding | Immediate vaccination + local wound treatment |
| Category III | Single or multiple transdermal bites or scratches; licks on broken skin; contamination of mucous membrane with saliva from licks; contact with bats | Immediate vaccination + rabies immunoglobulin (RIG) + local wound treatment |
Important note: In developing countries, the vaccination status of the suspected animal alone should not be used to decide whether to initiate prophylaxis or not. PEP may be discontinued if the animal is proved rabies-free by laboratory examination, or if a domestic dog, cat, or ferret remains healthy throughout a 10-day observation period from the date of the bite. - Park's Textbook of Preventive and Social Medicine
| Product | Dose |
|---|---|
| Human RIG (HRIG) | 20 IU/kg body weight |
| Equine RIG (ERIG) / F(ab')2 products | 40 IU/kg body weight |
Dog bite → Assess wound category (I / II / III)
↓
Category I → Wash + reassure; no vaccine/RIG
↓
Category II → Wound treatment + full CCEEV course (IM or ID)
↓
Category III → Wound treatment + CCEEV + RIG (infiltrate wound first)
↓
Previously vaccinated? → 2 IM doses (Days 0 & 3), no RIG
↓
Observe animal 10 days (dog/cat/ferret) → Stop PEP if animal healthy
Create pdf
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "created"
mkdir -p /tmp/workspace/dog-bite-pdf && cat > /tmp/workspace/dog-bite-pdf/generate_pdf.py << 'PYEOF' from reportlab.lib.pagesizes import A4 from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import cm from reportlab.lib import colors from reportlab.platypus import ( SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, KeepTogether ) from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY OUTPUT = "/tmp/workspace/dog-bite-pdf/Dog_Bite_Management.pdf" doc = SimpleDocTemplate( OUTPUT, pagesize=A4, leftMargin=2*cm, rightMargin=2*cm, topMargin=2.5*cm, bottomMargin=2.5*cm, title="Dog Bite Management: Classification, PEP & Wound Care", author="Orris Medical Reference", ) # ── Colour palette ──────────────────────────────────────────── DARK_BLUE = colors.HexColor("#1a3a5c") MID_BLUE = colors.HexColor("#2563a8") LIGHT_BLUE = colors.HexColor("#dbeafe") TEAL = colors.HexColor("#0f766e") LIGHT_TEAL = colors.HexColor("#ccfbf1") AMBER = colors.HexColor("#d97706") LIGHT_AMBER = colors.HexColor("#fef3c7") RED = colors.HexColor("#dc2626") LIGHT_RED = colors.HexColor("#fee2e2") GREY_BG = colors.HexColor("#f1f5f9") GREY_BORDER = colors.HexColor("#cbd5e1") WHITE = colors.white BLACK = colors.HexColor("#1e293b") # ── Styles ──────────────────────────────────────────────────── styles = getSampleStyleSheet() def S(name, **kw): return ParagraphStyle(name, **kw) title_style = S("DocTitle", fontSize=20, leading=26, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER, spaceAfter=4) subtitle_style = S("DocSub", fontSize=10, leading=14, textColor=colors.HexColor("#bfdbfe"), fontName="Helvetica", alignment=TA_CENTER, spaceAfter=0) h1 = S("H1", fontSize=13, leading=17, textColor=WHITE, fontName="Helvetica-Bold", spaceBefore=6, spaceAfter=4) h2 = S("H2", fontSize=11, leading=15, textColor=DARK_BLUE, fontName="Helvetica-Bold", spaceBefore=10, spaceAfter=4) h3 = S("H3", fontSize=10, leading=14, textColor=TEAL, fontName="Helvetica-Bold", spaceBefore=6, spaceAfter=2) body = S("Body", fontSize=9.5, leading=14, textColor=BLACK, fontName="Helvetica", spaceAfter=4, alignment=TA_JUSTIFY) bullet = S("Bullet", fontSize=9.5, leading=13, textColor=BLACK, fontName="Helvetica", spaceAfter=3, leftIndent=14, firstLineIndent=-10, alignment=TA_LEFT) note_style = S("Note", fontSize=9, leading=13, textColor=colors.HexColor("#92400e"), fontName="Helvetica-Oblique", spaceAfter=4) footer_style = S("Footer", fontSize=8, leading=10, textColor=colors.HexColor("#94a3b8"), fontName="Helvetica", alignment=TA_CENTER) source_style = S("Source", fontSize=8, leading=11, textColor=colors.HexColor("#64748b"), fontName="Helvetica-Oblique", spaceAfter=2) # ── Helper: section header band ─────────────────────────────── def section_header(text, bg=DARK_BLUE): tbl = Table([[Paragraph(text, h1)]], colWidths=[17*cm]) tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), bg), ("ROWPADDING", (0,0), (-1,-1), 7), ("BOX", (0,0), (-1,-1), 0, bg), ])) return tbl def sub_header(text): tbl = Table([[Paragraph(text, h2)]], colWidths=[17*cm]) tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), LIGHT_BLUE), ("ROWPADDING", (0,0), (-1,-1), 5), ("LINEBELOW", (0,0), (-1,-1), 1.5, MID_BLUE), ])) return tbl def info_box(paragraphs, bg=LIGHT_AMBER, border=AMBER): content = [[p] for p in paragraphs] # flatten to single cell cell_content = [p for p in paragraphs] tbl = Table([cell_content], colWidths=[17*cm]) tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), bg), ("BOX", (0,0), (-1,-1), 1, border), ("ROWPADDING", (0,0), (-1,-1), 6), ])) return tbl def bp(text): return Paragraph(f"<b>\u2022</b> {text}", bullet) def space(h=0.3): return Spacer(1, h*cm) # ── Build story ─────────────────────────────────────────────── story = [] # ── TITLE BLOCK ─────────────────────────────────────────────── title_data = [[ Paragraph("Dog Bite Management", title_style), Paragraph("Classification of Exposure • Post-Exposure Prophylaxis • Wound Management • Intradermal Vaccines", subtitle_style), ]] title_tbl = Table(title_data, colWidths=[17*cm]) title_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), DARK_BLUE), ("ROWPADDING", (0,0), (-1,-1), 14), ("BOX", (0,0), (-1,-1), 0, DARK_BLUE), ])) story.append(title_tbl) story.append(space(0.5)) story.append(Paragraph("Sources: Park's Textbook of Preventive & Social Medicine | Tintinalli's Emergency Medicine | Rosen's Emergency Medicine", source_style)) story.append(HRFlowable(width="100%", thickness=1, color=GREY_BORDER)) story.append(space(0.4)) # ═══════════════════════════════════════════════════════════════ # SECTION 1 — WHO EXPOSURE CLASSIFICATION # ═══════════════════════════════════════════════════════════════ story.append(section_header("1. WHO Classification of Exposure")) story.append(space(0.3)) story.append(Paragraph( "The WHO three-category system guides all post-exposure decision-making after potential rabies exposure from an animal bite or contact.", body)) story.append(space(0.2)) # Classification table cat_header_style = S("CatH", fontSize=9.5, fontName="Helvetica-Bold", textColor=WHITE, leading=13) cat_body_style = S("CatB", fontSize=9, fontName="Helvetica", textColor=BLACK, leading=13) cat_pep_style = S("CatP", fontSize=9, fontName="Helvetica-Bold", textColor=DARK_BLUE, leading=13) def cp(t, s): return Paragraph(t, s) cat_data = [ [cp("Category", cat_header_style), cp("Type of Contact", cat_header_style), cp("Examples", cat_header_style), cp("PEP Recommended", cat_header_style)], [cp("I\n(No exposure)", cat_body_style), cp("Touching or feeding animals; licks on intact skin", cat_body_style), cp("Petting a dog; handling without wound", cat_body_style), cp("None", cat_pep_style)], [cp("II\n(Minor exposure)", cat_body_style), cp("Nibbling of uncovered skin; minor scratches or abrasions without bleeding", cat_body_style), cp("Superficial scratch; small abrasion on hand", cat_body_style), cp("Immediate vaccination + local wound treatment", cat_pep_style)], [cp("III\n(Severe exposure)", cat_body_style), cp("Transdermal bite(s) or scratch(es); licks on broken skin; mucous membrane contamination; bat contact", cat_body_style), cp("Deep dog bite; scratch that bleeds; saliva in eye/mouth", cat_body_style), cp("Immediate vaccination + Rabies Immunoglobulin (RIG) + local wound treatment", cat_pep_style)], ] cat_tbl = Table(cat_data, colWidths=[2.5*cm, 4.5*cm, 4*cm, 6*cm]) cat_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_BLUE), ("BACKGROUND", (0,1), (-1,1), LIGHT_TEAL), ("BACKGROUND", (0,2), (-1,2), LIGHT_AMBER), ("BACKGROUND", (0,3), (-1,3), LIGHT_RED), ("GRID", (0,0), (-1,-1), 0.5, GREY_BORDER), ("ROWPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "TOP"), ])) story.append(cat_tbl) story.append(space(0.3)) # Risk factors box story.append(Paragraph("<b>Factors that increase risk (Category II & III):</b>", h3)) for f in [ "Biting mammal is a known rabies reservoir or vector species", "Animal looks sick or has abnormal behaviour", "Wound or mucous membrane was contaminated by the animal's saliva", "Bite was unprovoked", "Animal has not been vaccinated", "Biting animal cannot be traced or identified", ]: story.append(bp(f)) story.append(space(0.2)) note_tbl = Table([[Paragraph( "<b>Important:</b> In developing countries, the vaccination status of the suspected animal <b>alone</b> should not " "determine whether to initiate prophylaxis. PEP may be discontinued if the animal is proved rabies-free by " "laboratory examination, or if a domestic dog/cat/ferret remains healthy throughout a <b>10-day observation " "period</b> from the date of the bite.", note_style)]], colWidths=[17*cm]) note_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), LIGHT_AMBER), ("BOX", (0,0), (-1,-1), 1, AMBER), ("ROWPADDING", (0,0), (-1,-1), 7), ])) story.append(note_tbl) story.append(space(0.5)) # ═══════════════════════════════════════════════════════════════ # SECTION 2 — WOUND MANAGEMENT # ═══════════════════════════════════════════════════════════════ story.append(section_header("2. Wound Management (Local Treatment)", bg=TEAL)) story.append(space(0.3)) story.append(Paragraph( "Prompt and adequate local wound treatment is the <b>first and most critical step</b> in post-exposure management. " "Animal experiments have demonstrated that local wound treatment reduces the risk of developing rabies by up to <b>80%</b>. " "It should begin within minutes of exposure but must not be neglected even if hours or days have elapsed.", body)) story.append(space(0.2)) wound_steps = [ ("(a) Cleansing", "Flush and wash all bite wounds, scratches, and adjacent areas with <b>copious soap and water under a running tap " "for at least 15 minutes</b>. If soap is unavailable, flush thoroughly with plain water. " "For puncture wounds, use catheters to irrigate deeply."), ("(b) Chemical Treatment (Virucidal Agents)", "After cleansing, inactivate residual virus by irrigating with: <b>alcohol (400–700 ml/litre)</b>, " "<b>tincture or 0.01% aqueous iodine solution</b>, or <b>povidone-iodine</b>."), ("(c) Suturing", "<b>Do not immediately suture</b> bite wounds — this spreads virus into deeper tissues. " "If suturing is unavoidable, defer by <b>24–48 hours</b>, use minimum stitches, and perform under local cover of " "rabies immunoglobulin infiltrated into the wound."), ("(d) Antibiotics & Anti-Tetanus", "Apply antibiotics and anti-tetanus measures (tetanus toxoid ± tetanus immunoglobulin) when indicated, " "following the local wound treatment steps above."), ] for title, desc in wound_steps: row_data = [[Paragraph(title, h3), Paragraph(desc, body)]] row_tbl = Table(row_data, colWidths=[4.5*cm, 12.5*cm]) row_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (0,0), LIGHT_TEAL), ("BACKGROUND", (1,0), (1,0), WHITE), ("GRID", (0,0), (-1,-1), 0.5, GREY_BORDER), ("ROWPADDING", (0,0), (-1,-1), 7), ("VALIGN", (0,0), (-1,-1), "TOP"), ])) story.append(row_tbl) story.append(space(0.1)) story.append(space(0.5)) # ═══════════════════════════════════════════════════════════════ # SECTION 3 — POST-EXPOSURE PROPHYLAXIS # ═══════════════════════════════════════════════════════════════ story.append(section_header("3. Post-Exposure Prophylaxis (PEP)")) story.append(space(0.3)) story.append(Paragraph( "The aim of PEP is to neutralise inoculated virus <b>before</b> it enters the nervous system. " "The combined administration of a single dose of RIG (if indicated) + a full CCEEV vaccine course " "+ local wound treatment is the gold standard.", body)) story.append(space(0.3)) # 3a — Vaccines story.append(sub_header("3a. Cell-Culture & Embryonated Egg-Based Vaccines (CCEEVs)")) story.append(space(0.2)) vax_data = [ [Paragraph("<b>Vaccine Type</b>", cat_header_style), Paragraph("<b>Cell Substrate</b>", cat_header_style)], [Paragraph("Human Diploid Cell Vaccine (HDCV)", cat_body_style), Paragraph("Human embryonic fibroblast cells", cat_body_style)], [Paragraph("Purified Vero Cell Rabies Vaccine (PVRV)", cat_body_style), Paragraph("Vero cells (African green monkey kidney)", cat_body_style)], [Paragraph("Purified Chick Embryo Cell Vaccine (PCECV)", cat_body_style), Paragraph("Primary chick embryo cells", cat_body_style)], [Paragraph("Purified Duck Embryo Vaccine (PDEV)", cat_body_style), Paragraph("Embryonated duck eggs", cat_body_style)], [Paragraph("Primary Syrian Hamster Kidney Cell Vaccine", cat_body_style), Paragraph("Primary hamster kidney cells", cat_body_style)], ] vax_tbl = Table(vax_data, colWidths=[8*cm, 9*cm]) vax_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), MID_BLUE), ("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GREY_BG]), ("GRID", (0,0), (-1,-1), 0.5, GREY_BORDER), ("ROWPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ])) story.append(vax_tbl) story.append(space(0.15)) story.append(Paragraph( "All WHO-prequalified CCEEVs must meet a potency of <b>≥ 2.5 IU per single IM dose</b>. " "Stored at +2°C to +8°C; shelf-life ≥ 3 years. Once reconstituted, use within 6–8 hours.", body)) story.append(space(0.3)) # 3b — IM Regimens story.append(sub_header("3b. Intramuscular (IM) PEP Regimens")) story.append(space(0.15)) story.append(Paragraph( "Vaccine injected into the <b>deltoid muscle</b> (anterolateral thigh in children < 2 years). " "<b>Gluteal injection must be avoided</b> (poor immunogenicity due to fat tissue absorption).", body)) story.append(space(0.15)) reg_header = S("RegH", fontSize=9.5, fontName="Helvetica-Bold", textColor=WHITE, leading=13) reg_body = S("RegB", fontSize=9, fontName="Helvetica", textColor=BLACK, leading=13) reg_sched = S("RegS", fontSize=9, fontName="Helvetica-Bold", textColor=TEAL, leading=13) reg_data = [ [Paragraph("<b>Regimen</b>", reg_header), Paragraph("<b>Schedule</b>", reg_header), Paragraph("<b>Notes</b>", reg_header)], [Paragraph("Essen (5-dose)", reg_body), Paragraph("Days 0, 3, 7, 14, 28", reg_sched), Paragraph("Standard worldwide regimen; 1 IM dose each visit", reg_body)], [Paragraph("Zagreb / Abbreviated Multisite (2-1-1)", reg_body), Paragraph("Day 0 (×2 sites), Day 7, Day 21", reg_sched), Paragraph("2 doses on Day 0 (one in each deltoid/thigh); fewer visits", reg_body)], [Paragraph("4-dose simplified (ACIP / US)", reg_body), Paragraph("Days 0, 3, 7, 14", reg_sched), Paragraph("For healthy immunocompetent patients; current US CDC standard", reg_body)], ] reg_tbl = Table(reg_data, colWidths=[4.5*cm, 5*cm, 7.5*cm]) reg_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), MID_BLUE), ("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GREY_BG, LIGHT_BLUE]), ("GRID", (0,0), (-1,-1), 0.5, GREY_BORDER), ("ROWPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "TOP"), ])) story.append(reg_tbl) story.append(space(0.3)) # 3c — ID Regimen story.append(sub_header("3c. Intradermal (ID) PEP Regimen")) story.append(space(0.15)) story.append(Paragraph( "<b>2-site intradermal regimen (2+2+2+0+2):</b> Inject <b>0.1 ml at 2 sites</b> (both deltoids or thighs) " "on Days 0, 3, 7 and 28 (Day 14 is omitted). Applicable in countries where the ID route is endorsed by " "national health authorities for Category II and III exposures.", body)) story.append(space(0.1)) story.append(Paragraph( "Each ID dose = one-fifth of the IM dose (0.1 ml vs 0.5–1.0 ml), making this route significantly more economical.", body)) story.append(space(0.3)) # 3d — RIG story.append(sub_header("3d. Rabies Immunoglobulin (RIG) — Passive Immunisation")) story.append(space(0.15)) rig_data = [ [Paragraph("<b>Product</b>", reg_header), Paragraph("<b>Dose</b>", reg_header), Paragraph("<b>Source</b>", reg_header)], [Paragraph("Human Rabies Immunoglobulin (HRIG)", reg_body), Paragraph("20 IU/kg body weight", reg_sched), Paragraph("Human plasma donors", reg_body)], [Paragraph("Equine Rabies Immunoglobulin (ERIG) / F(ab')₂", reg_body), Paragraph("40 IU/kg body weight", reg_sched), Paragraph("Horse-derived; skin test before use", reg_body)], ] rig_tbl = Table(rig_data, colWidths=[6*cm, 4.5*cm, 6.5*cm]) rig_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), TEAL), ("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GREY_BG]), ("GRID", (0,0), (-1,-1), 0.5, GREY_BORDER), ("ROWPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ])) story.append(rig_tbl) story.append(space(0.15)) for pt in [ "Indicated <b>only for Category III exposures</b>; given <b>once only</b>.", "Administer at or as soon as possible after the first vaccine dose. <b>Not indicated beyond Day 7</b> from first vaccine dose (active immunity has begun).", "Infiltrate as much RIG as anatomically feasible into and around the wound site(s). Remaining volume injected IM at a site <b>distant</b> from the vaccine site.", "Never administer RIG in the same syringe or at the same site as the vaccine.", "RIG may be diluted in saline to facilitate adequate infiltration of multiple wounds.", ]: story.append(bp(pt)) story.append(space(0.3)) # 3e — Special populations story.append(sub_header("3e. PEP in Special Populations")) story.append(space(0.1)) sp_data = [ [Paragraph("<b>Population</b>", reg_header), Paragraph("<b>Regimen</b>", reg_header), Paragraph("<b>RIG Required?</b>", reg_header)], [Paragraph("Previously vaccinated (documented complete PrEP or PEP)", reg_body), Paragraph("2 IM doses (Days 0 & 3)\nOR 4 ID doses (all Day 0, 4 sites)", reg_body), Paragraph("No", reg_sched)], [Paragraph("Immunocompromised (HIV, steroids, immunosuppressants)", reg_body), Paragraph("5-dose IM course; check neutralising antibody titre 2–4 weeks after completion", reg_body), Paragraph("Yes (Cat III)", reg_sched)], [Paragraph("Chloroquine / antimalarial users", reg_body), Paragraph("Use IM route only (chloroquine impairs ID response)", reg_body), Paragraph("Per category", reg_sched)], ] sp_tbl = Table(sp_data, colWidths=[5.5*cm, 7.5*cm, 4*cm]) sp_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_BLUE), ("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GREY_BG, LIGHT_AMBER]), ("GRID", (0,0), (-1,-1), 0.5, GREY_BORDER), ("ROWPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "TOP"), ])) story.append(sp_tbl) story.append(space(0.5)) # ═══════════════════════════════════════════════════════════════ # SECTION 4 — INTRADERMAL ADVANTAGES # ═══════════════════════════════════════════════════════════════ story.append(section_header("4. Advantages of Intradermal Administration of Cell-Culture Vaccines", bg=TEAL)) story.append(space(0.3)) adv_items = [ ("Dose Economy & Cost Reduction", "Each ID injection uses only <b>0.1 ml</b> — approximately one-fifth of the IM dose. Multiple patients " "can be vaccinated from a single multidose vial, dramatically reducing cost per patient. The WHO " "endorses the ID route specifically for reasons of cost and availability in resource-limited settings."), ("Equal Immunogenicity", "When correctly administered by trained staff, the ID route is highly efficacious and induces protective " "neutralising antibody titres (≥ 0.5 IU/mL) comparable to IM administration. Studies confirm that " "<b>100% of healthy individuals</b> achieve a significant antibody response with WHO-approved CCEEVs. " "No individual with circulating neutralising antibody levels > 0.5 IU/mL has ever contracted rabies."), ("Suitability for Mass PrEP Programmes", "The substantially lower cost makes pre-exposure prophylaxis (PrEP) programmes and traveller vaccination " "feasible in endemic regions where the full IM course would be cost-prohibitive."), ("Same Vaccine — No Special Product Required", "The identical CCEEV vials used for IM administration can be repurposed for the ID route (in countries " "where endorsed), without requiring a separate product — simplifying supply chains and storage."), ("Multiple Sites in One Visit", "The ID route allows simultaneous injections at 2 or more sites on the same day (as in the 2-site ID regimen), " "facilitating accelerated schedules and reducing the total number of clinic visits."), ("Safety Profile", "Local reactions (redness, induration at injection site) are the primary adverse effects; systemic " "reactions are uncommon. No deaths have been reported from licensed CCEEV products by either route."), ] for i, (title, desc) in enumerate(adv_items): bg = LIGHT_TEAL if i % 2 == 0 else WHITE row = Table([[Paragraph(f"<b>{i+1}. {title}</b>", h3), Paragraph(desc, body)]], colWidths=[5*cm, 12*cm]) row.setStyle(TableStyle([ ("BACKGROUND", (0,0), (0,0), LIGHT_TEAL), ("BACKGROUND", (1,0), (1,0), bg), ("GRID", (0,0), (-1,-1), 0.5, GREY_BORDER), ("ROWPADDING", (0,0), (-1,-1), 7), ("VALIGN", (0,0), (-1,-1), "TOP"), ])) story.append(row) story.append(space(0.05)) story.append(space(0.2)) # Limitations box lim_tbl = Table([[Paragraph( "<b>Limitations of the ID route:</b> Technically more demanding — requires proper intradermal injection technique " "(subcutaneous depot gives poor immune response); staff must be specifically trained. " "Chloroquine and structurally related antimalarials impair ID immunogenicity — use IM instead in these patients. " "Not licensed for ID administration in the postexposure setting in the United States (CDC recommends IM only).", note_style)]], colWidths=[17*cm]) lim_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), LIGHT_RED), ("BOX", (0,0), (-1,-1), 1, RED), ("ROWPADDING", (0,0), (-1,-1), 8), ])) story.append(lim_tbl) story.append(space(0.5)) # ═══════════════════════════════════════════════════════════════ # SECTION 5 — DECISION SUMMARY # ═══════════════════════════════════════════════════════════════ story.append(section_header("5. Quick Decision Summary")) story.append(space(0.3)) sum_data = [ [Paragraph("<b>Scenario</b>", reg_header), Paragraph("<b>Wound Care</b>", reg_header), Paragraph("<b>Vaccine</b>", reg_header), Paragraph("<b>RIG</b>", reg_header)], [Paragraph("Category I (intact skin contact)", reg_body), Paragraph("Wash if needed", reg_body), Paragraph("None", reg_body), Paragraph("None", reg_body)], [Paragraph("Category II (minor scratch, no bleed)", reg_body), Paragraph("Soap + water 15 min; virucidal agent", reg_body), Paragraph("Full CCEEV course", reg_body), Paragraph("None", reg_body)], [Paragraph("Category III (deep bite / mucous membrane)", reg_body), Paragraph("Soap + water 15 min; virucidal agent; defer suture 24–48 h", reg_body), Paragraph("Full CCEEV course", reg_body), Paragraph("HRIG 20 IU/kg or ERIG 40 IU/kg (Day 0, once only)", reg_body)], [Paragraph("Previously vaccinated (any Category III)", reg_body), Paragraph("Full local wound care", reg_body), Paragraph("2 doses (Days 0 & 3)", reg_body), Paragraph("None needed", reg_body)], ] sum_tbl = Table(sum_data, colWidths=[4*cm, 4.5*cm, 4.5*cm, 4*cm]) sum_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_BLUE), ("ROWBACKGROUNDS", (0,1), (-1,-1), [LIGHT_TEAL, LIGHT_AMBER, LIGHT_RED, GREY_BG]), ("GRID", (0,0), (-1,-1), 0.5, GREY_BORDER), ("ROWPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "TOP"), ])) story.append(sum_tbl) story.append(space(0.4)) # Footer story.append(HRFlowable(width="100%", thickness=0.8, color=GREY_BORDER)) story.append(space(0.2)) story.append(Paragraph( "Sources: Park's Textbook of Preventive & Social Medicine (24th ed.) | " "Tintinalli's Emergency Medicine: A Comprehensive Study Guide | " "Rosen's Emergency Medicine: Concepts and Clinical Practice | WHO PEP Guidelines", footer_style)) story.append(Paragraph( "Generated by Orris Medical Reference \u2022 July 2026 \u2022 For educational use only", footer_style)) # ── Build ───────────────────────────────────────────────────── doc.build(story) print(f"PDF created: {OUTPUT}") PYEOF echo "Script written"
cd /tmp/workspace/dog-bite-pdf && python generate_pdf.py
ls -lh /tmp/workspace/dog-bite-pdf/Dog_Bite_Management.pdf
Dog Bite Management
PDF Document · PDF