Golang实现文档打印到打印机的功能

Golang实现文档打印到打印机的功能 如何根据打印机名称发送文件进行打印?在Python中,这很简单:os.startfile(“D:\TestPrint\testPrint.docx”, “print”)

// 示例代码:在Go中打印文档
// 注意:Go标准库没有直接提供打印功能,通常需要调用操作系统API或使用第三方库。
3 回复

os.startfile 在 Python 中仅适用于 Windows。

然而,Go 语言标准库的大部分内容更侧重于类 Linux 系统。

你可能需要自己实现它。

由于我没有 Windows 系统,因此无法在这方面帮助你。

更多关于Golang实现文档打印到打印机的功能的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


看起来 WireGuard 实现了一个对 Windows ShellExecute 的封装,这与 Python 的 os.startfile 调用的底层 Windows 函数相同:wireguard-windows/shellexecute.go at master · WireGuard/wireguard-windows · GitHub

func main() {
    fmt.Println("hello world")
}

在Go中实现文档打印到指定打印机,可以通过调用操作系统API或使用第三方库完成。以下是一个基于Windows系统的示例,使用syscall调用ShellExecuteAPI实现打印功能:

package main

import (
    "fmt"
    "syscall"
    "unsafe"
)

const (
    SW_HIDE            = 0
    SW_SHOWNORMAL      = 1
    SW_NORMAL          = 1
    SW_SHOWMINIMIZED   = 2
    SW_SHOWMAXIMIZED   = 3
    SW_MAXIMIZE        = 3
    SW_SHOWNOACTIVATE  = 4
    SW_SHOW            = 5
    SW_MINIMIZE        = 6
    SW_SHOWMINNOACTIVE = 7
    SW_SHOWNA          = 8
    SW_RESTORE         = 9
    SW_SHOWDEFAULT     = 10
    SW_FORCEMINIMIZE   = 11
)

func main() {
    // 文件路径和打印机名称
    filePath := `D:\TestPrint\testPrint.docx`
    printerName := `"Your Printer Name"` // 替换为实际打印机名称
    
    // 加载shell32.dll
    shell32 := syscall.NewLazyDLL("shell32.dll")
    shellExecute := shell32.NewProc("ShellExecuteW")
    
    // 调用ShellExecute打印文档
    ret, _, err := shellExecute.Call(
        0,
        uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("print"))),
        uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(filePath))),
        uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(printerName))),
        0,
        SW_HIDE,
    )
    
    if ret <= 32 {
        fmt.Printf("打印失败,错误代码: %d, 错误信息: %v\n", ret, err)
    } else {
        fmt.Println("打印任务已发送")
    }
}

如果需要跨平台支持,可以使用github.com/alexbrainman/printer库:

package main

import (
    "fmt"
    "github.com/alexbrainman/printer"
)

func main() {
    // 获取默认打印机
    p, err := printer.Default()
    if err != nil {
        fmt.Printf("获取默认打印机失败: %v\n", err)
        return
    }
    defer p.Close()

    // 或者通过名称打开特定打印机
    // p, err := printer.Open("Your Printer Name")
    
    err = p.StartDocument("My Document", "RAW")
    if err != nil {
        fmt.Printf("开始文档失败: %v\n", err)
        return
    }
    defer p.EndDocument()

    err = p.StartPage()
    if err != nil {
        fmt.Printf("开始页面失败: %v\n", err)
        return
    }

    // 写入打印内容(这里以文本为例)
    // 对于Word文档,需要先转换为打印机能识别的格式
    _, err = p.Write([]byte("Test printing content\n"))
    if err != nil {
        fmt.Printf("写入打印内容失败: %v\n", err)
        return
    }

    err = p.EndPage()
    if err != nil {
        fmt.Printf("结束页面失败: %v\n", err)
    }
}

对于直接打印Office文档,更实用的方法是使用命令行工具。以下是调用系统默认程序打印的示例:

package main

import (
    "fmt"
    "os/exec"
    "runtime"
)

func printDocument(filePath, printerName string) error {
    var cmd *exec.Cmd
    
    switch runtime.GOOS {
    case "windows":
        // 使用Windows的print命令
        cmd = exec.Command("cmd", "/C", "print", "/D:"+printerName, filePath)
    case "darwin":
        // macOS使用lp命令
        cmd = exec.Command("lp", "-d", printerName, filePath)
    case "linux":
        // Linux使用lp命令
        cmd = exec.Command("lp", "-d", printerName, filePath)
    default:
        return fmt.Errorf("不支持的操作系统: %s", runtime.GOOS)
    }
    
    output, err := cmd.CombinedOutput()
    if err != nil {
        return fmt.Errorf("打印失败: %v, 输出: %s", err, output)
    }
    
    return nil
}

func main() {
    err := printDocument("D:\\TestPrint\\testPrint.docx", "MyPrinter")
    if err != nil {
        fmt.Printf("打印错误: %v\n", err)
    } else {
        fmt.Println("文档已发送到打印机")
    }
}

这些示例展示了在Go中实现文档打印的不同方法,具体选择取决于你的操作系统和需求。

回到顶部