01 - Exemplo de QRCODE em memória com golang

package main

import (
	"fmt"
	"image/png"
	"os"

	"github.com/skip2/go-qrcode"
)

func main() {
	uuid := "7f3a7b0f-6a6d-4d74-9c62-1e6f0d1d2a3b" // exemplo
	url := fmt.Sprintf("https://site.com.br/orcamento/%s", uuid)

	// 80x80 px
	img, err := qrcode.New(url, qrcode.Medium)
	if err != nil {
		panic(err)
	}
	pngImg := img.Image(80) // gera image.Image já no tamanho desejado (80x80)

	f, err := os.Create("qrcode.png")
	if err != nil {
		panic(err)
	}
	defer f.Close()

	if err := png.Encode(f, pngImg); err != nil {
		panic(err)
	}
}
go mod init exemplo-qrcode
go get github.com/skip2/go-qrcode
go run .

Estratégia

  1. Gerar o QR Code em memória
  2. Codificar o PNG em []byte
  3. Converter para Base64
  4. Passar a string para o template
  5. Renderizar com data URI

package qrcodeutil

import (
	"bytes"
	"encoding/base64"
	"fmt"

	"github.com/skip2/go-qrcode"
)

func GerarQRCodeBase64(uuid string) (string, error) {
	url := fmt.Sprintf("https://site.com.br/orcamento/%s", uuid)

	pngBytes, err := qrcode.Encode(url, qrcode.Medium, 80)
	if err != nil {
		return "", err
	}

	encoded := base64.StdEncoding.EncodeToString(pngBytes)

	// Retorna pronto para usar no <img src="">
	return "data:image/png;base64," + encoded, nil
}

🔹 qrcode.Encode já gera o PNG direto em memória
🔹 Nada de arquivos temporários
🔹 Perfeito para PDF, HTML e e-mail


package main

import (
	"html/template"
	"net/http"

	"seuprojeto/qrcodeutil"
)

type ViewData struct {
	QRCode string
	UUID   string
}

func handler(w http.ResponseWriter, r *http.Request) {
	uuid := "7f3a7b0f-6a6d-4d74-9c62-1e6f0d1d2a3b"

	qrBase64, err := qrcodeutil.GerarQRCodeBase64(uuid)
	if err != nil {
		http.Error(w, err.Error(), 500)
		return
	}

	tmpl := template.Must(template.ParseFiles("template.html"))

	data := ViewData{
		QRCode: qrBase64,
		UUID:   uuid,
	}

	tmpl.Execute(w, data)
}

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8080", nil)
}

template.html

<!DOCTYPE html>
<html lang="pt-br">
<head>
	<meta charset="utf-8">
	<title>Orçamento</title>
</head>
<body>

<h2>Orçamento {{ .UUID }}</h2>

<img src="{{ .QRCode }}" width="80" height="80" alt="QR Code">

<p>
	Escaneie o QR Code para acessar o orçamento.
</p>

</body>
</html>

Resultado

✔ QR Code gerado 100% em runtime
✔ Nenhum arquivo temporário
✔ Funciona em:


Dica importante (wkhtmltopdf)

Se você for usar isso com wkhtmltopdf, esse formato é o mais seguro, pois:

Referência:

https://github.com/skip2/go-qrcode