Make a ppt on chikungunya
chikungunya rash skin clinical presentation

This clinical photograph displays a newborn in a neonatal intensive care setting exhibiting a diffuse petechial rash secondary to congenital chikungunya infection. The skin manifests widespread, small, reddish-purple non-blanching macules and pinpoint lesions across the torso, arms, and legs. The infant is receiving critical care interventions, evidenced by an endotracheal tube secured with white tape for ventilatory support, an umbilical venous or arterial catheter, and ECG monitoring leads on the abdomen. A white knit cap is present on the head, and bandages are visible around both wrists, likely securing intravenous access or monitoring sensors. The image illustrates the dermatological and systemic severity of vertical transmission of CHIKV, highlighting the neonatal presentation of thrombocytopenia and vascular fragility.

This clinical photograph displays a widespread maculopapular rash on a patient's neck and upper trunk. The rash is characterized by diffuse, erythematous lesions consisting of small, flat macules and slightly raised papules. The individual lesions are predominantly red, vary in size from pinpoint to several millimeters, and exhibit both discrete and confluent patterns. The distribution is dense across the anterior neck, supraclavicular regions, and the upper chest. This type of dermatological presentation is commonly associated with acute systemic viral infections, such as Zika virus (ZIKV), Chikungunya virus (CHIKV), or Dengue fever. The visual findings demonstrate an inflammatory response of the skin typical of viral exanthems, serving as a critical diagnostic sign in infectious disease and dermatology contexts.

A close-up clinical photograph of a maculopapular rash on a patient's arm, secondary to Zika virus infection. The image demonstrates a widespread, morbilliform eruption characterized by numerous small, erythematous macules (flat spots) and papules (raised bumps) that are pink to red in color. The lesions are densely distributed across the skin surface, showing occasional coalescence. The background skin appears otherwise normal without significant scaling or ulceration. This visual presentation is characteristic of the exanthematous phase of various arboviral infections, including Zika, dengue, and chikungunya. The image serves as an educational example of acute viral exanthema in infectious disease and dermatology contexts, illustrating the typical morphology used for clinical diagnosis in returning travelers presenting with fever and systemic symptoms.

This composite clinical photograph displays the progression and distribution of skin lesions in a patient with Chikungunya fever. Panels A and B show the facial involvement, characterized by an erythematous maculopapular rash distributed across the forehead, malar region (cheeks), and nose. Panel C illustrates the abdominal wall, exhibiting multiple small, clear vesicles superimposed on a diffuse erythematous maculopapular background. Panels D and E depict the bilateral upper thighs, showing numerous non-hemorrhagic vesicles and small bullae. Panel F reveals a later stage of progression on the right thigh, where the lesions have evolved into discrete, coalescing, and hemorrhagic vesicles with visible crusting. The images demonstrate the polymorphic nature of the cutaneous manifestations of Chikungunya virus infection, ranging from initial maculopapular erythema to vesiculobullous and hemorrhagic stages, which is particularly significant in severe clinical presentations or specific patient populations.
Aedes mosquito vector arbovirus transmission

This pathophysiology diagram illustrates the urban transmission cycle of arboviruses between Aedes mosquitoes and human hosts. The cycle is depicted in four numbered stages. Stage 1: Vector infection occurs when a mosquito feeds on a human during the acute viremic phase, indicated by red cutaneous markers. Stage 2: The extrinsic incubation period involves viral replication in the mosquito's midgut and subsequent dissemination. A central anatomical inset labels the mosquito's proboscis, salivary glands (the viral reservoir), and midgut. Stage 3: Human infection occurs when the infectious mosquito transmits the virus during a subsequent blood meal. Stage 4: The intrinsic incubation period involves viral amplification within the human host leading to symptom onset. Additionally, the diagram illustrates 'Vertical transmission,' where infected female mosquitoes transmit the virus through eggs. The visual highlights the biological barriers within the vector (midgut and salivary glands) and the transition between viremic hosts and infectious vectors, relevant to diseases such as Dengue, Zika, and Chikungunya.

