123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691 |
- # -*- coding: utf-8 -*-
- # Copyright (c) 2013, Michael Nooner
- # All rights reserved.
- # Redistribution and use in source and binary forms, with or without
- # modification, are permitted provided that the following conditions are met:
- # * Redistributions of source code must retain the above copyright
- # notice, this list of conditions and the following disclaimer.
- # * Redistributions in binary form must reproduce the above copyright
- # notice, this list of conditions and the following disclaimer in the
- # documentation and/or other materials provided with the distribution.
- # * Neither the name of the copyright holder nor the names of its
- # contributors may be used to endorse or promote products derived from
- # this software without specific prior written permission
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- # ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
- # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- """This module is used to create QR Codes. It is designed to be as simple and
- as possible. It does this by using sane defaults and autodetection to make
- creating a QR Code very simple.
- It is recommended that you use the :func:`pyqrcode.create` function to build the
- QRCode object. This results in cleaner looking code.
- Examples:
- >>> import pyqrcode
- >>> import sys
- >>> url = pyqrcode.create('http://uca.edu')
- >>> url.svg(sys.stdout, scale=1)
- >>> url.svg('uca.svg', scale=4)
- >>> number = pyqrcode.create(123456789012345)
- >>> number.png('big-number.png')
- """
- #Imports required for 2.7 support
- from __future__ import absolute_import, division, print_function, with_statement, unicode_literals
- import pyqrcode.tables
- import pyqrcode.builder as builder
- try:
- str = unicode # Python 2
- except NameError:
- pass
- def create(content, error='H', version=None, mode=None, encoding=None):
- """When creating a QR code only the content to be encoded is required,
- all the other properties of the code will be guessed based on the
- contents given. This function will return a :class:`QRCode` object.
- Unless you are familiar with QR code's inner workings
- it is recommended that you just specify the *content* and nothing else.
- However, there are cases where you may want to specify the various
- properties of the created code manually, this is what the other
- parameters do. Below, you will find a lengthy explanation of what
- each parameter is for. Note, the parameter names and values are taken
- directly from the standards. You may need to familiarize yourself
- with the terminology of QR codes for the names and their values to
- make sense.
- The *error* parameter sets the error correction level of the code. There
- are four levels defined by the standard. The first is level 'L' which
- allows for 7% of the code to be corrected. Second, is level 'M' which
- allows for 15% of the code to be corrected. Next, is level 'Q' which
- is the most common choice for error correction, it allow 25% of the
- code to be corrected. Finally, there is the highest level 'H' which
- allows for 30% of the code to be corrected. There are several ways to
- specify this parameter, you can use an upper or lower case letter,
- a float corresponding to the percentage of correction, or a string
- containing the percentage. See tables.modes for all the possible
- values. By default this parameter is set to 'H' which is the highest
- possible error correction, but it has the smallest available data
- capacity.
- The *version* parameter specifies the size and data capacity of the
- code. Versions are any integer between 1 and 40. Where version 1 is
- the smallest QR code, and version 40 is the largest. If this parameter
- is left unspecified, then the contents and error correction level will
- be used to guess the smallest possible QR code version that the
- content will fit inside of. You may want to specify this parameter
- for consistency when generating several QR codes with varying amounts
- of data. That way all of the generated codes would have the same size.
- The *mode* parameter specifies how the contents will be encoded. By
- default, the best possible mode for the contents is guessed. There
- are four possible modes. First, is 'numeric' which is
- used to encode integer numbers. Next, is 'alphanumeric' which is
- used to encode some ASCII characters. This mode uses only a limited
- set of characters. Most problematic is that it can only use upper case
- English characters, consequently, the content parameter will be
- subjected to str.upper() before encoding. See tables.ascii_codes for
- a complete list of available characters. The is 'kanji' mode can be
- used for Japanese characters, but only those that can be understood
- via the shift-jis string encoding. Finally, we then have 'binary' mode
- which just encodes the bytes directly into the QR code (this encoding
- is the least efficient).
- The *encoding* parameter specifies how the content will be interpreted.
- This parameter only matters if the *content* is a string, unicode, or
- byte array type. This parameter must be a valid encoding string or None.
- t will be passed the *content*'s encode/decode methods.
- """
- return QRCode(content, error, version, mode, encoding)
- class QRCode:
- """This class represents a QR code. To use this class simply give the
- constructor a string representing the data to be encoded, it will then
- build a code in memory. You can then save it in various formats. Note,
- codes can be written out as PNG files but this requires the PyPNG module.
- You can find the PyPNG module at http://packages.python.org/pypng/.
- Examples:
- >>> from pyqrcode import QRCode
- >>> import sys
- >>> url = QRCode('http://uca.edu')
- >>> url.svg(sys.stdout, scale=1)
- >>> url.svg('uca.svg', scale=4)
- >>> number = QRCode(123456789012345)
- >>> number.png('big-number.png')
- .. note::
- For what all of the parameters do, see the :func:`pyqrcode.create`
- function.
- """
- def __init__(self, content, error='H', version=None, mode=None,
- encoding='iso-8859-1'):
- #Guess the mode of the code, this will also be used for
- #error checking
- guessed_content_type, encoding = self._detect_content_type(content, encoding)
-
- if encoding is None:
- encoding = 'iso-8859-1'
- #Store the encoding for use later
- if guessed_content_type == 'kanji':
- self.encoding = 'shiftjis'
- else:
- self.encoding = encoding
-
- if version is not None:
- if 1 <= version <= 40:
- self.version = version
- else:
- raise ValueError("Illegal version {0}, version must be between "
- "1 and 40.".format(version))
- #Decode a 'byte array' contents into a string format
- if isinstance(content, bytes):
- self.data = content.decode(encoding)
- #Give a string an encoding
- elif hasattr(content, 'encode'):
- self.data = content.encode(self.encoding)
- #The contents are not a byte array or string, so
- #try naively converting to a string representation.
- else:
- self.data = str(content) # str == unicode in Py 2.x, see file head
- #Force a passed in mode to be lowercase
- if hasattr(mode, 'lower'):
- mode = mode.lower()
- #Check that the mode parameter is compatible with the contents
- if mode is None:
- #Use the guessed mode
- self.mode = guessed_content_type
- self.mode_num = tables.modes[self.mode]
- elif mode not in tables.modes.keys():
- #Unknown mode
- raise ValueError('{0} is not a valid mode.'.format(mode))
- elif guessed_content_type == 'binary' and \
- tables.modes[mode] != tables.modes['binary']:
- #Binary is only guessed as a last resort, if the
- #passed in mode is not binary the data won't encode
- raise ValueError('The content provided cannot be encoded with '
- 'the mode {}, it can only be encoded as '
- 'binary.'.format(mode))
- elif tables.modes[mode] == tables.modes['numeric'] and \
- guessed_content_type != 'numeric':
- #If numeric encoding is requested make sure the data can
- #be encoded in that format
- raise ValueError('The content cannot be encoded as numeric.')
- elif tables.modes[mode] == tables.modes['kanji'] and \
- guessed_content_type != 'kanji':
- raise ValueError('The content cannot be encoded as kanji.')
- else:
- #The data should encode with the passed in mode
- self.mode = mode
- self.mode_num = tables.modes[self.mode]
- #Check that the user passed in a valid error level
- if error in tables.error_level.keys():
- self.error = tables.error_level[error]
- else:
- raise ValueError('{0} is not a valid error '
- 'level.'.format(error))
- #Guess the "best" version
- self.version = self._pick_best_fit(self.data)
- #If the user supplied a version, then check that it has
- #sufficient data capacity for the contents passed in
- if version:
- if version >= self.version:
- self.version = version
- else:
- raise ValueError('The data will not fit inside a version {} '
- 'code with the given encoding and error '
- 'level (the code must be at least a '
- 'version {}).'.format(version, self.version))
- #Build the QR code
- self.builder = builder.QRCodeBuilder(data=self.data,
- version=self.version,
- mode=self.mode,
- error=self.error)
- #Save the code for easier reference
- self.code = self.builder.code
- def __str__(self):
- return repr(self)
- def __unicode__(self):
- return self.__repr__()
- def __repr__(self):
- return "QRCode(content={0}, error='{1}', version={2}, mode='{3}')" \
- .format(repr(self.data), self.error, self.version, self.mode)
- def _detect_content_type(self, content, encoding):
- """This method tries to auto-detect the type of the data. It first
- tries to see if the data is a valid integer, in which case it returns
- numeric. Next, it tests the data to see if it is 'alphanumeric.' QR
- Codes use a special table with very limited range of ASCII characters.
- The code's data is tested to make sure it fits inside this limited
- range. If all else fails, the data is determined to be of type
- 'binary.'
-
- Returns a tuple containing the detected mode and encoding.
- Note, encoding ECI is not yet implemented.
- """
- def two_bytes(c):
- """Output two byte character code as a single integer."""
- def next_byte(b):
- """Make sure that character code is an int. Python 2 and
- 3 compatibility.
- """
- if not isinstance(b, int):
- return ord(b)
- else:
- return b
- #Go through the data by looping to every other character
- for i in range(0, len(c), 2):
- yield (next_byte(c[i]) << 8) | next_byte(c[i+1])
- #See if the data is a number
- try:
- if str(content).isdigit():
- return 'numeric', encoding
- except (TypeError, UnicodeError):
- pass
- #See if that data is alphanumeric based on the standards
- #special ASCII table
- valid_characters = ''.join(tables.ascii_codes.keys())
-
- #Force the characters into a byte array
- valid_characters = valid_characters.encode('ASCII')
- try:
- if isinstance(content, bytes):
- c = content.decode('ASCII')
- else:
- c = str(content).encode('ASCII')
- if all(map(lambda x: x in valid_characters, c)):
- return 'alphanumeric', 'ASCII'
- #This occurs if the content does not contain ASCII characters.
- #Since the whole point of the if statement is to look for ASCII
- #characters, the resulting mode should not be alphanumeric.
- #Hence, this is not an error.
- except TypeError:
- pass
- except UnicodeError:
- pass
- try:
- if isinstance(content, bytes):
- if encoding is None:
- encoding = 'shiftjis'
- c = content.decode(encoding).encode('shiftjis')
- else:
- c = content.encode('shiftjis')
-
- #All kanji characters must be two bytes long, make sure the
- #string length is not odd.
- if len(c) % 2 != 0:
- return 'binary', encoding
- #Make sure the characters are actually in range.
- for asint in two_bytes(c):
- #Shift the two byte value as indicated by the standard
- if not (0x8140 <= asint <= 0x9FFC or
- 0xE040 <= asint <= 0xEBBF):
- return 'binary', encoding
- return 'kanji', encoding
- except UnicodeError:
- #This occurs if the content does not contain Shift JIS kanji
- #characters. Hence, the resulting mode should not be kanji.
- #This is not an error.
- pass
- #All of the other attempts failed. The content can only be binary.
- return 'binary', encoding
- def _pick_best_fit(self, content):
- """This method return the smallest possible QR code version number
- that will fit the specified data with the given error level.
- """
- import math
-
- for version in range(1, 41):
- #Get the maximum possible capacity
- capacity = tables.data_capacity[version][self.error][self.mode_num]
-
- #Check the capacity
- #Kanji's count in the table is "characters" which are two bytes
- if (self.mode_num == tables.modes['kanji'] and
- capacity >= math.ceil(len(content) / 2)):
- return version
- if capacity >= len(content):
- return version
- raise ValueError('The data will not fit in any QR code version '
- 'with the given encoding and error level.')
- def show(self, wait=1.2, scale=10, module_color=(0, 0, 0, 255),
- background=(255, 255, 255, 255), quiet_zone=4):
- """Displays this QR code.
- This method is mainly intended for debugging purposes.
- This method saves the output of the :py:meth:`png` method (with a default
- scaling factor of 10) to a temporary file and opens it with the
- standard PNG viewer application or within the standard webbrowser. The
- temporary file is deleted afterwards.
- If this method does not show any result, try to increase the `wait`
- parameter. This parameter specifies the time in seconds to wait till
- the temporary file is deleted. Note, that this method does not return
- until the provided amount of seconds (default: 1.2) has passed.
- The other parameters are simply passed on to the `png` method.
- """
- import os
- import time
- import tempfile
- import webbrowser
-
- try: # Python 2
- from urlparse import urljoin
- from urllib import pathname2url
- except ImportError: # Python 3
- from urllib.parse import urljoin
- from urllib.request import pathname2url
- f = tempfile.NamedTemporaryFile('wb', suffix='.png', delete=False)
- self.png(f, scale=scale, module_color=module_color,
- background=background, quiet_zone=quiet_zone)
- f.close()
- webbrowser.open_new_tab(urljoin('file:', pathname2url(f.name)))
- time.sleep(wait)
- os.unlink(f.name)
-
- def get_png_size(self, scale=1, quiet_zone=4):
- """This is method helps users determine what *scale* to use when
- creating a PNG of this QR code. It is meant mostly to be used in the
- console to help the user determine the pixel size of the code
- using various scales.
- This method will return an integer representing the width and height of
- the QR code in pixels, as if it was drawn using the given *scale*.
- Because QR codes are square, the number represents both the width
- and height dimensions.
- The *quiet_zone* parameter sets how wide the quiet zone around the code
- should be. According to the standard this should be 4 modules. It is
- left settable because such a wide quiet zone is unnecessary in many
- applications where the QR code is not being printed.
- Example:
- >>> code = pyqrcode.QRCode("I don't like spam!")
- >>> print(code.get_png_size(1))
- 31
- >>> print(code.get_png_size(5))
- 155
- """
- return builder._get_png_size(self.version, scale, quiet_zone)
- def png(self, file, scale=1, module_color=(0, 0, 0, 255),
- background=(255, 255, 255, 255), quiet_zone=4):
- """This method writes the QR code out as an PNG image. The resulting
- PNG has a bit depth of 1. The file parameter is used to specify where
- to write the image to. It can either be an writable stream or a
- file path.
- .. note::
- This method depends on the pypng module to actually create the
- PNG file.
- This method will write the given *file* out as a PNG file. The file
- can be either a string file path, or a writable stream. The file
- will not be automatically closed if a stream is given.
- The *scale* parameter sets how large to draw a single module. By
- default one pixel is used to draw a single module. This may make the
- code too small to be read efficiently. Increasing the scale will make
- the code larger. Only integer scales are usable. This method will
- attempt to coerce the parameter into an integer (e.g. 2.5 will become 2,
- and '3' will become 3). You can use the :py:meth:`get_png_size` method
- to calculate the actual pixel size of the resulting PNG image.
- The *module_color* parameter sets what color to use for the encoded
- modules (the black part on most QR codes). The *background* parameter
- sets what color to use for the background (the white part on most
- QR codes). If either parameter is set, then both must be
- set or a ValueError is raised. Colors should be specified as either
- a list or a tuple of length 3 or 4. The components of the list must
- be integers between 0 and 255. The first three member give the RGB
- color. The fourth member gives the alpha component, where 0 is
- transparent and 255 is opaque. Note, many color
- combinations are unreadable by scanners, so be judicious.
- The *quiet_zone* parameter sets how wide the quiet zone around the code
- should be. According to the standard this should be 4 modules. It is
- left settable because such a wide quiet zone is unnecessary in many
- applications where the QR code is not being printed.
- Example:
- >>> code = pyqrcode.create('Are you suggesting coconuts migrate?')
- >>> code.png('swallow.png', scale=5)
- >>> code.png('swallow.png', scale=5,
- module_color=(0x66, 0x33, 0x0), #Dark brown
- background=(0xff, 0xff, 0xff, 0x88)) #50% transparent white
- """
- builder._png(self.code, self.version, file, scale,
- module_color, background, quiet_zone)
- def png_as_base64_str(self, scale=1, module_color=(0, 0, 0, 255),
- background=(255, 255, 255, 255), quiet_zone=4):
- """This method uses the png render and returns the PNG image encoded as
- base64 string. This can be useful for creating dynamic PNG images for
- web development, since no file needs to be created.
-
- Example:
- >>> code = pyqrcode.create('Are you suggesting coconuts migrate?')
- >>> image_as_str = code.png_as_base64_str(scale=5)
- >>> html_img = '<img src="data:image/png;base64,{}">'.format(image_as_str)
- The parameters are passed directly to the :py:meth:`png` method. Refer
- to that method's documentation for the meaning behind the parameters.
-
- .. note::
- This method depends on the pypng module to actually create the
- PNG image.
- """
- import io
- import base64
-
- with io.BytesIO() as virtual_file:
- self.png(file=virtual_file, scale=scale, module_color=module_color,
- background=background, quiet_zone=quiet_zone)
- image_as_str = base64.b64encode(virtual_file.getvalue()).decode("ascii")
- return image_as_str
-
- def xbm(self, scale=1, quiet_zone=4):
- """Returns a string representing an XBM image of the QR code.
- The XBM format is a black and white image format that looks like a
- C header file.
-
- Because displaying QR codes in Tkinter is the
- primary use case for this renderer, this method does not take a file
- parameter. Instead it retuns the rendered QR code data as a string.
-
- Example of using this renderer with Tkinter:
- >>> import pyqrcode
- >>> import tkinter
- >>> code = pyqrcode.create('Knights who say ni!')
- >>> code_xbm = code.xbm(scale=5)
- >>>
- >>> top = tkinter.Tk()
- >>> code_bmp = tkinter.BitmapImage(data=code_xbm)
- >>> code_bmp.config(foreground="black")
- >>> code_bmp.config(background="white")
- >>> label = tkinter.Label(image=code_bmp)
- >>> label.pack()
-
- The *scale* parameter sets how large to draw a single module. By
- default one pixel is used to draw a single module. This may make the
- code too small to be read efficiently. Increasing the scale will make
- the code larger. Only integer scales are usable. This method will
- attempt to coerce the parameter into an integer (e.g. 2.5 will become 2,
- and '3' will become 3). You can use the :py:meth:`get_png_size` method
- to calculate the actual pixel size of this image when displayed.
- The *quiet_zone* parameter sets how wide the quiet zone around the code
- should be. According to the standard this should be 4 modules. It is
- left settable because such a wide quiet zone is unnecessary in many
- applications where the QR code is not being printed.
- """
- return builder._xbm(self.code, scale, quiet_zone)
- def svg(self, file, scale=1, module_color='#000', background=None,
- quiet_zone=4, xmldecl=True, svgns=True, title=None,
- svgclass='pyqrcode', lineclass='pyqrline', omithw=False,
- debug=False):
- """This method writes the QR code out as an SVG document. The
- code is drawn by drawing only the modules corresponding to a 1. They
- are drawn using a line, such that contiguous modules in a row
- are drawn with a single line.
- The *file* parameter is used to specify where to write the document
- to. It can either be a writable stream or a file path.
-
- The *scale* parameter sets how large to draw
- a single module. By default one pixel is used to draw a single
- module. This may make the code too small to be read efficiently.
- Increasing the scale will make the code larger. Unlike the png() method,
- this method will accept fractional scales (e.g. 2.5).
- Note, three things are done to make the code more appropriate for
- embedding in a HTML document. The "white" part of the code is actually
- transparent. The code itself has a class given by *svgclass* parameter.
- The path making up the QR code uses the class set using the *lineclass*.
- These should make the code easier to style using CSS.
- By default the output of this function is a complete SVG document. If
- only the code itself is desired, set the *xmldecl* to false. This will
- result in a fragment that contains only the "drawn" portion of the code.
- Likewise, you can set the *title* of the document. The SVG name space
- attribute can be suppressed by setting *svgns* to False.
- When True the *omithw* indicates if width and height attributes should
- be omitted. If these attributes are omitted, a ``viewBox`` attribute
- will be added to the document.
- You can also set the colors directly using the *module_color* and
- *background* parameters. The *module_color* parameter sets what color to
- use for the data modules (the black part on most QR codes). The
- *background* parameter sets what color to use for the background (the
- white part on most QR codes). The parameters can be set to any valid
- SVG or HTML color. If the background is set to None, then no background
- will be drawn, i.e. the background will be transparent. Note, many color
- combinations are unreadable by scanners, so be careful.
- The *quiet_zone* parameter sets how wide the quiet zone around the code
- should be. According to the standard this should be 4 modules. It is
- left settable because such a wide quiet zone is unnecessary in many
- applications where the QR code is not being printed.
-
- Example:
- >>> code = pyqrcode.create('Hello. Uhh, can we have your liver?')
- >>> code.svg('live-organ-transplants.svg', 3.6)
- >>> code.svg('live-organ-transplants.svg', scale=4,
- module_color='brown', background='0xFFFFFF')
- """
- builder._svg(self.code, self.version, file, scale=scale,
- module_color=module_color, background=background,
- quiet_zone=quiet_zone, xmldecl=xmldecl, svgns=svgns,
- title=title, svgclass=svgclass, lineclass=lineclass,
- omithw=omithw, debug=debug)
- def eps(self, file, scale=1, module_color=(0, 0, 0),
- background=None, quiet_zone=4):
- """This method writes the QR code out as an EPS document. The
- code is drawn by only writing the data modules corresponding to a 1.
- They are drawn using a line, such that contiguous modules in a row
- are drawn with a single line.
- The *file* parameter is used to specify where to write the document
- to. It can either be a writable (text) stream or a file path.
- The *scale* parameter sets how large to draw a single module. By
- default one point (1/72 inch) is used to draw a single module. This may
- make the code to small to be read efficiently. Increasing the scale
- will make the code larger. This method will accept fractional scales
- (e.g. 2.5).
- The *module_color* parameter sets the color of the data modules. The
- *background* parameter sets the background (page) color to use. They
- are specified as either a triple of floats, e.g. (0.5, 0.5, 0.5), or a
- triple of integers, e.g. (128, 128, 128). The default *module_color* is
- black. The default *background* color is no background at all.
- The *quiet_zone* parameter sets how large to draw the border around
- the code. As per the standard, the default value is 4 modules.
- Examples:
- >>> qr = pyqrcode.create('Hello world')
- >>> qr.eps('hello-world.eps', scale=2.5, module_color='#36C')
- >>> qr.eps('hello-world2.eps', background='#eee')
- >>> out = io.StringIO()
- >>> qr.eps(out, module_color=(.4, .4, .4))
- """
- builder._eps(self.code, self.version, file, scale, module_color,
- background, quiet_zone)
- def terminal(self, module_color='default', background='reverse',
- quiet_zone=4):
- """This method returns a string containing ASCII escape codes,
- such that if printed to a compatible terminal, it will display
- a vaild QR code. The code is printed using ASCII escape
- codes that alter the coloring of the background.
- The *module_color* parameter sets what color to
- use for the data modules (the black part on most QR codes).
- Likewise, the *background* parameter sets what color to use
- for the background (the white part on most QR codes).
- There are two options for colors. The first, and most widely
- supported, is to use the 8 or 16 color scheme. This scheme uses
- eight to sixteen named colors. The following colors are
- supported the most widely supported: black, red, green,
- yellow, blue, magenta, and cyan. There are an some additional
- named colors that are supported by most terminals: light gray,
- dark gray, light red, light green, light blue, light yellow,
- light magenta, light cyan, and white.
- There are two special named colors. The first is the
- "default" color. This color is the color the background of
- the terminal is set to. The next color is the "reverse"
- color. This is not really a color at all but a special
- property that will reverse the current color. These two colors
- are the default values for *module_color* and *background*
- respectively. These values should work on most terminals.
- Finally, there is one more way to specify the color. Some
- terminals support 256 colors. The actual colors displayed in the
- terminal is system dependent. This is the least transportable option.
- To use the 256 color scheme set *module_color* and/or
- *background* to a number between 0 and 256.
- The *quiet_zone* parameter sets how wide the quiet zone around the code
- should be. According to the standard this should be 4 modules. It is
- left settable because such a wide quiet zone is unnecessary in many
- applications.
- Example:
- >>> code = pyqrcode.create('Example')
- >>> text = code.terminal()
- >>> print(text)
- """
- return builder._terminal(self.code, module_color, background,
- quiet_zone)
- def text(self, quiet_zone=4):
- """This method returns a string based representation of the QR code.
- The data modules are represented by 1's and the background modules are
- represented by 0's. The main purpose of this method is to act a
- starting point for users to create their own renderers.
- The *quiet_zone* parameter sets how wide the quiet zone around the code
- should be. According to the standard this should be 4 modules. It is
- left settable because such a wide quiet zone is unnecessary in many
- applications.
- Example:
- >>> code = pyqrcode.create('Example')
- >>> text = code.text()
- >>> print(text)
- """
- return builder._text(self.code, quiet_zone)
|