Skip to content

eliasfroehner/ruby-zint

Repository files navigation

ruby-zint

CI

This gem is a Ruby FFI binding for the libzint barcode generation library.

See the documentation for a full API description.

Installation

By default ruby-zint first tries to use libzint installed on the system. If libzint can't be found or if it isn't a supported version, then the zint version, bundled into the gem, is compiled and used. Both install methods can be enforced by using --enable-system-libzint or --disable-system-libzint options, see below.

With libzint source code (recommended)

First install CMake with your package manager (e. g. apt install cmake).

Afterwards install the gem and force builtin libzint:

$ gem install ruby-zint -- --disable-system-libzint

With system libraries

Install the libzint binary with your package manager (e. g. apt install zint or perhaps brew install zint).

Other platforms require building from source.

NOTE: It is assumed that you are using libzint with the version 2.12.

Then install this gem and enforce system libzint:

$ gem install ruby-zint -- --enable-system-libzint

Gemfile

Include gem "ruby-zint" in your Gemfile. Optionally set the install option by running bundler like so:

bundle config build.ruby-zint --enable-system-libzint

PNG support

Please install libpng (e. g. apt install libpng-dev) before installing the gem if you want to use the PNG format.

Usage

require "zint"

barcode = Zint::Barcode.new(value: "Test", symbology: Zint::BARCODE_CODE128)

# Export to file
barcode.to_file(path: "out.png")

# Export file to memory
barcode.to_memory_file(extension: ".png")

# Write from Bitmap to own canvas
require "chunky_png"
png = ChunkyPNG::Image.new(bitmap.width, bitmap.height, ChunkyPNG::Color::TRANSPARENT)
white = ChunkyPNG::Color("white")
black = ChunkyPNG::Color("black")

bitmap = barcode.to_bitmap
bitmap.pixels.each do |pixel|
  png.compose_pixel(pixel.x, pixel.y, (pixel.colour == "1") ? black : white)
end

png.save("out.png")

# Use vector export
vec = Zint::Qr.new(value: "Test").to_vector
png = ChunkyPNG::Image.new(vec.width.to_i, vec.height.to_i, ChunkyPNG::Color::WHITE)
vec.each_rectangle do |rec|
  png.rect(rec.x.to_i, rec.y.to_i,
      rec.x.to_i+rec.width.to_i-1, rec.y.to_i+rec.height.to_i-1,
      ChunkyPNG::Color::BLACK, ChunkyPNG::Color::BLACK)
end
png.save("out.png")

# See also manual: https://zint.org.uk/manual/chapter/5#buffering-symbols-in-memory-vector

# Use file as input
barcode = Zint::Barcode.new(input_file: "/tmp/test.txt")
barcode.to_file(path: "out.png")

# Use of comfort classes

# EAN
ean_barcode = Zint::Eanx.new(value: "012345678912")
ean_barcode.to_file(path: "ean.png")

# Code128
code_128_barcode = Zint::Code128.new(value: "012345678912")
code_128_barcode.to_file(path: "code_128.png")

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/api-walker/ruby-zint.

License

The gem is available as open source under the terms of the MIT License.

Credits

The project is based on the work and ideas of Angel Pizarro's zint. I would also like to say a big thank you to Lars Kanis for his great contributions.