========
Treepoem
========
.. image:: https://img.shields.io/github/actions/workflow/status/adamchainz/treepoem/main.yml.svg?branch=main&style=for-the-badge
:target: https://github.com/adamchainz/treepoem/actions?workflow=CI
.. image:: https://img.shields.io/pypi/v/treepoem.svg?style=for-the-badge
:target: https://pypi.org/project/treepoem/
.. image:: https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge
:target: https://github.com/psf/black
.. image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge
:target: https://github.com/pre-commit/pre-commit
:alt: pre-commit
A cleverly named, but very simple python barcode renderer wrapping the
BWIPP_ library and ``ghostscript`` command line tool.
----
**Improve your Django and Git skills** with `one of my books <https://adamj.eu/books/>`__.
----
Installation
============
Install from **pip**:
.. code-block:: sh
python -m pip install treepoem
Python 3.9 to 3.13 supported.
You'll also need Ghostscript installed. On Ubuntu/Debian this can be installed
with:
.. code-block:: sh
apt-get install ghostscript
On Mac OS X use:
.. code-block:: sh
brew install ghostscript
Otherwise refer to your distribution's package manager, though it's likely to
be called ``ghostscript`` too.
There's a known issue with rendering on Ghostscript 9.22+ where images are
smeared. See
`GitHub Issue #124 <https://github.com/adamchainz/treepoem/issues/124>`_ and
its associated links for more details. Ghostscript merged a fix in version
9.26 and common barcodes seem to work from then on, though still with some
smearing.
You can check your Ghostscript version with:
.. code-block:: sh
gs --version
API
===
``generate_barcode(barcode_type: str, data: str | bytes, options: dict[str, str | bool] | None=None, *, scale: int = 2) -> Image``
----------------------------------------------------------------------------------------------------------------------------------
Generates a barcode and returns it as a `PIL Image object <https://pillow.readthedocs.io/en/stable/reference/Image.html#the-image-class>`__
``barcode_type`` is the name of the barcode type to generate (see below).
``data`` is a ``str`` or ``bytes`` of data to embed in the barcode - the amount
that can be embedded varies by type.
``options`` is a dictionary of strings-to-strings of extra options to be passed
to BWIPP_, as per its docs.
``scale`` controls the output image size.
Use ``1`` for the smallest image and larger values for larger images.
For example, this generates a QR code image, and saves it to a file using |Image.save()|__:
.. |Image.save()| replace:: ``Image.save()``
__ https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.save
.. code-block:: python
import treepoem
image = treepoem.generate_barcode(
barcode_type="qrcode", # One of the BWIPP supported codes.
data="barcode payload",
)
image.convert("1").save("barcode.png")
If your barcode image is monochrome, with no additional text or colouring, converting the ``Image`` object to monochrome (``image.convert("1")``) will likely reduce its file size.
``barcode_types: dict[str, BarcodeType]``
-----------------------------------------
This is a ``dict`` of the ~100 names of the barcode types that the vendored
version of BWIPP_ supports: its keys are ``str``\s of the barcode type encoder
names, and the values are instances of ``BarcodeType``.
``BarcodeType``
---------------
A class representing meta information on the types. It has two attributes:
* ``type_code`` - the value needed for the ``barcode_type`` argument of
``generate_barcode()`` to use this type.
* ``description`` - the human level description of the type
which has two ``str``.
Only these common types are used in the test suite:
* ``qrcode`` - `QR Code`_
* ``azteccode`` - `Aztec Code`_
* ``pdf417`` - PDF417_
* ``interleaved2of5`` - `Interleaved 2 of 5`_
* ``code128`` - `Code 128`_
* ``code39`` - `Code 39`_
Command-line interface
======================
Treepoem also includes a simple command-line interface to the
functionality of ``generate_barcode``. For example, these commands
will generate two QR codes with identical contents, but different levels
of error correction (see `QR Code Options`_):
.. code-block:: sh
$ treepoem -o barcode1.png -t qrcode "This is a test" eclevel=H
$ treepoem -o barcode2.png -t qrcode "^084his is a test" eclevel=L parse
Complete usage instructions are shown with ``treepoem --help``.
What's so clever about the name?
================================
Barcode.
Bark ode.
Tree poem.
Updating BWIPP
==============
For development of treepoem, when there's a new BWIPP release:
1. Run ``./download_bwipp.py`` with the `version of BWIPP <https://github.com/bwipp/postscriptbarcode/tags>`__ to download.
2. Run ``./make_data.py`` to update the barcode types that treepoem knows about.
3. Add a note in ``CHANGELOG.rst`` about the upgrade, adapting from the previous one.
4. Commit and make a pull request, `adapting from previous examples <https://github.com/adamchainz/treepoem/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aclosed+upgrade+bwipp>`__.
.. _BWIPP: https://github.com/bwipp/postscriptbarcode
.. _QR Code: https://github.com/bwipp/postscriptbarcode/wiki/QR-Code
.. _Aztec Code: https://github.com/bwipp/postscriptbarcode/wiki/Aztec-Code
.. _PDF417: https://github.com/bwipp/postscriptbarcode/wiki/PDF417
.. _Interleaved 2 of 5: https://github.com/bwipp/postscriptbarcode/wiki/Interleaved-2-of-5
.. _Code 128: https://github.com/bwipp/postscriptbarcode/wiki/Code-128
.. _Code 39: https://github.com/bwipp/postscriptbarcode/wiki/Code-39
.. _QR Code Options: https://github.com/bwipp/postscriptbarcode/wiki/QR-Code
Raw data
{
"_id": null,
"home_page": null,
"name": "treepoem",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": "Adam Johnson <me@adamj.eu>",
"keywords": "barcode bwipp postscript ghostscript qr qrcode aztec azteccode pdf417 interleaved2of5 i25 code128 code39",
"author": null,
"author_email": "Christian Muirhead <xtian@babbageclunk.com>",
"download_url": "https://files.pythonhosted.org/packages/55/5c/7f1b487558e49d4909f11766eb45a262aaeee669d290015d4e3c7d8109df/treepoem-3.25.0.tar.gz",
"platform": null,
"description": "========\nTreepoem\n========\n\n.. image:: https://img.shields.io/github/actions/workflow/status/adamchainz/treepoem/main.yml.svg?branch=main&style=for-the-badge\n :target: https://github.com/adamchainz/treepoem/actions?workflow=CI\n\n.. image:: https://img.shields.io/pypi/v/treepoem.svg?style=for-the-badge\n :target: https://pypi.org/project/treepoem/\n\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge\n :target: https://github.com/psf/black\n\n.. image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge\n :target: https://github.com/pre-commit/pre-commit\n :alt: pre-commit\n\nA cleverly named, but very simple python barcode renderer wrapping the\nBWIPP_ library and ``ghostscript`` command line tool.\n\n----\n\n**Improve your Django and Git skills** with `one of my books <https://adamj.eu/books/>`__.\n\n----\n\nInstallation\n============\n\nInstall from **pip**:\n\n.. code-block:: sh\n\n python -m pip install treepoem\n\nPython 3.9 to 3.13 supported.\n\nYou'll also need Ghostscript installed. On Ubuntu/Debian this can be installed\nwith:\n\n.. code-block:: sh\n\n apt-get install ghostscript\n\nOn Mac OS X use:\n\n.. code-block:: sh\n\n brew install ghostscript\n\nOtherwise refer to your distribution's package manager, though it's likely to\nbe called ``ghostscript`` too.\n\nThere's a known issue with rendering on Ghostscript 9.22+ where images are\nsmeared. See\n`GitHub Issue #124 <https://github.com/adamchainz/treepoem/issues/124>`_ and\nits associated links for more details. Ghostscript merged a fix in version\n9.26 and common barcodes seem to work from then on, though still with some\nsmearing.\n\nYou can check your Ghostscript version with:\n\n.. code-block:: sh\n\n gs --version\n\nAPI\n===\n\n``generate_barcode(barcode_type: str, data: str | bytes, options: dict[str, str | bool] | None=None, *, scale: int = 2) -> Image``\n----------------------------------------------------------------------------------------------------------------------------------\n\nGenerates a barcode and returns it as a `PIL Image object <https://pillow.readthedocs.io/en/stable/reference/Image.html#the-image-class>`__\n\n``barcode_type`` is the name of the barcode type to generate (see below).\n\n``data`` is a ``str`` or ``bytes`` of data to embed in the barcode - the amount\nthat can be embedded varies by type.\n\n``options`` is a dictionary of strings-to-strings of extra options to be passed\nto BWIPP_, as per its docs.\n\n``scale`` controls the output image size.\nUse ``1`` for the smallest image and larger values for larger images.\n\nFor example, this generates a QR code image, and saves it to a file using |Image.save()|__:\n\n.. |Image.save()| replace:: ``Image.save()``\n__ https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.save\n\n.. code-block:: python\n\n import treepoem\n\n image = treepoem.generate_barcode(\n barcode_type=\"qrcode\", # One of the BWIPP supported codes.\n data=\"barcode payload\",\n )\n image.convert(\"1\").save(\"barcode.png\")\n\nIf your barcode image is monochrome, with no additional text or colouring, converting the ``Image`` object to monochrome (``image.convert(\"1\")``) will likely reduce its file size.\n\n``barcode_types: dict[str, BarcodeType]``\n-----------------------------------------\n\nThis is a ``dict`` of the ~100 names of the barcode types that the vendored\nversion of BWIPP_ supports: its keys are ``str``\\s of the barcode type encoder\nnames, and the values are instances of ``BarcodeType``.\n\n``BarcodeType``\n---------------\n\nA class representing meta information on the types. It has two attributes:\n\n* ``type_code`` - the value needed for the ``barcode_type`` argument of\n ``generate_barcode()`` to use this type.\n\n* ``description`` - the human level description of the type\n which has two ``str``.\n\nOnly these common types are used in the test suite:\n\n* ``qrcode`` - `QR Code`_\n\n* ``azteccode`` - `Aztec Code`_\n\n* ``pdf417`` - PDF417_\n\n* ``interleaved2of5`` - `Interleaved 2 of 5`_\n\n* ``code128`` - `Code 128`_\n\n* ``code39`` - `Code 39`_\n\nCommand-line interface\n======================\n\nTreepoem also includes a simple command-line interface to the\nfunctionality of ``generate_barcode``. For example, these commands\nwill generate two QR codes with identical contents, but different levels\nof error correction (see `QR Code Options`_):\n\n.. code-block:: sh\n\n $ treepoem -o barcode1.png -t qrcode \"This is a test\" eclevel=H\n $ treepoem -o barcode2.png -t qrcode \"^084his is a test\" eclevel=L parse\n\nComplete usage instructions are shown with ``treepoem --help``.\n\nWhat's so clever about the name?\n================================\n\nBarcode.\n\nBark ode.\n\nTree poem.\n\nUpdating BWIPP\n==============\n\nFor development of treepoem, when there's a new BWIPP release:\n\n1. Run ``./download_bwipp.py`` with the `version of BWIPP <https://github.com/bwipp/postscriptbarcode/tags>`__ to download.\n2. Run ``./make_data.py`` to update the barcode types that treepoem knows about.\n3. Add a note in ``CHANGELOG.rst`` about the upgrade, adapting from the previous one.\n4. Commit and make a pull request, `adapting from previous examples <https://github.com/adamchainz/treepoem/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aclosed+upgrade+bwipp>`__.\n\n.. _BWIPP: https://github.com/bwipp/postscriptbarcode\n.. _QR Code: https://github.com/bwipp/postscriptbarcode/wiki/QR-Code\n.. _Aztec Code: https://github.com/bwipp/postscriptbarcode/wiki/Aztec-Code\n.. _PDF417: https://github.com/bwipp/postscriptbarcode/wiki/PDF417\n.. _Interleaved 2 of 5: https://github.com/bwipp/postscriptbarcode/wiki/Interleaved-2-of-5\n.. _Code 128: https://github.com/bwipp/postscriptbarcode/wiki/Code-128\n.. _Code 39: https://github.com/bwipp/postscriptbarcode/wiki/Code-39\n.. _QR Code Options: https://github.com/bwipp/postscriptbarcode/wiki/QR-Code\n",
"bugtrack_url": null,
"license": null,
"summary": "Barcode rendering for Python supporting QRcode, Aztec, PDF417, I25, Code128, Code39 and many more types.",
"version": "3.25.0",
"project_urls": {
"Changelog": "https://github.com/adamchainz/treepoem/blob/main/CHANGELOG.rst",
"Funding": "https://adamj.eu/books/",
"Repository": "https://github.com/adamchainz/treepoem"
},
"split_keywords": [
"barcode",
"bwipp",
"postscript",
"ghostscript",
"qr",
"qrcode",
"aztec",
"azteccode",
"pdf417",
"interleaved2of5",
"i25",
"code128",
"code39"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "6b48e11f00fb40cc63ba9dd534f9481f0cb3ca6eedd796ef0b3a578bd0d26e0c",
"md5": "a77e56a588595c986acffe05f0f98688",
"sha256": "65542d809257dc5f559588b7dac8e2e5ae8af1ef15d8ee4856f15177f2ffe711"
},
"downloads": -1,
"filename": "treepoem-3.25.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a77e56a588595c986acffe05f0f98688",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 365592,
"upload_time": "2024-10-24T09:38:57",
"upload_time_iso_8601": "2024-10-24T09:38:57.547758Z",
"url": "https://files.pythonhosted.org/packages/6b/48/e11f00fb40cc63ba9dd534f9481f0cb3ca6eedd796ef0b3a578bd0d26e0c/treepoem-3.25.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "555c7f1b487558e49d4909f11766eb45a262aaeee669d290015d4e3c7d8109df",
"md5": "205b6f34e33a82f68b267fe99ee05bde",
"sha256": "9bdc0f8e00d6dd7eefc2e73965e977075b10cd760d9ae53ff505e16bf1638ebe"
},
"downloads": -1,
"filename": "treepoem-3.25.0.tar.gz",
"has_sig": false,
"md5_digest": "205b6f34e33a82f68b267fe99ee05bde",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 368633,
"upload_time": "2024-10-24T09:38:59",
"upload_time_iso_8601": "2024-10-24T09:38:59.472806Z",
"url": "https://files.pythonhosted.org/packages/55/5c/7f1b487558e49d4909f11766eb45a262aaeee669d290015d4e3c7d8109df/treepoem-3.25.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-10-24 09:38:59",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "adamchainz",
"github_project": "treepoem",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"tox": true,
"lcname": "treepoem"
}