Go PDF Generation SDK

The official cloudlayerio-go package provides Go PDF generation with context support and zero external dependencies. Convert HTML to PDF, capture URLs as documents, and render templates — using only the Go standard library.

Installation

go get github.com/cloudlayerio/cloudlayerio-go

Requirements: Go 1.21+, zero external dependencies

Setup

Get your API key by creating a free account at cloudlayer.io. The free account includes a monthly render allowance, with no card. See pricing for the current figures.

import cloudlayer "github.com/cloudlayerio/cloudlayerio-go"

client, err := cloudlayer.NewClient("YOUR-API-KEY", cloudlayer.V2)

The SDK requires you to choose an API version:

v1v2
Default modeSynchronous (returns binary)Asynchronous (returns Job)
Sync responseRaw binary (PDF/image bytes)JSON Job object
Binary accessDirect from result.DataVia DownloadJobResult()

URL to PDF

v2 returns a Job object. Use DownloadJobResult() to get the binary:

result, err := client.URLToPDF(ctx, &cloudlayer.URLToPDFOptions{
    URLOptions: cloudlayer.URLOptions{
        URL: cloudlayer.StringPtr("https://example.com"),
    },
})
if err != nil {
    log.Fatal(err)
}

// Wait for the job to complete
job, err := client.WaitForJob(ctx, result.Job.ID)
if err != nil {
    log.Fatal(err)
}

// Download the PDF binary
data, err := client.DownloadJobResult(ctx, job)
if err != nil {
    log.Fatal(err)
}

os.WriteFile("output.pdf", data, 0644)

v1 (legacy)

v1 returns raw binary directly:

client, _ := cloudlayer.NewClient("YOUR-API-KEY", cloudlayer.V1)

result, err := client.URLToPDF(ctx, &cloudlayer.URLToPDFOptions{
    URLOptions: cloudlayer.URLOptions{
        URL: cloudlayer.StringPtr("https://example.com"),
    },
})
if err != nil {
    log.Fatal(err)
}

os.WriteFile("output.pdf", result.Data, 0644)

HTML to PDF

result, err := client.HTMLToPDF(ctx, &cloudlayer.HTMLToPDFOptions{
    HTMLOptions: cloudlayer.HTMLOptions{
        HTML: cloudlayer.EncodeHTML("<h1>Hello World</h1><p>Generated by cloudlayer.io</p>"),
    },
    PDFOptions: cloudlayer.PDFOptions{
        Format:          &cloudlayer.FormatA4,
        PrintBackground: cloudlayer.BoolPtr(true),
    },
})

Template to PDF

result, err := client.TemplateToPDF(ctx, &cloudlayer.TemplateToPDFOptions{
    TemplateOptions: cloudlayer.TemplateOptions{
        TemplateID: cloudlayer.StringPtr("professional-invoice"),
        Data: map[string]interface{}{
            "invoiceNumber": "INV-2024-001",
            "companyName":   "Acme Corp",
            "items": []map[string]interface{}{
                {"name": "Widget A", "quantity": 10, "price": 25.00},
            },
            "total": 250.00,
        },
    },
})

Error Handling

All errors are concrete types supporting errors.As:

result, err := client.HTMLToPDF(ctx, opts)
if err != nil {
    var authErr *cloudlayer.AuthError
    if errors.As(err, &authErr) {
        log.Fatal("Invalid API key")
    }

    var rateLimitErr *cloudlayer.RateLimitError
    if errors.As(err, &rateLimitErr) {
        log.Printf("Rate limited, retry after %ds", *rateLimitErr.RetryAfter)
    }

    log.Fatal(err)
}
Error TypeWhen
*AuthErrorInvalid or missing API key (401/403)
*RateLimitErrorRate limit exceeded (429)
*APIErrorOther API errors
*ValidationErrorInvalid input parameters
*NetworkErrorConnection failures

All Conversion Methods

MethodDescription
URLToPDF()Convert a URL to PDF
URLToImage()Screenshot a URL
HTMLToPDF()Convert HTML to PDF
HTMLToImage()Convert HTML to image
TemplateToPDF()Render template as PDF
TemplateToImage()Render template as image
MergePDFs()Merge multiple PDFs

Data Management

// List recent jobs
jobs, _ := client.ListJobs(ctx)

// Get account usage
account, _ := client.GetAccount(ctx)

// Configure custom storage
client.AddStorage(ctx, &cloudlayer.StorageParams{
    Title:          "My S3 Bucket",
    Bucket:         "my-pdfs",
    Region:         "us-east-1",
    AccessKeyID:    "AKIA...",
    SecretAccessKey: "...",
})