Skip to content

woo-j/OkapiBarcode

Repository files navigation

Okapi Barcode License Maven Central Code Coverage

Okapi Barcode is an open-source barcode generator written entirely in Java, supporting over 50 encoding standards, including all ISO standards. Okapi Barcode is based on Zint, an open-source barcode encoding library developed in C, and builds on the years of work that have been invested in that project.

Supported Symbologies

Library Usage (Java)

Okapi Barcode JARs are available for download from Maven Central.

To generate barcode images in your own code using the Okapi Barcode library, use one of the symbology classes linked above:

  1. instantiate the barcode class,
  2. customize any relevant settings,
  3. invoke setContent(String), and then
  4. pass the barcode instance to one of the available renderers (Java 2D, PostScript, SVG)
Code128 barcode = new Code128();
barcode.setFontName("Monospaced");
barcode.setFontSize(16);
barcode.setModuleWidth(2);
barcode.setBarHeight(50);
barcode.setHumanReadableLocation(HumanReadableLocation.BOTTOM);
barcode.setContent("123456789");

int width = barcode.getWidth();
int height = barcode.getHeight();

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
Graphics2D g2d = image.createGraphics();
Java2DRenderer renderer = new Java2DRenderer(g2d, 1, Color.WHITE, Color.BLACK);
renderer.render(barcode);

ImageIO.write(image, "png", new File("code128.png"));

Library Usage (Android)

If you'd like to use Okapi Barcode on the Android platform, the easiest approach is to use the SVG renderer to render your barcode to SVG, and then use a library like AndroidSVG to draw the resultant SVG image on an Android Bitmap or Canvas:

Code128 barcode = new Code128();
barcode.setFontName("Monospaced");
barcode.setFontSize(16);
barcode.setModuleWidth(2);
barcode.setBarHeight(50);
barcode.setHumanReadableLocation(HumanReadableLocation.BOTTOM);
barcode.setContent("123456789");

ByteArrayOutputStream stream = new ByteArrayOutputStream();
SvgRenderer renderer = new SvgRenderer(stream, 1, Color.WHITE, Color.BLACK, true);
renderer.render(barcode);

String content = new String(stream.toByteArray(), StandardCharsets.UTF_8);
SVG svg = SVG.getFromString(content);
svg.renderToCanvas(canvas);

GUI Usage

To use the Swing GUI, just run the OkapiUI class. The GUI allows you to explore the supported barcode symbologies and test them with different configurations and data.

Okapi GUI Screenshot

Building

gradlew check: Compiles and runs all quality checks, including the unit tests.
gradlew fuzz: Runs barcode encoding fuzz tests using Jazzer.
gradlew jar: Builds the JAR file.
gradlew publish: Deploys to Maven Central (requires a modified gradle.properties file).

Recent Releases

Okapi Barcode 0.4.9

  • Codablock F: allow user to customize row height
  • Codablock F: allow user to customize module width
  • Codablock F: improve check digit calculation
  • Add optional rotation parameter to all renderers

Okapi Barcode 0.4.8

  • MaxiCode: improve handling of partial and malformed postal codes (modes 2 and 3)
  • Code 11: allow empty content, if user requests it
  • Micro QR Code: allow empty content, if user requests it
  • Micro QR Code: fix last data character ignored during encoding in some scenarios

Okapi Barcode 0.4.7

  • Update build toolchain from Java 17 to Java 21 (minimum target runtime remains Java 8)
  • SVG and EPS output: round up canvas dimensions when using decimal magnification factor
  • MaxiCode: reduce memory use during encoding
  • QR Code: reduce encode time by about 25%

Okapi Barcode 0.4.6

  • QR Code: allow FNC1 escape sequences in user-provided content
  • Code 39 Extended: allow empty content, if user requests it
  • QR Code: allow empty content, if user requests it
  • UPC/EAN: allow empty content, if user requests it
  • Telepen: allow empty content, if user requests it

Okapi Barcode 0.4.5

  • Code 128: allow user to restrict the code sets used to encode data
  • First reproducible build

Okapi Barcode 0.4.4

  • Aztec Code: allow user to restrict sizes to compact or normal Aztec sizes

Okapi Barcode 0.4.3

  • Add support for UPN QR
  • Add support for DPD Code
  • Add support for Swiss QR Code
  • Add support for specifying ECI mode explicitly
  • PDF417: add support for forcing byte compaction mode
  • QR Code: add support for forcing byte compaction mode
  • Code 39 Extended: allow customization of module width ratio
  • PDF417: add support for automatic splitting of structured append symbols

Okapi Barcode 0.4.2

  • PDF417: allow user to request byte compaction
  • QR Code: improved encoding performance and efficiency
  • Code 128: further optimize data encoding in some scenarios
  • QR Code: fix broken Kanji encoding in some corner cases (found via fuzzing)
  • Data Matrix: fix encoding of trailing extended ASCII characters in TEXT/C40 mode (found via fuzzing)
  • Add OkapiInputException and OkapiInternalException, to distinguish user vs. library errors

Okapi Barcode 0.4.1

  • DataBar Expanded: various small fixes and cleanup

Okapi Barcode 0.4.0

  • Update minimum Java runtime requirement from Java 7 to Java 8
  • Update build Java runtime from Java 8 to Java 17
  • Channel Code: fix NullPointerException when channel count not specified
  • MaxiCode: fix handling of custom quiet zones when rendering via Java2DRenderer
  • Code 128: fix encoding of line feeds when combined with lowercase characters (found via fuzzing)
  • Code 128: fix encoding of shifted characters which also use extended encoding (found via fuzzing)
  • Code 128: never try to shift in or out of extended mode while in code set C (found via fuzzing)
  • Code 128: always exit extended mode before switching to code set C (found via fuzzing)
  • Data Matrix: fix incorrect encoding of single ASCII characters within X12 data (found via fuzzing)
  • Refactor to remove most uses of AWT classes in core Okapi classes (for Android users)
  • Rename HumanReadableAlignment to TextAlignment, move it to graphics package (for Android users)

Okapi Barcode 0.3.3

  • GS1 Composite: avoid ArrayIndexOutOfBoundsException in some rare corner cases
  • PDF417: add setContent(byte[]) method for binary data
  • PDF417: when using structured append (Macro PDF417), place padding before control block, not after
  • PDF417: fix auto-calculation of row count when data is very small and column count is specified
  • PDF417: add support for segment count and file name Macro PDF417 optional fields
  • Royal Mail 4-State: fix bug in check digit calculation

Okapi Barcode 0.3.2

  • MSI Plessey: allow empty content
  • MSI Plessey: improve symbol configurability (module width ratio, check digit visibility)
  • Add support for the original Plessey symbology (also known as UK Plessey)

Okapi Barcode 0.3.1

  • Improve build times
  • Code 128: allow empty content
  • All GS1 symbols: improve GS1 AI validations
  • Data Matrix: allow use of GS as the GS1 separator
  • Data Matrix: fix data too long to fit in symbol issue
  • Data Matrix: add trailing data characters to debug logs

Okapi Barcode 0.3.0

  • POSTNET: improve symbol configurability (module width ratio, short and long height percentages)
  • USPS OneCode: improve symbol configurability (module width ratio, short and long height percentages)