Changelog

0.12 — 2026-05-09

  • New pystrich console script with a subcommand per format and PNG / SVG / EPS / ASCII / terminal / DXF output. See Command-line interface.

  • Data Matrix: DataMatrixData now expects either an encoding= argument or auto_encoding=True to be set on construction. The new auto_encoding=True flag picks the narrowest encoding.

  • SVG output for QR Code and Data Matrix via new save_svg / get_svg methods on QRCodeEncoder and DataMatrixEncoder.

  • SVG output for the 1D barcodes via the same save_svg / get_svg methods on Code39Encoder, Code128Encoder and EAN13Encoder.

  • EPS output for QR Code and Data Matrix via new save_eps / get_eps methods on the same classes.

  • EPS output for the 1D barcodes via the same save_eps / get_eps methods on Code39Encoder, Code128Encoder and EAN13Encoder.

  • The human-readable labels for 1D barcodes are rendered with bundled Courier Prime glyph outlines (SIL Open Font License).

  • DXF: get_dxf() on QRCodeEncoder and DataMatrixEncoder now writes the correct $INSUNITS value for "in", "ft", "mi", "cm" and "m" (previously any value other than "mm" was silently treated as unspecified); you should now pass units=None if unspecified is desired.

  • All vector outputs accept a mark_shape keyword argument (MarkShape) selecting how matched cells are grouped and drawn: horizontal runs (the SVG / EPS default), one square mark per cell (the DXF default), or one filled circle per cell.

  • Tests: round-trip DXF coverage for QR Code and Data Matrix – the rendered DXF is read with ezdxf, rasterised, and decoded back to the original string.

  • New get_terminal_art method on QRCodeEncoder and DataMatrixEncoder, rendering the symbol with Unicode half-block characters so it scans on screen. ANSI background/foreground codes are applied by default for readability on any terminal theme; pass ansi_bg=False for plain output.

0.11 — 2026-05-07

Note

Erratum: the get_dxf() docstrings on QRCodeEncoder and DataMatrixEncoder stated that inverse=True (the default) draws dark modules as filled cells. In fact inverse=True draws the light modules; inverse=False draws the dark ones. Behaviour is unchanged – only the description was wrong. Corrected in 0.12.

  • Documentation: full Sphinx-built docs are now published at https://www.method-b.uk/pyStrich/docs/, covering each symbology, recipes and printing guidance, exception hierarchy and a reference index.

  • DataMatrix: add explicit "iso-8859-1" and "utf-8" encodings for non-ASCII payloads, selectable via DataMatrixData.

  • DataMatrix: saner handling of non-ASCII input under the legacy "compat" encoding, with deprecation in favour of explicit encodings.

  • DataMatrix: proper FNC1 support via the FNC1 marker constant. The long-accepted chr(231) workaround for GS1 still works behind a Fnc1WorkaroundCompatWarning (see issue #13).

  • QR Code: fix issue #8; certain valid strings could not generate a QR code.

  • EAN-13 quiet zone is now 11 modules left, 7 modules right (per the GS1 General Specifications); previously 9 modules each side, which was below spec on the left.

  • EAN-13: the leading digit’s vertical position is now configurable via an options dict (first_digit_y_offset); pass 0 for a level baseline across all three digit groups (issue #18). The default preserves the classic look where the first digit is slightly higher.

  • Errors: unified exception hierarchy. All pyStrich-raised errors now inherit from PyStrichError.

  • Public get_pilimage method on every encoder, returning a PIL.Image.Image directly.

  • Typing: encoders and renderers now have type hints and are checked with mypy.

  • Tests: refactored test suite to make better use of pytest, and extended encode/decode round-trip test coverage to Code 39, Code 128, EAN-13 and QR Code (previously DataMatrix only).

  • Confirmed compatibility with newer Pillow versions and Python 3.13.

  • Drop support for Python 3.8 and 3.9. Supported versions are now Python 3.10 to 3.14.

0.10 — 2025-09-24

  • Make the DataMatrix quiet zone configurable (issue #17).

  • Add Python 3.13 to the supported and tested versions (Python 3.8 to 3.13).

0.9 — 2024-10-02

  • Released as “Modernise”.

  • Add DXF rendering for 2D barcodes (Data Matrix and QR Code), contributed by Mike Jones (PR #7).

  • Pillow >9.5 compatibility: replace deprecated ImageFont.getsize with ImageFont.getlength.

  • Drop the distutils dependency so pyStrich installs on Python 3.12+.

  • Switch the build system to Poetry; add a GitHub Action that builds and publishes releases.

  • Add a CI GitHub Action that runs the test suite with dmtx-utils available.

  • First automated test for Code 39: output comparison plus known-good examples verified with zbarimg.

  • Supported and tested on Python 3.8 to 3.12.

0.8 — 2016-07-06

0.7 — 2015-07-26

  • Raise the Data Matrix payload limit from 44 characters to 174 characters (or 348 digits) by supporting larger symbol sizes (issue #2).

0.6 — 2015-07-21

  • Released as “This time with fonts and data”.

  • Remove test relying on dmtxwrite due to issues in the previous commit.

0.4 — 2015-07-19

  • Released as “First working version on PyPI”.

  • Fix setup.py so the PyPI package is no longer broken.