From ef2afaa98435e30dcc06f90dd6eeaa9b753ff0c7 Mon Sep 17 00:00:00 2001 From: Justin Hawkins Date: Tue, 28 Apr 2026 10:52:48 +0930 Subject: [PATCH] WIP --- main.go | 95 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 59 insertions(+), 36 deletions(-) diff --git a/main.go b/main.go index 4b8cd14..7795bab 100644 --- a/main.go +++ b/main.go @@ -2,22 +2,29 @@ package main import ( "fmt" - "image/color" + "log/slog" "codeberg.org/go-pdf/fpdf" "github.com/yeqown/go-qrcode/v2" "github.com/yeqown/go-qrcode/writer/standard" ) -// 1 - var cols = 4 -var rows = 5 -var qrSize = 40 -var fontSize = 20 +var rows = 4 +var qrSize = 50.0 +var fontSize = 16.0 // pts +var fontSizeMM = fontSize / 72 * 25.4 +var text = "meow!" + +var textTopPadding = 5.0 +var qrTopPadding = 5.0 + +// var probably some padding instead of offsets for qr/font placement func main() { - qrc, err := qrcode.New("https://nanocat.net") + + qrc, err := qrcode.New("https://nanocat.net/dom/sdfih/dsifj/sidhof/sdifho/sdfiuoh/safiuho") + if err != nil { fmt.Printf("could not generate QRCode: %v", err) return @@ -28,27 +35,27 @@ func main() { // standard.WithQRWidth(uint8(qrSize)), standard.WithBorderWidth(0), standard.WithBuiltinImageEncoder(standard.PNG_FORMAT), - standard.WithCircleShape(), - standard.WithFgGradient(&standard.LinearGradient{ - Stops: []standard.ColorStop{{ - T: 0.0, - Color: color.RGBA{ - R: 255, - G: 0, - B: 0, - A: 0, - }, - }, { - T: 1.0, - Color: color.RGBA{ - R: 0, - G: 255, - B: 0, - A: 0, - }, - }}, - Angle: 45, - }), standard.WithLogoImageFileJPEG("cat-pet-animal-domestic-104827.jpeg"), + // standard.WithCircleShape(), + // standard.WithFgGradient(&standard.LinearGradient{ + // Stops: []standard.ColorStop{{ + // T: 0.0, + // Color: color.RGBA{ + // R: 255, + // G: 0, + // B: 0, + // A: 0, + // }, + // }, { + // T: 1.0, + // Color: color.RGBA{ + // R: 0, + // G: 255, + // B: 0, + // A: 0, + // }, + // }}, + // Angle: 45, + // }), ) // save file @@ -68,18 +75,35 @@ func main() { AllowNegativePosition: false, }, b) - info := pdf.GetImageInfo("qr") + // info := pdf.GetImageInfo("qr") // panic(info.Height()) pdf.AddPage() pdf.SetFont("Arial", "B", float64(fontSize)) - text := "foobar" textWidth := pdf.GetStringWidth(text) colWidth := pageWidth / float64(cols) rowHeight := pageHeight / float64(rows) + // qrRowRatio := qrSize / rowHeight + // qrColRatio := qrSize / colWidth + + // fmt.Printf("qr/row height ratio: %.2f\n", qrRowRatio) + // fmt.Printf("qr/col width ratio: %.2f\n", qrColRatio) + + if textTopPadding+fontSizeMM+qrTopPadding+qrSize > rowHeight { + slog.Warn("qr is too big for row") + } + + if qrSize > colWidth { + slog.Warn("qr is too big for column") + } + + if textWidth > colWidth { + slog.Warn("text probably too wide") + } + for rowIdx := range rows { for colIdx := range cols { topLeftX := colWidth * float64(colIdx) @@ -95,16 +119,15 @@ func main() { // label at the top pdf.Text( topLeftX+colWidth/2-textWidth/2, - topLeftY+float64(fontSize), + topLeftY+textTopPadding+fontSizeMM, text, // +fmt.Sprintf("%d/%d", rowIdx, colIdx) ) - info.Height() - // pdf at the bottom + // qr at the bottom pdf.ImageOptions("qr", - topLeftX+info.Width()-float64(qrSize), //+float64(dim)/2, // centre - topLeftY+float64(fontSize)*1.3, // centre - float64(qrSize), float64(qrSize), + topLeftX+colWidth/2-qrSize/2, //+float64(dim)/2, // centre + topLeftY+textTopPadding+fontSizeMM+qrTopPadding, // centre, below text line + qrSize, qrSize, false, fpdf.ImageOptions{AllowNegativePosition: true}, 0, "") // pdf.Image("qr",