We address How to create a poster from a paper and How to evaluate poster.


--max_workers.datasetPosterAgent is a top-down, visual-in-the-loop multi-agent system from paper.pdf to editable poster.pptx.

We provide a lightweight skill (without the need of dependency) in skills/ for AI agents such as Codex or Claude to help prepare poster-ready content from a paper.
For example, in Codex, you can invoke:
Use $paper2poster-poster to turn this paper into a poster package.
See skills/README.md for more examples.
Our Paper2Poster supports both local deployment (via vLLM) or API-based access (e.g., GPT-4o).
Python Environment
pip install -r requirements.txt
Install Libreoffice
sudo apt install libreoffice
or, if you do not have sudo access, download soffice executable directly: https://www.libreoffice.org/download/download-libreoffice/, and add the executable directory to your $PATH.
Install poppler
conda install -c conda-forge poppler
API Key
Create a .env file in the project root and add your OpenAI API key:
OPENAI_API_KEY=<your_openai_api_key>
Optional: Google Search API (for logo search)
To use Google Custom Search for more reliable logo search, add these to your .env file:
GOOGLE_SEARCH_API_KEY=<your_google_search_api_key>
GOOGLE_SEARCH_ENGINE_ID=<your_search_engine_id>
For easier deployment, you can use Docker to run Paper2Poster without manual dependency installation.
Build the Docker image:
docker build -t paper2poster .
Troubleshooting:
- If you get a "permission denied" error when running Docker commands, use sudo before Docker commands (e.g., sudo docker build -t paper2poster .)
Example:
# Create output directory if it doesn't exist
mkdir -p <4o_4o>_generated_posters
docker run --rm \
-e OPENAI_API_KEY=<your_openai_api_key> \
-v "$(pwd)/Paper2Poster-data:/Paper2Poster-data" \
-v "$(pwd)/<4o_4o>_generated_posters:/app/<4o_4o>_generated_posters" \
paper2poster \
python -m PosterAgent.new_pipeline \
--poster_path="/Paper2Poster-data/<paper_name>/paper.pdf" \
--model_name_t=4o \
--model_name_v=4o \
--poster_width_inches=48 \
--poster_height_inches=36
The generated poster will be saved in <4o_4o>_generated_posters/Paper2Poster-data/paper_name/poster.pptx on your host machine.
Create a folder named {paper_name} under {dataset_dir}, and place your paper inside it as a PDF file named paper.pdf.
📁 {dataset_dir}/
└── 📁 {paper_name}/
└── 📄 paper.pdf
To use open-source models, you need to first deploy them using vLLM, ensuring the port is correctly specified in the get_agent_config() function in utils/wei_utils.py.
GPT-4o:python -m PosterAgent.new_pipeline \
--poster_path="${dataset_dir}/${paper_name}/paper.pdf" \
--model_name_t="4o" \ # LLM
--model_name_v="4o" \ # VLM
--poster_width_inches=48 \
--poster_height_inches=36
Qwen-2.5-7B-Instruct and GPT-4o:python -m PosterAgent.new_pipeline \
--poster_path="${dataset_dir}/${paper_name}/paper.pdf" \
--model_name_t="vllm_qwen" \ # LLM
--model_name_v="4o" \ # VLM
--poster_width_inches=48 \
--poster_height_inches=36 \
--no_blank_detection # An option to disable blank detection
Qwen-2.5-7B-Instruct:python -m PosterAgent.new_pipeline \
--poster_path="${dataset_dir}/${paper_name}/paper.pdf" \
--model_name_t="vllm_qwen" \ # LLM
--model_name_v="vllm_qwen_vl" \ # VLM
--poster_width_inches=48 \
--poster_height_inches=36
PosterAgent supports flexible combination of LLM / VLM, feel free to try other options, or customize your own settings in get_agent_config() in utils/wei_utils.py.
You can automatically add institutional and conference logos to your posters:
python -m PosterAgent.new_pipeline \
--poster_path="${dataset_dir}/${paper_name}/paper.pdf" \
--model_name_t="4o" \
--model_name_v="4o" \
--poster_width_inches=48 \
--poster_height_inches=36 \
--conference_venue="NeurIPS" # Automatically searches for conference logo
Logo Search Strategy:
1. Local search: First checks the provided logo store (logo_store/institutes/ and logo_store/conferences/)
2. Web search: If not found locally, performs online search
- By default, uses DuckDuckGo (no API key required)
- For more reliable results, use --use_google_search (requires GOOGLE_SEARCH_API_KEY and GOOGLE_SEARCH_ENGINE_ID in .env)
You can also specify custom logo paths to skip auto-detection:
--institution_logo_path="path/to/institution_logo.png" \
--conference_logo_path="path/to/conference_logo.png"
Customize poster appearance via YAML configuration files:
- Global defaults: config/poster.yaml (applies to all posters)
- Per-poster override: Place poster.yaml next to your paper.pdf for custom styling
Download Paper2Poster evaluation dataset via:
python -m PosterAgent.create_dataset
In evaluation, papers are stored under a directory called Paper2Poster-data.
To evaluate a generated poster with PaperQuiz:
python -m Paper2Poster-eval.eval_poster_pipeline \
--paper_name="${paper_name}" \
--poster_method="${model_t}_${model_v}_generated_posters" \
--metric=qa # PaperQuiz
To evaluate a generated poster with VLM-as-Judge:
python -m Paper2Poster-eval.eval_poster_pipeline \
--paper_name="${paper_name}" \
--poster_method="${model_t}_${model_v}_generated_posters" \
--metric=judge # VLM-as-Judge
To evaluate a generated poster with other statistical metrics (such as visual similarity, PPL, etc):
python -m Paper2Poster-eval.eval_poster_pipeline \
--paper_name="${paper_name}" \
--poster_method="${model_t}_${model_v}_generated_posters" \
--metric=stats # statistical measures
If you want to create a PaperQuiz for your own paper:
python -m Paper2Poster-eval.create_paper_questions \
--paper_folder="Paper2Poster-data/${paper_name}"
We extend our gratitude to 🐫CAMEL, 🦉OWL, Docling, PPTAgent for providing their codebases.
Please kindly cite our paper if you find this project helpful.
@misc{paper2poster,
title={Paper2Poster: Towards Multimodal Poster Automation from Scientific Papers},
author={Wei Pang and Kevin Qinghong Lin and Xiangru Jian and Xi He and Philip Torr},
year={2025},
eprint={2505.21497},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2505.21497},
}
$ claude mcp add Paper2Poster \
-- python -m otcore.mcp_server <graph>