Khởi tạo Barcodes với JRuby
Bài đăng này đã không được cập nhật trong 3 năm
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>
Tài liệu tham khảo
All rights reserved