labels 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|