Barcode Writer in Pure PostScript

Project maintained by Terry Burton Hosted on GitHub Pages

GitHub license Release Github commits (since latest release) GitHub Actions

Barcode Writer in Pure Postscript generates all barcode formats entirely within PostScript so that the process of converting the input data into the printed output can be performed by the printer or RIP itself. This is ideal for variable data printing (VDP) and avoids the need to re-implement the barcode generation process whenever your language needs change.

It makes including any barcode within a PostScript document as simple as inserting the following directive:

0 0 moveto (978-1-86074-271-2) (includetext)
/isbn / findresource exec

This project is dedicated to the memory of Craig K. Harmon.


BWIPP supports all major barcode symbologies including:

EAN-13 (EAN, UCC-13, JAN, JAN-13, EAN-13+2, EAN-13+5, EAN-99), EAN-8 (UCC-8, JAN-8, EAN-8+2, EAN-8+5, EAN-Velocity), UPC-A (UPC, UCC-12, UPC-A+2, UPC-A+5), UPC-E (UPC-E0, UPC-E1, UPC-E+2, UPC-E+5), ISBN (ISBN-13, ISBN-10, Bookland EAN-13), ISMN, ISSN, EAN-5 & EAN-2 (EAN/UPC add-ons), GS1 DataBar Omnidirectional (RSS-14), GS1 DataBar Stacked (RSS-14 Stacked), GS1 DataBar Stacked Omnidirectional (RSS-14 Stacked Omnidirectional), GS1 DataBar Truncated (RSS-14 Truncated), GS1 DataBar Limited (RSS Limited), GS1 DataBar Expanded (RSS Expanded), GS1 DataBar Expanded Stacked (RSS Expanded Stacked), GS1 North American Coupon Code, GS1-128 (UCC/EAN-128, EAN-128, UCC-128), SSCC-18 (EAN-18, NVE), EAN-14 (UCC-14), ITF-14 (UPC SCS), QR Code (Quick Response Code), Micro QR Code, GS1 QR Code, GS1 Digital Link QR Code, Data Matrix (ECC 200), Data Matrix Rectangular, Data Matrix Rectangular Extension, GS1 DataMatrix, GS1 Digital Link Data Matrix, Aztec Code (Compact Aztec Code), Aztec Runes, PDF417, Compact PDF417 (Truncated PDF417), MicroPDF417, Han Xin Code (Chinese Sensible), MaxiCode (UPS Code, Code 6), Codablock F, Code 16K (USS-16K), Code 49 (USS-49), Code One (Code 1, Code 1S), DotCode, GS1 DotCode, Ultracode, USPS POSTNET, USPS PLANET, USPS Intelligent Mail (USPS OneCode), USPS FIM, Royal Mail (RM4SCC, CBC), Royal Mail Mailmark, Royal TNT Post (KIX), Japan Post, Australia Post, Deutsche Post Identcode (DHL Identcode), Deutsche Post Leitcode (DHL Leitcode), Pharmacode (Pharmaceutical Binary Code), Two-track Pharmacode (Two-track Pharmaceutical Binary Code), Italian-Pharmacode (Code 32, IMH), PZN (Pharmazentralnummer, PZN-8, PZN-7), Code 39 (Code 3 of 9, LOGMARS, Alpha39, USD-3, USD-2, USS-39), Code 39 Extended (Code 39 Full ASCII), Code 93 (USD-7, USS-93), Code 93 Extended (Code 93 Full ASCII), Code 128 (Code 128A, Code 128B, Code 128C, USD-6, USS-128), Code 25 (Code 2 of 5, Industrial 2 of 5), IATA-2 of 5, Datalogic 2 of 5, Matrix 2 of 5, COOP 2 of 5, Interleaved 2 of 5 (ITF, Code 2 of 5 Interleaved, USD-1, USS-Interleaved 2 of 5), Code 11 (USD-8), Codabar (Rationalized Codabar, Ames Code, NW-7, USD-4, USS-Codabar, Monarch, Code 2 of 7), Plessey (Anker Code), MSI Plessey (MSI, MSI Modified Plessey), Telepen (Telepen Alpha, Telepen Full ASCII), Telepen Numeric, Channel Code, PosiCode (PosiCode A, PosiCode B), BC412 (BC412 SEMI, BC412 IBM), GS1 Composite Symbols (EAN-13 Composite, EAN-8 Composite, UPC-A Composite, UPC-E Composite, GS1 DataBar Omnidirectional Composite, GS1 DataBar Stacked Composite, GS1 DataBar Stacked Omni Composite, GS1 DataBar Truncated Composite, GS1 DataBar Limited Composite, GS1 DataBar Expanded Composite, GS1 DataBar Expanded Stacked Composite, GS1-128 Composite), HIBC barcodes (HIBC Code 39, HIBC Code 128, HIBC Data Matrix, HIBC PDF417, HIBC MicroPDF417, HIBC QR Code, HIBC Codablock F)

