⬡ Node.js

HTML to PDF in Node.js

Generate pixel-perfect PDFs from HTML in your Node.js or Express app with a single fetch call — no Puppeteer, no Chromium binary, no system dependencies.

Quickstart

No package to install. Just use the native fetch API available in Node 18+.

generate-pdf.mjs
<span class="kw">const</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>;

<span class="kw">const</span> res = <span class="kw">await</span> fetch(<span class="str">'https://api.renderlyapi.com/v1/pdf/from-html'</span>, {
  method: <span class="str">'POST'</span>,
  headers: {
    <span class="str">'Authorization'</span>: <span class="str">'Bearer rly_live_YOUR_KEY'</span>,
    <span class="str">'Content-Type'</span>: <span class="str">'application/json'</span>,
  },
  body: JSON.<span class="fn">stringify</span>({
    html,
    format: <span class="str">'A4'</span>,          <span class="cm">// or 'Letter'</span>
    marginTop: <span class="str">'20mm'</span>,    <span class="cm">// optional margins</span>
    landscape: <span class="kw">false</span>,
  }),
});

<span class="kw">if</span> (!res.ok) <span class="kw">throw new</span> <span class="fn">Error</span>(<span class="str">`Renderly error: ${res.status}`</span>);

<span class="kw">const</span> pdfBuffer = Buffer.<span class="fn">from</span>(<span class="kw">await</span> res.<span class="fn">arrayBuffer</span>());
<span class="cm">// Stream to HTTP response:</span>
<span class="cm">// res.setHeader('Content-Type', 'application/pdf');</span>
<span class="cm">// res.send(pdfBuffer);</span>
<span class="cm">// Or save to disk:</span>
<span class="kw">import</span> fs <span class="kw">from</span> <span class="str">'fs'</span>;
fs.<span class="fn">writeFileSync</span>(<span class="str">'invoice.pdf'</span>, pdfBuffer);
console.<span class="fn">log</span>(<span class="str">'PDF saved!'</span>);

Express integration

routes/pdf.js
app.<span class="fn">get</span>(<span class="str">'/invoice/:id/pdf'</span>, <span class="kw">async</span> (req, res) => {
  <span class="kw">const</span> invoice = <span class="kw">await</span> <span class="fn">getInvoice</span>(req.params.id);
  <span class="kw">const</span> html = <span class="fn">renderInvoiceHTML</span>(invoice);

  <span class="kw">const</span> pdfRes = <span class="kw">await</span> fetch(<span class="str">'https://api.renderlyapi.com/v1/pdf/from-html'</span>, {
    method: <span class="str">'POST'</span>,
    headers: {
      <span class="str">'Authorization'</span>: <span class="str">`Bearer ${process.env.RENDERLY_API_KEY}`</span>,
      <span class="str">'Content-Type'</span>: <span class="str">'application/json'</span>,
    },
    body: JSON.<span class="fn">stringify</span>({ html, format: <span class="str">'A4'</span> }),
  });

  res.<span class="fn">setHeader</span>(<span class="str">'Content-Type'</span>, <span class="str">'application/pdf'</span>);
  res.<span class="fn">setHeader</span>(<span class="str">'Content-Disposition'</span>, <span class="str">`attachment; filename="invoice-${invoice.id}.pdf"`</span>);
  pdfRes.body.<span class="fn">pipe</span>(res);
});

3-step setup

1

Get your free API key

Sign up at renderlyapi.com — your API key is generated instantly. No credit card, 50 free PDFs/month included.

2

Set RENDERLY_API_KEY in your .env

Store your key as an environment variable. Never hard-code it in source files.

3

Call the API

POST your HTML string to /v1/pdf/from-html. You'll receive a binary PDF response in under 200ms.

Also available for

Generate your first PDF

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

Get started free →