Poster Skill
Build a single large-format academic poster — one giant canvas, read at standing distance, organized into columns. This is fundamentally different from a slide deck: no "one idea per page," no 16:9 frames. Everything below is tuned for that.
Quick Reference
| Task | Guide |
|---|---|
| Decide size & orientation | Ask the user first — see Choosing the Canvas |
| Build the poster | Read poster.md for the full pptxgenjs recipe (layout, type scale, sections) |
| Pull a figure/table from the paper PDF | python ../pptx/scripts/crop_image.py — measure with --profile, then cut (see Figures) |
| Read an existing poster's content | python -m markitdown poster.pptx |
| Render for QA / print | See Rendering & QA |
This skill reuses the pptx skill's scripts by relative path — crop_image.py
for figure cropping and office/ for PDF conversion live in ../pptx/scripts/.
No copies are kept here, so there's nothing to maintain twice. This assumes the
poster and pptx skills sit side by side in the same repo (the layout of this
collection); if you relocate this skill on its own, copy those scripts in or
adjust the paths.
Workflow
- Choose the canvas — ask the user for size + orientation (see below). Do not guess.
- Gather content — get the paper (PDF), title, authors, affiliations, the key figures/tables, and the take-home message. A poster has a strict content budget; help the user cut, don't cram.
- Crop figures from the source PDF at high DPI (see Figures).
- Build with pptxgenjs on a custom-sized single page — read poster.md.
- Render → inspect → fix with subagents (see Rendering & QA).
- Export print-ready PDF.
Choosing the Canvas
Always ask the user for orientation and size before building — it changes the entire column layout, and conferences mandate specific dimensions. Don't assume.
Common standards (width × height):
| Name | Portrait | Landscape | Notes |
|---|---|---|---|
| A0 | 841 × 1189 mm (33.1 × 46.8 in) | 1189 × 841 mm | ISO standard, common in EU/Asia |
| A1 | 594 × 841 mm | 841 × 594 mm | Smaller; some travel-friendly sessions |
| 48×36 in | 36 × 48 in | 48 × 36 in | Common in North America |
| 42×42 in | square | square | Some ACM/IEEE venues |
pptxgenjs uses inches. Convert mm → in by ÷ 25.4. Set a custom layout:
pres.defineLayout({ name: 'A0P', width: 33.1, height: 46.8 }); // A0 portrait
pres.layout = 'A0P';
Portrait → typically 2 columns. Landscape → typically 3 columns (sometimes 4). This choice drives everything in poster.md.
Figures: the Main Event
On a poster, figures and tables carry the message — readers scan visuals first and read prose second. Pull them from the original paper PDF at high resolution, never reuse a low-res screenshot.
Use the shared cropper. Full edge-measuring methodology lives in the pptx skill's docs, but the essentials:
# 1. LOCATE — render the page to see where the figure sits (use 400+ DPI; posters
# print large, so go higher than you would for slides).
python ../pptx/scripts/crop_image.py paper.pdf page5.png --page 5 --dpi 600
# 2. MEASURE the tight edge instead of eyeballing it (h = top/bottom row, v = left/right col):
python ../pptx/scripts/crop_image.py paper.pdf /dev/null --page 5 --dpi 600 \
--profile h --region 0.05,0.21,0.49,0.28
# 3. CUT with the measured box. --trim cleans residual margin, --pad adds room.
# Do NOT use --trim on tables/algorithm boxes — it shaves the bounding rules.
python ../pptx/scripts/crop_image.py paper.pdf fig3.png --page 5 --dpi 600 \
--frac 0.05,0.075,0.49,0.251 --pad 16
Key reminders (the rest is in poster.md and pptx docs):
- Go higher DPI than slides — 400–600. A figure that looks fine on screen can be visibly soft when printed at 1m+ across.
- The edge belongs in the blank gap after the content, not on the last inked line.
- Always exclude the caption ("Figure N:" / "Table N:") — you'll re-label it on the poster.
- After cropping, Read the output and check all four edges are intact.
Rendering & QA
Assume the first render is wrong. Posters fail in ways slides don't: a column overflows the page bottom, the reading order is ambiguous, body text is too small to read at distance, a 600-DPI figure got placed at thumbnail size.
Render to an image
python ../pptx/scripts/office/soffice.py --headless --convert-to pdf poster.pptx
pdftoppm -jpeg -r 100 poster.pdf poster # one big poster-01.jpg
For a poster, also render a high-res crop of each column so text legibility is actually checkable (a single downscaled full-page JPG hides small-text problems):
pdftoppm -jpeg -r 200 poster.pdf poster-hi
Visual QA — USE A SUBAGENT with fresh eyes
Inspect this academic poster. Assume there are issues — find them.
Poster-specific checks:
- Is the READING ORDER unambiguous? (columns top-to-bottom, left-to-right — a reader
shouldn't have to guess where to go next)
- Does any column overflow past the bottom margin, or end with a big empty gap?
- Is body text large enough to read at standing distance? (see type scale in poster.md)
- Are figures placed large enough to matter, and is every figure referenced/numbered?
- Title bar: title, all authors, affiliations, and conference/logo present and legible?
- Are the section blocks visually balanced across columns (no one column stuffed)?
- Standard slide checks too: overlap, low contrast, < 0.5in margins, cramped gaps.
Read these images: <paths>. Report ALL issues, even minor.
Loop
Render → list issues → fix → re-render affected area → repeat until a full pass is clean. Do not declare success until at least one fix-and-verify cycle is done.
Content QA
python -m markitdown poster.pptx
python -m markitdown poster.pptx | grep -iE "xxxx|lorem|ipsum|placeholder|your name|affiliation"
Fix any placeholder leftovers before finishing.
Dependencies
npm install -g pptxgenjs— building the posterpip install "markitdown[pptx]"— reading contentpip install Pillow numpy— figure cropping (../pptx/scripts/crop_image.py)- LibreOffice (
soffice) — PDF conversion (via../pptx/scripts/office/soffice.py) - Poppler (
pdftoppm) — PDF → image