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à ...
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_awidth(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>