All the viva question and management of foreign body of nose
nasal foreign body button battery child rhinoscopy
Give all detail
nasal foreign body child endoscopic view
"nasal foreign body" AND removal
PMID: 35561441
| Category | Examples | Notes |
|---|---|---|
| Organic | peas, beans, seeds, nuts, corn, paper, sponge, cotton, fabric | Swell with moisture/irrigation; higher infection/inflammation |
| Inorganic - inert | beads, plastic toy parts, stones, chalk | Can remain asymptomatic for years -> rhinolith |
| Inorganic - reactive | Button batteries, magnets | True emergencies; batteries cause liquefactive necrosis, magnet pairs (one in each nostril or nose+cheek) can cause septal pressure necrosis |
| Live/animate | maggots, insects, (rarely leeches in endemic areas) | Kill before removal |
| Iatrogenic | retained nasal packing/gauze | History of recent nasal surgery/epistaxis packing |
Create a quick reference PDF guide for nasal FB management
mkdir -p /tmp/workspace/nasal-fb-guide/output && ls -la /tmp/workspace/
~/nasal-fb-guide/build_pdf.py
# -*- coding: utf-8 -*-
"""Quick Reference PDF: Management of Nasal Foreign Body"""
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer,
ListFlowable, ListItem, HRFlowable, KeepTogether
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT
OUT = "/tmp/workspace/nasal-fb-guide/output/Nasal_Foreign_Body_Quick_Reference.pdf"
NAVY = colors.HexColor("#1b2a4a")
RED = colors.HexColor("#b3261e")
TEAL = colors.HexColor("#0f6d66")
LIGHT_GREY = colors.HexColor("#f2f2f2")
AMBER_BG = colors.HexColor("#fdecea")
styles = getSampleStyleSheet()
title_style = ParagraphStyle(
"TitleStyle", parent=styles["Title"], fontSize=19, leading=22,
textColor=NAVY, alignment=TA_CENTER, spaceAfter=2
)
subtitle_style = ParagraphStyle(
"SubtitleStyle", parent=styles["Normal"], fontSize=10, leading=12,
textColor=colors.grey, alignment=TA_CENTER, spaceAfter=10
)
h2 = ParagraphStyle(
"H2", parent=styles["Heading2"], fontSize=13, leading=15,
textColor=colors.white, backColor=NAVY, spaceBefore=10, spaceAfter=6,
leftIndent=4, borderPadding=(4, 4, 4, 4)
)
h3 = ParagraphStyle(
"H3", parent=styles["Heading3"], fontSize=11, leading=13,
textColor=NAVY, spaceBefore=6, spaceAfter=3
)
body = ParagraphStyle(
"Body", parent=styles["Normal"], fontSize=9.2, leading=12.5,
alignment=TA_LEFT, spaceAfter=3
)
body_small = ParagraphStyle(
"BodySmall", parent=styles["Normal"], fontSize=8.5, leading=11.5
)
warn_style = ParagraphStyle(
"Warn", parent=styles["Normal"], fontSize=9.5, leading=13,
textColor=RED, backColor=AMBER_BG, borderPadding=(6, 6, 6, 6),
spaceBefore=4, spaceAfter=6
)
cell_style = ParagraphStyle("Cell", parent=styles["Normal"], fontSize=8.6, leading=11)
cell_head = ParagraphStyle("CellHead", parent=styles["Normal"], fontSize=9, leading=11,
textColor=colors.white, fontName="Helvetica-Bold")
footer_style = ParagraphStyle("Footer", parent=styles["Normal"], fontSize=7.5,
textColor=colors.grey, alignment=TA_CENTER)
def P(text, style=body):
return Paragraph(text, style)
def bullets(items, style=body_small, bullet_type="bullet"):
return ListFlowable(
[ListItem(P(i, style), bulletColor=NAVY) for i in items],
bulletType=bullet_type, start=None, leftIndent=14, bulletFontSize=8
)
elements = []
# ---------- Header ----------
elements.append(P("Nasal Foreign Body", title_style))
elements.append(P("Quick Reference Guide — Diagnosis & Management", subtitle_style))
elements.append(HRFlowable(width="100%", thickness=1.2, color=NAVY, spaceAfter=8))
# ---------- Overview ----------
elements.append(P("OVERVIEW", h2))
elements.append(P(
"Foreign body (FB) impacted in the nasal cavity — most common in children "
"aged 2–4 years. Classic presentation: <b>unilateral, foul-smelling, purulent nasal "
"discharge</b> ± unilateral epistaxis. Also occurs in psychiatric/intellectually disabled adults. "
"Discharge typically takes ≥4 days to appear for inert objects, but is <b>immediate</b> with a button battery.",
body))
# ---------- Red flag box ----------
elements.append(P(
"⚠ BUTTON BATTERY = EMERGENCY. Liquefactive alkaline necrosis and septal perforation "
"can occur within <b>7 hours</b>. Remove immediately. <u>Do NOT instill nasal drops/saline before "
"removal</u> — electrolyte fluid completes the circuit and worsens the burn.",
warn_style))
# ---------- Types of FB ----------
elements.append(P("TYPES OF FOREIGN BODIES", h2))
fb_data = [
[P("Category", cell_head), P("Examples", cell_head), P("Key Point", cell_head)],
[P("Organic", cell_style), P("Peas, beans, seeds, nuts, corn, paper, sponge, cotton", cell_style),
P("Swell if irrigated with saline/water", cell_style)],
[P("Inert inorganic", cell_style), P("Beads, plastic parts, stones, chalk", cell_style),
P("Can sit for years → rhinolith formation", cell_style)],
[P("Reactive inorganic", cell_style), P("Button batteries, magnets", cell_style),
P("True emergencies — necrosis/perforation risk", cell_style)],
[P("Live/animate", cell_style), P("Maggots, insects", cell_style),
P("Kill before attempting removal", cell_style)],
]
fb_table = Table(fb_data, colWidths=[75, 220, 175])
fb_table.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), NAVY),
("GRID", (0, 0), (-1, -1), 0.5, colors.grey),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, LIGHT_GREY]),
("TOPPADDING", (0, 0), (-1, -1), 4),
("BOTTOMPADDING", (0, 0), (-1, -1), 4),
]))
elements.append(fb_table)
elements.append(Spacer(1, 6))
# ---------- Clinical features & diagnosis ----------
elements.append(P("CLINICAL FEATURES & DIAGNOSIS", h2))
cf_col1 = [
P("<b>Clinical features</b>", h3),
bullets([
"Local nasal pain (23–55%)",
"Unilateral mucopurulent/foul discharge (7–36%)",
"Unilateral nasal obstruction",
"Recurrent unilateral epistaxis",
"Excoriation of nasal vestibule/rim",
"Witnessed insertion by parent, OR asymptomatic",
]),
]
cf_col2 = [
P("<b>Diagnostic steps</b>", h3),
bullets([
"Anterior rhinoscopy with headlight + nasal speculum (both nostrils)",
"Decongest mucosa first if oedematous/obscured view",
"Nasal endoscopy if not visualised anteriorly or FB displaced posteriorly",
"Plain X-ray only helps for radio-opaque objects (battery = \"halo/double-ring\" sign); negative X-ray does NOT exclude FB",
"CT only if complication suspected (abscess, skull base extension)",
]),
]
cf_table = Table([[cf_col1, cf_col2]], colWidths=[235, 235])
cf_table.setStyle(TableStyle([
("VALIGN", (0, 0), (-1, -1), "TOP"),
("BOX", (0, 0), (-1, -1), 0.6, colors.grey),
("INNERGRID", (0, 0), (-1, -1), 0.6, colors.grey),
("LEFTPADDING", (0, 0), (-1, -1), 8),
("RIGHTPADDING", (0, 0), (-1, -1), 8),
("TOPPADDING", (0, 0), (-1, -1), 6),
("BOTTOMPADDING", (0, 0), (-1, -1), 6),
]))
elements.append(cf_table)
elements.append(Spacer(1, 8))
# ---------- Management algorithm ----------
elements.append(P("MANAGEMENT ALGORITHM (STEPWISE)", h2))
steps = [
("STEP 1 — Prepare",
"Restrain child (parent \"hug hold\" or supine, head immobilised). Good lighting + nasal speculum. "
"Topical vasoconstrictor (phenylephrine/oxymetazoline) + topical anaesthetic (lidocaine) to shrink mucosa and reduce bleeding."),
("STEP 2 — Positive pressure (least invasive)",
"\"Parent's/Mother's kiss\": occlude unaffected nostril, parent seals mouth over child's mouth, gives one sharp puff of air "
"(success ~50–60%). Bag-valve-mask can substitute. Older cooperative child: voluntary nose-blowing while occluding other side."),
("STEP 3 — Instrumentation",
"• Hook / bent Jobson-Horne probe — pass behind FB, pull forward (never push posteriorly)<br/>"
"• Alligator forceps — for FB visible/graspable near anterior nares (risk: fragments friable objects)<br/>"
"• Foley/Fogarty balloon catheter — pass beyond FB, inflate, withdraw to draw FB out<br/>"
"• Frazier suction catheter — smooth/friable objects<br/>"
"• Magnet-tipped probe — for metallic/magnetic FB<br/>"
"• Avoid irrigation if FB is organic/hygroscopic (rice, beans, sponge) — it will swell"),
("STEP 4 — If unsuccessful",
"Consider procedural sedation (ketamine ~20% of ED cases). Push FB into pharynx under GA and retrieve orally, "
"or fragment and remove piecemeal. Refer to ENT if: deeply impacted, posteriorly displaced, repeated failed attempts, "
"or child cannot be safely immobilised."),
("STEP 5 — Button battery",
"Remove immediately (ideally within the hour). No nasal drops before removal. Irrigate area with saline after removal "
"to dilute residual alkali. Arrange ENT follow-up for delayed septal perforation."),
("STEP 6 — Live insect",
"Kill first with 2% lidocaine or mineral oil, THEN remove with forceps/suction."),
]
step_flow = []
for i, (t, d) in enumerate(steps):
step_flow.append(P(f"<b>{t}</b>", h3))
step_flow.append(P(d, body))
elements.append(KeepTogether(step_flow[:4]))
elements.extend(step_flow[4:])
elements.append(Spacer(1, 6))
# ---------- Complications ----------
elements.append(P("COMPLICATIONS", h2))
comp_data = [
[P("Of the retained FB", cell_head), P("Of removal attempts", cell_head)],
[P("Chronic sinusitis; rhinolith formation; septal perforation; "
"pressure/liquefactive necrosis (battery); inferior turbinate hypoplasia; "
"rare aspiration if displaced posteriorly", cell_style),
P("Failed removal (most common); epistaxis; mucosal laceration; "
"fragmentation of friable object; rare septal perforation", cell_style)],
]
comp_table = Table(comp_data, colWidths=[235, 235])
comp_table.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), TEAL),
("GRID", (0, 0), (-1, -1), 0.5, colors.grey),
("VALIGN", (0, 0), (-1, -1), "TOP"),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING", (0, 0), (-1, -1), 5),
]))
elements.append(comp_table)
elements.append(Spacer(1, 8))
# ---------- Differential diagnosis ----------
elements.append(P("DIFFERENTIAL DIAGNOSIS (unilateral nasal symptoms in a child)", h2))
elements.append(bullets([
"Choanal atresia/stenosis (presents earlier, in infancy)",
"Unilateral choanal / antrochoanal polyp",
"Rhinolith (long-standing, calcified FB)",
"Dental disease / odontogenic sinusitis",
"Juvenile nasopharyngeal angiofibroma (adolescent males — epistaxis)",
"Nasal tumour (if symptoms persist despite treatment)",
], style=body))
elements.append(Spacer(1, 4))
# ---------- Key red flags summary ----------
elements.append(P("KEY RED FLAGS — REFER / ACT URGENTLY", h2))
elements.append(bullets([
"Button battery — remove within the hour, no nasal drops first",
"Magnet pairs across septum — urgent removal (pressure necrosis)",
"Failed 2+ attempts, deep or posterior FB — refer ENT",
"Signs of complication: heavy bleeding, suspected perforation, orbital/facial swelling",
"Persistent unilateral symptoms after FB removed / no FB found — investigate for tumour",
], style=body))
elements.append(Spacer(1, 10))
elements.append(HRFlowable(width="100%", thickness=0.8, color=colors.grey))
elements.append(Spacer(1, 4))
elements.append(P(
"Sources: Scott-Brown's Otorhinolaryngology Head & Neck Surgery Vol 2 (Ch.34); "
"Tintinalli's Emergency Medicine (Ch.123, Ch.244); Textbook of Family Medicine 9e (Ch.18); "
"K J Lee's Essential Otolaryngology; ROSEN's Emergency Medicine. "
"Evidence check: Jungbauer WN et al., Int J Pediatr Otorhinolaryngol 2022 (PMID 35561441), systematic review/meta-analysis "
"on pediatric nasal FB removal by care setting — consistent with stepwise approach above. "
"For clinical education / exam preparation use only — not a substitute for institutional protocols.",
footer_style))
def add_page_number(canvas, doc):
canvas.saveState()
canvas.setFont("Helvetica", 8)
canvas.setFillColor(colors.grey)
canvas.drawCentredString(A4[0] / 2.0, 12 * mm, f"Page {doc.page}")
canvas.restoreState()
doc = SimpleDocTemplate(
OUT, pagesize=A4,
topMargin=16 * mm, bottomMargin=16 * mm,
leftMargin=16 * mm, rightMargin=16 * mm,
title="Nasal Foreign Body - Quick Reference Guide"
)
doc.build(elements, onFirstPage=add_page_number, onLaterPages=add_page_number)
print("PDF created at:", OUT)
cd /tmp/workspace/nasal-fb-guide && python3 build_pdf.py
ls -la /tmp/workspace/nasal-fb-guide/output/ && python3 -c " import pdfplumber with pdfplumber.open('/tmp/workspace/nasal-fb-guide/output/Nasal_Foreign_Body_Quick_Reference.pdf') as pdf: print('Pages:', len(pdf.pages)) "
Nasal Foreign Body Quick Reference
PDF Document · PDF