|
@@ -3,6 +3,7 @@ package service
|
|
|
import (
|
|
import (
|
|
|
"fmt"
|
|
"fmt"
|
|
|
"os"
|
|
"os"
|
|
|
|
|
+ "os/exec"
|
|
|
"syscall"
|
|
"syscall"
|
|
|
"unsafe"
|
|
"unsafe"
|
|
|
|
|
|
|
@@ -97,4 +98,38 @@ func PrintRaw(printerName string, data []byte) error {
|
|
|
return nil
|
|
return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-var _ = os.Stderr // keep import
|
|
|
|
|
|
|
+// copyToPrinter 通过临时文件 + COPY /B 到打印机共享发送 RAW 数据
|
|
|
|
|
+func copyToPrinter(printerName string, data []byte) error {
|
|
|
|
|
+ tmpFile, err := os.CreateTemp("", "tkt_*.bin")
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ tmpPath := tmpFile.Name()
|
|
|
|
|
+ defer os.Remove(tmpPath)
|
|
|
|
|
+ if _, err := tmpFile.Write(data); err != nil {
|
|
|
|
|
+ tmpFile.Close()
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ tmpFile.Close()
|
|
|
|
|
+
|
|
|
|
|
+ // 尝试 COPY /B file \\127.0.0.1\share_name
|
|
|
|
|
+ // 先查共享名
|
|
|
|
|
+ shareName := printerName
|
|
|
|
|
+ for _, path := range []string{
|
|
|
|
|
+ fmt.Sprintf("\\\\127.0.0.1\\%s", shareName),
|
|
|
|
|
+ fmt.Sprintf("\\\\localhost\\%s", shareName),
|
|
|
|
|
+ } {
|
|
|
|
|
+ cmd := exec.Command("cmd", "/C", "copy", "/B", tmpPath, path)
|
|
|
|
|
+ output, err := cmd.CombinedOutput()
|
|
|
|
|
+ if err == nil {
|
|
|
|
|
+ return nil
|
|
|
|
|
+ }
|
|
|
|
|
+ // 打印失败,尝试下一个
|
|
|
|
|
+ _ = output
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 最后回退 WritePrinter API
|
|
|
|
|
+ return PrintRaw(printerName, data)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+var _ = os.Stderr
|