116 lines
3.2 KiB
Python
116 lines
3.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
"""barcode.base
|
|
|
|
"""
|
|
|
|
from barcode.writer import SVGWriter
|
|
|
|
|
|
class Barcode(object):
|
|
|
|
name = ''
|
|
|
|
digits = 0
|
|
|
|
default_writer = SVGWriter
|
|
|
|
default_writer_options = {
|
|
'module_width': 0.2,
|
|
'module_height': 15.0,
|
|
'quiet_zone': 6.5,
|
|
'font_size': 10,
|
|
'text_distance': 5.0,
|
|
'background': 'white',
|
|
'foreground': 'black',
|
|
'write_text': True,
|
|
'text': '',
|
|
}
|
|
|
|
def to_ascii(self):
|
|
code = self.build()
|
|
for i, line in enumerate(code):
|
|
code[i] = line.replace('1', 'X').replace('0', ' ')
|
|
return '\n'.join(code)
|
|
|
|
def __repr__(self):
|
|
return '<{0}({1!r})>'.format(self.__class__.__name__,
|
|
self.get_fullcode())
|
|
|
|
def build(self):
|
|
raise NotImplementedError
|
|
|
|
def get_fullcode(self):
|
|
"""Returns the full code, encoded in the barcode.
|
|
|
|
:returns: Full human readable code.
|
|
:rtype: String
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
def save(self, filename, options=None, text=None):
|
|
"""Renders the barcode and saves it in `filename`.
|
|
|
|
:parameters:
|
|
filename : String
|
|
Filename to save the barcode in (without filename
|
|
extension).
|
|
options : Dict
|
|
The same as in `self.render`.
|
|
text : str (unicode on Python 2)
|
|
Text to render under the barcode.
|
|
|
|
:returns: The full filename with extension.
|
|
:rtype: String
|
|
"""
|
|
if text:
|
|
output = self.render(options, text)
|
|
else:
|
|
output = self.render(options)
|
|
|
|
_filename = self.writer.save(filename, output)
|
|
return _filename
|
|
|
|
def write(self, fp, options=None, text=None):
|
|
"""Renders the barcode and writes it to the file like object
|
|
`fp`.
|
|
|
|
:parameters:
|
|
fp : File like object
|
|
Object to write the raw data in.
|
|
options : Dict
|
|
The same as in `self.render`.
|
|
text : str (unicode on Python 2)
|
|
Text to render under the barcode.
|
|
"""
|
|
output = self.render(options, text)
|
|
if hasattr(output, 'tostring'):
|
|
output.save(fp, format=self.writer.format)
|
|
else:
|
|
fp.write(output)
|
|
|
|
def render(self, writer_options=None, text=None):
|
|
"""Renders the barcode using `self.writer`.
|
|
|
|
:parameters:
|
|
writer_options : Dict
|
|
Options for `self.writer`, see writer docs for details.
|
|
text : str (unicode on Python 2)
|
|
Text to render under the barcode.
|
|
|
|
:returns: Output of the writers render method.
|
|
"""
|
|
options = Barcode.default_writer_options.copy()
|
|
options.update(writer_options or {})
|
|
if options['write_text'] or text is not None:
|
|
if text is not None:
|
|
options['text'] = text
|
|
else:
|
|
options['text'] = self.get_fullcode()
|
|
self.writer.set_options(options)
|
|
code = self.build()
|
|
raw = self.writer.render(code)
|
|
return raw
|