This diagnostic image shows a 3 µm longitudinal-transverse histological section of a Culex pipiens mosquito, a primary vector for Rift Valley fever virus (RVFV). The specimen is stained with haematoxylin and eosin (H&E), illustrating the anatomical organization relevant to arbovirus transmission and pathogenesis. The image is divided into three labeled segments: Head, Thorax, and Abdomen. Key structures identified include: 1) Head: The compound eye and brain (cerebral ganglion), showing dark nuclear staining; 2) Thorax: Dominated by large, eosinophilic bundles of dorsal longitudinal wing muscles and salivary glands, which are critical sites for virus replication and secretion; 3) Abdomen: Visualizes the midgut epithelium—the initial site of viral entry—and the ovaries. The lower portion displays the leg structures. This section serves as an educational reference for identifying mosquito anatomy during vector competence studies to determine tissue-specific viral distribution and dissemination barriers.
chikungunya 2025 2026 outbreak update epidemiology treatment
mkdir -p /tmp/workspace/chikungunya-ppt && ls /tmp/workspace/chikungunya-ppt/
~/chikungunya-ppt/build_ppt.py
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.oxml.ns import qn
from io import BytesIO
import json, subprocess, base64, os
# ── Colour palette ──────────────────────────────────────────────
ORANGE = RGBColor(0xD9, 0x53, 0x1F) # accent / title bg
DARK = RGBColor(0x1A, 0x1A, 0x2E) # dark navy
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
LIGHT_BG = RGBColor(0xFD, 0xF6, 0xF0) # warm off-white slide bg
TEAL = RGBColor(0x0F, 0x7E, 0x8A) # secondary accent
GREY_LINE = RGBColor(0xCC, 0xCC, 0xCC)
ORANGE_LIGHT = RGBColor(0xFA, 0xD0, 0xB4) # light orange for boxes
TEAL_LIGHT = RGBColor(0xB2, 0xE4, 0xE8)
W = Inches(13.333)
H = Inches(7.5)
prs = Presentation()
prs.slide_width = W
prs.slide_height = H
BLANK = prs.slide_layouts[6]
# ── Helper: solid fill for a shape ──────────────────────────────
def fill_solid(shape, color):
shape.fill.solid()
shape.fill.fore_color.rgb = color
def no_fill(shape):
shape.fill.background()
def no_line(shape):
shape.line.fill.background()
# ── Helper: add a text box ───────────────────────────────────────
def add_tb(slide, text, x, y, w, h,
font_name="Calibri", size=18, bold=False, italic=False,
color=DARK, align=PP_ALIGN.LEFT, wrap=True,
valign=MSO_ANCHOR.TOP, bg=None,
margin_l=Inches(0.1), margin_r=Inches(0.1),
margin_t=Inches(0.05), margin_b=Inches(0.05)):
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = wrap
tf.vertical_anchor = valign
tf.margin_left = margin_l
tf.margin_right = margin_r
tf.margin_top = margin_t
tf.margin_bottom = margin_b
p = tf.paragraphs[0]
p.alignment = align
run = p.add_run()
run.text = text
run.font.name = font_name
run.font.size = Pt(size)
run.font.bold = bold
run.font.italic = italic
run.font.color.rgb = color
if bg:
fill_solid(tb, bg)
no_line(tb)
return tb, tf
# ── Helper: add multi-line text with bullet paragraphs ──────────
def add_bullets(slide, lines, x, y, w, h,
font_name="Calibri", size=16, color=DARK,
bold_first=False, valign=MSO_ANCHOR.TOP,
line_spacing=1.2):
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = True
tf.vertical_anchor = valign
tf.margin_left = Inches(0.12)
tf.margin_right = Inches(0.08)
tf.margin_top = Inches(0.05)
tf.margin_bottom= Inches(0.05)
from pptx.util import Pt as pt_
from pptx.oxml import parse_xml
for i, line in enumerate(lines):
if i == 0:
p = tf.paragraphs[0]
else:
p = tf.add_paragraph()
p.alignment = PP_ALIGN.LEFT
# line spacing
p.line_spacing = line_spacing
run = p.add_run()
run.text = line
run.font.name = font_name
run.font.size = Pt(size)
run.font.bold = (bold_first and i == 0)
run.font.color.rgb = color
return tb
# ── Helper: horizontal rule ──────────────────────────────────────
def add_hline(slide, x, y, w, color=ORANGE, thickness=Pt(1.5)):
line = slide.shapes.add_shape(1, x, y, w, Inches(0.01))
fill_solid(line, color)
no_line(line)
return line
# ── Helper: rounded rect box ─────────────────────────────────────
def add_box(slide, x, y, w, h, fill_color, line_color=None, radius=0.08):
from pptx.util import Pt
from pptx.enum.shapes import MSO_SHAPE_TYPE
shape = slide.shapes.add_shape(
5, # MSO_SHAPE.ROUNDED_RECTANGLE = 5
x, y, w, h)
fill_solid(shape, fill_color)
if line_color:
shape.line.color.rgb = line_color
shape.line.width = Pt(1)
else:
no_line(shape)
# set corner radius via XML
shape.adjustments[0] = radius
return shape
# ── Helper: add image from URL ───────────────────────────────────
def add_img_url(slide, url, x, y, w, h=None):
try:
result = json.loads(subprocess.check_output(
["python", "/tmp/skills/shared/scripts/fetch_images.py", url],
timeout=30
))
if result and result[0].get("base64"):
data = result[0]["base64"]
# strip data URI prefix
if "," in data:
data = data.split(",", 1)[1]
raw = base64.b64decode(data)
buf = BytesIO(raw)
if h:
slide.shapes.add_picture(buf, x, y, w, h)
else:
slide.shapes.add_picture(buf, x, y, w)
except Exception as e:
print(f"Image load failed: {e}")
# ─────────────────────────────────────────────────────────────────
# SLIDE 1 — Title
# ─────────────────────────────────────────────────────────────────
def slide_title(prs):
sl = prs.slides.add_slide(BLANK)
# Full dark bg
bg = sl.shapes.add_shape(1, 0, 0, W, H)
fill_solid(bg, DARK); no_line(bg)
# Orange accent bar on left
bar = sl.shapes.add_shape(1, 0, 0, Inches(0.6), H)
fill_solid(bar, ORANGE); no_line(bar)
# Orange circle decoration top-right
circ = sl.shapes.add_shape(9, Inches(10.5), Inches(-1.0), Inches(4), Inches(4))
circ.fill.solid(); circ.fill.fore_color.rgb = ORANGE
circ.line.fill.background()
from pptx.util import Pt
# Make semi-transparent via alpha not easy — skip, use a teal circle instead
circ2 = sl.shapes.add_shape(9, Inches(10.0), Inches(4.8), Inches(3), Inches(3))
fill_solid(circ2, TEAL); no_line(circ2)
# Main title
add_tb(sl, "CHIKUNGUNYA", Inches(1.1), Inches(2.0), Inches(9), Inches(1.6),
font_name="Calibri", size=64, bold=True, color=WHITE,
align=PP_ALIGN.LEFT)
# Subtitle
add_tb(sl, "A Mosquito-Borne Viral Disease", Inches(1.1), Inches(3.7), Inches(8), Inches(0.9),
font_name="Calibri", size=28, italic=True, color=ORANGE_LIGHT,
align=PP_ALIGN.LEFT)
# Tagline
add_tb(sl, "Epidemiology | Pathogenesis | Clinical Features | Diagnosis | Management | Prevention",
Inches(1.1), Inches(4.7), Inches(10.5), Inches(0.6),
font_name="Calibri", size=14, color=GREY_LINE, align=PP_ALIGN.LEFT)
# Bottom line
add_hline(sl, Inches(1.1), Inches(5.5), Inches(9), color=ORANGE)
# ─────────────────────────────────────────────────────────────────
# SLIDE 2 — Overview / What is Chikungunya?
# ─────────────────────────────────────────────────────────────────
def slide_overview(prs):
sl = prs.slides.add_slide(BLANK)
bg = sl.shapes.add_shape(1, 0, 0, W, H)
fill_solid(bg, LIGHT_BG); no_line(bg)
# Header bar
hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
fill_solid(hdr, ORANGE); no_line(hdr)
add_tb(sl, "What is Chikungunya?", Inches(0.4), Inches(0.18), Inches(10), Inches(0.8),
size=34, bold=True, color=WHITE, align=PP_ALIGN.LEFT)
# Mosquito image on the right
add_img_url(sl,
"https://cdn.orris.care/cdss_images/pmc_clinical_VQA_7ad6496029f23a8c996fe6a3d391640f83570166a41828c598c139f6866cb60a.jpg",
Inches(9.0), Inches(1.3), Inches(4.0), Inches(5.6))
bullets = [
"• Chikungunya is a viral disease caused by the Chikungunya virus (CHIKV)",
"• Name derives from the Kimakonde language meaning 'to become contorted'",
" — refers to the stooped posture due to severe joint pain",
"• CHIKV is a single-stranded RNA virus (alphavirus, Togaviridae family)",
"• Transmitted primarily by Aedes aegypti and Aedes albopictus mosquitoes",
"• Humans are the primary reservoir during epidemic periods",
"• NOT transmitted person-to-person (no airborne / droplet spread)",
"• Globally re-emerging: 502,264 cases across 41 countries in 2025",
"• Recent PAHO alert (Feb 2026): surge in cases across the Americas",
]
add_bullets(sl, bullets, Inches(0.4), Inches(1.3), Inches(8.4), Inches(5.8),
size=17, color=DARK, line_spacing=1.3)
add_hline(sl, Inches(0.4), Inches(7.15), Inches(12.5), color=ORANGE)
add_tb(sl, "Source: Red Book 2021 | PAHO Epidemiological Alert Feb 2026",
Inches(0.4), Inches(7.2), Inches(12), Inches(0.25),
size=10, italic=True, color=TEAL)
# ─────────────────────────────────────────────────────────────────
# SLIDE 3 — Virology & Transmission
# ─────────────────────────────────────────────────────────────────
def slide_virology(prs):
sl = prs.slides.add_slide(BLANK)
bg = sl.shapes.add_shape(1, 0, 0, W, H)
fill_solid(bg, LIGHT_BG); no_line(bg)
hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
fill_solid(hdr, TEAL); no_line(hdr)
add_tb(sl, "Virology & Transmission", Inches(0.4), Inches(0.18), Inches(10), Inches(0.8),
size=34, bold=True, color=WHITE)
# Left col: Virus biology
add_box(sl, Inches(0.3), Inches(1.3), Inches(5.9), Inches(2.7), TEAL_LIGHT)
add_tb(sl, "Virus Biology", Inches(0.45), Inches(1.35), Inches(5.6), Inches(0.45),
size=17, bold=True, color=TEAL)
vbio = [
"• Family: Togaviridae | Genus: Alphavirus",
"• Enveloped, positive-sense single-stranded RNA (~12 kb)",
"• Envelope glycoproteins E1 & E2 mediate cell entry",
"• Cell receptor: MXRA8 (matrix remodeling assoc. antigen 8)",
"• Infects fibroblasts, epithelial cells, hepatocytes, neurons",
"• Viremia lasts 5–7 days post-infection",
]
add_bullets(sl, vbio, Inches(0.45), Inches(1.82), Inches(5.7), Inches(2.1),
size=15, line_spacing=1.2)
# Left col: Transmission
add_box(sl, Inches(0.3), Inches(4.15), Inches(5.9), Inches(2.9), ORANGE_LIGHT)
add_tb(sl, "Transmission Routes", Inches(0.45), Inches(4.2), Inches(5.6), Inches(0.45),
size=17, bold=True, color=ORANGE)
vtrans = [
"• Primary: Bite of infected Aedes aegypti or Ae. albopictus",
"• Bloodborne: documented in lab workers & healthcare staff",
"• Vertical (in utero): rare; mostly in 2nd trimester",
"• Intrapartum: when mother is viremic at delivery",
"• NOT via breastfeeding | NOT via blood transfusion (to date)",
"• Extrinsic incubation in mosquito: 2–10 days",
]
add_bullets(sl, vtrans, Inches(0.45), Inches(4.65), Inches(5.7), Inches(2.3),
size=15, line_spacing=1.2)
# Right: mosquito cycle image
add_img_url(sl,
"https://cdn.orris.care/cdss_images/pmc_clinical_VQA_7ad6496029f23a8c996fe6a3d391640f83570166a41828c598c139f6866cb60a.jpg",
Inches(6.5), Inches(1.3), Inches(6.5), Inches(5.7))
add_hline(sl, Inches(0.3), Inches(7.2), Inches(12.7), color=TEAL)
add_tb(sl, "Source: Firestein & Kelley's Textbook of Rheumatology | Red Book 2021",
Inches(0.3), Inches(7.25), Inches(12), Inches(0.2), size=10, italic=True, color=TEAL)
# ─────────────────────────────────────────────────────────────────
# SLIDE 4 — Epidemiology
# ─────────────────────────────────────────────────────────────────
def slide_epidemiology(prs):
sl = prs.slides.add_slide(BLANK)
bg = sl.shapes.add_shape(1, 0, 0, W, H)
fill_solid(bg, LIGHT_BG); no_line(bg)
hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
fill_solid(hdr, DARK); no_line(hdr)
add_tb(sl, "Global Epidemiology", Inches(0.4), Inches(0.18), Inches(10), Inches(0.8),
size=34, bold=True, color=WHITE)
# Three stat boxes at top
stat_data = [
("502,264", "Reported cases globally in 2025\n(41 countries & territories)"),
("315,078", "Cases in the Americas alone\nduring 2025 (PAHO data)"),
("170", "Deaths in the Americas\nduring 2025"),
]
for i, (num, label) in enumerate(stat_data):
x = Inches(0.4 + i * 4.3)
box = add_box(sl, x, Inches(1.3), Inches(4.0), Inches(1.5), ORANGE)
add_tb(sl, num, x + Inches(0.1), Inches(1.35), Inches(3.8), Inches(0.75),
size=38, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_tb(sl, label, x + Inches(0.1), Inches(2.05), Inches(3.8), Inches(0.65),
size=12, color=WHITE, align=PP_ALIGN.CENTER)
# Timeline / history bullets
add_box(sl, Inches(0.3), Inches(3.0), Inches(7.8), Inches(4.1), TEAL_LIGHT)
add_tb(sl, "Historical Timeline", Inches(0.45), Inches(3.05), Inches(7.5), Inches(0.4),
size=17, bold=True, color=TEAL)
hist = [
"1952 — First identified in Tanzania (Newala district)",
"2004–2007 — Major Indian Ocean & South Asian epidemics (millions affected)",
"2007 — Local transmission in Italy (Ae. albopictus); first European outbreak",
"2013 — First cases in the Americas (Caribbean islands)",
"2014 — Rapid spread; >1 million suspected cases in the Americas",
"2019 — WHO lists CHIKV among priority pathogens for R&D",
"2025 — 502,264 global cases; re-emergence in Americas",
"Feb 2026 — PAHO epidemiological alert; surge in multiple countries",
]
add_bullets(sl, hist, Inches(0.45), Inches(3.5), Inches(7.6), Inches(3.5),
size=14.5, line_spacing=1.2)
# At-risk populations box
add_box(sl, Inches(8.35), Inches(3.0), Inches(4.65), Inches(4.1), ORANGE_LIGHT)
add_tb(sl, "High-Risk Groups", Inches(8.5), Inches(3.05), Inches(4.4), Inches(0.4),
size=17, bold=True, color=ORANGE)
risk = [
"• Neonates (perinatal exposure)",
"• Adults > 65 years",
"• Hypertension / diabetes",
"• Cardiovascular disease",
"• Chronic kidney disease",
"• Immunocompromised",
"• Travelers to endemic areas",
]
add_bullets(sl, risk, Inches(8.5), Inches(3.5), Inches(4.4), Inches(3.5),
size=15, line_spacing=1.25)
add_hline(sl, Inches(0.3), Inches(7.2), Inches(12.7), color=DARK)
add_tb(sl, "Sources: PAHO Feb 2026 Alert | WHO 2025 data | Red Book 2021",
Inches(0.3), Inches(7.25), Inches(12), Inches(0.2), size=10, italic=True, color=TEAL)
# ─────────────────────────────────────────────────────────────────
# SLIDE 5 — Clinical Features
# ─────────────────────────────────────────────────────────────────
def slide_clinical(prs):
sl = prs.slides.add_slide(BLANK)
bg = sl.shapes.add_shape(1, 0, 0, W, H)
fill_solid(bg, LIGHT_BG); no_line(bg)
hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
fill_solid(hdr, ORANGE); no_line(hdr)
add_tb(sl, "Clinical Features", Inches(0.4), Inches(0.18), Inches(10), Inches(0.8),
size=34, bold=True, color=WHITE)
# Phase boxes
phases = [
("Acute Phase\n(Days 1–7)",
"• Abrupt onset high fever (>39°C / 102°F)\n• Severe bilateral polyarthralgia\n (hands, feet, ankles, wrists)\n• Maculopapular rash (trunk/extremities)\n• Headache, myalgia\n• Conjunctivitis, nausea, vomiting\n• Lab: lymphopenia, thrombocytopenia\n• Elevated creatinine & aminotransferases",
TEAL, TEAL_LIGHT),
("Sub-acute Phase\n(Weeks 2–12)",
"• Fever resolves but arthralgia persists\n• Distal joint polyarthritis\n• Tenosynovitis\n• Fatigue, depression\n• Possible rash relapse\n• Most patients recover fully\n within 3 months",
ORANGE, ORANGE_LIGHT),
("Chronic Phase\n(> 3 months)",
"• Persistent arthralgia / arthritis\n (up to 50% of adults)\n• Risk factors: age >50 yrs,\n severe acute arthritis, OA\n• RA-like presentation possible\n• Neuropathic pain component\n• Median duration: months–years",
DARK, RGBColor(0xD8, 0xD8, 0xE8)),
]
for i, (title, content, hcolor, bcolor) in enumerate(phases):
x = Inches(0.3 + i * 4.35)
add_box(sl, x, Inches(1.3), Inches(4.1), Inches(5.6), bcolor)
add_tb(sl, title, x + Inches(0.1), Inches(1.35), Inches(3.9), Inches(0.65),
size=17, bold=True, color=hcolor, align=PP_ALIGN.CENTER)
add_hline(sl, x + Inches(0.1), Inches(2.05), Inches(3.9), color=hcolor, thickness=Pt(1))
cb_lines = content.split("\n")
add_bullets(sl, cb_lines, x + Inches(0.1), Inches(2.15), Inches(3.9), Inches(4.6),
size=14.5, line_spacing=1.25)
add_hline(sl, Inches(0.3), Inches(7.2), Inches(12.7), color=ORANGE)
add_tb(sl, "Source: Red Book 2021 | Firestein & Kelley's Textbook of Rheumatology",
Inches(0.3), Inches(7.25), Inches(12), Inches(0.2), size=10, italic=True, color=TEAL)
# ─────────────────────────────────────────────────────────────────
# SLIDE 6 — Rash & Complications (with images)
# ─────────────────────────────────────────────────────────────────
def slide_rash(prs):
sl = prs.slides.add_slide(BLANK)
bg = sl.shapes.add_shape(1, 0, 0, W, H)
fill_solid(bg, LIGHT_BG); no_line(bg)
hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
fill_solid(hdr, TEAL); no_line(hdr)
add_tb(sl, "Cutaneous Manifestations & Complications", Inches(0.4), Inches(0.18),
Inches(12), Inches(0.8), size=34, bold=True, color=WHITE)
# Images row
imgs = [
("https://cdn.orris.care/cdss_images/pmc_clinical_VQA_2dc8d4091f443cd466cfb16ff9a3d2d66d2229043535f35e4ea840f73fa4ff6c.jpg",
"Maculopapular rash — neck/chest\n(acute viral exanthem)"),
("https://cdn.orris.care/cdss_images/pmc_clinical_VQA_b3174275dfdf1e0f8f5b5db78e0ba4f520cfef461e001d0865fab7a30b77611e.jpg",
"Polymorphic skin lesions:\nmacular → vesiculobullous → hemorrhagic"),
("https://cdn.orris.care/cdss_images/pmc_clinical_VQA_45d57e3230546c53f4cde27140eb88e9e6615528da2cc891d97d80bd3cc2986c.jpg",
"Neonatal chikungunya:\nPetechial rash, requires ICU care"),
]
for i, (url, caption) in enumerate(imgs):
x = Inches(0.35 + i * 4.35)
add_img_url(sl, url, x, Inches(1.3), Inches(4.0), Inches(3.3))
add_tb(sl, caption, x, Inches(4.65), Inches(4.0), Inches(0.6),
size=12, italic=True, color=DARK, align=PP_ALIGN.CENTER)
# Complications box
add_box(sl, Inches(0.3), Inches(5.45), Inches(12.7), Inches(1.75), ORANGE_LIGHT)
add_tb(sl, "Severe / Rare Complications", Inches(0.45), Inches(5.5), Inches(12), Inches(0.4),
size=17, bold=True, color=ORANGE)
comp_txt = ("Neurological: Meningoencephalitis | Myelitis | Guillain-Barré | Cranial nerve palsies "
"Cardiac: Myocarditis "
"Ocular: Uveitis, Retinitis "
"Hepatic: Hepatitis "
"Renal: Nephritis "
"Neonatal: Acrocyanosis | Vesicobullous lesions | Limb edema")
add_tb(sl, comp_txt, Inches(0.45), Inches(5.95), Inches(12.3), Inches(1.1),
size=14, color=DARK, wrap=True)
add_hline(sl, Inches(0.3), Inches(7.2), Inches(12.7), color=TEAL)
add_tb(sl, "Source: Red Book 2021 | Firestein & Kelley's Textbook of Rheumatology | PMC clinical images",
Inches(0.3), Inches(7.25), Inches(12), Inches(0.2), size=10, italic=True, color=TEAL)
# ─────────────────────────────────────────────────────────────────
# SLIDE 7 — Diagnosis
# ─────────────────────────────────────────────────────────────────
def slide_diagnosis(prs):
sl = prs.slides.add_slide(BLANK)
bg = sl.shapes.add_shape(1, 0, 0, W, H)
fill_solid(bg, LIGHT_BG); no_line(bg)
hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
fill_solid(hdr, DARK); no_line(hdr)
add_tb(sl, "Diagnosis", Inches(0.4), Inches(0.18), Inches(10), Inches(0.8),
size=34, bold=True, color=WHITE)
diag_cols = [
("Clinical Suspicion", TEAL, TEAL_LIGHT,
["• Acute febrile illness + severe polyarthralgia",
"• Travel to / residence in endemic area",
"• Symptom onset 3–7 days post-mosquito exposure",
"• Must differentiate from Dengue and Zika",
" (similar epidemiology, can co-circulate)",
"• Dengue: leukopenia, no prominent arthritis",
"• Zika: milder fever, possible microcephaly"]),
("Laboratory Tests", ORANGE, ORANGE_LIGHT,
["RT-PCR (days 1–7):",
" • Gold standard for acute infection",
" • Detects CHIKV RNA in serum",
"",
"Serology (day 5+):",
" • IgM ELISA — persists 30–90 days",
" • Plaque-reduction neutralization test",
" (differentiates from Mayaro/o'nyong nyong)",
"",
"Other findings:",
" • Lymphopenia, thrombocytopenia",
" • ↑ creatinine, ↑ aminotransferases"]),
("Reporting & Testing Sites", DARK, RGBColor(0xD8, 0xD8, 0xE8),
["• Commercial labs: routine PCR & serology",
"• State health dept labs",
"• CDC labs: neutralization tests,",
" immunohistochemical staining",
"",
"Reporting (USA):",
"• Nationally notifiable disease",
"• Report to state/local health dept",
"• CDC ArboNET surveillance system",
"",
"• Standard precautions for inpatients"]),
]
for i, (title, hcol, bcol, bullets) in enumerate(diag_cols):
x = Inches(0.3 + i * 4.35)
add_box(sl, x, Inches(1.3), Inches(4.1), Inches(5.65), bcol)
add_tb(sl, title, x + Inches(0.1), Inches(1.35), Inches(3.9), Inches(0.45),
size=17, bold=True, color=hcol, align=PP_ALIGN.CENTER)
add_hline(sl, x + Inches(0.1), Inches(1.85), Inches(3.9), color=hcol)
add_bullets(sl, bullets, x + Inches(0.1), Inches(1.95), Inches(3.9), Inches(4.9),
size=14.5, line_spacing=1.2)
add_hline(sl, Inches(0.3), Inches(7.2), Inches(12.7), color=DARK)
add_tb(sl, "Source: Red Book 2021 | CDC Guidelines",
Inches(0.3), Inches(7.25), Inches(12), Inches(0.2), size=10, italic=True, color=TEAL)
# ─────────────────────────────────────────────────────────────────
# SLIDE 8 — Treatment
# ─────────────────────────────────────────────────────────────────
def slide_treatment(prs):
sl = prs.slides.add_slide(BLANK)
bg = sl.shapes.add_shape(1, 0, 0, W, H)
fill_solid(bg, LIGHT_BG); no_line(bg)
hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
fill_solid(hdr, ORANGE); no_line(hdr)
add_tb(sl, "Treatment & Management", Inches(0.4), Inches(0.18), Inches(10), Inches(0.8),
size=34, bold=True, color=WHITE)
# No specific antiviral banner
ban = add_box(sl, Inches(0.3), Inches(1.3), Inches(12.7), Inches(0.75),
RGBColor(0xFF, 0xEC, 0xB3))
add_tb(sl, "⚠ No approved antiviral therapy exists for Chikungunya — management is entirely supportive",
Inches(0.45), Inches(1.35), Inches(12.3), Inches(0.6),
size=16, bold=True, color=RGBColor(0x7B, 0x4B, 0x00), align=PP_ALIGN.CENTER)
# Treatment boxes
tx_cols = [
("Acute Phase Care", TEAL, TEAL_LIGHT,
["• Rest and adequate fluid intake",
"• Paracetamol (acetaminophen) — preferred",
" for fever and joint pain",
"• Avoid NSAIDs until dengue ruled out",
" (risk of hemorrhagic complications)",
"• Avoid aspirin in children",
"• Monitor for severe complications"]),
("Chronic / Persistent Arthritis", ORANGE, ORANGE_LIGHT,
["• NSAIDs — once dengue excluded",
"• Corticosteroids — for severe arthritis",
"• Physiotherapy & rehabilitation",
"• Hydroxychloroquine — some patients",
" with refractory arthritis",
"• Methotrexate — severe persistent cases",
"• Pain management (neuropathic component)"]),
("Hospitalisation Indications", DARK, RGBColor(0xD8, 0xD8, 0xE8),
["• Neurological complications",
" (encephalitis, Guillain-Barré)",
"• Severe myocarditis / cardiac failure",
"• Neonatal chikungunya",
"• Elderly with multi-organ involvement",
"• Hemorrhagic manifestations",
"• Inability to maintain oral intake",
"• Standard precautions apply"]),
]
for i, (title, hcol, bcol, bullets) in enumerate(tx_cols):
x = Inches(0.3 + i * 4.35)
add_box(sl, x, Inches(2.2), Inches(4.1), Inches(4.8), bcol)
add_tb(sl, title, x + Inches(0.1), Inches(2.25), Inches(3.9), Inches(0.45),
size=17, bold=True, color=hcol, align=PP_ALIGN.CENTER)
add_hline(sl, x + Inches(0.1), Inches(2.75), Inches(3.9), color=hcol)
add_bullets(sl, bullets, x + Inches(0.1), Inches(2.85), Inches(3.9), Inches(4.0),
size=14.5, line_spacing=1.25)
add_hline(sl, Inches(0.3), Inches(7.2), Inches(12.7), color=ORANGE)
add_tb(sl, "Source: Red Book 2021 | Washington Manual of Medical Therapeutics",
Inches(0.3), Inches(7.25), Inches(12), Inches(0.2), size=10, italic=True, color=TEAL)
# ─────────────────────────────────────────────────────────────────
# SLIDE 9 — Prevention & Control
# ─────────────────────────────────────────────────────────────────
def slide_prevention(prs):
sl = prs.slides.add_slide(BLANK)
bg = sl.shapes.add_shape(1, 0, 0, W, H)
fill_solid(bg, LIGHT_BG); no_line(bg)
hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
fill_solid(hdr, TEAL); no_line(hdr)
add_tb(sl, "Prevention & Control", Inches(0.4), Inches(0.18), Inches(10), Inches(0.8),
size=34, bold=True, color=WHITE)
# Left: personal protection
add_box(sl, Inches(0.3), Inches(1.3), Inches(6.1), Inches(5.7), TEAL_LIGHT)
add_tb(sl, "Personal Protection Measures", Inches(0.45), Inches(1.35), Inches(5.8), Inches(0.45),
size=17, bold=True, color=TEAL)
pers = [
"• Use EPA-registered insect repellents",
" (DEET, picaridin, IR3535, oil of lemon eucalyptus)",
"• Wear long-sleeved shirts and long trousers",
"• Sleep under insecticide-treated bed nets",
"• Stay in screened or air-conditioned rooms",
"• Limit outdoor activity at peak mosquito feeding",
" times (dawn and dusk)",
"• Use permethrin-treated clothing for travel",
]
add_bullets(sl, pers, Inches(0.45), Inches(1.85), Inches(5.8), Inches(3.2),
size=15.5, line_spacing=1.25)
# Left lower: vaccine update
add_box(sl, Inches(0.3), Inches(5.1), Inches(6.1), Inches(2.1), ORANGE_LIGHT)
add_tb(sl, "Vaccine Status (2026)", Inches(0.45), Inches(5.15), Inches(5.8), Inches(0.4),
size=17, bold=True, color=ORANGE)
vacc = [
"• IXCHIQ (Valneva VLA1553) — FDA-approved Nov 2023",
" Live attenuated vaccine; single-dose for adults ≥18 yrs",
"• Indicated for travelers to endemic areas",
"• Not yet for children or immunocompromised",
"• WHO lists CHIKV as priority pathogen for R&D",
]
add_bullets(sl, vacc, Inches(0.45), Inches(5.58), Inches(5.8), Inches(1.55),
size=14, line_spacing=1.2)
# Right: vector control
add_box(sl, Inches(6.6), Inches(1.3), Inches(6.5), Inches(3.35), RGBColor(0xD8, 0xD8, 0xE8))
add_tb(sl, "Vector Control", Inches(6.75), Inches(1.35), Inches(6.2), Inches(0.45),
size=17, bold=True, color=DARK)
vect = [
"• Eliminate standing water (breeding sites)",
"• Cover water storage containers",
"• Larviciding of water bodies",
"• Indoor residual spraying",
"• Biological control (Bacillus thuringiensis)",
"• Community-based surveillance and clean-up",
]
add_bullets(sl, vect, Inches(6.75), Inches(1.85), Inches(6.2), Inches(2.7),
size=15.5, line_spacing=1.25)
# Right: surveillance & blood safety
add_box(sl, Inches(6.6), Inches(4.75), Inches(6.5), Inches(2.45), TEAL_LIGHT)
add_tb(sl, "Surveillance & Blood Safety", Inches(6.75), Inches(4.8), Inches(6.2), Inches(0.45),
size=17, bold=True, color=TEAL)
surv = [
"• Protect symptomatic febrile patients from",
" mosquito bites to prevent further spread",
"• Screen blood and organ donations",
"• Report suspected cases to public health authorities",
"• ArboNET surveillance (USA) | PAHO PLISA (Americas)",
]
add_bullets(sl, surv, Inches(6.75), Inches(5.3), Inches(6.2), Inches(1.85),
size=15, line_spacing=1.2)
add_hline(sl, Inches(0.3), Inches(7.2), Inches(12.7), color=TEAL)
add_tb(sl, "Source: Red Book 2021 | CDC | PAHO | FDA (IXCHIQ approval 2023)",
Inches(0.3), Inches(7.25), Inches(12), Inches(0.2), size=10, italic=True, color=TEAL)
# ─────────────────────────────────────────────────────────────────
# SLIDE 10 — Differential Diagnosis
# ─────────────────────────────────────────────────────────────────
def slide_differential(prs):
sl = prs.slides.add_slide(BLANK)
bg = sl.shapes.add_shape(1, 0, 0, W, H)
fill_solid(bg, LIGHT_BG); no_line(bg)
hdr = sl.shapes.add_shape(1, 0, 0, W, Inches(1.15))
fill_solid(hdr, DARK); no_line(hdr)
add_tb(sl, "Differential Diagnosis", Inches(0.4), Inches(0.18), Inches(10), Inches(0.8),
size=34, bold=True, color=WHITE)
headers = ["Feature", "Chikungunya", "Dengue", "Zika"]
rows = [
["Fever", "High (>39°C), biphasic", "High, sudden onset", "Low-grade / absent"],
["Arthralgia", "Severe, bilateral, distal", "Mild ('breakbone')", "Mild, fleeting"],
["Rash", "Maculopapular, trunk/limbs","Maculopapular", "Diffuse maculopapular"],
["Hemorrhage", "Rare", "Common (severe dengue)","Very rare"],
["Neurological", "Rare but possible", "Dengue encephalopathy", "Guillain-Barré, microcephaly"],
["Leucopenia", "Mild lymphopenia", "Prominent", "Mild"],
["Thrombocytopenia","Mild", "Significant", "Mild"],
["Transmission", "Aedes mosquito", "Aedes mosquito", "Aedes mosquito + sexual"],
["Vaccine", "IXCHIQ (FDA 2023)", "Dengvaxia (limited)", "None approved"],
]
col_w = [Inches(2.4), Inches(3.4), Inches(3.4), Inches(3.4)]
col_x = [Inches(0.3), Inches(2.75), Inches(6.2), Inches(9.65)]
row_h = Inches(0.55)
header_h = Inches(0.58)
start_y = Inches(1.3)
# Header row
hdr_colors = [DARK, ORANGE, TEAL, RGBColor(0x55, 0x88, 0x22)]
for ci, (h, cx, cw, hc) in enumerate(zip(headers, col_x, col_w, hdr_colors)):
add_box(sl, cx, start_y, cw, header_h, hc)
add_tb(sl, h, cx + Inches(0.05), start_y + Inches(0.05),
cw - Inches(0.1), header_h - Inches(0.05),
size=16, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
valign=MSO_ANCHOR.MIDDLE)
# Data rows
even_colors = [LIGHT_BG, RGBColor(0xEE, 0xEE, 0xEE)]
for ri, row in enumerate(rows):
y = start_y + header_h + ri * row_h
row_color = even_colors[ri % 2]
for ci, (cell, cx, cw) in enumerate(zip(row, col_x, col_w)):
box = sl.shapes.add_shape(1, cx, y, cw, row_h)
fill_solid(box, row_color); no_line(box)
fc = TEAL if ci == 1 else (ORANGE if ci == 2 else (RGBColor(0x33, 0x66, 0x11) if ci == 3 else DARK))
add_tb(sl, cell, cx + Inches(0.07), y + Inches(0.04),
cw - Inches(0.1), row_h - Inches(0.05),
size=13, color=fc if ci > 0 else DARK,
bold=(ci == 0), valign=MSO_ANCHOR.MIDDLE)
add_hline(sl, Inches(0.3), Inches(7.2), Inches(12.7), color=DARK)
add_tb(sl, "Source: Red Book 2021 | Harrison's Principles of Internal Medicine 22E",
Inches(0.3), Inches(7.25), Inches(12), Inches(0.2), size=10, italic=True, color=TEAL)
# ─────────────────────────────────────────────────────────────────
# SLIDE 11 — Key Takeaways
# ─────────────────────────────────────────────────────────────────
def slide_takeaways(prs):
sl = prs.slides.add_slide(BLANK)
bg = sl.shapes.add_shape(1, 0, 0, W, H)
fill_solid(bg, DARK); no_line(bg)
# Decorative circles
c1 = sl.shapes.add_shape(9, Inches(-0.8), Inches(-0.8), Inches(4), Inches(4))
fill_solid(c1, TEAL); no_line(c1)
c2 = sl.shapes.add_shape(9, Inches(11.5), Inches(5.5), Inches(3.5), Inches(3.5))
fill_solid(c2, ORANGE); no_line(c2)
add_tb(sl, "Key Takeaways", Inches(0.5), Inches(0.25), Inches(10), Inches(0.85),
size=36, bold=True, color=WHITE)
add_hline(sl, Inches(0.5), Inches(1.15), Inches(8), color=ORANGE)
points = [
("1", "CHIKV is a re-emerging global threat — 502K+ cases in 2025; PAHO issued alert in Feb 2026 for the Americas."),
("2", "Cardinal features: sudden high fever + severe, debilitating polyarthralgia + maculopapular rash."),
("3", "Transmitted by Aedes mosquitoes. No person-to-person spread; rare vertical and bloodborne transmission."),
("4", "Must differentiate from Dengue and Zika — all three arboviruses co-circulate in tropical regions."),
("5", "Diagnosis: RT-PCR in week 1; IgM serology from day 5. Notify public health authorities."),
("6", "Treatment is supportive only — no antiviral. Paracetamol first; NSAIDs / steroids for chronic arthritis."),
("7", "First vaccine (IXCHIQ) FDA-approved 2023 for adult travelers — marks a new era in CHIKV prevention."),
]
for i, (num, text) in enumerate(points):
y = Inches(1.3 + i * 0.85)
circ = sl.shapes.add_shape(9, Inches(0.45), y + Inches(0.05), Inches(0.55), Inches(0.55))
fill_solid(circ, ORANGE); no_line(circ)
add_tb(sl, num, Inches(0.45), y + Inches(0.05), Inches(0.55), Inches(0.55),
size=16, bold=True, color=WHITE, align=PP_ALIGN.CENTER, valign=MSO_ANCHOR.MIDDLE)
add_tb(sl, text, Inches(1.15), y, Inches(11.5), Inches(0.8),
size=16, color=WHITE, valign=MSO_ANCHOR.MIDDLE)
# ─────────────────────────────────────────────────────────────────
# BUILD
# ─────────────────────────────────────────────────────────────────
slide_title(prs)
slide_overview(prs)
slide_virology(prs)
slide_epidemiology(prs)
slide_clinical(prs)
slide_rash(prs)
slide_diagnosis(prs)
slide_treatment(prs)
slide_prevention(prs)
slide_differential(prs)
slide_takeaways(prs)
out_path = "/tmp/workspace/chikungunya-ppt/Chikungunya.pptx"
buf = BytesIO()
prs.save(buf)
with open(out_path, "wb") as f:
f.write(buf.getvalue())
print(f"Saved: {out_path} ({os.path.getsize(out_path):,} bytes)")
cd /tmp/workspace/chikungunya-ppt && python build_ppt.py 2>&1
~/chikungunya-ppt/build_ppt.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/chikungunya-ppt/build_ppt.py'
cd /tmp/workspace/chikungunya-ppt && python build_ppt.py 2>&1
Chikungunya
Presentation · PPTX
| # | Slide | Highlights |
|---|---|---|
| 1 | Title | Dark navy + orange design |
| 2 | What is Chikungunya? | Definition, name origin, basic facts, 2026 outbreak context |
| 3 | Virology & Transmission | RNA alphavirus structure, MXRA8 receptor, Aedes vector cycle diagram |
| 4 | Global Epidemiology | 502,264 cases in 2025, PAHO Feb 2026 alert, historical timeline from 1952 |
| 5 | Clinical Features | Acute / sub-acute / chronic phase boxes (all 3 phases) |
| 6 | Cutaneous Manifestations & Complications | 3 real clinical photos (macular rash, vesiculobullous lesions, neonatal ICU case) |
| 7 | Diagnosis | RT-PCR vs serology windows, lab findings, reporting to CDC ArboNET |
| 8 | Treatment & Management | Supportive-only banner, paracetamol-first rule, NSAIDs/hydroxychloroquine/methotrexate for chronic arthritis |
| 9 | Prevention & Control | IXCHIQ vaccine (FDA 2023), personal protection, vector control, blood safety |
| 10 | Differential Diagnosis | Side-by-side comparison table: Chikungunya vs Dengue vs Zika |
| 11 | Key Takeaways | 7 numbered summary points |
Make pdf
cd /tmp/workspace/chikungunya-ppt && python -c " from pptx import Presentation from pptx.util import Inches, Pt prs = Presentation('Chikungunya.pptx') print(f'Slides: {len(prs.slides)}') print(f'Width: {prs.slide_width.inches:.2f} in, Height: {prs.slide_height.inches:.2f} in') for i, sl in enumerate(prs.slides, 1): shapes = len(sl.shapes) print(f' Slide {i}: {shapes} shapes') "
~/chikungunya-ppt/pptx_to_pdf.py
"""
Convert Chikungunya.pptx → Chikungunya.pdf
Strategy: re-use the same slide content data already in build_ppt.py
but render each page with ReportLab directly (faithful recreation).
Each slide becomes one A3-landscape PDF page (same 13.33 x 7.5 in ratio).
"""
from reportlab.lib.pagesizes import landscape
from reportlab.lib.units import inch
from reportlab.pdfgen import canvas
from reportlab.lib import colors
from reportlab.lib.utils import ImageReader
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from io import BytesIO
import urllib.request, ssl, os
# ── Page size (matches 16:9 slide) ──────────────────────────────
W_IN = 13.333
H_IN = 7.5
W_PT = W_IN * inch
H_PT = H_IN * inch
# ── Colours (R,G,B 0-1) ─────────────────────────────────────────
def c(r, g, b): return (r/255, g/255, b/255)
ORANGE = c(217, 83, 31)
DARK = c(26, 26, 46)
WHITE = c(255, 255, 255)
LIGHT_BG = c(253, 246, 240)
TEAL = c(15, 126, 138)
GREY = c(204, 204, 204)
ORANGE_LIGHT= c(250, 208, 180)
TEAL_LIGHT = c(178, 228, 232)
GREY_LIGHT = c(216, 216, 232)
YELLOW_WARN = c(255, 236, 179)
ORANGE_DARK = c(123, 75, 0)
GREEN_DARK = c(51, 102, 17)
EVEN_ROW = c(238, 238, 238)
OUT = "/tmp/workspace/chikungunya-ppt/Chikungunya.pdf"
# ── Image cache ──────────────────────────────────────────────────
_img_cache = {}
def fetch_img(url):
if url in _img_cache:
return _img_cache[url]
try:
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
req = urllib.request.Request(url, headers={"User-Agent":"Mozilla/5.0"})
with urllib.request.urlopen(req, timeout=20, context=ctx) as r:
raw = r.read()
ir = ImageReader(BytesIO(raw))
_img_cache[url] = ir
return ir
except Exception as e:
print(f" img fail: {e}")
return None
# ── Drawing helpers ──────────────────────────────────────────────
def rect(cv, x, y, w, h, fill, stroke=None, lw=0.5):
"""x,y,w,h in inches. y measured from TOP."""
cv.saveState()
cv.setFillColorRGB(*fill)
if stroke:
cv.setStrokeColorRGB(*stroke)
cv.setLineWidth(lw)
else:
cv.setStrokeColorRGB(*fill)
cv.rect(x*inch, (H_IN-y-h)*inch, w*inch, h*inch,
fill=1, stroke=(1 if stroke else 0))
cv.restoreState()
def img(cv, url, x, y, w, h):
ir = fetch_img(url)
if ir:
cv.drawImage(ir, x*inch, (H_IN-y-h)*inch, w*inch, h*inch,
preserveAspectRatio=True, anchor='c', mask='auto')
def line(cv, x1, y1, x2, y2, color, lw=1.0):
cv.saveState()
cv.setStrokeColorRGB(*color)
cv.setLineWidth(lw)
cv.line(x1*inch, (H_IN-y1)*inch, x2*inch, (H_IN-y1)*inch)
cv.restoreState()
def text(cv, txt, x, y, size=12, bold=False, italic=False,
color=DARK, align='left', max_w=None):
"""Single-line text. y = top of text in inches from top."""
cv.saveState()
cv.setFillColorRGB(*color)
if bold and italic:
cv.setFont("Helvetica-BoldOblique", size)
elif bold:
cv.setFont("Helvetica-Bold", size)
elif italic:
cv.setFont("Helvetica-Oblique", size)
else:
cv.setFont("Helvetica", size)
ty = (H_IN - y)*inch - size*0.7 # rough baseline
if align == 'center' and max_w:
cv.drawCentredString((x + max_w/2)*inch, ty, txt)
elif align == 'right' and max_w:
cv.drawRightString((x + max_w)*inch, ty, txt)
else:
cv.drawString(x*inch, ty, txt)
cv.restoreState()
def wrap_text(cv, txt, x, y, max_w, size=12, bold=False, italic=False,
color=DARK, line_h=None, align='left'):
"""Wrap text within max_w inches. Returns final y after last line."""
if line_h is None:
line_h = size * 1.35 / 72 # in inches
cv.saveState()
cv.setFillColorRGB(*color)
if bold and italic:
cv.setFont("Helvetica-BoldOblique", size)
elif bold:
cv.setFont("Helvetica-Bold", size)
elif italic:
cv.setFont("Helvetica-Oblique", size)
else:
cv.setFont("Helvetica", size)
words = txt.split()
current_line = ""
cur_y = y
for word in words:
test = (current_line + " " + word).strip()
w_pts = cv.stringWidth(test, cv._fontname, size)
if w_pts / inch > max_w and current_line:
baseline = (H_IN - cur_y)*inch - size*0.7
if align == 'center':
cv.drawCentredString((x + max_w/2)*inch, baseline, current_line)
else:
cv.drawString(x*inch, baseline, current_line)
cur_y += line_h
current_line = word
else:
current_line = test
if current_line:
baseline = (H_IN - cur_y)*inch - size*0.7
if align == 'center':
cv.drawCentredString((x + max_w/2)*inch, baseline, current_line)
else:
cv.drawString(x*inch, baseline, current_line)
cur_y += line_h
cv.restoreState()
return cur_y
def bullets(cv, lines, x, y, max_w, size=12, color=DARK, line_h=None):
if line_h is None:
line_h = size * 1.4 / 72
cy = y
for ln in lines:
cy = wrap_text(cv, ln, x, cy, max_w, size=size, color=color, line_h=line_h)
return cy
# ── Header bar helper ────────────────────────────────────────────
def header(cv, title, bg_color):
rect(cv, 0, 0, W_IN, 1.15, bg_color)
wrap_text(cv, title, 0.4, 0.18, 12.5, size=34, bold=True, color=WHITE)
def footer(cv, src_txt):
line(cv, 0.3, 7.2, 13.0, 7.2, TEAL, lw=0.7)
text(cv, src_txt, 0.3, 7.28, size=9, italic=True, color=TEAL)
# ────────────────────────────────────────────────────────────────
# SLIDE RENDERERS
# ────────────────────────────────────────────────────────────────
def s1_title(cv):
rect(cv, 0, 0, W_IN, H_IN, DARK)
rect(cv, 0, 0, 0.6, H_IN, ORANGE)
# decorative circles
cv.saveState()
cv.setFillColorRGB(*ORANGE)
cv.circle(13.0*inch, (H_IN+0.5)*inch, 1.8*inch, fill=1, stroke=0)
cv.setFillColorRGB(*TEAL)
cv.circle(12.5*inch, 1.8*inch, 1.2*inch, fill=1, stroke=0)
cv.restoreState()
wrap_text(cv, "CHIKUNGUNYA", 1.1, 2.0, 9.5, size=60, bold=True, color=WHITE)
wrap_text(cv, "A Mosquito-Borne Viral Disease", 1.1, 3.7, 9.0, size=26, italic=True, color=ORANGE_LIGHT)
wrap_text(cv, "Epidemiology | Pathogenesis | Clinical Features | Diagnosis | Management | Prevention",
1.1, 4.7, 11.0, size=13, color=GREY)
line(cv, 1.1, 5.5, 10.0, 5.5, ORANGE, lw=1.5)
def s2_overview(cv):
rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
header(cv, "What is Chikungunya?", ORANGE)
img(cv,
"https://cdn.orris.care/cdss_images/pmc_clinical_VQA_7ad6496029f23a8c996fe6a3d391640f83570166a41828c598c139f6866cb60a.jpg",
9.0, 1.3, 4.0, 5.6)
bul = [
"* Chikungunya is a viral disease caused by the Chikungunya virus (CHIKV)",
"* Name derives from the Kimakonde language meaning 'to become contorted'",
" - refers to the stooped posture due to severe joint pain",
"* CHIKV is a single-stranded RNA virus (Alphavirus, Togaviridae family)",
"* Transmitted primarily by Aedes aegypti and Aedes albopictus mosquitoes",
"* Humans are the primary reservoir during epidemic periods",
"* NOT transmitted person-to-person (no airborne or droplet spread)",
"* Globally re-emerging: 502,264 cases across 41 countries in 2025",
"* PAHO alert (Feb 2026): surge of cases across the Americas",
]
bullets(cv, bul, 0.4, 1.4, 8.3, size=15.5, color=DARK, line_h=0.32)
footer(cv, "Source: Red Book 2021 | PAHO Epidemiological Alert Feb 2026")
def s3_virology(cv):
rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
header(cv, "Virology & Transmission", TEAL)
# virus bio box
rect(cv, 0.3, 1.3, 5.9, 2.75, TEAL_LIGHT)
text(cv, "Virus Biology", 0.45, 1.38, size=16, bold=True, color=TEAL)
vbio = ["* Family: Togaviridae | Genus: Alphavirus",
"* Enveloped positive-sense ssRNA (~12 kb)",
"* Envelope glycoproteins E1 & E2 mediate cell entry",
"* Cell receptor: MXRA8 (matrix remodeling assoc. antigen 8)",
"* Infects fibroblasts, epithelial cells, hepatocytes, neurons",
"* Viremia lasts 5-7 days post-infection"]
bullets(cv, vbio, 0.45, 1.65, 5.6, size=14, color=DARK, line_h=0.28)
# transmission box
rect(cv, 0.3, 4.15, 5.9, 2.95, ORANGE_LIGHT)
text(cv, "Transmission Routes", 0.45, 4.22, size=16, bold=True, color=ORANGE)
vtrans = ["* Primary: Bite of infected Aedes aegypti or Ae. albopictus",
"* Bloodborne: documented in lab workers & healthcare staff",
"* Vertical (in utero): rare; mostly in 2nd trimester",
"* Intrapartum: when mother is viremic at delivery",
"* NOT via breastfeeding | NOT via blood transfusion (to date)",
"* Extrinsic incubation in mosquito: 2-10 days"]
bullets(cv, vtrans, 0.45, 4.52, 5.65, size=14, color=DARK, line_h=0.28)
# image
img(cv,
"https://cdn.orris.care/cdss_images/pmc_clinical_VQA_7ad6496029f23a8c996fe6a3d391640f83570166a41828c598c139f6866cb60a.jpg",
6.5, 1.3, 6.5, 5.7)
footer(cv, "Source: Firestein & Kelley's Textbook of Rheumatology | Red Book 2021")
def s4_epidemiology(cv):
rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
header(cv, "Global Epidemiology", DARK)
# stat boxes
stats = [("502,264","Reported cases globally\nin 2025 (41 countries)"),
("315,078","Cases in the Americas\nduring 2025 (PAHO)"),
("170","Deaths in the Americas\nduring 2025")]
for i,(num,lbl) in enumerate(stats):
x = 0.4 + i*4.3
rect(cv, x, 1.3, 4.0, 1.5, ORANGE)
text(cv, num, x, 1.45, size=34, bold=True, color=WHITE, align='center', max_w=4.0)
# split label
for j,ln in enumerate(lbl.split("\n")):
text(cv, ln, x, 2.15+j*0.22, size=12, color=WHITE, align='center', max_w=4.0)
# history box
rect(cv, 0.3, 3.05, 7.8, 4.1, TEAL_LIGHT)
text(cv, "Historical Timeline", 0.45, 3.1, size=16, bold=True, color=TEAL)
hist = ["1952 - First identified in Tanzania (Newala district)",
"2004-2007 - Major Indian Ocean & South Asian epidemics",
"2007 - Local transmission in Italy; first European outbreak",
"2013 - First cases in the Americas (Caribbean islands)",
"2014 - Rapid spread; >1 million suspected cases in Americas",
"2019 - WHO lists CHIKV as priority pathogen for R&D",
"2025 - 502,264 global cases; re-emergence in Americas",
"Feb 2026 - PAHO alert; surge in multiple countries"]
bullets(cv, hist, 0.45, 3.45, 7.5, size=13.5, color=DARK, line_h=0.27)
# risk box
rect(cv, 8.35, 3.05, 4.65, 4.1, ORANGE_LIGHT)
text(cv, "High-Risk Groups", 8.5, 3.1, size=16, bold=True, color=ORANGE)
risk = ["* Neonates (perinatal exposure)",
"* Adults > 65 years",
"* Hypertension / diabetes",
"* Cardiovascular disease",
"* Chronic kidney disease",
"* Immunocompromised",
"* Travelers to endemic areas"]
bullets(cv, risk, 8.5, 3.45, 4.35, size=14, color=DARK, line_h=0.29)
footer(cv, "Sources: PAHO Feb 2026 Alert | WHO 2025 data | Red Book 2021")
def s5_clinical(cv):
rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
header(cv, "Clinical Features", ORANGE)
phases = [
("Acute Phase (Days 1-7)", TEAL, TEAL_LIGHT,
["* Abrupt onset high fever (>39 deg C / 102 deg F)",
"* Severe bilateral polyarthralgia",
" (hands, feet, ankles, wrists)",
"* Maculopapular rash (trunk/extremities)",
"* Headache, myalgia",
"* Conjunctivitis, nausea, vomiting",
"* Lab: lymphopenia, thrombocytopenia",
"* Elevated creatinine & aminotransferases"]),
("Sub-acute Phase (Weeks 2-12)", ORANGE, ORANGE_LIGHT,
["* Fever resolves; arthralgia persists",
"* Distal joint polyarthritis",
"* Tenosynovitis",
"* Fatigue, depression",
"* Possible rash relapse",
"* Most patients recover fully",
" within 3 months"]),
("Chronic Phase (> 3 months)", DARK, GREY_LIGHT,
["* Persistent arthralgia / arthritis",
" (up to 50% of adults)",
"* Risk factors: age >50 yrs,",
" severe acute arthritis, OA",
"* RA-like presentation possible",
"* Neuropathic pain component",
"* Duration: months to years"]),
]
for i, (title, hcol, bcol, bul) in enumerate(phases):
x = 0.3 + i * 4.35
rect(cv, x, 1.3, 4.1, 5.65, bcol)
wrap_text(cv, title, x+0.1, 1.38, 3.9, size=15, bold=True, color=hcol, align='center')
line(cv, x+0.1, 1.88, x+4.0, 1.88, hcol, lw=0.8)
bullets(cv, bul, x+0.15, 2.0, 3.8, size=13.5, color=DARK, line_h=0.27)
footer(cv, "Source: Red Book 2021 | Firestein & Kelley's Textbook of Rheumatology")
def s6_rash(cv):
rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
header(cv, "Cutaneous Manifestations & Complications", TEAL)
imgs_data = [
("https://cdn.orris.care/cdss_images/pmc_clinical_VQA_2dc8d4091f443cd466cfb16ff9a3d2d66d2229043535f35e4ea840f73fa4ff6c.jpg",
"Maculopapular rash - neck/chest (acute viral exanthem)"),
("https://cdn.orris.care/cdss_images/pmc_clinical_VQA_b3174275dfdf1e0f8f5b5db78e0ba4f520cfef461e001d0865fab7a30b77611e.jpg",
"Polymorphic lesions: macular to vesiculobullous to hemorrhagic"),
("https://cdn.orris.care/cdss_images/pmc_clinical_VQA_45d57e3230546c53f4cde27140eb88e9e6615528da2cc891d97d80bd3cc2986c.jpg",
"Neonatal chikungunya: petechial rash, ICU care required"),
]
for i, (url, cap) in enumerate(imgs_data):
x = 0.35 + i * 4.35
img(cv, url, x, 1.3, 4.0, 3.3)
wrap_text(cv, cap, x, 4.65, 4.0, size=11, italic=True, color=DARK, align='center')
rect(cv, 0.3, 5.45, 12.7, 1.7, ORANGE_LIGHT)
text(cv, "Severe / Rare Complications", 0.45, 5.52, size=16, bold=True, color=ORANGE)
comp = ["Neurological: Meningoencephalitis | Myelitis | Guillain-Barre | Cranial nerve palsies",
"Cardiac: Myocarditis Ocular: Uveitis, Retinitis Hepatic: Hepatitis Renal: Nephritis",
"Neonatal: Acrocyanosis | Vesicobullous lesions | Limb oedema Haemorrhage (rare)"]
bullets(cv, comp, 0.45, 5.95, 12.2, size=13.5, color=DARK, line_h=0.28)
footer(cv, "Source: Red Book 2021 | Firestein & Kelley's Textbook of Rheumatology | PMC clinical images")
def s7_diagnosis(cv):
rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
header(cv, "Diagnosis", DARK)
cols = [
("Clinical Suspicion", TEAL, TEAL_LIGHT,
["* Acute febrile illness + severe polyarthralgia",
"* Travel to/residence in endemic area",
"* Symptom onset 3-7 days post-exposure",
"* Must differentiate from Dengue & Zika",
" (similar epidemiology, can co-circulate)",
"* Dengue: leukopenia, no prominent arthritis",
"* Zika: milder fever, possible microcephaly"]),
("Laboratory Tests", ORANGE, ORANGE_LIGHT,
["RT-PCR (Days 1-7):",
" * Gold standard for acute infection",
" * Detects CHIKV RNA in serum",
"Serology (Day 5+):",
" * IgM ELISA - persists 30-90 days",
" * Plaque-reduction neutralization test",
"Other findings:",
" * Lymphopenia, thrombocytopenia",
" * Elevated creatinine & aminotransferases"]),
("Reporting & Testing", DARK, GREY_LIGHT,
["* Commercial labs: routine PCR & serology",
"* State health dept labs",
"* CDC: neutralization tests,",
" immunohistochemical staining",
"Reporting (USA):",
"* Nationally notifiable disease",
"* Report to state/local health dept",
"* CDC ArboNET surveillance system",
"* Standard precautions for inpatients"]),
]
for i, (title, hcol, bcol, bul) in enumerate(cols):
x = 0.3 + i * 4.35
rect(cv, x, 1.3, 4.1, 5.65, bcol)
wrap_text(cv, title, x+0.1, 1.38, 3.9, size=15, bold=True, color=hcol, align='center')
line(cv, x+0.1, 1.85, x+4.0, 1.85, hcol, lw=0.8)
bullets(cv, bul, x+0.15, 1.97, 3.8, size=13.5, color=DARK, line_h=0.265)
footer(cv, "Source: Red Book 2021 | CDC Guidelines")
def s8_treatment(cv):
rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
header(cv, "Treatment & Management", ORANGE)
rect(cv, 0.3, 1.3, 12.7, 0.72, YELLOW_WARN)
wrap_text(cv, "No approved antiviral therapy exists for Chikungunya - management is entirely supportive",
0.45, 1.38, 12.3, size=15, bold=True, color=ORANGE_DARK, align='center')
cols = [
("Acute Phase Care", TEAL, TEAL_LIGHT,
["* Rest and adequate fluid intake",
"* Paracetamol (acetaminophen) - preferred",
" for fever and joint pain",
"* Avoid NSAIDs until dengue ruled out",
" (risk of haemorrhagic complications)",
"* Avoid aspirin in children",
"* Monitor for severe complications"]),
("Chronic / Persistent Arthritis", ORANGE, ORANGE_LIGHT,
["* NSAIDs - once dengue excluded",
"* Corticosteroids - for severe arthritis",
"* Physiotherapy & rehabilitation",
"* Hydroxychloroquine - refractory cases",
"* Methotrexate - severe persistent cases",
"* Pain management (neuropathic component)"]),
("Hospitalisation Indications", DARK, GREY_LIGHT,
["* Neurological complications",
" (encephalitis, Guillain-Barre)",
"* Severe myocarditis / cardiac failure",
"* Neonatal chikungunya",
"* Elderly with multi-organ involvement",
"* Haemorrhagic manifestations",
"* Inability to maintain oral intake",
"* Standard precautions apply"]),
]
for i, (title, hcol, bcol, bul) in enumerate(cols):
x = 0.3 + i * 4.35
rect(cv, x, 2.2, 4.1, 4.75, bcol)
wrap_text(cv, title, x+0.1, 2.28, 3.9, size=15, bold=True, color=hcol, align='center')
line(cv, x+0.1, 2.75, x+4.0, 2.75, hcol, lw=0.8)
bullets(cv, bul, x+0.15, 2.87, 3.8, size=13.5, color=DARK, line_h=0.28)
footer(cv, "Source: Red Book 2021 | Washington Manual of Medical Therapeutics")
def s9_prevention(cv):
rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
header(cv, "Prevention & Control", TEAL)
rect(cv, 0.3, 1.3, 6.1, 3.7, TEAL_LIGHT)
text(cv, "Personal Protection Measures", 0.45, 1.38, size=16, bold=True, color=TEAL)
pers = ["* Use EPA-registered insect repellents",
" (DEET, picaridin, IR3535, oil of lemon eucalyptus)",
"* Wear long-sleeved shirts and long trousers",
"* Sleep under insecticide-treated bed nets",
"* Stay in screened or air-conditioned rooms",
"* Limit outdoor activity at peak mosquito feeding",
" times (dawn and dusk)",
"* Use permethrin-treated clothing for travel"]
bullets(cv, pers, 0.45, 1.68, 5.8, size=14, color=DARK, line_h=0.27)
rect(cv, 0.3, 5.1, 6.1, 2.1, ORANGE_LIGHT)
text(cv, "Vaccine Status (2026)", 0.45, 5.17, size=16, bold=True, color=ORANGE)
vacc = ["* IXCHIQ (Valneva VLA1553) - FDA-approved Nov 2023",
" Live attenuated; single-dose for adults >=18 yrs",
"* Indicated for travelers to endemic areas",
"* Not yet for children or immunocompromised",
"* WHO lists CHIKV as R&D priority pathogen"]
bullets(cv, vacc, 0.45, 5.47, 5.8, size=13.5, color=DARK, line_h=0.265)
rect(cv, 6.6, 1.3, 6.5, 3.35, GREY_LIGHT)
text(cv, "Vector Control", 6.75, 1.38, size=16, bold=True, color=DARK)
vect = ["* Eliminate standing water (breeding sites)",
"* Cover water storage containers",
"* Larviciding of water bodies",
"* Indoor residual spraying",
"* Biological control (Bacillus thuringiensis)",
"* Community-based surveillance and clean-up"]
bullets(cv, vect, 6.75, 1.68, 6.2, size=14, color=DARK, line_h=0.27)
rect(cv, 6.6, 4.75, 6.5, 2.45, TEAL_LIGHT)
text(cv, "Surveillance & Blood Safety", 6.75, 4.82, size=16, bold=True, color=TEAL)
surv = ["* Protect symptomatic febrile patients from",
" mosquito bites to prevent further spread",
"* Screen blood and organ donations",
"* Report suspected cases to public health authorities",
"* ArboNET surveillance (USA) | PAHO PLISA (Americas)"]
bullets(cv, surv, 6.75, 5.14, 6.2, size=14, color=DARK, line_h=0.27)
footer(cv, "Source: Red Book 2021 | CDC | PAHO | FDA (IXCHIQ approval 2023)")
def s10_differential(cv):
rect(cv, 0, 0, W_IN, H_IN, LIGHT_BG)
header(cv, "Differential Diagnosis", DARK)
headers_row = ["Feature", "Chikungunya", "Dengue", "Zika"]
rows_data = [
["Fever", "High (>39 C), biphasic", "High, sudden onset", "Low-grade / absent"],
["Arthralgia", "Severe, bilateral, distal", "Mild ('breakbone')", "Mild, fleeting"],
["Rash", "Maculopapular, trunk/limbs","Maculopapular", "Diffuse maculopapular"],
["Haemorrhage", "Rare", "Common (severe dengue)","Very rare"],
["Neurological", "Rare but possible", "Dengue encephalopathy", "GBS, microcephaly"],
["Leucopenia", "Mild lymphopenia", "Prominent", "Mild"],
["Thrombocytopenia","Mild", "Significant", "Mild"],
["Transmission", "Aedes mosquito", "Aedes mosquito", "Aedes + sexual"],
["Vaccine", "IXCHIQ (FDA 2023)", "Dengvaxia (limited)", "None approved"],
]
col_w = [2.35, 3.35, 3.35, 3.45]
col_x = [0.3, 2.7, 6.1, 9.5]
hdr_cols = [DARK, ORANGE, TEAL, c(55, 88, 22)]
row_h = 0.55
start_y = 1.3
# header
for ci,(h,cx,cw,hc) in enumerate(zip(headers_row, col_x, col_w, hdr_cols)):
rect(cv, cx, start_y, cw, 0.58, hc)
text(cv, h, cx, start_y+0.12, size=15, bold=True, color=WHITE, align='center', max_w=cw)
# rows
for ri, row in enumerate(rows_data):
y = start_y + 0.58 + ri * row_h
bg = LIGHT_BG if ri % 2 == 0 else EVEN_ROW
for ci,(cell,cx,cw) in enumerate(zip(row,col_x,col_w)):
rect(cv, cx, y, cw, row_h, bg)
fc = TEAL if ci==1 else (ORANGE if ci==2 else (GREEN_DARK if ci==3 else DARK))
wrap_text(cv, cell, cx+0.08, y+0.12, cw-0.15, size=12.5,
bold=(ci==0), color=fc if ci>0 else DARK)
footer(cv, "Source: Red Book 2021 | Harrison's Principles of Internal Medicine 22E")
def s11_takeaways(cv):
rect(cv, 0, 0, W_IN, H_IN, DARK)
cv.saveState()
cv.setFillColorRGB(*TEAL)
cv.circle(-0.3*inch, (H_IN+0.3)*inch, 1.8*inch, fill=1, stroke=0)
cv.setFillColorRGB(*ORANGE)
cv.circle(12.8*inch, 0.7*inch, 1.4*inch, fill=1, stroke=0)
cv.restoreState()
text(cv, "Key Takeaways", 0.5, 0.28, size=36, bold=True, color=WHITE)
line(cv, 0.5, 1.15, 8.5, 1.15, ORANGE, lw=1.5)
points = [
("1", "CHIKV is a re-emerging global threat - 502K+ cases in 2025; PAHO issued alert Feb 2026 for the Americas."),
("2", "Cardinal features: sudden high fever + severe, debilitating polyarthralgia + maculopapular rash."),
("3", "Transmitted by Aedes mosquitoes. No person-to-person spread; rare vertical and bloodborne transmission."),
("4", "Must differentiate from Dengue and Zika - all three arboviruses co-circulate in tropical regions."),
("5", "Diagnosis: RT-PCR in week 1; IgM serology from day 5. Notify public health authorities promptly."),
("6", "Treatment is supportive only - no antiviral. Paracetamol first; NSAIDs/steroids for chronic arthritis."),
("7", "First vaccine (IXCHIQ) FDA-approved 2023 for adult travelers - a new era in CHIKV prevention."),
]
for i, (num, pt) in enumerate(points):
y = 1.3 + i * 0.85
cv.saveState()
cv.setFillColorRGB(*ORANGE)
cv.circle((0.73)*inch, (H_IN - y - 0.27)*inch, 0.22*inch, fill=1, stroke=0)
cv.restoreState()
text(cv, num, 0.51, y+0.06, size=14, bold=True, color=WHITE, align='center', max_w=0.44)
wrap_text(cv, pt, 1.1, y+0.02, 12.0, size=14.5, color=WHITE, line_h=0.26)
# ── Build PDF ────────────────────────────────────────────────────
cv = canvas.Canvas(OUT, pagesize=(W_PT, H_PT))
cv.setTitle("Chikungunya - A Mosquito-Borne Viral Disease")
cv.setAuthor("Orris Medical AI")
cv.setSubject("Chikungunya Epidemiology, Pathogenesis, Clinical Features, Diagnosis, Treatment, Prevention")
slides = [s1_title, s2_overview, s3_virology, s4_epidemiology,
s5_clinical, s6_rash, s7_diagnosis, s8_treatment,
s9_prevention, s10_differential, s11_takeaways]
for i, fn in enumerate(slides, 1):
print(f" Rendering slide {i}/{len(slides)}...", end=" ", flush=True)
fn(cv)
cv.showPage()
print("done")
cv.save()
size = os.path.getsize(OUT)
print(f"\nSaved: {OUT} ({size:,} bytes, {len(slides)} pages)")
cd /tmp/workspace/chikungunya-ppt && python pptx_to_pdf.py 2>&1
Chikungunya
PDF Document · PDF