django-advanced-pdf
django-advanced-pdf is a Django app for building PDFs from XML templates (with Django template syntax), powered by ReportLab.
This repository contains:
- the reusable package:
django_advanced_pdf/ - a runnable Django demo project:
django_examples/
What this project does
You can generate PDFs by:
- Rendering XML stored in the database (
PrintingTemplate) - Rendering XML files from templates
- Rendering in background tasks (Celery helper included)
The XML supports rich layout features such as:
- tables, row/column spans, nested tables
- custom style blocks and inline style attributes
- page borders and page-level pager/header/footer blocks
- conditional/hidden rows/columns
- overflow handling for long cells
- embedded PNG/SVG and object injection
Quick start (Docker, easiest)
From repository root:
docker compose up --build
Then open:
http://localhost:8012/(example app)
The compose stack includes:
- Django app
- Postgres (
db_pdf) - Redis (
redis) - Celery worker
Local setup (without Docker)
1) Install dependencies
python -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
2) Configure database/cache for the demo app
The example project settings are in:
django_examples/django_examples/settings.py
By default, the demo uses Postgres + Redis hostnames intended for Docker:
- DB host:
db_pdf - Redis host:
redison port6380
If running fully local, update these to your local services.
3) Run migrations and start server
cd django_examples
python manage.py migrate
python manage.py runserver 0.0.0.0:8012
4) (Optional) load sample data
python manage.py import_advanced_pdf
Integrate into your own Django project
1) Install package
pip install django-advanced-pdf
2) Add app
INSTALLED_APPS = [
# ...
"django_advanced_pdf",
]
3) Include URLs (for task PDF download/modal helpers)
from django.urls import include, path
urlpatterns = [
# ...
path("pdf/", include("django_advanced_pdf.urls", namespace="django_advanced_pdf")),
]
Common usage patterns
A) Render from a database template (PrintingTemplate)
from django_advanced_pdf.models import PrintingTemplate
template = PrintingTemplate.objects.get(name="invoice")
result = template.make_pdf(context={"invoice": invoice})
pdf_bytes = result["pdf_data"].getvalue()
has_xml_warnings = result["has_potential_xml_errors"]
B) Render XML directly with ReportXML
from django_advanced_pdf.engine.report_xml import ReportXML
xml = """
<document title="Example" page_size="A4">
<table>
<tr><td>Hello world</td></tr>
</table>
</document>
"""
report = ReportXML()
buffer = report.load_xml_and_make_pdf(xml)
pdf_bytes = buffer.getvalue()
C) Class-based view for database templates
Inherit from django_advanced_pdf.views.standard.DatabasePDFView and set the model instance.
XML template quick reference
Root element
<document
title="My report"
page_size="A4"
page_orientation="portrait"
page_style="borders"
border_top_first="10"
border_bottom_first="10"
border_left_first="10"
border_right_first="10">
...
</document>
Frequently used tags
<style>...</style>: define reusable classes<table>,<tr>,<td>: table layout<header>,<footer>inside table<keep>wrapper for “keep-with-next” row groups<p>: paragraph block<spacer style="height:10"><page_break/><obj ...>: inject Python objects fromobject_lookup<pagers><pager ...>...</pager></pagers>: page-level fixed blocks
Styling
Styles are CSS-like but mapped to ReportLab table/paragraph options. Examples seen in this repository:
inner_grid:0.25,#000000box:0.5,#000000text_color:#0000FFbackground:#F0F0F0line_below:0.5,#000000left_padding:1
Reference examples:
django_examples/advanced_pdf_examples/templates/file_examples/basic.xml.../border.xml.../pager.xml.../hidden.xml
Background task flow (Celery)
The helper base class is:
django_advanced_pdf.tasks.TaskProcessPDFHelper
Typical flow:
- build PDF in task (
build_pdf) - save bytes + filename to Django cache
- redirect user to
django_advanced_pdf:view_task_pdffor download - or open modal via
django_advanced_pdf:view_task_pdf_modal
Example task implementation:
django_examples/advanced_pdf_examples/tasks.py
Demo routes worth checking
From the demo project root URL:
/database templates demo/files/file-based XML demos/view/companies/context-driven companies PDF/report/example/merged report sample/report/headed-notepaper/background image example/tasks/<slug>/task/modal examples
Running tests
Package tests live in:
django_advanced_pdf/tests.py
Run:
python -m unittest django_advanced_pdf.tests
Troubleshooting
- Blank/failed output: check malformed XML and inspect
has_potential_xml_errors. - Task PDF not downloadable: verify cache backend + Redis connectivity.
- Demo app DB errors: ensure Postgres connection values match your environment.
- Missing static/demo assets: run from repo layout expected by
django_examples.
Demo video
An automated demo recording script is included at:
scripts/create_demo_video.py
It starts the Django example project with demo-friendly settings
(django_examples.settings_demo), walks through a few routes, and saves a
video to demo/django-advanced-pdf-demo.mp4.
Generate locally
pip3 install -r requirements.txt
pip3 install playwright
python3 -m playwright install chromium
python3 scripts/create_demo_video.py
License
MIT (see LICENSE).
Metadata
Release files for django-advanced-pdf 0.2.24
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| django_advanced_pdf-0.2.24.tar.gz | 4.3 MB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_advanced_pdf-0.2.24-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 8.5 MB
Release files / django_advanced_pdf-0.2.24.tar.gz
| Download URL | django_advanced_pdf-0.2.24.tar.gz |
|---|---|
| Size | 4.3 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
38369d1bfa1a0b8fd7ccbd88f34a369e6183bd5dfaa9a8be28bccc9d4b1c700a
|
|
BLAKE2b-256 checksum How to use checksums |
8f4edfabd31c117bebaff83ef412dba1da02f7694088cbed7459a4ca565ae628
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.
Transparency logRelease files / django_advanced_pdf-0.2.24-py3-none-any.whl
| Download URL | django_advanced_pdf-0.2.24-py3-none-any.whl |
|---|---|
| Size | 4.3 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
98b6d6566b3e8582cd6c5ab55f280e30d6eef00c0225a3f6bc446d101f06d9e0
|
|
BLAKE2b-256 checksum How to use checksums |
5fd9ea3bdbeb7574d435bbff5b0a9dbab0f38c2f667a63a214a365f52bbfee53
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.
Transparency logSecurity for django-advanced-pdf 0.2.24
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for django_advanced_pdf-0.2.24.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.