Source code for pystrich.code39

"""Code-39 barcode encoder

All needed by the user is done via the Code39Encoder class:

>>> encoder = Code39Encoder("MIL-STD-1189")
>>> encoder.save("test.png")

You may use this under a BSD License.
"""

from __future__ import annotations

import logging

from pystrich.bar_encoder import Bar1DEncoder
from pystrich.types import BarcodeRenderOptions

from .renderer import Code39Renderer
from .textencoder import TextEncoder

log = logging.getLogger("code39")


[docs] class Code39Encoder(Bar1DEncoder): """Encode a string as a Code 39 1D barcode. By default only the standard Code 39 character set is accepted (``0-9``, ``A-Z``, space, and ``-.$/+%``). Pass ``full_ascii=True`` to use the Full ASCII extension, which encodes any 7-bit character via paired symbols. Typical use:: encoder = Code39Encoder("ABC-123") encoder.save("barcode.png") :ivar text: The original input text. :ivar encoded_text: List of code values produced by the text encoder. :ivar bars: The bar/space pattern as a string of ``"1"`` and ``"0"``. :ivar options: Render-time options dict (empty if none were supplied). :ivar width: Pixel width of the most recently rendered image. :ivar height: Pixel height of the most recently rendered image. """ options: BarcodeRenderOptions text: str encoded_text: list[int] bars: str def __init__( self, text: str, full_ascii: bool = False, options: BarcodeRenderOptions | None = None, ) -> None: """Encode ``text`` as Code 39. :param text: The data to encode. :param full_ascii: If ``True``, use the Full ASCII extension so any 7-bit character can be represented (each non-standard character becomes a pair of symbols). :param options: Optional dict tweaking the rendered output. Supported keys: * ``ttf_font`` -- absolute path to a TrueType font for the label. Defaults to a bundled bitmap font. * ``ttf_fontsize`` -- font size in points. * ``show_label`` -- whether to render the human-readable label underneath the bars (defaults to ``True``). * ``height`` -- total image height in pixels (defaults to ``120``). * ``label_border`` -- pixels of space between barcode and label. * ``bottom_border`` -- pixels of space between label and the bottom edge. """ super().__init__(options) self.text = text encoder = TextEncoder() self.encoded_text = encoder.encode(self.text, full_ascii) log.debug("Encoded text is %s", self.encoded_text) self.bars = encoder.get_bars(self.encoded_text) log.debug("Bars: %s", self.bars)
[docs] def init_renderer(self) -> Code39Renderer: """Construct a :class:`Code39Renderer` for the encoded bars. :rtype: :class:`Code39Renderer` """ return Code39Renderer(self.bars, self.text, self.options)