diff mupdf-source/thirdparty/zint/docs/manual.txt @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mupdf-source/thirdparty/zint/docs/manual.txt	Mon Sep 15 11:43:07 2025 +0200
@@ -0,0 +1,5617 @@
+Zint Barcode Generator and Zint Barcode Studio User Manual
+Version 2.13.0.9
+December 2024
+
+*******************************************************************************
+* For reference the following is a text-only version of the Zint manual,      *
+* generated from "docs/manual.pmd" by pandoc.                                 *
+* A HTML version can be accessed at https://zint.org.uk/manual/               *
+* however this text file is more likely to be up-to-date.                     *
+*******************************************************************************
+
+-   1. Introduction
+    -   1.1 Glossary
+-   2. Installing Zint
+    -   2.1 Linux
+    -   2.2 BSD
+    -   2.3 Microsoft Windows
+    -   2.4 Apple macOS
+    -   2.5 Zint Tcl Backend
+-   3. Using Zint Barcode Studio
+    -   3.1 Main Window and Data Tab
+    -   3.2 GS1 Composite Groupbox
+    -   3.3 Additional ECI/Data Segments Groupbox
+    -   3.4 Symbology-specific Groupbox
+    -   3.5 Symbology-specific Tab
+    -   3.6 Appearance Tab
+    -   3.7 Data Dialog
+    -   3.8 Sequence Dialog
+    -   3.9 Export Dialog
+    -   3.10 CLI Equivalent Dialog
+-   4. Using the Command Line
+    -   4.1 Inputting Data
+    -   4.2 Directing Output
+    -   4.3 Selecting Barcode Type
+    -   4.4 Adjusting Height
+    -   4.5 Adjusting Whitespace
+    -   4.6 Adding Boundary Bars and Boxes
+    -   4.7 Using Colour
+    -   4.8 Rotating the Symbol
+    -   4.9 Adjusting Image Size (X-dimension)
+        -   4.9.1 Scaling by X-dimension and Resolution
+        -   4.9.2 Scaling Example
+        -   4.9.3 MaxiCode Raster Scaling
+    -   4.10 Human Readable Text (HRT) Options
+    -   4.11 Input Modes
+        -   4.11.1 Unicode, Data, and GS1 Modes
+        -   4.11.2 Input Modes and ECI
+            -   4.11.2.1 Input Modes and ECI Example 1
+            -   4.11.2.2 Input Modes and ECI Example 2
+            -   4.11.2.3 Input Modes and ECI Example 3
+    -   4.12 Batch Processing
+    -   4.13 Direct Output to stdout
+    -   4.14 Automatic Filenames
+    -   4.15 Working with Dots
+    -   4.16 Multiple Segments
+    -   4.17 Structured Append
+    -   4.18 Help Options
+    -   4.19 Other Options
+-   5. Using the API
+    -   5.1 Creating and Deleting Symbols
+    -   5.2 Encoding and Saving to File
+    -   5.3 Encoding and Printing Functions in Depth
+    -   5.4 Buffering Symbols in Memory (raster)
+    -   5.5 Buffering Symbols in Memory (vector)
+    -   5.6 Buffering Symbols in Memory (memfile)
+    -   5.7 Setting Options
+    -   5.8 Handling Errors
+    -   5.9 Specifying a Symbology
+    -   5.10 Adjusting Output Options
+    -   5.11 Setting the Input Mode
+    -   5.12 Multiple Segments
+    -   5.13 Scaling Helpers
+    -   5.14 Verifying Symbology Availability
+    -   5.15 Checking Symbology Capabilities
+    -   5.16 Zint Version
+-   6. Types of Symbology
+    -   6.1 One-Dimensional Symbols
+        -   6.1.1 Code 11
+        -   6.1.2 Code 2 of 5
+            -   6.1.2.1 Standard Code 2 of 5
+            -   6.1.2.2 IATA Code 2 of 5
+            -   6.1.2.3 Industrial Code 2 of 5
+            -   6.1.2.4 Interleaved Code 2 of 5 (ISO 16390)
+            -   6.1.2.5 Code 2 of 5 Data Logic
+            -   6.1.2.6 ITF-14
+            -   6.1.2.7 Deutsche Post Leitcode
+            -   6.1.2.8 Deutsche Post Identcode
+        -   6.1.3 UPC (Universal Product Code) (ISO 15420)
+            -   6.1.3.1 UPC Version A
+            -   6.1.3.2 UPC Version E
+        -   6.1.4 EAN (European Article Number) (ISO 15420)
+            -   6.1.4.1 EAN-2, EAN-5, EAN-8 and EAN-13
+            -   6.1.4.2 SBN, ISBN and ISBN-13
+        -   6.1.5 Plessey
+            -   6.1.5.1 UK Plessey
+            -   6.1.5.2 MSI Plessey
+        -   6.1.6 Telepen
+            -   6.1.6.1 Telepen Alpha
+            -   6.1.6.2 Telepen Numeric
+        -   6.1.7 Code 39
+            -   6.1.7.1 Standard Code 39 (ISO 16388)
+            -   6.1.7.2 Extended Code 39
+            -   6.1.7.3 Code 93
+            -   6.1.7.4 PZN (Pharmazentralnummer)
+            -   6.1.7.5 LOGMARS
+            -   6.1.7.6 Code 32
+            -   6.1.7.7 HIBC Code 39
+            -   6.1.7.8 Vehicle Identification Number (VIN)
+        -   6.1.8 Codabar (EN 798)
+        -   6.1.9 Pharmacode
+        -   6.1.10 Code 128
+            -   6.1.10.1 Standard Code 128 (ISO 15417)
+            -   6.1.10.2 Code 128 Suppress Code Set C (Code Sets A and B only)
+            -   6.1.10.3 GS1-128
+            -   6.1.10.4 EAN-14
+            -   6.1.10.5 NVE-18 (SSCC-18)
+            -   6.1.10.6 HIBC Code 128
+            -   6.1.10.7 DPD Code
+            -   6.1.10.8 UPU S10
+        -   6.1.11 GS1 DataBar (ISO 24724)
+            -   6.1.11.1 GS1 DataBar Omnidirectional and GS1 DataBar Truncated
+            -   6.1.11.2 GS1 DataBar Limited
+            -   6.1.11.3 GS1 DataBar Expanded
+        -   6.1.12 Korea Post Barcode
+        -   6.1.13 Channel Code
+        -   6.1.14 BC412 (SEMI T1-95)
+    -   6.2 Stacked Symbologies
+        -   6.2.1 Basic Symbol Stacking
+        -   6.2.2 Codablock-F
+        -   6.2.3 Code 16K (EN 12323)
+        -   6.2.4 PDF417 (ISO 15438)
+        -   6.2.5 Compact PDF417 (ISO 15438)
+        -   6.2.6 MicroPDF417 (ISO 24728)
+        -   6.2.7 GS1 DataBar Stacked (ISO 24724)
+            -   6.2.7.1 GS1 DataBar Stacked
+            -   6.2.7.2 GS1 DataBar Stacked Omnidirectional
+            -   6.2.7.3 GS1 DataBar Expanded Stacked
+        -   6.2.8 Code 49
+    -   6.3 GS1 Composite Symbols (ISO 24723)
+        -   6.3.1 CC-A
+        -   6.3.2 CC-B
+        -   6.3.3 CC-C
+    -   6.4 Two-Track Symbols
+        -   6.4.1 Two-Track Pharmacode
+        -   6.4.2 POSTNET
+        -   6.4.3 PLANET
+        -   6.4.4 Brazilian CEPNet
+        -   6.4.5 DX Film Edge Barcode
+    -   6.5 4-State Postal Codes
+        -   6.5.1 Australia Post 4-State Symbols
+            -   6.5.1.1 Customer Barcodes
+            -   6.5.1.2 Reply Paid Barcode
+            -   6.5.1.3 Routing Barcode
+            -   6.5.1.4 Redirect Barcode
+        -   6.5.2 Dutch Post KIX Code
+        -   6.5.3 Royal Mail 4-State Customer Code (RM4SCC)
+        -   6.5.4 Royal Mail 4-State Mailmark
+        -   6.5.5 USPS Intelligent Mail
+        -   6.5.6 Japanese Postal Code
+        -   6.5.7 DAFT Code
+    -   6.6 Matrix Symbols
+        -   6.6.1 Data Matrix (ISO 16022)
+        -   6.6.2 Royal Mail 2D Mailmark (CMDM) (Data Matrix)
+        -   6.6.3 QR Code (ISO 18004)
+        -   6.6.4 Micro QR Code (ISO 18004)
+        -   6.6.5 Rectangular Micro QR Code (rMQR) (ISO 23941)
+        -   6.6.6 UPNQR (Univerzalnega Plačilnega Naloga QR)
+        -   6.6.7 MaxiCode (ISO 16023)
+        -   6.6.8 Aztec Code (ISO 24778)
+        -   6.6.9 Aztec Runes (ISO 24778)
+        -   6.6.10 Code One
+        -   6.6.11 Grid Matrix
+        -   6.6.12 DotCode
+        -   6.6.13 Han Xin Code (ISO 20830)
+        -   6.6.14 Ultracode
+    -   6.7 Other Barcode-Like Markings
+        -   6.7.1 Facing Identification Mark (FIM)
+        -   6.7.2 Flattermarken
+-   7. Legal and Version Information
+    -   7.1 License
+    -   7.2 Patent Issues
+    -   7.3 Version Information
+    -   7.4 Sources of Information
+    -   7.5 Standards Compliance
+        -   7.5.1 Symbology Standards
+        -   7.5.2 General Standards
+-   Annex A. Character Encoding
+    -   A.1 ASCII Standard
+    -   A.2 Latin Alphabet No. 1 (ISO/IEC 8859-1)
+-   Annex B. Qt Backend QZint
+-   Annex C. Tcl Backend Binding
+-   Annex D. Man Page ZINT(1)
+    -   NAME
+    -   SYNOPSIS
+    -   DESCRIPTION
+    -   OPTIONS
+    -   EXIT STATUS
+    -   EXAMPLES
+    -   BUGS
+    -   SEE ALSO
+    -   CONFORMING TO
+    -   COPYRIGHT
+    -   AUTHOR
+
+1. Introduction
+
+The Zint project aims to provide a complete cross-platform open source barcode
+generating solution. The package currently consists of a Qt-based GUI, a CLI
+command line executable and a library with an API to allow developers access to
+the capabilities of Zint. It is hoped that Zint provides a solution which is
+flexible enough for professional users while at the same time takes care of as
+much of the processing as possible to allow easy translation from input data to
+barcode image.
+
+The library which forms the main component of the Zint project is currently able
+to encode data in over 50 barcode symbologies (types of barcode), for each of
+which it is possible to translate that data from either UTF-8 (Unicode) or a raw
+8-bit data stream. The image can be rendered as a
+
+-   Windows Bitmap (BMP),
+-   Enhanced Metafile Format (EMF),
+-   Encapsulated PostScript (EPS),
+-   Graphics Interchange Format (GIF),
+-   ZSoft Paintbrush (PCX) image,
+-   Portable Network Graphic (PNG) image,
+-   Tagged Image File Format (TIF), or a
+-   Scalable Vector Graphic (SVG).
+
+Many options are available for setting the characteristics of the output image
+including the size and colour of the image, the amount of error correction used
+in the symbol and the orientation of the image.
+
+1.1 Glossary
+
+Some of the words and phrases used in this document are specific to barcoding,
+and so a brief explanation is given to help understanding:
+
+symbol
+
+    A symbol is an image which encodes data according to one of the standards.
+    This encompasses barcodes (linear symbols) as well as any of the other
+    methods of representing data used in this program.
+
+symbology
+
+    A method of encoding data to create a certain type of symbol.
+
+linear
+
+    A linear or one-dimensional symbol is one which consists of bars and spaces,
+    and is what most people associate with the term ‘barcode’. Examples include
+    Code 128.
+
+stacked
+
+    A stacked symbol consists of multiple linear symbols placed one above
+    another and which together hold the message, usually alongside some error
+    correction data. Examples include PDF417.
+
+matrix
+
+    A matrix symbol is one based on a (usually square) grid of elements called
+    modules. Examples include Data Matrix, but MaxiCode and DotCode are also
+    considered matrix symbologies.
+
+composite
+
+    A composite symbology is one which is made up of elements which are both
+    linear and stacked. Those currently supported are made up of a linear
+    ‘primary’ message above which is printed a stacked component based on the
+    PDF417 symbology. These symbols also have a separator which separates the
+    linear and the stacked components. The stacked component is most often
+    referred to as the 2D (two-dimensional) component.
+
+X-dimension
+
+    The X-dimension of a symbol is the size (usually the width) of the smallest
+    element. For a linear symbology this is the width of the smallest bar. For
+    matrix symbologies it is the width of the smallest module (usually a
+    square). Barcode widths and heights are expressed in X-dimensions. Most
+    linear symbologies can have their height varied whereas most matrix
+    symbologies have a fixed width-to-height ratio where the height is
+    determined by the width.
+
+GS1 data
+
+    This is a structured way of representing information which consists of
+    ‘chunks’ of data, each of which starts with an Application Identifier (AI).
+    The AI identifies what type of information is being encoded.
+
+Reader Initialisation (Programming)
+
+    Some symbologies allow a special character to be included which can be
+    detected by the scanning equipment as signifying that the data is used to
+    program or change settings in that equipment. This data is usually not
+    passed on to the software which handles normal input data. This feature
+    should only be used if you are familiar with the programming codes relevant
+    to your scanner.
+
+ECI
+
+    The Extended Channel Interpretations (ECI) mechanism allows for
+    multi-language data to be encoded in symbols which would usually support
+    only Latin-1 (ISO/IEC 8859-1 plus ASCII) characters. This can be useful, for
+    example, if you need to encode Cyrillic characters, but should be used with
+    caution as not all scanners support this method.
+
+Two other concepts that are important are raster and vector.
+
+raster
+
+    A low level bitmap representation of an image. BMP, GIF, PCX, PNG and TIF
+    are raster file formats.
+
+vector
+
+    A high level command- or data-based representation of an image. EMF, EPS and
+    SVG are vector file formats. They require renderers to turn them into
+    bitmaps.
+
+2. Installing Zint
+
+2.1 Linux
+
+The easiest way to configure compilation is to take advantage of the CMake
+utilities. You will need to install CMake and libpng-dev first. For instance on
+apt systems:
+
+    sudo apt install git cmake build-essential libpng-dev
+
+If you want to take advantage of Zint Barcode Studio you will also need to have
+Qt and its component "Desktop gcc 64-bit" installed, as well as mesa. For
+details see "README.linux" in the project root directory.
+
+Once you have fulfilled these requirements unzip the source code tarball or
+clone the latest source
+
+    git clone https://git.code.sf.net/p/zint/code zint
+
+and follow these steps in the top directory:
+
+    mkdir build
+    cd build
+    cmake ..
+    make
+    sudo make install
+
+The CLI command line program can be accessed by typing
+
+    zint [options]
+
+The GUI can be accessed by typing
+
+    zint-qt
+
+To test that the installation has been successful a shell script is included in
+the "frontend" sub-directory. To run the test type
+
+    ./test.sh
+
+This should create numerous files in the sub-directory "frontend/test_sh_out"
+showing the many modes of operation which are available from Zint.
+
+2.2 BSD
+
+The latest Zint CLI, libzint library and GUI can be installed from the zint
+package on FreeBSD:
+
+    su
+    pkg install zint
+    exit
+
+and on OpenBSD (where the GUI is in a separate zint-gui package):
+
+    su
+    pkg_add zint zint-gui
+    exit
+
+To build from source (including for NetBSD) see "README.bsd" in the project root
+directory.
+
+2.3 Microsoft Windows
+
+For Microsoft Windows, Zint is distributed as a binary executable. Simply
+download the ZIP file, then right-click on the ZIP file and "Extract All". A new
+folder will be created within which are two binary files:
+
+-   qtZint.exe - Zint Barcode Studio
+-   zint.exe - Command Line Interface
+
+For fresh releases you will get a warning message from Microsoft Defender
+SmartScreen that this is an ‘unrecognised app’. This happens because Zint is a
+free and open-source software project with no advertising and hence no income,
+meaning we are not able to afford the $664 per year to have the application
+digitally signed by Microsoft.
+
+To build Zint on Windows from source, see "win32/README".
+
+2.4 Apple macOS
+
+The latest Zint CLI and libzint can be installed using Homebrew.[1] To install
+Homebrew input the following line into the macOS terminal
+
+    /bin/bash -c "$(curl -fsSL \
+        https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
+
+Once Homebrew is installed use the following command to install the CLI and
+library
+
+    brew install zint
+
+To build from source (and install the GUI) see "README.macos" in the project
+root directory.
+
+2.5 Zint Tcl Backend
+
+The Tcl backend in the "backend_tcl" sub-directory may be built using the
+provided TEA (Tcl Extension Architecture) build on Linux, Windows, macOS and
+Android. For Windows, an MSVC6 makefile is also available. See Annex C. Tcl
+Backend Binding for further details.
+
+3. Using Zint Barcode Studio
+
+Zint Barcode Studio is the graphical user interface for Zint. If you are
+starting from a command line interface you can start the GUI by typing
+
+    zint-qt
+
+or on Windows
+
+    qtZint.exe
+
+See the note in section 2.3 Microsoft Windows about Microsoft Defender
+SmartScreen.
+
+Below is a brief guide to Zint Barcode Studio.
+
+3.1 Main Window and Data Tab
+
+[Zint Barcode Studio on startup - main window with Data tab]
+
+This is the main window of Zint Barcode Studio. The top of the window shows a
+preview of the barcode that the current settings would create. These settings
+can be changed using the controls below. The text box in the "Data to Encode"
+groupbox on this first Data tab allows you to enter the data to be encoded. When
+you are happy with your settings you can use the "Save..." button to save the
+resulting image to a file.
+
+The "Symbology" drop-down box gives access to all of the symbologies supported
+by Zint shown in alphabetical order. The text box to its right can filter the
+drop-down to only show matching symbologies. For instance typing "mail" will
+only show barcodes in the drop-down whose names contain the word "mail". Each
+word entered will match. So typing "mail post" will show barcodes whose names
+contain "mail" or "post" (or both).
+
+The ellipsis button "..." to the right of the data text box invokes the Data
+Dialog - see 3.7 Data Dialog for details. The delete button [delete] next to it
+will clear the data text box and the ECI (Extended Channel Interpretations)
+drop-down if set.
+
+To set the barcode as a Programming Initialisation symbol click the
+"Reader Init" checkbox. The "1234.." button to its right invokes the Sequence
+Dialog - see 3.8 Sequence Dialog. The zap button [zap] will clear all data and
+reset all settings for the barcode to defaults.
+
+The "BMP" and "SVG" buttons at the bottom will copy the image to the clipboard
+in BMP format and SVG format respectively. Further copy-to-clipboard formats are
+available by clicking the "Menu" button, along with "CLI Equivalent...",
+"Save As...", "Factory Reset...", "Help", "About..." and "Quit" options. Most of
+the options are also available in a context menu by right-clicking the preview.
+
+[Zint Barcode Studio main menu (left) and context menu (right)]
+
+3.2 GS1 Composite Groupbox
+
+[Zint Barcode Studio encoding GS1 Composite data]
+
+In the middle of the Data tab is an area for creating composite symbologies
+which appears when the currently selected symbology is supported by the GS1
+Composite symbology standard. GS1 data can then be entered with square brackets
+used to separate Application Identifier (AI) information from data as shown
+here. For details, see 6.3 GS1 Composite Symbols (ISO 24723).
+
+3.3 Additional ECI/Data Segments Groupbox
+
+[Zint Barcode Studio encoding multiple segments]
+
+For symbologies that support ECIs (Extended Channel Interpretations) the middle
+of the Data tab is an area for entering additional data segments with their own
+ECIs. Up to 4 segments (including the main "Data to Encode" as segment 0) may be
+specified. See 4.16 Multiple Segments for details.
+
+3.4 Symbology-specific Groupbox
+
+[Zint Barcode Studio showing Code 2 of 5 Interleaved settings]
+
+Many symbologies have extra options to change the content, format and appearance
+of the symbol generated. For those with few additional options (and no support
+for GS1 data or ECIs), the middle of the Data tab is an area for setting those
+options.
+
+Here is shown the check digit options for an Interleaved Code 2 of 5 symbol (see
+6.1.2.4 Interleaved Code 2 of 5 (ISO 16390)).
+
+Symbologies with more than a few options (or support for GS1 data or ECIs) have
+a second Symbology-specific tab, shown next.
+
+3.5 Symbology-specific Tab
+
+[Zint Barcode Studio showing Aztec Code options]
+
+A second tab appears for those symbologies with more than a few extra options.
+
+Here is shown the options available for an Aztec Code symbol.
+
+You can adjust its size or error correction level (see 6.6.8 Aztec Code (ISO
+24778)), select how its data is to be treated (see 4.11 Input Modes), and set it
+as part of a Structured Append sequence of symbols (see 4.17 Structured Append).
+
+3.6 Appearance Tab
+
+[Zint Barcode Studio showing Appearance tab options]
+
+The Appearance tab can be used to adjust the dimensions and other properties of
+the symbol.
+
+The "Height" value affects the height of symbologies which do not have a fixed
+width-to-height ratio, i.e. those other than matrix symbologies. For such
+symbologies the "Automatic Height" checkbox will be enabled - uncheck this to
+manually adjust the height. The "Compliant Height" checkbox applies to
+symbologies that define a standard height - see 4.4 Adjusting Height.
+
+Boundary bars can be added with the "Border Type" drop-down and their size
+adjusted with "Border Width", and whitespace can be adjusted both horizontally
+(first spinbox) and vertically (second spinbox), and also through the
+"Quiet Zones" checkbox if standard quiet zones are defined for the symbology.
+
+The size of the saved image can be specified with "Printing Scale", and also by
+clicking the [scaling] icon to invoke the Set Printing Scale Dialog - see 4.9
+Adjusting Image Size (X-dimension) for further details.
+
+[Adjusting the Print Size]
+
+The foreground and background colours can be set either using the text boxes
+which accept "RRGGBBAA" hexadecimal values and "C,M,Y,K" decimal percentage
+values, or by clicking the foreground eye [eye] and background eye [eye] buttons
+which invoke a colour picker.
+
+[The colour picker tool]
+
+(Note that to change the colours visually, the luminence slider, the long narrow
+column on the right, must be adjusted.) The color picker only deals in RGB(A),
+and will overwrite any CMYK values with RGB(A) values once "OK" is selected.
+
+Back in the Appearance tab, the colours can be reset to black-on-white using the
+"Reset" button, and exchanged one for the other using the swap [swap] button
+next to it.
+
+3.7 Data Dialog
+
+[Entering longer text input]
+
+Clicking on the ellipsis "..." button next to the "Data to Encode" text box in
+the Data tab opens a larger window which can be used to enter longer strings of
+text. You can also use this window to load data from a file.
+
+The dialog is also available for additional ECI/Data segments by clicking the
+ellipsis button to the right of their data text boxes.
+
+Note that if your data contains line feeds (LF) then the data will be split into
+separate lines in the dialog box. On saving the data back to the main text box
+any separate lines in the data will be escaped as '\n' and the "Parse Escapes"
+checkbox will be set. This only affects line feeds, not carriage returns (CR) or
+CR+LF pairs, and behaves the same on both Windows and Unix. (For details on
+escape sequences, see 4.1 Inputting Data.)
+
+3.8 Sequence Dialog
+
+[Creating a sequence of barcode symbols]
+
+Clicking on the sequence button (labelled "1234..") in the Data tab opens the
+Sequence Dialog. This allows you to create multiple barcode images by entering a
+sequence of data inputs in the right hand panel. Sequences can also be
+automatically generated by entering parameters on the left hand side or by
+importing the data from a file. Zint will generate a separate barcode image for
+each line of text in the right hand panel. The format field determines the
+format of the automatically generated sequence where characters have the
+meanings as given below:
+
+  Character             Effect
+  --------------------- --------------------------
+  $                     Insert leading zeroes
+  #                     Insert leading spaces
+  *                     Insert leading asterisks
+  Any other character   Interpreted literally
+
+  Table : Sequence Format Characters
+
+Once you’re happy with the Sequence Data, click the "Export..." button to bring
+up the Export Dialog, discussed next.
+
+3.9 Export Dialog
+
+[Setting filenames for an exported sequence of barcode symbols]
+
+The Export Dialog invoked by pressing the "Export..." button in the Sequence
+Dialog sets the parameters for exporting the sequence of barcode images. Here
+you can set the output directory, the format of the output filenames and what
+their image type will be. Note that the symbology, colour and other formatting
+information are taken from the main window.
+
+3.10 CLI Equivalent Dialog
+
+[CLI Equivalent Dialog]
+
+The CLI Equivalent Dialog can be invoked from the main menu or the context menu
+and displays the CLI command that will reproduce the barcode as currently
+configured in the GUI. Press the "Copy" button to copy the command to the
+clipboard, which can then be pasted into the command line.
+
+4. Using the Command Line
+
+This section describes how to encode data using the command line frontend (CLI)
+program. The examples given are for the Unix platform, but the same options are
+available for Windows - just remember to include the executable file extension
+if ".EXE" is not in your PATHEXT environment variable, i.e.:
+
+    zint.exe -d "This Text"
+
+For compatibility with Windows the examples use double quotes to delimit data,
+though on Unix single quotes are generally preferable as they stop the shell
+from processing any characters such as backslash or dollar. A single quote
+itself is dealt with by terminating the single-quoted text, backslashing the
+single quote, and then continuing:
+
+    zint -d 'Text containing a single quote '\'' in the middle'
+
+Some examples use backslash (\) to continue commands onto the next line. For
+Windows, use caret (^) instead.
+
+Certain options that take values have short names as well as long ones, namely
+-b (--barcode), -d (--data), -i (--input), -o (--output) and -w (--whitesp). For
+these a space should be used to separate the short name from its value, to avoid
+ambiguity. For long names a space or an equals sign may be used. For instance:
+
+    zint -d "This Text"
+    zint --data="This Text"
+    zint --data "This Text"
+
+The examples use a space separator for short option names, and an equals sign
+for long option names.
+
+4.1 Inputting Data
+
+The data to encode can be entered at the command line using the -d or --data
+option, for example
+
+    zint -d "This Text"
+
+This will encode the text "This Text". Zint will use the default symbology, Code
+128, and output to the default file "out.png" in the current directory.
+Alternatively, if libpng was not present when Zint was built, the default output
+file will be "out.gif".
+
+The data input to the Zint CLI is assumed to be encoded in UTF-8 (Unicode)
+format (Zint will correctly handle UTF-8 data on Windows). If you are encoding
+characters beyond the 7-bit ASCII set using a scheme other than UTF-8 then you
+will need to set the appropriate input options as shown in 4.11 Input Modes
+below.
+
+Non-printing characters can be entered on the command line using backslash (\)
+as an escape character in combination with the --esc switch. Permissible
+sequences are shown in the table below.
+
+  ----------------------------------------------------------------------------
+  Escape      ASCII        Name    Interpretation
+  Sequence    Equivalent
+  ----------- ------------ ------- -------------------------------------------
+  \0          0x00         NUL     Null character
+
+  \E          0x04         EOT     End of Transmission
+
+  \a          0x07         BEL     Bell
+
+  \b          0x08         BS      Backspace
+
+  \t          0x09         HT      Horizontal Tab
+
+  \n          0x0A         LF      Line Feed
+
+  \v          0x0B         VT      Vertical Tab
+
+  \f          0x0C         FF      Form Feed
+
+  \r          0x0D         CR      Carriage Return
+
+  \e          0x1B         ESC     Escape
+
+  \G          0x1D         GS      Group Separator
+
+  \R          0x1E         RS      Record Separator
+
+  \\          0x5C         \       Backslash
+
+  \dNNN       NNN                  Any 8-bit character where NNN is decimal
+                                   (000-255)
+
+  \oNNN       0oNNN                Any 8-bit character where NNN is octal
+                                   (000-377)
+
+  \xNN        0xNN                 Any 8-bit character where NN is hexadecimal
+                                   (00-FF)
+
+  \uNNNN                           Any 16-bit Unicode BMP[2] character where
+                                   NNNN is hexadecimal (0000-FFFF)
+
+  \UNNNNNN                         Any 21-bit Unicode character where NNNNNN
+                                   is hexadecimal (000000-10FFFF)
+  ----------------------------------------------------------------------------
+
+  Table : Escape Sequences
+
+(Special escape sequences are available for Code 128 only to manually switch
+Code Sets and insert special FNC1 characters - see 6.1.10.1 Standard Code 128
+(ISO 15417) for details.)
+
+Input data can be read directly from file using the -i or --input switch as
+shown below. The input file is assumed to be UTF-8 formatted unless an
+alternative mode is selected. This option replaces the use of the -d switch.
+
+    zint -i somefile.txt
+
+To read from stdin specify a single hyphen "-" as the input file.
+
+Note that except when batch processing (see 4.12 Batch Processing below), the
+file (or stdin) should not end with a newline (LF on Unix, CR+LF on Windows)
+unless you want the newline to be encoded in the symbol.
+
+4.2 Directing Output
+
+Output can be directed to a file other than the default using the -o or --output
+switch. For example:
+
+    zint -o here.png -d "This Text"
+
+This draws a Code 128 barcode in the file "here.png". If an Encapsulated
+PostScript file is needed simply append the filename with ".eps", and so on for
+the other supported file types:
+
+    zint -o there.eps -d "This Text"
+
+The currently supported output file formats are shown in the following table.
+
+  Extension   File format
+  ----------- ------------------------------------
+  bmp         Windows Bitmap
+  emf         Enhanced Metafile Format
+  eps         Encapsulated PostScript
+  gif         Graphics Interchange Format
+  pcx         ZSoft Paintbrush image
+  png         Portable Network Graphic
+  svg         Scalable Vector Graphic
+  tif         Tagged Image File Format
+  txt         Text file (see 4.19 Other Options)
+
+  Table : Output File Formats
+
+The filename can contain directories and sub-directories also, which will be
+created if they don’t already exist:
+
+    zint -o "dir/subdir/filename.eps" -d "This Text"
+
+Note that on Windows, filenames are assumed to be UTF-8 encoded.
+
+4.3 Selecting Barcode Type
+
+Selecting which type of barcode you wish to produce (i.e. which symbology to
+use) can be done at the command line using the -b or --barcode switch followed
+by the appropriate integer value or name in the following table. For example to
+create a Data Matrix symbol you could use:
+
+    zint -b 71 -o datamatrix.png -d "Data to encode"
+
+or
+
+    zint -b DATAMATRIX -o datamatrix.png -d "Data to encode"
+
+Names are treated case-insensitively by the CLI, and the BARCODE_ prefix and any
+underscores are optional.
+
+  ------------------------------------------------------------------------------
+  Numeric   Name[3]                   Barcode Name
+  Value
+  --------- ------------------------- ------------------------------------------
+  1         BARCODE_CODE11            Code 11
+
+  2*        BARCODE_C25STANDARD       Standard Code 2 of 5
+
+  3         BARCODE_C25INTER          Interleaved 2 of 5
+
+  4         BARCODE_C25IATA           Code 2 of 5 IATA
+
+  6         BARCODE_C25LOGIC          Code 2 of 5 Data Logic
+
+  7         BARCODE_C25IND            Code 2 of 5 Industrial
+
+  8         BARCODE_CODE39            Code 3 of 9 (Code 39)
+
+  9         BARCODE_EXCODE39          Extended Code 3 of 9 (Code 39+)
+
+  13        BARCODE_EANX              EAN (EAN-2, EAN-5, EAN-8 and EAN-13)
+
+  14        BARCODE_EANX_CHK          EAN + Check Digit
+
+  16*       BARCODE_GS1_128           GS1-128 (UCC.EAN-128)
+
+  18        BARCODE_CODABAR           Codabar
+
+  20        BARCODE_CODE128           Code 128 (automatic Code Set switching)
+
+  21        BARCODE_DPLEIT            Deutsche Post Leitcode
+
+  22        BARCODE_DPIDENT           Deutsche Post Identcode
+
+  23        BARCODE_CODE16K           Code 16K
+
+  24        BARCODE_CODE49            Code 49
+
+  25        BARCODE_CODE93            Code 93
+
+  28        BARCODE_FLAT              Flattermarken
+
+  29*       BARCODE_DBAR_OMN          GS1 DataBar Omnidirectional (including GS1
+                                      DataBar Truncated)
+
+  30*       BARCODE_DBAR_LTD          GS1 DataBar Limited
+
+  31*       BARCODE_DBAR_EXP          GS1 DataBar Expanded
+
+  32        BARCODE_TELEPEN           Telepen Alpha
+
+  34        BARCODE_UPCA              UPC-A
+
+  35        BARCODE_UPCA_CHK          UPC-A + Check Digit
+
+  37        BARCODE_UPCE              UPC-E
+
+  38        BARCODE_UPCE_CHK          UPC-E + Check Digit
+
+  40        BARCODE_POSTNET           POSTNET
+
+  47        BARCODE_MSI_PLESSEY       MSI Plessey
+
+  49        BARCODE_FIM               FIM
+
+  50        BARCODE_LOGMARS           LOGMARS
+
+  51        BARCODE_PHARMA            Pharmacode One-Track
+
+  52        BARCODE_PZN               PZN
+
+  53        BARCODE_PHARMA_TWO        Pharmacode Two-Track
+
+  54        BARCODE_CEPNET            Brazilian CEPNet
+
+  55        BARCODE_PDF417            PDF417
+
+  56*       BARCODE_PDF417COMP        Compact PDF417 (Truncated PDF417)
+
+  57        BARCODE_MAXICODE          MaxiCode
+
+  58        BARCODE_QRCODE            QR Code
+
+  60        BARCODE_CODE128AB         Code 128 (Suppress Code Set C)
+
+  63        BARCODE_AUSPOST           Australia Post Standard Customer
+
+  66        BARCODE_AUSREPLY          Australia Post Reply Paid
+
+  67        BARCODE_AUSROUTE          Australia Post Routing
+
+  68        BARCODE_AUSDIRECT         Australia Post Redirection
+
+  69        BARCODE_ISBNX             ISBN (EAN-13 with verification stage)
+
+  70        BARCODE_RM4SCC            Royal Mail 4-State Customer Code (RM4SCC)
+
+  71        BARCODE_DATAMATRIX        Data Matrix (ECC200)
+
+  72        BARCODE_EAN14             EAN-14
+
+  73        BARCODE_VIN               Vehicle Identification Number
+
+  74        BARCODE_CODABLOCKF        Codablock-F
+
+  75        BARCODE_NVE18             NVE-18 (SSCC-18)
+
+  76        BARCODE_JAPANPOST         Japanese Postal Code
+
+  77        BARCODE_KOREAPOST         Korea Post
+
+  79*       BARCODE_DBAR_STK          GS1 DataBar Stacked
+
+  80*       BARCODE_DBAR_OMNSTK       GS1 DataBar Stacked Omnidirectional
+
+  81*       BARCODE_DBAR_EXPSTK       GS1 DataBar Expanded Stacked
+
+  82        BARCODE_PLANET            PLANET
+
+  84        BARCODE_MICROPDF417       MicroPDF417
+
+  85*       BARCODE_USPS_IMAIL        USPS Intelligent Mail (OneCode)
+
+  86        BARCODE_PLESSEY           UK Plessey
+
+  87        BARCODE_TELEPEN_NUM       Telepen Numeric
+
+  89        BARCODE_ITF14             ITF-14
+
+  90        BARCODE_KIX               Dutch Post KIX Code
+
+  92        BARCODE_AZTEC             Aztec Code
+
+  93        BARCODE_DAFT              DAFT Code
+
+  96        BARCODE_DPD               DPD Code
+
+  97        BARCODE_MICROQR           Micro QR Code
+
+  98        BARCODE_HIBC_128          HIBC Code 128
+
+  99        BARCODE_HIBC_39           HIBC Code 39
+
+  102       BARCODE_HIBC_DM           HIBC Data Matrix ECC200
+
+  104       BARCODE_HIBC_QR           HIBC QR Code
+
+  106       BARCODE_HIBC_PDF          HIBC PDF417
+
+  108       BARCODE_HIBC_MICPDF       HIBC MicroPDF417
+
+  110       BARCODE_HIBC_BLOCKF       HIBC Codablock-F
+
+  112       BARCODE_HIBC_AZTEC        HIBC Aztec Code
+
+  115       BARCODE_DOTCODE           DotCode
+
+  116       BARCODE_HANXIN            Han Xin (Chinese Sensible) Code
+
+  119       BARCODE_MAILMARK_2D       Royal Mail 2D Mailmark (CMDM) (Data
+                                      Matrix)
+
+  121       BARCODE_MAILMARK_4S       Royal Mail 4-State Mailmark
+
+  128       BARCODE_AZRUNE            Aztec Runes
+
+  129       BARCODE_CODE32            Code 32
+
+  130       BARCODE_EANX_CC           GS1 Composite Symbol with EAN linear
+                                      component
+
+  131*      BARCODE_GS1_128_CC        GS1 Composite Symbol with GS1-128 linear
+                                      component
+
+  132*      BARCODE_DBAR_OMN_CC       GS1 Composite Symbol with GS1 DataBar
+                                      Omnidirectional linear component
+
+  133*      BARCODE_DBAR_LTD_CC       GS1 Composite Symbol with GS1 DataBar
+                                      Limited linear component
+
+  134*      BARCODE_DBAR_EXP_CC       GS1 Composite Symbol with GS1 DataBar
+                                      Expanded linear component
+
+  135       BARCODE_UPCA_CC           GS1 Composite Symbol with UPC-A linear
+                                      component
+
+  136       BARCODE_UPCE_CC           GS1 Composite Symbol with UPC-E linear
+                                      component
+
+  137*      BARCODE_DBAR_STK_CC       GS1 Composite Symbol with GS1 DataBar
+                                      Stacked component
+
+  138*      BARCODE_DBAR_OMNSTK_CC    GS1 Composite Symbol with GS1 DataBar
+                                      Stacked Omnidirectional component
+
+  139*      BARCODE_DBAR_EXPSTK_CC    GS1 Composite Symbol with GS1 DataBar
+                                      Expanded Stacked component
+
+  140       BARCODE_CHANNEL           Channel Code
+
+  141       BARCODE_CODEONE           Code One
+
+  142       BARCODE_GRIDMATRIX        Grid Matrix
+
+  143       BARCODE_UPNQR             UPNQR (Univerzalnega Plačilnega Naloga QR)
+
+  144       BARCODE_ULTRA             Ultracode
+
+  145       BARCODE_RMQR              Rectangular Micro QR Code (rMQR)
+
+  146       BARCODE_BC412             IBM BC412 (SEMI T1-95)
+
+  147       BARCODE_DXFILMEDGE        DX Film Edge Barcode
+  ------------------------------------------------------------------------------
+
+  Table : Barcode Types (Symbologies)
+
+4.4 Adjusting Height
+
+The height of a symbol (except those with a fixed width-to-height ratio) can be
+adjusted using the --height switch. For example:
+
+    zint --height=100 -d "This Text"
+
+This specifies a symbol height of 100 times the X-dimension of the symbol.
+
+The default height of most linear barcodes is 50.0X, but this can be changed for
+barcodes whose specifications give a standard height by using the switch
+--compliantheight. For instance
+
+    zint -b LOGMARS -d "This Text" --compliantheight
+
+will produce a barcode of height 45.455X instead of the normal default of 50.0X.
+The flag also causes Zint to return a warning if a non-compliant height is
+given:
+
+    zint -b LOGMARS -d "This Text" --compliantheight --height=6.2
+    Warning 247: Height not compliant with standards
+
+Another switch is --heightperrow, which can be useful for symbologies that have
+a variable number of linear rows, namely Codablock-F, Code 16K, Code 49, GS1
+DataBar Expanded Stacked, MicroPDF417 and PDF417, as it changes the treatment of
+the height value from overall height to per-row height, allowing you to specify
+a consistent height for each linear row without having to know how many there
+are. For instance
+
+    zint -b PDF417 -d "This Text" --height=4 --heightperrow
+
+[zint -b PDF417 -d "This Text" --height=4 --heightperrow]
+
+will produce a barcode of height 32X, with each of the 8 rows 4X high.
+
+4.5 Adjusting Whitespace
+
+The amount of horizontal whitespace to the left and right of the generated
+barcode can be altered using the -w or --whitesp switch, in integral multiples
+of the X-dimension. For example:
+
+    zint -w 10 -d "This Text"
+
+This specifies a whitespace width of 10 times the X-dimension of the symbol both
+to the left and to the right of the barcode.
+
+The amount of vertical whitespace above and below the barcode can be altered
+using the --vwhitesp switch, in integral multiples of the X-dimension. For
+example for 3 times the X-dimension:
+
+    zint --vwhitesp=3 -d "This Text"
+
+Note that the whitespace at the bottom appears below the text, if any.
+
+Horizontal and vertical whitespace can of course be used together:
+
+    zint -b DATAMATRIX --whitesp=1 --vwhitesp=1 -d "This Text"
+
+A --quietzones option is also available which adds quiet zones compliant with
+the symbology’s specification. This is in addition to any whitespace specified
+with the --whitesp or --vwhitesp switches.
+
+Note that Codablock-F, Code 16K, Code 49, ITF-14, EAN-2 to EAN-13, ISBN, UPC-A
+and UPC-E have compliant quiet zones added by default. This can be disabled with
+the option --noquietzones.
+
+4.6 Adding Boundary Bars and Boxes
+
+Zint allows the symbol to be bound with ‘boundary bars’ (also known as ‘bearer
+bars’) using the option --bind. These bars help to prevent misreading of the
+symbol by corrupting a scan if the scanning beam strays off the top or bottom of
+the symbol. Zint can also put a border right around the symbol and its
+horizontal whitespace with the --box option.
+
+The width of the boundary bars or box borders, in integral multiples of the
+X-dimension, must be specified using the --border switch. For example:
+
+    zint --box --border=10 -w 10 -d "This Text"
+
+[zint --border=10 --box -d "This Text" -w 10]
+
+gives a box with a width 10 times the X-dimension of the symbol. Note that when
+specifying a box, horizontal whitespace is usually required in order to create a
+quiet zone between the barcode and the sides of the box. To add a boundary bar
+to the top only use --bindtop.
+
+For linear symbols, horizontal boundary bars appear tight against the barcode,
+inside any vertical whitespace (or text). For matrix symbols, however, where
+they are decorative rather than functional, boundary bars appear outside any
+whitespace.
+
+[zint -b QRCODE --border=1 --box -d "This Text" --quietzones]
+
+Codablock-F, Code 16K and Code 49 always have boundary bars, and default to
+particular horizontal whitespace values. Special considerations apply to ITF-14
+and DPD - see 6.1.2.6 ITF-14 and 6.1.10.7 DPD Code for those symbologies.
+
+4.7 Using Colour
+
+The default colours of a symbol are a black symbol on a white background. Zint
+allows you to change this. The -r or --reverse switch allows the default colours
+to be inverted so that a white symbol is shown on a black background (known as
+“reflectance reversal” or “reversed reflectance”). For example the command
+
+    zint -r -d "This Text"
+
+gives an inverted Code 128 symbol. This is not practical for most symbologies
+but white-on-black is allowed by the Aztec Code, Data Matrix, DotCode, Han Xin
+Code, Grid Matrix and QR Code symbology specifications.
+
+For more specific needs the foreground (ink) and background (paper) colours can
+be specified using the --fg and --bg options followed by a number in "RRGGBB"
+hexadecimal notation (the same system used in HTML) or in "C,M,Y,K" decimal
+percentages format (the latter normally used with the --cmyk option - see
+below). For example the command
+
+    zint --fg=00FF00 -d "This Text"
+
+alters the symbol to a bright green.
+
+[zint -d "This Text" --fg=00FF00]
+
+Zint also supports RGBA colour information for those output file formats which
+support alpha channels (currently only GIF, PCX, PNG, SVG and TIF, with GIF
+supporting either a background or foreground alpha but not both) in a "RRGGBBAA"
+format. For example:
+
+    zint --fg=00ff0055 -d "This Text"
+
+[zint -d "This Text" --fg=00FF0055]
+
+will produce a semi-transparent green foreground with a standard (white)
+background. Note that transparency is treated differently by raster and vector
+(SVG) output formats, as for vector output the background will “shine through” a
+transparent foreground. For instance
+
+    zint --bg=ff0000 --fg=ffffff00 ...
+
+will give different results for PNG and SVG. Experimentation is advised!
+
+In addition the --nobackground option will remove the background from all output
+formats except BMP.[4]
+
+The --cmyk option is specific to output in Encapsulated PostScript (EPS) and
+TIF, and selects the CMYK colour space. Custom colours should then usually be
+given in the comma-separated "C,M,Y,K" format, where C, M, Y and K are expressed
+as decimal percentage values from 0 to 100. RGB values may still be used, in
+which case they will be converted formulaically to CMYK approximations.
+
+4.8 Rotating the Symbol
+
+The symbol can be rotated through four orientations using the --rotate option
+followed by the angle of rotation as shown below.
+
+    --rotate=0 (default)
+    --rotate=90
+    --rotate=180
+    --rotate=270
+
+[zint -d "This Text" --rotate=90]
+
+4.9 Adjusting Image Size (X-dimension)
+
+The size of the image can be altered using the --scale option, which sets the
+X-dimension. The default scale is 1.0.
+
+The scale is multiplied by 2 (with the exception of MaxiCode) before being
+applied to the X-dimension. For MaxiCode, it is multiplied by 10 for raster
+output, by 40 for EMF vector output, and by 2 otherwise (non-EMF vector output).
+
+For non-MaxiCode raster output, the default scale of 1 results in an X-dimension
+of 2 pixels. For example for non-MaxiCode PNG images a scale of 5 will increase
+the X-dimension to 10 pixels. For MaxiCode, see 4.9.3 MaxiCode Raster Scaling
+below.
+
+Scales for non-MaxiCode raster output should be given in increments of 0.5, i.e.
+0.5, 1, 1.5, 2, 2.5, 3, 3.5, etc., to avoid the X-dimension varying across the
+symbol due to interpolation. 0.5 increments are also faster to render.
+
+The minimum scale for non-MaxiCode raster output in non-dotty mode is 0.5,
+giving a minimum X-dimension of 1 pixel. For MaxiCode, it is 0.2. The minimum
+scale for raster output in dotty mode is 1 (see 4.15 Working with Dots). For
+raster output, text will not be printed for scales less than 1.
+
+The minimum scale for vector output is 0.1, giving a minimum X-dimension of 0.2
+(or for MaxiCode EMF output, 4). The maximum scale for both raster and vector is
+200.
+
+To summarize the more intricate details:
+
+  -------------------------------------------------------------------
+  MaxiCode?   Output            Multiplier   Min. Scale    Min. Scale
+                                             (non-dotty)   (dotty)
+  ----------- ----------------- ------------ ------------- ----------
+  No          Raster            2            0.5           1
+
+  No          Vector            2            0.1           0.1
+
+  Yes         Raster            10           0.2           N/A
+
+  Yes         Vector (non-EMF)  2            0.1           N/A
+
+  Yes         EMF               40           0.1           N/A
+  -------------------------------------------------------------------
+
+  Table : Scaling Multipliers and Minima
+
+4.9.1 Scaling by X-dimension and Resolution
+
+An alternative way to specify the scale, which takes the above details into
+account, is to specify measurable units using the --scalexdimdp option, which
+has the format
+
+    --scalexdimdp=X[,R]
+
+where X is the X-dimension (in mm by default) and R is the resolution (in dpmm,
+dots per mm, by default). R is optional, and defaults to 12 dpmm, and X may be
+zero, in which case it uses a symbology-specific default. The units may be given
+in inches for X by appending "in", and in dpi (dots per inch) for R by appending
+"dpi". For example
+
+    zint -d "1234" --scalexdimdp=0.013in,300dpi
+
+Explicit metric units may also be given by appending "mm" and "dpmm" as
+appropriate, and may be mixed with U.S. units:
+
+    zint -d "1234" --scalexdimdp=0.33mm,300dpi
+
+4.9.2 Scaling Example
+
+The GS1 General Specifications Section 5.2.6.6 ‘Symbol dimensions at nominal
+size’ gives an example of an EAN-13 barcode using the X-dimension of 0.33mm. To
+print that example as a PNG at 12 dpmm, the approximate equivalent of 300 dpi
+(dpi = dpmm * 25.4), specify a scale of 2, since 0.33 * 12 = 3.96 pixels, or 4
+pixels rounding to the nearest pixel:
+
+    zint -b EANX -d "501234567890" --compliantheight --scale=2
+
+This will result in output of 37.29mm x 25.56mm (WxH) at 12 dpmm. The same
+result can be achieved using the --scalexdimdp option with
+
+    zint -b EANX -d "501234567890" --compliantheight --scalexdimdp=0
+
+as 0.33mm is the default X-dimension for EAN, and 12 dpmm the default
+resolution.
+
+4.9.3 MaxiCode Raster Scaling
+
+For MaxiCode symbols, which use hexagons, the scale for raster output is
+multiplied by 10 before being applied. The 0.5 increment recommended for normal
+raster output does not apply.
+
+The minimum scale is 0.2, so the minimum X-dimension is 2 pixels. However scales
+below 0.5 are not recommended and may produce symbols that are not within the
+following size ranges.
+
+MaxiCode symbols have fixed size ranges of 24.82mm to 27.93mm in width, and
+23.71mm to 26.69mm in height, excluding quiet zones. The default X-dimension is
+0.88mm. For example, to output at the default X-dimension at 600 dpi specify:
+
+    zint -b MAXICODE -d "MaxiCode (19 chars)" --scalexdimdp=0,600dpi
+
+4.10 Human Readable Text (HRT) Options
+
+For linear barcodes the text present in the output image can be removed by using
+the --notext option. Note also that for raster output text will not be printed
+for scales less than 1 (see 4.9 Adjusting Image Size (X-dimension)).
+
+Text can be set to bold using the --bold option, or a smaller font can be
+substituted using the --small option. The --bold and --small options can be used
+together if required, but only for vector output.
+
+[zint --bold -d "This Text" --small]
+
+The gap between the barcode and the text can be adjusted using the --textgap
+option, where the gap is given in X-dimensions, and may be negative (minimum
+-5.0X, maximum 10.0X). The default gap is 1X. Note that a very small gap may
+cause accented texts to overlap with the barcode:
+
+[zint -d "Áccent" --textgap=0.1]
+
+For SVG output, the font preferred by Zint (monospaced “OCR-B” for EAN/UPC,
+“Arimo” - a proportional sans-serif font metrically compatible with “Arial” -
+for all others) can be embedded in the file for portability using the
+--embedfont option:
+
+[zint -d "Áccent" --embedfont]
+
+4.11 Input Modes
+
+4.11.1 Unicode, Data, and GS1 Modes
+
+By default all CLI input data is assumed to be encoded in UTF-8 format. Many
+barcode symbologies encode data using the Latin-1 (ISO/IEC 8859-1 plus ASCII)
+character set, so input is converted from UTF-8 to Latin-1 before being put in
+the symbol. In addition QR Code and its variants and Han Xin Code can by default
+encode Japanese (Kanji) or Chinese (Hanzi) characters which are also converted
+from UTF-8.
+
+There are two exceptions to the Latin-1 default: Grid Matrix, whose default
+character set is GB 2312 (Chinese); and UPNQR, whose default character set is
+Latin-2 (ISO/IEC 8859-2 plus ASCII).
+
+  Symbology       Default character sets     Alternate if input not Latin-1
+  --------------- -------------------------- --------------------------------
+  Aztec Code      Latin-1                    None
+  Codablock-F     Latin-1                    None
+  Code 128        Latin-1                    None
+  Code 16K        Latin-1                    None
+  Code One        Latin-1                    None
+  Data Matrix     Latin-1                    None
+  DotCode         Latin-1                    None
+  Grid Matrix     GB 2312 (includes ASCII)   N/A
+  Han Xin         Latin-1                    GB 18030 (includes ASCII)
+  MaxiCode        Latin-1                    None
+  MicroPDF417     Latin-1                    None
+  Micro QR Code   Latin-1                    Shift JIS (includes ASCII[5])
+  PDF417          Latin-1                    None
+  QR Code         Latin-1                    Shift JIS (see above)
+  rMQR            Latin-1                    Shift JIS (see above)
+  Ultracode       Latin-1                    None
+  UPNQR           Latin-2                    N/A
+  All others      ASCII                      N/A
+
+  Table : Default Character Sets
+
+If Zint encounters characters which can not be encoded using the default
+character encoding then it will take advantage of the ECI (Extended Channel
+Interpretations) mechanism to encode the data if the symbology supports it - see
+4.11.2 Input Modes and ECI below.
+
+GS1 data can be encoded in a number of symbologies. Application Identifiers
+(AIs) should be enclosed in [square brackets] followed by the data to be encoded
+(see 6.1.10.3 GS1-128). To encode GS1 data use the --gs1 option. GS1 mode is
+assumed (and doesn’t need to be set) for GS1-128, EAN-14, GS1 DataBar and GS1
+Composite symbologies but is also available for Aztec Code, Code 16K, Code 49,
+Code One, Data Matrix, DotCode, QR Code and Ultracode.
+
+Health Industry Barcode (HIBC) data may also be encoded in the symbologies Aztec
+Code, Codablock-F, Code 128, Code 39, Data Matrix, MicroPDF417, PDF417 and QR
+Code. Within this mode, the leading '+' and the check character are
+automatically added by Zint, conforming to HIBC Labeler Identification Code
+(HIBC LIC). For HIBC Provider Applications Standard (HIBC PAS), preface the data
+with a slash '/'.
+
+The --binary option encodes the input data as given. Automatic code page
+translation to an ECI page is disabled, and no validation of the data’s encoding
+takes place. This may be used for raw binary or binary encrypted data. This
+switch plays together with the built-in ECI logic and examples may be found
+below.
+
+The --fullmultibyte option uses the multibyte modes of QR Code, Micro QR Code,
+Rectangular Micro QR Code, Han Xin Code and Grid Matrix for non-ASCII data,
+maximizing density. This is achieved by using compression designed for
+Kanji/Hanzi characters; however some decoders take blocks which are encoded this
+way and interpret them as Kanji/Hanzi characters, thus causing data corruption.
+Symbols encoded with this option should be checked against decoders before they
+are used. The popular open-source ZXing decoder is known to exhibit this
+behaviour.
+
+4.11.2 Input Modes and ECI
+
+If your data contains characters that are not in the default character set, you
+may encode it using an ECI-aware symbology and an ECI value from Table
+: ECI Codes below. The ECI information is added to your code symbol as prefix
+data. The symbologies that support ECI are
+
+  ------------- -------------- -----------
+  Aztec Code    Grid Matrix    PDF417
+  Code One      Han Xin Code   QR Code
+  Data Matrix   MaxiCode       rMQR
+  DotCode       MicroPDF417    Ultracode
+  ------------- -------------- -----------
+
+  Table : ECI-Aware Symbologies
+
+Be aware that not all barcode readers support ECI mode, so this can sometimes
+lead to unreadable barcodes. If you are using characters beyond those supported
+by the default character set then you should check that the resulting barcode
+can be understood by your target barcode reader.
+
+The ECI value may be specified with the --eci switch, followed by the value in
+the column "ECI Code" in the table below. The input data should be UTF-8
+formatted. Zint automatically translates the data into the target encoding.
+
+  ECI Code   Character Encoding Scheme (ISO/IEC 8859 schemes include ASCII)
+  ---------- ----------------------------------------------------------------
+  3          ISO/IEC 8859-1 - Latin alphabet No. 1
+  4          ISO/IEC 8859-2 - Latin alphabet No. 2
+  5          ISO/IEC 8859-3 - Latin alphabet No. 3
+  6          ISO/IEC 8859-4 - Latin alphabet No. 4
+  7          ISO/IEC 8859-5 - Latin/Cyrillic alphabet
+  8          ISO/IEC 8859-6 - Latin/Arabic alphabet
+  9          ISO/IEC 8859-7 - Latin/Greek alphabet
+  10         ISO/IEC 8859-8 - Latin/Hebrew alphabet
+  11         ISO/IEC 8859-9 - Latin alphabet No. 5 (Turkish)
+  12         ISO/IEC 8859-10 - Latin alphabet No. 6 (Nordic)
+  13         ISO/IEC 8859-11 - Latin/Thai alphabet
+  15         ISO/IEC 8859-13 - Latin alphabet No. 7 (Baltic)
+  16         ISO/IEC 8859-14 - Latin alphabet No. 8 (Celtic)
+  17         ISO/IEC 8859-15 - Latin alphabet No. 9
+  18         ISO/IEC 8859-16 - Latin alphabet No. 10
+  20         Shift JIS (JIS X 0208 and JIS X 0201)
+  21         Windows 1250 - Latin 2 (Central Europe)
+  22         Windows 1251 - Cyrillic
+  23         Windows 1252 - Latin 1
+  24         Windows 1256 - Arabic
+  25         UTF-16BE (High order byte first)
+  26         UTF-8
+  27         ASCII (ISO/IEC 646 IRV)
+  28         Big5 (Taiwan) Chinese Character Set
+  29         GB 2312 (PRC) Chinese Character Set
+  30         Korean Character Set EUC-KR (KS X 1001:2002)
+  31         GBK Chinese Character Set
+  32         GB 18030 Chinese Character Set
+  33         UTF-16LE (Low order byte first)
+  34         UTF-32BE (High order bytes first)
+  35         UTF-32LE (Low order bytes first)
+  170        ISO/IEC 646 Invariant[6]
+  899        8-bit binary data
+
+  Table : ECI Codes
+
+An ECI value of 0 does not encode any ECI information in the code symbol (unless
+the data contains non-default character set characters). In this case, the
+default character set applies (see Table : Default Character Sets above).
+
+If no ECI is specified or a value of 0 is given, and the data does contain
+characters other than in the default character set, then Zint will automatically
+insert the appropriate single-byte ECI if possible (ECIs 3 to 24, excluding ECI
+20), or failing that ECI 26 (UTF-8). A warning will be generated. This mechanism
+is not applied if the --binary option is given.
+
+Multiple ECIs can be specified using the --segN options - see 4.16 Multiple
+Segments.
+
+Note: the --eci=3 specification should only be used for special purposes. Using
+this parameter, the ECI information is explicitly added to the symbol.
+Nevertheless, for ECI Code 3, this is not usually required, as this is the
+default encoding for most barcodes, which is also active without any ECI
+information.
+
+4.11.2.1 Input Modes and ECI Example 1
+
+The Euro sign U+20AC can be encoded in ISO/IEC 8859-15. The Euro sign has the
+ISO/IEC 8859-15 codepoint hex "A4". It is encoded in UTF-8 as the hex sequence:
+"E2 82 AC". Those 3 bytes are contained in the file "utf8euro.txt". This command
+will generate the corresponding code:
+
+    zint -b 71 --scale=10 --eci=17 -i utf8euro.txt
+
+This is equivalent to the commands (using the --esc switch):
+
+    zint -b 71 --scale=10 --eci=17 --esc -d "\xE2\x82\xAC"
+
+    zint -b 71 --scale=10 --eci=17 --esc -d "\u20AC"
+
+and to the command:
+
+    zint -b 71 --scale=10 --eci=17 -d "€"
+
+[zint -b DATAMATRIX --eci=17 -d "€"]
+
+4.11.2.2 Input Modes and ECI Example 2
+
+The Chinese character with the Unicode codepoint U+5E38 can be encoded in Big5
+encoding. The Big5 representation of this character is the two hex bytes:
+"B1 60" (contained in the file "big5char.txt"). The generation command for Data
+Matrix is:
+
+    zint -b 71 --scale=10 --eci=28 --binary -i big5char.txt
+
+This is equivalent to the command (using the --esc switch):
+
+    zint -b 71 --scale=10 --eci=28 --binary --esc -d "\xB1\x60"
+
+and to the commands (no --binary switch so conversion occurs):
+
+    zint -b 71 --scale=10 --eci=28 --esc -d "\xE5\xB8\xB8"
+
+    zint -b 71 --scale=10 --eci=28 --esc -d "\u5E38"
+
+    zint -b 71 --scale=10 --eci=28 -d "常"
+
+[zint -b DATAMATRIX --eci=28 -d "\u5E38" --esc]
+
+4.11.2.3 Input Modes and ECI Example 3
+
+Some decoders (in particular mobile app ones) for QR Code assume UTF-8 encoding
+by default and do not support ECI. In this case supply UTF-8 data and use the
+--binary switch so that the data will be encoded as UTF-8 without conversion:
+
+    zint -b 58 --binary -d "UTF-8 data"
+
+[zint -b QRCODE --binary -d "\xE2\x82\xAC\xE5\xB8\xB8" --esc]
+
+4.12 Batch Processing
+
+Data can be batch processed by reading from a text file and producing a separate
+barcode image for each line of text in that file. To do this use the --batch
+switch together with -i to select the input file from which to read data. For
+example
+
+    zint -b EANX --batch -i ean13nos.txt
+
+where "ean13nos.txt" contains a list of EAN-13 numbers (GTINs), each on its own
+line. Zint will automatically detect the end of a line of text (in either Unix
+or Windows formatted text files) and produce a symbol each time it finds this.
+
+Input files should end with a line feed character - if this is not present then
+Zint will not encode the last line of text, and will warn you that there is a
+problem.
+
+By default Zint will output numbered filenames starting with 00001.png,
+00002.png etc. To change this behaviour specify the -o option using special
+characters in the output filename as shown in the table below:
+
+  Input Character   Interpretation
+  ----------------- ----------------------------------------
+  ~                 Insert a number or 0
+  #                 Insert a number or space
+  @                 Insert a number or * (or + on Windows)
+  Any other         Insert literally
+
+  Table : Batch Filename Formatting
+
+For instance
+
+    zint -b EANX --batch -i ean13nos.txt -o file~~~.svg
+
+The following table shows some examples to clarify this method:
+
+  Input             Filenames Generated
+  ----------------- -----------------------------------------------------
+  -o file~~~.svg    "file001.svg", "file002.svg", "file003.svg"
+  -o @@@@bar.png    "***1.png", "***2.png", "***3.png" (except Windows)
+  -o @@@@bar.png    "+++1.png", "+++2.png", "+++3.png" (on Windows)
+  -o my~~~bar.eps   "my001bar.eps", "my002bar.eps", "my003bar.eps"
+  -o t#es~t~.png    "t es0t1.png", "t es0t2.png", "t es0t3.png"
+
+  Table : Batch Filename Examples
+
+The special characters can span directories also, which is useful when creating
+a large number of barcodes:
+
+  Input                 Filenames Generated
+  --------------------- ---------------------------------------------
+  -o dir~/file~~~.svg   "dir0/file001.svg", "dir0/file002.svg", …
+                        , "dir0/file999.svg", "dir1/file000.svg", …
+
+  Table : Batch Directory Examples
+
+For an alternative method of naming output files see the --mirror option in 4.14
+Automatic Filenames below.
+
+4.13 Direct Output to stdout
+
+The finished image files can be output directly to stdout for use as part of a
+pipe by using the --direct option. By default --direct will output data as a PNG
+image (or GIF image if libpng is not present), but this can be altered by
+supplementing the --direct option with a --filetype option followed by the
+suffix of the file type required. For example:
+
+    zint -b 84 --direct --filetype=pcx -d "Data to encode"
+
+This command will output the symbol as a PCX file to stdout. For the supported
+output file formats see Table : Output File Formats.
+
+--------------------------------------------------------------------------------
+
+CAUTION: Outputting binary files to the command shell without catching that data
+in a pipe can have unpredictable results. Use with care!
+
+--------------------------------------------------------------------------------
+
+4.14 Automatic Filenames
+
+The --mirror option instructs Zint to use the data to be encoded as an indicator
+of the filename to be used. This is particularly useful if you are processing
+batch data. For example the input data "1234567" will result in a file named
+"1234567.png".
+
+There are restrictions, however, on what characters can be stored in a filename,
+so the filename may vary from the data if the data includes non-printable
+characters, for example, and may be shortened if the data input is long.
+
+To set the output file format use the --filetype option as detailed above in
+4.13 Direct Output to stdout. To output to a specific directory use the -o
+option giving the name of the directory (any filename will be ignored, unless
+--filetype is not specified, in which case the filename’s extension will be
+used).
+
+4.15 Working with Dots
+
+Matrix codes can be rendered as a series of dots or circles rather than the
+normal squares by using the --dotty option. This option is only available for
+matrix symbologies, and is automatically selected for DotCode. The size of the
+dots can be adjusted using the --dotsize option followed by the diameter of the
+dot, where that diameter is in X-dimensions. The minimum dot size is 0.01, the
+maximum is 20. The default size is 0.8.
+
+The default and minimum scale for raster output in dotty mode is 1.
+
+[zint -b CODEONE -d "123456789012345678" --dotty --vers=9]
+
+4.16 Multiple Segments
+
+If you need to specify different ECIs for different sections of the input data,
+the --seg1 to --seg9 options can be used. Each option is of the form
+--segN=ECI,data where ECI is the ECI code (see Table : ECI Codes) and data is
+the data to which this applies. This is in addition to the ECI and data
+specified using the --eci and -d options which must still be present and which
+in effect constitute segment 0. For instance
+
+    zint -b AZTEC_CODE --eci=9 -d "Κείμενο" --seg1=7,"Текст" --seg2=20,"文章"
+
+specifies 3 segments: segment 0 with ECI 9 (Greek), segment 1 with ECI 7
+(Cyrillic), and segment 2 with ECI 20 (Shift JIS). Segments must be consecutive.
+
+Naturally the symbology must be ECI-aware (see Table : ECI-Aware Symbologies).
+
+[zint -b AZTEC --eci=9 -d "Κείμενο" --seg1=7,"Текст" --seg2=20,"文章"]
+
+ECIs of zero may be given, in which case Zint will automatically determine an
+ECI if necessary, as described in section 4.11.2 Input Modes and ECI.
+
+Multiple segments are not currently supported for use with GS1 data.
+
+4.17 Structured Append
+
+Structured Append is a method of splitting data among several symbols so that
+they form a sequence that can be scanned and re-assembled in the correct order
+on reading, and is available for Aztec Code, Code One, Data Matrix, DotCode,
+Grid Matrix, MaxiCode, MicroPDF417, PDF417, QR Code and Ultracode.
+
+The --structapp option marks a symbol as part of a Structured Append sequence,
+and has the format
+
+    --structapp=I,C[,ID]
+
+[zint -b DATAMATRIX -d "2nd of 3" --structapp="2,3,5006"]
+
+where I is the index (position) of the symbol in the Structured Append sequence,
+C is the count or total number of symbols in the sequence, and ID is an optional
+identifier (not available for Code One, DotCode or MaxiCode) that is the same
+for all symbols belonging to the same sequence. The index is 1-based and goes
+from 1 to count. Count must be 2 or more. See the individual symbologies for
+further details.
+
+4.18 Help Options
+
+There are three help options which give information about how to use the command
+line. The -h or --help option will display a list of all of the valid options
+available, and also gives the exact version of the software (the version by
+itself can be displayed with -v or --version).
+
+The -t or --types option gives the table of symbologies along with the symbol ID
+numbers and names.
+
+The -e or --ecinos option gives a list of the ECI codes.
+
+4.19 Other Options
+
+Zint can output a representation of the symbol data as a set of hexadecimal
+values if asked to output to a text file ("*.txt") or if given the option
+--filetype=txt. This can be used for test and diagnostic purposes.
+
+Additional options are available which are specific to certain symbologies.
+These may, for example, control the amount of error correction data or the size
+of the symbol. These options are discussed in section 6. Types of Symbology of
+this guide.
+
+5. Using the API
+
+Zint has been written using the C language and has an API for use with C/C++
+language programs. A Qt interface (see Annex B. Qt Backend QZint) is available
+in the "backend_qt" sub-directory, and a Tcl interface is available in the
+"backend_tcl" sub-directory (see Annex C. Tcl Backend Binding).
+
+The libzint API has been designed to be very similar to that used by the GNU
+Barcode package. This allows easy migration from GNU Barcode to Zint. Zint,
+however, uses none of the same function names or option names as GNU Barcode.
+This allows you to use both packages in your application without conflict if you
+wish.
+
+5.1 Creating and Deleting Symbols
+
+The symbols manipulated by Zint are held in a zint_symbol structure defined in
+"zint.h". These symbol structures are created with the ZBarcode_Create()
+function and deleted using the ZBarcode_Delete() function. For example the
+following code creates and then deletes a symbol:
+
+    #include <zint.h>
+    #include <stdio.h>
+    int main()
+    {
+        struct zint_symbol *my_symbol;
+        my_symbol = ZBarcode_Create();
+        if (my_symbol != NULL) {
+            printf("Symbol successfully created!\n");
+            ZBarcode_Delete(my_symbol);
+        }
+        return 0;
+    }
+
+When compiling this code it will need to be linked with the libzint library
+using the -lzint option:
+
+    gcc -o simple simple.c -lzint
+
+5.2 Encoding and Saving to File
+
+To encode data in a barcode use the ZBarcode_Encode() function. To write the
+symbol to a file use the ZBarcode_Print() function. For example the following
+code takes a string from the command line and outputs a Code 128 symbol to a PNG
+file named "out.png" (or a GIF file "out.gif" if libpng is not present) in the
+current working directory:
+
+    #include <zint.h>
+    int main(int argc, char **argv)
+    {
+        struct zint_symbol *my_symbol;
+        my_symbol = ZBarcode_Create();
+        ZBarcode_Encode(my_symbol, argv[1], 0);
+        ZBarcode_Print(my_symbol, 0);
+        ZBarcode_Delete(my_symbol);
+        return 0;
+    }
+
+This can also be done in one stage using the ZBarcode_Encode_and_Print()
+function as shown in the next example:
+
+    #include <zint.h>
+    int main(int argc, char **argv)
+    {
+        struct zint_symbol *my_symbol;
+        my_symbol = ZBarcode_Create();
+        ZBarcode_Encode_and_Print(my_symbol, argv[1], 0, 0);
+        ZBarcode_Delete(my_symbol);
+        return 0;
+    }
+
+Note that when using the API, the input data is assumed to be 8-bit binary
+unless the input_mode member of the zint_symbol structure is set - see 5.11
+Setting the Input Mode for details.
+
+5.3 Encoding and Printing Functions in Depth
+
+The functions for encoding and printing barcodes are defined as:
+
+    int ZBarcode_Encode(struct zint_symbol *symbol,
+          const unsigned char *source, int length);
+
+    int ZBarcode_Encode_File(struct zint_symbol *symbol,
+          const char *filename);
+
+    int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle);
+
+    int ZBarcode_Encode_and_Print(struct zint_symbol *symbol,
+          const unsigned char *source, int length, int rotate_angle);
+
+    int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol,
+          const char *filename, int rotate_angle);
+
+In these definitions length can be used to set the length of the input string.
+This allows the encoding of NUL (ASCII 0) characters in those symbologies which
+allow this. A value of 0 (or less than 0) will disable this usage and Zint will
+encode data up to the first NUL character in the input string, which must be
+present.
+
+The rotate_angle value can be used to rotate the image when outputting. Valid
+values are 0, 90, 180 and 270.
+
+The ZBarcode_Encode_File() and ZBarcode_Encode_File_and_Print() functions can be
+used to encode data read directly from a text file where the filename is given
+in the NUL-terminated filename string. The special filename "-" (single hyphen)
+can be used to read from stdin. Note that on Windows, filenames are assumed to
+be UTF-8 encoded.
+
+If printing more than one barcode, the zint_symbol structure may be re-used by
+calling the ZBarcode_Clear() function after each barcode to free any output
+buffers allocated. The zint_symbol input members must be reset. To fully restore
+zint_symbol to its default state, call ZBarcode_Reset() instead.
+
+5.4 Buffering Symbols in Memory (raster)
+
+In addition to saving barcode images to file Zint allows you to access a
+representation of the resulting bitmap image in memory. The following functions
+allow you to do this:
+
+    int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle);
+
+    int ZBarcode_Encode_and_Buffer(struct zint_symbol *symbol,
+          const unsigned char *source, int length, int rotate_angle);
+
+    int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol,
+          const char *filename, int rotate_angle);
+
+The arguments here are the same as above, and rotation and colour options can be
+used with the buffer functions in the same way as when saving to a file. The
+difference is that instead of saving the image to a file it is placed in a byte
+(unsigned char) array pointed to by the bitmap member, with bitmap_width set to
+the number of columns and bitmap_height set to the number of rows.
+
+The RGB channels are split into 3 consecutive red, green, blue bytes per pixel,
+and there are bitmap_width pixels per row and bitmap_height rows, so the total
+size of the bitmap array is 3 * bitmap_width * bitmap_height.
+
+If the background and/or foreground are RGBA then the byte array alphamap will
+also be set, with a single alpha value for each pixel. Its total size will be
+bitmap_width * bitmap_height.
+
+The pixel data can be extracted from the array (or arrays) by the method shown
+in the example below, where render_rgb() and render_rgba() are assumed to be
+functions for drawing an RGB and RGBA pixel on the screen implemented by the
+client application:
+
+    int row, col, i = 0, j = 0;
+    int red, blue, green, alpha;
+
+    for (row = 0; row < my_symbol->bitmap_height; row++) {
+         for (col = 0; col < my_symbol->bitmap_width; col++) {
+              red = (int) my_symbol->bitmap[i];
+              green = (int) my_symbol->bitmap[i + 1];
+              blue = (int) my_symbol->bitmap[i + 2];
+              if (my_symbol->alphamap) {
+                  alpha = (int) my_symbol->alphamap[j];
+                  render_rgba(row, col, red, green, blue, alpha);
+                  j++;
+              } else {
+                  render_rgb(row, col, red, green, blue);
+              }
+              i += 3;
+         }
+    }
+
+Where speed is important, the buffer can be returned instead in a more compact
+intermediate form using the output option OUT_BUFFER_INTERMEDIATE. Here each
+byte is an ASCII value: '1' for foreground colour and '0' for background colour,
+except for Ultracode, which also uses colour codes: 'W' for white, 'C' for cyan,
+'B' for blue, 'M' for magenta, 'R' for red, 'Y' for yellow, 'G' for green, and
+'K' for black. Alpha values are not reported (alphamap will always be NULL). The
+loop for accessing the data is then:
+
+    int row, col, i = 0;
+
+    for (row = 0; row < my_symbol->bitmap_height; row++) {
+         for (col = 0; col < my_symbol->bitmap_width; col++) {
+              render_pixel(row, col, my_symbol->bitmap[i]);
+              i++;
+         }
+    }
+
+5.5 Buffering Symbols in Memory (vector)
+
+Symbols can also be saved to memory in a vector representation as well as a
+bitmap one. The following functions, exactly analogous to the ones above, allow
+you to do this:
+
+    int ZBarcode_Buffer_Vector(struct zint_symbol *symbol, int rotate_angle);
+
+    int ZBarcode_Encode_and_Buffer_Vector(struct zint_symbol *symbol,
+          const unsigned char *source, int length, int rotate_angle);
+
+    int ZBarcode_Encode_File_and_Buffer_Vector(struct zint_symbol *symbol,
+          const char *filename, int rotate_angle);
+
+Here the vector member is set to point to a zint_vector header structure which
+contains pointers to lists of structures representing the various elements of
+the barcode: rectangles, hexagons, strings and circles. To draw the barcode,
+each of the element types is iterated in turn, and using the information stored
+is drawn by a rendering system. For instance, to draw a barcode using a
+rendering system with prepare_canvas(), draw_rect(), draw_hexagon(),
+draw_string(), and draw_circle() routines available:
+
+    struct zint_vector_rect *rect;
+    struct zint_vector_hexagon *hex;
+    struct zint_vector_string *string;
+    struct zint_vector_circle *circle;
+
+    prepare_canvas(my_symbol->vector->width, my_symbol->vector->height,
+                   my_symbol->scale, my_symbol->fgcolour, my_symbol->bgcolour,
+                   rotate_angle);
+
+    for (rect = my_symbol->vector->rectangles; rect; rect = rect->next) {
+        draw_rect(rect->x, rect->y, rect->width, rect->height,
+                  rect->colour);
+    }
+    for (hex = my_symbol->vector->hexagons; hex; hex = hex->next) {
+        draw_hexagon(hex->x, hex->y, hex->diameter, hex->rotation);
+    }
+    for (string = my_symbol->vector->strings; string; string = string->next) {
+        draw_string(string->x, string->y, string->fsize,
+                    string->rotation, string->halign,
+                    string->text, string->length);
+    }
+    for (circle = my_symbol->vector->circles; circle; circle = circle->next) {
+        draw_circle(circle->x, circle->y, circle->diameter, circle->width);
+    }
+
+5.6 Buffering Symbols in Memory (memfile)
+
+Symbols can also be stored as “in-memory” file buffers by giving the
+BARCODE_MEMORY_FILE option to the output_options member, which saves the print
+output to member memfile instead of to the output file outfile. The length of
+the buffer is given in memfile_size. For instance:
+
+    #include <zint.h>
+    #include <stdio.h>
+    #include <string.h>
+    int main(int argc, char **argv)
+    {
+        struct zint_symbol *my_symbol;
+        my_symbol = ZBarcode_Create();
+        my_symbol->output_options |= BARCODE_MEMORY_FILE;
+        /* Only the extension is used, to determine output format */
+        strcpy(my_symbol->outfile, "mem.svg");
+        ZBarcode_Encode_and_Print(my_symbol, argv[1], 0, 0);
+        /* `my_symbol->memfile` now contains the SVG output */
+        fwrite(my_symbol->memfile, 1, my_symbol->memfile_size, stdout);
+        ZBarcode_Delete(my_symbol);
+        return 0;
+    }
+
+will print the SVG output to stdout (the file “mem.svg” is not created). This is
+particularly useful for the textual formats EPS and SVG,[7] allowing the output
+to be manipulated and processed by the client.
+
+5.7 Setting Options
+
+So far our application is not very useful unless we plan to only make Code 128
+symbols and we don’t mind that they only save to "out.png" (or to memory, as
+above). As with the CLI program, of course, these options can be altered. The
+way this is done is by altering the contents of the zint_symbol structure
+between the creation and encoding stages. The zint_symbol structure consists of
+the following members:
+
+  ------------------------------------------------------------------------------
+  Member Name          Type         Meaning                    Default Value
+  -------------------- ------------ -------------------------- -----------------
+  symbology            integer      Symbol to use - see 5.9    BARCODE_CODE128
+                                    Specifying a Symbology.
+
+  height               float        Symbol height in           Symbol dependent
+                                    X-dimensions, excluding
+                                    fixed width-to-height
+                                    symbols.[8]
+
+  scale                float        Scale factor for adjusting 1.0
+                                    size of image (sets
+                                    X-dimension).
+
+  whitespace_width     integer      Horizontal whitespace      0
+                                    width in X-dimensions.
+
+  whitespace_height    integer      Vertical whitespace height 0
+                                    in X-dimensions.
+
+  border_width         integer      Border width in            0
+                                    X-dimensions.
+
+  output_options       integer      Set various output         0 (none)
+                                    parameters - see 5.10
+                                    Adjusting Output Options.
+
+  fgcolour             character    Foreground (ink) colour as "000000"
+                       string       RGB/RGBA hexadecimal
+                                    string or "C,M,Y,K"
+                                    decimal percentages
+                                    string, with a terminating
+                                    NUL.
+
+  bgcolour             character    Background (paper) colour  "ffffff"
+                       string       as RGB/RGBA hexadecimal
+                                    string or "C,M,Y,K"
+                                    decimal percentages
+                                    string, with a terminating
+                                    NUL.
+
+  fgcolor              pointer      Points to fgcolour
+                                    allowing alternate
+                                    spelling.
+
+  bgcolor              pointer      Points to bgcolour
+                                    allowing alternate
+                                    spelling.
+
+  outfile              character    Contains the name of the   "out.png"
+                       string       file to output a resulting
+                                    barcode symbol to. Must
+                                    end in .png, .gif, .bmp,
+                                    .emf, .eps, .pcx, .svg,
+                                    .tif or .txt followed by a
+                                    terminating NUL.[9]
+
+  primary              character    Primary message data for   "" (empty)
+                       string       more complex symbols, with
+                                    a terminating NUL.
+
+  option_1             integer      Symbol specific options.   -1
+
+  option_2             integer      Symbol specific options.   0
+
+  option_3             integer      Symbol specific options.   0
+
+  show_hrt             integer      Set to 0 to hide Human     1
+                                    Readable Text (HRT).
+
+  input_mode           integer      Set encoding of input      DATA_MODE
+                                    data - see 5.11 Setting
+                                    the Input Mode.
+
+  eci                  integer      Extended Channel           0 (none)
+                                    Interpretation code.
+
+  dpmm                 float        Resolution of output in    0 (none)
+                                    dots per mm (BMP, EMF,
+                                    PCX, PNG and TIF only).
+
+  dot_size             float        Diameter of dots used in   0.8
+                                    dotty mode (in
+                                    X-dimensions).
+
+  text_gap             float        Gap between barcode and    1.0
+                                    text (HRT) in
+                                    X-dimensions.
+
+  guard_descent        float        Height of guard bar        5.0
+                                    descent (EAN/UPC only) in
+                                    X-dimensions.
+
+  structapp            Structured   Mark a symbol as part of a count 0
+                       Append       sequence of symbols.       (disabled)
+                       structure
+
+  debug                integer      Debugging flags.           0
+
+  warn_level           integer      Affects error/warning      WARN_DEFAULT
+                                    value returned by Zint
+                                    API - see 5.8 Handling
+                                    Errors.
+
+  text                 unsigned     Human Readable Text, which "" (empty)
+                       character    usually consists of input  (output only)
+                       string       data plus one more check
+                                    digit. Uses UTF-8
+                                    formatting, with a
+                                    terminating NUL.
+
+  rows                 integer      Number of rows used by the (output only)
+                                    symbol.
+
+  width                integer      Width of the generated     (output only)
+                                    symbol.
+
+  encoded_data         array of     Representation of the      (output only)
+                       unsigned     encoded data.
+                       character
+                       arrays
+
+  row_height           array of     Heights of each row.       (output only)
+                       floats
+
+  errtxt               character    Error message in the event (output only)
+                       string       that an error occurred,
+                                    with a terminating NUL -
+                                    see 5.8 Handling Errors.
+
+  bitmap               pointer to   Pointer to stored bitmap   (output only)
+                       unsigned     image - see 5.4 Buffering
+                       character    Symbols in Memory
+                       array        (raster).
+
+  bitmap_width         integer      Width of stored bitmap     (output only)
+                                    image (in pixels) - see
+                                    bitmap member.
+
+  bitmap_height        integer      Height of stored bitmap    (output only)
+                                    image (in pixels) - see
+                                    bitmap member.
+
+  alphamap             pointer to   Pointer to array           (output only)
+                       unsigned     representing alpha channel
+                       character    of stored bitmap image (or
+                       array        NULL if no alpha channel
+                                    used) - see bitmap member.
+
+  vector               pointer to   Pointer to vector header   (output only)
+                       vector       containing pointers to
+                       structure    vector elements - see 5.5
+                                    Buffering Symbols in
+                                    Memory (vector).
+
+  memfile              pointer to   Pointer to in-memory file  (output only)
+                       unsigned     buffer if
+                       character    BARCODE_MEMORY_FILE set in
+                       array        output_options - see 5.6
+                                    Buffering Symbols in
+                                    Memory (memfile).
+
+  memfile_size         integer      Length of in-memory file   (output only)
+                                    buffer.
+  ------------------------------------------------------------------------------
+
+  : Table  : API Structure zint_symbol
+
+To alter these values use the syntax shown in the example below. This code has
+the same result as the previous example except the output is now taller and
+plotted in green.
+
+    #include <zint.h>
+    #include <string.h>
+    int main(int argc, char **argv)
+    {
+        struct zint_symbol *my_symbol;
+        my_symbol = ZBarcode_Create();
+        strcpy(my_symbol->fgcolour, "00ff00");
+        my_symbol->height = 400.0f;
+        ZBarcode_Encode_and_Print(my_symbol, argv[1], 0, 0);
+        ZBarcode_Delete(my_symbol);
+        return 0;
+    }
+
+Note that background removal for all outputs except BMP can be achieved by
+setting the background alpha to "00" where the values for R, G and B will be
+ignored:
+
+        strcpy(my_symbol->bgcolour, "55555500");
+
+This is what the CLI option --nobackground does - see 4.7 Using Colour.
+
+5.8 Handling Errors
+
+If errors occur during encoding a non-zero integer value is passed back to the
+calling application. In addition the errtxt member is set to a message detailing
+the nature of the error. The errors generated by Zint are:
+
+  ------------------------------------------------------------------------------
+  Return Value                   Meaning
+  ------------------------------ -----------------------------------------------
+  ZINT_WARN_HRT_TRUNCATED        The Human Readable Text returned in text was
+                                 truncated (maximum 255 bytes).
+
+  ZINT_WARN_INVALID_OPTION       One of the values in zint_struct was set
+                                 incorrectly but Zint has made a guess at what
+                                 it should have been and generated a barcode
+                                 accordingly.
+
+  ZINT_WARN_USES_ECI             Zint has automatically inserted an ECI
+                                 character. The symbol may not be readable with
+                                 some readers.
+
+  ZINT_WARN_NONCOMPLIANT         The symbol was created but is not compliant
+                                 with certain standards set in its specification
+                                 (e.g. height, GS1 AI data lengths).
+
+  ZINT_ERROR                     Marks the divide between warnings and errors.
+                                 For return values greater than or equal to this
+                                 no symbol (or only an incomplete symbol) is
+                                 generated.
+
+  ZINT_ERROR_TOO_LONG            The input data is too long or too short for the
+                                 selected symbology. No symbol has been
+                                 generated.
+
+  ZINT_ERROR_INVALID_DATA        The data to be encoded includes characters
+                                 which are not permitted by the selected
+                                 symbology (e.g. alphabetic characters in an EAN
+                                 symbol). No symbol has been generated.
+
+  ZINT_ERROR_INVALID_CHECK       Data with an incorrect check digit has been
+                                 entered. No symbol has been generated.
+
+  ZINT_ERROR_INVALID_OPTION      One of the values in zint_struct was set
+                                 incorrectly and Zint was unable (or unwilling)
+                                 to guess what it should have been. No symbol
+                                 has been generated.
+
+  ZINT_ERROR_ENCODING_PROBLEM    A problem has occurred during encoding of the
+                                 data. This should never happen. Please contact
+                                 the developer if you encounter this error.
+
+  ZINT_ERROR_FILE_ACCESS         Zint was unable to open the requested output
+                                 file. This is usually a file permissions
+                                 problem.
+
+  ZINT_ERROR_MEMORY              Zint ran out of memory. This should only be a
+                                 problem with legacy systems.
+
+  ZINT_ERROR_FILE_WRITE          Zint failed to write all contents to the
+                                 requested output file. This should only occur
+                                 if the output device becomes full.
+
+  ZINT_ERROR_USES_ECI            Returned if warn_level set to WARN_FAIL_ALL and
+                                 ZINT_WARN_USES_ECI occurs.
+
+  ZINT_ERROR_NONCOMPLIANT        Returned if warn_level set to WARN_FAIL_ALL and
+                                 ZINT_WARN_NONCOMPLIANT occurs.
+
+  ZINT_ERROR_HRT_TRUNCATED       Returned if warn_level set to WARN_FAIL_ALL and
+                                 ZINT_WARN_HRT_TRUNCATED occurs.
+  ------------------------------------------------------------------------------
+
+  Table : API Warning and Error Return Values
+
+To catch errors use an integer variable as shown in the code below:
+
+    #include <zint.h>
+    #include <stdio.h>
+    #include <string.h>
+    int main(int argc, char **argv)
+    {
+        struct zint_symbol *my_symbol;
+        int error;
+        my_symbol = ZBarcode_Create();
+        /* Set invalid foreground colour */
+        strcpy(my_symbol->fgcolour, "nonsense");
+        error = ZBarcode_Encode_and_Print(my_symbol, argv[1], 0, 0);
+        if (error != 0) {
+            /* Some warning or error occurred */
+            printf("%s\n", my_symbol->errtxt);
+            if (error >= ZINT_ERROR) {
+                /* Stop now */
+                ZBarcode_Delete(my_symbol);
+                return 1;
+            }
+        }
+        /* Otherwise carry on with the rest of the application */
+        ZBarcode_Delete(my_symbol);
+        return 0;
+    }
+
+This code will exit with the appropriate message:
+
+    Error 881: Malformed foreground RGB colour 'nonsense' (hexadecimal only)
+
+To treat all warnings as errors, set symbol->warn_level to WARN_FAIL_ALL.
+
+5.9 Specifying a Symbology
+
+Symbologies can be specified by number or by name as shown in the Table
+: Barcode Types (Symbologies). For example
+
+    symbol->symbology = BARCODE_LOGMARS;
+
+means the same as
+
+    symbol->symbology = 50;
+
+5.10 Adjusting Output Options
+
+The output_options member can be used to adjust various aspects of the output
+file. To select more than one option from the table below simply OR them
+together when adjusting this value:
+
+    my_symbol->output_options |= BARCODE_BIND | READER_INIT;
+
+  ------------------------------------------------------------------------------
+  Value                      Effect
+  -------------------------- ---------------------------------------------------
+  0                          No options selected.
+
+  BARCODE_BIND_TOP           Boundary bar above the symbol only.[10]
+
+  BARCODE_BIND               Boundary bars above and below the symbol and
+                             between rows if stacking multiple symbols.[11]
+
+  BARCODE_BOX                Add a box surrounding the symbol and whitespace.
+
+  BARCODE_STDOUT             Output the file to stdout.
+
+  READER_INIT                Create as a Reader Initialisation (Programming)
+                             symbol.
+
+  SMALL_TEXT                 Use a smaller font for the Human Readable Text.
+
+  BOLD_TEXT                  Embolden the Human Readable Text.
+
+  CMYK_COLOUR                Select the CMYK colour space option for
+                             Encapsulated PostScript and TIF files.
+
+  BARCODE_DOTTY_MODE         Plot a matrix symbol using dots rather than
+                             squares.
+
+  GS1_GS_SEPARATOR           Use GS (Group Separator) instead of FNC1 as GS1
+                             separator (Data Matrix only).
+
+  OUT_BUFFER_INTERMEDIATE    Return the bitmap buffer as ASCII values instead of
+                             separate colour channels - see 5.4 Buffering
+                             Symbols in Memory (raster).
+
+  BARCODE_QUIET_ZONES        Add compliant quiet zones (additional to any
+                             specified whitespace).[12]
+
+  BARCODE_NO_QUIET_ZONES     Disable quiet zones, notably those with defaults.
+
+  COMPLIANT_HEIGHT           Warn if height specified not compliant, or use
+                             standard height (if any) as default.
+
+  EANUPC_GUARD_WHITESPACE    Add quiet zone indicators (“<” and/or “>”) to HRT
+                             whitespace (EAN/UPC).
+
+  EMBED_VECTOR_FONT          Embed font in vector output - currently available
+                             for SVG output only.
+
+  BARCODE_MEMORY_FILE        Write output to in-memory buffer symbol->memfile
+                             instead of to outfile file.
+  ------------------------------------------------------------------------------
+
+  : Table  : API output_options Values
+
+5.11 Setting the Input Mode
+
+The way in which the input data is encoded can be set using the input_mode
+member. Valid values are shown in the table below.
+
+  ------------------------------------------------------------------------------
+  Value               Effect
+  ------------------- ----------------------------------------------------------
+  DATA_MODE           Uses full 8-bit range interpreted as binary data.
+
+  UNICODE_MODE        Uses UTF-8 input.
+
+  GS1_MODE            Encodes GS1 data using FNC1 characters.
+
+                      The above are exclusive, the following optional and OR-ed.
+
+  ESCAPE_MODE         Process input data for escape sequences.
+
+  GS1PARENS_MODE      Parentheses (round brackets) used in GS1 data instead of
+                      square brackets to delimit Application Identifiers
+                      (parentheses must not otherwise occur in the data).
+
+  GS1NOCHECK_MODE     Do not check GS1 data for validity, i.e. suppress checks
+                      for valid AIs and data lengths. Invalid characters (e.g.
+                      control characters, extended ASCII characters) are still
+                      checked for.
+
+  HEIGHTPERROW_MODE   Interpret the height member as per-row rather than as
+                      overall height.
+
+  FAST_MODE           Use faster if less optimal encodation or other shortcuts
+                      if available (affects DATAMATRIX, MICROPDF417, PDF417,
+                      QRCODE and UPNQR only).
+
+  EXTRA_ESCAPE_MODE   Process special symbology-specific escape sequences
+                      (CODE128 only).
+  ------------------------------------------------------------------------------
+
+  : Table  : API input_mode Values
+
+The default mode is DATA_MODE. (Note that this differs from the default for the
+CLI and GUI, which is UNICODE_MODE.)
+
+DATA_MODE, UNICODE_MODE and GS1_MODE are mutually exclusive, whereas
+ESCAPE_MODE, GS1PARENS_MODE, GS1NOCHECK_MODE, HEIGHTPERROW_MODE, FAST_MODE and
+EXTRA_ESCAPE_MODE are optional. So, for example, you can set
+
+    my_symbol->input_mode = UNICODE_MODE | ESCAPE_MODE;
+
+or
+
+    my_symbol->input_mode = GS1_MODE | GS1PARENS_MODE | GS1NOCHECK_MODE;
+
+whereas
+
+    my_symbol->input_mode = DATA_MODE | GS1_MODE;
+
+is not valid.
+
+Permissible escape sequences (ESCAPE_MODE) are listed in Table
+: Escape Sequences, and the special Code 128-only EXTRA_ESCAPE_MODE escape
+sequences are given in 6.1.10.1 Standard Code 128 (ISO 15417). An example of
+GS1PARENS_MODE usage is given in section 6.1.10.3 GS1-128.
+
+GS1NOCHECK_MODE is for use with legacy systems that have data that does not
+conform to the current GS1 standard. Printable ASCII input is still checked for,
+as is the validity of GS1 data specified without AIs (e.g. linear data for GS1
+DataBar Omnidirectional/Limited/etc.). Also checked is GS1 DataBar Expanded and
+GS1 Composite input that is not in the GS1 encodable character set 82 (see GS1
+General Specifications Figure 7.11.1 ‘GS1 AI encodable character set 82’),
+otherwise encodation would fail.
+
+For HEIGHTPERROW_MODE, see --heightperrow in section 4.4 Adjusting Height. The
+height member should be set to the desired per-row value on input (it will be
+set to the overall height on output).
+
+FAST_MODE causes a less optimal encodation scheme to be used for Data Matrix,
+MicroPDF417 and PDF417. For QR Code and UPNQR, it affects Zint’s automatic mask
+selection - see 6.6.3 QR Code (ISO 18004) for details.
+
+5.12 Multiple Segments
+
+For input data requiring multiple ECIs, the following functions may be used:
+
+    int ZBarcode_Encode_Segs(struct zint_symbol *symbol,
+          const struct zint_seg segs[], const int seg_count);
+
+    int ZBarcode_Encode_Segs_and_Print(struct zint_symbol *symbol,
+          const struct zint_seg segs[], const int seg_count, int rotate_angle);
+
+    int ZBarcode_Encode_Segs_and_Buffer(struct zint_symbol *symbol,
+          const struct zint_seg segs[], const int seg_count, int rotate_angle);
+
+    int ZBarcode_Encode_Segs_and_Buffer_Vector(struct zint_symbol *symbol,
+          const struct zint_seg segs[], const int seg_count, int rotate_angle);
+
+These are direct analogues of the previously mentioned ZBarcode_Encode(),
+ZBarcode_Encode_and_Print(), ZBarcode_Encode_and_Buffer() and
+ZBarcode_Encode_and_Buffer_Vector() respectively, where instead of a pair
+consisting of "source, length", a pair consisting of "segs, seg_count" is given,
+with segs being an array of struct zint_seg segments and seg_count being the
+number of elements it contains. The zint_seg structure is of the form:
+
+    struct zint_seg {
+        unsigned char *source; /* Data to encode */
+        int length;            /* Length of `source`. If 0, `source` must be
+                                  NUL-terminated */
+        int eci;               /* Extended Channel Interpretation */
+    };
+
+The symbology must support ECIs (see Table : ECI-Aware Symbologies). For
+example:
+
+    #include <zint.h>
+    int main(int argc, char **argv)
+    {
+        struct zint_seg segs[] = {
+            { "Κείμενο", 0, 9 },
+            { "Текст", 0, 7 },
+            { "文章", 0, 20 }
+        };
+        struct zint_symbol *my_symbol;
+        my_symbol = ZBarcode_Create();
+        my_symbol->symbology = BARCODE_AZTEC;
+        my_symbol->input_mode = UNICODE_MODE;
+        ZBarcode_Encode_Segs(my_symbol, segs, 3);
+        ZBarcode_Print(my_symbol, 0);
+        ZBarcode_Delete(my_symbol);
+        return 0;
+    }
+
+A maximum of 256 segments may be specified. Use of multiple segments with GS1
+data is not currently supported.
+
+5.13 Scaling Helpers
+
+To help with scaling the output, the following three function are available:
+
+    float ZBarcode_Default_Xdim(int symbol_id);
+
+    float ZBarcode_Scale_From_XdimDp(int symbol_id, float x_dim_mm, float dpmm,
+            const char *filetype) {
+
+    float ZBarcode_XdimDP_From_Scale(int symbol_id, float scale,
+            float x_dim_mm_or_dpmm, const char *filetype);
+
+The first ZBarcode_Default_Xdim() returns the default X-dimension suggested by
+Zint for symbology symbol_id.
+
+The second ZBarcode_Scale_From_XdimDp() returns the scale to use to output to a
+file of type filetype with X-dimension x_dim_mm at dpmm dots per mm. The given
+X-dimension must be non-zero and less than or equal to 10mm, however dpmm may be
+zero and defaults to 12 dpmm, and filetype may be NULL or empty in which case a
+GIF filetype is assumed. For raster output (BMP/GIF/PCX/PNG/TIF) the scale is
+rounded to half-integer increments.
+
+For example:
+
+    /* Royal Mail 4-State Customer Code */
+    my_symbol->symbology = BARCODE_RM4SCC;
+    my_symbol->dpmm = 600.0f / 25.4f; /* 600 dpi */
+    my_symbol->scale = ZBarcode_Scale_From_XdimDp(
+                            my_symbol->symbology,
+                            ZBarcode_Default_Xdim(my_symbol->symbology),
+                            my_symbol->dpmm, "PNG"); /* Returns 7.5 */
+
+The third function ZBarcode_XdimDP_From_Scale() is the “reverse” of
+ZBarcode_Scale_From_XdimDp(), returning the X-dimension (in mm) or the dot
+density (in dpmm) given a scale scale. Both scale and x_dim_mm_or_dpmm must be
+non-zero. The returned value is bound to the maximum value of dpmm (1000), so
+must be further bound to 10 on return if the X-dimension is sought.
+
+Note that the X-dimension to use is application dependent, and varies not only
+due to the symbology, resolution and filetype but also due to the type of
+scanner used, the intended scanning distance, and what media (“substrates”) the
+barcode appears on.
+
+5.14 Verifying Symbology Availability
+
+An additional function available in the API is:
+
+    int ZBarcode_ValidID(int symbol_id);
+
+which allows you to check whether a given symbology is available, returning a
+non-zero value if so. For example:
+
+    if (ZBarcode_ValidID(BARCODE_PDF417) != 0) {
+        printf("PDF417 available\n");
+    } else {
+        printf("PDF417 not available\n");
+    }
+
+Another function that may be useful is:
+
+    int ZBarcode_BarcodeName(int symbol_id, char name[32]);
+
+which copies the name of a symbology into the supplied name buffer, which should
+be 32 characters in length. The name is NUL-terminated, and zero is returned on
+success. For instance:
+
+    char name[32];
+    if (ZBarcode_BarcodeName(BARCODE_PDF417, name) == 0) {
+        printf("%s\n", name);
+    }
+
+will print BARCODE_PDF417.
+
+5.15 Checking Symbology Capabilities
+
+It can be useful for frontend programs to know the capabilities of a symbology.
+This can be determined using another additional function:
+
+    unsigned int ZBarcode_Cap(int symbol_id, unsigned int cap_flag);
+
+by OR-ing the flags below in the cap_flag argument and checking the return to
+see which are set.
+
+  ------------------------------------------------------------------------------
+  Value                       Meaning
+  --------------------------- --------------------------------------------------
+  ZINT_CAP_HRT                Can the symbology print Human Readable Text?
+
+  ZINT_CAP_STACKABLE          Is the symbology stackable?
+
+  ZINT_CAP_EANUPC[13]         Is the symbology EAN/UPC?
+
+  ZINT_CAP_COMPOSITE          Does the symbology support composite data? (see
+                              6.3 GS1 Composite Symbols (ISO 24723) below)
+
+  ZINT_CAP_ECI                Does the symbology support Extended Channel
+                              Interpretations?
+
+  ZINT_CAP_GS1                Does the symbology support GS1 data?
+
+  ZINT_CAP_DOTTY              Can the symbology be outputted as dots?
+
+  ZINT_CAP_QUIET_ZONES        Does the symbology have default quiet zones?
+
+  ZINT_CAP_FIXED_RATIO        Does the symbology have a fixed width-to-height
+                              (aspect) ratio?
+
+  ZINT_CAP_READER_INIT        Does the symbology support Reader Initialisation?
+
+  ZINT_CAP_FULL_MULTIBYTE     Is the ZINT_FULL_MULTIBYTE option applicable?
+
+  ZINT_CAP_MASK               Is mask selection applicable?
+
+  ZINT_CAP_STRUCTAPP          Does the symbology support Structured Append?
+
+  ZINT_CAP_COMPLIANT_HEIGHT   Does the symbology have a compliant height
+                              defined?
+  ------------------------------------------------------------------------------
+
+  Table : API Capability Flags
+
+For example:
+
+    unsigned int cap;
+    cap = ZBarcode_Cap(BARCODE_PDF417, ZINT_CAP_HRT | ZINT_CAP_ECI);
+    if (cap & ZINT_CAP_HRT) {
+        printf("PDF417 supports HRT\n");
+    } else {
+        printf("PDF417 does not support HRT\n");
+    }
+    if (cap & ZINT_CAP_ECI) {
+        printf("PDF417 supports ECI\n");
+    } else {
+        printf("PDF417 does not support ECI\n");
+    }
+
+5.16 Zint Version
+
+Whether the Zint library linked to was built with PNG support may be determined
+with:
+
+    int ZBarcode_NoPng();
+
+which returns 1 if no PNG support is available, else zero.
+
+Lastly, the version of the Zint library linked to is returned by:
+
+    int ZBarcode_Version();
+
+The version parts are separated by hundreds. For instance, version "2.9.1" is
+returned as "20901".
+
+6. Types of Symbology
+
+6.1 One-Dimensional Symbols
+
+One-dimensional or linear symbols are what most people associate with the term
+barcode. They consist of a number of bars and a number of spaces of differing
+widths.
+
+6.1.1 Code 11
+
+[zint -b CODE11 -d "9212320967"]
+
+Developed by Intermec in 1977, Code 11 is similar to Code 2 of 5 Matrix and is
+primarily used in telecommunications. The symbol can encode data consisting of
+the digits 0-9 and the dash character (-) up to a maximum of 140 characters. Two
+modulo-11 check digits are added by default. To add just one check digit, set
+--vers=1 (API option_2 = 1). To add no check digits, set --vers=2 (API
+option_2 = 2).
+
+6.1.2 Code 2 of 5
+
+Code 2 of 5 is a family of one-dimensional symbols, 8 of which are supported by
+Zint. Note that the names given to these standards alters from one source to
+another so you should take care to ensure that you have the right barcode type
+before using these standards.
+
+6.1.2.1 Standard Code 2 of 5
+
+[zint -b C25STANDARD -d "9212320967"]
+
+Also known as Code 2 of 5 Matrix, this is a self-checking code used in
+industrial applications and photo development. Standard Code 2 of 5 will encode
+numeric input (digits 0-9) up to a maximum of 112 digits. No check digit is
+added by default. To add a check digit, set --vers=1 (API option_2 = 1). To add
+a check digit but not show it in the Human Readable Text, set --vers=2 (API
+option_2 = 2).
+
+6.1.2.2 IATA Code 2 of 5
+
+[zint -b C25IATA -d "9212320967"]
+
+Used for baggage handling in the air-transport industry by the International Air
+Transport Agency, this self-checking code will encode numeric input (digits 0-9)
+up to a maximum of 80 digits. No check digit is added by default, but can be set
+the same as for 6.1.2.1 Standard Code 2 of 5.
+
+6.1.2.3 Industrial Code 2 of 5
+
+[zint -b C25IND -d "9212320967"]
+
+Industrial Code 2 of 5 can encode numeric input (digits 0-9) up to a maximum of
+79 digits. No check digit is added by default, but can be set the same as for
+6.1.2.1 Standard Code 2 of 5.
+
+6.1.2.4 Interleaved Code 2 of 5 (ISO 16390)
+
+[zint -b C25INTER --compliantheight -d "9212320967"]
+
+This self-checking symbology encodes pairs of numbers, and so can only encode an
+even number of digits (0-9). If an odd number of digits is entered a leading
+zero is added by Zint. A maximum of 62 pairs (124 digits) can be encoded. No
+check digit is added by default, but can be set the same as for 6.1.2.1 Standard
+Code 2 of 5.
+
+6.1.2.5 Code 2 of 5 Data Logic
+
+[zint -b C25LOGIC -d "9212320967"]
+
+Data Logic does not include a check digit by default and can encode numeric
+input (digits 0-9) up to a maximum of 113 digits. Check digit options are the
+same as for 6.1.2.1 Standard Code 2 of 5.
+
+6.1.2.6 ITF-14
+
+[zint -b ITF14 --compliantheight -d "9212320967145"]
+
+ITF-14, also known as UPC Shipping Container Symbol or Case Code, is based on
+Interleaved Code 2 of 5 and requires a 13-digit numeric input (digits 0-9). One
+modulo-10 check digit is added by Zint.
+
+If no border option is specified Zint defaults to adding a bounding box with a
+border width of 5. This behaviour can be overridden by using the --bind option
+(API output_options |= BARCODE_BIND). Similarly the border width can be
+overridden using --border (API border_width). If a symbol with no border is
+required this can be achieved by explicitly setting the border type to box (or
+bind or bindtop) and leaving the border width 0.
+
+[zint -b ITF14 --box --compliantheight -d "9212320967145"]
+
+6.1.2.7 Deutsche Post Leitcode
+
+[zint -b DPLEIT -d "9212320967145"]
+
+Leitcode is based on Interleaved Code 2 of 5 and is used by Deutsche Post for
+routing purposes. Leitcode requires a 13-digit numerical input to which Zint
+adds a check digit.
+
+6.1.2.8 Deutsche Post Identcode
+
+[zint -b DPIDENT -d "91232096712"]
+
+Identcode is based on Interleaved Code 2 of 5 and is used by Deutsche Post for
+identification purposes. Identcode requires an 11-digit numerical input to which
+Zint adds a check digit.
+
+6.1.3 UPC (Universal Product Code) (ISO 15420)
+
+6.1.3.1 UPC Version A
+
+[zint -b UPCA --compliantheight -d "72527270270"]
+
+UPC-A is used in the United States for retail applications. The symbol requires
+an 11-digit article number. The check digit is calculated by Zint. In addition
+EAN-2 and EAN-5 add-on symbols can be added using the + character. For example,
+to draw a UPC-A symbol with the data 72527270270 with an EAN-5 add-on showing
+the data 12345 use the command:
+
+    zint -b UPCA -d "72527270270+12345"
+
+or using the API encode a data string with the + character included:
+
+    my_symbol->symbology = BARCODE_UPCA;
+    error = ZBarcode_Encode_and_Print(my_symbol, "72527270270+12345", 0, 0);
+
+[zint -b UPCA --compliantheight -d "72527270270+12345"]
+
+If your input data already includes the check digit symbology BARCODE_UPCA_CHK
+(35) can be used which takes a 12-digit input and validates the check digit
+before encoding.
+
+A quiet zone indicator can be added to the HRT by setting --guardwhitespace (API
+output_options |= EANUPC_GUARD_WHITESPACE). For UPC, this is only relevant when
+there is add-on:
+
+    zint -b UPCA -d "72527270270+12345" --guardwhitespace
+
+or using the API:
+
+    my_symbol->symbology = BARCODE_UPCA;
+    my_symbol->output_options |= EANUPC_GUARD_WHITESPACE;
+    error = ZBarcode_Encode_and_Print(my_symbol, "72527270270+12345", 0, 0);
+
+[zint -b UPCA --compliantheight -d "72527270270+12345" --guardwhitespace]
+
+You can adjust the gap between the main symbol and an add-on in integral
+multiples of the X-dimension by setting --addongap (API option_2) to a value
+between 9 (default) and 12. The height in X-dimensions that the guard bars
+descend below the main bars can be adjusted by setting --guarddescent (API
+guard_descent) to a value between 0.0 and 20.0 (default 5.0).
+
+6.1.3.2 UPC Version E
+
+[zint -b UPCE --compliantheight -d "1123456"]
+
+UPC-E is a zero-compressed version of UPC-A developed for smaller packages. The
+code requires a 6-digit article number (digits 0-9). The check digit is
+calculated by Zint. EAN-2 and EAN-5 add-on symbols can be added using the +
+character as with UPC-A. In addition Zint also supports Number System 1 encoding
+by entering a 7-digit article number starting with the digit 1. For example:
+
+    zint -b UPCE -d "1123456"
+
+or
+
+    my_symbol->symbology = BARCODE_UPCE;
+    error = ZBarcode_Encode_and_Print(my_symbol, "1123456", 0, 0);
+
+If your input data already includes the check digit symbology BARCODE_UPCE_CHK
+(38) can be used which takes a 7 or 8-digit input and validates the check digit
+before encoding.
+
+As with UPC-A, a quiet zone indicator can be added when there is an add-on by
+setting --guardwhitespace (API output_options |= EANUPC_GUARD_WHITESPACE):
+
+    zint -b UPCE -d "1123456+12" --guardwhitespace
+
+[zint -b UPCE --compliantheight -d "1123456+12" --guardwhitespace]
+
+You can adjust the gap between the main symbol and an add-on in integral
+multiples of the X-dimension by setting --addongap (API option_2) to a value
+between 7 (default) and 12. The height in X-dimensions that the guard bars
+descend below the main bars can be adjusted by setting --guarddescent (API
+guard_descent) to a value between 0.0 and 20.0 (default 5.0).
+
+6.1.4 EAN (European Article Number) (ISO 15420)
+
+6.1.4.1 EAN-2, EAN-5, EAN-8 and EAN-13
+
+[zint -b EANX --compliantheight -d "4512345678906"]
+
+The EAN system is used in retail across Europe and includes standards for EAN-2,
+EAN-5, EAN-8 and EAN-13 which encode 2, 5, 7 or 12-digit numbers respectively.
+Zint will decide which symbology to use depending on the length of the input
+data. In addition EAN-2 and EAN-5 add-on symbols can be added to EAN-8 and
+EAN-13 symbols using the + character as with UPC symbols. For example:
+
+    zint -b EANX -d "54321"
+
+[zint -b EANX --compliantheight -d "54321"]
+
+will encode a stand-alone EAN-5, whereas
+
+    zint -b EANX -d "7432365+54321"
+
+will encode an EAN-8 symbol with an EAN-5 add-on. As before these results can be
+achieved using the API:
+
+    my_symbol->symbology = BARCODE_EANX;
+
+    error = ZBarcode_Encode_and_Print(my_symbol, "54321", 0, 0);
+
+    error = ZBarcode_Encode_and_Print(my_symbol, "7432365+54321", 0, 0);
+
+[zint -b EANX --compliantheight -d "7432365+54321"]
+
+All of the EAN symbols include check digits which are added by Zint.
+
+If you are encoding an EAN-8 or EAN-13 symbol and your data already includes the
+check digit then you can use symbology BARCODE_EANX_CHK (14) which takes an 8 or
+13-digit input and validates the check digit before encoding.
+
+Options to add quiet zone indicators and to adjust the add-on gap and the guard
+bar descent height are the same as for 6.1.3.2 UPC Version E. For instance:
+
+    zint -b EANX_CHK -d "74323654" --guardwhitespace
+
+[zint -b EANX_CHK --compliantheight -d "74323654" –guardwhitespace]
+
+6.1.4.2 SBN, ISBN and ISBN-13
+
+[zint -b ISBNX --compliantheight -d "9789295055124"]
+
+EAN-13 symbols (also known as Bookland EAN-13) can also be produced from 9-digit
+SBN, 10-digit ISBN or 13-digit ISBN-13 data. The relevant check digit needs to
+be present in the input data and will be verified before the symbol is
+generated.
+
+As with EAN-13, a quiet zone indicator can be added using --guardwhitespace:
+
+[zint -b ISBNX --compliantheight -d "9789295055124" --guardwhitespace]
+
+EAN-2 and EAN-5 add-on symbols can be added using the + character, and there are
+options to adjust the add-on gap and the guard bar descent height - see 6.1.3.2
+UPC Version E.
+
+6.1.5 Plessey
+
+6.1.5.1 UK Plessey
+
+[zint -b PLESSEY -d "C64"]
+
+Also known as Plessey Code, this symbology was developed by the Plessey Company
+Ltd. in the UK. The symbol can encode data consisting of digits (0-9) or letters
+A-F up to a maximum of 67 characters and includes a hidden CRC check digit.
+
+6.1.5.2 MSI Plessey
+
+[zint -b MSI_PLESSEY -d "6502" --vers=2]
+
+Based on Plessey and developed by MSI Data Corporation, MSI Plessey can encode
+numeric (digits 0-9) input of up to 92 digits. It has a range of check digit
+options that are selectable by setting --vers (API option_2), shown in the table
+below:
+
+  Value   Check Digits
+  ------- -----------------------------
+  0       None
+  1       Modulo-10 (Luhn)
+  2       Modulo-10 & Modulo-10
+  3       Modulo-11 (IBM)
+  4       Modulo-11 (IBM) & Modulo-10
+  5       Modulo-11 (NCR)
+  6       Modulo-11 (NCR) & Modulo-10
+
+  Table : MSI Plessey Check Digit Options
+
+To not show the check digit or digits in the Human Readable Text, add 10 to the
+--vers value. For example --vers=12 (API option_2 = 12) will add two hidden
+modulo-10 check digits.
+
+6.1.6 Telepen
+
+6.1.6.1 Telepen Alpha
+
+[zint -b TELEPEN --compliantheight -d "Z80"]
+
+Telepen Alpha was developed by SB Electronic Systems Limited and can encode
+ASCII text input, up to a maximum of 69 characters. Telepen includes a hidden
+modulo-127 check digit, added by Zint.
+
+6.1.6.2 Telepen Numeric
+
+[zint -b TELEPEN_NUM --compliantheight -d "466X33"]
+
+Telepen Numeric allows compression of numeric data into a Telepen symbol. Data
+can consist of pairs of numbers or pairs consisting of a numerical digit
+followed an X character. For example: 466333 and 466X33 are valid codes whereas
+46X333 is not (the digit pair "X3" is not valid). Up to 136 digits can be
+encoded. Telepen Numeric includes a hidden modulo-127 check digit which is added
+by Zint.
+
+6.1.7 Code 39
+
+6.1.7.1 Standard Code 39 (ISO 16388)
+
+[zint -b CODE39 --compliantheight -d "1A" --vers=1]
+
+Standard Code 39 was developed in 1974 by Intermec. Input data can be up to 86
+characters in length and can include the characters 0-9, A-Z, dash (-), full
+stop (.), space, asterisk (*), dollar ($), slash (/), plus (+) and percent (%).
+The standard does not require a check digit but a modulo-43 check digit can be
+added if desired by setting --vers=1 (API option_2 = 1). To add a check digit
+but not show it in the Human Readable Text, set --vers=2 (API option_2 = 2).
+
+6.1.7.2 Extended Code 39
+
+[zint -b EXCODE39 --compliantheight -d "123.45$@fd"]
+
+Also known as Code 39e and Code39+, this symbology expands on Standard Code 39
+to provide support for the full 7-bit ASCII character set. The check digit
+options are the same as for 6.1.7.1 Standard Code 39 (ISO 16388).
+
+6.1.7.3 Code 93
+
+[zint -b CODE93 --compliantheight -d "C93"]
+
+A variation of Extended Code 39, Code 93 also supports full ASCII text,
+accepting up to 123 characters. Two check characters are added by Zint. By
+default these check characters are not shown in the Human Readable Text, but may
+be shown by setting --vers=1 (API option_2 = 1).
+
+6.1.7.4 PZN (Pharmazentralnummer)
+
+[zint -b PZN --compliantheight -d "2758089"]
+
+PZN is a Code 39 based symbology used by the pharmaceutical industry in Germany.
+PZN encodes a 7-digit number to which Zint will add a modulo-11 check digit
+(PZN8). Input less than 7 digits will be zero-filled. An 8-digit input can be
+supplied in which case Zint will validate the check digit.
+
+To encode a PZN7 (obsolete since 2013) instead set --vers=1 (API option_2 = 1)
+and supply up to 7 digits. As with PZN8, a modulo-11 check digit will be added
+or if 7 digits supplied the check digit validated.
+
+6.1.7.5 LOGMARS
+
+[zint -b LOGMARS --compliantheight -d "12345/ABCDE" --vers=1]
+
+LOGMARS (Logistics Applications of Automated Marking and Reading Symbols) is a
+variation of the Code 39 symbology used by the U.S. Department of Defense.
+LOGMARS encodes the same character set as 6.1.7.1 Standard Code 39 (ISO 16388),
+and the check digit options are also the same. Input is restricted to a maximum
+of 30 characters.
+
+6.1.7.6 Code 32
+
+[zint -b CODE32 --compliantheight -d "14352312"]
+
+A variation of Code 39 used by the Italian Ministry of Health (“Ministero della
+Sanità”) for encoding identifiers on pharmaceutical products. This symbology
+requires a numeric input up to 8 digits in length. A check digit is added by
+Zint.
+
+6.1.7.7 HIBC Code 39
+
+[zint -b HIBC_39 --compliantheight -d "14352312"]
+
+This variant adds a leading '+' character and a trailing modulo-49 check digit
+to a standard Code 39 symbol as required by the Health Industry Barcode
+standards.
+
+6.1.7.8 Vehicle Identification Number (VIN)
+
+[zint -b VIN -d "2FTPX28L0XCA15511" --vers=1]
+
+A variation of Code 39 that for vehicle identification numbers used in North
+America (first character '1' to '5') has a check character verification stage. A
+17 character input (0-9, and A-Z excluding 'I', 'O' and 'Q') is required. An
+invisible Import character prefix 'I' can be added by setting --vers=1 (API
+option_2 = 1).
+
+6.1.8 Codabar (EN 798)
+
+[zint -b CODABAR --compliantheight -d "A37859B"]
+
+Also known as NW-7, Monarch, ABC Codabar, USD-4, Ames Code and Code 27, this
+symbology was developed in 1972 by Monarch Marketing Systems for retail
+purposes. The American Blood Commission adopted Codabar in 1977 as the standard
+symbology for blood identification. Codabar can encode up to 103 characters
+starting and ending with the letters A-D and containing between these letters
+the numbers 0-9, dash (-), dollar ($), colon (:), slash (/), full stop (.) or
+plus (+). No check character is generated by default, but a modulo-16 one can be
+added by setting --vers=1 (API option_2 = 1). To have the check character appear
+in the Human Readable Text, set --vers=2 (API option_2 = 2).
+
+6.1.9 Pharmacode
+
+[zint -b PHARMA --compliantheight -d "130170"]
+
+Developed by Laetus, Pharmacode is used for the identification of
+pharmaceuticals. The symbology is able to encode whole numbers between 3 and
+131070.
+
+6.1.10 Code 128
+
+6.1.10.1 Standard Code 128 (ISO 15417)
+
+[zint -b CODE128 --bind -d "130170X178"]
+
+One of the most ubiquitous one-dimensional barcode symbologies, Code 128 was
+developed in 1981 by Computer Identics. This symbology supports full ASCII text
+and uses a three-Code Set system to compress the data into a smaller symbol.
+Zint automatically switches between Code Sets A, B and C (but see below) and
+adds a hidden modulo-103 check digit.
+
+Code 128 is the default barcode symbology used by Zint. In addition Zint
+supports the encoding of ISO/IEC 8859-1 (non-English) characters in Code 128
+symbols. The ISO/IEC 8859-1 character set is shown in Annex A.2 Latin Alphabet
+No. 1 (ISO/IEC 8859-1).
+
+Manual switching of Code Sets is possible using the --extraesc option (API
+input_mode |= EXTRA_ESCAPE_MODE), which apart from processing normal escape
+sequences also processes the Code 128-specific escapes \^A, \^B, \^C and \^@
+(the latter turns off manual Code Set selection). For instance the following
+will force switching to Code Set B for the data "5678" (normally Code Set C
+would be used throughout):
+
+    zint -b CODE128 -d "1234\^B5678" --extraesc
+
+The manually selected Code Set will apply until the next Code Set escape
+sequence or until a \^@, with the exception that data that cannot be represented
+in that Code Set will be switched as appropriate. If the data contains an extra
+escape sequence, it can be escaped by doubling the caret (^). For instance
+
+    zint -b CODE128 -d "\^AABC\^^BDEF" --extraesc
+
+will encode the data "ABC\^BDEF" in Code Set A.
+
+There is also the extra escape \^1, which will encode a special Function Code 1
+character (FNC1) anywhere you chose in the data, for instance
+
+    zint -b CODE128 -d "A\^1BC\^1DEF" --extraesc
+
+Zint can encode a maximum of 102 symbol characters, which allows for e.g. 202
+all-numeric or 101 all-uppercase characters. Sizes above 120 digits (60
+alphanumerics) are not recommended.
+
+6.1.10.2 Code 128 Suppress Code Set C (Code Sets A and B only)
+
+[zint -b CODE128AB -d "130170X178"]
+
+It is sometimes advantageous to stop Code 128 from using Code Set C which
+compresses numerical data. The BARCODE_CODE128AB[14] variant (symbology 60)
+suppresses Code Set C in favour of Code Sets A and B.
+
+Note that the special extra escapes mentioned above are not available for this
+variant (nor for any other).
+
+6.1.10.3 GS1-128
+
+[zint -b GS1_128 --compliantheight -d "[01]98898765432106[3202]012345[15]991231"
+]
+
+A variation of Code 128 previously known as UCC/EAN-128, this symbology is
+defined by the GS1 General Specifications. Application Identifiers (AIs) should
+be entered using [square bracket] notation. These will be converted to
+parentheses (round brackets) for the Human Readable Text. This will allow round
+brackets to be used in the data strings to be encoded.
+
+For compatibility with data entry in other systems, if the data does not include
+round brackets, the option --gs1parens (API input_mode |= GS1PARENS_MODE) may be
+used to signal that AIs are encased in round brackets instead of square ones.
+
+Fixed length data should be entered at the appropriate length for correct
+encoding. GS1-128 does not support extended ASCII (ISO/IEC 8859-1) characters.
+Check digits for GTIN data AI (01) are not generated and need to be included in
+the input data. The following is an example of a valid GS1-128 input:
+
+    zint -b 16 -d "[01]98898765432106[3202]012345[15]991231"
+
+or using the --gs1parens option:
+
+    zint -b 16 --gs1parens -d "(01)98898765432106(3202)012345(15)991231"
+
+6.1.10.4 EAN-14
+
+[zint -b EAN14 --compliantheight -d "9889876543210"]
+
+A shorter version of GS1-128 which encodes GTIN data only. A 13-digit number is
+required. The GTIN check digit and HRT-only AI “(01)” are added by Zint.
+
+6.1.10.5 NVE-18 (SSCC-18)
+
+[zint -b NVE18 --compliantheight -d "37612345000001003"]
+
+A variation of Code 128 the ‘Nummer der Versandeinheit’ standard, also known as
+SSCC-18 (Serial Shipping Container Code), includes both a visible modulo-10 and
+a hidden modulo-103 check digit. NVE-18 requires a 17-digit numerical input.
+Check digits and HRT-only AI “(00)” are added by Zint.
+
+6.1.10.6 HIBC Code 128
+
+[zint -b HIBC_128 -d "A123BJC5D6E71"]
+
+This option adds a leading '+' character and a trailing modulo-49 check digit to
+a standard Code 128 symbol as required by the Health Industry Barcode standards.
+
+6.1.10.7 DPD Code
+
+[zint -b DPD --compliantheight -d "000393206219912345678101040"]
+
+Another variation of Code 128 as used by DPD (Deutscher Paketdienst). Requires a
+27 or 28 character input. For 28 character input, the first character is an
+identification tag (Barcode ID), which should usually be "%" (ASCII 37). If 27
+characters are supplied, "%" will be prefixed by Zint (except if marked as a
+“relabel”, see below). The rest of the 27-character input must be alphanumeric,
+and is of the form:
+
+  -----------------------------------------------------------------------
+  Destination Post   Tracking Number     Service     Destination Country
+  Code                                   Code        Code
+  ------------------ ------------------- ----------- --------------------
+  PPPPPPP (7         TTTTTTTTTTTTTT (14  SSS (3      CCC (3-digit ISO
+  alphanumerics)     alphanumerics)      digits)     3166-1)
+
+  -----------------------------------------------------------------------
+
+  Table : DPD Input Fields
+
+A warning will be generated if the Service Code, the Destination Country Code,
+or the last 10 characters of the Tracking Number are non-numeric.
+
+Zint formats the Human Readable Text as specified by DPD, leaving out the
+identication tag, and adds a modulo-36 check character to the text (not to the
+barcode itself), thus:
+
+PPPP PPP TTTT TTTT TTTT TT SSS CCC D
+
+By default a top boundary bar is added, with default width 3X. The width can be
+overridden using --border (API border_width). For a symbol with no top boundary
+bar, explicitly set the border type to bindtop (or bind or box) and leave the
+border width 0.
+
+A DPD Code can be marked as a “relabel” by specifying --vers=1 (API
+option_2 = 1), which omits the identification tag and prints the barcode at half
+height. In this case, an input of 27 alphanumeric characters is required.
+
+6.1.10.8 UPU S10
+
+[zint -b UPU_S10 --compliantheight -d "EE876543216CA"]
+
+The Universal Postal Union S10 variant of Code 128 encodes 13 characters in the
+format "SSNNNNNNNNXCC", where "SS" is a two-character alphabetic service
+indicator, "NNNNNNNN" is an 8-digit serial number, "X" is a modulo-11 check
+digit, and "CC" is a two-character ISO 3166-1 country code.
+
+The check digit may be omitted in which case Zint will add it. Warnings will be
+generated if the service indicator is non-standard or the country code is not
+ISO 3361-1.
+
+6.1.11 GS1 DataBar (ISO 24724)
+
+Previously known as RSS (Reduced Spaced Symbology), these symbols are due to
+replace GS1-128 symbols in accordance with the GS1 General Specifications. If a
+GS1 DataBar symbol is to be printed with a 2D component as specified in ISO/IEC
+24723 set --mode=2 (API option_1 = 2). See 6.3 GS1 Composite Symbols (ISO 24723)
+to find out how to generate DataBar symbols with 2D components.
+
+6.1.11.1 GS1 DataBar Omnidirectional and GS1 DataBar Truncated
+
+[zint -b DBAR_OMN --compliantheight -d "0950110153001"]
+
+Previously known as RSS-14 this standard encodes a 13-digit item code. A check
+digit and HRT-only Application Identifier of “(01)” are added by Zint. (A
+14-digit code that appends the check digit may be given, in which case the check
+digit will be verified.)
+
+GS1 DataBar Omnidirectional symbols should have a height of 33 or greater. To
+produce a GS1 DataBar Truncated symbol set the symbol height to a value between
+13 and 32. Truncated symbols may not be scannable by omnidirectional scanners.
+
+[zint -b DBAR_OMN -d "0950110153001" --height=13]
+
+6.1.11.2 GS1 DataBar Limited
+
+[zint -b DBAR_LTD --compliantheight -d "0950110153001"]
+
+Previously known as RSS Limited this standard encodes a 13-digit item code and
+can be used in the same way as GS1 DataBar Omnidirectional above. GS1 DataBar
+Limited, however, is limited to data starting with digits 0 and 1 (i.e. numbers
+in the range 0 to 1999999999999). As with GS1 DataBar Omnidirectional a check
+digit and HRT-only Application Identifier of “(01)” are added by Zint, and a
+14-digit code may be given in which case the check digit will be verified.
+
+6.1.11.3 GS1 DataBar Expanded
+
+[zint -b DBAR_EXP --compliantheight -d "[01]98898765432106[3202]012345[15]991231
+"]
+
+Previously known as RSS Expanded this is a variable length symbology capable of
+encoding data from a number of AIs in a single symbol. AIs should be encased in
+[square brackets] in the input data, which will be converted to parentheses
+(round brackets) before being included in the Human Readable Text attached to
+the symbol. This method allows the inclusion of parentheses in the data to be
+encoded. If the data does not include parentheses, the AIs may alternatively be
+encased in parentheses using the --gs1parens switch. See 6.1.10.3 GS1-128.
+
+GTIN data AI (01) should also include the check digit data as this is not
+calculated by Zint when this symbology is encoded. Fixed length data should be
+entered at the appropriate length for correct encoding. The following is an
+example of a valid GS1 DataBar Expanded input:
+
+    zint -b 31 -d "[01]98898765432106[3202]012345[15]991231"
+
+6.1.12 Korea Post Barcode
+
+[zint -b KOREAPOST -d "923457"]
+
+The Korean Postal Barcode is used to encode a 6-digit number and includes one
+check digit.
+
+6.1.13 Channel Code
+
+[zint -b CHANNEL -d "453678" --compliantheight]
+
+A highly compressed symbol for numeric data. The number of channels in the
+symbol can be between 3 and 8 and this can be specified by setting the value of
+the --vers option (API option_2). It can also be determined by the length of the
+input data: e.g. a three character input string generates a 4 channel code by
+default.
+
+The maximum values permitted depend on the number of channels used as shown in
+the table below:
+
+  Channels   Minimum Value   Maximum Value
+  ---------- --------------- ---------------
+  3          00              26
+  4          000             292
+  5          0000            3493
+  6          00000           44072
+  7          000000          576688
+  8          0000000         7742862
+
+  Table : Channel Value Ranges
+
+6.1.14 BC412 (SEMI T1-95)
+
+[zint -b BC412 -d "AQ45670" --compliantheight]
+
+Designed by IBM for marking silicon wafers, each BC412 character is represented
+by 4 bars of a single size, interleaved with 4 spaces of varying sizes that
+total 8 (hence 4 bars in 12). Zint implements the SEMI T1-95 standard, where
+input must be alphanumeric, excluding the letter O, and must be from 7 to 18
+characters in length. A single check character is added by Zint, appearing in
+the 2nd character position. Lowercase input is automatically made uppercase.
+
+6.2 Stacked Symbologies
+
+6.2.1 Basic Symbol Stacking
+
+An early innovation to get more information into a symbol, used primarily in the
+vehicle industry, is to simply stack one-dimensional codes on top of each other.
+This can be achieved at the command prompt by giving more than one set of input
+data. For example
+
+    zint -d "This" -d "That"
+
+will draw two Code 128 symbols, one on top of the other. The same result can be
+achieved using the API by executing the ZBarcode_Encode() function more than
+once on a symbol. For example:
+
+    my_symbol->symbology = BARCODE_CODE128;
+
+    error = ZBarcode_Encode(my_symbol, "This", 0);
+
+    error = ZBarcode_Encode(my_symbol, "That", 0);
+
+    error = ZBarcode_Print(my_symbol);
+
+[zint -d "This" -d "That"]
+
+Note that the Human Readable Text will be that of the last data, so it’s best to
+use the option --notext (API show_hrt = 0).
+
+The stacked barcode rows can be separated by row separator bars by specifying
+--bind (API output_options |= BARCODE_BIND). The height of the row separator
+bars in integral multiples of the X-dimension (minimum and default 1, maximum 4)
+can be set by --separator (API option_3):
+
+    zint --bind --notext --separator=2 -d "This" -d "That"
+
+[zint --notext --bind --separator=2 -d "This" -d "That"]
+
+A more sophisticated method is to use some type of line indexing which indicates
+to the barcode reader which order the stacked symbols should be read in. This is
+demonstrated by the symbologies below.
+
+6.2.2 Codablock-F
+
+[zint -b CODABLOCKF -d "CODABLOCK F Symbology" --rows=3]
+
+This is a stacked symbology based on Code 128 which can encode Latin-1 data up
+to a maximum length of 2726 symbol characters, meaning for instance up to 2726
+all ASCII characters, or 5452 all numeric, or up to 1363 all extended ASCII
+(ISO/IEC 8859-1).
+
+The width of the Codablock-F symbol can be set using the --cols option (API
+option_2), to a value between 9 and 67. The height (number of rows) can be set
+using the --rows option (API option_1), with a maximum of 44. Zint does not
+currently support encoding of GS1 data in Codablock-F symbols.
+
+A separate symbology ID (BARCODE_HIBC_BLOCKF) can be used to encode Health
+Industry Barcode (HIBC) data which adds a leading '+' character and a modulo-49
+check digit to the encoded data.
+
+6.2.3 Code 16K (EN 12323)
+
+[zint -b CODE16K --compliantheight -d "ab0123456789"]
+
+Code 16K uses a Code 128 based system which can stack up to 16 rows in a block.
+This gives a maximum data capacity of 77 characters or 154 numerical digits and
+includes two modulo-107 check digits. Code 16K also supports ISO/IEC 8859-1
+character encoding in the same manner as Code 128. GS1 data encoding is also
+supported. The minimum number of rows to use can be set using the --rows option
+(API option_1), with values from 2 to 16.
+
+6.2.4 PDF417 (ISO 15438)
+
+[zint -b PDF417 -d "PDF417"]
+
+Heavily used in the parcel industry, the PDF417 symbology can encode a vast
+amount of data into a small space. Zint supports encoding up to the ISO standard
+maximum symbol size of 925 codewords which (at error correction level 0) allows
+a maximum data size of 1850 text characters, or 2710 digits.
+
+The width of the generated PDF417 symbol can be specified at the command line
+using the --cols switch (API option_2) followed by a number between 1 and 30,
+the number of rows using the --rows switch (API option_3) followed by a number
+between 3 and 90, and the amount of error correction information can be
+specified by using the --secure switch (API option_1) followed by a number
+between 0 and 8 where the number of codewords used for error correction is
+determined by 2^(value + 1). The default level of error correction is determined
+by the amount of data being encoded.
+
+This symbology uses Latin-1 character encoding by default but also supports the
+ECI encoding mechanism. A separate symbology ID (BARCODE_HIBC_PDF) can be used
+to encode Health Industry Barcode (HIBC) data.
+
+For a faster but less optimal encoding, the --fast option (API
+input_mode |= FAST_MODE) may be used.
+
+PDF417 supports Structured Append of up to 99,999 symbols and an optional
+numeric ID of up to 30 digits, which can be set by using the --structapp option
+(see 4.17 Structured Append) (API structapp). The ID consists of up to 10
+triplets, each ranging from "000" to "899". For instance "123456789" would be a
+valid ID of 3 triplets. However "123456900" would not, as the last triplet "900"
+exceeds "899". The triplets are 0-filled, for instance "1234" becomes "123004".
+If an ID is not given, no ID is encoded.
+
+6.2.5 Compact PDF417 (ISO 15438)
+
+[zint -b PDF417COMP -d "PDF417"]
+
+Previously known as Truncated PDF417, Compact PDF417 omits some per-row overhead
+to produce a narrower but less robust symbol. Options are the same as for PDF417
+above.
+
+6.2.6 MicroPDF417 (ISO 24728)
+
+[zint -b MICROPDF417 -d "12345678"]
+
+A variation of the PDF417 standard, MicroPDF417 is intended for applications
+where symbol size needs to be kept to a minimum. 34 predefined symbol sizes are
+available with 1 - 4 columns and 4 - 44 rows. The maximum amount a MicroPDF417
+symbol can hold is 250 alphanumeric characters or 366 digits. The amount of
+error correction used is dependent on symbol size. The number of columns used
+can be determined using the --cols switch (API option_2) as with PDF417.
+
+This symbology uses Latin-1 character encoding by default but also supports the
+ECI encoding mechanism. A separate symbology ID (BARCODE_HIBC_MICPDF) can be
+used to encode Health Industry Barcode (HIBC) data. MicroPDF417 supports
+FAST_MODE and Structured Append the same as PDF417, for which see details.
+
+6.2.7 GS1 DataBar Stacked (ISO 24724)
+
+6.2.7.1 GS1 DataBar Stacked
+
+[zint -b DBAR_STK --compliantheight -d "9889876543210"]
+
+A stacked variation of the GS1 DataBar Truncated symbol requiring the same input
+(see 6.1.11.1 GS1 DataBar Omnidirectional and GS1 DataBar Truncated), this
+symbol is the same as the following GS1 DataBar Stacked Omnidirectional symbol
+except that its height is reduced and its central separator is a single row,
+making it suitable for small items when omnidirectional scanning is not
+required. It can be generated with a two-dimensional component to make a
+composite symbol.
+
+6.2.7.2 GS1 DataBar Stacked Omnidirectional
+
+[zint -b DBAR_OMNSTK --compliantheight -d "9889876543210"]
+
+A stacked variation of the GS1 DataBar Omnidirectional symbol requiring the same
+input (see 6.1.11.1 GS1 DataBar Omnidirectional and GS1 DataBar Truncated). The
+data is encoded in two rows of bars with a central 3-row separator. This symbol
+can be generated with a two-dimensional component to make a composite symbol.
+
+6.2.7.3 GS1 DataBar Expanded Stacked
+
+[zint -b DBAR_EXPSTK --compliantheight -d "[01]98898765432106[3202]012345[15]991
+231"]
+
+A stacked variation of the GS1 DataBar Expanded symbol for smaller packages.
+Input is the same as for GS1 DataBar Expanded (see 6.1.11.3 GS1 DataBar
+Expanded). In addition the width of the symbol can be altered using the --cols
+switch (API option_2). In this case the number of columns (values 1 to 11)
+relates to the number of character pairs on each row of the symbol.
+Alternatively the --rows switch (API option_3) can be used to specify the
+maximum number of rows (values 2 to 11), and the number of columns will be
+adjusted accordingly. This symbol can be generated with a two-dimensional
+component to make a composite symbol. For symbols with a 2D component the number
+of columns must be at least 2.
+
+6.2.8 Code 49
+
+[zint -b CODE49 --compliantheight -d "MULTIPLE ROWS IN CODE 49"]
+
+Developed in 1987 at Intermec, Code 49 is a cross between UPC and Code 39. It is
+one of the earliest stacked symbologies and influenced the design of Code 16K a
+few years later. It supports full 7-bit ASCII input up to a maximum of 49
+characters or 81 numeric digits. GS1 data encoding is also supported. The
+minimum number of rows to use can be set using the --rows option (API option_1),
+with values from 2 to 8.
+
+6.3 GS1 Composite Symbols (ISO 24723)
+
+GS1 Composite symbols employ a mixture of components to give more comprehensive
+information about a product. The permissible contents of a composite symbol is
+determined by the terms of the GS1 General Specifications. Composite symbols
+consist of a linear component which can be an EAN, UPC, GS1-128 or GS1 DataBar
+symbol, a two-dimensional (2D) component which is based on PDF417 or
+MicroPDF417, and a separator pattern. The type of linear component to be used is
+determined using the -b or --barcode switch (API symbology) as with other
+encoding methods. Valid values are shown below.
+
+  ----------------------------------------------------------------------------
+  Numeric   Name                      Barcode Name
+  Value
+  --------- ------------------------- ----------------------------------------
+  130       BARCODE_EANX_CC           GS1 Composite Symbol with EAN linear
+                                      component
+
+  131       BARCODE_GS1_128_CC        GS1 Composite Symbol with GS1-128 linear
+                                      component
+
+  132       BARCODE_DBAR_OMN_CC       GS1 Composite Symbol with GS1 DataBar
+                                      Omnidirectional linear component
+
+  133       BARCODE_DBAR_LTD_CC       GS1 Composite Symbol with GS1 DataBar
+                                      Limited linear component
+
+  134       BARCODE_DBAR_EXP_CC       GS1 Composite Symbol with GS1 DataBar
+                                      Expanded linear component
+
+  135       BARCODE_UPCA_CC           GS1 Composite Symbol with UPC-A linear
+                                      component
+
+  136       BARCODE_UPCE_CC           GS1 Composite Symbol with UPC-E linear
+                                      component
+
+  137       BARCODE_DBAR_STK_CC       GS1 Composite Symbol with GS1 DataBar
+                                      Stacked component
+
+  138       BARCODE_DBAR_OMNSTK_CC    GS1 Composite Symbol with GS1 DataBar
+                                      Stacked Omnidirectional component
+
+  139       BARCODE_DBAR_EXPSTK_CC    GS1 Composite Symbol with GS1 DataBar
+                                      Expanded Stacked component
+  ----------------------------------------------------------------------------
+
+  Table : GS1 Composite Symbology Values
+
+The data to be encoded in the linear component of a composite symbol should be
+entered into a primary string with the data for the 2D component being entered
+in the normal way. To do this at the command prompt use the --primary switch
+(API primary). For example:
+
+    zint -b EANX_CC --mode=1 --primary=331234567890 -d "[99]1234-abcd"
+
+This creates an EAN-13 linear component with the data "331234567890" and a 2D
+CC-A (see below) component with the data "(99)1234-abcd". The same results can
+be achieved using the API as shown below:
+
+    my_symbol->symbology = BARCODE_EANX_CC;
+
+    my_symbol->option_1 = 1;
+
+    strcpy(my_symbol->primary, "331234567890");
+
+    ZBarcode_Encode_and_Print(my_symbol, "[99]1234-abcd", 0, 0);
+
+EAN-2 and EAN-5 add-on data can be used with EAN and UPC symbols using the +
+symbol as described in sections 6.1.3 UPC (Universal Product Code) (ISO 15420)
+and 6.1.4 EAN (European Article Number) (ISO 15420).
+
+The 2D component of a composite symbol can use one of three systems: CC-A, CC-B
+and CC-C, as described below. The 2D component type can be selected
+automatically by Zint dependent on the length of the input string. Alternatively
+the three methods can be accessed using the --mode prompt (API option_1)
+followed by 1, 2 or 3 for CC-A, CC-B or CC-C respectively.
+
+6.3.1 CC-A
+
+[zint -b EANX_CC --compliantheight -d "[99]1234-abcd" --mode=1 --primary=3312345
+67890]
+
+This system uses a variation of MicroPDF417 which is optimised to fit into a
+small space. The size of the 2D component and the amount of error correction is
+determined by the amount of data to be encoded and the type of linear component
+which is being used. CC-A can encode up to 56 numeric digits or an alphanumeric
+string of shorter length. To select CC-A use --mode=1 (API option_1 = 1).
+
+6.3.2 CC-B
+
+[zint -b EANX_CC --compliantheight -d "[99]1234-abcd" --mode=2 --primary=3312345
+67890]
+
+This system uses MicroPDF417 to encode the 2D component. The size of the 2D
+component and the amount of error correction is determined by the amount of data
+to be encoded and the type of linear component which is being used. CC-B can
+encode up to 338 numeric digits or an alphanumeric string of shorter length. To
+select CC-B use --mode=2 (API option_1 = 2).
+
+6.3.3 CC-C
+
+[zint -b GS1_128_CC --compliantheight -d "[99]1234-abcd" --mode=3 --primary="[01
+]03312345678903"]
+
+This system uses PDF417 and can only be used in conjunction with a GS1-128
+linear component. CC-C can encode up to 2361 numeric digits or an alphanumeric
+string of shorter length. To select CC-C use --mode=3 (API option_1 = 3).
+
+6.4 Two-Track Symbols
+
+6.4.1 Two-Track Pharmacode
+
+[zint -b PHARMA_TWO --compliantheight -d "29876543"]
+
+Developed by Laetus, Pharmacode Two-Track is an alternative system to Pharmacode
+One-Track (see 6.1.9 Pharmacode) used for the identification of pharmaceuticals.
+The symbology is able to encode whole numbers between 4 and 64570080.
+
+6.4.2 POSTNET
+
+[zint -b POSTNET --compliantheight -d "12345678901"]
+
+Used by the United States Postal Service until 2009, the POSTNET barcode was
+used for encoding zip-codes on mail items. POSTNET uses numerical input data and
+includes a modulo-10 check digit. While Zint will encode POSTNET symbols of up
+to 38 digits in length, standard lengths as used by USPS were PostNet6 (5-digit
+ZIP input), PostNet10 (5-digit ZIP + 4-digit user data) and PostNet12 (5-digit
+ZIP + 6-digit user data), and a warning will be issued if the input length is
+not one of these.
+
+6.4.3 PLANET
+
+[zint -b PLANET --compliantheight -d "4012345235636"]
+
+Used by the United States Postal Service until 2009, the PLANET (Postal Alpha
+Numeric Encoding Technique) barcode was used for encoding routing data on mail
+items. PLANET uses numerical input data and includes a modulo-10 check digit.
+While Zint will encode PLANET symbols of up to 38 digits in length, standard
+lengths used by USPS were Planet12 (11-digit input) and Planet14 (13-digit
+input), and as with POSTNET a warning will be issued if the length is not one of
+these.
+
+6.4.4 Brazilian CEPNet
+
+[zint -b CEPNET --compliantheight -d "12345678"]
+
+Based on POSTNET, the CEPNet symbol is used by Correios, the Brazilian postal
+service, to encode CEP (Código de Endereçamento Postal) numbers on mail items.
+Input should consist of eight digits with the check digit being automatically
+added by Zint.
+
+6.4.5 DX Film Edge Barcode
+
+[zint -b DXFILMEDGE --compliantheight -d "112-1/10A"]
+
+Introduced by Kodak in the 1980s, the DX (Digital Index) barcode is printed on
+the bottom edge of 35mm film to aid in the reordering and post-processing of
+prints.
+
+The data can be in two parts. The first part (required) is the “DX number”,
+identifying the manufacturer and film type - the National Association of
+Photographic Manufacturers (NAPM) number. The second part, which is optional and
+if present is separated from the first by a slash (/), gives the frame number.
+
+The DX number is in either of two formats. The first format is a number of 1 to
+4 digits (“DX Extract”) or 6 digits (“DX Full”), but for the 6-digit version the
+first and last digit are ignored, leaving a 4-digit DX Extract number in any
+case, which must be in the range 16 to 2047. The second format “NNN-NN”
+represents the DX Extract as two numbers separated by a dash (-), the first
+number being 1 to 3 digits (range 1 to 127) and the second 1 to 2 digits (range
+0 to 15).[15]
+
+The optional frame number is a number in the range 0 to 63, and may have a half
+frame indicator “A” appended. Special character sequences (with or without a
+half frame indicator appended) may also be used: “S” or “X” means frame number
+62, “K” or “00” means frame number 63, and “F” means frame number 0.
+
+A parity bit is automatically added by Zint.
+
+6.5 4-State Postal Codes
+
+6.5.1 Australia Post 4-State Symbols
+
+6.5.1.1 Customer Barcodes
+
+[zint -b AUSPOST --compliantheight -d "96184209"]
+
+Australia Post Standard Customer Barcode, Customer Barcode 2 and Customer
+Barcode 3 are 37-bar, 52-bar and 67-bar specifications respectively, developed
+by Australia Post for printing Delivery Point ID (DPID) and customer information
+on mail items. Valid data characters are 0-9, A-Z, a-z, space and hash (#). A
+Format Control Code (FCC) is added by Zint and should not be included in the
+input data. Reed-Solomon error correction data is generated by Zint. Encoding
+behaviour is determined by the length of the input data according to the formula
+shown in the following table.
+
+  ---------------------------------------------------------------
+  Input     Required Input Format       Symbol   FCC   Encoding
+  Length                                Length         Table
+  --------- --------------------------- -------- ----- ----------
+  8         99999999                    37-bar   11    None
+
+  13        99999999AAAAA               52-bar   59    C
+
+  16        9999999999999999            52-bar   59    N
+
+  18        99999999AAAAAAAAAA          67-bar   62    C
+
+  23        99999999999999999999999     67-bar   62    N
+  ---------------------------------------------------------------
+
+  Table : Australia Post Input Formats
+
+6.5.1.2 Reply Paid Barcode
+
+[zint -b AUSREPLY --compliantheight -d "12345678"]
+
+A Reply Paid version of the Australia Post 4-State Barcode (FCC 45) which
+requires an 8-digit DPID input.
+
+6.5.1.3 Routing Barcode
+
+[zint -b AUSROUTE --compliantheight -d "34567890"]
+
+A Routing version of the Australia Post 4-State Barcode (FCC 87) which requires
+an 8-digit DPID input.
+
+6.5.1.4 Redirect Barcode
+
+[zint -b AUSREDIRECT --compliantheight -d "98765432"]
+
+A Redirection version of the Australia Post 4-State Barcode (FCC 92) which
+requires an 8-digit DPID input.
+
+6.5.2 Dutch Post KIX Code
+
+[zint -b KIX --compliantheight -d "2500GG30250"]
+
+This symbology is used by Royal Dutch TPG Post (Netherlands) for Postal code and
+automatic mail sorting. Data input can consist of numbers 0-9 and letters A-Z
+and needs to be 11 characters in length. No check digit is included.
+
+6.5.3 Royal Mail 4-State Customer Code (RM4SCC)
+
+[zint -b RM4SCC --compliantheight -d "W1J0TR01"]
+
+The RM4SCC standard is used by the Royal Mail in the UK to encode postcode and
+customer data on mail items. Data input can consist of numbers 0-9 and letters
+A-Z and usually includes delivery postcode followed by house number. For example
+"W1J0TR01" for 1 Piccadilly Circus in London. Check digit data is generated by
+Zint.
+
+6.5.4 Royal Mail 4-State Mailmark
+
+[zint -b MAILMARK_4S --compliantheight -d "1100000000000XY11"]
+
+Developed in 2014 as a replacement for RM4SCC this 4-state symbol includes Reed-
+Solomon error correction. Input is a pre-formatted alphanumeric string of 22
+(for Barcode C) or 26 (for Barcode L) characters, producing a symbol with 66 or
+78 bars respectively. The rules for the input data are complex, as summarized in
+the following table.
+
+  ----------------------------------------------------------------------------
+  Format   Version   Class        Supply Chain ID  Item ID   Destination+DPS
+           ID
+  -------- --------- ------------ ---------------- --------- -----------------
+  1 digit  1 digit   1 alphanum.  2 digits (C) or  8 digits  9 alphanumerics
+  (0-4)    (0-3)     (0-9A-E)     6 digits (L)               (1 of 6 patterns)
+
+  ----------------------------------------------------------------------------
+
+  Table : Royal Mail 4-State Mailmark Input Fields
+
+
+The 6 Destination+DPS (Destination Post Code plus Delivery Point Suffix)
+patterns are:
+
+  ----------- ----------- -----------
+  FNFNLLNLS   FFNNLLNLS   FFNNNLLNL
+  FFNFNLLNL   FNNLLNLSS   FNNNLLNLS
+  ----------- ----------- -----------
+
+  Table : Royal Mail Mailmark Destination+DPS Patterns
+
+
+where 'F' stands for full alphabetic (A-Z), 'L' for limited alphabetic (A-Z less
+'CIKMOV'), 'N' for numeric (0-9), and 'S' for space.
+
+Four of the permitted patterns include a number of trailing space characters -
+these will be appended by Zint if not included in the input data.
+
+For the two-dimensional Data Matrix-based version, see 6.6.2 Royal Mail 2D
+Mailmark (CMDM) (Data Matrix).
+
+6.5.5 USPS Intelligent Mail
+
+[zint -b USPS_IMAIL --compliantheight -d "01234567094987654321-01234"]
+
+Also known as the OneCode barcode and used in the U.S. by the United States
+Postal Service (USPS), the Intelligent Mail system replaced the POSTNET and
+PLANET symbologies in 2009. Intelligent Mail is a fixed length (65-bar) symbol
+which combines routing and customer information in a single symbol. Input data
+consists of a 20-digit tracking code, followed by a dash (-), followed by a
+delivery point zip-code which can be 0, 5, 9 or 11 digits in length. For example
+all of the following inputs are valid data entries:
+
+-   "01234567094987654321"
+-   "01234567094987654321-01234"
+-   "01234567094987654321-012345678"
+-   "01234567094987654321-01234567891"
+
+6.5.6 Japanese Postal Code
+
+[zint -b JAPANPOST --compliantheight -d "15400233-16-4-205"]
+
+Used for address data on mail items for Japan Post. Accepted values are 0-9, A-Z
+and dash (-). A modulo 19 check digit is added by Zint.
+
+6.5.7 DAFT Code
+
+[zint -b DAFT -d "AAFDTTDAFADTFTTFFFDATFTADTTFFTDAFAFDTF" --height=8.494 --vers=
+256]
+
+This is a method for creating 4-state codes where the data encoding is provided
+by an external program. Input data should consist of the letters 'D', 'A', 'F'
+and 'T' where these refer to descender, ascender, full (ascender and descender)
+and tracker (neither ascender nor descender) respectively. All other characters
+are invalid. The ratio of the tracker size to full height can be given in
+thousandths (permille) using the --vers option (API option_2). The default value
+is 250 (25%).
+
+For example the following
+
+    zint -b DAFT -d AAFDTTDAFADTFTTFFFDATFTADTTFFTDAFAFDTF --height=8.494 --vers
+=256
+
+produces the same barcode (see 6.5.3 Royal Mail 4-State Customer Code (RM4SCC))
+as
+
+    zint -b RM4SCC --compliantheight -d "W1J0TR01"
+
+6.6 Matrix Symbols
+
+6.6.1 Data Matrix (ISO 16022)
+
+[zint -b HIBC_DM -d "/ACMRN123456/V200912190833" --fast --square]
+
+Also known as Semacode this symbology was developed in 1989 by Acuity CiMatrix
+in partnership with the U.S. DoD and NASA. The symbol can encode a large amount
+of data in a small area. Data Matrix encodes characters in the Latin-1 set by
+default but also supports encoding in other character sets using the ECI
+mechanism. It can also encode GS1 data. The size of the generated symbol can be
+adjusted using the --vers option (API option_2) as shown in the table below. A
+separate symbology ID (BARCODE_HIBC_DM) can be used to encode Health Industry
+Barcode (HIBC) data. Note that only ECC200 encoding is supported, the older
+standards have now been removed from Zint.
+
+  Input   Symbol Size      Input   Symbol Size      Input   Symbol Size
+  ------- ------------- -- ------- ------------- -- ------- -------------
+  1       10 x 10          11      36 x 36          21      104 x 104
+  2       12 x 12          12      40 x 40          22      120 x 120
+  3       14 x 14          13      44 x 44          23      132 x 132
+  4       16 x 16          14      48 x 48          24      144 x 144
+  5       18 x 18          15      52 x 52          25      8 x 18
+  6       20 x 20          16      64 x 64          26      8 x 32
+  7       22 x 22          17      72 x 72          28      12 x 26
+  8       24 x 24          18      80 x 80          28      12 x 36
+  9       26 x 26          19      88 x 88          29      16 x 36
+  10      32 x 32          20      96 x 96          30      16 x 48
+
+  Table : Data Matrix Sizes
+
+The largest version 24 (144 x 144) can encode 3116 digits, around 2335
+alphanumeric characters, or 1555 bytes of data.
+
+When using automatic symbol sizes you can force Zint to use square symbols
+(versions 1-24) at the command line by using the option --square (API
+option_3 = DM_SQUARE).
+
+Data Matrix Rectangular Extension (ISO/IEC 21471) codes may be generated with
+the following values as before:
+
+  Input   Symbol Size      Input   Symbol Size
+  ------- ------------- -- ------- -------------
+  31      8 x 48           40      20 x 36
+  32      8 x 64           41      20 x 44
+  33      8 x 80           42      20 x 64
+  34      8 x 96           43      22 x 48
+  35      8 x 120          44      24 x 48
+  36      8 x 144          45      24 x 64
+  37      12 x 64          46      26 x 40
+  38      12 x 88          47      26 x 48
+  39      16 x 64          48      26 x 64
+
+  Table : DMRE Sizes
+
+DMRE symbol sizes may be activated in automatic size mode using the option
+--dmre (API option_3 = DM_DMRE).
+
+GS1 data may be encoded using FNC1 (default) or GS (Group Separator, ASCII 29)
+as separator. Use the option --gssep to change to GS (API
+output_options |= GS1_GS_SEPARATOR).
+
+By default Zint uses a “de facto” codeword placement for symbols of size 144 x
+144 (version 24). To override this and use the now clarified ISO/IEC standard
+placement, use option --dmiso144 (API option_3 |= DM_ISO_144).
+
+For a faster but less optimal encoding, the --fast option (API
+input_mode |= FAST_MODE) may be used.
+
+Data Matrix supports Structured Append of up to 16 symbols and a numeric ID
+(file identifications), which can be set by using the --structapp option (see
+4.17 Structured Append) (API structapp). The ID consists of 2 numbers ID1 and
+ID2, each of which can range from 1 to 254, and is specified as the single
+number ID1 * 1000 + ID2, so for instance ID1 "123" and ID2 "234" would be given
+as "123234". Note that both ID1 and ID2 must be non-zero, so e.g. "123000" or
+"000123" would be invalid IDs. If an ID is not given it defaults to "001001".
+
+6.6.2 Royal Mail 2D Mailmark (CMDM) (Data Matrix)
+
+[zint -b MAILMARK_2D -d "JGB 01Z999999900000001EC1A1AA1A0SN35TQ" --vers=30]
+
+This variant of Data Matrix, also known as “Complex Mail Data Mark” (CMDM), was
+introduced by Royal Mail along with 6.5.4 Royal Mail 4-State Mailmark, and
+offers space for customer data following an initial pre-formatted 45 character
+section, as summarized below.
+
+  Field Name         Length        Values
+  ------------------ ------------- --------------------------------
+  UPU Country ID     4             "JGB "
+  Information Type   1             Alphanumeric
+  Version ID         1             "1"
+  Class              1             Alphanumeric
+  Supply Chain ID    7             Numeric
+  Item ID            8             Numeric
+  Destination+DPS    9             Alphanumeric (1 of 6 patterns)
+  Service Type       1             Numeric
+  RTS Post Code      7             Alphanumeric (1 of 6 patterns)
+  Reserved           6             Spaces
+  Customer Data      6, 45 or 29   Anything (Latin-1)
+
+  Table : Royal Mail 2D Mailmark Input Fields
+
+The 6 Destination+DPS (Destination Post Code plus Delivery Point Suffix)
+patterns are the same as for the 4-state - see Table
+: Royal Mail Mailmark Destination+DPS Patterns. The 6 RTS (Return to Sender)
+Post Code patterns are the same also except without the additional DPS 'NL',
+i.e.
+
+  --------- --------- ---------
+  FNFNLLS   FFNNLLS   FFNNNLL
+  FFNFNLL   FNNLLSS   FNNNLLS
+  --------- --------- ---------
+
+  Table : Royal Mail 2D Mailmark RTS Patterns
+
+where 'F' is full alphabetic (A-Z), 'L' limited alphabetic (A-Z less 'CIKMOV'),
+'N' numeric (0-9), and 'S' space.
+
+Three sizes are defined, one rectangular, with varying maximum amounts of
+optional customer data:
+
+  Name      Size      Customer Data   Zint Version
+  --------- --------- --------------- --------------
+  Type 7    24 x 24   6 characters    8
+  Type 9    32 x 32   45 characters   10
+  Type 29   16 x 48   29 characters   30
+
+  Table : Royal Mail 2D Mailmark Sizes
+
+Zint will automatically select a size based on the amount of customer data, or
+it can be specified using the --vers option (API option_2), which takes the Zint
+version number (one more than the Royal Mail Type number). Zint will prefix the
+input data with "JGB " if it’s missing, and also space-pad the input if the
+customer data is absent or falls short. As with Data Matrix, the rectangular
+symbol Type 29 can be excluded from automatic size selection by using the option
+--square (API option_3 = DM_SQUARE).
+
+GS1 data, the ECI mechanism, and Structured Append are not supported.
+
+6.6.3 QR Code (ISO 18004)
+
+[zint -b QRCODE -d "QR Code Symbol" --mask=5]
+
+Also known as Quick Response Code this symbology was developed by Denso. Four
+levels of error correction are available using the --secure option (API
+option_1) as shown in the following table.
+
+  Input   ECC Level   Error Correction Capacity   Recovery Capacity
+  ------- ----------- --------------------------- -------------------
+  1       L           Approx 20% of symbol        Approx 7%
+  2       M           Approx 37% of symbol        Approx 15%
+  3       Q           Approx 55% of symbol        Approx 25%
+  4       H           Approx 65% of symbol        Approx 30%
+
+  Table : QR Code ECC Levels
+
+The size of the symbol can be specified by setting the --vers option (API
+option_2) to the QR Code version required (1-40). The size of symbol generated
+is shown in the table below.
+
+  Input   Symbol Size      Input   Symbol Size      Input   Symbol Size
+  ------- ------------- -- ------- ------------- -- ------- -------------
+  1       21 x 21          15      77 x 77          29      133 x 133
+  2       25 x 25          16      81 x 81          30      137 x 137
+  3       29 x 29          17      85 x 85          31      141 x 141
+  4       33 x 33          18      89 x 89          32      145 x 145
+  5       37 x 37          19      93 x 93          33      149 x 149
+  6       41 x 41          20      97 x 97          34      153 x 153
+  7       45 x 45          21      101 x 101        35      157 x 157
+  8       49 x 49          22      105 x 105        36      161 x 161
+  9       53 x 53          23      109 x 109        37      165 x 165
+  10      57 x 57          24      113 x 113        38      169 x 169
+  11      61 x 61          25      117 x 117        39      173 x 173
+  12      65 x 65          26      121 x 121        40      177 x 177
+  13      69 x 69          27      125 x 125
+  14      73 x 73          28      129 x 129
+
+  Table : QR Code Sizes
+
+The maximum capacity of a QR Code symbol (version 40) is 7089 numeric digits,
+4296 alphanumeric characters or 2953 bytes of data. QR Code symbols can also be
+used to encode GS1 data. QR Code symbols can by default encode either characters
+in the Latin-1 set or Kanji, Katakana and ASCII characters which are members of
+the Shift JIS encoding scheme. In addition QR Code supports other character sets
+using the ECI mechanism. Input should usually be entered as UTF-8 with
+conversion to Latin-1 or Shift JIS being carried out by Zint. A separate
+symbology ID (BARCODE_HIBC_QR) can be used to encode Health Industry Barcode
+(HIBC) data.
+
+Non-ASCII data density may be maximized by using the --fullmultibyte switch (API
+option_3 = ZINT_FULL_MULTIBYTE), but check that your barcode reader supports
+this before using.
+
+QR Code has eight different masks designed to minimize unwanted patterns. The
+best mask to use is selected automatically by Zint but may be manually specified
+by using the --mask switch with values 0-7, or in the API by setting
+option_3 = (N + 1) << 8 where N is 0-7. To use with ZINT_FULL_MULTIBYTE set
+
+    option_3 = ZINT_FULL_MULTIBYTE | (N + 1) << 8
+
+The --fast option (API input_mode |= FAST_MODE) may be used when leaving Zint to
+automatically select a mask to reduce the number of masks to try to four (0, 2,
+4, 7).
+
+QR Code supports Structured Append of up to 16 symbols and a numeric ID
+(parity), which can be set by using the --structapp option (see 4.17 Structured
+Append) (API structapp). The parity ID ranges from 0 (default) to 255, and for
+full compliance should be set to the value obtained by XOR-ing together each
+byte of the complete data forming the sequence. Currently this calculation must
+be done outside of Zint.
+
+6.6.4 Micro QR Code (ISO 18004)
+
+[zint -b MICROQR -d "01234567"]
+
+A miniature version of the QR Code symbol for short messages, Micro QR Code
+symbols can encode either Latin-1 characters or Shift JIS characters. Input
+should be entered as a UTF-8 stream with conversion to Latin-1 or Shift JIS
+being carried out automatically by Zint. A preferred symbol size can be selected
+by using the --vers option (API option_2), as shown in the table below. Note
+that versions M1 and M2 have restrictions on what characters can be encoded.
+
+  ------------------------------------------------------------------
+  Input   Version   Symbol Size   Allowed Characters
+  ------- --------- ------------- ----------------------------------
+  1       M1        11 x 11       Numeric only
+
+  2       M2        13 x 13       Numeric, uppercase letters, space,
+                                  and the characters "$%*+-./:"
+
+  3       M3        15 x 15       Latin-1 and Shift JIS
+
+  4       M4        17 x 17       Latin-1 and Shift JIS
+  ------------------------------------------------------------------
+
+  Table : Micro QR Code Sizes
+
+Version M4 can encode up to 35 digits, 21 alphanumerics, 15 bytes or 9 Kanji
+characters.
+
+Except for version M1, which is always ECC level L, the amount of ECC codewords
+can be adjusted using the --secure option (API option_1); however ECC level H is
+not available for any version, and ECC level Q is only available for version M4:
+
+  ----------------------------------------------------------------------
+  Input    ECC      Error Correction        Recovery      Available for
+           Level    Capacity                Capacity      Versions
+  -------- -------- ----------------------- ------------- --------------
+  1        L        Approx 20% of symbol    Approx 7%     M1, M2, M3, M4
+
+  2        M        Approx 37% of symbol    Approx 15%    M2, M3, M4
+
+  3        Q        Approx 55% of symbol    Approx 25%    M4
+  ----------------------------------------------------------------------
+
+  Table : Micro QR ECC Levels
+
+The defaults for symbol size and ECC level depend on the input and whether
+either of them is specified.
+
+For barcode readers that support it, non-ASCII data density may be maximized by
+using the --fullmultibyte switch (API option_3 = ZINT_FULL_MULTIBYTE).
+
+Micro QR Code has four different masks designed to minimize unwanted patterns.
+The best mask to use is selected automatically by Zint but may be manually
+specified by using the --mask switch with values 0-3, or in the API by setting
+option_3 = (N + 1) << 8 where N is 0-3. To use with ZINT_FULL_MULTIBYTE set
+
+    option_3 = ZINT_FULL_MULTIBYTE | (N + 1) << 8
+
+6.6.5 Rectangular Micro QR Code (rMQR) (ISO 23941)
+
+[zint -b RMQR -d "0123456"]
+
+A rectangular version of QR Code, rMQR supports encoding of GS1 data, and either
+Latin-1 characters or Shift JIS characters, and other encodings using the ECI
+mechanism. As with other symbologies data should be entered as UTF-8 with
+conversion being handled by Zint. The amount of ECC codewords can be adjusted
+using the --secure option (API option_1), however only ECC levels M and H are
+valid for this type of symbol.
+
+  Input   ECC Level   Error Correction Capacity   Recovery Capacity
+  ------- ----------- --------------------------- -------------------
+  2       M           Approx 37% of symbol        Approx 15%
+  4       H           Approx 65% of symbol        Approx 30%
+
+  Table : rMQR ECC Levels
+
+The preferred symbol sizes can be selected using the --vers option (API
+option_2) as shown in the table below. Input values between 33 and 38 fix the
+height of the symbol while allowing Zint to determine the minimum symbol width.
+
+  ------------------------------------------------------------------------------
+  Input   Version   Symbol Size (HxW)     Input   Version   Symbol Size (HxW)
+  ------- --------- ------------------ -- ------- --------- --------------------
+  1       R7x43     7 x 43                20      R13x77    13 x 77
+
+  2       R7x59     7 x 59                21      R13x99    13 x 99
+
+  3       R7x77     7 x 77                22      R13x139   13 x 139
+
+  4       R7x99     7 x 99                23      R15x43    15 x 43
+
+  5       R7x139    7 x 139               24      R15x59    15 x 59
+
+  6       R9x43     9 x 43                25      R15x77    15 x 77
+
+  7       R9x59     9 x 59                26      R15x99    15 x 99
+
+  8       R9x77     9 x 77                27      R15x139   15 x 139
+
+  9       R9x99     9 x 99                28      R17x43    17 x 43
+
+  10      R9x139    9 x 139               29      R17x59    17 x 59
+
+  11      R11x27    11 x 27               30      R17x77    17 x 77
+
+  12      R11x43    11 x 43               31      R17x99    17 x 99
+
+  13      R11x59    11 x 59               32      R17x139   17 x 139
+
+  14      R11x77    11 x 77               33      R7xW      7 x automatic width
+
+  15      R11x99    11 x 99               34      R9xW      9 x automatic width
+
+  16      R11x139   11 x 139              35      R11xW     11 x automatic width
+
+  17      R13x27    13 x 27               36      R13xW     13 x automatic width
+
+  18      R13x43    13 x 43               37      R15xW     15 x automatic width
+
+  19      R13x59    13 x 59               38      R17xW     17 x automatic width
+  ------------------------------------------------------------------------------
+
+  Table : rMQR Sizes
+
+The largest version R17x139 (32) can encode up to 361 digits, 219 alphanumerics,
+150 bytes, or 92 Kanji characters.
+
+For barcode readers that support it, non-ASCII data density may be maximized by
+using the --fullmultibyte switch or in the API by setting
+option_3 = ZINT_FULL_MULTIBYTE.
+
+6.6.6 UPNQR (Univerzalnega Plačilnega Naloga QR)
+
+[zint -b UPNQR -i upn_utf8.txt --quietzones]
+
+A variation of QR Code used by Združenje Bank Slovenije (Bank Association of
+Slovenia). The size, error correction level and ECI are set by Zint and do not
+need to be specified. UPNQR is unusual in that it uses Latin-2 (ISO/IEC 8859-2
+plus ASCII) formatted data. Zint will accept UTF-8 data and convert it to
+Latin-2, or if your data is already Latin-2 formatted use the --binary switch
+(API input_mode = DATA_MODE).
+
+The following example creates a symbol from data saved as a Latin-2 file:
+
+    zint -o upnqr.png -b 143 --scale=3 --binary -i upn.txt
+
+A mask may be manually specified or the --fast option used as with QRCODE.
+
+6.6.7 MaxiCode (ISO 16023)
+
+[zint -b MAXICODE -d "1Z00004951\GUPSN\G06X610\G159\G1234567\G1/1\G\GY\G1 MAIN S
+T\GNY\GNY\R\E" --esc --primary="152382802000000" --scmvv=96]
+
+Developed by UPS the MaxiCode symbology employs a grid of hexagons surrounding a
+bullseye finder pattern. This symbology is designed for the identification of
+parcels. MaxiCode symbols can be encoded in one of five modes. In modes 2 and 3
+MaxiCode symbols are composed of two parts named the primary and secondary
+messages. The primary message consists of a Structured Carrier Message which
+includes various data about the package being sent and the secondary message
+usually consists of address data in a data structure. The format of the primary
+message required by Zint is given in the following table.
+
+  Characters   Meaning
+  ------------ -----------------------------------------------------------------
+  1 - 9        Postcode data which can consist of up to 9 digits (for mode 2)
+               or up to 6 alphanumeric characters (for mode 3). Remaining
+               unused characters for mode 3 can be filled with the SPACE
+               character (ASCII 32) or omitted.
+               (adjust the following character positions according to postcode
+               length)
+  10 - 12      Three-digit country code according to ISO 3166-1.
+  13 - 15      Three-digit service code. This depends on your parcel courier.
+
+  Table : MaxiCode Structured Carrier Message Format
+
+The primary message can be set at the command prompt using the --primary switch
+(API primary). The secondary message uses the normal data entry method. For
+example:
+
+    zint -o test.eps -b 57 --primary="999999999840012" \
+        -d "Secondary Message Here"
+
+When using the API the primary message must be placed in the primary string. The
+secondary is entered in the same way as described in 5.2 Encoding and Saving to
+File. When either of these modes is selected Zint will analyse the primary
+message and select either mode 2 or mode 3 as appropriate.
+
+As a convenience the secondary message for modes 2 and 3 can be set to be
+prefixed by the ISO/IEC 15434 Format "01" (transportation) sequence
+"[)>\R01\Gvv", where vv is a 2-digit version, by using the --scmvv switch (API
+option_2 = vv + 1). For example to use the common version "96" (ASC MH10/SC 8):
+
+    zint -b 57 --primary="152382802840001" --scmvv=96 --esc -d \
+      "1Z00004951\GUPSN\G06X610\G159\G1234567\G1/1\G\GY\G1 MAIN ST\GNY\GNY\R\E"
+
+will prefix "[)>\R01\G96" to the secondary message. (\R, \G and \E are the
+escape sequences for Record Separator, Group Separator and End of Transmission
+respectively - see Table : Escape Sequences.)
+
+Modes 4 to 6 can be accessed using the --mode switch (API option_1). Modes 4 to
+6 do not have a primary message. For example:
+
+    zint -o test.eps -b 57 --mode=4 -d "A MaxiCode Message in Mode 4"
+
+Mode 6 is reserved for the maintenance of scanner hardware and should not be
+used to encode user data.
+
+This symbology uses Latin-1 character encoding by default but also supports the
+ECI encoding mechanism. The maximum length of text which can be placed in a
+MaxiCode symbol depends on the type of characters used in the text.
+
+Example maximum data lengths are given in the table below:
+
+  ------------------------------------------------------------------------
+  Mode   Maximum Data Length   Maximum Data Length   Number of Error
+         for Capital Letters   for Numeric Digits    Correction Codewords
+  ------ --------------------- --------------------- ---------------------
+  2*     84                    126                   50
+
+  3*     84                    126                   50
+
+  4      93                    138                   50
+
+  5      77                    113                   66
+
+  6      93                    138                   50
+  ------------------------------------------------------------------------
+
+  Table : MaxiCode Data Length Maxima
+
+* - secondary only
+
+MaxiCode supports Structured Append of up to 8 symbols, which can be set by
+using the --structapp option (see 4.17 Structured Append) (API structapp). It
+does not support specifying an ID.
+
+MaxiCode uses a different scaling than other symbols for raster output, see
+4.9.3 MaxiCode Raster Scaling, and also for EMF vector output, when the scale is
+multiplied by 20 instead of 2.
+
+6.6.8 Aztec Code (ISO 24778)
+
+[zint -b AZTEC -d "123456789012"]
+
+Invented by Andrew Longacre at Welch Allyn Inc in 1995 the Aztec Code symbol is
+a matrix symbol with a distinctive bullseye finder pattern. Zint can generate
+Compact Aztec Code (sometimes called Small Aztec Code) as well as ‘full-range’
+Aztec Code symbols and by default will automatically select symbol type and size
+dependent on the length of the data to be encoded. Error correction codewords
+will normally be generated to fill at least 23% of the symbol. Two options are
+available to change this behaviour:
+
+The size of the symbol can be specified using the --vers option (API option_2)
+to a value between 1 and 36 according to the following table. The symbols marked
+with an asterisk (*) in the table below are ‘compact’ symbols, meaning they have
+a smaller bullseye pattern at the centre of the symbol.
+
+  Input   Symbol Size      Input   Symbol Size      Input   Symbol Size
+  ------- ------------- -- ------- ------------- -- ------- -------------
+  1       15 x 15*         13      53 x 53          25      105 x 105
+  2       19 x 19*         14      57 x 57          26      109 x 109
+  3       23 x 23*         15      61 x 61          27      113 x 113
+  4       27 x 27*         16      67 x 67          28      117 x 117
+  5       19 x 19          17      71 x 71          29      121 x 121
+  6       23 x 23          18      75 x 75          30      125 x 125
+  7       27 x 27          19      79 x 79          31      131 x 131
+  8       31 x 31          20      83 x 83          32      135 x 135
+  9       37 x 37          21      87 x 87          33      139 x 139
+  10      41 x 41          22      91 x 91          34      143 x 143
+  11      45 x 45          23      95 x 95          35      147 x 147
+  12      49 x 49          24      101 x 101        36      151 x 151
+
+  Table : Aztec Code Sizes
+
+Note that in symbols which have a specified size the amount of error correction
+is dependent on the length of the data input and Zint will allow error
+correction capacities as low as 3 codewords.
+
+Alternatively the amount of error correction data can be specified by setting
+the --secure option (API option_1) to a value from the following table.
+
+  Mode   Error Correction Capacity
+  ------ ---------------------------
+  1      >10% + 3 codewords
+  2      >23% + 3 codewords
+  3      >36% + 3 codewords
+  4      >50% + 3 codewords
+
+  Table : Aztec Code Error Correction Modes
+
+It is not possible to select both symbol size and error correction capacity for
+the same symbol. If both options are selected then the error correction capacity
+selection will be ignored.
+
+Aztec Code supports ECI encoding and can encode up to a maximum length of
+approximately 3823 numeric or 3067 alphabetic characters or 1914 bytes of data.
+A separate symbology ID (BARCODE_HIBC_AZTEC) can be used to encode Health
+Industry Barcode (HIBC) data.
+
+Aztec Code supports Structured Append of up to 26 symbols and an optional
+alphanumeric ID of up to 32 characters, which can be set by using the
+--structapp option (see 4.17 Structured Append) (API structapp). The ID cannot
+contain spaces. If an ID is not given, no ID is encoded.
+
+6.6.9 Aztec Runes (ISO 24778)
+
+[zint -b AZRUNE -d "125"]
+
+A truncated version of compact Aztec Code for encoding whole integers between 0
+and 255, as defined in ISO/IEC 24778 Annex A. Includes Reed-Solomon error
+correction. It does not support Structured Append.
+
+6.6.10 Code One
+
+[zint -b CODEONE -d "1234567890123456789012"]
+
+A matrix symbology developed by Ted Williams in 1992 which encodes data in a way
+similar to Data Matrix, Code One is able to encode the Latin-1 character set or
+GS1 data, and also supports the ECI mechanism. There are two types of Code One
+symbol - fixed-ratio symbols which are roughly square (versions A through to H)
+and variable-width versions (versions S and T). These can be selected by using
+--vers (API option_2) as shown in the table below:
+
+  --------------------------------------------------------------
+  Input   Version   Size (W x H) Numeric Data    Alphanumeric
+                                 Capacity        Data Capacity
+  ------- --------- ------------ --------------- ---------------
+  1       A         16 x 18      22              13
+
+  2       B         22 x 22      44              27
+
+  3       C         28 x 28      104             64
+
+  4       D         40 x 42      217             135
+
+  5       E         52 x 54      435             271
+
+  6       F         70 x 76      886             553
+
+  7       G         104 x 98     1755            1096
+
+  8       H         148 x 134    3550            2218
+
+  9       S         width x 8    18              N/A
+
+  10      T         width x 16   90              55
+  --------------------------------------------------------------
+
+  Table : Code One Sizes
+
+Version S symbols can only encode numeric data. The width of version S and
+version T symbols is determined by the length of the input data.
+
+Code One supports Structured Append of up to 128 symbols, which can be set by
+using the --structapp option (see 4.17 Structured Append) (API structapp). It
+does not support specifying an ID. Structured Append is not supported with GS1
+data nor for Version S symbols.
+
+6.6.11 Grid Matrix
+
+[zint -b GRIDMATRIX --eci=29 -d "AAT2556 电池充电器+降压转换器  200mA至2A tel:86 019 825127
+38"]
+
+Grid Matrix groups modules in a chequerboard pattern, and by default supports
+the GB 2312 standard set, which includes Hanzi, ASCII and a small number of
+ISO/IEC 8859-1 characters. Input should be entered as UTF-8 with conversion to
+GB 2312 being carried out automatically by Zint. Up to around 1529 alphanumeric
+characters or 2751 digits may be encoded. The symbology also supports the ECI
+mechanism. Support for GS1 data has not yet been implemented.
+
+The size of the symbol and the error correction capacity can be specified. If
+you specify both of these values then Zint will make a ‘best-fit’ attempt to
+satisfy both conditions. The symbol size can be specified using the --vers
+option (API option_2), and the error correction capacity can be specified by
+using the --secure option (API option_1), according to the following tables.
+
+  Input   Symbol Size      Input   Symbol Size
+  ------- ------------- -- ------- -------------
+  1       18 x 18          8       102 x 102
+  2       30 x 30          9       114 x 114
+  3       42 x 42          10      126 x 126
+  4       54 x 54          11      138 x 138
+  5       66 x 66          12      150 x 150
+  6       78 x 78          13      162 x 162
+  7       90 x 90
+
+  Table : Grid Matrix Sizes
+
+  Mode   Error Correction Capacity
+  ------ ---------------------------
+  1      Approximately 10%
+  2      Approximately 20%
+  3      Approximately 30%
+  4      Approximately 40%
+  5      Approximately 50%
+
+  Table : Grid Matrix Error Correction Modes
+
+Non-ASCII data density may be maximized by using the --fullmultibyte switch (API
+option_3 = ZINT_FULL_MULTIBYTE), but check that your barcode reader supports
+this before using.
+
+Grid Matrix supports Structured Append of up to 16 symbols and a numeric ID
+(file signature), which can be set by using the --structapp option (see 4.17
+Structured Append) (API structapp). The ID ranges from 0 (default) to 255.
+
+6.6.12 DotCode
+
+[zint -b DOTCODE -d "[01]00012345678905[17]201231[10]ABC123456" --gs1]
+
+DotCode uses a grid of dots in a rectangular formation to encode characters up
+to a maximum of approximately 450 characters (or 900 numeric digits). The
+symbology supports ECI encoding and GS1 data encoding. By default Zint will
+produce a symbol which is approximately square, however the width of the symbol
+can be adjusted by using the --cols option (API option_2) (maximum 200).
+Outputting DotCode to raster images (BMP, GIF, PCX, PNG, TIF) will require
+setting the scale of the image to a larger value than the default (e.g.
+approximately 10) for the dots to be plotted correctly. Approximately 33% of the
+resulting symbol is comprised of error correction codewords.
+
+DotCode has two sets of 4 masks, designated 0-3 and 0’-3’, the second "prime"
+set being the same as the first with corners lit. The best mask to use is
+selected automatically by Zint but may be manually specified by using the --mask
+switch with values 0-7, where 4-7 denote 0’-3’, or in the API by setting
+option_3 = (N + 1) << 8 where N is 0-7.
+
+DotCode supports Structured Append of up to 35 symbols, which can be set by
+using the --structapp option (see 4.17 Structured Append) (API structapp). It
+does not support specifying an ID.
+
+6.6.13 Han Xin Code (ISO 20830)
+
+[zint -b HANXIN -d "Hanxin Code symbol"]
+
+Also known as Chinese Sensible Code, Han Xin is capable of encoding characters
+in either the Latin-1 character set or the GB 18030 character set (which is a
+UTF, i.e. includes all Unicode characters, optimized for Chinese characters) and
+is also able to support the ECI mechanism. Support for the encoding of GS1 data
+has not yet been implemented.
+
+The size of the symbol can be specified using the --vers option (API option_2)
+to a value between 1 and 84 according to the following table.
+
+  Input   Symbol Size      Input   Symbol Size      Input   Symbol Size
+  ------- ------------- -- ------- ------------- -- ------- -------------
+  1       23 x 23          29      79 x 79          57      135 x 135
+  2       25 x 25          30      81 x 81          58      137 x 137
+  3       27 x 27          31      83 x 83          59      139 x 139
+  4       29 x 29          32      85 x 85          60      141 x 141
+  5       31 x 31          33      87 x 87          61      143 x 143
+  6       33 x 33          34      89 x 89          62      145 x 145
+  7       35 x 35          35      91 x 91          63      147 x 147
+  8       37 x 37          36      93 x 93          64      149 x 149
+  9       39 x 39          37      95 x 95          65      151 x 151
+  10      41 x 41          38      97 x 97          66      153 x 153
+  11      43 x 43          39      99 x 99          67      155 x 155
+  12      45 x 45          40      101 x 101        68      157 x 157
+  13      47 x 47          41      103 x 103        69      159 x 159
+  14      49 x 49          42      105 x 105        70      161 x 161
+  15      51 x 51          43      107 x 107        71      163 x 163
+  16      53 x 53          44      109 x 109        72      165 x 165
+  17      55 x 55          45      111 x 111        73      167 x 167
+  18      57 x 57          46      113 x 113        74      169 x 169
+  19      59 x 59          47      115 x 115        75      171 x 171
+  20      61 x 61          48      117 x 117        76      173 x 173
+  21      63 x 63          49      119 x 119        77      175 x 175
+  22      65 x 65          50      121 x 121        78      177 x 177
+  23      67 x 67          51      123 x 123        79      179 x 179
+  24      69 x 69          52      125 x 125        80      181 x 181
+  25      71 x 71          53      127 x 127        81      183 x 183
+  26      73 x 73          54      129 x 129        82      185 x 185
+  27      75 x 75          55      131 x 131        83      187 x 187
+  28      77 x 77          56      133 x 133        84      189 x 189
+
+  Table : Han Xin Sizes
+
+The largest version (84) can encode 7827 digits, 4350 ASCII characters, up to
+2175 Chinese characters, or 3261 bytes, making it the most capacious of all the
+barcodes supported by Zint.
+
+There are four levels of error correction capacity available for Han Xin Code
+which can be set by using the --secure option (API option_1) to a value from the
+following table.
+
+  Mode   Recovery Capacity
+  ------ -------------------
+  1      Approx 8%
+  2      Approx 15%
+  3      Approx 23%
+  4      Approx 30%
+
+  Table : Han Xin Error Correction Modes
+
+Non-ASCII data density may be maximized by using the --fullmultibyte switch (API
+option_3 = ZINT_FULL_MULTIBYTE), but check that your barcode reader supports
+this before using.
+
+Han Xin has four different masks designed to minimize unwanted patterns. The
+best mask to use is selected automatically by Zint but may be manually specified
+by using the --mask switch with values 0-3, or in the API by setting
+option_3 = (N + 1) << 8 where N is 0-3. To use with ZINT_FULL_MULTIBYTE set
+
+    option_3 = ZINT_FULL_MULTIBYTE | (N + 1) << 8
+
+6.6.14 Ultracode
+
+[zint -b ULTRA -d "HEIMASÍÐA KENNARAHÁSKÓLA ÍSLANDS"]
+
+This symbology uses a grid of coloured elements to encode data. ECI and GS1
+modes are supported. The amount of error correction can be set using the
+--secure option (API option_1) to a value as shown in the following table.
+
+  Value   EC Level   Amount of symbol holding error correction data
+  ------- ---------- ------------------------------------------------
+  1       EC0        0% - Error detection only
+  2       EC1        Approx 5%
+  3       EC2        Approx 9% - Default value
+  4       EC3        Approx 17%
+  5       EC4        Approx 25%
+  6       EC5        Approx 33%
+
+  Table : Ultracode Error Correction Values
+
+Zint does not currently implement data compression by default, but this can be
+initiated through the API by setting
+
+    symbol->option_3 = ULTRA_COMPRESSION;
+
+With compression, up to 504 digits, 375 alphanumerics or 252 bytes can be
+encoded.
+
+Revision 2 of Ultracode (2023) may be specified using --vers=2 (API
+option_2 = 2).
+
+--------------------------------------------------------------------------------
+
+WARNING: Revision 2 of Ultracode was only finalized December 2023 and Zint has
+not yet been updated to support it. Do not use.
+
+--------------------------------------------------------------------------------
+
+Ultracode supports Structured Append of up to 8 symbols and an optional numeric
+ID (File Number), which can be set by using the --structapp option (see 4.17
+Structured Append) (API structapp). The ID ranges from 1 to 80088. If an ID is
+not given, no ID is encoded.
+
+6.7 Other Barcode-Like Markings
+
+6.7.1 Facing Identification Mark (FIM)
+
+[zint -b FIM --compliantheight -d "C"]
+
+Used by the United States Postal Service (USPS), the FIM symbology is used to
+assist automated mail processing. There are only 5 valid symbols which can be
+generated using the characters A-E as shown in the table below.
+
+  Code Letter   Usage
+  ------------- ----------------------------------------------------------------
+  A             Used for courtesy reply mail and metered reply mail with a
+                pre-printed POSTNET symbol.
+  B             Used for business reply mail without a pre-printed zip code.
+  C             Used for business reply mail with a pre-printed zip code.
+  D             Used for Information Based Indicia (IBI) postage.
+  E             Used for customized mail with a USPS Intelligent Mail barcode.
+
+  Table : Valid FIM Characters
+
+6.7.2 Flattermarken
+
+[zint -b FLAT -d "1304056"]
+
+Used for the recognition of page sequences in print-shops, the Flattermarken is
+not a true barcode symbol and requires precise knowledge of the position of the
+mark on the page. The Flattermarken system can encode numeric data up to a
+maximum of 128 digits and does not include a check digit.
+
+7. Legal and Version Information
+
+7.1 License
+
+Zint, libzint and Zint Barcode Studio are Copyright © 2024 Robin Stuart. All
+historical versions are distributed under the GNU General Public License version
+3 or later. Versions 2.5 and later are released under a dual license: the
+encoding library is released under the BSD (3 clause) license whereas the GUI,
+Zint Barcode Studio, and the CLI are released under the GNU General Public
+License version 3 or later.
+
+Telepen is a trademark of SB Electronic Systems Ltd.
+
+QR Code is a registered trademark of Denso Wave Incorporated.
+
+Mailmark is a registered trademark of Royal Mail Group Ltd.
+
+Microsoft, Windows and the Windows logo are either registered trademarks or
+trademarks of Microsoft Corporation in the United States and/or other countries.
+
+Linux is the registered trademark of Linus Torvalds in the U.S. and other
+countries.
+
+Mac and macOS are trademarks of Apple Inc., registered in the U.S. and other
+countries.
+
+The Zint logo is derived from “SF Planetary Orbiter” font by ShyFoundary.
+
+Zint.org.uk website design and hosting provided by Robert Elliott.
+
+7.2 Patent Issues
+
+All of the code in Zint is developed using information in the public domain,
+usually freely available on the Internet. Some of the techniques used may be
+subject to patents and other intellectual property legislation. It is my belief
+that any patents involved in the technology underlying symbologies utilised by
+Zint are ‘unadopted’, that is the holder does not object to their methods being
+used.
+
+Any methods patented or owned by third parties or trademarks or registered
+trademarks used within Zint or in this document are and remain the property of
+their respective owners and do not indicate endorsement or affiliation with
+those owners, companies or organisations.
+
+7.3 Version Information
+
+The current stable version of Zint is 2.13.0, released on 18th December 2023.
+
+See "ChangeLog" in the project root directory for information on all releases.
+
+7.4 Sources of Information
+
+Below is a list of some of the sources used in rough chronological order:
+
+-   Nick Johnson’s Barcode Specifications
+-   Bar Code 1 Specification Source Page
+-   SB Electronic Systems Telepen website
+-   Pharmacode specifications from Laetus
+-   Morovia RM4SCC specification
+-   Australia Post’s ‘A Guide to Printing the 4-State Barcode’ and bcsample
+    source code
+-   Plessey algorithm from GNU-Barcode v0.98 by Leonid A. Broukhis
+-   GS1 General Specifications v 8.0 Issue 2
+-   PNG: The Definitive Guide and wpng source code by Greg Reolofs
+-   PDF417 specification and pdf417 source code by Grand Zebu
+-   Barcode Reference, TBarCode/X User Documentation and TBarCode/X
+    demonstration program from Tec-It
+-   IEC16022 source code by Stefan Schmidt et al
+-   United States Postal Service Specification USPS-B-3200
+-   Adobe Systems Incorporated Encapsulated PostScript File Format Specification
+-   BSI Online Library
+-   Libdmtx Data Matrix ECC200 decoding library
+
+7.5 Standards Compliance
+
+Zint was developed to provide compliance with the following British and
+international standards:
+
+7.5.1 Symbology Standards
+
+-   ISO/IEC 24778:2008 Information technology - Automatic identification and
+    data capture techniques - Aztec Code bar code symbology specification
+-   SEMI T1-95 Specification for Back Surface Bar Code Marking of Silicon Wafers
+    (BC412) (1996)
+-   ANSI/AIM BC12-1998 - Uniform Symbology Specification Channel Code
+-   BS EN 798:1996 Bar coding - Symbology specifications - ‘Codabar’
+-   AIM Europe ISS-X-24 - Uniform Symbology Specification Codablock-F (1995)
+-   ISO/IEC 15417:2007 Information technology - Automatic identification and
+    data capture techniques - Code 128 bar code symbology specification
+-   BS EN 12323:2005 AIDC technologies - Symbology specifications - Code 16K
+-   ISO/IEC 16388:2007 Information technology - Automatic identification and
+    data capture techniques - Code 39 bar code symbology specification
+-   ANSI/AIM BC6-2000 - Uniform Symbology Specification Code 49
+-   ANSI/AIM BC5-1995 - Uniform Symbology Specification Code 93
+-   AIM Uniform Symbology Specification Code One (1994)
+-   ISO/IEC 16022:2006 Information technology - Automatic identification and
+    data capture techniques - Data Matrix ECC200 bar code symbology
+    specification
+-   ISO/IEC 21471:2020 Information technology - Automatic identification and
+    data capture techniques - Extended rectangular data matrix (DMRE) bar code
+    symbology specification
+-   AIM TSC1705001 (v 4.0 Draft 0.15) - Information technology - Automatic
+    identification and data capture techniques - Bar code symbology
+    specification - DotCode (Revised 28th May 2019)
+-   ISO/IEC 15420:2009 Information technology - Automatic identification and
+    data capture techniques - EAN/UPC bar code symbology specification
+-   AIMD014 (v 1.63) - Information technology, Automatic identification and data
+    capture techniques - Bar code symbology specification - Grid Matrix
+    (Released 9th Dec 2008)
+-   ISO/IEC 24723:2010 Information technology - Automatic identification and
+    data capture techniques - GS1 Composite bar code symbology specification
+-   ISO/IEC 24724:2011 Information technology - Automatic identification and
+    data capture techniques - GS1 DataBar bar code symbology specification
+-   ISO/IEC 20830:2021 Information technology - Automatic identification and
+    data capture techniques - Han Xin Code bar code symbology specification
+-   ISO/IEC 16390:2007 Information technology - Automatic identification and
+    data capture techniques - Interleaved 2 of 5 bar code symbology
+    specification
+-   ISO/IEC 16023:2000 Information technology - International symbology
+    specification - MaxiCode
+-   ISO/IEC 24728:2006 Information technology - Automatic identification and
+    data capture techniques - MicroPDF417 bar code symbology specification
+-   ISO/IEC 15438:2015 Information technology - Automatic identification and
+    data capture techniques - PDF417 bar code symbology specification
+-   ISO/IEC 18004:2015 Information technology - Automatic identification and
+    data capture techniques - QR Code bar code symbology specification
+-   ISO/IEC 23941:2022 Information technology - Automatic identification and
+    data capture techniques - Rectangular Micro QR Code (rMQR) bar code
+    symbology specification
+-   AIMD/TSC15032-43 (v 0.99c) - International Technical Specification -
+    Ultracode Symbology (Draft) (Released 4th Nov 2015)
+
+A number of other specification documents have also been referenced, such as
+MIL-STD-1189 Rev. B (1989) (LOGMARS), USPS DMM 300 2006 (2011) (POSTNET, PLANET,
+FIM) and USPS-B-3200 (2015) (IMAIL). Those not named include postal and delivery
+company references in particular.
+
+7.5.2 General Standards
+
+-   AIM ITS/04-001 International Technical Standard - Extended Channel
+    Interpretations Part 1: Identification Schemes and Protocol (Released 24th
+    May 2004)
+-   AIM ITS/04-023 International Technical Standard - Extended Channel
+    Interpretations Part 3: Register (Version 2, February 2022)
+-   GS1 General Specifications Release 24.0 (Jan 2024)
+-   ANSI/HIBC 2.6-2016 - The Health Industry Bar Code (HIBC) Supplier Labeling
+    Standard
+
+Annex A. Character Encoding
+
+This section is intended as a quick reference to the character sets used by
+Zint. All symbologies use standard ASCII input as shown in section A.1, but some
+support extended characters as shown in the subsequent section A.2 Latin
+Alphabet No. 1 (ISO/IEC 8859-1).
+
+A.1 ASCII Standard
+
+The ubiquitous ASCII standard is well known to most computer users. It’s
+reproduced here for reference.
+
+  Hex   0     1     2       3   4   5   6   7
+  ----- ----- ----- ------- --- --- --- --- -----
+  0     NUL   DLE   SPACE   0   @   P   `   p
+  1     SOH   DC1   !       1   A   Q   a   q
+  2     STX   DC2   "       2   B   R   b   r
+  3     ETX   DC3   #       3   C   S   c   s
+  4     EOT   DC4   $       4   D   T   d   t
+  5     ENQ   NAK   %       5   E   U   e   u
+  6     ACK   SYN   &       6   F   V   f   v
+  7     BEL   ETB   '       7   G   W   g   w
+  8     BS    CAN   (       8   H   X   h   x
+  9     TAB   EM    )       9   I   Y   i   y
+  A     LF    SUB   *       :   J   Z   j   z
+  B     VT    ESC   +       ;   K   [   k   {
+  C     FF    FS    ,       <   L   \   l   |
+  D     CR    GS    -       =   M   ]   m   }
+  E     SO    RS    .       >   N   ^   n   ~
+  F     SI    US    /       ?   O   _   o   DEL
+
+  Table : ASCII
+
+A.2 Latin Alphabet No. 1 (ISO/IEC 8859-1)
+
+ISO/IEC 8859-1 defines additional characters common in western European
+languages like French, German, Italian and Spanish. This extension is the
+default encoding of many barcodes (see Table : Default Character Sets) when a
+codepoint above hex 9F is encoded. Note that codepoints hex 80 to 9F are not
+defined.
+
+  Hex   8   9   A      B   C   D   E   F
+  ----- --- --- ------ --- --- --- --- ---
+  0             NBSP   °   À   Ð   à   ð
+  1             ¡      ±   Á   Ñ   á   ñ
+  2             ¢      ²   Â   Ò   â   ò
+  3             £      ³   Ã   Ó   ã   ó
+  4             ¤      ´   Ä   Ô   ä   ô
+  5             ¥      μ   Å   Õ   å   õ
+  6             ¦      ¶   Æ   Ö   æ   ö
+  7             §      ·   Ç   ×   ç   ÷
+  8             ¨      ¸   È   Ø   è   ø
+  9             ©      ¹   É   Ù   é   ù
+  A             ª      º   Ê   Ú   ê   ú
+  B             «      »   Ë   Û   ë   û
+  C             ¬      ¼   Ì   Ü   ì   ü
+  D             SHY    ½   Í   Ý   í   ý
+  E             ®      ¾   Î   Þ   î   þ
+  F             ¯      ¿   Ï   ß   ï   ÿ
+
+  Table : ISO/IEC 8859-1
+
+Annex B. Qt Backend QZint
+
+Used internally by Zint Barcode Studio to display the preview, the Qt Backend
+QZint renders a barcode by drawing the vector representation (see 5.5 Buffering
+Symbols in Memory (vector)) provided by the Zint library libzint.
+
+The main class is Zint::QZint, which has getter/setter properties that
+correspond to the zint_symbol structure (see 5.7 Setting Options), and a main
+method render() which takes a Qt QPainter to paint with, and a QRectF
+rectangular area specifying where to paint into:
+
+    /* Encode and display barcode in `paintRect` using `painter`.
+       Note: legacy argument `mode` is not used */
+    void render(QPainter& painter, const QRectF& paintRect,
+                AspectRatioMode mode = IgnoreAspectRatio);
+
+render() will emit one of two Qt signals - encoded on successful encoding and
+drawing, or errored on failure. The client can connect and act appropriately,
+for instance:
+
+    connect(qzint, SIGNAL(encoded()), SLOT(on_encoded()));
+    connect(qzint, SIGNAL(errored()), SLOT(on_errored()));
+
+where qzint is an instance of Zint::QZint and on_encoded() and on_error() are Qt
+slot methods provided by the caller. On error, the error value and message can
+be retrieved by the methods getError() and lastError() respectively.
+
+The other main method is save_to_file():
+
+    /* Encode and print barcode to file `filename`.
+       Only sets `getError()` on error, not on warning */
+    bool save_to_file(const QString& filename); // `ZBarcode_Print()`
+
+which takes a filename to output to. It too will emit an errored signal on
+failure, returning false (but nothing on success, which just returns true). Note
+that rotation is achieved through the setter method setRotateAngleValue() (as
+opposed to the rotate_angle argument used by ZBarcode_Print()).
+
+Various other methods are available, for instance methods for testing symbology
+capabilities, and utility methods such as defaultXdim() and getAsCLI().
+
+For full details, see "backend_qt/qzint.h".
+
+Annex C. Tcl Backend Binding
+
+A Tcl binding is available in the "backend_tcl” sub-directory. To make on Unix:
+
+    cd backend_tcl
+    autoconf
+    ./configure
+    make
+    sudo make install
+
+For Windows, a Visual Studio 6.0 project file is available at
+"backend_tcl\zint_tcl.dsp". This can also be opened (and converted) by more
+modern Visual Studio versions, though some fixing up of the project
+configuration will likely be required.
+
+Once built and installed, invoke the Tcl/Tk CLI "wish":
+
+    wish
+
+and ignoring the Tk window click back to the command prompt "%" and type:
+
+    require package zint
+    zint help
+
+which will show the usage message, with options very similiar to the Zint CLI.
+(One notable difference is that boolean options such as -bold take a 1 or 0 as
+an argument.)
+
+A demonstration Tcl/Tk program which is also useful in itself is available at
+"backend_tcl/demo/demo.tcl". To run type:
+
+    wish demo/demo.tcl
+
+which will display the following window.
+
+[Tcl/Tk demonstration program window]
+
+You can select the symbology, enter the data to encode, and set options (which
+are the same as those given in the usage message). A raster preview of the
+configured barcode is displayed once the "Generate" button is pressed.
+
+Annex D. Man Page ZINT(1)
+
+% ZINT(1) Version 2.13.0.9 % % December 2024
+
+NAME
+
+zint - encode data as a barcode image
+
+SYNOPSIS
+
+zint [-h | --help]
+zint [options]
+
+DESCRIPTION
+
+zint takes input data from the command line or a file to encode in a barcode
+which is then output to an image file.
+
+Input data is UTF-8, unless --binary is specified.
+
+Human Readable Text (HRT) is displayed by default for those barcodes that
+support HRT, unless --notext is specified.
+
+The output image file (specified with -o | --output) may be in one of these
+formats: Windows Bitmap (BMP), Enhanced Metafile Format (EMF), Encapsulated
+PostScript (EPS), Graphics Interchange Format (GIF), ZSoft Paintbrush (PCX),
+Portable Network Format (PNG), Scalable Vector Graphic (SVG), or Tagged Image
+File Format (TIF).
+
+OPTIONS
+
+-h, --help
+
+    Print usage information summarizing command line options.
+
+-b TYPE, --barcode=TYPE
+
+    Set the barcode symbology that will be used to encode the data. TYPE is the
+    number or name of the barcode symbology. If not given, the symbology
+    defaults to 20 (Code 128). To see what types are available, use the -t |
+    --types option. Type names are case-insensitive, and non-alphanumerics are
+    ignored.
+
+--addongap=INTEGER
+
+    For EAN/UPC symbologies, set the gap between the main data and the add-on.
+    INTEGER is in integral multiples of the X-dimension. The maximum gap that
+    can be set is 12. The minimum is 7, except for UPC-A, when the minimum is 9.
+
+--batch
+
+    Treat each line of an input file specified with -i | --input as a separate
+    data set and produce a barcode image for each one. The barcode images are
+    outputted by default to numbered filenames starting with “00001.png”,
+    “00002.png” etc., which can be changed by using the -o | --output option.
+
+--bg=COLOUR
+
+    Specify a background (paper) colour where COLOUR is in hexadecimal RRGGBB or
+    RRGGBBAA format or in decimal C,M,Y,K percentages format.
+
+--binary
+
+    Treat input data as raw 8-bit binary data instead of the default UTF-8.
+    Automatic code page translation to an ECI page is disabled, and no
+    validation of the data’s character encoding takes place.
+
+--bind
+
+    Add horizontal boundary bars (also known as bearer bars) to the symbol. The
+    width of the boundary bars is specified by the --border option. --bind can
+    also be used to add row separator bars to symbols stacked with multiple -d |
+    --data inputs, in which case the width of the separator bars is specified
+    with the --separator option.
+
+--bindtop
+
+    Add a horizontal boundary bar to the top of the symbol. The width of the
+    boundary bar is specified by the --border option.
+
+--bold
+
+    Use a bold font for the Human Readable Text (HRT).
+
+--border=INTEGER
+
+    Set the width of boundary bars (--bind or --bindtop) or box borders (--box),
+    where INTEGER is in integral multiples of the X-dimension. The default is
+    zero.
+
+--box
+
+    Add a box around the symbol. The width of the borders is specified by the
+    --border option.
+
+--cmyk
+
+    Use the CMYK colour space when outputting to Encapsulated PostScript (EPS)
+    or TIF files.
+
+--cols=INTEGER
+
+    Set the number of data columns in the symbol to INTEGER. Affects
+    Codablock-F, DotCode, GS1 DataBar Expanded Stacked (DBAR_EXPSTK),
+    MicroPDF417 and PDF417 symbols.
+
+--compliantheight
+
+    Warn if the height specified by the --height option is not compliant with
+    the barcode’s specification, or if --height is not given, default to the
+    height specified by the specification (if any).
+
+-d, --data=DATA
+
+    Specify the input DATA to encode. The --esc option may be used to enter
+    non-printing characters using escape sequences. The DATA should be UTF-8,
+    unless the --binary option is given, in which case it can be anything.
+
+--direct
+
+    Send output to stdout, which in most cases should be re-directed to a pipe
+    or a file. Use --filetype to specify output format.
+
+--dmiso144
+
+    For Data Matrix symbols, use the standard ISO/IEC codeword placement for 144
+    x 144 (--vers=24) sized symbols, instead of the default “de facto” placement
+    (which rotates the placement of ECC codewords).
+
+--dmre
+
+    For Data Matrix symbols, allow Data Matrix Rectangular Extended (DMRE) sizes
+    when considering automatic sizes. See also --square.
+
+--dotsize=NUMBER
+
+    Set the radius of the dots in dotty mode (--dotty). NUMBER is in
+    X-dimensions, and may be floating-point. The default is 0.8.
+
+--dotty
+
+    Use dots instead of squares for matrix symbols. DotCode is always in dotty
+    mode.
+
+--dump
+
+    Dump a hexadecimal representation of the symbol’s encodation to stdout. The
+    same representation may be outputted to a file by using a .txt extension
+    with -o | --output or by specifying --filetype=txt.
+
+-e, --ecinos
+
+    Display the table of ECIs (Extended Channel Interpretations).
+
+--eci=INTEGER
+
+    Set the ECI code for the input data to INTEGER. See -e | --ecinos for a list
+    of the ECIs available. ECIs are supported by Aztec Code, Code One, Data
+    Matrix, DotCode, Grid Matrix, Han Xin Code, MaxiCode, MicroPDF417, PDF417,
+    QR Code, rMQR and Ultracode.
+
+--embedfont
+
+    For vector output, embed the font in the file for portability. Currently
+    only available for SVG output.
+
+--esc
+
+    Process escape characters in the input data. The escape sequences are:
+
+        \0       (0x00)    NUL  Null character
+        \E       (0x04)    EOT  End of Transmission
+        \a       (0x07)    BEL  Bell
+        \b       (0x08)    BS   Backspace
+        \t       (0x09)    HT   Horizontal Tab
+        \n       (0x0A)    LF   Line Feed
+        \v       (0x0B)    VT   Vertical Tab
+        \f       (0x0C)    FF   Form Feed
+        \r       (0x0D)    CR   Carriage Return
+        \e       (0x1B)    ESC  Escape
+        \G       (0x1D)    GS   Group Separator
+        \R       (0x1E)    RS   Record Separator
+        \\       (0x5C)    \    Backslash
+        \dNNN    (NNN)          Any 8-bit character where NNN is
+                                decimal (000-255)
+        \oNNN    (0oNNN)        Any 8-bit character where NNN is
+                                octal (000-377)
+        \xNN     (0xNN)         Any 8-bit character where NN is
+                                hexadecimal (00-FF)
+        \uNNNN   (U+NNNN)       Any 16-bit Unicode BMP character
+                                where NNNN is hexadecimal
+        \UNNNNNN (U+NNNNNN)     Any 21-bit Unicode character
+                                where NNNNNN is hexadecimal
+
+--extraesc
+
+    For Code 128 only, as well as processing the normal escape sequences above,
+    process the special escape sequences \^A, \^B, \^C and \^@ that allow manual
+    switching of Code Sets, and the special escape sequence \^1 that inserts an
+    FNC1 character. The sequence \@ turns off manual switching. The sequence \^^
+    can be used to encode data that contains special escape sequences.
+
+--fast
+
+    Use faster if less optimal encodation or other shortcuts (affects Data
+    Matrix, MicroPDF417, PDF417, QRCODE & UPNQR only).
+
+--fg=COLOUR
+
+    Specify a foreground (ink) colour where COLOUR is in hexadecimal RRGGBB or
+    RRGGBBAA format or in decimal C,M,Y,K percentages format.
+
+--filetype=TYPE
+
+    Set the output file type to TYPE, which is one of BMP, EMF, EPS, GIF, PCX,
+    PNG, SVG, TIF, TXT.
+
+--fullmultibyte
+
+    Use the multibyte modes of Grid Matrix, Han Xin and QR Code for non-ASCII
+    data.
+
+--gs1
+
+    Treat input as GS1 compatible data. Application Identifiers (AIs) should be
+    placed in square brackets "[]" (but see --gs1parens).
+
+--gs1nocheck
+
+    Do not check the validity of GS1 data.
+
+--gs1parens
+
+    Process parentheses "()" as GS1 AI delimiters, rather than square brackets
+    "[]". The input data must not otherwise contain parentheses.
+
+--gssep
+
+    For Data Matrix in GS1 mode, use GS (0x1D) as the GS1 data separator instead
+    of FNC1.
+
+--guarddescent=NUMBER
+
+    For EAN/UPC symbols, set the height the guard bars descend below the main
+    bars, where NUMBER is in X-dimensions. NUMBER may be floating-point.
+
+--guardwhitespace
+
+    For EAN/UPC symbols, add quiet zone indicators "<" and/or ">" to HRT where
+    applicable.
+
+--height=NUMBER
+
+    Set the height of the symbol in X-dimensions. NUMBER may be floating-point.
+
+--heightperrow
+
+    Treat height as per-row. Affects Codablock-F, Code 16K, Code 49, GS1 DataBar
+    Expanded Stacked (DBAR_EXPSTK), MicroPDF417 and PDF417.
+
+-i, --input=FILE
+
+    Read the input data from FILE. Specify a single hyphen (-) for FILE to read
+    from stdin.
+
+--init
+
+    Create a Reader Initialisation (Programming) symbol.
+
+--mask=INTEGER
+
+    Set the masking pattern to use for DotCode, Han Xin or QR Code to INTEGER,
+    overriding the automatic selection.
+
+--mirror
+
+    Use the batch data to determine the filename in batch mode (--batch). The -o
+    | --output option can be used to specify an output directory (any filename
+    will be ignored).
+
+--mode=INTEGER
+
+    For MaxiCode and GS1 Composite symbols, set the encoding mode to INTEGER.
+
+    For MaxiCode (SCM is Structured Carrier Message, with 3 fields: postcode,
+    3-digit ISO 3166-1 country code, 3-digit service code):
+
+        2   SCM with 9-digit numeric postcode
+        3   SCM with 6-character alphanumeric postcode
+        4   Enhanced ECC for the primary part of the message
+        5   Enhanced ECC for all of the message
+        6   Reader Initialisation (Programming)
+
+    For GS1 Composite symbols (names end in _CC, i.e. EANX_CC, GS1_128_CC,
+    DBAR_OMN_CC etc.):
+
+        1   CC-A
+        2   CC-B
+        3   CC-C (GS1_128_CC only)
+
+--nobackground
+
+    Remove the background colour (EMF, EPS, GIF, PNG, SVG and TIF only).
+
+--noquietzones
+
+    Disable any quiet zones for symbols that define them by default.
+
+--notext
+
+    Remove the Human Readable Text (HRT).
+
+-o, --output=FILE
+
+    Send the output to FILE. When not in batch mode, the default is “out.png”
+    (or “out.gif” if zint built without PNG support). When in batch mode
+    (--batch), special characters can be used to format the output filenames:
+
+        ~           Insert a number or 0
+        #           Insert a number or space
+        @           Insert a number or * (+ on Windows)
+        Any other   Insert literally
+
+--primary=STRING
+
+    For MaxiCode, set the content of the primary message. For GS1 Composite
+    symbols, set the content of the linear symbol.
+
+--quietzones
+
+    Add compliant quiet zones for symbols that specify them. This is in addition
+    to any whitespace specified by -w | --whitesp or --vwhitesp.
+
+-r, --reverse
+
+    Reverse the foreground and background colours (white on black). Known as
+    “reflectance reversal” or “reversed reflectance”.
+
+--rotate=INTEGER
+
+    Rotate the symbol by INTEGER degrees, where INTEGER can be 0, 90, 270 or
+    360.
+
+--rows=INTEGER
+
+    Set the number of rows for Codablock-F or PDF417 to INTEGER. It will also
+    set the minimum number of rows for Code 16K or Code 49, and the maximum
+    number of rows for GS1 DataBar Expanded Stacked (DBAR_EXPSTK).
+
+--scale=NUMBER
+
+    Adjust the size of the X-dimension. NUMBER may be floating-point, and is
+    multiplied by 2 (except for MaxiCode) before being applied. The default
+    scale is 1.
+
+    For MaxiCode, the scale is multiplied by 10 for raster output, by 40 for EMF
+    output, and by 2 otherwise.
+
+    Increments of 0.5 (half-integers) are recommended for non-MaxiCode raster
+    output (BMP, GIF, PCX, PNG and TIF).
+
+    See also --scalexdimdp below.
+
+--scalexdimdp=X[,R]
+
+    Scale the image according to X-dimension X and resolution R, where X is in
+    mm and R is in dpmm (dots per mm). X and R may be floating-point. R is
+    optional and defaults to 12 dpmm (approximately 300 dpi). X may be zero in
+    which case a symbology-specific default is used.
+
+    The scaling takes into account the output filetype, and deals with all the
+    details mentioned above. Units may be specified for X by appending “in”
+    (inch) or “mm”, and for R by appending “dpi” (dots per inch) or “dpmm” -
+    e.g. --scalexdimdp=0.013in,300dpi.
+
+--scmvv=INTEGER
+
+    For MaxiCode, prefix the Structured Carrier Message (SCM) with
+    "[)>\R01\Gvv", where vv is a 2-digit INTEGER.
+
+--secure=INTEGER
+
+    Set the error correction level (ECC) to INTEGER. The meaning is specific to
+    the following matrix symbols (all except PDF417 are approximate):
+
+        Aztec Code  1 to 4 (10%, 23%, 36%, 50%)
+        Grid Matrix 1 to 5 (10% to 50%)
+        Han Xin     1 to 4 (8%, 15%, 23%, 30%)
+        Micro QR    1 to 3 (7%, 15%, 25%) (L, M, Q)
+        PDF417      0 to 8 (2^(INTEGER + 1) codewords)
+        QR Code     1 to 4 (7%, 15%, 25%, 30%) (L, M, Q, H)
+        rMQR        2 or 4 (15% or 30%) (M or H)
+        Ultracode   1 to 6 (0%, 5%, 9%, 17%, 25%, 33%)
+
+--segN=ECI,DATA
+
+    Set the ECI & DATA content for segment N, where N is 1 to 9. -d | --data
+    must still be given, and counts as segment 0, its ECI given by --eci.
+    Segments must be consecutive.
+
+--separator=INTEGER
+
+    Set the height of row separator bars for stacked symbologies, where INTEGER
+    is in integral multiples of the X-dimension. The default is zero.
+
+--small
+
+    Use a smaller font for Human Readable Text (HRT).
+
+--square
+
+    For Data Matrix symbols, exclude rectangular sizes when considering
+    automatic sizes. See also --dmre.
+
+--structapp=I,C[,ID]
+
+    Set Structured Append info, where I is the 1-based index, C is the total
+    number of symbols in the sequence, and ID, which is optional, is the
+    identifier that all symbols in the sequence share. Structured Append is
+    supported by Aztec Code, Code One, Data Matrix, DotCode, Grid Matrix,
+    MaxiCode, MicroPDF417, PDF417, QR Code and Ultracode.
+
+-t, --types
+
+    Display the table of barcode types (symbologies). The numbers or names can
+    be used with -b | --barcode.
+
+--textgap=NUMBER
+
+    Adjust the gap between the barcode and the Human Readable Text (HRT). NUMBER
+    is in X-dimensions, and may be floating-point. Maximum is 10 and minimum is
+    -5. The default is 1.
+
+--vers=INTEGER
+
+    Set the symbol version (size, check digits, other options) to INTEGER. The
+    meaning is symbol-specific.
+
+    For most matrix symbols, it specifies size:
+
+        Aztec Code      1 to 36 (1 to 4 compact)
+                1   15x15     13  53x53     25  105x105
+                2   19x19     14  57x57     26  109x109
+                3   23x23     15  61x61     27  113x113
+                4   27x27     16  67x67     28  117x117
+                5   19x19     17  71x71     29  121x121
+                6   23x23     18  75x75     30  125x125
+                7   27x27     19  79x79     31  131x131
+                8   31x31     20  83x83     32  135x135
+                9   37x37     21  87x87     33  139x139
+                10  41x41     22  91x91     34  143x143
+                11  45x45     23  95x95     35  147x147
+                12  49x49     24  101x101   36  151x151
+
+        Code One        1 to 10 (9 and 10 variable width) (WxH)
+                1   16x18     6   70x76
+                2   22x22     7   104x98
+                3   28x28     8   148x134
+                4   40x42     9   Wx8
+                5   52x54     10  Wx16
+
+        Data Matrix     1 to 48 (31 to 48 DMRE) (HxW)
+                1   10x10     17  72x72     33  8x80
+                2   12x12     18  80x80     34  8x96
+                3   14x14     19  88x88     35  8x120
+                4   16x16     20  96x96     36  8x144
+                5   18x18     21  104x104   37  12x64
+                6   20x20     22  120x120   38  12x88
+                7   22x22     23  132x132   39  16x64
+                8   24x24     24  144x144   40  20x36
+                9   26x26     25  8x18      41  20x44
+                10  32x32     26  8x32      42  20x64
+                11  36x36     28  12x26     43  22x48
+                12  40x40     28  12x36     44  24x48
+                13  44x44     29  16x36     45  24x64
+                14  48x48     30  16x48     46  26x40
+                15  52x52     31  8x48      47  26x48
+                16  64x64     32  8x64      48  26x64
+
+        Grid Matrix     1 to 13
+                1   18x18     6   78x78     11  138x138
+                2   30x30     7   90x90     12  150x150
+                3   42x42     8   102x102   13  162x162
+                4   54x54     9   114x114
+                5   66x66     10  126x126
+
+        Han Xin         1 to 84
+                1   23x23     29  79x79     57  135x135
+                2   25x25     30  81x81     58  137x137
+                3   27x27     31  83x83     59  139x139
+                4   29x29     32  85x85     60  141x141
+                5   31x31     33  87x87     61  143x143
+                6   33x33     34  89x89     62  145x145
+                7   35x35     35  91x91     63  147x147
+                8   37x37     36  93x93     64  149x149
+                9   39x39     37  95x95     65  151x151
+                10  41x41     38  97x97     66  153x153
+                11  43x43     39  99x99     67  155x155
+                12  45x45     40  101x101   68  157x157
+                13  47x47     41  103x103   69  159x159
+                14  49x49     42  105x105   70  161x161
+                15  51x51     43  107x107   71  163x163
+                16  53x53     44  109x109   72  165x165
+                17  55x55     45  111x111   73  167x167
+                18  57x57     46  113x113   74  169x169
+                19  59x59     47  115x115   75  171x171
+                20  61x61     48  117x117   76  173x173
+                21  63x63     49  119x119   77  175x175
+                22  65x65     50  121x121   78  177x177
+                23  67x67     51  123x123   79  179x179
+                24  69x69     52  125x125   80  181x181
+                25  71x71     53  127x127   81  183x183
+                26  73x73     54  129x129   82  185x185
+                27  75x75     55  131x131   83  187x187
+                28  77x77     56  133x133   84  189x189
+
+        Micro QR        1 to 4  (M1, M2, M3, M4)
+                1   11x11     3   15x15
+                2   13x13     4   17x17
+
+        QR Code         1 to 40
+                1   21x21     15  77x77     29  133x133
+                2   25x25     16  81x81     30  137x137
+                3   29x29     17  85x85     31  141x141
+                4   33x33     18  89x89     32  145x145
+                5   37x37     19  93x93     33  149x149
+                6   41x41     20  97x97     34  153x153
+                7   45x45     21  101x101   35  157x157
+                8   49x49     22  105x105   36  161x161
+                9   53x53     23  109x109   37  165x165
+                10  57x57     24  113x113   38  169x169
+                11  61x61     25  117x117   39  173x173
+                12  65x65     26  121x121   40  177x177
+                13  69x69     27  125x125
+                14  73x73     28  129x129
+
+        rMQR            1 to 38 (33 to 38 automatic width) (HxW)
+                1   7x43      14  11x77     27  15x139
+                2   7x59      15  11x99     28  17x43
+                3   7x77      16  11x139    29  17x59
+                4   7x99      17  13x27     30  17x77
+                5   7x139     18  13x43     31  17x99
+                6   9x43      19  13x59     32  17x139
+                7   9x59      20  13x77     33  7xW
+                8   9x77      21  13x99     34  9xW
+                9   9x99      22  13x139    35  11xW
+                10  9x139     23  15x43     36  13xW
+                11  11x27     24  15x59     37  15xW
+                12  11x43     25  15x77     38  17xW
+                13  11x59     26  15x99
+
+    For a number of linear symbols, it specifies check character options (“hide”
+    or “hidden” means don’t show in HRT, “visible” means do display in HRT):
+
+        C25IATA         1 or 2 (add visible or hidden check digit)
+        C25IND          ditto
+        C25INTER        ditto
+        C25LOGIC        ditto
+        C25STANDARD     ditto
+        Codabar         1 or 2 (add hidden or visible check digit)
+        Code 11         0 to 2 (2 visible check digits to none)
+                        0      (default 2 visible check digits)
+                        1      (1 visible check digit)
+                        2      (no check digits)
+        Code 39         1 or 2 (add visible or hidden check digit)
+        Code 93         1      (hide the default check characters)
+        EXCODE39        1 or 2 (add visible or hidden check digit)
+        LOGMARS         1 or 2 (add visible or hidden check digit)
+        MSI Plessey     0 to 6 (none to various visible options)
+                        1, 2   (mod-10, mod-10 + mod-10)
+                        3, 4   (mod-11 IBM, mod-11 IBM + mod-10)
+                        5, 6   (mod-11 NCR, mod-11 NCR + mod-10)
+                        +10    (hide)
+
+    For a few other symbologies, it specifies other characteristics:
+
+        Channel Code    3 to 8    (no. of channels)
+        DAFT            50 to 900 (permille tracker ratio)
+        DPD             1         (relabel)
+        PZN             1         (PZN7 instead of default PZN8)
+        Ultracode       2         (revision 2)
+        VIN             1         (add international prefix)
+
+-v, --version
+
+    Display zint version.
+
+--vwhitesp=INTEGER
+
+    Set the height of vertical whitespace above and below the barcode, where
+    INTEGER is in integral multiples of the X-dimension.
+
+-w, --whitesp=INTEGER
+
+    Set the width of horizontal whitespace either side of the barcode, where
+    INTEGER is in integral multiples of the X-dimension.
+
+--werror
+
+    Convert all warnings into errors.
+
+EXIT STATUS
+
+0
+    Success (including when given informational options -h | --help, -e |
+    --ecinos, -t | --types, -v | --version).
+
+1
+    Human Readable Text was truncated (maximum 199 bytes)
+    (ZINT_WARN_HRT_TRUNCATED)
+
+2
+    Invalid option given but overridden by Zint (ZINT_WARN_INVALID_OPTION)
+
+3
+    Automatic ECI inserted by Zint (ZINT_WARN_USES_ECI)
+
+4
+    Symbol created not compliant with standards (ZINT_WARN_NONCOMPLIANT)
+
+5
+    Input data wrong length (ZINT_ERROR_TOO_LONG)
+
+6
+    Input data incorrect (ZINT_ERROR_INVALID_DATA)
+
+7
+    Input check digit incorrect (ZINT_ERROR_INVALID_CHECK)
+
+8
+    Incorrect option given (ZINT_ERROR_INVALID_OPTION)
+
+9
+    Internal error (should not happen) (ZINT_ERROR_ENCODING_PROBLEM)
+
+10
+    Error opening output file (ZINT_ERROR_FILE_ACCESS)
+
+11
+    Memory allocation (malloc) failure (ZINT_ERROR_MEMORY)
+
+12
+    Error writing to output file (ZINT_ERROR_FILE_WRITE)
+
+13
+    Error counterpart of warning if --werror given (ZINT_ERROR_USES_ECI)
+
+14
+    Error counterpart of warning if --werror given (ZINT_ERROR_NONCOMPLIANT)
+
+15
+    Error counterpart of warning if --werror given (ZINT_ERROR_HRT_TRUNCATED)
+
+EXAMPLES
+
+Create “out.png” (or “out.gif” if zint built without PNG support) in the current
+directory, as a Code 128 symbol.
+
+    zint -d 'This Text'
+
+Create “qr.svg” in the current directory, as a QR Code symbol.
+
+    zint -b QRCode -d 'This Text' -o 'qr.svg'
+
+Use batch mode to read from an input file “ean13nos.txt” containing a list of
+13-digit GTINs, each on a separate line, to create a series of EAN-13 barcodes,
+formatting the output filenames to “ean001.gif”, “ean002.gif” etc. using the
+special character “~”.
+
+    zint -b EANX --batch -i 'ean13nos.txt' -o 'ean~~~.gif'
+
+BUGS
+
+Please send bug reports to https://sourceforge.net/p/zint/tickets/.
+
+SEE ALSO
+
+Full documention for zint (and the API libzint and the GUI zint-qt) is available
+from
+
+        https://zint.org.uk/manual/
+
+and at
+
+        https://sourceforge.net/p/zint/docs/manual.txt
+
+CONFORMING TO
+
+Zint is designed to be compliant with a number of international standards,
+including:
+
+ISO/IEC 24778:2008, ANSI/AIM BC12-1998, EN 798:1996, AIM ISS-X-24 (1995),
+ISO/IEC 15417:2007, EN 12323:2005, ISO/IEC 16388:2007, ANSI/AIM BC6-2000,
+ANSI/AIM BC5-1995, AIM USS Code One (1994), ISO/IEC 16022:2006, ISO/IEC
+21471:2019, ISO/IEC 15420:2009, AIMD014 (v 1.63) (2008), ISO/IEC 24723:2010,
+ISO/IEC 24724:2011, ISO/IEC 20830:2021, ISO/IEC 16390:2007, ISO/IEC 16023:2000,
+ISO/IEC 24728:2006, ISO/IEC 15438:2015, ISO/IEC 18004:2015, ISO/IEC 23941:2022,
+AIM ITS/04-023 (2022)
+
+COPYRIGHT
+
+Copyright © 2024 Robin Stuart. Released under GNU GPL 3.0 or later.
+
+AUTHOR
+
+Robin Stuart robin@zint.org.uk
+
+[1] See the Homebrew website https://brew.sh.
+
+[2] In Unicode contexts, BMP stands for Basic Multilingual Plane, the plane 0
+codeset from U+0000 to U+D7FF and U+E000 to U+FFFF (i.e. excluding surrogates).
+Not to be confused with the Windows Bitmap file format BMP!
+
+[3] The symbologies marked with an asterisk (*) in Table
+: Barcode Types (Symbologies) above used different names in Zint before version
+2.9.0. For example, symbology 29 used the name BARCODE_RSS14. These names are
+now deprecated but are still recognised by Zint and will continue to be
+supported in future versions.
+
+[4] The background is omitted for vector outputs EMF, EPS and SVG when
+--nobackground is given. For raster outputs GIF, PCX, PNG and TIF, the
+background’s alpha channel is set to zero (fully transparent).
+
+[5] Shift JIS (JIS X 0201 Roman) re-maps two ASCII characters: backslash (\) to
+the yen sign (¥), and tilde (~) to overline (U+203E).
+
+[6] ISO/IEC 646 Invariant is a subset of ASCII with 12 characters undefined: #,
+$, @, [, \, ], ^, `, {, |, }, ~.
+
+[7] BARCODE_MEMORY_FILE textual formats EPS and SVG will have Unix newlines (LF)
+on both Windows and Unix, i.e. not CR+LF on Windows.
+
+[8] The height value is ignored for Aztec (including HIBC and Aztec Rune), Code
+One, Data Matrix (including HIBC), DotCode, Grid Matrix, Han Xin, MaxiCode, QR
+Code (including HIBC, Micro QR, rMQR and UPNQR), and Ultracode - all of which
+have a fixed width-to-height ratio (or, in the case of Code One, a fixed
+height).
+
+[9] For Windows, outfile is assumed to be UTF-8 encoded.
+
+[10] The BARCODE_BIND_TOP flag is set by default for DPD - see 6.1.10.7 DPD
+Code.
+
+[11] The BARCODE_BIND flag is always set for Codablock-F, Code 16K and Code 49.
+Special considerations apply to ITF-14 - see 6.1.2.6 ITF-14.
+
+[12] Codablock-F, Code 16K, Code 49, EAN-2 to EAN-13, ISBN, ITF-14, UPC-A and
+UPC-E have compliant quiet zones added by default.
+
+[13] ZINT_CAP_EANUPC was previously named ZINT_CAP_EXTENDABLE, which is still
+recognised.
+
+[14] BARCODE_CODE128AB previously used the name BARCODE_CODE128B, which is still
+recognised.
+
+[15] The DX Number may be looked up in The (Modified) Big Film Database at
+https://thebigfilmdatabase.merinorus.com.