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
- Gerar o QR Code em memória
- Codificar o PNG em
[]byte - Converter para Base64
- Passar a string para o template
- 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:
- HTML normal
- wkhtmltopdf
- E-mails HTML
- Preview no navegador
Dica importante (wkhtmltopdf)
Se você for usar isso com wkhtmltopdf, esse formato é o mais seguro, pois:
- Não depende de acesso externo
- Não depende de filesystem
- Não quebra em containers ou Cloud Run
Referência: