I'm doing some research on how to print data to a local printer from Python on Windows.
If you have the document and its path, a simple way I found was this:
import os
os.startfile("C:/Users/Jdash/Desktop/TestFile.txt", "print")
However, what I want is to directly send the text string, without having to create the document.
This Windows Printing Via Python code seems to accomplish what I want:
# create a dc (Device Context) object (actually a PyCDC)
dc = win32ui.CreateDC()
# convert the dc into a "printer dc"
# get default printer
printername = win32print.GetDefaultPrinter ()
# leave out the printername to get the default printer automatically
dc.CreatePrinterDC(printername)
# you need to set the map mode mainly so you know how
# to scale your output. I do everything in points, so setting
# the map mode as "twips" works for me.
dc.SetMapMode(win32con.MM_TWIPS) # 1440 per inch
# here's that scaling I mentioned:
scale_factor = 20 # i.e. 20 twips to the point
# start the document. the description variable is a string
# which will appear in the print queue to identify the job.
dc.StartDoc('Win32print test')
# to draw anything (other than text) you need a pen.
# the variables are pen style, pen width and pen color.
pen = win32ui.CreatePen(0, int(scale_factor), 0)
# SelectObject is used to apply a pen or font object to a dc.
dc.SelectObject(pen)
# how about a font? Lucida Console 10 point.
# I'm unsure how to tell if this failed.
font = win32ui.CreateFont({
"name": "Lucida Console",
"height": int(scale_factor * 10),
"weight": 400,
})
# again with the SelectObject call.
dc.SelectObject(font)
# okay, now let's print something.
# TextOut takes x, y, and text values.
# the map mode determines whether y increases in an
# upward or downward direction; in MM_TWIPS mode, it
# advances up, so negative numbers are required to
# go down the page. If anyone knows why this is a
# "good idea" please email me; as far as I'm concerned
# it's garbage.
dc.TextOut(scale_factor * 72,
-1 * scale_factor * 72,
"Testing...")
# must not forget to tell Windows we're done.
dc.EndDoc()
My question is, what other ways are there to achieve printing from Python on Windows that allows the text string to be sent directly?
Or maybe I'm overcomplicating myself and the creation of the document goes unnoticed?
One way to print directly is to use
win32print
. Here are several examples where it also shows other ways to print text, pdf files, images etc., from Python on Windows. But what you're looking for, it seems, is the following:Here is another example that seems to be more universal. Tested on two different printers. (The one above only worked on one)
code reference