Generate pixel-perfect PDFs from HTML in your Laravel, Symfony, or plain PHP project with cURL or Guzzle. No TCPDF, no DomPDF quirks, no Chromium headaches.
<span class="kw"><?php</span>
<span class="kw">$html</span> = <span class="str">'<!DOCTYPE html>
<html>
<head><style>body { font-family: sans-serif; padding: 2rem; }</style></head>
<body><h1>Invoice #042</h1><p>Total: €1,500.00</p></body>
</html>'</span>;
<span class="kw">$ch</span> = curl_init(<span class="str">'https://api.renderlyapi.com/v1/pdf/from-html'</span>);
curl_setopt_array(<span class="kw">$ch</span>, [
CURLOPT_RETURNTRANSFER => <span class="kw">true</span>,
CURLOPT_POST => <span class="kw">true</span>,
CURLOPT_HTTPHEADER => [
<span class="str">'Authorization: Bearer '</span> . getenv(<span class="str">'RENDERLY_API_KEY'</span>),
<span class="str">'Content-Type: application/json'</span>,
],
CURLOPT_POSTFIELDS => json_encode([
<span class="str">'html'</span> => <span class="kw">$html</span>,
<span class="str">'format'</span> => <span class="str">'A4'</span>,
<span class="str">'marginTop'</span> => <span class="str">'20mm'</span>,
]),
]);
<span class="kw">$pdf</span> = curl_exec(<span class="kw">$ch</span>);
curl_close(<span class="kw">$ch</span>);
<span class="cm">// Stream to browser:</span>
header(<span class="str">'Content-Type: application/pdf'</span>);
header(<span class="str">'Content-Disposition: attachment; filename="invoice.pdf"'</span>);
echo <span class="kw">$pdf</span>;<span class="kw">use</span> IlluminateSupportFacadesHttp;
<span class="kw">public function</span> <span class="fn">downloadPdf</span>(Invoice <span class="kw">$invoice</span>)
{
<span class="kw">$html</span> = view(<span class="str">'invoices.pdf'</span>, compact(<span class="str">'invoice'</span>))->render();
<span class="kw">$response</span> = Http::withToken(config(<span class="str">'services.renderly.key'</span>))
->post(<span class="str">'https://api.renderlyapi.com/v1/pdf/from-html'</span>, [
<span class="str">'html'</span> => <span class="kw">$html</span>,
<span class="str">'format'</span> => <span class="str">'A4'</span>,
]);
<span class="kw">return</span> response(<span class="kw">$response</span>->body(), <span class="num">200</span>, [
<span class="str">'Content-Type'</span> => <span class="str">'application/pdf'</span>,
<span class="str">'Content-Disposition'</span> => <span class="str">"attachment; filename=invoice-{<span class="kw">$invoice</span>->id}.pdf"</span>,
]);
}Free account · API key in 60 seconds · No credit card
Get started free →