Generate a printable PDF almanac from structured JSON data using Jinja2 templates and WeasyPrint.
- Python 3.10 or newer
uvfor managing the virtual environment and dependencies (preferred)- System packages required by WeasyPrint (e.g.
libpango,cairo,gdk-pixbuf, andlibffi). Refer to the WeasyPrint installation guide for your platform.
-
Install uv (skip if you already have it):
curl -LsSf https://astral.sh/uv/install.sh | shAfter installation, ensure that
uvis on yourPATH(restart your shell if necessary). -
Install project dependencies:
uv sync
This command creates an isolated virtual environment (by default at
.venv/) and installs the packages listed inpyproject.toml.
Generate the PDF almanac with:
uv run python main.pyThe script reads data.json, renders the index.html template with Jinja2, applies style.css, and saves the resulting PDF as almanac.pdf in the project root.
- Update
data.jsonto change the content rendered into the template. - Modify
index.htmlto adjust the HTML layout or include new data fields. The Jinja2 environment is configured withStrictUndefined, so missing values will cause a helpful error. - Edit
style.cssto tweak typography or layout in the final PDF.
Run uv run python main.py again after making changes to regenerate the PDF.
- If uv reports missing system libraries during installation, install the required packages using your OS package manager and rerun
uv sync. - For PDF rendering issues, check the console output for template or JSON errors and verify that all paths referenced in the template exist.