print_label.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #!/usr/bin/env python
  2. """print_label.py - print a label with the name, the company and the person_id (in a barcode) of an attendee
  3. Copyright 2015 Emiliano Mattioli <oloturia AT gmail.com>
  4. Davide Alberani <da@erlug.linux.it>
  5. RaspiBO <info@raspibo.org>
  6. Licensed under the Apache License 2.0
  7. """
  8. import os
  9. import sys
  10. import cups
  11. import time
  12. import tempfile
  13. from PIL import Image, ImageFont, ImageDraw
  14. KEEP_IMG = True
  15. LABEL_WIDTH = 6744
  16. LABEL_HEIGHT = 1872
  17. FONT_TEXT = 'Ubuntu-C.ttf'
  18. #FONT_TEXT = 'CONCIBB_.TTF'
  19. FONT_TEXT_ENCODING = 'latin-1'
  20. FONT_BARCODE = 'free3of9.ttf'
  21. PRINTER_NAME = None
  22. PRINTER_NAME = 'DYMO_LabelWriter_450'
  23. def debug(msg):
  24. print '%s: %s' % (time.time(), msg)
  25. def _get_resource(filename):
  26. return os.path.join(os.path.dirname(sys.argv[0]), filename)
  27. def build_label(w, h, barcode_text, line1, line2, font_text=FONT_TEXT, font_barcode=FONT_BARCODE):
  28. debug('build_label start')
  29. barcode_text = "*" + barcode_text + "*"
  30. line1 = unicode(line1, 'utf-8').encode(FONT_TEXT_ENCODING, 'ignore')
  31. line2 = unicode(line2, 'utf-8').encode(FONT_TEXT_ENCODING, 'ignore')
  32. fontbar = ImageFont.truetype(_get_resource(font_barcode), 1000)
  33. fontname = ImageFont.truetype(_get_resource(font_text), 550)
  34. fontjob = ImageFont.truetype(_get_resource(font_text), 360)
  35. debug('build_label font done')
  36. image = Image.new('RGB', (w, h), (255, 255, 255))
  37. draw = ImageDraw.Draw(image)
  38. wbar, hbar = draw.textsize(barcode_text, font=fontbar)
  39. wnorm1, hnorm1 = draw.textsize(line1, font=fontname)
  40. wnorm2, hnorm2 = draw.textsize(line2, font=fontjob)
  41. debug('build_label height calc done')
  42. draw.text(((w-wnorm1)/2, -670+(h-hnorm1)/2), line1, (0, 0, 0), font=fontname)
  43. draw.text(((w-wnorm2)/2, -220+(h-hnorm2)/2), line2, (0, 0, 0), font=fontjob)
  44. draw.text(((w-wbar)/2, 425+(h-hbar)/2), barcode_text, (0, 0, 0), font=fontbar)
  45. debug('build_label draw text done')
  46. if not KEEP_IMG:
  47. tmpfile = tempfile.NamedTemporaryFile(prefix='eventman_print_label_', suffix='.png')
  48. else:
  49. tmpfile = tempfile.mktemp(prefix='eventman_print_label_', suffix='.png')
  50. tmpfile = open(tmpfile, 'wb')
  51. image.save(tmpfile, dpi=[600, 300], format='png')
  52. debug('build_label end')
  53. return tmpfile
  54. def print_label(label_file, name):
  55. debug('print_label start')
  56. conn = cups.Connection()
  57. printer = PRINTER_NAME or conn.getDefault()
  58. debug('print_label connection done')
  59. conn.printFile(printer, label_file.name, name, {})
  60. debug('print_label end')
  61. def run():
  62. debug('run start')
  63. # Always consume stdin.
  64. sys.stdin.read()
  65. name = ' '.join([os.environ.get('NAME') or '', os.environ.get('SURNAME') or ''])
  66. company = os.environ.get('COMPANY') or ''
  67. # Print the decimal value SEQ as an hex of at least 6 digits.
  68. seq = os.environ.get('SEQ_HEX', '0')
  69. label_file = build_label(LABEL_WIDTH, LABEL_HEIGHT, seq, name, company)
  70. print_label(label_file, name)
  71. debug('run end')
  72. if __name__ == '__main__':
  73. try:
  74. run()
  75. except Exception, e:
  76. sys.stderr.write('print_label. Exception raised: %s\n' % e)