🐍 Python

HTML to PDF in Python

Generate PDFs from HTML in your Django, Flask, or FastAPI app with a single requests call. No WeasyPrint, no GTK/Cairo system libraries, no Chromium binary to manage.

Quickstart

Requires only the requests library — already in most Python projects.

generate_pdf.py
<span class="kw">import</span> requests
<span class="kw">import</span> os

RENDERLY_KEY = os.environ[<span class="str">"RENDERLY_API_KEY"</span>]

html = <span class="str">"""
&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;&lt;style&gt;body { font-family: sans-serif; padding: 2rem; }&lt;/style&gt;&lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;Invoice #042&lt;/h1&gt;
    &lt;p&gt;Total: €1,500.00&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;
"""</span>

res = requests.<span class="fn">post</span>(
    <span class="str">"https://api.renderlyapi.com/v1/pdf/from-html"</span>,
    headers={<span class="str">"Authorization"</span>: <span class="str">f"Bearer {RENDERLY_KEY}"</span>},
    json={
        <span class="str">"html"</span>: html,
        <span class="str">"format"</span>: <span class="str">"A4"</span>,          <span class="cm"># or "Letter"</span>
        <span class="str">"marginTop"</span>: <span class="str">"20mm"</span>,
        <span class="str">"landscape"</span>: <span class="kw">False</span>,
    },
)
res.<span class="fn">raise_for_status</span>()

<span class="kw">with</span> <span class="fn">open</span>(<span class="str">"invoice.pdf"</span>, <span class="str">"wb"</span>) <span class="kw">as</span> f:
    f.<span class="fn">write</span>(res.content)

<span class="fn">print</span>(<span class="str">"PDF saved!"</span>)

Django view example

views.py
<span class="kw">from</span> django.http <span class="kw">import</span> HttpResponse
<span class="kw">from</span> django.template.loader <span class="kw">import</span> render_to_string
<span class="kw">import</span> requests, os

<span class="kw">def</span> <span class="fn">invoice_pdf</span>(request, invoice_id):
    invoice = <span class="fn">get_object_or_404</span>(Invoice, pk=invoice_id)
    html = <span class="fn">render_to_string</span>(<span class="str">"invoices/pdf.html"</span>, {<span class="str">"invoice"</span>: invoice})

    res = requests.<span class="fn">post</span>(
        <span class="str">"https://api.renderlyapi.com/v1/pdf/from-html"</span>,
        headers={<span class="str">"Authorization"</span>: <span class="str">f"Bearer {os.environ['RENDERLY_API_KEY']}"</span>},
        json={<span class="str">"html"</span>: html, <span class="str">"format"</span>: <span class="str">"A4"</span>},
    )
    res.<span class="fn">raise_for_status</span>()

    <span class="kw">return</span> <span class="fn">HttpResponse</span>(
        res.content,
        content_type=<span class="str">"application/pdf"</span>,
        headers={<span class="str">"Content-Disposition"</span>: <span class="str">f'attachment; filename="invoice-{invoice.id}.pdf"'</span>},
    )

Also available for

Generate your first PDF

Free account · API key in 60 seconds · No credit card

Get started free →