|
@@ -3,8 +3,8 @@ package service
|
|
|
import (
|
|
import (
|
|
|
"fmt"
|
|
"fmt"
|
|
|
"os"
|
|
"os"
|
|
|
|
|
+ "os/exec"
|
|
|
"syscall"
|
|
"syscall"
|
|
|
- "unsafe"
|
|
|
|
|
|
|
|
|
|
"github.com/tarm/serial"
|
|
"github.com/tarm/serial"
|
|
|
)
|
|
)
|
|
@@ -66,10 +66,8 @@ func NewUSBPrinter(printerName string) (*USBPrinter, error) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 所有路径都失败 → 用临时文件 + copy 命令的方式
|
|
|
|
|
- return nil, fmt.Errorf("无法打开打印机 %s (\\\\.\\ 和 UNC均失败): %w。"+
|
|
|
|
|
- "请到 Windows 控制面板→设备和打印机→右键 %s→打印机属性→共享→勾选'共享这台打印机'并设置共享名",
|
|
|
|
|
- printerName, lastErr, printerName)
|
|
|
|
|
|
|
+ // 所有路径都失败 → 回退 PowerShell Out-Printer
|
|
|
|
|
+ return nil, fmt.Errorf("CREATE_FILE_FAILED:%s", printerName)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (p *USBPrinter) Write(data []byte) error {
|
|
func (p *USBPrinter) Write(data []byte) error {
|
|
@@ -81,23 +79,25 @@ func (p *USBPrinter) Close() error {
|
|
|
return syscall.CloseHandle(p.handle)
|
|
return syscall.CloseHandle(p.handle)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// PrintRawFile 备选方案:通过临时文件 + copy 命令打印
|
|
|
|
|
|
|
+// PrintRawFile 通过临时文件 + PowerShell Out-Printer 打印
|
|
|
func PrintRawFile(printerName string, data []byte) error {
|
|
func PrintRawFile(printerName string, data []byte) error {
|
|
|
tmpFile, err := os.CreateTemp("", "ticket_*.bin")
|
|
tmpFile, err := os.CreateTemp("", "ticket_*.bin")
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
- defer os.Remove(tmpFile.Name())
|
|
|
|
|
|
|
+ tmpPath := tmpFile.Name()
|
|
|
|
|
+ defer os.Remove(tmpPath)
|
|
|
if _, err := tmpFile.Write(data); err != nil {
|
|
if _, err := tmpFile.Write(data); err != nil {
|
|
|
tmpFile.Close()
|
|
tmpFile.Close()
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
tmpFile.Close()
|
|
tmpFile.Close()
|
|
|
- _, _, _ = syscall.NewLazyDLL("kernel32.dll").NewProc("CopyFileW").Call(
|
|
|
|
|
- uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(tmpFile.Name()))),
|
|
|
|
|
- uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(fmt.Sprintf("\\\\127.0.0.1\\%s", printerName)))),
|
|
|
|
|
- 0)
|
|
|
|
|
- return nil
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // PowerShell: Get-Content <file> -Encoding Byte | Out-Printer -Name "<printer>"
|
|
|
|
|
+ cmd := exec.Command("powershell", "-Command",
|
|
|
|
|
+ fmt.Sprintf("Get-Content -Path '%s' -Encoding Byte | Out-Printer -Name '%s'", tmpPath, printerName))
|
|
|
|
|
+ return cmd.Run()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-var _ = os.Stderr // keep os import
|
|
|
|
|
|
|
+var _ = os.Stderr // keep os import
|
|
|
|
|
+var _ = exec.ErrNotFound // keep exec import
|