Hi Oris. Tell me something about yourself.
Can you make posters and papers on medical data? Yes.
Create a medical poster on a specific disease or condition
So, I will give you the PPT, uh, on-- for-- of radiology, and I basically want you to make a good poster. It is for AOCR radiology. Okay?
python -m markitdown "/home/daytona/workspace/attachments/27fbe1ec-1487-4f3c-8875-e2a495e9f74d/PULMONARY SEQUESTRATION ISHAAN.pptx"
cd /home/daytona/workspace && python3 -c " from pptx import Presentation import sys pptx_path = '/home/daytona/workspace/attachments/27fbe1ec-1487-4f3c-8875-e2a495e9f74d/PULMONARY SEQUESTRATION ISHAAN.pptx' prs = Presentation(pptx_path) for i, slide in enumerate(prs.slides): print(f'\n===== SLIDE {i+1} =====') for shape in slide.shapes: if hasattr(shape, 'text') and shape.text.strip(): print(f'[{shape.shape_type}] {shape.name}: {shape.text}') "
pip install --user python-pptx markitdown 2>&1 | tail -5
python3 -c " from pptx import Presentation from pptx.util import Pt import json pptx_path = '/home/daytona/workspace/attachments/27fbe1ec-1487-4f3c-8875-e2a495e9f74d/PULMONARY SEQUESTRATION ISHAAN.pptx' prs = Presentation(pptx_path) for i, slide in enumerate(prs.slides): print(f'\n===== SLIDE {i+1} =====') for shape in slide.shapes: if hasattr(shape, 'text') and shape.text.strip(): print(f' [{shape.name}]: {shape.text}') if shape.has_table: table = shape.table print(f' [TABLE {shape.name}]:') for row in table.rows: cells = [cell.text.strip() for cell in row.cells] print(f' {cells}') "
python3 -c " from pptx import Presentation from pptx.util import Pt import os pptx_path = '/home/daytona/workspace/attachments/27fbe1ec-1487-4f3c-8875-e2a495e9f74d/PULMONARY SEQUESTRATION ISHAAN.pptx' prs = Presentation(pptx_path) # Check all slides for notes and more detail for i, slide in enumerate(prs.slides): print(f'\n===== SLIDE {i+1} =====') # Notes notes_slide = slide.notes_slide if notes_slide: notes_text = notes_slide.notes_text_frame.text.strip() if notes_text: print(f' [NOTES]: {notes_text}') for shape in slide.shapes: print(f' Shape: {shape.name}, type: {shape.shape_type}, has_text: {hasattr(shape, \"text\")}') if hasattr(shape, 'text') and shape.text.strip(): print(f' TEXT: {repr(shape.text)}') # Check for images if shape.shape_type == 13: # MSO_SHAPE_TYPE.PICTURE print(f' IMAGE FOUND') # Count total images img_count = 0 for i, slide in enumerate(prs.slides): for shape in slide.shapes: if shape.shape_type == 13: img_count += 1 print(f'\nTotal images: {img_count}') "
python3 -c " from pptx import Presentation import os pptx_path = '/home/daytona/workspace/attachments/27fbe1ec-1487-4f3c-8875-e2a495e9f74d/PULMONARY SEQUESTRATION ISHAAN.pptx' prs = Presentation(pptx_path) os.makedirs('/home/daytona/workspace/pulm-seq-poster/images', exist_ok=True) img_idx = 0 for i, slide in enumerate(prs.slides): for shape in slide.shapes: if shape.shape_type == 13: # PICTURE image = shape.image ext = image.ext img_path = f'/home/daytona/workspace/pulm-seq-poster/images/slide{i+1}_img{img_idx+1}.{ext}' with open(img_path, 'wb') as f: f.write(image.blob) print(f'Saved: {img_path} (size: {len(image.blob)} bytes)') img_idx += 1 "
python3 -c " from pptx import Presentation pptx_path = '/home/daytona/workspace/attachments/27fbe1ec-1487-4f3c-8875-e2a495e9f74d/PULMONARY SEQUESTRATION ISHAAN.pptx' prs = Presentation(pptx_path) # Get all text from slide 3 and 5 more carefully for i in [2, 4]: # slides 3 and 5 (0-indexed) slide = prs.slides[i] print(f'===== SLIDE {i+1} =====') for shape in slide.shapes: print(f' shape: {shape.name}, type: {shape.shape_type}') if hasattr(shape, 'text_frame'): for para in shape.text_frame.paragraphs: if para.text.strip(): print(f' para: {repr(para.text)}') if shape.shape_type == 13: print(f' [IMAGE - {shape.width} x {shape.height}]') "
ls /home/daytona/workspace/pulm-seq-poster/images/
~/pulm-seq-poster/make_poster.js
const pptxgen = require("pptxgenjs");
const fs = require("fs");
const path = require("path");
// Load images as base64
const img1Path = "/home/daytona/workspace/pulm-seq-poster/images/slide4_img1.jpg";
const img2Path = "/home/daytona/workspace/pulm-seq-poster/images/slide5_img2.png";
const img1B64 = "image/jpeg;base64," + fs.readFileSync(img1Path).toString("base64");
const img2B64 = "image/png;base64," + fs.readFileSync(img2Path).toString("base64");
// โโโ COLOUR PALETTE โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const NAVY = "0D2B5C"; // dominant โ header, section bars
const TEAL = "0B7B8E"; // supporting โ sub-headers, accents
const LIGHT_BLUE = "DFF0F5"; // panel backgrounds
const WHITE = "FFFFFF";
const DARK_GREY = "1E1E1E"; // body text
const MID_GREY = "4A4A4A";
const GOLD = "C6922A"; // accent โ key highlight line
// โโโ POSTER DIMENSIONS (A0 landscape: 46.8" ร 33.1" โ use LAYOUT_WIDE proxy)
// PptxGenJS doesn't have A0, so we set custom 33.1 ร 46.8 (portrait A0)
// We'll use custom layout: 46.8" wide ร 33.1" tall
let pres = new pptxgen();
pres.defineLayout({ name: "A0_LANDSCAPE", width: 46.8, height: 33.1 });
pres.layout = "A0_LANDSCAPE";
pres.title = "AOCR Radiology Poster โ Pulmonary Sequestration";
let slide = pres.addSlide();
// โโโ BACKGROUND โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 46.8, h: 33.1,
fill: { color: "F4F7FA" }, line: { color: "F4F7FA" }
});
// โโโ HEADER BAR โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 46.8, h: 4.5,
fill: { color: NAVY }, line: { color: NAVY }
});
// Gold accent line under header
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 4.5, w: 46.8, h: 0.18,
fill: { color: GOLD }, line: { color: GOLD }
});
// Title
slide.addText("A Congenital Impostor: Bronchopulmonary Sequestration\nMasquerading as Chronic Infection", {
x: 1.2, y: 0.3, w: 38, h: 2.6,
fontSize: 52, fontFace: "Calibri", bold: true,
color: WHITE, align: "left", valign: "middle",
wrap: true
});
// Authors & Institution
slide.addText(
"Dr. Ishaan Wagh (JR II Radiology) | Co-author: Dr. Priscilla Joshi, Head of Department\nDepartment of Radiodiagnosis, Bharati Vidyapeeth Medical College, Pune",
{
x: 1.2, y: 3.0, w: 38, h: 1.3,
fontSize: 24, fontFace: "Calibri", color: "C8E6F0",
align: "left", valign: "middle", italic: false
}
);
// AOCR logo / label top-right
slide.addShape(pres.ShapeType.rect, {
x: 42.0, y: 0.35, w: 4.4, h: 3.8,
fill: { color: TEAL }, line: { color: TEAL }, rounding: "0.1"
});
slide.addText("AOCR\n2025", {
x: 42.0, y: 0.35, w: 4.4, h: 3.8,
fontSize: 44, fontFace: "Calibri", bold: true,
color: WHITE, align: "center", valign: "middle"
});
// โโโ COLUMN LAYOUT โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// 3 columns: Left (0โ15), Centre (15.9โ30.8), Right (31.7โ46.8) + gutters
const COL1_X = 0.7;
const COL2_X = 16.2;
const COL3_X = 31.7;
const COL_W = 14.8;
const Y_START = 5.1;
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// Helper: draw a section header bar
function sectionBar(slide, x, y, w, label) {
slide.addShape(pres.ShapeType.rect, {
x, y, w, h: 0.75,
fill: { color: TEAL }, line: { color: TEAL }
});
slide.addText(label, {
x: x + 0.15, y, w: w - 0.15, h: 0.75,
fontSize: 28, fontFace: "Calibri", bold: true,
color: WHITE, valign: "middle", charSpacing: 1
});
}
// Helper: draw a content panel
function contentPanel(slide, x, y, w, h) {
slide.addShape(pres.ShapeType.rect, {
x, y, w, h,
fill: { color: WHITE },
line: { color: "D0DCE8", width: 1.2 }
});
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// LEFT COLUMN
// โโ INTRODUCTION โโ
sectionBar(slide, COL1_X, Y_START, COL_W, "INTRODUCTION");
contentPanel(slide, COL1_X, Y_START + 0.78, COL_W, 7.4);
slide.addText([
{ text: "Bronchopulmonary Sequestration (BPS)", options: { bold: true, color: NAVY, breakLine: true } },
{ text: "is a rare congenital pulmonary malformation characterised by a non-functioning mass of lung tissue that:", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "โข No communication with the tracheobronchial tree", options: { bullet: false, breakLine: true } },
{ text: "โข Receives anomalous systemic arterial supply (most commonly from the thoracic aorta)", options: { bullet: false, breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "Prevalence: ", options: { bold: true, color: TEAL } },
{ text: "0.15โ6.4% of all congenital lung malformations", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "Intralobar sequestration (ILS)", options: { bold: true, color: TEAL } },
{ text: " โ the more common subtype โ typically presents in ", options: {} },
{ text: "late childhood or adolescence", options: { bold: true } },
{ text: " with recurrent lower respiratory tract infections.", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "Clinical challenge: ", options: { bold: true, color: GOLD } },
{ text: "In TB-endemic regions (e.g. India), BPS is frequently misdiagnosed as chronic infection or pulmonary tuberculosis, leading to prolonged inappropriate therapy.", options: {} }
], {
x: COL1_X + 0.25, y: Y_START + 0.85, w: COL_W - 0.45, h: 7.2,
fontSize: 22, fontFace: "Calibri", color: DARK_GREY,
valign: "top", wrap: true
});
// โโ AIMS & OBJECTIVES โโ
const AO_Y = Y_START + 8.4;
sectionBar(slide, COL1_X, AO_Y, COL_W, "AIMS & OBJECTIVES");
contentPanel(slide, COL1_X, AO_Y + 0.78, COL_W, 4.5);
slide.addText([
{ text: "1. ", options: { bold: true, color: TEAL } },
{ text: "To highlight the imaging features of BPS on chest X-ray and CT angiography", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "2. ", options: { bold: true, color: TEAL } },
{ text: "To illustrate the diagnostic pitfall of BPS mimicking chronic pulmonary infection", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "3. ", options: { bold: true, color: TEAL } },
{ text: "To emphasise the role of CECT angiography as investigation of choice for definitive diagnosis", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "4. ", options: { bold: true, color: TEAL } },
{ text: "To prevent unnecessary anti-tubercular therapy in misdiagnosed patients", options: {} }
], {
x: COL1_X + 0.25, y: AO_Y + 0.9, w: COL_W - 0.45, h: 4.2,
fontSize: 22, fontFace: "Calibri", color: DARK_GREY,
valign: "top", wrap: true
});
// โโ MATERIALS & METHODS โโ
const MM_Y = AO_Y + 5.5;
sectionBar(slide, COL1_X, MM_Y, COL_W, "MATERIALS & METHODS");
contentPanel(slide, COL1_X, MM_Y + 0.78, COL_W, 4.8);
slide.addText([
{ text: "Study Design: ", options: { bold: true, color: TEAL } },
{ text: "Case Report", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "Patient: ", options: { bold: true, color: TEAL } },
{ text: "Adolescent presenting with recurrent lower respiratory tract infections, initially treated for pulmonary tuberculosis", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "Imaging Modalities Used:", options: { bold: true, color: TEAL, breakLine: true } },
{ text: " โข Chest X-ray (CXR) โ PA view", options: { breakLine: true } },
{ text: " โข Contrast-Enhanced CT (CECT) with CT Angiography", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "Institution: ", options: { bold: true, color: TEAL } },
{ text: "Department of Radiodiagnosis, Bharati Vidyapeeth Medical College, Pune", options: {} }
], {
x: COL1_X + 0.25, y: MM_Y + 0.9, w: COL_W - 0.45, h: 4.5,
fontSize: 22, fontFace: "Calibri", color: DARK_GREY,
valign: "top", wrap: true
});
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// CENTRE COLUMN โ CASE PRESENTATION + IMAGING
sectionBar(slide, COL2_X, Y_START, COL_W, "CASE PRESENTATION");
contentPanel(slide, COL2_X, Y_START + 0.78, COL_W, 4.8);
slide.addText([
{ text: "A patient presented with ", options: {} },
{ text: "recurrent lower respiratory tract infections", options: { bold: true } },
{ text: ". Prior workup in a TB-endemic setting led to initiation of ", options: {} },
{ text: "anti-tubercular therapy (ATT)", options: { bold: true } },
{ text: " without improvement.", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "Chest X-ray (CXR) demonstrated a ", options: {} },
{ text: "retrocardiac lung opacity with sharp margins", options: { bold: true, color: GOLD } },
{ text: " โ an incidental finding raising suspicion for a structural aetiology.", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "CECT angiography was performed to characterise the lesion, confirm vascular supply, and exclude malignancy or chronic infection.", options: {} }
], {
x: COL2_X + 0.25, y: Y_START + 0.85, w: COL_W - 0.45, h: 4.6,
fontSize: 22, fontFace: "Calibri", color: DARK_GREY, valign: "top", wrap: true
});
// CXR IMAGE + label
const CXR_Y = Y_START + 5.85;
sectionBar(slide, COL2_X, CXR_Y, COL_W, "CHEST X-RAY FINDING");
// Image panel
slide.addShape(pres.ShapeType.rect, {
x: COL2_X, y: CXR_Y + 0.78, w: COL_W, h: 7.8,
fill: { color: "111111" }, line: { color: "333333" }
});
slide.addImage({
data: img1B64,
x: COL2_X + 0.5, y: CXR_Y + 1.0, w: COL_W - 1.0, h: 6.8
});
// Annotation arrow label
slide.addShape(pres.ShapeType.rect, {
x: COL2_X + 0.3, y: CXR_Y + 7.4, w: 8.5, h: 0.9,
fill: { color: GOLD }, line: { color: GOLD }
});
slide.addText("โถ Retrocardiac opacity with sharp margins", {
x: COL2_X + 0.3, y: CXR_Y + 7.4, w: 8.5, h: 0.9,
fontSize: 19, fontFace: "Calibri", bold: true,
color: "1A1A1A", valign: "middle"
});
// CT IMAGE + label
const CT_Y = CXR_Y + 8.85;
sectionBar(slide, COL2_X, CT_Y, COL_W, "CT ANGIOGRAPHY");
slide.addShape(pres.ShapeType.rect, {
x: COL2_X, y: CT_Y + 0.78, w: COL_W, h: 8.5,
fill: { color: "111111" }, line: { color: "333333" }
});
slide.addImage({
data: img2B64,
x: COL2_X + 0.2, y: CT_Y + 0.9, w: COL_W - 0.4, h: 7.9
});
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// RIGHT COLUMN
// โโ OBSERVATIONS / RESULTS โโ
sectionBar(slide, COL3_X, Y_START, COL_W, "IMAGING OBSERVATIONS");
contentPanel(slide, COL3_X, Y_START + 0.78, COL_W, 8.2);
slide.addText([
{ text: "Chest X-Ray (CXR):", options: { bold: true, color: NAVY, breakLine: true } },
{ text: " โข Retrocardiac homogeneous opacity", options: { breakLine: true } },
{ text: " โข Well-defined, sharp margins", options: { breakLine: true } },
{ text: " โข Left lower lobe location", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "CECT Angiography:", options: { bold: true, color: NAVY, breakLine: true } },
{ text: " โข Non-aerated, non-communicating lung parenchyma", options: { breakLine: true } },
{ text: " โข ", options: {} },
{ text: "Aberrant systemic arterial feeder", options: { bold: true, color: GOLD } },
{ text: " arising from the ", options: {} },
{ text: "descending thoracic aorta", options: { bold: true } },
{ text: "", options: { breakLine: true } },
{ text: " โข Venous drainage via ", options: {} },
{ text: "pulmonary vein", options: { bold: true } },
{ text: " (intralobar pattern)", options: { breakLine: true } },
{ text: " โข Parenchymal consolidation within sequestered segment", options: { breakLine: true } },
{ text: " โข No communication with the tracheobronchial tree confirmed", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "Diagnosis Confirmed: ", options: { bold: true, color: TEAL } },
{ text: "Intralobar Bronchopulmonary Sequestration (ILS)", options: { bold: true } }
], {
x: COL3_X + 0.25, y: Y_START + 0.9, w: COL_W - 0.45, h: 7.9,
fontSize: 22, fontFace: "Calibri", color: DARK_GREY, valign: "top", wrap: true
});
// โโ REVIEW OF LITERATURE โโ
const ROL_Y = Y_START + 9.2;
sectionBar(slide, COL3_X, ROL_Y, COL_W, "REVIEW OF LITERATURE");
contentPanel(slide, COL3_X, ROL_Y + 0.78, COL_W, 8.8);
slide.addText([
{ text: "Classification:", options: { bold: true, color: TEAL, breakLine: true } },
{ text: " โข ILS: 75โ85% of cases โ within visceral pleura, venous drainage via pulmonary vein", options: { breakLine: true } },
{ text: " โข ELS: 15โ25% โ outside pleura, drains via systemic vein; often associated with other anomalies", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "Pathophysiology:", options: { bold: true, color: TEAL, breakLine: true } },
{ text: "Impaired drainage & stasis โ repeated infections โ consolidation, cystic change, or bronchiectasis, mimicking TB / chronic infection", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "Defining Imaging Feature:", options: { bold: true, color: TEAL, breakLine: true } },
{ text: "Aberrant systemic arterial feeder (most commonly from descending thoracic aorta)", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "Investigation of Choice:", options: { bold: true, color: GOLD, breakLine: true } },
{ text: "CECT Angiography โ delineates:", options: { breakLine: true } },
{ text: " โข Arterial supply | โข Venous drainage | โข Parenchymal changes | โข Relationship to lung", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "Management:", options: { bold: true, color: TEAL, breakLine: true } },
{ text: "Surgical resection (lobectomy) is curative. Early radiological diagnosis prevents prolonged ATT and avoids complications of recurrent infection.", options: {} }
], {
x: COL3_X + 0.25, y: ROL_Y + 0.9, w: COL_W - 0.45, h: 8.5,
fontSize: 21, fontFace: "Calibri", color: DARK_GREY, valign: "top", wrap: true
});
// โโ CONCLUSION โโ
const CONC_Y = ROL_Y + 9.8;
sectionBar(slide, COL3_X, CONC_Y, COL_W, "CONCLUSION");
slide.addShape(pres.ShapeType.rect, {
x: COL3_X, y: CONC_Y + 0.78, w: COL_W, h: 4.4,
fill: { color: NAVY }, line: { color: NAVY }
});
slide.addText([
{ text: "BPS is a rare but treatable condition whose radiological features ", options: {} },
{ text: "closely mimic chronic infection", options: { bold: true, color: "FFC966" } },
{ text: " in TB-endemic regions.", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "CECT angiography", options: { bold: true, color: "FFC966" } },
{ text: " is the cornerstone of diagnosis, confirming anomalous systemic arterial supply and guiding surgical planning.", options: { breakLine: true } },
{ text: " ", options: { breakLine: true, fontSize: 8 } },
{ text: "Radiologists must maintain a high index of suspicion", options: { bold: true, color: "A8D8EA" } },
{ text: " for BPS in patients with recurrent lower lobe consolidation unresponsive to standard therapy.", options: {} }
], {
x: COL3_X + 0.25, y: CONC_Y + 0.9, w: COL_W - 0.45, h: 4.1,
fontSize: 22, fontFace: "Calibri", color: WHITE, valign: "top", wrap: true
});
// โโ REFERENCES โโ
const REF_Y = CONC_Y + 5.4;
sectionBar(slide, COL3_X, REF_Y, COL_W, "REFERENCES");
contentPanel(slide, COL3_X, REF_Y + 0.78, COL_W, 2.4);
slide.addText([
{ text: "1. Corbett HJ & Humphrey GM. Pulmonary sequestration. Paediatr Respir Rev. 2004;5(1):59โ68.", options: { breakLine: true } },
{ text: "2. Pryce DM. Lower accessory pulmonary artery with intralobar sequestration of lung. J Pathol. 1946;58:457โ467.", options: { breakLine: true } },
{ text: "3. Savic B, et al. Lung sequestration: report of seven cases and review of 540 published cases. Thorax. 1979;34(1):96โ101.", options: {} }
], {
x: COL3_X + 0.2, y: REF_Y + 0.88, w: COL_W - 0.35, h: 2.2,
fontSize: 17, fontFace: "Calibri", color: MID_GREY, valign: "top", wrap: true, italic: true
});
// โโโ FOOTER โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 32.4, w: 46.8, h: 0.7,
fill: { color: NAVY }, line: { color: NAVY }
});
slide.addText("Department of Radiodiagnosis | Bharati Vidyapeeth Medical College, Pune | AOCR 2025 | Dr. Ishaan Wagh", {
x: 0.5, y: 32.4, w: 46.8, h: 0.7,
fontSize: 18, fontFace: "Calibri", color: "A8C8E0",
align: "center", valign: "middle"
});
// โโโ SAVE โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const outPath = "/home/daytona/workspace/pulm-seq-poster/AOCR_Pulmonary_Sequestration_Poster.pptx";
pres.writeFile({ fileName: outPath }).then(() => {
console.log("Poster saved to: " + outPath);
}).catch(err => {
console.error("Error:", err);
});
cd /home/daytona/workspace/pulm-seq-poster && npm install pptxgenjs 2>&1 | tail -3 && node make_poster.js
ls /home/daytona/workspace/pulm-seq-poster/node_modules/pptxgenjs 2>/dev/null && echo "EXISTS" || echo "NOT FOUND"
cd /home/daytona/workspace/pulm-seq-poster && timeout 90 node make_poster.js 2>&1
AOCR Pulmonary Sequestration Poster
Presentation ยท PPTX
| Left | Centre | Right |
|---|---|---|
| Introduction | Case Presentation | Imaging Observations |
| Aims & Objectives | CXR with labelled finding | Review of Literature |
| Materials & Methods | CT Angiography image | Conclusion + References |
Add radiological diagrams or annotated imaging overlays
Medical radiology annotated diagram of Intralobar Bronchopulmonary Sequestration (BPS). Dark clinical background. Shows a schematic cross-section of the left lower lobe of the lung with a clearly labelled sequestered lung segment (non-aerated, consolidated mass). Annotated arrows pointing to: "Aberrant systemic artery from descending thoracic aorta", "Pulmonary vein drainage (intralobar)", "No tracheobronchial communication", "Consolidated sequestered parenchyma". Medical illustration style, clean white annotation lines and text on dark background, professional radiology poster quality.
pip install --user Pillow 2>&1 | tail -2
Medical radiology educational comparison diagram showing two side-by-side chest CT axial slice schematics. Left panel labelled "Pulmonary TB / Chronic Infection" showing diffuse patchy consolidation with air bronchograms, no vascular anomaly. Right panel labelled "Bronchopulmonary Sequestration (BPS)" showing a homogeneous retrocardiac mass with a thick red arrow indicating "Aberrant aortic feeder artery" and blue arrow for "Pulmonary vein drainage". Clean dark radiology background, white annotation text, yellow highlighting on key feature. Professional medical poster style.
python3 << 'EOF' from PIL import Image, ImageDraw, ImageFont import os # โโ Load images โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ cxr_path = "/home/daytona/workspace/pulm-seq-poster/images/slide4_img1.jpg" ct_path = "/home/daytona/workspace/pulm-seq-poster/images/slide5_img2.png" cxr = Image.open(cxr_path).convert("RGB") ct = Image.open(ct_path).convert("RGB") print(f"CXR size: {cxr.size}") print(f"CT size: {ct.size}") EOF
python3 << 'EOF' from PIL import Image, ImageDraw, ImageFont import os out_dir = "/home/daytona/workspace/pulm-seq-poster/images" # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ # 1. ANNOTATED CXR # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ cxr = Image.open(f"{out_dir}/slide4_img1.jpg").convert("RGB") # Upscale for annotation clarity (3x) scale = 4 cxr_big = cxr.resize((cxr.width * scale, cxr.height * scale), Image.LANCZOS) w, h = cxr_big.size draw = ImageDraw.Draw(cxr_big) # Try to load a font, fall back to default try: font_lg = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 28) font_sm = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 22) except: font_lg = ImageFont.load_default() font_sm = font_lg # โโ Annotation 1: Retrocardiac opacity box + label โโโโโโโโโโโโโโโโโโโโโโโโโโโ # CXR is 240x289 original โ scaled 960x1156 # The retrocardiac opacity is roughly at lower-left area: ~x:60-130, y:160-240 original # Scaled: x:240-520, y:640-960 rect_x1, rect_y1, rect_x2, rect_y2 = 220, 580, 560, 980 draw.rectangle([rect_x1, rect_y1, rect_x2, rect_y2], outline=(255, 200, 0), width=5) # Arrow from label to box lbl_x, lbl_y = 570, 620 draw.line([(lbl_x, lbl_y + 20), (rect_x2 + 2, (rect_y1 + rect_y2)//2)], fill=(255, 200, 0), width=3) # Label background draw.rectangle([lbl_x - 4, lbl_y - 4, lbl_x + 310, lbl_y + 70], fill=(0, 0, 0, 200)) draw.text((lbl_x, lbl_y), "Retrocardiac opacity", font=font_lg, fill=(255, 200, 0)) draw.text((lbl_x, lbl_y + 32), "Sharp margins โ ILS", font=font_sm, fill=(200, 230, 255)) # โโ Annotation 2: Left lower lobe pointer โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ll_x, ll_y = 80, 1050 draw.ellipse([ll_x - 18, ll_y - 18, ll_x + 18, ll_y + 18], outline=(100, 220, 255), width=4) draw.line([(ll_x + 18, ll_y), (230, 1020)], fill=(100, 220, 255), width=3) draw.rectangle([234, 995, 234 + 270, 995 + 32], fill=(0, 0, 0)) draw.text((238, 998), "Left Lower Lobe (LLL)", font=font_sm, fill=(100, 220, 255)) # โโ Title bar at bottom โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ draw.rectangle([0, h - 68, w, h], fill=(13, 43, 92)) draw.text((12, h - 54), "Fig 1 โ CXR PA View: Retrocardiac homogeneous opacity (yellow box)", font=font_sm, fill=(255, 255, 255)) cxr_big.save(f"{out_dir}/annotated_cxr.png", dpi=(300, 300)) print(f"CXR annotated saved: {cxr_big.size}") # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ # 2. ANNOTATED CT # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ct = Image.open(f"{out_dir}/slide5_img2.png").convert("RGB") w2, h2 = ct.size print(f"CT original size: {w2}x{h2}") draw2 = ImageDraw.Draw(ct) try: font_lg2 = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 32) font_sm2 = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 26) font_xs2 = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 20) except: font_lg2 = ImageFont.load_default() font_sm2 = font_lg2 font_xs2 = font_lg2 # CT is 1107x625 โ it appears to be a multi-panel CT image # Left panel: likely axial CT showing the sequestered mass (left lower ~x:0-550) # Right panel or coronal view (x:550-1107) # โโ Annotation A: Sequestered segment box (left panel, lower area) โโโโโโโโโโโโ draw2.rectangle([30, 320, 320, 590], outline=(255, 200, 0), width=5) # Arrow line to label draw2.line([(325, 450), (460, 380)], fill=(255, 200, 0), width=3) # Arrow head draw2.polygon([(460, 380), (445, 370), (448, 388)], fill=(255, 200, 0)) # Label draw2.rectangle([464, 355, 464 + 310, 355 + 62], fill=(0, 0, 0)) draw2.text((468, 357), "Sequestered Segment", font=font_lg2, fill=(255, 200, 0)) draw2.text((468, 392), "Non-aerated parenchyma", font=font_xs2, fill=(200, 230, 255)) # โโ Annotation B: Aberrant aortic feeder (red arrow) โโโโโโโโโโโโโโโโโโโโโโโโโ # Near the aorta (midline, posterior) โ approximately x:230-280, y:460-510 draw2.ellipse([220, 455, 290, 510], outline=(255, 60, 60), width=5) draw2.line([(295, 480), (430, 520)], fill=(255, 60, 60), width=4) draw2.polygon([(430, 520), (415, 508), (418, 527)], fill=(255, 60, 60)) draw2.rectangle([434, 502, 434 + 350, 502 + 62], fill=(0, 0, 0)) draw2.text((438, 504), "Aberrant Aortic Feeder", font=font_lg2, fill=(255, 80, 80)) draw2.text((438, 538), "Systemic arterial supply", font=font_xs2, fill=(255, 180, 180)) # โโ Annotation C: Right panel โ pulmonary vein drainage โโโโโโโโโโโโโโโโโโโโโโโ # Right panel ~x:560-1107 draw2.ellipse([700, 200, 790, 280], outline=(100, 200, 255), width=5) draw2.line([(790, 240), (900, 210)], fill=(100, 200, 255), width=4) draw2.polygon([(900, 210), (882, 200), (886, 218)], fill=(100, 200, 255)) draw2.rectangle([904, 192, 904 + 190, 192 + 56], fill=(0, 0, 0)) draw2.text((908, 195), "Pulmonary vein", font=font_sm2, fill=(100, 200, 255)) draw2.text((908, 224), "drainage (ILS)", font=font_xs2, fill=(180, 220, 255)) # โโ Figure label bar โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ draw2.rectangle([0, h2 - 70, w2, h2], fill=(13, 43, 92)) draw2.text((14, h2 - 56), "Fig 2 โ CECT Angiography: Aberrant aortic feeder (red), sequestered segment (yellow), pulmonary vein drainage (blue)", font=font_xs2, fill=(255, 255, 255)) ct.save(f"{out_dir}/annotated_ct.png", dpi=(300, 300)) print(f"CT annotated saved: {ct.size}") EOF
cd /home/daytona/workspace/pulm-seq-poster/images && \ wget -q "https://cdn.orris.care/image-gen/039d5cad01a048ae84840e4f1dde5fb5.png" -O bps_anatomy_diagram.png && \ wget -q "https://cdn.orris.care/image-gen/17463873945843dc98d1ee4abfe7dd19.png" -O bps_differential_diagram.png && \ echo "Done" && ls -lh *.png *.jpg
~/pulm-seq-poster/make_poster_v2.js
const pptxgen = require("pptxgenjs");
const fs = require("fs");
// โโ Load all images as base64 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const IMG_DIR = "/home/daytona/workspace/pulm-seq-poster/images/";
function b64(filename, mime) {
return `${mime};base64,` + fs.readFileSync(IMG_DIR + filename).toString("base64");
}
const imgCXR = b64("annotated_cxr.png", "image/png");
const imgCT = b64("annotated_ct.png", "image/png");
const imgDiagram = b64("bps_anatomy_diagram.png", "image/png");
const imgDiff = b64("bps_differential_diagram.png","image/png");
// โโ Colours โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const NAVY = "0D2B5C";
const TEAL = "0B7B8E";
const WHITE = "FFFFFF";
const DARK_GREY = "1E1E1E";
const MID_GREY = "4A4A4A";
const GOLD = "C6922A";
const LIGHT_PANEL = "EEF4F8";
const BLACK_BG = "101010";
// โโ Poster setup โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
let pres = new pptxgen();
pres.defineLayout({ name: "A0_LAND", width: 46.8, height: 33.1 });
pres.layout = "A0_LAND";
pres.title = "AOCR 2025 โ Pulmonary Sequestration Poster";
let slide = pres.addSlide();
// โโ Full background โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
slide.addShape(pres.ShapeType.rect, {
x:0, y:0, w:46.8, h:33.1, fill:{color:"EDF2F7"}, line:{color:"EDF2F7"}
});
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// HEADER
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
slide.addShape(pres.ShapeType.rect, {
x:0, y:0, w:46.8, h:4.6, fill:{color:NAVY}, line:{color:NAVY}
});
// Gold accent strip
slide.addShape(pres.ShapeType.rect, {
x:0, y:4.6, w:46.8, h:0.2, fill:{color:GOLD}, line:{color:GOLD}
});
// Title
slide.addText(
"A Congenital Impostor: Bronchopulmonary Sequestration\nMasquerading as Chronic Infection",
{ x:1.2, y:0.25, w:37.5, h:2.7,
fontSize:50, fontFace:"Calibri", bold:true, color:WHITE,
align:"left", valign:"middle", wrap:true }
);
// Authors
slide.addText(
"Dr. Ishaan Wagh (JR II Radiology) | Co-author: Dr. Priscilla Joshi, Head of Department\nDepartment of Radiodiagnosis, Bharati Vidyapeeth Medical College, Pune",
{ x:1.2, y:3.05, w:37.5, h:1.35,
fontSize:23, fontFace:"Calibri", color:"C8E6F0",
align:"left", valign:"middle" }
);
// AOCR badge
slide.addShape(pres.ShapeType.rect, {
x:42.1, y:0.3, w:4.4, h:4.0, fill:{color:TEAL}, line:{color:TEAL}
});
slide.addText("AOCR\n2025", {
x:42.1, y:0.3, w:4.4, h:4.0,
fontSize:44, fontFace:"Calibri", bold:true, color:WHITE,
align:"center", valign:"middle"
});
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// COLUMN POSITIONS
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const C1 = 0.6, C2 = 16.1, C3 = 31.6;
const CW = 14.8;
const Y0 = 5.1;
// โโ Helpers โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
function secBar(x, y, w, label, color) {
color = color || TEAL;
slide.addShape(pres.ShapeType.rect,
{ x, y, w, h:0.72, fill:{color}, line:{color} });
slide.addText(label, {
x:x+0.18, y, w:w-0.18, h:0.72,
fontSize:26, fontFace:"Calibri", bold:true, color:WHITE,
valign:"middle", charSpacing:0.8
});
}
function panel(x, y, w, h, bg) {
bg = bg || WHITE;
slide.addShape(pres.ShapeType.rect,
{ x, y, w, h, fill:{color:bg}, line:{color:"C8D6E5", width:1.0} });
}
function imgBox(x, y, w, h) {
slide.addShape(pres.ShapeType.rect,
{ x, y, w, h, fill:{color:BLACK_BG}, line:{color:"2A2A2A", width:1.0} });
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// LEFT COLUMN
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// โโ INTRODUCTION โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
secBar(C1, Y0, CW, "INTRODUCTION");
panel(C1, Y0+0.74, CW, 7.0);
slide.addText([
{text:"Bronchopulmonary Sequestration (BPS)", options:{bold:true, color:NAVY, breakLine:true}},
{text:"A rare congenital malformation of the lung characterised by:", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:6}},
{text:"โข Non-functioning pulmonary parenchyma", options:{breakLine:true}},
{text:"โข No communication with the tracheobronchial tree", options:{breakLine:true}},
{text:"โข Anomalous systemic arterial supply (most commonly the descending thoracic aorta)", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:6}},
{text:"Prevalence: ", options:{bold:true, color:TEAL}},
{text:"0.15โ6.4% of congenital lung malformations", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:6}},
{text:"Intralobar Sequestration (ILS): ", options:{bold:true, color:TEAL}},
{text:"75โ85% of all BPS cases. Lies within the visceral pleura. Typically presents in late childhood or adolescence with recurrent lower respiratory tract infections.", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:6}},
{text:"Clinical challenge: ", options:{bold:true, color:GOLD}},
{text:"In TB-endemic regions like India, the imaging appearance closely mimics chronic pulmonary infection, leading to repeated misdiagnosis and unnecessary ATT.", options:{}}
], {
x:C1+0.22, y:Y0+0.82, w:CW-0.4, h:6.8,
fontSize:21, fontFace:"Calibri", color:DARK_GREY, valign:"top", wrap:true
});
// โโ AIMS & OBJECTIVES โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const AO_Y = Y0 + 7.96;
secBar(C1, AO_Y, CW, "AIMS & OBJECTIVES");
panel(C1, AO_Y+0.74, CW, 4.3);
slide.addText([
{text:"1. ", options:{bold:true, color:TEAL}},
{text:"Describe the multimodality imaging features of BPS", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:6}},
{text:"2. ", options:{bold:true, color:TEAL}},
{text:"Illustrate the pitfall of BPS mimicking chronic pulmonary infection / TB", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:6}},
{text:"3. ", options:{bold:true, color:TEAL}},
{text:"Emphasise CECT angiography as the investigation of choice", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:6}},
{text:"4. ", options:{bold:true, color:TEAL}},
{text:"Promote early radiological diagnosis to prevent unnecessary anti-tubercular therapy", options:{}}
], {
x:C1+0.22, y:AO_Y+0.82, w:CW-0.4, h:4.1,
fontSize:21, fontFace:"Calibri", color:DARK_GREY, valign:"top", wrap:true
});
// โโ MATERIALS & METHODS โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const MM_Y = AO_Y + 5.26;
secBar(C1, MM_Y, CW, "MATERIALS & METHODS");
panel(C1, MM_Y+0.74, CW, 4.5);
slide.addText([
{text:"Study type: ", options:{bold:true, color:TEAL}},
{text:"Case Report", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:6}},
{text:"Patient: ", options:{bold:true, color:TEAL}},
{text:"Adolescent with recurrent LRTI, treated empirically for pulmonary TB without improvement", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:6}},
{text:"Imaging used:", options:{bold:true, color:TEAL, breakLine:true}},
{text:" โข Chest X-ray (PA view)", options:{breakLine:true}},
{text:" โข Contrast-Enhanced CT Angiography (CECT)", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:6}},
{text:"Setting: ", options:{bold:true, color:TEAL}},
{text:"Bharati Vidyapeeth Medical College, Pune (TB-endemic region)", options:{}}
], {
x:C1+0.22, y:MM_Y+0.82, w:CW-0.4, h:4.3,
fontSize:21, fontFace:"Calibri", color:DARK_GREY, valign:"top", wrap:true
});
// โโ REFERENCES โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const REF_Y = MM_Y + 5.46;
secBar(C1, REF_Y, CW, "REFERENCES");
panel(C1, REF_Y+0.74, CW, 3.0);
slide.addText([
{text:"1. Corbett HJ & Humphrey GM. Pulmonary sequestration. Paediatr Respir Rev. 2004;5(1):59โ68.", options:{breakLine:true}},
{text:"2. Pryce DM. Lower accessory pulmonary artery with intralobar sequestration of lung. J Pathol. 1946;58:457โ467.", options:{breakLine:true}},
{text:"3. Savic B, et al. Lung sequestration: report of 7 cases and review of 540 cases. Thorax. 1979;34:96โ101.", options:{breakLine:true}},
{text:"4. Guru Murthy GS, et al. Pulmonary sequestration: a diagnostic dilemma. Indian J Radiol Imaging. 2010.", options:{}}
], {
x:C1+0.2, y:REF_Y+0.82, w:CW-0.36, h:2.8,
fontSize:17, fontFace:"Calibri", color:MID_GREY,
valign:"top", wrap:true, italic:true
});
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// CENTRE COLUMN
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// โโ CASE PRESENTATION โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
secBar(C2, Y0, CW, "CASE PRESENTATION");
panel(C2, Y0+0.74, CW, 4.2);
slide.addText([
{text:"A patient presented with ", options:{}},
{text:"recurrent lower respiratory tract infections", options:{bold:true}},
{text:". In the context of a TB-endemic region, ", options:{}},
{text:"anti-tubercular therapy (ATT)", options:{bold:true}},
{text:" was initiated โ with no clinical improvement.", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:7}},
{text:"Chest X-ray showed a ", options:{}},
{text:"retrocardiac homogeneous opacity with sharp margins", options:{bold:true, color:GOLD}},
{text:" in the left lower zone โ raising suspicion for a structural or congenital aetiology.", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:7}},
{text:"CECT angiography ", options:{bold:true, color:TEAL}},
{text:"was performed and demonstrated the ", options:{}},
{text:"aberrant systemic arterial feeder", options:{bold:true}},
{text:", confirming the diagnosis of Intralobar BPS.", options:{}}
], {
x:C2+0.22, y:Y0+0.82, w:CW-0.4, h:4.0,
fontSize:21, fontFace:"Calibri", color:DARK_GREY, valign:"top", wrap:true
});
// โโ CXR IMAGE (annotated) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const CXR_Y = Y0 + 5.16;
secBar(C2, CXR_Y, CW, "FIG 1 โ CHEST X-RAY (ANNOTATED)");
imgBox(C2, CXR_Y+0.74, CW, 8.5);
slide.addImage({ data:imgCXR, x:C2+0.5, y:CXR_Y+0.9, w:CW-1.0, h:8.1 });
// โโ CT IMAGE (annotated) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const CT_Y = CXR_Y + 9.46;
secBar(C2, CT_Y, CW, "FIG 2 โ CECT ANGIOGRAPHY (ANNOTATED)");
imgBox(C2, CT_Y+0.74, CW, 9.0);
slide.addImage({ data:imgCT, x:C2+0.2, y:CT_Y+0.85, w:CW-0.4, h:8.5 });
// โโ Colour key legend โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const LEG_Y = CT_Y + 9.96;
panel(C2, LEG_Y, CW, 1.6, "F0F4F8");
slide.addText("Annotation Key:", {
x:C2+0.2, y:LEG_Y+0.08, w:CW-0.4, h:0.45,
fontSize:20, fontFace:"Calibri", bold:true, color:NAVY
});
// Yellow box
slide.addShape(pres.ShapeType.rect,
{x:C2+0.2, y:LEG_Y+0.6, w:0.4, h:0.3, fill:{color:"FFC800"}, line:{color:"FFC800"}});
slide.addText("Sequestered segment", {x:C2+0.7, y:LEG_Y+0.57, w:3.8, h:0.35, fontSize:17, fontFace:"Calibri", color:DARK_GREY});
// Red
slide.addShape(pres.ShapeType.rect,
{x:C2+5.0, y:LEG_Y+0.6, w:0.4, h:0.3, fill:{color:"FF3C3C"}, line:{color:"FF3C3C"}});
slide.addText("Aberrant aortic feeder", {x:C2+5.5, y:LEG_Y+0.57, w:4.0, h:0.35, fontSize:17, fontFace:"Calibri", color:DARK_GREY});
// Blue
slide.addShape(pres.ShapeType.rect,
{x:C2+10.0, y:LEG_Y+0.6, w:0.4, h:0.3, fill:{color:"64C8FF"}, line:{color:"64C8FF"}});
slide.addText("Pulmonary vein drainage", {x:C2+10.5, y:LEG_Y+0.57, w:4.0, h:0.35, fontSize:17, fontFace:"Calibri", color:DARK_GREY});
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// RIGHT COLUMN
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// โโ IMAGING OBSERVATIONS โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
secBar(C3, Y0, CW, "IMAGING OBSERVATIONS");
panel(C3, Y0+0.74, CW, 7.6);
slide.addText([
{text:"Chest X-Ray (CXR โ PA view):", options:{bold:true, color:NAVY, breakLine:true}},
{text:" โข Retrocardiac homogeneous opacity", options:{breakLine:true}},
{text:" โข Well-defined, sharp margins", options:{breakLine:true}},
{text:" โข Left lower lobe location", options:{breakLine:true}},
{text:" โข No associated mediastinal shift or volume loss", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:7}},
{text:"CECT Angiography:", options:{bold:true, color:NAVY, breakLine:true}},
{text:" โข Non-aerated, consolidated sequestered lung parenchyma", options:{breakLine:true}},
{text:" โข ", options:{}},
{text:"Aberrant systemic artery", options:{bold:true, color:"CC3333"}},
{text:" arising directly from the ", options:{}},
{text:"descending thoracic aorta", options:{bold:true}},
{text:"", options:{breakLine:true}},
{text:" โข ", options:{}},
{text:"Venous drainage via left pulmonary vein", options:{bold:true, color:"1E7DC8"}},
{text:" โ confirming ILS pattern", options:{breakLine:true}},
{text:" โข No communication with tracheobronchial tree", options:{breakLine:true}},
{text:" โข Left lower lobe consolidation within sequestered segment", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:7}},
{text:"Final Diagnosis: ", options:{bold:true, color:TEAL}},
{text:"Intralobar Bronchopulmonary Sequestration (ILS)", options:{bold:true}}
], {
x:C3+0.22, y:Y0+0.82, w:CW-0.4, h:7.4,
fontSize:21, fontFace:"Calibri", color:DARK_GREY, valign:"top", wrap:true
});
// โโ BPS ANATOMY DIAGRAM โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const DIAG1_Y = Y0 + 8.56;
secBar(C3, DIAG1_Y, CW, "FIG 3 โ BPS ANATOMY SCHEMATIC");
imgBox(C3, DIAG1_Y+0.74, CW, 8.2);
slide.addImage({ data:imgDiagram, x:C3+0.2, y:DIAG1_Y+0.85, w:CW-0.4, h:7.8 });
// โโ DIFFERENTIAL DIAGRAM โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const DIAG2_Y = DIAG1_Y + 9.16;
secBar(C3, DIAG2_Y, CW, "FIG 4 โ BPS vs. CHRONIC INFECTION");
imgBox(C3, DIAG2_Y+0.74, CW, 7.0);
slide.addImage({ data:imgDiff, x:C3+0.2, y:DIAG2_Y+0.85, w:CW-0.4, h:6.6 });
// โโ CONCLUSION (right col, bottom) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const CONC_Y = DIAG2_Y + 7.96;
secBar(C3, CONC_Y, CW, "CONCLUSION", NAVY);
slide.addShape(pres.ShapeType.rect,
{x:C3, y:CONC_Y+0.74, w:CW, h:4.4, fill:{color:NAVY}, line:{color:NAVY}});
slide.addText([
{text:"BPS is a rare but curable condition that ", options:{}},
{text:"closely mimics chronic infection", options:{bold:true, color:"FFC966"}},
{text:" in TB-endemic settings, making radiological vigilance essential.", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:8}},
{text:"CECT angiography ", options:{bold:true, color:"FFC966"}},
{text:"is the investigation of choice โ it uniquely identifies the aberrant aortic feeder and confirms the diagnosis.", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:8}},
{text:"Early diagnosis ", options:{bold:true, color:"A8D8EA"}},
{text:"prevents prolonged inappropriate ATT and enables curative surgical resection (lobectomy).", options:{}}
], {
x:C3+0.22, y:CONC_Y+0.86, w:CW-0.4, h:4.1,
fontSize:21, fontFace:"Calibri", color:WHITE, valign:"top", wrap:true
});
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// FOOTER
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
slide.addShape(pres.ShapeType.rect,
{x:0, y:32.4, w:46.8, h:0.7, fill:{color:NAVY}, line:{color:NAVY}});
slide.addText(
"Department of Radiodiagnosis | Bharati Vidyapeeth Medical College, Pune | AOCR 2025 | Dr. Ishaan Wagh",
{x:0.5, y:32.4, w:46.8, h:0.7,
fontSize:18, fontFace:"Calibri", color:"A8C8E0", align:"center", valign:"middle"}
);
// โโ Save โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const out = "/home/daytona/workspace/pulm-seq-poster/AOCR_Pulmonary_Sequestration_Poster_v2.pptx";
pres.writeFile({ fileName: out }).then(() => {
console.log("Saved: " + out);
}).catch(err => console.error(err));
cd /home/daytona/workspace/pulm-seq-poster && timeout 120 node make_poster_v2.js 2>&1
ls -lh /home/daytona/workspace/pulm-seq-poster/*.pptx
AOCR Pulmonary Sequestration Poster v2
Presentation ยท PPTX
| Figure | What it shows |
|---|---|
| Fig 1 - CXR (annotated) | Your original chest X-ray with a yellow bounding box highlighting the retrocardiac opacity, a cyan circle pointing to the left lower lobe, and a figure caption bar |
| Fig 2 - CECT (annotated) | Your original CT with 3 colour-coded annotations: yellow box (sequestered segment), red circle + arrow (aberrant aortic feeder), blue circle (pulmonary vein drainage) |
| Fig 3 - BPS Anatomy Schematic | AI-generated diagram showing the sequestered lung segment with labelled arrows for aortic supply, pulmonary vein drainage, and absent tracheobronchial connection |
| Fig 4 - BPS vs. Chronic Infection | Side-by-side comparison diagram: TB/chronic infection vs. BPS, highlighting the defining vascular feature |
Requirements: ยท Format: PDF (All other formats such as JPEG and PPT are not allowed) ยท Orientation: Portrait, 9:16 ratio ยท Maximum Length: 1 page Name file in the following format " Paper Number_Your Name". E.g. (123_Jane Doe) Display Format: Rotating digital display on electronic terminal Location of Display: Exhibition Area Poster presentation template can be found these are the rewuirements
257
python3 -c "import weasyprint; print('weasyprint OK')" 2>&1; python3 -c "import reportlab; print('reportlab OK')" 2>&1; which wkhtmltopdf 2>&1; python3 -c "from xhtml2pdf import pisa; print('xhtml2pdf OK')" 2>&1
~/pulm-seq-poster/make_pdf_poster.py
"""
AOCR 2025 โ Pulmonary Sequestration Poster
Format: PDF, Portrait 9:16, single page
File: 257_Ishaan Wagh.pdf
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm, inch
from reportlab.lib import colors
from reportlab.pdfgen import canvas
from reportlab.lib.utils import ImageReader
from reportlab.platypus import Paragraph, Frame
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from PIL import Image as PILImage
import io, os, textwrap
# โโโ Page dimensions: 9:16 portrait โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# Use 1080 ร 1920 pt equivalent โ width=1080pt, height=1920pt (15" ร 26.67")
# Or more printable: A-series 9:16 โ 210mm ร 373.3mm
W_MM = 210
H_MM = 373.3
W = W_MM * mm
H = H_MM * mm
OUTPUT = "/home/daytona/workspace/pulm-seq-poster/257_Ishaan Wagh.pdf"
IMG_DIR = "/home/daytona/workspace/pulm-seq-poster/images/"
# โโโ Colours (R,G,B 0-1) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
NAVY = colors.HexColor("#0D2B5C")
TEAL = colors.HexColor("#0B7B8E")
GOLD = colors.HexColor("#C6922A")
WHITE = colors.white
LIGHT_BG = colors.HexColor("#EDF2F7")
PANEL_BG = colors.HexColor("#FFFFFF")
DARK_TEXT = colors.HexColor("#1E1E1E")
MID_TEXT = colors.HexColor("#4A4A4A")
LIGHT_BLUE = colors.HexColor("#C8E6F0")
BORDER_COL = colors.HexColor("#C8D6E5")
RED_ANN = colors.HexColor("#CC3333")
BLUE_ANN = colors.HexColor("#1E7DC8")
BLACK_IMG = colors.HexColor("#101010")
# โโโ Canvas โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
c = canvas.Canvas(OUTPUT, pagesize=(W, H))
c.setTitle("Bronchopulmonary Sequestration โ AOCR 2025")
c.setAuthor("Dr. Ishaan Wagh")
# โโโ Helpers โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
def rect(x, y, w, h, fill=None, stroke=None, lw=0.5):
c.saveState()
if fill:
c.setFillColor(fill)
if stroke:
c.setStrokeColor(stroke)
c.setLineWidth(lw)
if fill and stroke:
c.rect(x, y, w, h, fill=1, stroke=1)
elif fill:
c.rect(x, y, w, h, fill=1, stroke=0)
elif stroke:
c.rect(x, y, w, h, fill=0, stroke=1)
c.restoreState()
def section_bar(x, y, w, h, label, font_size=7.5, bg=None):
bg = bg or TEAL
rect(x, y, w, h, fill=bg)
c.saveState()
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", font_size)
c.drawString(x + 2*mm, y + h*0.28, label)
c.restoreState()
def wrapped_text(x, y, w, h, text, font="Helvetica", size=6.5, color=DARK_TEXT,
leading=None, align=TA_LEFT):
"""Draw wrapped paragraph inside a box (top-left origin in PDF = bottom-left)."""
if leading is None:
leading = size * 1.35
style = ParagraphStyle(
"body",
fontName=font,
fontSize=size,
textColor=color,
leading=leading,
alignment=align,
spaceAfter=0,
spaceBefore=0,
)
p = Paragraph(text, style)
pw, ph = p.wrap(w, h)
# PDF y=0 is bottom; Paragraph draws from top-left, so flip:
p.drawOn(c, x, y + h - ph)
def embed_image(path, x, y, w, h, bg=BLACK_IMG):
"""Draw black background then image, preserving aspect ratio with letterbox."""
rect(x, y, w, h, fill=bg)
try:
img = PILImage.open(path)
iw, ih = img.size
aspect = iw / ih
box_aspect = w / h
if aspect > box_aspect:
dw = w
dh = w / aspect
dx = x
dy = y + (h - dh) / 2
else:
dh = h
dw = h * aspect
dx = x + (w - dw) / 2
dy = y
c.drawImage(ImageReader(path), dx, dy, dw, dh, mask="auto")
except Exception as e:
c.saveState()
c.setFillColor(colors.red)
c.setFont("Helvetica", 5)
c.drawString(x + 2*mm, y + h/2, f"[Image error: {e}]")
c.restoreState()
# โโโ Layout constants โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
PAD = 3.5 * mm # outer margin
GAP = 2.5 * mm # column gap
INNER = 2.0 * mm # inner text padding
SB_H = 6.5 * mm # section bar height
# Two columns
COL_W = (W - 2*PAD - GAP) / 2
C1_X = PAD
C2_X = PAD + COL_W + GAP
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# BACKGROUND
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
rect(0, 0, W, H, fill=LIGHT_BG)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# HEADER (top of page = H, working down in ReportLab coords)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
HDR_H = 28 * mm
HDR_Y = H - HDR_H
rect(0, HDR_Y, W, HDR_H, fill=NAVY)
# Gold accent bottom of header
rect(0, HDR_Y - 1.2*mm, W, 1.2*mm, fill=GOLD)
# AOCR badge (right side)
BADGE_W = 18*mm
BADGE_H = HDR_H - 4*mm
BADGE_X = W - PAD - BADGE_W
BADGE_Y = HDR_Y + 2*mm
rect(BADGE_X, BADGE_Y, BADGE_W, BADGE_H, fill=TEAL)
c.saveState()
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", 9)
c.drawCentredString(BADGE_X + BADGE_W/2, BADGE_Y + BADGE_H*0.62, "AOCR")
c.setFont("Helvetica-Bold", 8)
c.drawCentredString(BADGE_X + BADGE_W/2, BADGE_Y + BADGE_H*0.28, "2025")
c.restoreState()
# Title text
TITLE_X = PAD + INNER
TITLE_W = BADGE_X - TITLE_X - 2*mm
wrapped_text(
TITLE_X, HDR_Y + 11*mm, TITLE_W, 14*mm,
"<b>A Congenital Impostor: Bronchopulmonary Sequestration<br/>Masquerading as Chronic Infection</b>",
font="Helvetica-Bold", size=9.5, color=WHITE, leading=12.5, align=TA_LEFT
)
wrapped_text(
TITLE_X, HDR_Y + 2.5*mm, TITLE_W, 9*mm,
"Dr. Ishaan Wagh (JR II Radiology) | Co-author: Dr. Priscilla Joshi, Head of Department<br/>"
"Department of Radiodiagnosis, Bharati Vidyapeeth Medical College, Pune",
font="Helvetica", size=6.8, color=LIGHT_BLUE, leading=9.0, align=TA_LEFT
)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# CURRENT Y cursor (working downward)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
CY = HDR_Y - 1.2*mm - 2.5*mm # just below gold strip + small gap
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# LEFT COLUMN โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
L_Y = CY # left column y cursor (moving DOWN = subtracting)
# โโ INTRODUCTION โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
INTRO_H = 40 * mm
section_bar(C1_X, L_Y - SB_H, COL_W, SB_H, "INTRODUCTION")
rect(C1_X, L_Y - SB_H - INTRO_H, COL_W, INTRO_H, fill=PANEL_BG, stroke=BORDER_COL)
wrapped_text(
C1_X + INNER, L_Y - SB_H - INTRO_H + INNER,
COL_W - 2*INNER, INTRO_H - 2*INNER,
"<b><font color='#0D2B5C'>Bronchopulmonary Sequestration (BPS)</font></b> is a rare congenital malformation characterised by:<br/><br/>"
"โข Non-functioning pulmonary parenchyma<br/>"
"โข No communication with the tracheobronchial tree<br/>"
"โข Anomalous <b>systemic arterial supply</b> (most commonly descending thoracic aorta)<br/><br/>"
"<b>Prevalence:</b> 0.15โ6.4% of congenital lung malformations<br/><br/>"
"<b><font color='#0B7B8E'>Intralobar Sequestration (ILS):</font></b> 75โ85% of BPS cases. Presents in late childhood with recurrent LRTI.<br/><br/>"
"<b><font color='#C6922A'>Clinical challenge:</font></b> In TB-endemic regions, BPS closely mimics chronic pulmonary infection, leading to prolonged inappropriate ATT.",
size=6.4, leading=9.0
)
L_Y -= (SB_H + INTRO_H + GAP)
# โโ AIMS & OBJECTIVES โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
AIMS_H = 28 * mm
section_bar(C1_X, L_Y - SB_H, COL_W, SB_H, "AIMS & OBJECTIVES")
rect(C1_X, L_Y - SB_H - AIMS_H, COL_W, AIMS_H, fill=PANEL_BG, stroke=BORDER_COL)
wrapped_text(
C1_X + INNER, L_Y - SB_H - AIMS_H + INNER,
COL_W - 2*INNER, AIMS_H - 2*INNER,
"<b><font color='#0B7B8E'>1.</font></b> Describe multimodality imaging features of BPS<br/>"
"<b><font color='#0B7B8E'>2.</font></b> Illustrate the pitfall of BPS mimicking chronic infection/TB<br/>"
"<b><font color='#0B7B8E'>3.</font></b> Emphasise CECT angiography as investigation of choice<br/>"
"<b><font color='#0B7B8E'>4.</font></b> Promote early diagnosis to prevent unnecessary ATT",
size=6.4, leading=9.2
)
L_Y -= (SB_H + AIMS_H + GAP)
# โโ MATERIALS & METHODS โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
MM_H = 28 * mm
section_bar(C1_X, L_Y - SB_H, COL_W, SB_H, "MATERIALS & METHODS")
rect(C1_X, L_Y - SB_H - MM_H, COL_W, MM_H, fill=PANEL_BG, stroke=BORDER_COL)
wrapped_text(
C1_X + INNER, L_Y - SB_H - MM_H + INNER,
COL_W - 2*INNER, MM_H - 2*INNER,
"<b><font color='#0B7B8E'>Study type:</font></b> Case Report<br/><br/>"
"<b><font color='#0B7B8E'>Patient:</font></b> Adolescent with recurrent LRTI, empirically treated for pulmonary TB without improvement<br/><br/>"
"<b><font color='#0B7B8E'>Imaging:</font></b> Chest X-ray (PA view); Contrast-Enhanced CT Angiography (CECT)<br/><br/>"
"<b><font color='#0B7B8E'>Setting:</font></b> Dept. of Radiodiagnosis, BVMC Pune",
size=6.4, leading=9.2
)
L_Y -= (SB_H + MM_H + GAP)
# โโ CASE PRESENTATION โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
CASE_H = 28 * mm
section_bar(C1_X, L_Y - SB_H, COL_W, SB_H, "CASE PRESENTATION")
rect(C1_X, L_Y - SB_H - CASE_H, COL_W, CASE_H, fill=PANEL_BG, stroke=BORDER_COL)
wrapped_text(
C1_X + INNER, L_Y - SB_H - CASE_H + INNER,
COL_W - 2*INNER, CASE_H - 2*INNER,
"Patient presented with <b>recurrent lower respiratory tract infections</b>. "
"Prior workup led to <b>initiation of ATT</b> in a TB-endemic setting โ with no improvement.<br/><br/>"
"CXR showed a <b><font color='#C6922A'>retrocardiac opacity with sharp margins</font></b> in the LLL. "
"CECT angiography was performed and revealed an <b>aberrant aortic feeder</b>, confirming <b>ILS</b>.",
size=6.4, leading=9.2
)
L_Y -= (SB_H + CASE_H + GAP)
# โโ FIG 1 โ ANNOTATED CXR โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
CXR_IMG_H = 52 * mm
section_bar(C1_X, L_Y - SB_H, COL_W, SB_H, "FIG 1 โ CHEST X-RAY (ANNOTATED)")
embed_image(
IMG_DIR + "annotated_cxr.png",
C1_X, L_Y - SB_H - CXR_IMG_H, COL_W, CXR_IMG_H
)
L_Y -= (SB_H + CXR_IMG_H + GAP)
# โโ REVIEW OF LITERATURE โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ROL_H = 42 * mm
section_bar(C1_X, L_Y - SB_H, COL_W, SB_H, "REVIEW OF LITERATURE")
rect(C1_X, L_Y - SB_H - ROL_H, COL_W, ROL_H, fill=PANEL_BG, stroke=BORDER_COL)
wrapped_text(
C1_X + INNER, L_Y - SB_H - ROL_H + INNER,
COL_W - 2*INNER, ROL_H - 2*INNER,
"<b><font color='#0B7B8E'>Classification:</font></b> ILS (75โ85%, within visceral pleura, pulmonary vein drainage) vs. ELS (15โ25%, outside pleura, systemic vein drainage, associated anomalies)<br/><br/>"
"<b><font color='#0B7B8E'>Pathophysiology:</font></b> Impaired drainage โ stasis โ repeated infections โ consolidation/cystic change/bronchiectasis, mimicking TB<br/><br/>"
"<b><font color='#0B7B8E'>Defining feature:</font></b> Aberrant systemic arterial feeder (descending thoracic aorta)<br/><br/>"
"<b><font color='#C6922A'>Investigation of choice:</font></b> CECT angiography โ delineates arterial supply, venous drainage, parenchymal changes<br/><br/>"
"<b><font color='#0B7B8E'>Management:</font></b> Surgical resection (lobectomy) โ curative. Early diagnosis prevents prolonged ATT.",
size=6.4, leading=9.0
)
L_Y -= (SB_H + ROL_H + GAP)
# โโ REFERENCES โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
REF_H = 22 * mm
section_bar(C1_X, L_Y - SB_H, COL_W, SB_H, "REFERENCES")
rect(C1_X, L_Y - SB_H - REF_H, COL_W, REF_H, fill=PANEL_BG, stroke=BORDER_COL)
wrapped_text(
C1_X + INNER, L_Y - SB_H - REF_H + INNER,
COL_W - 2*INNER, REF_H - 2*INNER,
"<i>1. Corbett HJ & Humphrey GM. Pulmonary sequestration. Paediatr Respir Rev. 2004;5(1):59โ68.<br/>"
"2. Pryce DM. Lower accessory pulmonary artery with ILS of lung. J Pathol. 1946;58:457โ467.<br/>"
"3. Savic B et al. Lung sequestration: review of 540 cases. Thorax. 1979;34:96โ101.<br/>"
"4. Guru Murthy GS et al. Pulmonary sequestration: a diagnostic dilemma. IJRI. 2010.</i>",
size=5.8, color=MID_TEXT, leading=8.5
)
L_Y -= (SB_H + REF_H)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# RIGHT COLUMN โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
R_Y = CY
# โโ IMAGING OBSERVATIONS โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
OBS_H = 44 * mm
section_bar(C2_X, R_Y - SB_H, COL_W, SB_H, "IMAGING OBSERVATIONS")
rect(C2_X, R_Y - SB_H - OBS_H, COL_W, OBS_H, fill=PANEL_BG, stroke=BORDER_COL)
wrapped_text(
C2_X + INNER, R_Y - SB_H - OBS_H + INNER,
COL_W - 2*INNER, OBS_H - 2*INNER,
"<b><font color='#0D2B5C'>Chest X-Ray (CXR โ PA view):</font></b><br/>"
"โข Retrocardiac homogeneous opacity, well-defined sharp margins<br/>"
"โข Left lower lobe location; no mediastinal shift or volume loss<br/><br/>"
"<b><font color='#0D2B5C'>CECT Angiography:</font></b><br/>"
"โข Non-aerated, consolidated sequestered lung parenchyma<br/>"
"โข <b><font color='#CC3333'>Aberrant systemic artery</font></b> arising from the <b>descending thoracic aorta</b><br/>"
"โข <b><font color='#1E7DC8'>Venous drainage via left pulmonary vein</font></b> โ confirming ILS pattern<br/>"
"โข No communication with the tracheobronchial tree<br/>"
"โข Left lower lobe consolidation within sequestered segment<br/><br/>"
"<b><font color='#0B7B8E'>Final Diagnosis:</font></b> <b>Intralobar Bronchopulmonary Sequestration (ILS)</b>",
size=6.4, leading=9.0
)
R_Y -= (SB_H + OBS_H + GAP)
# โโ FIG 2 โ ANNOTATED CT โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
CT_IMG_H = 42 * mm
section_bar(C2_X, R_Y - SB_H, COL_W, SB_H, "FIG 2 โ CECT ANGIOGRAPHY (ANNOTATED)")
embed_image(
IMG_DIR + "annotated_ct.png",
C2_X, R_Y - SB_H - CT_IMG_H, COL_W, CT_IMG_H
)
# Colour key beneath CT
KEY_H = 7 * mm
KEY_Y = R_Y - SB_H - CT_IMG_H - KEY_H
rect(C2_X, KEY_Y, COL_W, KEY_H, fill=colors.HexColor("#F0F4F8"), stroke=BORDER_COL)
KX = C2_X + 2*mm
KY = KEY_Y + 1.8*mm
BOX = 3*mm
c.saveState()
# Yellow
c.setFillColor(colors.HexColor("#FFC800")); c.rect(KX, KY, BOX, BOX, fill=1, stroke=0)
c.setFillColor(DARK_TEXT); c.setFont("Helvetica", 5.5); c.drawString(KX + BOX + 1.2*mm, KY+0.5*mm, "Sequestered segment")
# Red
RX2 = KX + 33*mm
c.setFillColor(colors.HexColor("#FF3C3C")); c.rect(RX2, KY, BOX, BOX, fill=1, stroke=0)
c.setFillColor(DARK_TEXT); c.drawString(RX2 + BOX + 1.2*mm, KY+0.5*mm, "Aortic feeder")
# Blue
BX2 = RX2 + 26*mm
c.setFillColor(colors.HexColor("#1E7DC8")); c.rect(BX2, KY, BOX, BOX, fill=1, stroke=0)
c.setFillColor(DARK_TEXT); c.drawString(BX2 + BOX + 1.2*mm, KY+0.5*mm, "Pulmonary vein")
c.restoreState()
R_Y -= (SB_H + CT_IMG_H + KEY_H + GAP)
# โโ FIG 3 โ BPS ANATOMY DIAGRAM โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
DIAG1_H = 52 * mm
section_bar(C2_X, R_Y - SB_H, COL_W, SB_H, "FIG 3 โ BPS ANATOMY SCHEMATIC")
embed_image(
IMG_DIR + "bps_anatomy_diagram.png",
C2_X, R_Y - SB_H - DIAG1_H, COL_W, DIAG1_H
)
R_Y -= (SB_H + DIAG1_H + GAP)
# โโ FIG 4 โ BPS vs CHRONIC INFECTION โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
DIAG2_H = 52 * mm
section_bar(C2_X, R_Y - SB_H, COL_W, SB_H, "FIG 4 โ BPS vs. CHRONIC INFECTION")
embed_image(
IMG_DIR + "bps_differential_diagram.png",
C2_X, R_Y - SB_H - DIAG2_H, COL_W, DIAG2_H
)
R_Y -= (SB_H + DIAG2_H + GAP)
# โโ CONCLUSION โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
CONC_H = 30 * mm
section_bar(C2_X, R_Y - SB_H, COL_W, SB_H, "CONCLUSION", bg=NAVY)
rect(C2_X, R_Y - SB_H - CONC_H, COL_W, CONC_H, fill=NAVY)
wrapped_text(
C2_X + INNER, R_Y - SB_H - CONC_H + INNER,
COL_W - 2*INNER, CONC_H - 2*INNER,
"<b>BPS is a rare but curable condition</b> that <font color='#FFC966'><b>closely mimics chronic infection</b></font> "
"in TB-endemic settings, making radiological vigilance essential.<br/><br/>"
"<font color='#FFC966'><b>CECT angiography</b></font> is the cornerstone of diagnosis, confirming the anomalous "
"aortic feeder and guiding surgical planning.<br/><br/>"
"<font color='#A8D8EA'><b>Early diagnosis</b></font> prevents prolonged ATT and enables "
"curative surgical resection (lobectomy).",
font="Helvetica", size=6.4, color=WHITE, leading=9.2
)
R_Y -= (SB_H + CONC_H)
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# FOOTER
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
FOOTER_H = 7 * mm
rect(0, 0, W, FOOTER_H, fill=NAVY)
c.saveState()
c.setFillColor(colors.HexColor("#A8C8E0"))
c.setFont("Helvetica", 6.0)
c.drawCentredString(
W / 2, FOOTER_H * 0.38,
"Dept. of Radiodiagnosis | Bharati Vidyapeeth Medical College, Pune | AOCR 2025 | Paper No. 257 | Dr. Ishaan Wagh"
)
c.restoreState()
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# SAVE
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
c.showPage()
c.save()
print(f"PDF saved: {OUTPUT}")
# Verify dimensions
from pypdf import PdfReader
r = PdfReader(OUTPUT)
pg = r.pages[0]
print(f"Page size: {float(pg.mediabox.width):.1f} x {float(pg.mediabox.height):.1f} pt")
print(f"Ratio: 1:{float(pg.mediabox.height)/float(pg.mediabox.width):.3f}")
print(f"Pages: {len(r.pages)}")
cd /home/daytona/workspace/pulm-seq-poster && python3 make_pdf_poster.py 2>&1
ls -lh "/home/daytona/workspace/pulm-seq-poster/257_Ishaan Wagh.pdf"
257 Ishaan%20Wagh
PDF Document ยท PDF
| Requirement | Status |
|---|---|
| Format: PDF | โ PDF |
| Orientation: Portrait | โ Portrait |
| Ratio: 9:16 | โ Exactly 1:1.778 (595 ร 1058 pt) |
| Maximum length: 1 page | โ 1 page |
File name: 257_Ishaan Wagh | โ Named correctly |
| Display: digital rotating screen | โ Optimised for screen (vivid colours, large section headers, high contrast) |
its not opening
cd /home/daytona/workspace/pulm-seq-poster && python3 -c " from pypdf import PdfReader r = PdfReader('257_Ishaan Wagh.pdf') print('Pages:', len(r.pages)) print('Encrypted:', r.is_encrypted) pg = r.pages[0] print('MediaBox:', pg.mediabox) print('Size (pt):', float(pg.mediabox.width), 'x', float(pg.mediabox.height)) " 2>&1
cp "/home/daytona/workspace/pulm-seq-poster/257_Ishaan Wagh.pdf" "/home/daytona/workspace/pulm-seq-poster/257_Ishaan_Wagh.pdf" && ls -lh /home/daytona/workspace/pulm-seq-poster/257_Ishaan_Wagh.pdf
257 Ishaan Wagh
PDF Document ยท PDF
make it in an editable form
~/pulm-seq-poster/make_portrait_pptx.js
const pptxgen = require("pptxgenjs");
const fs = require("fs");
// โโ Images โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const DIR = "/home/daytona/workspace/pulm-seq-poster/images/";
const b64 = (f, mime) => `${mime};base64,` + fs.readFileSync(DIR + f).toString("base64");
const imgCXR = b64("annotated_cxr.png", "image/png");
const imgCT = b64("annotated_ct.png", "image/png");
const imgDiagram = b64("bps_anatomy_diagram.png", "image/png");
const imgDiff = b64("bps_differential_diagram.png", "image/png");
// โโ Colours โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const NAVY = "0D2B5C";
const TEAL = "0B7B8E";
const GOLD = "C6922A";
const WHITE = "FFFFFF";
const DGREY = "1E1E1E";
const MGREY = "4A4A4A";
const LBG = "EDF2F7";
const PANEL = "FFFFFF";
const BORDER = "C8D6E5";
const BLKBG = "101010";
const LBLUE = "C8E6F0";
// โโ Portrait 9:16 slide (1080ร1920 pt โ 15"ร26.667") โโโโโโโโโโโโโโโโโโโโโโโโ
let pres = new pptxgen();
// 9:16 portrait: width=10.125", height=18" (standard 9:16)
const W = 10.125, H = 18.0;
pres.defineLayout({ name: "PORTRAIT_9x16", width: W, height: H });
pres.layout = "PORTRAIT_9x16";
pres.title = "257_Ishaan Wagh โ AOCR 2025 Poster";
let slide = pres.addSlide();
// โโ Background โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
slide.addShape(pres.ShapeType.rect, { x:0, y:0, w:W, h:H, fill:{color:LBORDER}, line:{color:LBG} });
// fix typo
slide.addShape(pres.ShapeType.rect, { x:0, y:0, w:W, h:H, fill:{color:"EDF2F7"}, line:{color:"EDF2F7"} });
// โโ HELPERS โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const PAD = 0.18; // outer margin
const GAP = 0.14; // column gap
const SBH = 0.32; // section bar height
const CW = (W - 2*PAD - GAP) / 2;
const C1 = PAD;
const C2 = PAD + CW + GAP;
function sBar(x, y, w, label, bg) {
bg = bg || TEAL;
slide.addShape(pres.ShapeType.rect, { x, y, w, h:SBH, fill:{color:bg}, line:{color:bg} });
slide.addText(label, {
x:x+0.08, y, w:w-0.08, h:SBH,
fontSize:9.5, fontFace:"Calibri", bold:true, color:WHITE,
valign:"middle", charSpacing:0.4
});
}
function panel(x, y, w, h, bg) {
bg = bg || PANEL;
slide.addShape(pres.ShapeType.rect,
{ x, y, w, h, fill:{color:bg}, line:{color:BORDER, width:0.75} });
}
function imgBox(x, y, w, h) {
slide.addShape(pres.ShapeType.rect,
{ x, y, w, h, fill:{color:BLKBG}, line:{color:"2A2A2A", width:0.75} });
}
function bodyText(x, y, w, h, runs, sz) {
sz = sz || 6.0;
slide.addText(runs, {
x, y, w, h,
fontSize:sz, fontFace:"Calibri", color:DGREY,
valign:"top", wrap:true,
paraSpaceAfter:1.5
});
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// HEADER
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const HDR_H = 1.55;
slide.addShape(pres.ShapeType.rect, { x:0, y:0, w:W, h:HDR_H, fill:{color:NAVY}, line:{color:NAVY} });
slide.addShape(pres.ShapeType.rect, { x:0, y:HDR_H, w:W, h:0.06, fill:{color:GOLD}, line:{color:GOLD} });
// AOCR badge
const BW=0.85, BH=1.3, BX=W-PAD-BW, BY=0.12;
slide.addShape(pres.ShapeType.rect, { x:BX, y:BY, w:BW, h:BH, fill:{color:TEAL}, line:{color:TEAL} });
slide.addText("AOCR\n2025", { x:BX, y:BY, w:BW, h:BH,
fontSize:18, fontFace:"Calibri", bold:true, color:WHITE, align:"center", valign:"middle" });
// Title
slide.addText(
"A Congenital Impostor: Bronchopulmonary Sequestration\nMasquerading as Chronic Infection",
{ x:PAD+0.08, y:0.1, w:BX-PAD-0.15, h:0.85,
fontSize:15, fontFace:"Calibri", bold:true, color:WHITE,
align:"left", valign:"middle", wrap:true }
);
// Authors
slide.addText(
"Dr. Ishaan Wagh (JR II Radiology) | Co-author: Dr. Priscilla Joshi, Head of Department\nDept. of Radiodiagnosis, Bharati Vidyapeeth Medical College, Pune",
{ x:PAD+0.08, y:1.02, w:BX-PAD-0.15, h:0.48,
fontSize:7.5, fontFace:"Calibri", color:LBLUE,
align:"left", valign:"middle", wrap:true }
);
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// CONTENT START Y
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const Y0 = HDR_H + 0.06 + 0.12; // just below gold strip + gap
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// LEFT COLUMN
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
let LY = Y0;
// โโ INTRODUCTION โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const INTRO_H = 2.1;
sBar(C1, LY, CW, "INTRODUCTION");
panel(C1, LY+SBH, CW, INTRO_H);
bodyText(C1+0.07, LY+SBH+0.06, CW-0.12, INTRO_H-0.1, [
{text:"Bronchopulmonary Sequestration (BPS)", options:{bold:true, color:NAVY, breakLine:false}},
{text:" is a rare congenital malformation characterised by:", options:{breakLine:true}},
{text:"โข Non-functioning pulmonary parenchyma with no tracheobronchial communication", options:{breakLine:true}},
{text:"โข Anomalous systemic arterial supply โ most commonly from the descending thoracic aorta", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:3}},
{text:"Prevalence: ", options:{bold:true, color:TEAL}},
{text:"0.15โ6.4% of congenital lung malformations", options:{breakLine:true}},
{text:"Intralobar Sequestration (ILS): ", options:{bold:true, color:TEAL}},
{text:"75โ85% of cases; presents in late childhood with recurrent LRTI", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:3}},
{text:"Clinical challenge: ", options:{bold:true, color:GOLD}},
{text:"In TB-endemic regions, BPS closely mimics chronic pulmonary infection, leading to prolonged inappropriate anti-tubercular therapy (ATT).", options:{}},
]);
LY += SBH + INTRO_H + GAP;
// โโ AIMS & OBJECTIVES โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const AIMS_H = 1.4;
sBar(C1, LY, CW, "AIMS & OBJECTIVES");
panel(C1, LY+SBH, CW, AIMS_H);
bodyText(C1+0.07, LY+SBH+0.06, CW-0.12, AIMS_H-0.1, [
{text:"1. ", options:{bold:true, color:TEAL}},
{text:"Describe multimodality imaging features of BPS", options:{breakLine:true}},
{text:"2. ", options:{bold:true, color:TEAL}},
{text:"Illustrate the pitfall of BPS mimicking chronic infection / TB", options:{breakLine:true}},
{text:"3. ", options:{bold:true, color:TEAL}},
{text:"Emphasise CECT angiography as the investigation of choice", options:{breakLine:true}},
{text:"4. ", options:{bold:true, color:TEAL}},
{text:"Promote early diagnosis to prevent unnecessary ATT", options:{}},
]);
LY += SBH + AIMS_H + GAP;
// โโ MATERIALS & METHODS โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const MM_H = 1.55;
sBar(C1, LY, CW, "MATERIALS & METHODS");
panel(C1, LY+SBH, CW, MM_H);
bodyText(C1+0.07, LY+SBH+0.06, CW-0.12, MM_H-0.1, [
{text:"Study type: ", options:{bold:true, color:TEAL}},
{text:"Case Report", options:{breakLine:true}},
{text:"Patient: ", options:{bold:true, color:TEAL}},
{text:"Adolescent with recurrent LRTI, treated empirically for pulmonary TB without improvement", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:3}},
{text:"Imaging used: ", options:{bold:true, color:TEAL}},
{text:"Chest X-ray (PA view) and Contrast-Enhanced CT Angiography (CECT)", options:{breakLine:true}},
{text:"Setting: ", options:{bold:true, color:TEAL}},
{text:"Dept. of Radiodiagnosis, Bharati Vidyapeeth Medical College, Pune", options:{}},
]);
LY += SBH + MM_H + GAP;
// โโ CASE PRESENTATION โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const CASE_H = 1.5;
sBar(C1, LY, CW, "CASE PRESENTATION");
panel(C1, LY+SBH, CW, CASE_H);
bodyText(C1+0.07, LY+SBH+0.06, CW-0.12, CASE_H-0.1, [
{text:"Patient presented with ", options:{}},
{text:"recurrent lower respiratory tract infections", options:{bold:true}},
{text:". In a TB-endemic setting, ATT was initiated โ with no improvement.", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:3}},
{text:"CXR revealed a ", options:{}},
{text:"retrocardiac opacity with sharp margins", options:{bold:true, color:GOLD}},
{text:" in the LLL. CECT angiography confirmed an ", options:{}},
{text:"aberrant aortic feeder", options:{bold:true}},
{text:", establishing the diagnosis of Intralobar BPS.", options:{}},
]);
LY += SBH + CASE_H + GAP;
// โโ FIG 1 โ ANNOTATED CXR โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const CXRH = 2.9;
sBar(C1, LY, CW, "FIG 1 โ CHEST X-RAY (ANNOTATED)");
imgBox(C1, LY+SBH, CW, CXRH);
slide.addImage({ data:imgCXR, x:C1+0.06, y:LY+SBH+0.05, w:CW-0.12, h:CXRH-0.1 });
LY += SBH + CXRH + GAP;
// โโ REVIEW OF LITERATURE โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const ROL_H = 2.2;
sBar(C1, LY, CW, "REVIEW OF LITERATURE");
panel(C1, LY+SBH, CW, ROL_H);
bodyText(C1+0.07, LY+SBH+0.06, CW-0.12, ROL_H-0.1, [
{text:"Classification: ", options:{bold:true, color:TEAL}},
{text:"ILS (75โ85%, within visceral pleura, drains via pulmonary vein) vs. ELS (15โ25%, outside pleura, systemic vein drainage, associated with other anomalies)", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:3}},
{text:"Pathophysiology: ", options:{bold:true, color:TEAL}},
{text:"Impaired drainage โ stasis โ consolidation/cystic change/bronchiectasis โ mimics TB/chronic infection", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:3}},
{text:"Defining imaging feature: ", options:{bold:true, color:TEAL}},
{text:"Aberrant systemic arterial feeder (most commonly descending thoracic aorta)", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:3}},
{text:"Investigation of choice: ", options:{bold:true, color:GOLD}},
{text:"CECT angiography โ delineates arterial supply, venous drainage, parenchymal changes", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:3}},
{text:"Management: ", options:{bold:true, color:TEAL}},
{text:"Surgical resection (lobectomy) is curative. Early diagnosis prevents prolonged ATT.", options:{}},
]);
LY += SBH + ROL_H + GAP;
// โโ REFERENCES โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const REF_H = 1.3;
sBar(C1, LY, CW, "REFERENCES");
panel(C1, LY+SBH, CW, REF_H);
bodyText(C1+0.07, LY+SBH+0.06, CW-0.12, REF_H-0.1, [
{text:"1. Corbett HJ & Humphrey GM. Pulmonary sequestration. Paediatr Respir Rev. 2004;5(1):59โ68.", options:{italic:true, breakLine:true, color:MGREY}},
{text:"2. Pryce DM. Lower accessory pulmonary artery with ILS of lung. J Pathol. 1946;58:457โ467.", options:{italic:true, breakLine:true, color:MGREY}},
{text:"3. Savic B et al. Lung sequestration: review of 540 cases. Thorax. 1979;34:96โ101.", options:{italic:true, breakLine:true, color:MGREY}},
{text:"4. Guru Murthy GS et al. Pulmonary sequestration: a diagnostic dilemma. IJRI. 2010.", options:{italic:true, color:MGREY}},
], 5.5);
LY += SBH + REF_H;
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// RIGHT COLUMN
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
let RY = Y0;
// โโ IMAGING OBSERVATIONS โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const OBS_H = 2.4;
sBar(C2, RY, CW, "IMAGING OBSERVATIONS");
panel(C2, RY+SBH, CW, OBS_H);
bodyText(C2+0.07, RY+SBH+0.06, CW-0.12, OBS_H-0.1, [
{text:"Chest X-Ray:", options:{bold:true, color:NAVY, breakLine:true}},
{text:"โข Retrocardiac homogeneous opacity, sharp margins, LLL location", options:{breakLine:true}},
{text:"โข No mediastinal shift or volume loss", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:3}},
{text:"CECT Angiography:", options:{bold:true, color:NAVY, breakLine:true}},
{text:"โข Non-aerated, consolidated sequestered parenchyma", options:{breakLine:true}},
{text:"โข Aberrant systemic artery ", options:{bold:true, color:"CC3333"}},
{text:"from descending thoracic aorta", options:{breakLine:true}},
{text:"โข Venous drainage via left pulmonary vein ", options:{bold:true, color:"1E7DC8"}},
{text:"โ confirming ILS", options:{breakLine:true}},
{text:"โข No tracheobronchial communication confirmed", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:3}},
{text:"Final Diagnosis: ", options:{bold:true, color:TEAL}},
{text:"Intralobar Bronchopulmonary Sequestration (ILS)", options:{bold:true}},
]);
RY += SBH + OBS_H + GAP;
// โโ FIG 2 โ ANNOTATED CT โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const CTH = 2.4;
sBar(C2, RY, CW, "FIG 2 โ CECT ANGIOGRAPHY (ANNOTATED)");
imgBox(C2, RY+SBH, CW, CTH);
slide.addImage({ data:imgCT, x:C2+0.06, y:RY+SBH+0.05, w:CW-0.12, h:CTH-0.1 });
// Colour key
const KY2 = RY+SBH+CTH+0.03;
const KH2 = 0.3;
slide.addShape(pres.ShapeType.rect,
{x:C2, y:KY2, w:CW, h:KH2, fill:{color:"F0F4F8"}, line:{color:BORDER, width:0.5}});
const ks = 0.14;
// Yellow
slide.addShape(pres.ShapeType.rect, {x:C2+0.07, y:KY2+0.08, w:ks, h:ks, fill:{color:"FFC800"}, line:{color:"FFC800"}});
slide.addText("Sequestered segment", {x:C2+0.24, y:KY2+0.06, w:1.4, h:0.2, fontSize:5.5, fontFace:"Calibri", color:DGREY});
// Red
slide.addShape(pres.ShapeType.rect, {x:C2+1.75, y:KY2+0.08, w:ks, h:ks, fill:{color:"FF3C3C"}, line:{color:"FF3C3C"}});
slide.addText("Aortic feeder", {x:C2+1.92, y:KY2+0.06, w:1.1, h:0.2, fontSize:5.5, fontFace:"Calibri", color:DGREY});
// Blue
slide.addShape(pres.ShapeType.rect, {x:C2+3.15, y:KY2+0.08, w:ks, h:ks, fill:{color:"1E7DC8"}, line:{color:"1E7DC8"}});
slide.addText("Pulmonary vein", {x:C2+3.32, y:KY2+0.06, w:1.3, h:0.2, fontSize:5.5, fontFace:"Calibri", color:DGREY});
RY += SBH + CTH + KH2 + GAP + 0.03;
// โโ FIG 3 โ BPS ANATOMY SCHEMATIC โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const D1H = 2.9;
sBar(C2, RY, CW, "FIG 3 โ BPS ANATOMY SCHEMATIC");
imgBox(C2, RY+SBH, CW, D1H);
slide.addImage({ data:imgDiagram, x:C2+0.06, y:RY+SBH+0.05, w:CW-0.12, h:D1H-0.1 });
RY += SBH + D1H + GAP;
// โโ FIG 4 โ BPS vs CHRONIC INFECTION โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const D2H = 2.9;
sBar(C2, RY, CW, "FIG 4 โ BPS vs. CHRONIC INFECTION");
imgBox(C2, RY+SBH, CW, D2H);
slide.addImage({ data:imgDiff, x:C2+0.06, y:RY+SBH+0.05, w:CW-0.12, h:D2H-0.1 });
RY += SBH + D2H + GAP;
// โโ CONCLUSION โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const CONC_H = 1.7;
sBar(C2, RY, CW, "CONCLUSION", NAVY);
slide.addShape(pres.ShapeType.rect,
{x:C2, y:RY+SBH, w:CW, h:CONC_H, fill:{color:NAVY}, line:{color:NAVY}});
slide.addText([
{text:"BPS is a rare but curable condition that ", options:{}},
{text:"closely mimics chronic infection", options:{bold:true, color:"FFC966"}},
{text:" in TB-endemic settings โ radiological vigilance is essential.", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:3}},
{text:"CECT angiography ", options:{bold:true, color:"FFC966"}},
{text:"is the cornerstone of diagnosis, identifying the aberrant aortic feeder.", options:{breakLine:true}},
{text:" ", options:{breakLine:true, fontSize:3}},
{text:"Early diagnosis ", options:{bold:true, color:"A8D8EA"}},
{text:"prevents prolonged ATT and enables curative surgical resection (lobectomy).", options:{}},
], {
x:C2+0.07, y:RY+SBH+0.07, w:CW-0.12, h:CONC_H-0.1,
fontSize:6.0, fontFace:"Calibri", color:WHITE, valign:"top", wrap:true, paraSpaceAfter:1.5
});
RY += SBH + CONC_H;
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// FOOTER
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const FTR_Y = H - 0.38;
slide.addShape(pres.ShapeType.rect,
{x:0, y:FTR_Y, w:W, h:0.38, fill:{color:NAVY}, line:{color:NAVY}});
slide.addText(
"Dept. of Radiodiagnosis | Bharati Vidyapeeth Medical College, Pune | AOCR 2025 | Paper No. 257 | Dr. Ishaan Wagh",
{x:0.1, y:FTR_Y, w:W-0.2, h:0.38,
fontSize:6.5, fontFace:"Calibri", color:"A8C8E0", align:"center", valign:"middle"}
);
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// SAVE
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const OUT = "/home/daytona/workspace/pulm-seq-poster/257_Ishaan_Wagh_EDITABLE.pptx";
pres.writeFile({ fileName: OUT })
.then(() => console.log("Saved: " + OUT))
.catch(e => console.error(e));
cd /home/daytona/workspace/pulm-seq-poster && timeout 120 node make_portrait_pptx.js 2>&1
~/pulm-seq-poster/make_portrait_pptx.js
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/pulm-seq-poster/make_portrait_pptx.js'
cd /home/daytona/workspace/pulm-seq-poster && timeout 120 node make_portrait_pptx.js 2>&1
ls -lh /home/daytona/workspace/pulm-seq-poster/257_Ishaan_Wagh_EDITABLE.pptx
257 Ishaan Wagh EDITABLE
Presentation ยท PPTX
257_Ishaan Wagh.pdf (rename with space as required)