From 5f4a427f3bb28e3d8a174e49a6d801a9f1c24304 Mon Sep 17 00:00:00 2001 From: sainw Date: Tue, 8 Sep 2026 17:24:54 +0630 Subject: [PATCH] split big chunk of data to write to printer --- cmd/main.go | 17 ++++++++++++++++- img.go | 19 ++++++------------- printer.go | 34 ++++++++++++++++++++++++++++++++-- 3 files changed, 54 insertions(+), 16 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 53781af..280b2a5 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -9,6 +9,8 @@ import ( _ "image/png" ) import ( + "encoding/json" + "gt.mokkon.com/sainw/libgofunc" ) @@ -99,11 +101,24 @@ func main() { စက်သုံးဆီ အရေအတွက် နှင့် အရည်အသွေးစျေးနှုန်းများ အားသံသယရှိပါက ph 09450539099, 09765421033, 09765421029 သို့တိုင်ကြား နိုင်ပါသည်။

` + type Data struct { + Status string `json:"status"` + Result []string `json:"result"` + } + result := libgofunc.GenImg(550, "./", payload, temp, "./") fmt.Println("Result:", result) // PrintImg(C.CString("usb:/dev/usb/lp1"), C.CString("build/out.png")) // libgofunc.Print("int:/dev/bus/usb/001/046", "./out.png") - // libgofunc.Print("tcp:192.168.100.110:9100", "./out.png") + + data := Data{} + json.Unmarshal([]byte(result), &data) + fmt.Println("Data:", data) + + for _, imgPath := range data.Result { + fmt.Println("Printing image:", imgPath) + libgofunc.Print("tcp:192.168.100.151:9100", imgPath) + } // libgofunc.Print("usb:/dev/usb/lp1", "./out.png") // printer := "tcp:192.168.100.151:9100" // ListUSB() diff --git a/img.go b/img.go index b7a81b3..671daab 100644 --- a/img.go +++ b/img.go @@ -22,8 +22,6 @@ import ( "golang.org/x/net/html" "encoding/json" - - "github.com/kenshaw/escpos" ) import ( "log" @@ -377,30 +375,25 @@ func findNode(n *html.Node, tag string) *html.Node { return nil } -func printImg(prt *escpos.Escpos, imgPath string) error { +func imgData(imgPath string) ([]byte, error) { imgFile, err := os.Open(imgPath) if err != nil { fmt.Println(err) - return err + return nil, err } img, _, err := image.Decode(imgFile) defer imgFile.Close() if err != nil { fmt.Println(err) - return err + return nil, err } data := []byte{0x1D, 0x4C, 0x00, 0x00} - _, err = prt.WriteRaw(data) - if err != nil { - fmt.Println("error 0x1D, 0x4C:", err.Error()) - } gray := toMonochrome(img) - data = escposRaster(gray) - - _, err = prt.WriteRaw(data) - return err + imgData := escposRaster(gray) + data = append(data, imgData...) + return data, err } func LoadFont(size float64) (*font.Face, error) { diff --git a/printer.go b/printer.go index 20b093c..db699ae 100644 --- a/printer.go +++ b/printer.go @@ -17,7 +17,9 @@ import ( "github.com/kenshaw/escpos" ) -import "errors" +import ( + "errors" +) //export PrintImg func PrintImg(printer *C.char, imagePath *C.char) *C.char { @@ -87,10 +89,17 @@ func PrintImg(printer *C.char, imagePath *C.char) *C.char { prt.SetSmooth(1) prt.SetAlign("left") - err := printImg(prt, goImagePath) + imgBytes, err := imgData(goImagePath) if err != nil { return NewErr(err) } + err = WriteChunk(w, prt, imgBytes) + if err != nil { + return NewErr(err) + } + time.Sleep(500 * time.Millisecond) + w.Flush() + prt.WriteRaw([]byte{0x1B, 0x64, 0x03}) prt.Cut() prt.End() @@ -104,3 +113,24 @@ func Print(printer, imagePath string) string { r := C.GoString(result) return r } + +// WriteChunk breaks the large byte array into smaller chunks +func WriteChunk(w *bufio.ReadWriter, prt *escpos.Escpos, data []byte) error { + chunkSize := 1024 // 1 KB chunks work best for network printers + for i := 0; i < len(data); i += chunkSize { + end := min(i+chunkSize, len(data)) + + _, err := prt.WriteRaw(data[i:end]) + if err != nil { + log.Println("Error writing image chunk:", err) + return err + } + if err := w.Flush(); err != nil { + log.Println("Error flushing buffer:", err) + return err + } + // Give the printer's network chip a microsecond to breathe + time.Sleep(5 * time.Millisecond) + } + return nil +}