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

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

  • Очень медленная обработка запроса
  • Нужно где-то формировать 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. Это хорошее бесплатное облако, для хранения ваших данных. Его удобно использовать тем, что оно работает практически на всех платформах (Грубо говоря: вы можете добавить закинуть данные на облако с 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 страницу, которая тут же пойдет на печать.

Если возникнут какие-то вопросы, подсказки или вы просто решите высказать свое мнение по поводу статьи — пишите в комментариях. Всех с наступающим Новым Годом!
  • +11
  • 16,3k
  • 7
Поделиться публикацией

Похожие публикации

Комментарии 7
    0
    Может у кого стояла задача прикрутить xhtml2pdf к python3 или найти аналог? Мне не удалось ни первое, ни второе. Поделитесь рецептом.
      0
      Может быть это не решение вашей проблемы, но в гитхабе у них есть коммиты 9 месячной давности с решением проблемы совместимости
      github.com/chrisglass/xhtml2pdf/tree/master/xhtml2pdf
        +1
        Хотя я попробовал поставить — всё устанавливается, но не импортирует pisa. Где-то ошибки совместимости еще в reportlab остались.
        Вот на SO есть подобный вашему вопрос stackoverflow.com/questions/19954959/python3-pdf-generator-library
        Возможно чем-то поможет.
          0
          Конечно, вручную PDF размечать — то ещё удовольствие, но лучше, чем ничего. Спасибо большое, по крайней мере, появилось направление, куда копать. К сожалению. копать придётся:
          stackoverflow.com/a/27698848/3879774
          0
          Я использую pdfkit, это, правда, не совсем то.
          –2
          Извините, заголовок подправьте…
            0
            Уже исправил, спасибо за внимательность.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое