直接从 Golang 打印到外部打印机

我可以从 Golang 直接打印到我的(物理的、外部的)打印机,而不使用打印机驱动程序或 CUPS 或任何其他此类复杂性吗?



慕尼黑5688855
浏览 1424回答 1
1回答

白衣染霜花

是的!下面使用 IPP(互联网打印协议)从 Golang 打印 postscript 文件,过去 20 年制造的大多数网络打印机都支持该协议:import (    "bytes"    "fmt"    "io"    "io/ioutil"    "net/http"    "os"    "strconv"    "github.com/alexflint/go-arg"    "github.com/kr/pretty"    "github.com/phin1x/go-ipp")func Main() error {    var args struct {        URI            string `arg:"positional,required"`        PostscriptFile string `arg:"positional,required"`    }    arg.MustParse(&args)    // define a ipp request    req := ipp.NewRequest(ipp.OperationPrintJob, 1)    req.OperationAttributes[ipp.AttributeCharset] = "utf-8"    req.OperationAttributes[ipp.AttributeNaturalLanguage] = "en"    req.OperationAttributes[ipp.AttributePrinterURI] = args.URI    req.OperationAttributes[ipp.AttributeRequestingUserName] = "some-user"    req.OperationAttributes[ipp.AttributeDocumentFormat] = "application/octet-stream"    // encode request to bytes    payload, err := req.Encode()    if err != nil {        return fmt.Errorf("error encoding ipp request: %w", err)    }    // read the test page    postscript, err := ioutil.ReadFile(args.PostscriptFile)    if err != nil {        return fmt.Errorf("error reading postscript file: %w", err)    }    payload = append(payload, postscript...)    // send ipp request to remote server via http    httpReq, err := http.NewRequest("POST", args.URI, bytes.NewReader(payload))    if err != nil {        return fmt.Errorf("error creating http request: %w", err)    }    // set ipp headers    httpReq.Header.Set("Content-Length", strconv.Itoa(len(payload)))    httpReq.Header.Set("Content-Type", ipp.ContentTypeIPP)    // perform the request    var httpClient http.Client    httpResp, err := httpClient.Do(httpReq)    if err != nil {        return fmt.Errorf("error executing http request: %w", err)    }    defer httpResp.Body.Close()    // read the response    buf, err := io.ReadAll(httpResp.Body)    if err != nil {        return fmt.Errorf("error reading response body: %w", err)    }    // response must be 200 for a successful operation    // other possible http codes are:    // - 500 -> server error    // - 426 -> sever requests a encrypted connection    // - 401 -> forbidden -> need authorization header or user is not permitted    if httpResp.StatusCode != 200 {        return fmt.Errorf("printer said %d: %s", httpResp.StatusCode, buf)    }    // decode ipp response    resp, err := ipp.NewResponseDecoder(bytes.NewReader(buf)).Decode(nil)    if err != nil {        return fmt.Errorf("error decoding ipp response: %w", err)    }    // print the response    fmt.Println("Submitted print job. Response was:")    pretty.Println(resp)    return nil}使用的 URL 只是 http://ip-address-of-myprinter(这是在兄弟 HL 系列打印机上测试的)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go