我正在研究如何在 Windows 上从 Python 将数据打印到本地打印机。
如果您有文档及其路径,我发现的一个简单方法是:
import os
os.startfile("C:/Users/Jdash/Desktop/TestFile.txt", "print")
但是,我想要的是直接发送文本字符串,而不必创建文档。
这个通过 Python代码打印的 Windows似乎完成了我想要的:
# 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()
我的问题是,还有哪些其他方法可以在 Windows 上实现从 Python 打印,从而允许直接发送文本字符串?
或者也许我让自己过于复杂并且文档的创建被忽视了?
直接打印的一种方法是使用
win32print
. 以下是几个示例,其中还展示了在 Windows 上从 Python 打印文本、pdf 文件、图像等的其他方法。但是,您正在寻找的似乎是以下内容:这是另一个似乎更普遍的例子。在两台不同的打印机上测试。(上面的一个只对一个起作用)
代码参考