labels 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/.rspec +2 -0
- data/.rvmrc +1 -0
- data/Gemfile +10 -0
- data/README.md +100 -0
- data/Rakefile +17 -0
- data/bin/labels +6 -0
- data/dtd/label.dtd +74 -0
- data/example/label.xml +168 -0
- data/labels.gemspec +36 -0
- data/lib/core_ext/string.rb +15 -0
- data/lib/labels/barcode.rb +39 -0
- data/lib/labels/date.rb +19 -0
- data/lib/labels/document.rb +64 -0
- data/lib/labels/element.rb +29 -0
- data/lib/labels/exec.rb +92 -0
- data/lib/labels/image.rb +24 -0
- data/lib/labels/layer.rb +58 -0
- data/lib/labels/paper.rb +29 -0
- data/lib/labels/pdf/builder.rb +332 -0
- data/lib/labels/shape.rb +35 -0
- data/lib/labels/template.rb +68 -0
- data/lib/labels/text.rb +32 -0
- data/lib/labels/version.rb +10 -0
- data/lib/labels/xml/builder.rb +144 -0
- data/lib/labels/xml/parser.rb +163 -0
- data/lib/labels.rb +27 -0
- data/spec/labels/barcode_spec.rb +17 -0
- data/spec/labels/date_spec.rb +17 -0
- data/spec/labels/document_spec.rb +17 -0
- data/spec/labels/element_spec.rb +17 -0
- data/spec/labels/exec_spec.rb +17 -0
- data/spec/labels/image_spec.rb +17 -0
- data/spec/labels/layer_spec.rb +17 -0
- data/spec/labels/paper_spec.rb +17 -0
- data/spec/labels/pdf/builder_spec.rb +17 -0
- data/spec/labels/shape_spec.rb +17 -0
- data/spec/labels/template_spec.rb +17 -0
- data/spec/labels/text_spec.rb +17 -0
- data/spec/labels/xml/builder_spec.rb +17 -0
- data/spec/labels/xml/parser_spec.rb +17 -0
- data/spec/labels_spec.rb +14 -0
- data/spec/spec_helper.rb +23 -0
- metadata +207 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use ruby-1.9.2-p290@labels --create
|
data/Gemfile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# A RubyGem for creating mailing, shipping, address, barcode and other labels and rendering as PDF's.
|
2
|
+
#
|
3
|
+
# Author:: Aaron Wright (mailto:acwrightdesign@gmail.com)
|
4
|
+
# Copyright:: Copyright (c) 2012 Infinite Token LLC
|
5
|
+
# License:: MIT License
|
6
|
+
|
7
|
+
source "http://rubygems.org"
|
8
|
+
|
9
|
+
# Specify your gem's dependencies in labels.gemspec
|
10
|
+
gemspec
|
data/README.md
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
Labels
|
2
|
+
======
|
3
|
+
|
4
|
+
A RubyGem for creating mailing, shipping, address, barcode and other labels and rendering as PDF's.
|
5
|
+
|
6
|
+
Features:
|
7
|
+
|
8
|
+
* Design mailing, shipping, address, barcode and other labels!
|
9
|
+
* Definition of label layout and design using XML
|
10
|
+
* Support for different layer elements (shape, text, image, barcode, date)
|
11
|
+
and layer ordering
|
12
|
+
* Dynamic replacement of layer content by providing layer
|
13
|
+
data
|
14
|
+
* Rendering (and printing) of label documents as PDF
|
15
|
+
|
16
|
+
Installation
|
17
|
+
------------
|
18
|
+
|
19
|
+
Labels is a RubyGem and can be installed using:
|
20
|
+
|
21
|
+
$ gem install labels
|
22
|
+
|
23
|
+
Layout / Design
|
24
|
+
---------------
|
25
|
+
|
26
|
+
Labels uses a special XML document type to define label layouts and data.
|
27
|
+
It parses XML documents of this type and creates PDF renderings of the document.
|
28
|
+
|
29
|
+
See *example/label.xml* for an example label document and *dtd/label.dtd* for
|
30
|
+
the XML document type definition.
|
31
|
+
|
32
|
+
Usage
|
33
|
+
-----
|
34
|
+
|
35
|
+
The simplest way to use the Labels library is to open an existing label XML file
|
36
|
+
and render the file to PDF:
|
37
|
+
|
38
|
+
label = Labels.open('/path/to/file.xml')
|
39
|
+
label.to_pdf('/path/to/output.pdf')
|
40
|
+
|
41
|
+
To save the document back to XML just do:
|
42
|
+
|
43
|
+
label.to_file('/path/to/file.xml')
|
44
|
+
|
45
|
+
You can also parse a raw labels XML string:
|
46
|
+
|
47
|
+
xml = '<?xml...>'
|
48
|
+
|
49
|
+
label = Labels.parse(xml)
|
50
|
+
label.to_pdf('/path/to/output.pdf')
|
51
|
+
|
52
|
+
Label documents can also be created using the Labels library:
|
53
|
+
|
54
|
+
document = Labels::Document.new
|
55
|
+
|
56
|
+
paper = Labels::Paper.new(Labels::Paper::LETTER)
|
57
|
+
paper.width = 200
|
58
|
+
paper.height = 1000
|
59
|
+
|
60
|
+
template = Labels::Template.new
|
61
|
+
template.title = 'My cool template'
|
62
|
+
template.columns = 3
|
63
|
+
template.rows = 4
|
64
|
+
template.width = 100
|
65
|
+
template.height = 100
|
66
|
+
|
67
|
+
shape = Labels::Shape.new
|
68
|
+
shape.width = 40
|
69
|
+
shape.height = 50
|
70
|
+
shape.fill = true
|
71
|
+
shape.fill_color = '777777'
|
72
|
+
|
73
|
+
document.paper = paper
|
74
|
+
document.template = template
|
75
|
+
document.layers = [shape]
|
76
|
+
|
77
|
+
document.to_file('/path/to/label.xml')
|
78
|
+
document.to_pdf('/path/to/label.pdf')
|
79
|
+
|
80
|
+
See the API documentation for more information...
|
81
|
+
|
82
|
+
Command Line
|
83
|
+
------------
|
84
|
+
|
85
|
+
Labels also provides a command line tool for rendering label XML files:
|
86
|
+
|
87
|
+
$ labels -h
|
88
|
+
Usage: labels [OPTIONS] source target
|
89
|
+
|
90
|
+
-v, --version
|
91
|
+
-h, --help
|
92
|
+
|
93
|
+
Example:
|
94
|
+
|
95
|
+
$ labels ./path/to/label.xml ./path/to/output.pdf
|
96
|
+
|
97
|
+
License
|
98
|
+
-------
|
99
|
+
|
100
|
+
MIT License. See LICENSE file for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# A RubyGem for creating mailing, shipping, address, barcode and other labels and rendering as PDF's.
|
2
|
+
#
|
3
|
+
# Author:: Aaron Wright (mailto:acwrightdesign@gmail.com)
|
4
|
+
# Copyright:: Copyright (c) 2012 Infinite Token LLC
|
5
|
+
# License:: MIT License
|
6
|
+
|
7
|
+
require 'bundler/gem_tasks'
|
8
|
+
|
9
|
+
require 'rspec/core/rake_task'
|
10
|
+
RSpec::Core::RakeTask.new('spec')
|
11
|
+
|
12
|
+
namespace :labels do
|
13
|
+
desc "Start the console"
|
14
|
+
task :console do
|
15
|
+
sh("irb -rubygems -I lib -r labels.rb")
|
16
|
+
end
|
17
|
+
end
|
data/bin/labels
ADDED
data/dtd/label.dtd
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
<!ELEMENT label (paper,template,layers,data)>
|
2
|
+
|
3
|
+
<!ATTLIST paper title CDATA #IMPLIED>
|
4
|
+
<!ELEMENT paper (width,height)>
|
5
|
+
|
6
|
+
<!ATTLIST template title CDATA #IMPLIED>
|
7
|
+
<!ATTLIST template description CDATA #IMPLIED>
|
8
|
+
<!ATTLIST template manufacturer CDATA #IMPLIED>
|
9
|
+
<!ATTLIST template category CDATA #IMPLIED>
|
10
|
+
<!ATTLIST template visible (false|true) #REQUIRED>
|
11
|
+
<!ELEMENT template (width,height,columns,rows,left-margin,right-margin,top-margin,bottom-margin,horizontal-gutter,vertical-gutter,elliptical,corner-radius)>
|
12
|
+
|
13
|
+
<!ELEMENT layers (layer+)>
|
14
|
+
|
15
|
+
<!ATTLIST layer title CDATA #IMPLIED>
|
16
|
+
<!ATTLIST layer type CDATA #REQUIRED>
|
17
|
+
<!ATTLIST layer column CDATA #IMPLIED>
|
18
|
+
<!ATTLIST layer locked (false|true) #REQUIRED>
|
19
|
+
<!ATTLIST layer visible (false|true) #REQUIRED>
|
20
|
+
<!ATTLIST layer resizable CDATA #REQUIRED>
|
21
|
+
<!ELEMENT layer (x,y,width,height,alpha,rotation,content,corner-radius?,elliptical?,fill?,stroke?,fill-color?,stroke-color?,stroke-weight?,font-family?,font-size?,font-color?,bold?,italic?,justification?,fit?,stretch?,symbology?,bar-width?,bar-height?,color?,caption-height?,caption-size?,captioned?,format?)>
|
22
|
+
|
23
|
+
<!ELEMENT data (item+)>
|
24
|
+
|
25
|
+
<!ELEMENT item (key+)>
|
26
|
+
|
27
|
+
<!ATTLIST key name CDATA #REQUIRED>
|
28
|
+
<!ATTLIST key type (string|integer|float|boolean|date) #REQUIRED>
|
29
|
+
<!ELEMENT key (#PCDATA)>
|
30
|
+
|
31
|
+
<!ELEMENT width (#PCDATA)>
|
32
|
+
<!ELEMENT height (#PCDATA)>
|
33
|
+
<!ELEMENT columns (#PCDATA)>
|
34
|
+
<!ELEMENT rows (#PCDATA)>
|
35
|
+
<!ELEMENT left-margin (#PCDATA)>
|
36
|
+
<!ELEMENT right-margin (#PCDATA)>
|
37
|
+
<!ELEMENT top-margin (#PCDATA)>
|
38
|
+
<!ELEMENT bottom-margin (#PCDATA)>
|
39
|
+
<!ELEMENT horizontal-gutter (#PCDATA)>
|
40
|
+
<!ELEMENT vertical-gutter (#PCDATA)>
|
41
|
+
<!ELEMENT elliptical (#PCDATA)>
|
42
|
+
<!ELEMENT corner-radius (#PCDATA)>
|
43
|
+
|
44
|
+
<!ELEMENT x (#PCDATA)>
|
45
|
+
<!ELEMENT y (#PCDATA)>
|
46
|
+
<!ELEMENT alpha (#PCDATA)>
|
47
|
+
<!ELEMENT rotation (#PCDATA)>
|
48
|
+
<!ELEMENT content (#PCDATA)>
|
49
|
+
|
50
|
+
<!ELEMENT fill (#PCDATA)>
|
51
|
+
<!ELEMENT stroke (#PCDATA)>
|
52
|
+
<!ELEMENT fill-color (#PCDATA)>
|
53
|
+
<!ELEMENT stroke-color (#PCDATA)>
|
54
|
+
<!ELEMENT stroke-weight (#PCDATA)>
|
55
|
+
|
56
|
+
<!ELEMENT font-family (#PCDATA)>
|
57
|
+
<!ELEMENT font-size (#PCDATA)>
|
58
|
+
<!ELEMENT font-color (#PCDATA)>
|
59
|
+
<!ELEMENT bold (#PCDATA)>
|
60
|
+
<!ELEMENT italic (#PCDATA)>
|
61
|
+
<!ELEMENT justification (#PCDATA)>
|
62
|
+
|
63
|
+
<!ELEMENT fit (#PCDATA)>
|
64
|
+
<!ELEMENT stretch (#PCDATA)>
|
65
|
+
|
66
|
+
<!ELEMENT symbology (#PCDATA)>
|
67
|
+
<!ELEMENT bar-width (#PCDATA)>
|
68
|
+
<!ELEMENT bar-height (#PCDATA)>
|
69
|
+
<!ELEMENT color (#PCDATA)>
|
70
|
+
<!ELEMENT caption-height (#PCDATA)>
|
71
|
+
<!ELEMENT caption-size (#PCDATA)>
|
72
|
+
<!ELEMENT captioned (#PCDATA)>
|
73
|
+
|
74
|
+
<!ELEMENT format (#PCDATA)>
|
data/example/label.xml
ADDED
@@ -0,0 +1,168 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
2
|
+
<!DOCTYPE label SYSTEM "label.dtd">
|
3
|
+
<label>
|
4
|
+
|
5
|
+
<!-- Paper -->
|
6
|
+
<paper title="Letter">
|
7
|
+
<width>612</width>
|
8
|
+
<height>792</height>
|
9
|
+
</paper>
|
10
|
+
|
11
|
+
<!-- Template -->
|
12
|
+
<template title='Avery 2" x 4" Shipping Labels' description="5163/5263..." manufacturer="Avery" category="Shipping Labels" visible="true">
|
13
|
+
<width>288</width>
|
14
|
+
<height>144</height>
|
15
|
+
<columns>2</columns>
|
16
|
+
<rows>5</rows>
|
17
|
+
<left-margin>13</left-margin>
|
18
|
+
<right-margin>13</right-margin>
|
19
|
+
<top-margin>36</top-margin>
|
20
|
+
<bottom-margin>36</bottom-margin>
|
21
|
+
<horizontal-gutter>0</horizontal-gutter>
|
22
|
+
<vertical-gutter>10</vertical-gutter>
|
23
|
+
<elliptical>false</elliptical>
|
24
|
+
<corner-radius>18</corner-radius>
|
25
|
+
</template>
|
26
|
+
|
27
|
+
<!-- Layers -->
|
28
|
+
<layers>
|
29
|
+
|
30
|
+
<!-- Layer -->
|
31
|
+
<layer title="Shape" type="shape" column="string" locked="false" visible="true" resizable="true">
|
32
|
+
<x>10</x>
|
33
|
+
<y>20</y>
|
34
|
+
<z>0</z>
|
35
|
+
<width>100</width>
|
36
|
+
<height>100</height>
|
37
|
+
<alpha>1.0</alpha>
|
38
|
+
<rotation>35.0</rotation>
|
39
|
+
<content></content>
|
40
|
+
|
41
|
+
<!-- Layer Type - Shape-->
|
42
|
+
<corner-radius>10</corner-radius>
|
43
|
+
<elliptical>false</elliptical>
|
44
|
+
<fill>true</fill>
|
45
|
+
<stroke>true</stroke>
|
46
|
+
<fill-color>666666</fill-color>
|
47
|
+
<stroke-color>000000</stroke-color>
|
48
|
+
<stroke-weight>5</stroke-weight>
|
49
|
+
</layer>
|
50
|
+
|
51
|
+
<layer title="Shape" type="shape" column="string" locked="false" visible="true" resizable="true">
|
52
|
+
<x>15</x>
|
53
|
+
<y>30</y>
|
54
|
+
<z>0</z>
|
55
|
+
<width>120</width>
|
56
|
+
<height>100</height>
|
57
|
+
<alpha>1.0</alpha>
|
58
|
+
<rotation>45</rotation>
|
59
|
+
<content></content>
|
60
|
+
|
61
|
+
<!-- Layer Type - Shape-->
|
62
|
+
<corner-radius>10</corner-radius>
|
63
|
+
<elliptical>false</elliptical>
|
64
|
+
<fill>true</fill>
|
65
|
+
<stroke>true</stroke>
|
66
|
+
<fill-color>3B67A4</fill-color>
|
67
|
+
<stroke-color>7B34A4</stroke-color>
|
68
|
+
<stroke-weight>5</stroke-weight>
|
69
|
+
</layer>
|
70
|
+
|
71
|
+
<!-- Layer -->
|
72
|
+
<layer title="Text" type="text" column="string" locked="false" visible="true" resizable="true">
|
73
|
+
<x>20.0</x>
|
74
|
+
<y>20.0</y>
|
75
|
+
<z>10</z>
|
76
|
+
<width>300.0</width>
|
77
|
+
<height>120.0</height>
|
78
|
+
<alpha>1.0</alpha>
|
79
|
+
<rotation>0.0</rotation>
|
80
|
+
<content>Donec ullamcorper</content>
|
81
|
+
|
82
|
+
<!-- Layer Type - Text-->
|
83
|
+
<font-family>Helvetica</font-family>
|
84
|
+
<font-size>10.0</font-size>
|
85
|
+
<font-color>4F6E7A</font-color>
|
86
|
+
<bold>false</bold>
|
87
|
+
<italic>false</italic>
|
88
|
+
<justification>right</justification> <!-- left|right|center|justify -->
|
89
|
+
</layer>
|
90
|
+
|
91
|
+
<!-- Layer -->
|
92
|
+
<layer title="Image" type="image" column="data" locked="false" visible="true" resizable="true">
|
93
|
+
<x>1.0</x>
|
94
|
+
<y>2.0</y>
|
95
|
+
<z>0</z>
|
96
|
+
<width>20.0</width>
|
97
|
+
<height>10.0</height>
|
98
|
+
<alpha>0.5</alpha>
|
99
|
+
<rotation>10.0</rotation>
|
100
|
+
<content>iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==</content>
|
101
|
+
|
102
|
+
<!-- Layer Type - Image-->
|
103
|
+
<fit>false</fit>
|
104
|
+
<stretch>true</stretch>
|
105
|
+
</layer>
|
106
|
+
|
107
|
+
<!-- Layer -->
|
108
|
+
<layer title="Barcode" type="barcode" column="string" locked="false" visible="true" resizable="true">
|
109
|
+
<x>100.0</x>
|
110
|
+
<y>100.0</y>
|
111
|
+
<z>0</z>
|
112
|
+
<width>200.0</width>
|
113
|
+
<height>40.0</height>
|
114
|
+
<alpha>1.0</alpha>
|
115
|
+
<rotation>0.0</rotation>
|
116
|
+
<content>123456</content>
|
117
|
+
|
118
|
+
<!-- Layer Type - Barcode-->
|
119
|
+
<symbology>Codabar</symbology>
|
120
|
+
<bar-width>20</bar-width>
|
121
|
+
<bar-height>500</bar-height>
|
122
|
+
<color>000000</color>
|
123
|
+
<caption-height>180</caption-height>
|
124
|
+
<caption-size>167</caption-size>
|
125
|
+
<captioned>true</captioned>
|
126
|
+
</layer>
|
127
|
+
|
128
|
+
<!-- Layer -->
|
129
|
+
<layer title="Date" type="date" column="date" locked="0" visible="1" resizable="1">
|
130
|
+
<x>1.0</x>
|
131
|
+
<y>2.0</y>
|
132
|
+
<z>0</z>
|
133
|
+
<width>100.0</width>
|
134
|
+
<height>10.0</height>
|
135
|
+
<alpha>1.0</alpha>
|
136
|
+
<rotation>0.0</rotation>
|
137
|
+
<content>2007-03-01T13:00:00Z</content>
|
138
|
+
|
139
|
+
<!-- Layer Type - Date-->
|
140
|
+
<font-family>Helvetica</font-family>
|
141
|
+
<font-size>10.0</font-size>
|
142
|
+
<font-color>333333</font-color>
|
143
|
+
<bold>false</bold>
|
144
|
+
<italic>false</italic>
|
145
|
+
<underline>false</underline>
|
146
|
+
<justification>left</justification> <!-- left|right|center|justified -->
|
147
|
+
<format>%Y-%m-%d %H:%M:%S</format>
|
148
|
+
</layer>
|
149
|
+
|
150
|
+
<!-- More layers... -->
|
151
|
+
</layers>
|
152
|
+
|
153
|
+
<!-- Data -->
|
154
|
+
<data>
|
155
|
+
|
156
|
+
<!-- Item -->
|
157
|
+
<item>
|
158
|
+
<key name="string">000222111</key>
|
159
|
+
<key name="data">iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==</key>
|
160
|
+
<key name="date">2007-06-01T13:00:00Z</key>
|
161
|
+
<key name="integer">123</key>
|
162
|
+
<key name="float">1.23</key>
|
163
|
+
<key name="boolean">false</key>
|
164
|
+
</item>
|
165
|
+
|
166
|
+
<!-- More items... -->
|
167
|
+
</data>
|
168
|
+
</label>
|
data/labels.gemspec
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# A RubyGem for creating mailing, shipping, address, barcode and other labels and rendering as PDF's.
|
2
|
+
#
|
3
|
+
# Author:: Aaron Wright (mailto:acwrightdesign@gmail.com)
|
4
|
+
# Copyright:: Copyright (c) 2012 Infinite Token LLC
|
5
|
+
# License:: MIT License
|
6
|
+
|
7
|
+
# -*- encoding: utf-8 -*-
|
8
|
+
$:.push File.expand_path("../lib", __FILE__)
|
9
|
+
require "labels/version"
|
10
|
+
|
11
|
+
Gem::Specification.new do |s|
|
12
|
+
s.name = "labels"
|
13
|
+
s.version = Labels::VERSION
|
14
|
+
s.authors = ["Aaron Wright"]
|
15
|
+
s.email = ["acwrightdesign@gmail.com"]
|
16
|
+
s.homepage = ""
|
17
|
+
s.summary = %q{PDF label creation using Ruby}
|
18
|
+
s.description = %q{Labels can help you build and render labels as PDF}
|
19
|
+
|
20
|
+
s.rubyforge_project = "labels"
|
21
|
+
|
22
|
+
s.files = `git ls-files`.split("\n")
|
23
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
24
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
25
|
+
s.require_paths = ["lib"]
|
26
|
+
|
27
|
+
# specify any dependencies here; for example:
|
28
|
+
# s.add_development_dependency "rspec"
|
29
|
+
# s.add_runtime_dependency "rest-client"
|
30
|
+
s.add_development_dependency 'rake'
|
31
|
+
s.add_development_dependency 'rspec'
|
32
|
+
s.add_runtime_dependency 'prawn'
|
33
|
+
s.add_runtime_dependency 'nokogiri'
|
34
|
+
s.add_runtime_dependency 'uuid'
|
35
|
+
s.add_runtime_dependency 'barcodes'
|
36
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# A RubyGem for creating mailing, shipping, address, barcode and other labels and rendering as PDF's.
|
2
|
+
#
|
3
|
+
# Author:: Aaron Wright (mailto:acwrightdesign@gmail.com)
|
4
|
+
# Copyright:: Copyright (c) 2012 Infinite Token LLC
|
5
|
+
# License:: MIT License
|
6
|
+
|
7
|
+
#
|
8
|
+
class String
|
9
|
+
# Convert string to bool
|
10
|
+
def to_bool
|
11
|
+
return true if self == true || self =~ (/(true|t|yes|y|1)$/i)
|
12
|
+
return false if self == false || self.empty? || self =~ (/(false|f|no|n|0)$/i)
|
13
|
+
return false
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# A RubyGem for creating mailing, shipping, address, barcode and other labels and rendering as PDF's.
|
2
|
+
#
|
3
|
+
# Author:: Aaron Wright (mailto:acwrightdesign@gmail.com)
|
4
|
+
# Copyright:: Copyright (c) 2012 Infinite Token LLC
|
5
|
+
# License:: MIT License
|
6
|
+
|
7
|
+
require 'labels/layer'
|
8
|
+
|
9
|
+
require 'barcodes'
|
10
|
+
|
11
|
+
module Labels
|
12
|
+
|
13
|
+
# This class represents barcode layers.
|
14
|
+
# For available symbologies and option descriptions
|
15
|
+
# see the Barcodes RubyGem library.
|
16
|
+
class Barcode < Layer
|
17
|
+
|
18
|
+
# Symbology
|
19
|
+
attr_accessor :symbology
|
20
|
+
|
21
|
+
# Bar width in mils
|
22
|
+
attr_accessor :bar_width
|
23
|
+
|
24
|
+
# Bar height in mils
|
25
|
+
attr_accessor :bar_height
|
26
|
+
|
27
|
+
# Color in hex
|
28
|
+
attr_accessor :color
|
29
|
+
|
30
|
+
# Caption height in mils
|
31
|
+
attr_accessor :caption_height
|
32
|
+
|
33
|
+
# Caption font size in mils
|
34
|
+
attr_accessor :caption_size
|
35
|
+
|
36
|
+
# Whether or not to print caption
|
37
|
+
attr_accessor :captioned
|
38
|
+
end
|
39
|
+
end
|
data/lib/labels/date.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# A RubyGem for creating mailing, shipping, address, barcode and other labels and rendering as PDF's.
|
2
|
+
#
|
3
|
+
# Author:: Aaron Wright (mailto:acwrightdesign@gmail.com)
|
4
|
+
# Copyright:: Copyright (c) 2012 Infinite Token LLC
|
5
|
+
# License:: MIT License
|
6
|
+
|
7
|
+
require 'time'
|
8
|
+
|
9
|
+
require 'labels/text'
|
10
|
+
|
11
|
+
module Labels
|
12
|
+
|
13
|
+
# This class represents date layers.
|
14
|
+
class Date < Text
|
15
|
+
|
16
|
+
# The date formatting
|
17
|
+
attr_accessor :format
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# A RubyGem for creating mailing, shipping, address, barcode and other labels and rendering as PDF's.
|
2
|
+
#
|
3
|
+
# Author:: Aaron Wright (mailto:acwrightdesign@gmail.com)
|
4
|
+
# Copyright:: Copyright (c) 2012 Infinite Token LLC
|
5
|
+
# License:: MIT License
|
6
|
+
|
7
|
+
require 'fileutils'
|
8
|
+
|
9
|
+
require 'labels/paper'
|
10
|
+
require 'labels/template'
|
11
|
+
require 'labels/xml/builder'
|
12
|
+
require 'labels/pdf/builder'
|
13
|
+
|
14
|
+
module Labels
|
15
|
+
|
16
|
+
# This class represents a Labels document.
|
17
|
+
class Document
|
18
|
+
|
19
|
+
# The document Labels::Paper instance
|
20
|
+
attr_accessor :paper
|
21
|
+
|
22
|
+
# The document Labels::Template instance
|
23
|
+
attr_accessor :template
|
24
|
+
|
25
|
+
# An array of document Labels::Layer instances
|
26
|
+
attr_accessor :layers
|
27
|
+
|
28
|
+
# An array of document data
|
29
|
+
attr_accessor :data
|
30
|
+
|
31
|
+
# Creates a new Labels::Document instance with optional content
|
32
|
+
def initialize(paper=nil, template=nil, layers=[], data=[])
|
33
|
+
unless paper.nil?
|
34
|
+
@paper = paper
|
35
|
+
else
|
36
|
+
@paper = Labels::Paper.new(Labels::Paper::LETTER)
|
37
|
+
end
|
38
|
+
|
39
|
+
unless template.nil?
|
40
|
+
@template = template
|
41
|
+
else
|
42
|
+
@template = Labels::Template.new(Labels::Template::DEFAULT)
|
43
|
+
end
|
44
|
+
|
45
|
+
@layers = layers
|
46
|
+
@data = data
|
47
|
+
end
|
48
|
+
|
49
|
+
# Writes document to filename as XML
|
50
|
+
def write(filename)
|
51
|
+
FileUtils.mkdir_p(File.dirname(filename))
|
52
|
+
File.open(filename, 'w') do |file|
|
53
|
+
file.write Labels::XML::Builder.new(self).xml
|
54
|
+
end
|
55
|
+
end
|
56
|
+
alias_method :to_file, :write
|
57
|
+
|
58
|
+
# Render document to filename or string
|
59
|
+
def render(filename=nil)
|
60
|
+
Labels::PDF::Builder.new(self).render(filename)
|
61
|
+
end
|
62
|
+
alias_method :to_pdf, :render
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# A RubyGem for creating mailing, shipping, address, barcode and other labels and rendering as PDF's.
|
2
|
+
#
|
3
|
+
# Author:: Aaron Wright (mailto:acwrightdesign@gmail.com)
|
4
|
+
# Copyright:: Copyright (c) 2012 Infinite Token LLC
|
5
|
+
# License:: MIT License
|
6
|
+
|
7
|
+
module Labels
|
8
|
+
|
9
|
+
# This class is a base class for all document content types
|
10
|
+
class Element
|
11
|
+
|
12
|
+
# Creates a new Labels::Element instance with given arguments
|
13
|
+
def initialize(args=nil)
|
14
|
+
unless args.nil?
|
15
|
+
args.each do |k,v|
|
16
|
+
instance_variable_set("@#{k}", v) unless v.nil?
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Converts instance variables to hash
|
22
|
+
def to_h
|
23
|
+
hash = {}
|
24
|
+
self.instance_variables.each {|var| hash[var.to_s.delete("@").to_sym] = self.instance_variable_get(var) }
|
25
|
+
hash
|
26
|
+
end
|
27
|
+
alias_method :to_hash, :to_h
|
28
|
+
end
|
29
|
+
end
|
data/lib/labels/exec.rb
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
# A RubyGem for creating mailing, shipping, address, barcode and other labels and rendering as PDF's.
|
2
|
+
#
|
3
|
+
# Author:: Aaron Wright (mailto:acwrightdesign@gmail.com)
|
4
|
+
# Copyright:: Copyright (c) 2012 Infinite Token LLC
|
5
|
+
# License:: MIT License
|
6
|
+
|
7
|
+
require 'optparse'
|
8
|
+
|
9
|
+
require 'labels'
|
10
|
+
require 'labels/version'
|
11
|
+
|
12
|
+
module Labels
|
13
|
+
|
14
|
+
# This class is the main handler for the command line tool interface.
|
15
|
+
# It takes command line arguments and options and renders a barcode
|
16
|
+
# using those options.
|
17
|
+
class Exec
|
18
|
+
|
19
|
+
# Array of command line arguments
|
20
|
+
attr_reader :argv
|
21
|
+
|
22
|
+
# The parser instance
|
23
|
+
attr_reader :parser
|
24
|
+
|
25
|
+
# Hash of parsed options
|
26
|
+
attr_reader :options
|
27
|
+
|
28
|
+
# The input source
|
29
|
+
attr_reader :source
|
30
|
+
|
31
|
+
# The output target
|
32
|
+
attr_reader :target
|
33
|
+
|
34
|
+
# Creates a new instance with given command line arguments and options
|
35
|
+
def initialize(argv)
|
36
|
+
@argv = argv
|
37
|
+
@options = {}
|
38
|
+
self._init_parser
|
39
|
+
self._parse!
|
40
|
+
end
|
41
|
+
|
42
|
+
# Runs the command and renders label
|
43
|
+
def run
|
44
|
+
begin
|
45
|
+
document = Labels.open(self.source)
|
46
|
+
|
47
|
+
unless document.nil?
|
48
|
+
unless self.target.nil?
|
49
|
+
document.render(self.target)
|
50
|
+
else
|
51
|
+
puts document.render
|
52
|
+
end
|
53
|
+
end
|
54
|
+
rescue Exception => e
|
55
|
+
puts e.message
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
protected
|
60
|
+
|
61
|
+
# Initializes the option parser instance
|
62
|
+
def _init_parser
|
63
|
+
@parser ||= OptionParser.new do |opts|
|
64
|
+
opts.banner = "Usage: labels [OPTIONS] source target"
|
65
|
+
opts.separator ""
|
66
|
+
opts.on('-v', '--version') { puts self._version ; exit }
|
67
|
+
opts.on('-h', '--help') { puts opts ; exit }
|
68
|
+
opts.separator ""
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
# Parses the command line arguments
|
74
|
+
def _parse!
|
75
|
+
|
76
|
+
begin
|
77
|
+
self.parser.parse!(@argv)
|
78
|
+
rescue
|
79
|
+
puts self.parser.help
|
80
|
+
exit 1
|
81
|
+
end
|
82
|
+
|
83
|
+
@source = self.argv.shift
|
84
|
+
@target = self.argv.shift
|
85
|
+
end
|
86
|
+
|
87
|
+
# Returns the current version
|
88
|
+
def _version
|
89
|
+
"labels #{Labels::VERSION}"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|