Give essay answer on videofluoroscopy in Ent as pdf for Ent pg exam
videofluoroscopy ENT swallowing deglutition essay PG exam topics
mkdir -p /tmp/workspace/videofluoroscopy-ent && ls /tmp/workspace/
cat << 'PYEOF' > /tmp/workspace/videofluoroscopy-ent/generate_pdf.py from reportlab.lib.pagesizes import A4 from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import cm from reportlab.lib.colors import HexColor, black, white from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, KeepTogether) from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY from reportlab.platypus import Image as RLImage import urllib.request, io, os # Download VFSS image img_url = "https://cdn.orris.care/cdss_images/95c7b91f36738f506353fc76b4b81f8567bb1ac30e63afa9aac894816e52e52b.png" img_path = "/tmp/workspace/videofluoroscopy-ent/vfss.png" try: urllib.request.urlretrieve(img_url, img_path) img_downloaded = True except: img_downloaded = False # Color palette DARK_BLUE = HexColor("#1a3a5c") MED_BLUE = HexColor("#2e6da4") LIGHT_BLUE= HexColor("#d6e8f7") ACCENT = HexColor("#e8523a") GOLD = HexColor("#c8973a") LIGHT_GREY= HexColor("#f5f5f5") MID_GREY = HexColor("#888888") # Document doc = SimpleDocTemplate( "/tmp/workspace/videofluoroscopy-ent/Videofluoroscopy_in_ENT.pdf", pagesize=A4, topMargin=2*cm, bottomMargin=2*cm, leftMargin=2.5*cm, rightMargin=2.5*cm, title="Videofluoroscopy in ENT", author="Orris Medical" ) styles = getSampleStyleSheet() # Custom styles title_style = ParagraphStyle("Title", parent=styles["Title"], fontSize=22, textColor=white, alignment=TA_CENTER, fontName="Helvetica-Bold", leading=28, spaceAfter=4) subtitle_style = ParagraphStyle("Sub", parent=styles["Normal"], fontSize=11, textColor=LIGHT_BLUE, alignment=TA_CENTER, fontName="Helvetica", leading=15, spaceAfter=2) h1 = ParagraphStyle("H1", parent=styles["Heading1"], fontSize=14, textColor=white, fontName="Helvetica-Bold", leading=18, spaceBefore=14, spaceAfter=4, backColor=DARK_BLUE, leftPadding=8, rightPadding=8, topPadding=4, bottomPadding=4, borderRadius=3) h2 = ParagraphStyle("H2", parent=styles["Heading2"], fontSize=12, textColor=DARK_BLUE, fontName="Helvetica-Bold", leading=16, spaceBefore=10, spaceAfter=3, borderPad=0, leftIndent=0) body = ParagraphStyle("Body", parent=styles["Normal"], fontSize=10.5, leading=16, alignment=TA_JUSTIFY, fontName="Helvetica", spaceAfter=6, textColor=black) bullet = ParagraphStyle("Bullet", parent=styles["Normal"], fontSize=10, leading=15, fontName="Helvetica", leftIndent=18, bulletIndent=6, spaceAfter=3, bulletText="\u2022", textColor=black) caption = ParagraphStyle("Caption", parent=styles["Normal"], fontSize=9, leading=12, fontName="Helvetica-Oblique", alignment=TA_CENTER, textColor=MID_GREY, spaceAfter=6) box_style = ParagraphStyle("Box", parent=styles["Normal"], fontSize=10, leading=15, fontName="Helvetica", leftIndent=10, rightIndent=10, spaceAfter=4, textColor=DARK_BLUE, backColor=LIGHT_BLUE, borderPad=6) keypoint_style = ParagraphStyle("KP", parent=styles["Normal"], fontSize=10, leading=15, fontName="Helvetica-Bold", leftIndent=12, spaceAfter=3, textColor=DARK_BLUE) story = [] # ── TITLE BLOCK ────────────────────────────────────────────────────────────── def draw_title_bg(canvas, doc): canvas.saveState() canvas.setFillColor(DARK_BLUE) canvas.rect(0, A4[1]-6.5*cm, A4[0], 6.5*cm, fill=1, stroke=0) canvas.setFillColor(MED_BLUE) canvas.rect(0, A4[1]-7.0*cm, A4[0], 0.5*cm, fill=1, stroke=0) canvas.setFillColor(ACCENT) canvas.rect(0, A4[1]-7.3*cm, A4[0], 0.3*cm, fill=1, stroke=0) canvas.restoreState() # Build title as a table with coloured background title_data = [[Paragraph("VIDEOFLUOROSCOPY IN ENT", title_style)], [Paragraph("A Comprehensive Essay for Postgraduate ENT Examinations", subtitle_style)], [Paragraph("Sources: Scott-Brown's ORL Head & Neck Surgery · Cummings Otolaryngology · KJ Lee's Essential Otolaryngology", ParagraphStyle("src", parent=subtitle_style, fontSize=8.5, textColor=HexColor("#b0c8e0")))]] title_tbl = Table(title_data, colWidths=[doc.width]) title_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), DARK_BLUE), ("TOPPADDING", (0,0), (-1,-1), 10), ("BOTTOMPADDING",(0,0), (-1,-1), 8), ("LEFTPADDING", (0,0), (-1,-1), 12), ("RIGHTPADDING", (0,0), (-1,-1), 12), ("ROUNDEDCORNERS", [8]), ])) story.append(title_tbl) story.append(Spacer(1, 0.5*cm)) # ── INTRODUCTION ───────────────────────────────────────────────────────────── story.append(Paragraph("1. INTRODUCTION", h1)) story.append(Paragraph( "Videofluoroscopy (VF), also called the <b>Modified Barium Swallow Study (MBSS)</b> or " "<b>Videofluoroscopic Swallow Study (VFSS)</b>, is the radiological <b>gold standard</b> for " "the dynamic assessment of swallowing and pharyngeal function in ENT practice. " "First developed in 1965, it involves recording real-time fluoroscopic images while a patient " "ingests a radio-opaque bolus mixed with barium sulfate. The technique demonstrates the mechanics " "of deglutition and allows the multidisciplinary team to assess swallowing pathology, identify " "aspiration risk, and guide rehabilitation strategies.", body)) story.append(Paragraph( "In ENT, videofluoroscopy is indispensable in the workup of <b>dysphagia</b>, " "<b>aspiration</b>, <b>velopharyngeal dysfunction</b>, and post-treatment (surgical/oncological) " "rehabilitation. It also has an important role in the assessment of <b>speech disorders</b> " "(particularly velopharyngeal incompetence) in children.", body)) # Quick-reference box box_data = [ [Paragraph("<b>Key Fact</b>", keypoint_style)], [Paragraph( "Videofluoroscopy is the gold-standard instrumental assessment for oropharyngeal " "dysphagia. It provides dynamic, real-time imaging of all four stages of swallowing " "and uniquely identifies silent aspiration — aspiration that produces no cough reflex.", ParagraphStyle("boxb", parent=body, fontSize=10, backColor=LIGHT_BLUE, leftIndent=0)) ] ] box_tbl = Table(box_data, colWidths=[doc.width]) box_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), LIGHT_BLUE), ("TOPPADDING", (0,0), (-1,-1), 8), ("BOTTOMPADDING",(0,0), (-1,-1), 8), ("LEFTPADDING", (0,0), (-1,-1), 12), ("RIGHTPADDING", (0,0), (-1,-1), 12), ("LINEABOVE", (0,0), (-1,0), 2, MED_BLUE), ("LINEBELOW", (0,-1), (-1,-1), 2, MED_BLUE), ("ROUNDEDCORNERS", [4]), ])) story.append(box_tbl) story.append(Spacer(1, 0.3*cm)) # ── PHYSICS / TECHNICAL BASIS ───────────────────────────────────────────────── story.append(Paragraph("2. TECHNICAL BASIS", h1)) story.append(Paragraph( "Videofluoroscopy utilises a continuous X-ray beam passed through the patient, producing a " "real-time fluoroscopic image on a monitor. This image is simultaneously recorded (digital or " "video recording) so that the study can be reviewed frame-by-frame, played in slow motion, " "and shared between clinicians and centres.", body)) story.append(Paragraph( "Barium sulfate (BaSO4) is the radio-opaque contrast agent of choice for routine studies. " "If a pharyngeal or oesophageal perforation is suspected, a <b>water-soluble contrast agent</b> " "(e.g., Gastrografin) is substituted to avoid the risks of barium extravasation into mediastinal " "tissue. The contrast agent is mixed with foods and liquids of varying consistencies to replicate " "normal mealtime conditions.", body)) story.append(Paragraph("Viewing Planes", h2)) planes_data = [ [Paragraph("<b>Plane</b>", keypoint_style), Paragraph("<b>Structures Seen</b>", keypoint_style), Paragraph("<b>Clinical Utility</b>", keypoint_style)], [Paragraph("Lateral", body), Paragraph("Oral cavity, tongue, palate, pharynx, larynx, C-spine, cervical oesophagus", body), Paragraph("Primary plane; visualises all phases, aspiration, bolus transit, hyoid/laryngeal elevation, epiglottic tilting", body)], [Paragraph("Anteroposterior (AP)", body), Paragraph("Bilateral pharyngeal walls, pyriform sinuses, vocal folds", body), Paragraph("Asymmetry of bolus flow, unilateral pharyngeal weakness, bilateral pyriform sinus residue", body)], [Paragraph("Oblique", body), Paragraph("Pharynx and proximal oesophagus combined", body), Paragraph("Additional information on bolus transport into proximal oesophagus", body)], [Paragraph("En face / Towne (VF for speech)", body), Paragraph("Velopharyngeal port in-plane", body), Paragraph("Demonstrates lateral wall, velum and posterior wall movement in VPD assessment", body)], ] planes_tbl = Table(planes_data, colWidths=[3.2*cm, 5.5*cm, 7.3*cm]) planes_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_BLUE), ("TEXTCOLOR", (0,0), (-1,0), white), ("BACKGROUND", (0,1), (-1,1), LIGHT_BLUE), ("BACKGROUND", (0,3), (-1,3), LIGHT_BLUE), ("GRID", (0,0), (-1,-1), 0.5, HexColor("#cccccc")), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING",(0,0),(-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 6), ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"), ("VALIGN", (0,0), (-1,-1), "TOP"), ("ROWBACKGROUNDS", (0,1),(-1,-1), [white, LIGHT_BLUE]), ])) story.append(planes_tbl) story.append(Spacer(1, 0.3*cm)) # ── PROCEDURE ──────────────────────────────────────────────────────────────── story.append(Paragraph("3. PROCEDURE", h1)) story.append(Paragraph( "Videofluoroscopy is a multidisciplinary procedure performed jointly by a <b>Speech and Language " "Therapist (SLT)</b> and a <b>Radiologist</b>, often with input from the referring ENT surgeon.", body)) story.append(Paragraph("Patient Positioning and Setup", h2)) for item in [ "Patient is placed in an <b>anterolateral (lateral) position</b> with anatomical landmarks identified. An upright seated position is standard.", "Lateral view frames lips anteriorly to the <b>7th cervical vertebra</b> inferiorly, enabling complete viewing of oral and pharyngeal motility.", "Anteroposterior (AP) view is used additionally to assess symmetry.", "If required, an oblique upright view provides information about both pharyngeal and proximal oesophageal transport.", ]: story.append(Paragraph(item, bullet)) story.append(Paragraph("Bolus Administration", h2)) story.append(Paragraph( "The study begins with the <b>minimum quantity of bolus</b> to limit inhalation risk. Volume and " "consistency are progressively increased as the patient's swallowing function is assessed.", body)) for item in [ "<b>Liquid bolus</b> — thin liquid barium (5 mL, then 10 mL, 20 mL progressive sip sizes)", "<b>Semi-liquid / puréed bolus</b> — thickened barium, pudding consistency", "<b>Solid bolus</b> — semi-solid food coated or mixed with barium", "For paediatric speech VF: a small amount of barium is introduced through the nose to coat the velopharynx", ]: story.append(Paragraph(item, bullet)) story.append(Paragraph("Duration and Radiation Exposure", h2)) story.append(Paragraph( "Radiation exposure is intentionally minimised. The fluoroscopy beam is activated only during " "swallow events, and cumulative exposure is typically kept below 2–3 minutes of screening time. " "Images are recorded digitally, allowing unlimited subsequent review without additional radiation.", body)) # ── IMAGE ───────────────────────────────────────────────────────────────────── if img_downloaded: img = RLImage(img_path, width=8*cm, height=8*cm, kind="proportional") img_tbl = Table([[img]], colWidths=[doc.width]) img_tbl.setStyle(TableStyle([ ("ALIGN", (0,0),(-1,-1), "CENTER"), ("TOPPADDING", (0,0),(-1,-1), 6), ("BOTTOMPADDING",(0,0),(-1,-1), 2), ])) story.append(img_tbl) story.append(Paragraph( "Fig. 1 — Lateral radiographic view during VFSS / Modified Barium Swallow Study. " "The barium-filled bolus (bright white) is visible in the pharynx with laryngeal structures superimposed. " "(Source: Cummings Otolaryngology Head and Neck Surgery, 7th ed., Fig. 99.3)", caption)) # ── PHASES OF SWALLOWING ASSESSED ───────────────────────────────────────────── story.append(Paragraph("4. PHASES OF SWALLOWING ASSESSED", h1)) story.append(Paragraph( "Videofluoroscopy provides dynamic, real-time assessment of all four stages of swallowing. " "It is most powerful for the <b>oral</b> and <b>pharyngeal</b> phases, and can screen the oesophageal phase " "when an oesophageal cause of dysphagia needs to be excluded.", body)) phases_data = [ [Paragraph("<b>Phase</b>", keypoint_style), Paragraph("<b>VF Findings</b>", keypoint_style), Paragraph("<b>Pathology Detected</b>", keypoint_style)], [Paragraph("Oral Preparatory", body), Paragraph("Bolus formation, tongue seal, labial closure, chewing movements", body), Paragraph("Reduced tongue control, poor bolus formation, oral leakage, premature spillage", body)], [Paragraph("Oral Propulsive", body), Paragraph("Posterior tongue propulsion, palatal seal, bolus transit to oropharynx", body), Paragraph("Reduced tongue propulsion, oral residue, premature laryngeal spillage", body)], [Paragraph("Pharyngeal", body), Paragraph("Velopharyngeal closure, hyoid/laryngeal elevation, epiglottic tilting, pharyngeal contraction, UES opening", body), Paragraph("Nasal regurgitation, delayed swallow reflex, vallecular/pyriform residue, UES dysfunction, aspiration, penetration", body)], [Paragraph("Oesophageal (screen)", body), Paragraph("Barium transit through oesophagus into stomach (requires repositioning to RAO view)", body), Paragraph("Cricopharyngeal dysfunction, Zenker diverticulum, oesophageal dysmotility, stricture, GORD", body)], ] phases_tbl = Table(phases_data, colWidths=[3.0*cm, 5.8*cm, 7.2*cm]) phases_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_BLUE), ("TEXTCOLOR", (0,0), (-1,0), white), ("GRID", (0,0), (-1,-1), 0.5, HexColor("#cccccc")), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING",(0,0),(-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 6), ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"), ("VALIGN", (0,0), (-1,-1), "TOP"), ("ROWBACKGROUNDS", (0,1),(-1,-1), [white, LIGHT_BLUE]), ])) story.append(phases_tbl) story.append(Spacer(1, 0.3*cm)) # ── INDICATIONS ─────────────────────────────────────────────────────────────── story.append(Paragraph("5. INDICATIONS IN ENT PRACTICE", h1)) indications = [ ("<b>Dysphagia (primary indication)</b>", "Any oropharyngeal or pharyngo-oesophageal dysphagia — neurological, structural, post-surgical, post-radiotherapy"), ("<b>Aspiration and aspiration pneumonia</b>", "Identifies pre-, intra-, and post-deglutitory aspiration; most importantly detects 'silent' aspiration (no cough reflex)"), ("<b>Head and neck cancer (HNC)</b>", "Pre- and post-treatment functional assessment in patients undergoing surgery or chemoradiotherapy"), ("<b>Neurological disease</b>", "Stroke, multiple sclerosis, Parkinson's disease, motor neuron disease (ALS), myasthenia gravis, bulbar palsy"), ("<b>Velopharyngeal dysfunction (VPD)</b>", "Assessment of velopharyngeal closure patterns, Passavant ridge, lateral wall and velum motion in children with cleft palate or VPD"), ("<b>Cricopharyngeal dysfunction</b>", "Diagnosis of cricopharyngeal bar/UES dysfunction; pre-operative assessment before cricopharyngeal myotomy or botulinum toxin injection"), ("<b>Zenker's diverticulum</b>", "Characterise the pouch, filling dynamics, and pharyngo-oesophageal junction"), ("<b>Post-laryngectomy / laryngeal reconstruction</b>", "Functional assessment after partial laryngectomy, tracheo-oesophageal voice prosthesis, or free-flap reconstruction"), ("<b>Paediatric dysphagia and aspiration</b>", "Evaluation in children with feeding difficulties, neurodevelopmental conditions, or following airway surgery"), ("<b>Reflex mandibular closure</b>", "Supplements clinical assessment in patients with neurological disease who cannot co-operate with bedside assessment"), ] for bold_title, detail in indications: story.append(Paragraph(f"{bold_title}: {detail}", bullet)) story.append(Spacer(1, 0.2*cm)) # ── WHAT VF CAN DEMONSTRATE ─────────────────────────────────────────────────── story.append(Paragraph("6. WHAT VIDEOFLUOROSCOPY DEMONSTRATES", h1)) story.append(Paragraph("Safety of Swallowing", h2)) for item in [ "<b>Laryngeal penetration</b> — entry of bolus into the laryngeal vestibule above the vocal folds", "<b>Aspiration</b> — passage of bolus below the level of the true vocal folds into the trachea", "<b>Silent aspiration</b> — aspiration without cough response (up to 40% of dysphagic patients); uniquely detected on VF", "<b>Nasal regurgitation</b> — inadequate velopharyngeal closure", "Timing: pre-deglutitory, intra-deglutitory, or post-deglutitory aspiration can be distinguished", ]: story.append(Paragraph(item, bullet)) story.append(Paragraph("Efficiency of Swallowing", h2)) for item in [ "<b>Vallecular residue</b> — pooling of bolus in the glosso-epiglottic fold owing to reduced epiglottic tilt or poor tongue base retraction", "<b>Pyriform sinus residue</b> — pooling due to incomplete pharyngeal contraction or UES dysfunction", "<b>Pharyngeal constriction ratio</b> — objective measure of pharyngeal contractility", "<b>Oral residue</b> — indicating reduced tongue propulsion", ]: story.append(Paragraph(item, bullet)) story.append(Paragraph("Kinematics and Timing", h2)) for item in [ "Hyoid and laryngeal superior-anterior displacement", "Epiglottic inversion — assesses completeness and timing", "Upper oesophageal sphincter (UES) opening duration and width", "Swallow reaction time (onset to hyoid elevation)", "Pharyngeal transit time", "Duration of laryngeal vestibule closure", ]: story.append(Paragraph(item, bullet)) story.append(Paragraph("Structural Abnormalities", h2)) for item in [ "Cricopharyngeal bar (posterior wall indentation at C5/6 level)", "Zenker diverticulum — contrast filling a posterior pharyngeal pouch", "Pharyngeal or oesophageal stricture", "Post-surgical anatomy — reconstructed flaps, neo-pharynx", "Extrinsic compression of pharynx/oesophagus", ]: story.append(Paragraph(item, bullet)) # ── PENETRATION-ASPIRATION SCALE ────────────────────────────────────────────── story.append(Paragraph("7. THE PENETRATION-ASPIRATION SCALE (PAS)", h1)) story.append(Paragraph( "The Penetration-Aspiration Scale (Rosenbek et al. 1996) is the most widely used validated " "scoring tool applied to VFSS findings. It provides an 8-point ordinal scale quantifying the " "depth of airway invasion and the patient's response.", body)) pas_data = [ [Paragraph("<b>Score</b>", keypoint_style), Paragraph("<b>Description</b>", keypoint_style), Paragraph("<b>Category</b>", keypoint_style)], ["1", Paragraph("Material does not enter the airway", body), Paragraph("Normal", body)], ["2", Paragraph("Material enters the airway above the vocal folds; ejected from airway", body), Paragraph("Penetration — ejected", body)], ["3", Paragraph("Material enters the airway above the vocal folds; NOT ejected", body), Paragraph("Penetration — retained", body)], ["4", Paragraph("Material contacts the vocal folds; ejected from airway", body), Paragraph("Penetration — ejected", body)], ["5", Paragraph("Material contacts the vocal folds; NOT ejected", body), Paragraph("Penetration — retained", body)], ["6", Paragraph("Material passes below the vocal folds; ejected into the larynx or out of the airway", body), Paragraph("Aspiration — ejected", body)], ["7", Paragraph("Material passes below the vocal folds; NOT ejected despite effort", body), Paragraph("Aspiration — retained", body)], ["8", Paragraph("Material passes below the vocal folds; no effort to eject (SILENT ASPIRATION)", body), Paragraph("<b>Silent Aspiration</b>", body)], ] pas_tbl = Table(pas_data, colWidths=[1.6*cm, 9.8*cm, 4.6*cm]) pas_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_BLUE), ("TEXTCOLOR", (0,0), (-1,0), white), ("BACKGROUND", (0,8), (-1,8), HexColor("#f9ddd8")), ("GRID", (0,0), (-1,-1), 0.5, HexColor("#cccccc")), ("ALIGN", (0,0), (0,-1), "CENTER"), ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"), ("FONTNAME", (0,8), (-1,8), "Helvetica-Bold"), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING",(0,0),(-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "TOP"), ("ROWBACKGROUNDS", (0,1),(-1,-1), [white, LIGHT_BLUE]), ])) story.append(pas_tbl) story.append(Spacer(1, 0.3*cm)) # ── COMPENSATORY STRATEGIES ─────────────────────────────────────────────────── story.append(Paragraph("8. TESTING COMPENSATORY STRATEGIES", h1)) story.append(Paragraph( "One of the most valuable aspects of VFSS that distinguishes it from other investigations is " "the ability to test <b>compensatory and rehabilitative strategies in real-time</b> during the " "study, while observing their immediate effect on aspiration and bolus transport.", body)) strategies_data = [ [Paragraph("<b>Strategy</b>", keypoint_style), Paragraph("<b>Mechanism</b>", keypoint_style)], [Paragraph("Chin-tuck (chin-down posture)", body), Paragraph("Widens vallecular space; reduces laryngeal penetration by pushing epiglottis posteriorly", body)], [Paragraph("Head turn to affected side", body), Paragraph("Closes the weaker pyriform sinus; directs bolus down stronger side (useful in unilateral pharyngeal palsy)", body)], [Paragraph("Head tilt to stronger side", body), Paragraph("Directs bolus by gravity down the stronger side", body)], [Paragraph("Swallowing during breath-hold (supraglottic swallow)", body), Paragraph("Closes vocal folds before swallow, protecting airway during bolus transit", body)], [Paragraph("Super-supraglottic swallow", body), Paragraph("Closes laryngeal vestibule by tilting arytenoids anteriorly; for post-surgical patients", body)], [Paragraph("Mendelsohn manoeuvre", body), Paragraph("Prolongs hyoid/laryngeal elevation, increasing UES opening duration", body)], [Paragraph("Effortful swallow", body), Paragraph("Increases tongue base posterior retraction, improving pharyngeal clearance", body)], [Paragraph("Multiple swallows", body), Paragraph("Clears vallecular/pyriform residue; reduces post-swallow aspiration", body)], [Paragraph("Texture/consistency modification", body), Paragraph("Thicker consistencies reduce aspiration in neurological dysphagia; assessed for individual patients on VF", body)], ] strat_tbl = Table(strategies_data, colWidths=[5.5*cm, 10.5*cm]) strat_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_BLUE), ("TEXTCOLOR", (0,0), (-1,0), white), ("GRID", (0,0), (-1,-1), 0.5, HexColor("#cccccc")), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING",(0,0),(-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 6), ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"), ("VALIGN", (0,0), (-1,-1), "TOP"), ("ROWBACKGROUNDS", (0,1),(-1,-1), [white, LIGHT_BLUE]), ])) story.append(strat_tbl) story.append(Spacer(1, 0.3*cm)) # ── VF IN SPECIFIC ENT CONDITIONS ──────────────────────────────────────────── story.append(Paragraph("9. VIDEOFLUOROSCOPY IN SPECIFIC ENT CONDITIONS", h1)) story.append(Paragraph("9.1 Neurological Dysphagia", h2)) story.append(Paragraph( "Videofluoroscopy is the investigation of choice for neurological pharyngeal disease. " "It is most informative in stroke, Parkinson's disease, motor neuron disease (ALS), " "multiple sclerosis, and bulbar palsy. " "Key VF findings in neurological dysphagia include:", body)) for item in [ "Delayed or absent swallowing reflex (bolus reaching base of tongue without triggering pharyngeal swallow)", "Reduced tongue propulsion with oral residue", "Absent or reduced hyoid/laryngeal elevation", "Incomplete epiglottic tilting — risk of aspiration into the open laryngeal vestibule", "Reduced pharyngeal constriction leading to bilateral pyriform sinus residue", "Cricopharyngeal dysfunction — UES fails to open adequately despite pharyngeal contraction", "Pre-, intra-, and post-deglutitory aspiration — importantly including silent aspiration", "In ALS: initially delayed UES opening and reduced bolus propulsion, progressing to total pharyngeal dysfunction", ]: story.append(Paragraph(item, bullet)) story.append(Paragraph("9.2 Head and Neck Cancer", h2)) story.append(Paragraph( "VFSS is recommended over a standard barium swallow in HNC patients because controlled small-volume " "trials reduce aspiration risk and provide a functional assessment rather than a purely anatomical one. " "Applications include:", body)) for item in [ "Pre-treatment baseline functional assessment", "Post-chemoradiotherapy (CRT) assessment — CRT causes oedema, fibrosis, and XRT-induced pharyngeal muscle dysfunction", "Post-surgical assessment following laryngectomy (total/partial), pharyngectomy, glossectomy, or flap reconstruction", "Guiding oral intake decisions and timing of nasogastric tube removal or PEG placement", "Assessment before and after cricopharyngeal myotomy in post-laryngectomy patients with poor tracheo-oesophageal voice", ]: story.append(Paragraph(item, bullet)) story.append(Paragraph("9.3 Velopharyngeal Dysfunction (VPD) — Speech Videofluoroscopy", h2)) story.append(Paragraph( "In children with cleft palate or velopharyngeal incompetence, videofluoroscopy of the " "<b>velopharyngeal mechanism</b> is performed as a speech assessment tool rather than a " "swallowing tool. An SLT and radiologist attend the study.", body)) for item in [ "A small amount of barium is introduced through the nose to coat the velopharynx", "Child repeats or reads phoneme-specific speech tasks under fluoroscopy", "<b>Lateral view</b>: length, thickness, AP and superior motion of soft palate; Passavant ridge (anterior PPW movement)", "<b>AP view</b>: lateral pharyngeal wall motion", "<b>En face / Towne view</b>: best view of the velopharyngeal port — shows all structures simultaneously", "Determines pattern of VPD: coronal, sagittal, circular, or circular with Passavant ridge", "Guides surgical planning: sphincter pharyngoplasty vs. posterior pharyngeal flap", "Limitations: radiation, requires co-operative child, may miss small fistulas and intermittent closure", ]: story.append(Paragraph(item, bullet)) story.append(Paragraph("9.4 Cricopharyngeal Dysfunction", h2)) story.append(Paragraph( "VF demonstrates the cricopharyngeal bar (posterior indentation at the pharyngo-oesophageal " "junction, level of C5/6) and quantifies the degree of UES opening. This guides decision-making " "for cricopharyngeal myotomy or botulinum toxin injection.", body)) story.append(Paragraph("9.5 Zenker's Diverticulum", h2)) story.append(Paragraph( "Videofluoroscopy shows contrast filling the posterior pharyngeal diverticulum arising through " "Killian's dehiscence. The extent of the pouch, degree of pharyngo-oesophageal obstruction, and " "associated aspiration risk can all be characterised. It guides the approach for surgical " "(open or endoscopic) repair.", body)) # ── VF vs FEES ──────────────────────────────────────────────────────────────── story.append(Paragraph("10. VIDEOFLUOROSCOPY vs. FEES: A COMPARISON", h1)) story.append(Paragraph( "Videofluoroscopy and Fibreoptic Endoscopic Evaluation of Swallowing (FEES) are the two " "gold-standard instrumental assessments for dysphagia, and are complementary. The choice between " "them depends on clinical context, patient factors, and availability.", body)) comp_data = [ [Paragraph("<b>Feature</b>", keypoint_style), Paragraph("<b>Videofluoroscopy (VFSS)</b>", keypoint_style), Paragraph("<b>FEES</b>", keypoint_style)], ["Mechanism", "Fluoroscopic X-ray + barium contrast", "Flexible nasendoscope in pharynx"], ["Setting", "Radiology department", "Bedside or clinic"], ["Radiation", "Yes (minimised)", "None"], ["Oral phase", "Fully visualised", "Not visualised"], ["Pharyngeal phase", "Fully visualised (indirect)", "Directly visualised"], ["Oesophageal phase", "Can be screened", "Not visualised"], ["Silent aspiration", "Detected (gold standard)", "Detected (similar sensitivity)"], ["Compensatory strategies", "Can be tested in real time", "Can be tested in real time"], ["Portability", "Not portable", "Fully portable"], ["Bolus used", "Barium-mixed food/fluid", "Actual food/fluid (coloured)"], ["White-out phenomenon", "Not applicable", "Larynx briefly obscured during pharyngeal phase"], ["Nasopharynx/VPD assessment", "Excellent (en face view)", "Limited"], ["Radiation risk in children", "Requires minimisation", "None — preferred in paediatrics"], ["Cost", "Higher", "Lower"], ] comp_tbl = Table(comp_data, colWidths=[4.5*cm, 6.5*cm, 5.0*cm]) comp_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_BLUE), ("TEXTCOLOR", (0,0), (-1,0), white), ("GRID", (0,0), (-1,-1), 0.5, HexColor("#cccccc")), ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING",(0,0),(-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 6), ("FONTSIZE", (0,0), (-1,-1), 9.5), ("VALIGN", (0,0), (-1,-1), "TOP"), ("ROWBACKGROUNDS", (0,1),(-1,-1), [white, LIGHT_BLUE]), ])) story.append(comp_tbl) story.append(Spacer(1, 0.3*cm)) # ── ADVANTAGES AND LIMITATIONS ──────────────────────────────────────────────── story.append(Paragraph("11. ADVANTAGES AND LIMITATIONS", h1)) adv_lim_data = [ [Paragraph("<b>ADVANTAGES</b>", ParagraphStyle("ah", parent=keypoint_style, textColor=HexColor("#1a6b2a"), fontSize=11)), Paragraph("<b>LIMITATIONS</b>", ParagraphStyle("lh", parent=keypoint_style, textColor=HexColor("#8b1a1a"), fontSize=11))], [ "\n".join([ "✔ Gold standard — dynamic, real-time imaging", "✔ Assesses all 4 phases of swallowing", "✔ Detects silent aspiration", "✔ Quantifies aspiration (PAS scale)", "✔ Tests compensatory strategies in real time", "✔ Recorded — can be reviewed, shared, replayed", "✔ Low radiation exposure", "✔ Distinguishes pre/intra/post-deglutitory aspiration", "✔ Assesses VPD (speech VF — en face view)", "✔ Supplements clinical examination in reflex mandibular closure", "✔ Guides surgical decisions (cricopharyngeal myotomy, pharyngoplasty)", ]), "\n".join([ "✘ Not portable — requires radiology department", "✘ Radiation exposure (limits duration of study)", "✘ Cannot be done at bedside", "✘ Requires patient to be mobile/co-operative", "✘ Barium: not actual food; texture/taste difference", "✘ Water-soluble contrast if perforation suspected", "✘ No direct view of mucosa or secretions", "✘ Inter-rater variability in interpretation", "✘ May miss small intermittent fistulas or VPD", "✘ Postsurgical anatomy can be difficult to interpret", "✘ Not suitable for patients who cannot sit upright", ]) ], ] adv_lim_tbl = Table(adv_lim_data, colWidths=[doc.width/2, doc.width/2]) adv_lim_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (0,0), HexColor("#d8f0dc")), ("BACKGROUND", (1,0), (1,0), HexColor("#f9ddd8")), ("BACKGROUND", (0,1), (0,1), HexColor("#eef7f0")), ("BACKGROUND", (1,1), (1,1), HexColor("#fdf3f2")), ("FONTSIZE", (0,0), (-1,-1), 9.5), ("FONTNAME", (0,1), (1,1), "Helvetica"), ("TOPPADDING", (0,0), (-1,-1), 7), ("BOTTOMPADDING",(0,0),(-1,-1), 7), ("LEFTPADDING", (0,0), (-1,-1), 8), ("LINEAFTER", (0,0), (0,-1), 1, HexColor("#cccccc")), ("VALIGN", (0,0), (-1,-1), "TOP"), ("BOX", (0,0), (-1,-1), 1, HexColor("#cccccc")), ])) story.append(adv_lim_tbl) story.append(Spacer(1, 0.3*cm)) # ── CLINICAL ALGORITHM ──────────────────────────────────────────────────────── story.append(Paragraph("12. WHEN TO USE VIDEOFLUOROSCOPY — CLINICAL APPROACH", h1)) story.append(Paragraph( "The decision to use VFSS versus FEES or clinical swallow assessment is guided by the following:", body)) algo_items = [ ("Clinical swallow assessment (bedside)", "All patients with dysphagia — initial evaluation by SLT. If aspiration concern exists, proceed to instrumental assessment."), ("VFSS is preferred when:", "(a) Oral phase dysfunction suspected; (b) Full evaluation of all 4 phases needed; (c) VPD/speech assessment required; (d) Oesophageal component needs screening; (e) Specific swallowing manoeuvres to be tested; (f) Silent aspiration strongly suspected; (g) Cricopharyngeal/Zenker assessment needed."), ("FEES is preferred when:", "(a) Patient is bedbound/too frail to attend radiology; (b) Paediatric patient (avoids radiation); (c) Direct mucosal/laryngeal assessment needed; (d) Assessment during actual mealtimes required."), ("CT/MRI:", "When a structural cause (malignancy, skull base pathology, central neurological lesion) needs imaging. Ordered alongside, not instead of, VFSS."), ] for step_title, step_detail in algo_items: story.append(Paragraph(f"<b>{step_title}</b>", ParagraphStyle("al", parent=body, spaceBefore=4, spaceAfter=2, textColor=DARK_BLUE))) story.append(Paragraph(step_detail, ParagraphStyle("ald", parent=body, leftIndent=18, spaceAfter=6))) # ── ROLE IN MULTIDISCIPLINARY TEAM ──────────────────────────────────────────── story.append(Paragraph("13. ROLE IN THE MULTIDISCIPLINARY TEAM", h1)) story.append(Paragraph( "Videofluoroscopy is inherently a <b>multidisciplinary procedure</b>. In its broadest clinical " "application, members of the MDT include:", body)) for item in [ "<b>Speech and Language Therapist (SLT)</b> — primary operator; interprets swallowing physiology, tests strategies, formulates rehabilitation plan", "<b>Radiologist</b> — operates fluoroscopy equipment, interprets radiological anatomy", "<b>ENT Surgeon</b> — clinical context, surgical planning, interpretation of post-surgical anatomy", "<b>Neurologist</b> — in cases of neurological dysphagia", "<b>Gastroenterologist</b> — when oesophageal pathology is identified", "<b>Dietitian</b> — dietary modification and nutritional support based on VF findings", "<b>Respiratory Physician / Pulmonologist</b> — management of aspiration pneumonia", ]: story.append(Paragraph(item, bullet)) # ── SUMMARY / KEY POINTS ────────────────────────────────────────────────────── story.append(Paragraph("14. SUMMARY — KEY POINTS FOR PG EXAM", h1)) kp_data = [ [Paragraph("KEY POINTS", ParagraphStyle("kph", parent=keypoint_style, fontSize=12, textColor=white, backColor=DARK_BLUE, alignment=TA_CENTER))], [Paragraph( "1. VF / VFSS / Modified Barium Swallow = gold standard for oropharyngeal dysphagia assessment.\n\n" "2. Developed in 1965; uses barium sulfate (or water-soluble contrast if perforation suspected).\n\n" "3. Performed jointly by SLT + Radiologist; recorded for repeat review.\n\n" "4. Lateral view is primary; AP and oblique views add complementary information.\n\n" "5. Assesses all 4 phases of swallowing — most powerful for oral and pharyngeal phases.\n\n" "6. Uniquely identifies SILENT ASPIRATION — aspiration without cough (PAS score 8).\n\n" "7. Penetration-Aspiration Scale (PAS, 1–8) is the validated scoring tool used with VF.\n\n" "8. Can test compensatory strategies in real-time (chin tuck, head turn, Mendelsohn, etc.).\n\n" "9. Speech VF (for VPD/cleft palate): en face/Towne view is best; assesses all velopharyngeal " "structures simultaneously; guides sphincter pharyngoplasty vs. posterior pharyngeal flap.\n\n" "10. Limitations: not portable, radiation exposure, requires co-operative patient, " "inter-rater variability.\n\n" "11. FEES is the bedside/portable/paediatric alternative; equivalent sensitivity for aspiration.\n\n" "12. In HNC: VFSS preferred for functional assessment; guides nutritional management and " "rehabilitation post-surgery/CRT.", ParagraphStyle("kpbody", parent=body, fontSize=10, backColor=HexColor("#f0f5fa"), leading=15) )], ] kp_tbl = Table(kp_data, colWidths=[doc.width]) kp_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_BLUE), ("BACKGROUND", (0,1), (-1,1), HexColor("#f0f5fa")), ("TOPPADDING", (0,0), (-1,-1), 8), ("BOTTOMPADDING",(0,0),(-1,-1), 8), ("LEFTPADDING", (0,0), (-1,-1), 12), ("RIGHTPADDING", (0,0), (-1,-1), 12), ("BOX", (0,0), (-1,-1), 1.5, DARK_BLUE), ("LINEBELOW", (0,0), (-1,0), 1.5, DARK_BLUE), ("ROUNDEDCORNERS", [4]), ])) story.append(kp_tbl) story.append(Spacer(1, 0.3*cm)) # ── REFERENCES ──────────────────────────────────────────────────────────────── story.append(Paragraph("REFERENCES", h1)) refs = [ "Scott-Brown's Otorhinolaryngology Head & Neck Surgery, 8th ed. (2018). CRC Press. Videofluoroscopy sections (blocks 8349–8388; 2171–2186).", "Cummings Otolaryngology Head and Neck Surgery, 7th ed. (2020). Elsevier. Videofluoroscopy Swallow Study (pp. 1861–1862); Speech Videofluoroscopy for VPD (pp. 2563–2567); Aspiration (pp. 1668–1675).", "KJ Lee's Essential Otolaryngology, 11th ed. (2019). McGraw-Hill. Dysphagia: Modified barium swallow and videofluoroscopy (pp. 943–944).", "Bailey and Love's Short Practice of Surgery, 28th ed. (2022). CRC Press. Barium swallow and videofluoroscopy (p. 801).", "Rosenbek JC, Robbins JA, et al. (1996). A Penetration-Aspiration Scale. Dysphagia, 11(2), 93–98.", "Logemann JA (1983). Evaluation and Treatment of Swallowing Disorders. College-Hill Press, San Diego.", "Langmore SE, Schatz K, Olsen N (1988). Fiberoptic endoscopic examination of swallowing safety: a new procedure. Dysphagia, 2(4), 216–219.", "Rugiu MG (2007). Role of videofluoroscopy in evaluation of neurologic dysphagia. Acta Otorhinolaryngologica Italica.", ] for i, ref in enumerate(refs, 1): story.append(Paragraph(f"{i}. {ref}", ParagraphStyle("ref", parent=body, fontSize=9.5, leftIndent=15, firstLineIndent=-15, spaceAfter=4, textColor=HexColor("#333333")))) # Footer note story.append(Spacer(1, 0.5*cm)) story.append(HRFlowable(width="100%", thickness=1, color=DARK_BLUE)) story.append(Paragraph( "Prepared for ENT Postgraduate Examinations. Content sourced from authoritative ENT textbooks. " "Generated by Orris Medical AI.", ParagraphStyle("footer", parent=body, fontSize=8.5, textColor=MID_GREY, alignment=TA_CENTER, spaceAfter=0))) # Build doc.build(story) print("PDF generated successfully.") PYEOF python /tmp/workspace/videofluoroscopy-ent/generate_pdf.py
Videofluoroscopy in ENT
PDF Document · PDF