From d7ffc17d71555b4d205708644bb8fb481afc3d6e Mon Sep 17 00:00:00 2001 From: sainw Date: Tue, 2 Jun 2026 10:08:24 +0630 Subject: [PATCH] update to latest --- .gitignore | 1 + cmd/logo.png | Bin 0 -> 18500 bytes cmd/main.go | 90 +++++++++---------------------- escpos_printer.go | 4 +- go.mod | 32 +---------- go.sum | 132 ---------------------------------------------- img.go | 38 ++++++++++--- printer.go | 91 +++++++++++++------------------- vo.go | 6 +-- 9 files changed, 98 insertions(+), 296 deletions(-) create mode 100644 cmd/logo.png diff --git a/.gitignore b/.gitignore index 6561e4f..0b542e8 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ go.work.sum build assets libgofunc +libgo diff --git a/cmd/logo.png b/cmd/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0568ee9203279ecf246ada2fd433ba67d833bd9d GIT binary patch literal 18500 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 literal 0 HcmV?d00001 diff --git a/cmd/main.go b/cmd/main.go index 13e367b..cd27e83 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -7,11 +7,8 @@ import ( "C" "fmt" _ "image/png" - - "github.com/google/gousb" ) import ( - "github.com/google/gousb/usbid" "gt.mokkon.com/sainw/libgofunc" ) @@ -21,39 +18,41 @@ func Sum(a, b int) int { } func main() { - payload := `{"Name":"Ko Myo","Amount":3000}` + payload := `{ "sales": [ { "shiftId": "1001", "tran_seq": 1, "salePerson": "John Doe", "timeSec": "1717243200", "timeValue": "2026-06-01 14:30:00", "fpId": 3, "productId": 101, "product": "Diesel Premium", "price": "2500", "volume": "40", "amount": "100000", "discount_amount": "5000", "discount_percent": 5.0, "discount_money": 5000, "rule_types": "LOYALTY,FLEET", "promotion_status": true, "custom_promotion_status": false, "discount_volume": "2", "customerId": 5001, "customer_name": "ABC Logistics Pte Ltd", "vehicle_type": "Truck", "vehicle_type_extension": "10-Wheeler", "carNumber": "SGX1234A", "status": "COMPLETED", "receiptNumber": "RCP-20260601-0001", "receiptCount": 1, "mop": "CARD", "local_used_credit": 100.50, "local_credit_limit": 5000.00, "local_credit_balance": 4899.50, "local_debit_balance": 250.75, "loyalty_type": "GOLD", "points_balance": 12500, "reward_amount": 50.25, "reward_points": 500, "redeem_amount": 25.00, "redeem_points": 250, "redeem_exchange_rate": 0.1, "point_exchange_rate": 10.0, "used_credit": 100.50, "credit_limit": 10000.00, "credit_amount": 100.50, "credit_balance": 9899.50, "debit_amount": 50.25, "debit_balance": 449.75, "payment_customer_id": "PAYCUST001", "payment_customer_name": "ABC Logistics", "payment_customer_number": "+6591234567", "corp_id": "CORP001", "corp_name": "ABC Logistics Group", "card_number": "411111******1111", "upload": true, "upload_status": "SUCCESS", "send_sale_data_confirm": true, "loan_amount": 1000, "tax_percent": 9.0, "tax_status": true, "tier": 2, "dealNumber": "DL-20260601-001", "bank_name": "DBS", "bank_payment_type": "VISA", "session_id": "sess_abc123xyz", "tran_id": "txn_987654321", "qrcode_data": "SGQR|PAYNOW|ABCLOGISTICS", "fp_total": 8, "missed_sale_status": false, "opo_status": true, "ip_printer_status": true, "sale_type": "NORMAL" }, { "shiftId": "1001", "tran_seq": 1, "salePerson": "John Doe", "timeSec": "1717243200", "timeValue": "2026-06-01 14:30:00", "fpId": 3, "productId": 101, "product": "Diesel Premium", "price": "2500", "volume": "40", "amount": "100000", "discount_amount": "5000", "discount_percent": 5.0, "discount_money": 5000, "rule_types": "LOYALTY,FLEET", "promotion_status": true, "custom_promotion_status": false, "discount_volume": "2", "customerId": 5001, "customer_name": "ABC Logistics Pte Ltd", "vehicle_type": "Truck", "vehicle_type_extension": "10-Wheeler", "carNumber": "SGX1234A", "status": "COMPLETED", "receiptNumber": "RCP-20260601-0001", "receiptCount": 1, "mop": "CARD", "local_used_credit": 100.50, "local_credit_limit": 5000.00, "local_credit_balance": 4899.50, "local_debit_balance": 250.75, "loyalty_type": "GOLD", "points_balance": 12500, "reward_amount": 50.25, "reward_points": 500, "redeem_amount": 25.00, "redeem_points": 250, "redeem_exchange_rate": 0.1, "point_exchange_rate": 10.0, "used_credit": 100.50, "credit_limit": 10000.00, "credit_amount": 100.50, "credit_balance": 9899.50, "debit_amount": 50.25, "debit_balance": 449.75, "payment_customer_id": "PAYCUST001", "payment_customer_name": "ABC Logistics", "payment_customer_number": "+6591234567", "corp_id": "CORP001", "corp_name": "ABC Logistics Group", "card_number": "411111******1111", "upload": true, "upload_status": "SUCCESS", "send_sale_data_confirm": true, "loan_amount": 1000, "tax_percent": 9.0, "tax_status": true, "tier": 2, "dealNumber": "DL-20260601-001", "bank_name": "DBS", "bank_payment_type": "VISA", "session_id": "sess_abc123xyz", "tran_id": "txn_987654321", "qrcode_data": "SGQR|PAYNOW|ABCLOGISTICS", "fp_total": 8, "missed_sale_status": false, "opo_status": true, "ip_printer_status": true, "sale_type": "NORMAL" } ], "station": { "id": "1", "name": "Jurong Fuel Station", "address": "123 Boon Lay Way, Singapore 640123", "phones": "+65 6123 4567,+65 6987 6543", "code": "STN001", "money_divider": 100, "volume_divider": 1000, "check_tran_duration": 60, "fho_server_offline_duration": 300, "loyalty_backlog_duration": 1440, "token": "station-secret-token-123", "monthly_view": true, "pump_status": true, "currency": "SGD", "tank_manual_status": false, "update_price_type": "AUTO", "show_price_history": true, "old_receipt_status": false, "car_number_modification_status": true, "car_number_entry_status": 2, "shop_code": "SHOP001" }}` const temp = ` -

New Day Energy

+

{{.station.name}}

-

Address: မင်္ဂလာပါ {{.Name}}

-

Receipt: RCPT001

-

Phone: 0977777777

-

Date: 4 Jan 2026 15:38:38

-

Car No.: 3J/3883

-

Casher: မနှင်းနှင်း

-

MOP: B2B

-

Tier: 1

-

Deal No.: RR

-
+

Address: မင်္ဂလာပါ {{(index .sales 0).salePerson}}

+

Receipt: RCPT001

+

Phone: 0977777777

+

Date: 4 Jan 2026 15:38:38

+

Car No.: 3J/3883

+

Casher: မနှင်းနှင်း

+

MOP: B2B

+

Tier: 1

+

Deal No.: RR

+
- +
- - + + +{{range .sales}} - - - - - - + + + + + + +{{end}}
ItemPumpItemPump Price Liter Gallon Amount
95 RONP82,0003.250.7156,500{{.product}}{{.fpId}}{{.price}}{{.volume}}{{.volume}}{{.amount}}

@@ -63,47 +62,8 @@ func main() { 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.151:9100", "./out.png") + // libgofunc.Print("tcp:192.168.100.110:9100", "./out.png") + // libgofunc.Print("usb:/dev/usb/lp1", "./out.png") // printer := "tcp:192.168.100.151:9100" // ListUSB() } - -func ListUSB() { - ctx := gousb.NewContext() - defer ctx.Close() - - // OpenDevices returns all devices that return 'true' in the filter - devices, _ := ctx.OpenDevices(func(desc *gousb.DeviceDesc) bool { - // fmt.Println(usbid.Describe(desc)) - - // path := fmt.Sprintf("/dev/bus/usb/%03d/%03d", desc.Bus, desc.Address) - // fmt.Printf("Device Path: %s\n", path) - - // switch desc.Class { - // case 7: - // fmt.Println("Found a standard printer") - // case 0xFF: - // fmt.Println("Found a vendor-specific device (likely your printer)") - // } - - return true // Open every device to read its name - }) - defer func() { - for _, d := range devices { - - d.Close() - } - }() - - for _, d := range devices { - fmt.Println(usbid.Describe(d.Desc)) - fmt.Printf("Bus: %d, Address: %d\n", d.Desc.Bus, d.Desc.Address) - // Read human-readable names from the device strings - manufacturer, _ := d.Manufacturer() - product, _ := d.Product() - serial, _ := d.SerialNumber() - // d.Desc.Path - fmt.Printf("ID: %s:%s | Manufacturer: %s | Product: %s | Serial: %s\n", - d.Desc.Vendor, d.Desc.Product, manufacturer, product, serial) - } -} diff --git a/escpos_printer.go b/escpos_printer.go index 85d39a7..4d378b4 100644 --- a/escpos_printer.go +++ b/escpos_printer.go @@ -91,7 +91,8 @@ func toMonochrome(img image.Image) *image.Gray { for y := bounds.Min.Y; y < bounds.Max.Y; y++ { for x := bounds.Min.X; x < bounds.Max.X; x++ { r, g, b, _ := img.At(x, y).RGBA() - grayValue := uint8((r + g + b) / 3 >> 8) + // grayValue := uint8((r + g + b) / 3 >> 8) + grayValue := uint8((0.299*float64(r) + 0.587*float64(g) + 0.114*float64(b)) / 256.0) if grayValue > 128 { gray.Set(x, y, color.White) } else { @@ -138,7 +139,6 @@ func escposRaster(img *image.Gray) []byte { data = append(data, b) } } - return data } diff --git a/go.mod b/go.mod index 7010b5a..5e70a30 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module gt.mokkon.com/sainw/libgofunc -go 1.25.0 +go 1.26.0 require ( github.com/dlclark/regexp2 v1.11.5 @@ -10,37 +10,7 @@ require ( golang.org/x/net v0.52.0 ) -require ( - codeberg.org/go-latex/latex v0.2.0 // indirect - codeberg.org/go-pdf/fpdf v0.11.1 // indirect - github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 // indirect - github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 // indirect - github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc // indirect - github.com/BurntSushi/xgbutil v0.0.0-20190907113008-ad855c713046 // indirect - github.com/ByteArena/poly2tri-go v0.0.0-20170716161910-d102ad91854f // indirect - github.com/Kagami/go-avif v0.1.0 // indirect - github.com/andybalholm/brotli v1.2.1 // indirect - github.com/benoitkugler/textlayout v0.3.2 // indirect - github.com/benoitkugler/textprocessing v0.0.6 // indirect - github.com/go-fonts/latin-modern v0.3.3 // indirect - github.com/go-text/typesetting v0.3.4 // indirect - github.com/kolesa-team/go-webp v1.0.5 // indirect - github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect - github.com/srwiley/scanx v0.0.0-20190309010443-e94503791388 // indirect - github.com/tdewolff/font v0.0.0-20260314002930-9f995dac393e // indirect - github.com/tdewolff/minify/v2 v2.24.11 // indirect - github.com/tdewolff/parse/v2 v2.8.11 // indirect - github.com/wcharczuk/go-chart/v2 v2.1.2 // indirect - github.com/yuin/goldmark v1.8.2 // indirect - gonum.org/v1/plot v0.16.0 // indirect - modernc.org/knuth v0.5.5 // indirect - modernc.org/token v1.1.0 // indirect - star-tex.org/x/tex v0.7.1 // indirect -) - require ( github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/google/gousb v1.1.3 - github.com/tdewolff/canvas v0.0.0-20260406091912-5d4f7059846e golang.org/x/text v0.35.0 // indirect ) diff --git a/go.sum b/go.sum index 5b1156d..c646e8a 100644 --- a/go.sum +++ b/go.sum @@ -1,148 +1,16 @@ -codeberg.org/go-latex/latex v0.2.0 h1:Ol/a6VHY06N+5gPfewswymoRb5ZcKDXWVaVegcx4hbI= -codeberg.org/go-latex/latex v0.2.0/go.mod h1:VJAwQir7/T8LZxj7xAPivISKiVOwkMpQ8bTuPQ31X0Y= -codeberg.org/go-pdf/fpdf v0.11.1 h1:U8+coOTDVLxHIXZgGvkfQEi/q0hYHYvEHFuGNX2GzGs= -codeberg.org/go-pdf/fpdf v0.11.1/go.mod h1:Y0DGRAdZ0OmnZPvjbMp/1bYxmIPxm0ws4tfoPOc4LjU= -github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 h1:1qlsVAQJXZHsaM8b6OLVo6muQUQd4CwkH/D3fnnbHXA= -github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ= -github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 h1:lTG4HQym5oPKjL7nGs+csTgiDna685ZXjxijkne828g= -github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966/go.mod h1:Mid70uvE93zn9wgF92A/r5ixgnvX8Lh68fxp9KQBaI0= -github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc h1:7D+Bh06CRPCJO3gr2F7h1sriovOZ8BMhca2Rg85c2nk= -github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/BurntSushi/xgbutil v0.0.0-20190907113008-ad855c713046 h1:O/r2Sj+8QcMF7V5IcmiE2sMFV2q3J47BEirxbXJAdzA= -github.com/BurntSushi/xgbutil v0.0.0-20190907113008-ad855c713046/go.mod h1:uw9h2sd4WWHOPdJ13MQpwK5qYWKYDumDqxWWIknEQ+k= -github.com/ByteArena/poly2tri-go v0.0.0-20170716161910-d102ad91854f h1:l7moT9o/v/9acCWA64Yz/HDLqjcRTvc0noQACi4MsJw= -github.com/ByteArena/poly2tri-go v0.0.0-20170716161910-d102ad91854f/go.mod h1:vIOkSdX3NDCPwgu8FIuTat2zDF0FPXXQ0RYFRy+oQic= -github.com/Kagami/go-avif v0.1.0 h1:8GHAGLxCdFfhpd4Zg8j1EqO7rtcQNenxIDerC/uu68w= -github.com/Kagami/go-avif v0.1.0/go.mod h1:OPmPqzNdQq3+sXm0HqaUJQ9W/4k+Elbc3RSfJUemDKA= -github.com/andybalholm/brotli v1.2.1 h1:R+f5xP285VArJDRgowrfb9DqL18yVK0gKAW/F+eTWro= -github.com/andybalholm/brotli v1.2.1/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= -github.com/benoitkugler/pstokenizer v1.0.0/go.mod h1:l1G2Voirz0q/jj0TQfabNxVsa8HZXh/VMxFSRALWTiE= -github.com/benoitkugler/textlayout v0.3.2 h1:Y/LTkwpQ9G0Fia9yhPmZA9IR5AnE8Cq30j3C+Gx5/IE= -github.com/benoitkugler/textlayout v0.3.2/go.mod h1:o+1hFV+JSHBC9qNLIuwVoLedERU7sBPgEFcuSgfvi/w= -github.com/benoitkugler/textlayout-testdata v0.1.1/go.mod h1:i/qZl09BbUOtd7Bu/W1CAubRwTWrEXWq6JwMkw8wYxo= -github.com/benoitkugler/textprocessing v0.0.6 h1:obkMyj62GEPg3xUVYqROlCN22z1OleuZm6ULqX9Om1g= -github.com/benoitkugler/textprocessing v0.0.6/go.mod h1:Io0gN08/PXEzrSOWFa88xHx2Xv3VjvLMY7H76YoI23A= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/go-fonts/latin-modern v0.3.3 h1:g2xNgI8yzdNzIVm+qvbMryB6yGPe0pSMss8QT3QwlJ0= -github.com/go-fonts/latin-modern v0.3.3/go.mod h1:tHaiWDGze4EPB0Go4cLT5M3QzRY3peya09Z/8KSCrpY= -github.com/go-text/typesetting v0.3.4 h1:YYurUOtEb9kGSOz4uE3k4OpBGsp1dDL8+fjCeaFamAU= -github.com/go-text/typesetting v0.3.4/go.mod h1:4qZCQphq4KSgGTAeI0uMEkVbROgfah8BuyF5LRYr7XY= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gousb v1.1.3 h1:xt6M5TDsGSZ+rlomz5Si5Hmd/Fvbmo2YCJHN+yGaK4o= github.com/google/gousb v1.1.3/go.mod h1:GGWUkK0gAXDzxhwrzetW592aOmkkqSGcj5KLEgmCVUg= github.com/kenshaw/escpos v0.0.0-20221114190919-df06b682a8fc h1:4JwmN2Scz1vR+hfSxkdy2IE/DzxX2Cftm2lhWHyN0k0= github.com/kenshaw/escpos v0.0.0-20221114190919-df06b682a8fc/go.mod h1:M+GIBmg2MqaSWIJrXCZS+/wRFbr9fOguRz3SHn8DRPE= -github.com/kolesa-team/go-webp v1.0.5 h1:GZQHJBaE8dsNKZltfwqsL0qVJ7vqHXsfA+4AHrQW3pE= -github.com/kolesa-team/go-webp v1.0.5/go.mod h1:QmJu0YHXT3ex+4SgUvs+a+1SFCDcCqyZg+LbIuNNTnE= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ= -github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE= -github.com/srwiley/scanx v0.0.0-20190309010443-e94503791388 h1:ZdkidVdpLW13BQ9a+/3uerT2ezy9J7KQWH18JCfhDmI= -github.com/srwiley/scanx v0.0.0-20190309010443-e94503791388/go.mod h1:C/WY5lmWfMtPFYYBTd3Lzdn4FTLr+RxlIeiBNye+/os= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/tdewolff/canvas v0.0.0-20260406091912-5d4f7059846e h1:A8iHpv0I/IDv+i5YQ/km/UlqSmonRz4UNIrckFxYc+A= -github.com/tdewolff/canvas v0.0.0-20260406091912-5d4f7059846e/go.mod h1:xCHrGFuVb9eeblIAffMuLzKoRnYHQj8xZq8yZ7YQfEw= -github.com/tdewolff/font v0.0.0-20260314002930-9f995dac393e h1:20EEwnJWwKApfX5KttlWbIjgXrXa+HUvkiVUow1hdJ0= -github.com/tdewolff/font v0.0.0-20260314002930-9f995dac393e/go.mod h1:EFuulYdR5cCTF2zKMW6NxchFgd5xtEPSrjkD1MFWDpA= -github.com/tdewolff/minify/v2 v2.24.11 h1:JlANsiWaRBXedoYtsiZgY3YFkdr42oF32vp2SLgQKi4= -github.com/tdewolff/minify/v2 v2.24.11/go.mod h1:exq1pjdrh9uAICdfVKQwqz6MsJmWmQahZuTC6pTO6ro= -github.com/tdewolff/parse/v2 v2.8.11 h1:SGyjEy3xEqd+W9WVzTlTQ5GkP/en4a1AZNZVJ1cvgm0= -github.com/tdewolff/parse/v2 v2.8.11/go.mod h1:Hwlni2tiVNKyzR1o6nUs4FOF07URA+JLBLd6dlIXYqo= -github.com/tdewolff/test v1.0.11/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8= -github.com/wcharczuk/go-chart/v2 v2.1.2 h1:Y17/oYNuXwZg6TFag06qe8sBajwwsuvPiJJXcUcLL6E= -github.com/wcharczuk/go-chart/v2 v2.1.2/go.mod h1:Zi4hbaqlWpYajnXB2K22IUYVXRXaLfSGNNR7P4ukyyQ= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.8.2 h1:kEGpgqJXdgbkhcOgBxkC0X0PmoPG1ZyoZ117rDVp4zE= -github.com/yuin/goldmark v1.8.2/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/image v0.0.0-20210504121937-7319ad40d33e/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= -golang.org/x/image v0.24.0 h1:AN7zRgVsbvmTfNyqIbbOraYL8mSwcKncEj8ofjgzcMQ= -golang.org/x/image v0.24.0/go.mod h1:4b/ITuLfqYq1hqZcjofwctIhi7sZh2WaCjvsBNjjya8= golang.org/x/image v0.38.0 h1:5l+q+Y9JDC7mBOMjo4/aPhMDcxEptsX+Tt3GgRQRPuE= golang.org/x/image v0.38.0/go.mod h1:/3f6vaXC+6CEanU4KJxbcUZyEePbyKbaLoDOe4ehFYY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= -golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/plot v0.16.0 h1:dK28Qx/Ky4VmPUN/2zeW0ELyM6ucDnBAj5yun7M9n1g= -gonum.org/v1/plot v0.16.0/go.mod h1:Xz6U1yDMi6Ni6aaXILqmVIb6Vro8E+K7Q/GeeH+Pn0c= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -modernc.org/knuth v0.5.5 h1:6lap2U/ISm8aC/4NU58ALFCRllNPaK0EZcIGY/oDgUg= -modernc.org/knuth v0.5.5/go.mod h1:e5SBb35HQBj2aFwbBO3ClPcViLY3Wi0LzaOd7c/3qMk= -modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -star-tex.org/x/tex v0.7.1 h1:4qGAByRyY0WQsOjtcHlxz+FgrYxz8fzxIds2Gjepp5U= -star-tex.org/x/tex v0.7.1/go.mod h1:Y3y0U7sZTltTh/CDZIx0oAtMjG7eMaTuTtvDZGdyhJo= diff --git a/img.go b/img.go index 7bc9ae8..880decd 100644 --- a/img.go +++ b/img.go @@ -103,7 +103,10 @@ func GenImg(width int, outputPath, payload, tmpl string) string { } func renderTemplate(tmp string, data map[string]interface{}) (string, error) { - tmpl := template.Must(template.New("mytemplate").Parse(tmp)) + tmpl, err := template.New("mytemplate").Parse(tmp) + if err != nil { + return "", err + } var buf bytes.Buffer if err := tmpl.Execute(&buf, data); err != nil { return "", err @@ -124,7 +127,11 @@ func renderNode(dc *gg.Context, canvasWidth int, n *Node, y *int, face font.Face case "h3": drawTextBlock(dc, n, canvasWidth, eleH3Size, y, face) case "p": - drawTextBlock(dc, n, canvasWidth, elePSize, y, face) + size := float64(elePSize) + if n.Style.FontSize > 0 { + size = n.Style.FontSize + } + drawTextBlock(dc, n, canvasWidth, size, y, face) case "hr": renderLine(dc, n, canvasWidth, y) case "img": @@ -209,7 +216,7 @@ func drawImage(dc *gg.Context, n *Node, y *int) { } func renderTable(dc *gg.Context, canvasWidth int, table *Node, y *int, face font.Face) { - rows := extractRows(table) + headers, rows := extractRows(table) if len(rows) == 0 { return } @@ -223,9 +230,11 @@ func renderTable(dc *gg.Context, canvasWidth int, table *Node, y *int, face font colCount := len(rows[0]) cellWidth := (canvasWidth - padding) / colCount border := table.Style.Border + for _, row := range rows { x := padding - for _, cell := range row { + for i, cell := range row { + header := headers[i] if border > 0 { dc.SetLineWidth(border) dc.DrawRectangle(float64(x), float64(*y), float64(cellWidth), fontSize+defalutTableBorder) @@ -233,7 +242,11 @@ func renderTable(dc *gg.Context, canvasWidth int, table *Node, y *int, face font dc.Stroke() dc.SetRGB(0, 0, 0) dc.DrawStringAnchored(cell, float64(x+8), float64(*y+20), 0, 0) - x += cellWidth + if w := header.Style.Width; w > 0 { + x += int(w) + } else { + x += cellWidth + } } *y += int(fontSize) + defalutTableBorder } @@ -247,8 +260,9 @@ func renderLine(dc *gg.Context, line *Node, canvasWidth int, y *int) { *y += int(height) } -func extractRows(table *Node) [][]string { +func extractRows(table *Node) ([]*Node, [][]string) { var rows [][]string + var headers []*Node var traverse func(*Node) traverse = func(n *Node) { if n.Tag == "tr" { @@ -257,6 +271,9 @@ func extractRows(table *Node) [][]string { if td.Tag == "td" || td.Tag == "th" { row = append(row, td.Text) } + if td.Tag == "th" { + headers = append(headers, td) + } } if len(row) > 0 { rows = append(rows, row) @@ -267,7 +284,7 @@ func extractRows(table *Node) [][]string { } } traverse(table) - return rows + return headers, rows } func extractNodeRows(table *html.Node) [][]string { @@ -332,9 +349,14 @@ func printImg(prt *escpos.Escpos, imgPath string) error { fmt.Println(err) return 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) + data = escposRaster(gray) _, err = prt.WriteRaw(data) return err diff --git a/printer.go b/printer.go index d8e2396..5a774bf 100644 --- a/printer.go +++ b/printer.go @@ -17,33 +17,11 @@ import ( "github.com/kenshaw/escpos" ) -import ( - "fmt" - - "github.com/google/gousb" -) - -type USBReadWriter struct { - out *gousb.OutEndpoint - in *gousb.InEndpoint // Optional, can be nil if you only write -} - -func (urw *USBReadWriter) Write(p []byte) (n int, err error) { - return urw.out.Write(p) -} - -func (urw *USBReadWriter) Read(p []byte) (n int, err error) { - if urw.in == nil { - return 0, fmt.Errorf("read not supported") - } - return urw.in.Read(p) -} //export PrintImg func PrintImg(printer *C.char, imagePath *C.char) *C.char { goPrinter := C.GoString(printer) goImagePath := C.GoString(imagePath) - var out *gousb.OutEndpoint // printer := "tcp:192.168.100.151:9100" // printer := "usb:/dev/usb/lp1" var w *bufio.ReadWriter @@ -65,53 +43,56 @@ func PrintImg(printer *C.char, imagePath *C.char) *C.char { } defer f.Close() w = bufio.NewReadWriter(bufio.NewReader(f), bufio.NewWriter(f)) - } else if strings.HasPrefix(goPrinter, "int:") { - ctx := gousb.NewContext() - // location := strings.TrimLeft(goPrinter, "int:") - targetBus := 1 - targetAddr := 5 - devs, err := ctx.OpenDevices(func(desc *gousb.DeviceDesc) bool { - return int(desc.Bus) == targetBus && int(desc.Address) == targetAddr - }) - if err != nil || len(devs) == 0 { - log.Fatal("Could not find or open the device") - } - dev := devs[0] - defer dev.Close() - dev.SetAutoDetach(true) + // } else if strings.HasPrefix(goPrinter, "int:") { + // ctx := gousb.NewContext() + // // location := strings.TrimLeft(goPrinter, "int:") + // targetBus := 1 + // targetAddr := 5 + // devs, err := ctx.OpenDevices(func(desc *gousb.DeviceDesc) bool { + // return int(desc.Bus) == targetBus && int(desc.Address) == targetAddr + // }) + // if err != nil || len(devs) == 0 { + // log.Fatal("Could not find or open the device") + // } + // dev := devs[0] + // defer dev.Close() + // dev.SetAutoDetach(true) - // 2. Claim the default interface (usually 0 for printers) - // Note: This may require detaching the kernel driver on Linux - intf, done, err := dev.DefaultInterface() - if err != nil { - log.Fatalf("Failed to claim interface: %v", err) - } - defer done() + // // 2. Claim the default interface (usually 0 for printers) + // // Note: This may require detaching the kernel driver on Linux + // intf, done, err := dev.DefaultInterface() + // if err != nil { + // log.Fatalf("Failed to claim interface: %v", err) + // } + // defer done() - // 3. Open the Bulk Output Endpoint (usually endpoint #1 or #2) - // You may need to inspect desc.Endpoints to find the correct Bulk Out ID - out, err = intf.OutEndpoint(1) - if err != nil { - log.Fatalf("Failed to open OUT endpoint: %v", err) - } - // w = bufio.NewReadWriter(bufio.NewReader(outPort), bufio.NewWriter(f)) - rw := &USBReadWriter{out: out} - reader := bufio.NewReader(rw) - writer := bufio.NewWriter(rw) - w = bufio.NewReadWriter(reader, writer) + // // 3. Open the Bulk Output Endpoint (usually endpoint #1 or #2) + // // You may need to inspect desc.Endpoints to find the correct Bulk Out ID + // out, err = intf.OutEndpoint(1) + // if err != nil { + // log.Fatalf("Failed to open OUT endpoint: %v", err) + // } + // // w = bufio.NewReadWriter(bufio.NewReader(outPort), bufio.NewWriter(f)) + // rw := &USBReadWriter{out: out} + // reader := bufio.NewReader(rw) + // writer := bufio.NewWriter(rw) + // w = bufio.NewReadWriter(reader, writer) } prt := escpos.New(w) prt.Init() prt.SetSmooth(1) + prt.SetAlign("left") + err := printImg(prt, goImagePath) if err != nil { return NewErr(err) } + prt.WriteRaw([]byte{0x1B, 0x64, 0x03}) prt.Cut() prt.End() w.Flush() - time.Sleep(100 * time.Millisecond) + time.Sleep(1 * time.Second) return NewOk(nil) } diff --git a/vo.go b/vo.go index 360fcd2..9f46f68 100644 --- a/vo.go +++ b/vo.go @@ -10,13 +10,13 @@ import ( ) type Reply struct { - Status int `json:"status"` + Status string `json:"status"` // "ok", "error" Err string `json:"err"` Result interface{} `json:"result"` } func NewErr(err error) *C.char { - e := Reply{Status: 1, Err: err.Error()} + e := Reply{Status: "error", Err: err.Error()} b, err := json.Marshal(e) if err != nil { log.Println("Error json.Marshal:", err.Error()) @@ -25,7 +25,7 @@ func NewErr(err error) *C.char { } func NewOk(data interface{}) *C.char { - e := Reply{Status: 0, Result: data} + e := Reply{Status: "ok", Result: data} b, err := json.Marshal(e) if err != nil { log.Println("Error json.Marshal:", err.Error())