Khởi tạo Barcodes với JRuby

Giới thiệu

Ruby cung cấp các giải pháp cho hầu như tất cả các vấn đề chung. Nhưng có một lĩnh vực hơi tụt hậu là Barcodes. Ruby chỉ có các giải pháp để tạo mã QR, mà chắc chắn là phổ biến, nhưng không thích chấp nhận rộng rãi trong ngành công nghiệp. Mã vạch cũ, như Code 128, DataMatrix, và PDF417 được sử dụng rộng rãi hơn ,vậy chúng ta nên làm gì nếu cần thiết để tạo ra một Mã số 128 trong một ứng dụng Ruby / Rails?

May mắn thay, chúng tôi có một giải pháp: JRuby. JRuby cho phép chúng ta tận dụng các thư viện Java tuyệt vời và sử dụng chúng trong các ứng dụng Ruby. Barcode4J là 1 thư viện phổ biến trong thế giới Java để tạo ra mã vạch. Hôm nay, chúng ta sẽ tìm hiểu làm thế nào để tích hợp và sử dụng Barcode4J trong Ruby.

Ghép Barcode4J vào trong ứng dụng của rails

Cấu trúc của Barcode4j khi được đưa vào trong ứng dụng rails sẽ như sau :

barcode4j_rails
  - app
  ...
  - lib
    - barcode4j
      - barcode4j.jar
      ...

Bây giờ chúng tôi có tất cả các tập tin cần thiết tại chỗ, tạo ra một lớp có tên barcode_generator.rb trong thư mục lib với mã sau đây:</br>

# Load all Java libraries related to Barcode4J
Dir.entries("#{Rails.root}/lib/barcode4j").each do |lib|
  require "barcode4j/#{lib}" if lib =~ /\.jar$/
end

require 'java'

# Load all class references
java_import Java::java.io.ByteArrayOutputStream
java_import Java::java.awt.image.BufferedImage
java_import Java::org.krysalis.barcode4j.impl.code128.Code128Bean
java_import Java::org.krysalis.barcode4j.impl.datamatrix.DataMatrixBean
java_import Java::org.krysalis.barcode4j.impl.code39.Code39Bean
java_import Java::org.krysalis.barcode4j.impl.pdf417.PDF417Bean
java_import Java::org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider
java_import Java::org.krysalis.barcode4j.tools.UnitConv

class BarcodeGenerator
  def self.generate(symbology, data)
    # Create a ByteArrayOutputStream object for storing the image
    bos = ByteArrayOutputStream.new

    # Set DPI
    dpi = 160

    bean = nil

    # Set the Canvas object for barcode rendering
    canvas = BitmapCanvasProvider.new(bos, "image/x-png", dpi, BufferedImage::TYPE_BYTE_BINARY, false, 0)

    # Set barcode symbology
    case symbology
    when "code128"
      bean = Code128Bean.new
    when "datamatrix"
      bean = DataMatrixBean.new
    when "code39"
      bean = Code39Bean.new
    when "pdf417"
      bean = PDF417Bean.new
    end

    # Configure the barcode generator
    bean.set_module_width(UnitConv.in2mm(2.8 / dpi))
    bean.do_quiet_zone(true)

    # Generate barcode
    bean.generateBarcode(canvas, data)
    canvas.finish()

    # Convert image to byte array for streaming
    bytes = bos.toByteArray
    bos.close

    return String.from_java_bytes(bytes)
  end
end

Giờ chúng ta đã có class tạo ra các barcode generator. Giờ cần tạo 1initializer trong config/initializers/barcode.rb để load vào trong ứng dụng Rails:

require 'barcode_generator'

Khởi tạo controller với Barcode

Khởi tạo BarcodeController trong thư mục app :

class BarcodesController < ApplicationController
  def index
  end

  def generate
    send_data BarcodeGenerator.generate(params[:symbology], params[:data]), :type => :png, :disposition => 'inline'
  end
end

update config routes cho barcode :

Rails.application.routes.draw do
  root 'barcodes#index'
  get '/barcodes/:symbology' => 'barcodes#generate'
end

tạo view index.html.erb:

<table border="0">
  <tr>
    <td colspan="2"><h2>Barcode Generator</h2></td>
  </tr>
  <tr>
    <td><strong>Data:</strong></td>
    <td><input name="data" id="data" value="Hello World" /></td>
  </tr>
  <tr>
    <td><strong>Symbology:</strong></td>
    <td>
      <select name="symbology" id="symbology">
        <option value="code128">Code 128</option>
        <option value="datamatrix">Datamatrix</option>
        <option value="code39">Code 39</option>
        <option value="pdf417">PDF 417</option>
      </select>
    </td>
  </tr>
  <tr>
    <td colspan="2" align="center"><button name="submit" id="submit">Generate Barcode</button></td>
  </tr>
  <tr>
    <td colspan="2" align="center"><img src="" id="barcode_image"></td>
  </tr>
</table>

<script type="text/javascript">
  $(document).ready(function() {
    $('button#submit').on('click', function() {
      $('img#barcode_image').attr('src', '/barcodes/' + $('select#symbology').val() + '?data=' + $('input#data').val());
    })
  });
</script>

barcode.png

matrix.png

Tài liệu tham khảo