どうも、うんちです。
仕事でバーコード(JAN, GS1-128)とQRコードを生成する必要があったのでメモ書きしておきます。
Gem は barby
が必要最低限な機能をいい感じに備えていたので、今回はこれを採用しました。
目次
JANのバーコード生成
JANはEANをもとに作られた仕様なので、EANのライブラリを使うことで生成できます。
出力されるのはバーコードだけのシンプルなものです。
商品パッケージでよく見る数字が食い込んだかっこいいバーコードって作っているんだろう🤔
数字付きのものがほしいときは別途合成させる必要があるので、バーコードをPNGで書き出して mini_magick
などを使って数字を合成させるのが良いかと思います。
↑実際に生成されるバーコード。
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'barby'
end
# 本体
require 'barby'
# JANのバーコード生成にはこれが必要(JANはEANをもとに作られたもの)
require 'barby/barcode/ean_13'
# JANコードは13桁だが、最後の1桁はチェックデジットで自動で計算して保管されるので、先頭の12桁だけ入れればよい。
# チェックデジットを含む13桁を入れてしまうとバリデーションエラーになるので注意。
ean = Barby::EAN13.new('412345678901')
# 出力形式についてこちらに詳しく書いてある
# 参考: https://github.com/toretore/barby/wiki/Outputters
# SVGで書き出す場合はこれが必要
require 'barby/outputter/svg_outputter'
File.open('jan.svg', 'wb') do |f|
f.write Barby::SvgOutputter.new(ean).to_svg(xdim: 1)
end
# PNGで書き出す場合はこれが必要
require 'barby/outputter/png_outputter'
File.open('jan.png', 'wb') do |f|
f.write Barby::PngOutputter.new(ean).to_png(xdim: 1)
end
GS1-128のバーコード生成
GS1-128のバーコードはCODE128という仕様が使われているので、CODE128のライブラリを使うことで生成することができます。
ただし注意点として、GS1-128は純粋なCODE128と区別するためにスタートコードの直後と可変長データの直後に FUNC1
を挿入する必要があります。これがないとバーコードリーダーやシステムによってはGS1-128として扱えず、ロット番号などをパースしないということが発生してしまいます。
このことはこちらのサイトでわかりやすく解説してあります。
GS1-128は、通常のCODE128と区別するため、スタートコード(CODE-A~C)のすぐ後に[FNC1]( ファンクション1)を付加するように決まっています。 アプリケーション識別子の後に続くデータの桁数が可変長である場合にも、データの区切りを表すため、[FNC1]が付加されます。
↑実際に生成されるバーコード。
こちらも数字なしのシンプルなバーコードが生成されます。
数字付きのものがほしいときは別途合成させる必要があるので、バーコードをPNGで書き出して mini_magick
などを使って数字を合成させるのが良いかと思います。
この例ではGTINのみ(16桁)ですが、アプリケーション識別子とともにロット番号など様々な情報を追加することができます。
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'barby'
end
# 本体
require 'barby'
# GS1-128のバーコード生成にはこれが必要(GS1-128はCODE128を使った仕様)
require 'barby/barcode/gs1_128'
# GTINのみでも生成可能
# CODE128と区別するためにFNC1を付与する必要があるので注意
# 参考: https://www.rubydoc.info/github/toretore/barby/Barby/Code128
# 参考: https://www.keyence.co.jp/ss/products/autoid/codereader/basic-gs1.jsp
code128 = Barby::Code128.new("#{Barby::Code128::FNC1}0112345678901234")
# 出力形式についてこちらに詳しく書いてある
# 参考: https://github.com/toretore/barby/wiki/Outputters
# SVGで書き出す場合はこれが必要
require 'barby/outputter/svg_outputter'
File.open('gs1-128.svg', 'wb') do |f|
f.write Barby::SvgOutputter.new(code128).to_svg(xdim: 5)
end
# PNGで書き出す場合はこれが必要
require 'barby/outputter/png_outputter'
File.open('gs1-128.png', 'wb') do |f|
f.write Barby::PngOutputter.new(code128).to_png(xdim: 5)
end
QRコードの生成
↑実際に生成されるQRコード。
barby
を使ってQRコードを生成するには rqrcode
も一緒に追加する必要があります。
2つのgemを使ってやるくらいなら1つのgemで済むものがいいと思い探しましたが、結局このやり方に落ち着きました。
バーコード生成と統一感がでてわかりやすいですし、実際に記述量が増えるわけでもないのでこれでいいと思います。
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'barby'
gem 'rqrcode'
end
# 本体
require 'barby'
# QRコード生成にはこれが必要(別途 gem `rqrcode` が必要なので注意)
require 'barby/barcode/qr_code'
qr_code = Barby::QrCode.new('https://example.com/1234567890')
# 出力形式についてこちらに詳しく書いてある
# 参考: https://github.com/toretore/barby/wiki/Outputters
# SVGで書き出す場合はこれが必要
require 'barby/outputter/svg_outputter'
File.open('qr.svg', 'wb') do |f|
f.write Barby::SvgOutputter.new(qr_code).to_svg(xdim: 1)
end
# PNGで書き出す場合はこれが必要
require 'barby/outputter/png_outputter'
File.open('qr.png', 'wb') do |f|
# 必要なサイズより小さいときはxdimの数値を大きくする
f.write Barby::SvgOutputter.new(qr_code).to_svg(xdim: 1)
end