Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I print to an actual printer?

Tags:

printing

go

I have a messaging server written in Go. Now I have a requirement that some messages need to be printed out on paper by the server.

How can I implement this in Go? I'm having a real hard time finding anything on the subject.

The app will be running on Windows machines and needs to be able to print UTF8 encoded text in a fixed width font. So no fancy formatting (bold text, color etc) is needed.

I'm rather completely in the dark on how to go about this... Can someone shed some light on this for me and point me in the right direction?

like image 414
IamNaN Avatar asked Apr 07 '15 12:04

IamNaN


People also ask

How do I set my printer to print actual size?

You can click on search and just type "printers" and it should bring up the option. Click on your printer and select "Manage". Then, click on the "Printing preferences" link, this will open up the Printer Preferences dialog box. Click on the "Effects" tab, and make sure the "Actual size" option is selected.


2 Answers

Using the answers from @abalos and @alex I was able to get this to work the way I need it to. Answering this to supply a sample of how to use it - it's pretty straightforward using alex's library:

import prt "github.com/alexbrainman/printer"

...

name, err := prt.Default() // returns name of Default Printer as string
if err != nil {
    log.fatal(err)
}
p, err := prt.Open(name) // Opens the named printer and returns a *Printer
if err != nil {
    log.fatal(err)
}
err = p.StartDocument("test", "text") // test: doc name, text: doc type
if err != nil {
    log.fatal(err)
}
err = p.StartPage() // begin a new page
if err != nil {
    log.fatal(err)
}
n, err := p.Write([]byte("Hello, Printer!")) // Send some text to the printer
if err != nil {
    log.fatal(err)
}
fmt.Println("Num of bytes written to printer:", n)
err = p.PageEnd() // end of page
if err != nil {
    log.fatal(err)
}
err = p.DocumentEnd() // end of document
if err != nil {
    log.fatal(err)
}
err = p.Close() // close the resource
if err != nil {
    log.fatal(err)
}

More details on the Windows API can be found here

like image 99
IamNaN Avatar answered Oct 20 '22 22:10

IamNaN


It's possible to use Go to call the correct command line arguments to print whatever files are needed. You'd just need to print this information to a file first.

Please see the information on Microsoft TechNet for this method.

Another method I am less familiar with is to use the DLL's present in Windows through Go to invoke printing. I wasn't able to find as much information on this, but this Go documentation has some pretty good examples.

There are a couple directions you can look in! :)

like image 27
abalos Avatar answered Oct 20 '22 21:10

abalos