🐹 Go

HTML to PDF in Go

Generate pixel-perfect PDFs from HTML in your Go service using only the standard library. No CGO, no binary dependencies, no external packages needed.

Quickstart

main.go
<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">`&lt;h1 style="font-family:sans-serif"&gt;Invoice #042&lt;/h1&gt;`</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>)
}

HTTP handler example

handler.go
<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)
}

Also available for

Generate your first PDF

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

Get started free →