BWIPP supports the following features:

If it doesn't contain the format or feature you are looking for then take a look at the outstanding features, nudge an existing request or make a new one and check back soon.

The resource is modular so you need only include the definitions for the symbologies that you will produce within your target document or labels, making the resource very lightweight.

Since this resource is written in PostScript and interpreted within the virtual machine of a printer it is compatible with virtually any hardware, operating system and application platform, for example Windows 95/XP on i386, Mac OS X/Linux on Power PC, Solaris on SPARC, and OpenVMS on Alpha AXP.

Sample Output

For an online demonstration of BWIPP's barcode generation capabilities take a look at this web-based front end.

Here is a sample image obtained by running the current version of BWIPP through Ghostscript and ImageMagick.

Example Output of BWIPP


There are many ways that you can use the PostScript resources to generate barcodes.

Simple instructions for getting started with creating and placing barcodes in your documents are provided in the quick guide.

Besides direct inclusion within the Prolog section of a PostScript document, the resources are suitable for use as a PostScript library by Adobe Distiller, GhostScript, a printer hard disk or a document manager using the standard "named resources" mechanism.

With a PostScript printer an alternative approach to embedding the resources within each document or saving them on the printer's hard drive is to install the BWIPP named resources within your printer's initial job virtual machine. Doing this will give the device barcode production capabilities for all subsequent jobs until it is reset. In effect this converts a commodity laser printer into an extremely capable barcode printer all through the use of device-resident software, no font chips required.

More detail is provided in the download section below.


Anybody is free to use and develop this code as they see fit, under the terms of the permissive MIT/X-Consortium license, which requires that developers attribute any derivative code to this project in both the source code and documentation. As such I take no liability for its use or misuse.

Community Support

The support is provided via the discussion board and issue tracker where you will normally find any questions or issues resolved quickly.

Commercial Support

Alternate licensing, bespoke integrations, custom developments and technical support (per incident or prepaid) is available from Terry Burton Consulting Ltd.

Terry Burton Consulting Ltd


The most complete reference for users and developers is the wiki. The same documentation is also available in PDF form suitable for print.


The current release is available for download in a number of flavours supporting different use cases from here.

BWIPP is essentially a set of generic PostScript Level 2 named resources that are provided in four flavours for ease of use. The flavour that you will find most useful depends on how you intend to deploy the library.

"Packaged" or "unpackaged": The named resources have been packaged for DSC conformance, portability and ease of distribution. You will most likely want to use a packaged flavour in production, however the unpackaged versions of the resources are useful for understanding the PostScript code, developing the library and debugging. They are functionally equivalent an can be used interchangably.

"Separate files" or "monolithic": The resource is provided as separate files that are formatted for direct use by Adobe Distiller, GhostScript, a printer hard disk or a document manager. The monolithic flavours contain all of the resources in a single file that is suitable for inclusion in the Prolog section of a PostScript document template or installing to a printer's initial job VM.

We provide instructions for the seperate files and monolithic use cases.

This leads to the following set of four files.

For production use:

For BWIPP development:

Browse or checkout the source code from the repository or view the changelog.

Stay up-to-date by following the releases feed.

Front Ends

Many applications embed or plugin this PostScript resource thereby making available to their users a complete or partial implementation of the BWIPP's features. The following is a list of known open source applications that make BWIPP barcodes available to their intended audience without the need to manipulate direct PostScript:


There are a number of different sample scripts and front-ends that make use of the project in the contrib section of the repository.