zebra-zpl 1.0.2 → 1.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +71 -0
- data/CONTRIBUTING.md +49 -0
- data/Gemfile +6 -0
- data/README.md +348 -89
- data/docs/example.rb +290 -0
- data/docs/images/barcode.png +0 -0
- data/docs/images/datamatrix.png +0 -0
- data/docs/images/earth.jpg +0 -0
- data/docs/images/graphics.png +0 -0
- data/docs/images/image.png +0 -0
- data/docs/images/image_inverted.png +0 -0
- data/docs/images/image_manipulation.png +0 -0
- data/docs/images/images.png +0 -0
- data/docs/images/justification.png +0 -0
- data/docs/images/qrcode.png +0 -0
- data/docs/images/rotation.png +0 -0
- data/docs/images/text.png +0 -0
- data/lib/zebra/print_job.rb +19 -17
- data/lib/zebra/zpl.rb +26 -18
- data/lib/zebra/zpl/barcode.rb +29 -12
- data/lib/zebra/zpl/barcode_type.rb +4 -1
- data/lib/zebra/zpl/box.rb +16 -4
- data/lib/zebra/zpl/comment.rb +15 -0
- data/lib/zebra/zpl/datamatrix.rb +76 -0
- data/lib/zebra/zpl/font.rb +1 -1
- data/lib/zebra/zpl/graphic.rb +91 -0
- data/lib/zebra/zpl/image.rb +97 -0
- data/lib/zebra/zpl/label.rb +3 -14
- data/lib/zebra/zpl/pdf417.rb +50 -0
- data/lib/zebra/zpl/qrcode.rb +6 -2
- data/lib/zebra/zpl/raw.rb +25 -0
- data/lib/zebra/zpl/text.rb +44 -20
- data/lib/zebra/zpl/version.rb +1 -1
- data/spec/fixtures/default.jpg +0 -0
- data/spec/spec_helper.rb +6 -2
- data/spec/zebra/print_job_spec.rb +13 -18
- data/spec/zebra/zpl/barcode_spec.rb +70 -63
- data/spec/zebra/zpl/box_spec.rb +27 -31
- data/spec/zebra/zpl/character_set_spec.rb +7 -7
- data/spec/zebra/zpl/comment_spec.rb +18 -0
- data/spec/zebra/zpl/datamatrix_spec.rb +124 -0
- data/spec/zebra/zpl/graphics_spec.rb +227 -0
- data/spec/zebra/zpl/image_spec.rb +146 -0
- data/spec/zebra/zpl/label_spec.rb +41 -53
- data/spec/zebra/zpl/pdf417_spec.rb +108 -0
- data/spec/zebra/zpl/qrcode_spec.rb +92 -92
- data/spec/zebra/zpl/text_spec.rb +60 -55
- data/zebra-zpl.gemspec +12 -12
- metadata +63 -27
@@ -11,6 +11,9 @@ module Zebra
|
|
11
11
|
CODE_AZTEC_PARAMS = "O"
|
12
12
|
CODE_UPS_MAXICODE = "D"
|
13
13
|
CODE_QR = "Q"
|
14
|
+
CODE_UPCA = "U"
|
15
|
+
CODE_UPCE = "9"
|
16
|
+
CODE_EAN13 = "E"
|
14
17
|
|
15
18
|
# Legacy (EPL) bar code suffixes
|
16
19
|
# CODE_39 = "3"
|
@@ -23,7 +26,7 @@ module Zebra
|
|
23
26
|
# CODABAR = "K"
|
24
27
|
|
25
28
|
def self.valid_barcode_type?(type)
|
26
|
-
%w(3 A C K 0 O D Q).include? type
|
29
|
+
%w(3 A C K 0 O D Q U 9 E).include? type
|
27
30
|
end
|
28
31
|
|
29
32
|
def self.validate_barcode_type(type)
|
data/lib/zebra/zpl/box.rb
CHANGED
@@ -5,9 +5,11 @@ module Zebra
|
|
5
5
|
class Box
|
6
6
|
include Printable
|
7
7
|
|
8
|
-
class InvalidLineThickness
|
8
|
+
class InvalidLineThickness < StandardError; end
|
9
|
+
class InvalidRoundingDegree < StandardError; end
|
10
|
+
class InvalidColorError < StandardError; end
|
9
11
|
|
10
|
-
attr_reader :line_thickness, :box_width, :box_height, :width
|
12
|
+
attr_reader :line_thickness, :box_width, :box_height, :width, :color, :rounding_degree
|
11
13
|
|
12
14
|
def line_thickness=(thickness)
|
13
15
|
raise InvalidLineThickness unless thickness.nil? || thickness.to_i.to_s == thickness.to_s
|
@@ -27,10 +29,20 @@ module Zebra
|
|
27
29
|
@box_height = height
|
28
30
|
end
|
29
31
|
|
32
|
+
def rounding_degree=(value)
|
33
|
+
raise InvalidLineThickness unless (1..8).include?(value.to_i)
|
34
|
+
@rounding_degree = value
|
35
|
+
end
|
36
|
+
|
37
|
+
def color=(value)
|
38
|
+
raise InvalidColorError unless %w[B W].include?(value&.upcase)
|
39
|
+
@color = value
|
40
|
+
end
|
41
|
+
|
30
42
|
def to_zpl
|
31
43
|
check_attributes
|
32
|
-
|
33
|
-
"^FO#{x},#{y}^GB#{box_width},#{box_height},#{line_thickness}^FS"
|
44
|
+
puts "The Box class is deprecated. Please switch to the Graphic class (graphic_type = box)." unless ENV['RUBY_ENV'] == 'test'
|
45
|
+
"^FO#{x},#{y}^GB#{box_width},#{box_height},#{line_thickness},#{color},#{rounding_degree}^FS"
|
34
46
|
end
|
35
47
|
|
36
48
|
private
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require "zebra/zpl/printable"
|
2
|
+
|
3
|
+
module Zebra
|
4
|
+
module Zpl
|
5
|
+
class Datamatrix
|
6
|
+
include Printable
|
7
|
+
|
8
|
+
class InvalidOrientationError < StandardError; end
|
9
|
+
class InvalidQualityFactorError < StandardError; end
|
10
|
+
class InvalidSizeError < StandardError; end
|
11
|
+
class InvalidFormatError < StandardError; end
|
12
|
+
class InvalidRatioError < StandardError; end
|
13
|
+
|
14
|
+
attr_reader :symbol_height, :columns, :rows, :format, :aspect_ratio, :width
|
15
|
+
attr_accessor :escape_sequence
|
16
|
+
|
17
|
+
def width=(width)
|
18
|
+
@width = width || 0
|
19
|
+
end
|
20
|
+
|
21
|
+
def orientation=(value)
|
22
|
+
raise InvalidOrientationError unless %w[N R I B].include?(value)
|
23
|
+
@orientation = value
|
24
|
+
end
|
25
|
+
|
26
|
+
def orientation
|
27
|
+
@orientation || 'N'
|
28
|
+
end
|
29
|
+
|
30
|
+
def symbol_height=(height)
|
31
|
+
@symbol_height = height
|
32
|
+
end
|
33
|
+
|
34
|
+
def quality=(level)
|
35
|
+
raise InvalidQualityFactorError unless [0, 50, 80, 100, 140, 200].include?(level.to_i)
|
36
|
+
@quality = level
|
37
|
+
end
|
38
|
+
|
39
|
+
def quality
|
40
|
+
@quality || 200
|
41
|
+
end
|
42
|
+
|
43
|
+
def columns=(n)
|
44
|
+
raise InvalidSizeError unless (9..49).include?(n.to_i)
|
45
|
+
@columns = n
|
46
|
+
end
|
47
|
+
|
48
|
+
def rows=(n)
|
49
|
+
raise InvalidSizeError unless (9..49).include?(n.to_i)
|
50
|
+
@rows = n
|
51
|
+
end
|
52
|
+
|
53
|
+
def format=(value)
|
54
|
+
raise InvalidFormatError unless (0..6).include?(value.to_i)
|
55
|
+
@format = value
|
56
|
+
end
|
57
|
+
|
58
|
+
def aspect_ratio=(value)
|
59
|
+
raise InvalidRatioError unless [1, 2].include?(value.to_i)
|
60
|
+
@aspect_ratio = value
|
61
|
+
end
|
62
|
+
|
63
|
+
def to_zpl
|
64
|
+
check_attributes
|
65
|
+
"^FW#{rotation}^FO#{x},#{y}^BY,,10^BX#{orientation},#{symbol_height},#{quality},#{columns},#{rows},#{format},#{escape_sequence},#{aspect_ratio}^FD#{data}^FS"
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def check_attributes
|
71
|
+
super
|
72
|
+
raise MissingAttributeError.new("the symbol height to be used is not given") unless @symbol_height
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/lib/zebra/zpl/font.rb
CHANGED
@@ -0,0 +1,91 @@
|
|
1
|
+
require "zebra/zpl/printable"
|
2
|
+
|
3
|
+
module Zebra
|
4
|
+
module Zpl
|
5
|
+
class Graphic
|
6
|
+
include Printable
|
7
|
+
|
8
|
+
class InvalidGraphicType < StandardError; end
|
9
|
+
class InvalidLineThickness < StandardError; end
|
10
|
+
class InvalidColorError < StandardError; end
|
11
|
+
class InvalidOrientationError < StandardError; end
|
12
|
+
class InvalidRoundingDegree < StandardError; end
|
13
|
+
class InvalidSymbolType < StandardError; end
|
14
|
+
|
15
|
+
attr_reader :graphic_type, :graphic_width, :graphic_height, :line_thickness, :color, :orientation, :rounding_degree, :symbol_type
|
16
|
+
|
17
|
+
BOX = "B"
|
18
|
+
CIRCLE = "C"
|
19
|
+
DIAGONAL = "D"
|
20
|
+
ELLIPSE = "E"
|
21
|
+
SYMBOL = "S"
|
22
|
+
|
23
|
+
def graphic_type=(type)
|
24
|
+
raise InvalidGraphicType unless %w(E B D C S).include? type
|
25
|
+
@graphic_type = type
|
26
|
+
end
|
27
|
+
|
28
|
+
def graphic_width=(width)
|
29
|
+
@graphic_width = width
|
30
|
+
end
|
31
|
+
|
32
|
+
def graphic_height=(height)
|
33
|
+
@graphic_height = height
|
34
|
+
end
|
35
|
+
|
36
|
+
def line_thickness=(thickness)
|
37
|
+
raise InvalidLineThickness unless thickness.nil? || thickness.to_i.to_s == thickness.to_s
|
38
|
+
@line_thickness = thickness
|
39
|
+
end
|
40
|
+
|
41
|
+
def color=(value)
|
42
|
+
raise InvalidColorError unless %w[B W].include?(value&.upcase)
|
43
|
+
@color = value
|
44
|
+
end
|
45
|
+
|
46
|
+
def orientation=(value)
|
47
|
+
raise InvalidOrientationError unless %w[R L].include?(value&.upcase)
|
48
|
+
@orientation = value
|
49
|
+
end
|
50
|
+
|
51
|
+
def rounding_degree=(value)
|
52
|
+
raise InvalidRoundingDegree unless (0..8).include?(value.to_i)
|
53
|
+
@rounding_degree = value
|
54
|
+
end
|
55
|
+
|
56
|
+
def symbol_type=(value)
|
57
|
+
raise InvalidSymbolType unless %w[A B C D E].include?(value.upcase)
|
58
|
+
@symbol_type = value
|
59
|
+
end
|
60
|
+
|
61
|
+
def to_zpl
|
62
|
+
check_attributes
|
63
|
+
graphic = case graphic_type
|
64
|
+
when "B"
|
65
|
+
"B#{graphic_width},#{graphic_height},#{line_thickness},#{color},#{rounding_degree}"
|
66
|
+
when "C"
|
67
|
+
"C#{graphic_width},#{line_thickness},#{color}"
|
68
|
+
when "D"
|
69
|
+
"D#{graphic_width},#{graphic_height},#{line_thickness},#{color},#{orientation}"
|
70
|
+
when "E"
|
71
|
+
"E#{graphic_width},#{graphic_height},#{line_thickness},#{color}"
|
72
|
+
when "S"
|
73
|
+
sym = !symbol_type.nil? ? "^FD#{symbol_type}" : ''
|
74
|
+
"S,#{graphic_height},#{graphic_width}#{sym}"
|
75
|
+
end
|
76
|
+
"^FW#{rotation}^FO#{x},#{y}^G#{graphic}^FS"
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def has_data?
|
82
|
+
false
|
83
|
+
end
|
84
|
+
|
85
|
+
def check_attributes
|
86
|
+
super
|
87
|
+
raise InvalidGraphicType if @graphic_type.nil?
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module Zebra
|
2
|
+
module Zpl
|
3
|
+
class Image
|
4
|
+
include Printable
|
5
|
+
|
6
|
+
class InvalidSizeError < StandardError; end
|
7
|
+
class InvalidRotationError < StandardError; end
|
8
|
+
class InvalidThresholdError < StandardError; end
|
9
|
+
|
10
|
+
attr_reader :path
|
11
|
+
attr_writer :invert, :compress
|
12
|
+
|
13
|
+
def path=(p)
|
14
|
+
@img = Img2Zpl::Image.open(p)
|
15
|
+
@path = @img.path
|
16
|
+
end
|
17
|
+
|
18
|
+
def source
|
19
|
+
@img
|
20
|
+
end
|
21
|
+
|
22
|
+
alias src source
|
23
|
+
|
24
|
+
def width=(value)
|
25
|
+
raise InvalidSizeError.new('Invalid image width') unless value.to_i.positive?
|
26
|
+
@width = value.to_i
|
27
|
+
end
|
28
|
+
|
29
|
+
def width
|
30
|
+
@width || @img.width
|
31
|
+
end
|
32
|
+
|
33
|
+
def height=(value)
|
34
|
+
raise InvalidSizeError.new('Invalid image height') unless value.to_i.positive?
|
35
|
+
@height = value.to_i
|
36
|
+
end
|
37
|
+
|
38
|
+
def height
|
39
|
+
@height || @img.height
|
40
|
+
end
|
41
|
+
|
42
|
+
def rotation=(rot)
|
43
|
+
raise InvalidRotationError unless (true if Float(rot) rescue false)
|
44
|
+
@rotation = rot
|
45
|
+
end
|
46
|
+
|
47
|
+
def rotation
|
48
|
+
@rotation || 0
|
49
|
+
end
|
50
|
+
|
51
|
+
def black_threshold=(value)
|
52
|
+
raise InvalidThresholdError.new('Invalid black threshold') unless value.to_f >= 0 && value.to_f <= 1
|
53
|
+
@black_threshold = value.to_f
|
54
|
+
end
|
55
|
+
|
56
|
+
def black_threshold
|
57
|
+
@black_threshold || 0.5
|
58
|
+
end
|
59
|
+
|
60
|
+
def invert
|
61
|
+
@invert || false
|
62
|
+
end
|
63
|
+
|
64
|
+
def compress
|
65
|
+
@compress || true
|
66
|
+
end
|
67
|
+
|
68
|
+
def to_zpl
|
69
|
+
check_attributes
|
70
|
+
modify
|
71
|
+
graphics = @img.to_zpl(
|
72
|
+
black_threshold: black_threshold,
|
73
|
+
invert: invert,
|
74
|
+
compress: compress
|
75
|
+
)
|
76
|
+
"^FO#{x},#{y}#{graphics}"
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def has_data?
|
82
|
+
false
|
83
|
+
end
|
84
|
+
|
85
|
+
def modify
|
86
|
+
@img.resize("#{width}x#{height}") if @width || @height
|
87
|
+
@img.rotate(@rotation) if @rotation
|
88
|
+
end
|
89
|
+
|
90
|
+
def check_attributes
|
91
|
+
super
|
92
|
+
raise MissingAttributeError.new("the path is invalid or not given") unless @path
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
data/lib/zebra/zpl/label.rb
CHANGED
@@ -9,34 +9,24 @@ module Zebra
|
|
9
9
|
|
10
10
|
attr_writer :copies
|
11
11
|
attr_reader :elements, :tempfile
|
12
|
-
attr_accessor :width, :length, :
|
12
|
+
attr_accessor :width, :length, :print_speed
|
13
13
|
|
14
14
|
def initialize(options = {})
|
15
15
|
options.each_pair { |key, value| self.__send__("#{key}=", value) if self.respond_to?("#{key}=") }
|
16
16
|
@elements = []
|
17
17
|
end
|
18
18
|
|
19
|
-
def length_and_gap=(length_and_gap)
|
20
|
-
self.length = length_and_gap[0]
|
21
|
-
self.gap = length_and_gap[1]
|
22
|
-
end
|
23
|
-
|
24
19
|
def print_speed=(s)
|
25
|
-
raise InvalidPrintSpeedError unless (0..
|
20
|
+
raise InvalidPrintSpeedError unless (0..14).include?(s)
|
26
21
|
@print_speed = s
|
27
22
|
end
|
28
23
|
|
29
|
-
def print_density=(d)
|
30
|
-
raise InvalidPrintDensityError unless (0..6).include?(d)
|
31
|
-
@print_density = d
|
32
|
-
end
|
33
|
-
|
34
24
|
def copies
|
35
25
|
@copies || 1
|
36
26
|
end
|
37
27
|
|
38
28
|
def <<(element)
|
39
|
-
element.width = self.width
|
29
|
+
element.width = self.width if element.respond_to?("width=") && element.width.nil?
|
40
30
|
elements << element
|
41
31
|
end
|
42
32
|
|
@@ -75,7 +65,6 @@ module Zebra
|
|
75
65
|
end
|
76
66
|
|
77
67
|
def persist
|
78
|
-
# debugger
|
79
68
|
tempfile = Tempfile.new "zebra_label"
|
80
69
|
dump_contents tempfile
|
81
70
|
tempfile.close
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require "zebra/zpl/printable"
|
2
|
+
|
3
|
+
module Zebra
|
4
|
+
module Zpl
|
5
|
+
class PDF417
|
6
|
+
include Printable
|
7
|
+
|
8
|
+
class InvalidScaleFactorError < StandardError; end
|
9
|
+
class InvalidSecurityLevelError < StandardError; end
|
10
|
+
class InvalidRowColumnNumberError < StandardError; end
|
11
|
+
|
12
|
+
attr_reader :row_height, :security_level, :column_number, :row_number, :truncate
|
13
|
+
|
14
|
+
def row_height=(value)
|
15
|
+
@row_height = value
|
16
|
+
end
|
17
|
+
|
18
|
+
def row_number=(value)
|
19
|
+
raise InvalidRowColumnNumberError unless (3..90).include?(value.to_i)
|
20
|
+
@row_number = value
|
21
|
+
end
|
22
|
+
|
23
|
+
def column_number=(value)
|
24
|
+
raise InvalidRowColumnNumberError unless (1..30).include?(value.to_i)
|
25
|
+
@column_number = value
|
26
|
+
end
|
27
|
+
|
28
|
+
def truncate=(value)
|
29
|
+
@truncate = value
|
30
|
+
end
|
31
|
+
|
32
|
+
def security_level=(value)
|
33
|
+
raise InvalidSecurityLevelError unless (0..8).include?(value.to_i)
|
34
|
+
@security_level = value
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_zpl
|
38
|
+
check_attributes
|
39
|
+
"^FO#{x},#{y}^BY,,10^B7#{rotation},#{row_height},#{security_level},#{column_number},#{row_number},#{truncate} ^FD #{data} ^FS"
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def check_attributes
|
45
|
+
super
|
46
|
+
raise InvalidRowColumnNumberError if !@row_number.nil? && !@column_number.nil? && @row_number.to_i * @column_number.to_i > 928
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/zebra/zpl/qrcode.rb
CHANGED
@@ -8,7 +8,11 @@ module Zebra
|
|
8
8
|
class InvalidScaleFactorError < StandardError; end
|
9
9
|
class InvalidCorrectionLevelError < StandardError; end
|
10
10
|
|
11
|
-
attr_reader :scale_factor, :correction_level
|
11
|
+
attr_reader :scale_factor, :correction_level, :width
|
12
|
+
|
13
|
+
def width=(width)
|
14
|
+
@width = width || 0
|
15
|
+
end
|
12
16
|
|
13
17
|
def scale_factor=(value)
|
14
18
|
raise InvalidScaleFactorError unless (1..99).include?(value.to_i)
|
@@ -22,7 +26,7 @@ module Zebra
|
|
22
26
|
|
23
27
|
def to_zpl
|
24
28
|
check_attributes
|
25
|
-
|
29
|
+
"^FW#{rotation}^FO#{x},#{y}^BY,,10^BQN,2,#{scale_factor},,3^FD#{correction_level}A,#{data}^FS"
|
26
30
|
end
|
27
31
|
|
28
32
|
private
|