Generate pixel-perfect PDFs from HTML in your Go service using only the standard library. No CGO, no binary dependencies, no external packages needed.
<span class="kw">package</span> main
<span class="kw">import</span> (
<span class="str">"bytes"</span>
<span class="str">"encoding/json"</span>
<span class="str">"fmt"</span>
<span class="str">"io"</span>
<span class="str">"net/http"</span>
<span class="str">"os"</span>
)
<span class="kw">func</span> <span class="fn">generatePDF</span>(html <span class="kw">string</span>) ([]<span class="kw">byte</span>, <span class="kw">error</span>) {
payload, _ := json.<span class="fn">Marshal</span>(<span class="kw">map</span>[<span class="kw">string</span>]<span class="kw">interface</span>{}{
<span class="str">"html"</span>: html,
<span class="str">"format"</span>: <span class="str">"A4"</span>,
<span class="str">"marginTop"</span>: <span class="str">"20mm"</span>,
})
req, _ := http.<span class="fn">NewRequest</span>(
http.MethodPost,
<span class="str">"https://api.renderlyapi.com/v1/pdf/from-html"</span>,
bytes.<span class="fn">NewBuffer</span>(payload),
)
req.Header.<span class="fn">Set</span>(<span class="str">"Authorization"</span>, <span class="str">"Bearer "</span>+os.<span class="fn">Getenv</span>(<span class="str">"RENDERLY_API_KEY"</span>))
req.Header.<span class="fn">Set</span>(<span class="str">"Content-Type"</span>, <span class="str">"application/json"</span>)
resp, err := http.DefaultClient.<span class="fn">Do</span>(req)
<span class="kw">if</span> err != <span class="kw">nil</span> {
<span class="kw">return nil</span>, err
}
<span class="kw">defer</span> resp.Body.<span class="fn">Close</span>()
<span class="kw">return</span> io.<span class="fn">ReadAll</span>(resp.Body)
}
<span class="kw">func</span> <span class="fn">main</span>() {
html := <span class="str">`<h1 style="font-family:sans-serif">Invoice #042</h1>`</span>
pdf, err := <span class="fn">generatePDF</span>(html)
<span class="kw">if</span> err != <span class="kw">nil</span> {
fmt.<span class="fn">Println</span>(err)
<span class="kw">return</span>
}
os.<span class="fn">WriteFile</span>(<span class="str">"invoice.pdf"</span>, pdf, <span class="num">0644</span>)
fmt.<span class="fn">Println</span>(<span class="str">"PDF saved!"</span>)
}<span class="kw">func</span> <span class="fn">invoicePDFHandler</span>(w http.ResponseWriter, r *http.Request) {
html := <span class="fn">renderInvoiceTemplate</span>(r)
pdf, err := <span class="fn">generatePDF</span>(html)
<span class="kw">if</span> err != <span class="kw">nil</span> {
http.<span class="fn">Error</span>(w, err.<span class="fn">Error</span>(), http.StatusInternalServerError)
<span class="kw">return</span>
}
w.<span class="fn">Header</span>().<span class="fn">Set</span>(<span class="str">"Content-Type"</span>, <span class="str">"application/pdf"</span>)
w.<span class="fn">Header</span>().<span class="fn">Set</span>(<span class="str">"Content-Disposition"</span>, <span class="str">`attachment; filename="invoice.pdf"`</span>)
w.<span class="fn">Write</span>(pdf)
}Free account · API key in 60 seconds · No credit card
Get started free →