package main import ( "fmt" "log/slog" "codeberg.org/go-pdf/fpdf" "github.com/yeqown/go-qrcode/v2" "github.com/yeqown/go-qrcode/writer/standard" ) var cols = 4 var rows = 4 var qrSize = 50.0 var fontSize = 32.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/dom/sdfih/dsifj/sidhof/sdifho/sdfiuoh/safiuho") if err != nil { fmt.Printf("could not generate QRCode: %v", err) return } b := newBWC() qrBytes := standard.NewWithWriter(&b, // 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, // }), ) // save file if err = qrc.Save(qrBytes); err != nil { fmt.Printf("could not save image: %v", err) } // dim := qrc.Dimension() pdf := fpdf.New("P", "mm", "A4", "") pdf.SetMargins(0, 0, 0) pageWidth, pageHeight := pdf.GetPageSize() // register the qr pdf.RegisterImageOptionsReader("qr", fpdf.ImageOptions{ ImageType: "png", ReadDpi: false, AllowNegativePosition: false, }, b) // info := pdf.GetImageInfo("qr") // panic(info.Height()) pdf.AddPage() pdf.SetFont("Arial", "B", float64(fontSize)) textWidth := pdf.GetStringWidth(text) colWidth := pageWidth / float64(cols) rowHeight := pageHeight / float64(rows) 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) topLeftY := rowHeight * float64(rowIdx) // label at the top pdf.Text( topLeftX+colWidth/2-textWidth/2, topLeftY+textTopPadding+fontSizeMM, text, // +fmt.Sprintf("%d/%d", rowIdx, colIdx) ) // qr at the bottom pdf.ImageOptions("qr", topLeftX+colWidth/2-qrSize/2, topLeftY+textTopPadding+fontSizeMM+qrTopPadding, qrSize, qrSize, false, fpdf.ImageOptions{AllowNegativePosition: true}, 0, "") } } err = pdf.OutputFileAndClose("hello.pdf") if err != nil { panic(err) } fmt.Println(pageWidth, pageHeight) }