Print to standard printer from Python?
Is there a reasonably standard and cross platform way to print text (or even PS/PDF) to the system defined printer? Assuming CPython here, not something clever like using Jython and the Java printing API.
Assuming Java printing can do this another «clever» solution is JPype(a way to get cpython and the jvm to communicate/run code on each other)
5 Answers 5
This only works on Windows.
import os os.startfile("C:/Users/TestFile.txt", "print")
This will start the file, in its default opener, with the verb ‘print’, which will print to your default printer.Only requires the os module which comes with the standard library
The Linux or Mac option is using the same OS module: import os os.system(«lpr -P printer_name file_name.txt») Where «printer_name» represents the name of the printer and «file_name.txt» is the name of the file that will be printed.
This works fine for text files, but does not work with images. How can we print a jpg image with this method?
Unfortunately, there is no standard way to print using Python on all platforms. So you’ll need to write your own wrapper function to print.
You need to detect the OS your program is running on, then:
import subprocess lpr = subprocess.Popen("/usr/bin/lpr", stdin=subprocess.PIPE) lpr.stdin.write(your_data_here)
To print to any printer on the network you can send a PJL/PCL print job directly to a network printer on port 9100.
Please have a look at the below link that should give a good start:
Also, If there is a way to call Windows cmd you can use FTP put to print your page on 9100. Below link should give you details, I have used this method for HP printers but I believe it will work for other printers.
You can try the wxPython library. It’s a cross platform UI library.
This is very promising! I don’t work with python + printing any more, but if printing demonstrably works cross platform with wxpython, I would accept this answer.
I apologize @Admdebian, I know you posted this 7 years ago but today I accidentally downvoted your answer (thick fingers). If you make an edit, I’ll remove my downvote.
I find this to be the superior solution, at least when dealing with web applications. The idea is this: convert the HTML page to a PDF document and send that to a printer via gsprint .
Even though gsprint is no longer in development, it works really, really well. You can choose the printer and the page orientation and size among several other options.
I convert the web page to PDF using Puppeteer, Chrome’s headless browser. But you need to pass in the session cookie to maintain credentials.
Send a print job to USB printer using Python
I can start with a PDF, PRN, or PS file. How do I send it to a USB printer using Python? What module should I get started with?
3 Answers 3
As far as I know, these are the two package available:
It sounds like you’re using Windows, so let’s start with that — the answer changes if you’re using Linux.
There are two ways to print within Windows. The first most common way is to send individual drawing commands through the Windows GDI interface. To do this you must place every individual element on the page in its proper location (text strings, images and shapes) while selecting the proper colors and fonts. Easy if you’re generating the data yourself, much harder if you have to parse a file that you’re reading.
The other option is to send to the printer in a «raw» mode, where the printer driver essentially gets bypassed. For this to work the printer must natively understand the stream of bytes that you feed to it. There are some printers that understand Postscript natively, but I’m not sure about PDF, and PRN isn’t a standard format.
I’ve never done raw printing through Python myself, but here’s a link to a short snippet of sample code (and an idea of the problems to expect): http://bytes.com/topic/python/answers/512143-printing-raw-postscript-data-windows
import wx import win32api import win32print class ComboBoxFrame(wx.Frame): def __init__(self): # creates a drop down with the list of printers available wx.Frame.__init__(self, None, -1, 'Printers', size=(350, 300)) panel = wx.Panel(self, -1) list=[] #Enum printers returns the list of printers available in the network printers = win32print.EnumPrinters( win32print.PRINTER_ENUM_CONNECTIONS + win32print.PRINTER_ENUM_LOCAL) for i in printers: list.append(i[2]) sampleList = list wx.StaticText(panel, -1, "Please select one printer from the list of printers to print:", (15, 15)) self.combo =wx.ComboBox(panel, -1, "printers", (15, 40), wx.DefaultSize,sampleList, wx.CB_READONLY ) btn2 = wx.Button(panel, label="Print", pos=(15, 60)) btn2.Bind(wx.EVT_BUTTON, self.Onmsgbox) self.Centre() self.Show() def Onmsgbox(self, event): filename='duplicate.docx' # here the user selected printer value will be given as input #print(win32print.GetDefaultPrinter ()) win32api.ShellExecute ( 0, "printto", filename, '"%s"' % self.combo.GetValue(), ".", 0 ) print(self.combo.GetValue()) if __name__ =='__main__': app = wx.App() ComboBoxFrame().Show() app.MainLoop()
A code dump, whist it may be technically correct, doesn’t necessarily help the OP or future visitors. I would pad out the answer by explaining the code, even comments within the code are helpful.
Печатаем документ в виде чека с помощью Python и Parse
Не так давно передо мной встала задача: распечатка документа определенного формата с помощью мобильного устройства. На телефоне должны были вводиться определенные значения, отправляться на сервер (для того, чтобы потом можно было использовать эти данные на веб сайте) и печать документ с этими данными. С самого начала мой выбор пал на Google cloud print, так как он максимально прост в использовании и решении подобных задач. Но при использовании этого варианта есть несколько недостатков:
- Очень медленная обработка запроса
- Нужно где-то формировать PDF документ и возвращать ссылку на него
- Постоянно нужно выбирать принтер (если у вас подключен только один принтер к Google cloud print, то все равно нужно выбирать между ним и сохранением на Google Drive)
С самого начала нам нужно научиться формировать PDF документ. Проще всего конвертировать HTML разметку в PDF с помощью библиотеки xhtml2pdf. Для начала установим необходимые пакеты:
sudo apt-get install python-cups python-pip python-dev
python-cups – это библиотека, с помощью которой Python может работать с вашим принтером, python-pip сделает установку xhtml2pdf проще.
Дальше устанавливаем xhtml2pdf:
sudo pip install xhtml2pdf
Следующий код покажет, как все работает:
#!/usr/bin/env python # Печать файла import cups from xhtml2pdf import pisa def main(): # Имя, для промежуточного файла PDF формата filename = "/home/pi/print.pdf" # Генерируем контент в виде HTML страницы xhtml xhtml + xhtml += "Coloured red using css
\n" pdf = pisa.CreatePDF(xhtml, file(filename, "w")) if not pdf.err: # Закрываем PDF файл - в противном случае мы не сможем прочитать его pdf.dest.close() # Печатаем файл используя CUPS conn = cups.Connection() # Получаем список всех принтеров, подключенных к компьютеру printers = conn.getPrinters() for printer in printers: # Выводим имя принтера в консоль print printer, printers[printer]["device-uri"] # Получаем первый принтер со списка принтеров printer_name = printers.keys()[0] conn.printFile(printer_name, filename, "Python_Status_print", <>) else: print "Unable to create pdf file" if __name__=="__main__": main()
Тут все предельно просто и понятно. Картинки можно вставлять обычным HTML кодом:
Но возникает вопрос: «Где хранить данные и откуда их достать для распечатки?«.
Для этого мы воспользуемся сервисом Parse. Это хорошее бесплатное облако, для хранения ваших данных. Его удобно использовать тем, что оно работает практически на всех платформах (Грубо говоря: вы можете добавить закинуть данные на облако с Android устройства, а достать на IOS, PHP, JavaScript и других платформах).
Специально для Python там есть REST API, с помощью которого можно слать любые запросы в несколько строчек. Для того, чтобы достать их с Pars’a используем код:
connection = httplib.HTTPSConnection('api.parse.com', 443) connection.connect() connection.request('GET', '/1/classes/TestPay', '', < "X-Parse-Application-Id": "yourAppId", "X-Parse-REST-API-Key": "yourRestApiKey" >) result = json.loads(connection.getresponse().read())
Здесь yourAppId – это ключ к вашему приложению, а yourRestApiKey – ключ к Api, которое вы используете. Детальнее читайте на сайте. Дальше массив result обрабатываете как JSON обьект и можете вставлять в вашу HTML страницу, которая тут же пойдет на печать.
Если возникнут какие-то вопросы, подсказки или вы просто решите высказать свое мнение по поводу статьи — пишите в комментариях. Всех с наступающим Новым Годом!