一次元/二次元バーコードを生成する for Ruby

  • 16
    Like
  • 0
    Comment
More than 1 year has passed since last update.

中古の二次元バーコードリーダ(AT10Q-SM)を購入したので、バーコード生成方法について調べてみました。
Rubyで1次元バーコードや2次元バーコード(QRコード)を生成する方法を説明します。今回はbarbyライブラリを利用してバーコードを生成します。

下記のデモアプリの作成のためにいろいろ調べた結果を残します。

今回は文字列を埋め込める二次元バーコード(QRコード)と一次元バーコード(code128)を生成する方法について例示します。

環境

環境とライブラリは下記のとおりです。

  • Ruby 2.3.1
  • barby 0.6.4
  • rqrcode 0.10.1
  • chunky_png 1.3.7
Gemfile
source "https://rubygems.org"
gem 'barby'
gem 'rqrcode'
gem 'chunky_png'

二次元バーコード(QRコード)

いわゆるQRコードを生成します。PNGとbase64で出力します。
パラメータとして指定するsize(バージョン)とlevel(誤り訂正レベル)はQRコードとは?に詳しく記載されています。

qrcode.rb
require 'barby/barcode/qr_code'
require 'barby/outputter/png_outputter'

# パラメータ
content = 'show ip route' # QRコードの中身
size    = 3 # QRコードのバージョン 1〜40
level   = :m # 誤り訂正レベル, l/m/q/h
xdim    = 3  # 一番細いバーの幅

# QRコード生成
qrcode = Barby::QrCode.new(content, size: size, level: level)

# PNGで出力
png_file = 'output.png' # 出力PNGファイル名
File.open(png_file, 'wb') do |f| 
  f.write qrcode.to_png(xdim: xdim)
end

# HTMLのimgタグ用のbase64で出力
puts qrcode.to_image(xdim: xdim).to_data_url

実行結果

QRコードをPNG画像ファイルとして生成します。
output.png

HTML向けにbase64としても出力しています。

base64の出力結果
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGsAAABrAQAAAABYxEGhAAABaUlEQVR4nMVTMWrDMBSV7IC61M5qsLEhJ8imgMHZco4eIZ46xTKdm9yg98hWQcDaegU5NmSN08WCOqq6JaGt/tT+7aHH1/vv/+foy5IOuqr/gxw7PHLEqMOYWclEHynSj0GpPwAfYUbcbtsinoBUiXqNJHgEzX57vYSaKdPcZZm0kxUekygnswKP7ORMn1UVzZuN1nbrxLBcpLivMR7sZHqI+zoXkyMByBBBzuOzkmga2sl0ss52JxqVVQPSfJdu/Ph5VtvJ053fo6LjTKR2GSR9mMvSGKIl4ESRJ4a1aMaqBQzYnlRifF7OAW686bg6GJ/P4rvX287DnoYrJZ9eAWSEXkRrfD4i124dd/co8P1wswB0zpCnKt3JYgsIrEk3CvAiORFAYL/S3XpCej9MdA0xEyHu23IGWIopanxOiz6zazZFkpVqcsIBZBO9gNHkHgM0m3TzxvfRewVYikl3hpa99CjgkP4IfgKDDKGqCDKCLwAAAABJRU5ErkJggg==

base64出力結果は、下記のようにHTMLのimgタグのsrc属性に指定すると、HTMLに画像を埋め込むことができます。

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGsAAABrAQAAAABYxEGhAAABaUlEQVR4nMVTMWrDMBSV7IC61M5qsLEhJ8imgMHZco4eIZ46xTKdm9yg98hWQcDaegU5NmSN08WCOqq6JaGt/tT+7aHH1/vv/+foy5IOuqr/gxw7PHLEqMOYWclEHynSj0GpPwAfYUbcbtsinoBUiXqNJHgEzX57vYSaKdPcZZm0kxUekygnswKP7ORMn1UVzZuN1nbrxLBcpLivMR7sZHqI+zoXkyMByBBBzuOzkmga2sl0ss52JxqVVQPSfJdu/Ph5VtvJ053fo6LjTKR2GSR9mMvSGKIl4ESRJ4a1aMaqBQzYnlRifF7OAW686bg6GJ/P4rvX287DnoYrJZ9eAWSEXkRrfD4i124dd/co8P1wswB0zpCnKt3JYgsIrEk3CvAiORFAYL/S3XpCej9MdA0xEyHu23IGWIopanxOiz6zazZFkpVqcsIBZBO9gNHkHgM0m3TzxvfRewVYikl3hpa99CjgkP4IfgKDDKGqCDKCLwAAAABJRU5ErkJggg==" />

一次元バーコード

code128Bで一次元バーコードを生成します。

code128.rb
require 'barby/barcode/code_128'
require 'barby/outputter/png_outputter'

# パラメータ
content = 'show ip route' # QRコードの中身
xdim    = 3  # 一番細いバーの幅

code128 = Barby::Code128B.new(content)

# PNGで出力
png_file = 'code128.png' # 出力PNGファイル名
File.open(png_file, 'wb') do |f|
  f.write code128.to_png(xdim: xdim)
end 

# HTMLのimgタグ用のbase64で出力
puts code128.to_image(xdim: xdim).to_data_url

実行結果

一次元バーコードがPNG画像ファイルで生成されます。code128B形式の場合、数字以外に英文字も入力できます。
code128.png

base64の出力結果
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAioAAAB4AQAAAAD0kuTLAAAAv0lEQVR4nO3PwQ2CQBQE0P+RxD2BBUDcNjhBSUoBbtYC0JKWE21goADhtCaYb7YFwwHjzG0yyUsmkjXiIlolYMB8x7TjTKNV4/zSUpBVOVe5UfFUaVH6VvGhfZiwck2cFu+wcm4KfQ81vhLX7fZOgQEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAHzg0yZJZQZnyX7njsyfhA3WL+krmffn508y6MNqzQkU7cLqwy260+hLheSptzeKTB/xXwA+KOEbO4XACgAAAAASUVORK5CYII=

参考