diff --git a/main.go b/main.go index 37a6182..c3206df 100644 --- a/main.go +++ b/main.go @@ -2,35 +2,60 @@ package main import ( "fmt" + "io" "log/slog" + "os" "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 = 48.0 -var fontSize = 25.0 // pts -var fontSizeMM = fontSize / 72 * 25.4 -var text = "Á[Hjqy]|" -var font = "Courier" - -var textTopPadding = 0.0 // typically none is required -var qrTopPadding = 5.0 // below the baseline of the text, remember the descenders like 'y', 'q' - +var textTopPadding = 0.0 // typically none is required +var qrTopPadding = 5.0 // below the baseline of the text, remember the descenders like 'y', 'q' var requiredCellPadding = 3.0 // half on each side, effectively -// var probably some padding instead of offsets for qr/font placement - func main() { + f, _ := os.Create("hello.pdf") + err := generatePage(f, PageOptions{ + qrURL: "https://nanocat.net/dom/sdfih/dsifj/sidhof/sdifho/sdfiuoh/safiuho", + qrLabel: "Á[Hjqy]|", + qrSize: 54, - qrc, err := qrcode.New("https://nanocat.net/dom/sdfih/dsifj/sidhof/sdifho/sdfiuoh/safiuho") + font: "Helvetica", + fontStyle: "B", + fontSize: 34.0, + rows: 4, + cols: 3, + borders: true, + }) + if err != nil { + slog.Error("could not generate pdf", "error", err) + os.Exit(1) + } + +} + +type PageOptions struct { + qrURL string + qrLabel string + qrSize float64 + font string + fontStyle string + fontSize float64 + rows int + cols int + borders bool +} + +func generatePage(w io.Writer, po PageOptions) error { + + fontSizeMM := po.fontSize / 72 * 25.4 + + qrc, err := qrcode.New(po.qrURL) if err != nil { - fmt.Printf("could not generate QRCode: %v", err) - return + return fmt.Errorf("could not generate QRCode: %v", err) } b := newBWC() @@ -78,65 +103,66 @@ func main() { AllowNegativePosition: false, }, b) - // info := pdf.GetImageInfo("qr") - // panic(info.Height()) - pdf.AddPage() - pdf.SetFont(font, "B", float64(fontSize)) + pdf.SetFont(po.font, po.fontStyle, float64(po.fontSize)) - textWidth := pdf.GetStringWidth(text) + textWidth := pdf.GetStringWidth(po.qrLabel) - colWidth := pageWidth / float64(cols) - rowHeight := pageHeight / float64(rows) + colWidth := pageWidth / float64(po.cols) + rowHeight := pageHeight / float64(po.rows) - cellHeight := textTopPadding + fontSizeMM + qrTopPadding + qrSize - cellWidth := qrSize + cellHeight := textTopPadding + fontSizeMM + qrTopPadding + po.qrSize + cellWidth := po.qrSize if cellHeight > rowHeight-requiredCellPadding { - slog.Warn("qr is too big for row", "cell_height", cellHeight, "row_height", rowHeight) + return fmt.Errorf("qr is too big for row size") } - slog.Info("check width", "cell_width", cellWidth, "col_width", colWidth) + // slog.Info("check width", "cell_width", cellWidth, "col_width", colWidth) if cellWidth > colWidth-requiredCellPadding { slog.Warn("qr is too big for column", "cell_width", cellWidth, "col_width", colWidth) + return fmt.Errorf("qr is too big for col size") } if textWidth > colWidth { slog.Warn("text probably too wide") + return fmt.Errorf("text is too wide for col size") } - for rowIdx := range rows { - for colIdx := range cols { + for rowIdx := range po.rows { + for colIdx := range po.cols { topLeftX := colWidth * float64(colIdx) topLeftY := rowHeight * float64(rowIdx) // draw box - pdf.SetDashPattern([]float64{1, 1}, 0) - pdf.Rect(topLeftX, topLeftY, colWidth, rowHeight, "D") - pdf.SetDashPattern([]float64{}, 0) + if po.borders { + pdf.SetDashPattern([]float64{1, 1}, 0) + pdf.Rect(topLeftX, topLeftY, colWidth, rowHeight, "D") + pdf.SetDashPattern([]float64{}, 0) + } // label at the top pdf.Text( topLeftX+colWidth/2-textWidth/2, topLeftY+fontSizeMM+textTopPadding, - text, // +fmt.Sprintf("%d/%d", rowIdx, colIdx) + po.qrLabel, // +fmt.Sprintf("%d/%d", rowIdx, colIdx) ) // qr at the bottom pdf.ImageOptions("qr", - topLeftX+colWidth/2-qrSize/2, + topLeftX+colWidth/2-po.qrSize/2, topLeftY+textTopPadding+fontSizeMM+qrTopPadding, - qrSize, qrSize, + po.qrSize, po.qrSize, false, fpdf.ImageOptions{AllowNegativePosition: true}, 0, "") } } - err = pdf.OutputFileAndClose("hello.pdf") + err = pdf.Output(w) if err != nil { - panic(err) + return fmt.Errorf("could not output PDF: %w", err) } - fmt.Println(pageWidth, pageHeight) + return nil }