- PVSM.RU - https://www.pvsm.ru -

Печатаем документ в виде чека с помощью Python и Parse

Не так давно передо мной встала задача: распечатка документа определенного формата с помощью мобильного устройства. На телефоне должны были вводиться определенные значения, отправляться на сервер (для того, чтобы потом можно было использовать эти данные на веб сайте) и печать документ с этими данными. С самого начала мой выбор пал на Google cloud print [1], так как он максимально прост в использовании и решении подобных задач. Но при использовании этого варианта есть несколько недостатков:

  • Очень медленная обработка запроса
  • Нужно где-то формировать PDF документ и возвращать ссылку на него
  • Постоянно нужно выбирать принтер (если у вас подключен только один принтер к Google cloud print, то все равно нужно выбирать между ним и сохранением на Google Drive)

Поэтому я решил написать свой скрипт для подобных операций.

Мой выбор пал на язык программирования Python, так как он наиболее гибкий и подходит для данных задач. В своей разработке я использовал ОС Ubuntu Linux. Так что установка библиотек будет представлена для нее.

С самого начала нам нужно научиться формировать 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 = "<h1>Test print</h1>n"
       xhtml += "<h2>This is printed from within a Python application</h2>n"
       xhtml += "<p style="color:red;">Coloured red using css</p>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 кодом:

<p><img src='/home/usr/image.jpg'/>

Но возникает вопрос: "Где хранить данные и откуда их достать для распечатки?".

Для этого мы воспользуемся сервисом Parse [2]. Это хорошее бесплатное облако, для хранения ваших данных. Его удобно использовать тем, что оно работает практически на всех платформах (Грубо говоря: вы можете добавить закинуть данные на облако с 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": "<b>yourAppId</b>",
       "X-Parse-REST-API-Key": "<b>yourRestApiKey</b>"
 })
 result = json.loads(connection.getresponse().read())

Здесь yourAppId – это ключ к вашему приложению, а yourRestApiKey – ключ к Api, которое вы используете. Детальнее читайте на сайте. Дальше массив result обрабатываете как JSON обьек и можете вставлять в вашу HTML страницу, которая тут же пойдет на печать.

Если возникнут какие-то вопросы, подсказки или вы просто решите высказать свое мнение по поводу статьи — пишите в комментариях. Всех с наступающим Новым Годом!

Автор: StopFan

Источник [3]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/78333

Ссылки в тексте:

[1] Google cloud print: http://www.google.com/cloudprint/learn/?hl=ru

[2] Parse: http://parse.com

[3] Источник: http://habrahabr.ru/post/246989/