gbdev-pdf_filler 0.2.0 → 0.3.0
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/README.rdoc +31 -12
- data/lib/pdf_filler.rb +14 -0
- data/lib/pdf_filler/book.rb +8 -2
- data/lib/pdf_filler/page.rb +175 -17
- data/lib/pdf_filler/util_methods.rb +2 -1
- data/spec/lib/pdf_book_spec.rb +6 -6
- data/spec/lib/pdf_db_mapper_spec.rb +51 -0
- data/spec/lib/pdf_page_spec.rb +66 -2
- data/spec/spec_helper.rb +50 -1
- data/tasks/build_gem.rake +2 -0
- data/tasks/documentation.rake +1 -1
- metadata +3 -2
data/README.rdoc
CHANGED
@@ -64,18 +64,37 @@ Another alternative is to install pdf_filler as a Rails plugin:
|
|
64
64
|
|
65
65
|
1. You will need a PDF that has form fields to fill.
|
66
66
|
|
67
|
-
2. A
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
67
|
+
2. A writable directory to store the generated PDFs.
|
68
|
+
|
69
|
+
3. For a single page use the Page object?
|
70
|
+
|
71
|
+
// ** Single page **
|
72
|
+
page = GBDev::PDF::Page.new('/path/to/template.pdf')
|
73
|
+
page.set_text(:full_name, 'Wes Hays')
|
74
|
+
page.save_to('/path/to/save.pdf')
|
75
|
+
|
76
|
+
4. For a collection of pages to be added to a single PDF use a Book object.
|
77
|
+
|
78
|
+
book = GBDev::PDF::Book.new
|
79
|
+
|
80
|
+
page1 = GBDev::PDF::Page.new('/path/to/template1.pdf')
|
81
|
+
page1.set_text(:full_name, 'Wes Hays')
|
82
|
+
|
83
|
+
page2 = GBDev::PDF::Page.new('/path/to/template2.pdf')
|
84
|
+
page2.set_text(:full_name, 'Darren Johnson')
|
85
|
+
|
86
|
+
book.add_page(page1)
|
87
|
+
book.add_page(page2)
|
88
|
+
|
89
|
+
book.save_to('/page/to/book.pdf')
|
90
|
+
|
91
|
+
|
92
|
+
Note: You can use the shorter kernel methods PDFPage instead of GBDev::PDF::Page.new. The same goes for PDFBook instead of GBDev::PDF::Book.new.
|
93
|
+
|
94
|
+
Example:
|
95
|
+
|
96
|
+
page = PDFPage('/path/to/template.pdf')
|
97
|
+
book = PDFBook()
|
79
98
|
|
80
99
|
|
81
100
|
== License
|
data/lib/pdf_filler.rb
CHANGED
@@ -15,18 +15,32 @@ Paragraph = Rjb::import('com.lowagie.text.Paragraph')
|
|
15
15
|
AcroFields = Rjb::import('com.lowagie.text.pdf.AcroFields')
|
16
16
|
PdfStamper = Rjb::import('com.lowagie.text.pdf.PdfStamper')
|
17
17
|
HashMap = Rjb::import('java.util.HashMap')
|
18
|
+
Iterator = Rjb::import('java.util.Iterator')
|
18
19
|
|
19
20
|
require 'pdf_filler/util_methods'
|
20
21
|
require 'pdf_filler/page'
|
21
22
|
require 'pdf_filler/book'
|
23
|
+
require 'pdf_filler/pdf_db_mapper'
|
22
24
|
|
23
25
|
|
24
26
|
module Kernel
|
25
27
|
|
28
|
+
# A shortcut kernel method for creating a new PDF Page without having to specify the full path to the page.
|
29
|
+
# Therefore,
|
30
|
+
# * PDFPage(template)
|
31
|
+
# and
|
32
|
+
# * GBDev::PDF::Page.new(template)
|
33
|
+
# are the same thing.
|
26
34
|
def PDFPage(template)
|
27
35
|
GBDev::PDF::Page.new(template)
|
28
36
|
end
|
29
37
|
|
38
|
+
# A shortcut kernel method for creating a new PDF Book without having to specify the full path to the book.
|
39
|
+
# Therefore,
|
40
|
+
# * PDFBook()
|
41
|
+
# and
|
42
|
+
# * GBDev::PDF::Book.new
|
43
|
+
# are the same thing.
|
30
44
|
def PDFBook()
|
31
45
|
GBDev::PDF::Book.new
|
32
46
|
end
|
data/lib/pdf_filler/book.rb
CHANGED
@@ -10,13 +10,15 @@ module GBDev
|
|
10
10
|
end
|
11
11
|
|
12
12
|
# Add a page to the book
|
13
|
+
#
|
14
|
+
# * new_page - The page object of type GBDev::PDF::Page
|
13
15
|
def add_page(new_page)
|
14
16
|
@pages << new_page
|
15
17
|
end
|
16
18
|
|
17
|
-
# Renders the
|
19
|
+
# Renders the PDF Book and saves it to the specified file.
|
18
20
|
#
|
19
|
-
#
|
21
|
+
# * filename - A path to the file to be created.
|
20
22
|
def save_to(filename)
|
21
23
|
dir = File.dirname(filename)
|
22
24
|
temp_dir = [dir, "collection_temp_#{build_random_string}"].join('/')
|
@@ -42,9 +44,13 @@ module GBDev
|
|
42
44
|
FileUtils.rm_rf(temp_dir, {:secure => true})
|
43
45
|
end
|
44
46
|
|
47
|
+
# Renders the PDF Book without saving it to disk and displays it in the browser.
|
45
48
|
def display
|
46
49
|
end
|
47
50
|
|
51
|
+
# Renders the PDF Book, saves it to the specified file and then displays the PDF in the browser.
|
52
|
+
#
|
53
|
+
# * filename - A path to the file to be created.
|
48
54
|
def save_and_display(filename)
|
49
55
|
save(filename)
|
50
56
|
display
|
data/lib/pdf_filler/page.rb
CHANGED
@@ -5,56 +5,214 @@ module GBDev
|
|
5
5
|
# A page that represents a PDF page.
|
6
6
|
class Page
|
7
7
|
|
8
|
+
CHECK_BOX = 'Check Box'
|
9
|
+
COMBO_BOX = 'Combo Box'
|
10
|
+
LIST = 'List'
|
11
|
+
PUSH_BUTTON = 'Push Button'
|
12
|
+
RADIO_BUTTON = 'Radio Button'
|
13
|
+
SIGNATURE = 'Signature'
|
14
|
+
TEXT_FIELD = 'Text Field'
|
15
|
+
NONE = 'None'
|
16
|
+
UNKNOWN = '?'
|
17
|
+
|
8
18
|
# String template : A path to the template file
|
9
19
|
def initialize(template)
|
10
20
|
@template = template
|
11
|
-
|
21
|
+
|
22
|
+
@pdf_fields = {}
|
23
|
+
|
24
|
+
@check_boxes = {}
|
12
25
|
@images = {}
|
26
|
+
@radio_buttons = {}
|
27
|
+
@signature_fields = {}
|
28
|
+
@text_fields = {}
|
13
29
|
end
|
14
30
|
|
15
|
-
#
|
31
|
+
# Returns a hash where the keys are the field names in the template PDF and the values are the field types.
|
32
|
+
def get_pdf_fields
|
33
|
+
return @pdf_fields unless @pdf_fields.empty?
|
34
|
+
|
35
|
+
reader = PdfReader.new(@template)
|
36
|
+
form = reader.getAcroFields()
|
37
|
+
fields = form.getFields()
|
38
|
+
i = fields.keySet().iterator()
|
39
|
+
|
40
|
+
while(i.hasNext())
|
41
|
+
key = i.next()
|
42
|
+
|
43
|
+
case(form.getFieldType(key))
|
44
|
+
when AcroFields.FIELD_TYPE_CHECKBOX
|
45
|
+
@pdf_fields[key.to_string().to_sym] = GBDev::PDF::Page::CHECK_BOX
|
46
|
+
when AcroFields.FIELD_TYPE_COMBO
|
47
|
+
@pdf_fields[key.to_string().to_sym] = GBDev::PDF::Page::COMBO_BOX
|
48
|
+
when AcroFields.FIELD_TYPE_LIST
|
49
|
+
@pdf_fields[key.to_string().to_sym] = GBDev::PDF::Page::LIST
|
50
|
+
when AcroFields.FIELD_TYPE_NONE
|
51
|
+
@pdf_fields[key.to_string().to_sym] = GBDev::PDF::Page::NONE
|
52
|
+
when AcroFields.FIELD_TYPE_PUSHBUTTON
|
53
|
+
@pdf_fields[key.to_string().to_sym] = GBDev::PDF::Page::PUSH_BUTTON
|
54
|
+
when AcroFields.FIELD_TYPE_RADIOBUTTON
|
55
|
+
@pdf_fields[key.to_string().to_sym] = GBDev::PDF::Page::RADIO_BUTTON
|
56
|
+
when AcroFields.FIELD_TYPE_SIGNATURE
|
57
|
+
@pdf_fields[key.to_string().to_sym] = GBDev::PDF::Page::SIGNATURE
|
58
|
+
when AcroFields.FIELD_TYPE_TEXT
|
59
|
+
@pdf_fields[key.to_string().to_sym] = GBDev::PDF::Page::TEXT_FIELD
|
60
|
+
else
|
61
|
+
@pdf_fields[key.to_string().to_sym] = GBDev::PDF::Page::UNKNOWN
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
return @pdf_fields
|
66
|
+
end
|
67
|
+
|
68
|
+
# Returns an array of field states. For example if the field type is a list an array
|
69
|
+
# with all possible choices in the list will be returned.
|
16
70
|
#
|
17
|
-
#
|
18
|
-
|
19
|
-
|
20
|
-
|
71
|
+
# * field_name - The field name to get all the possible states for.
|
72
|
+
def get_field_states(field_name)
|
73
|
+
reader = PdfReader.new(@template)
|
74
|
+
form = reader.getAcroFields()
|
75
|
+
form.getAppearanceStates(field_name.to_s);
|
21
76
|
end
|
22
77
|
|
23
|
-
# Alias for set_text method
|
24
|
-
alias :text :set_text
|
25
78
|
|
26
|
-
# Sets a know
|
79
|
+
# Sets a know checkbox in the PDF template.
|
80
|
+
#
|
81
|
+
# * key - A known checkbox in the PDF.
|
82
|
+
# * value - The checkbox to update.
|
83
|
+
def set_checkbox(key, value)
|
84
|
+
@check_boxes[key] = value
|
85
|
+
end
|
86
|
+
|
87
|
+
# Alias for the set_checkbox method
|
88
|
+
alias :checkbox :set_checkbox
|
89
|
+
|
90
|
+
# NOT WORING YET
|
91
|
+
# Sets a known image area in the PDF template.
|
27
92
|
#
|
28
|
-
# key
|
29
|
-
# value
|
93
|
+
# * key - A known image in the PDF.
|
94
|
+
# * value - The image to apply to the know image area.
|
30
95
|
def set_image(key, value)
|
96
|
+
raise 'Image not working yet'
|
31
97
|
@images[key] = value
|
32
|
-
end
|
98
|
+
end
|
33
99
|
|
34
100
|
# Alias for the set_image method
|
35
|
-
alias :image :set_image
|
101
|
+
alias :image :set_image
|
102
|
+
|
103
|
+
|
104
|
+
# Sets a known radio button in the PDF template.
|
105
|
+
#
|
106
|
+
# * key - A known radio button group in the PDF.
|
107
|
+
# * value - The radio button group to update.
|
108
|
+
def set_radio_button(key, value)
|
109
|
+
@radio_buttons[key] = value
|
110
|
+
end
|
111
|
+
|
112
|
+
# Alias for the set_checkbox method
|
113
|
+
alias :radio_button :set_radio_button
|
114
|
+
|
115
|
+
|
116
|
+
# NOT WORKING YET
|
117
|
+
# Sets a known signature field in the PDF template.
|
118
|
+
#
|
119
|
+
# * key - A known signature field in the PDF.
|
120
|
+
# * value - The value to apply to the know field.
|
121
|
+
def set_signature_field(key, value)
|
122
|
+
raise 'Signature field not working yet'
|
123
|
+
@signature_fields[key] = value
|
124
|
+
end
|
125
|
+
|
126
|
+
# Alias for set_signature_field method
|
127
|
+
alias :signature_field :set_signature_field
|
128
|
+
|
129
|
+
|
130
|
+
# Sets a known text field in the PDF template.
|
131
|
+
#
|
132
|
+
# * key - A known text field in the PDF.
|
133
|
+
# * value - The value to apply to the know field.
|
134
|
+
def set_text_field(key, value)
|
135
|
+
@text_fields[key] = value
|
136
|
+
end
|
137
|
+
|
138
|
+
# Alias for set_text method
|
139
|
+
alias :text_field :set_text_field
|
140
|
+
|
141
|
+
# Maps PDF fields to an ActiveRecord object. The ActiveRecord object must use the
|
142
|
+
# acts_as_pdf_db_mapper module.
|
143
|
+
#
|
144
|
+
# * object - An ActiveRecord object that uses the acts_as_pdf_db_mapper module.
|
145
|
+
def map_to_object(object)
|
146
|
+
if object.methods.include?('mapped_fields')
|
147
|
+
fields = self.get_pdf_fields
|
148
|
+
object.mapped_fields.each do |mapped_field|
|
149
|
+
|
150
|
+
if mapped_field.class.to_s == 'Hash'
|
151
|
+
key_value_pair = mapped_field.first.to_a.flatten
|
152
|
+
key = key_value_pair[0]
|
153
|
+
value = key_value_pair[1]
|
154
|
+
else
|
155
|
+
key = mapped_field
|
156
|
+
value = mapped_field
|
157
|
+
end
|
158
|
+
|
159
|
+
case(fields[key])
|
160
|
+
when GBDev::PDF::Page::CHECK_BOX
|
161
|
+
self.set_checkbox(key, object.send(value))
|
162
|
+
when GBDev::PDF::Page::COMBO_BOX
|
163
|
+
#self.set_combobox(key, object.send(value))
|
164
|
+
when GBDev::PDF::Page::LIST
|
165
|
+
#self.set_list(key, object.send(value))
|
166
|
+
when GBDev::PDF::Page::NONE
|
167
|
+
#self.set_none(key, object.send(value))
|
168
|
+
when GBDev::PDF::Page::PUSH_BUTTON
|
169
|
+
#self.set_push_button(key, object.send(value))
|
170
|
+
when GBDev::PDF::Page::RADIO_BUTTON
|
171
|
+
self.set_radio_button(key, object.send(value))
|
172
|
+
when GBDev::PDF::Page::SIGNATURE
|
173
|
+
self.set_signature_field(key, object.send(value))
|
174
|
+
when GBDev::PDF::Page::TEXT_FIELD
|
175
|
+
self.set_text_field(key, object.send(value))
|
176
|
+
end
|
177
|
+
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
36
182
|
|
37
183
|
# Renders the template with the given data and saves to the given filename path.
|
38
184
|
#
|
39
|
-
#
|
40
|
-
def save_to(filename)
|
185
|
+
# * filename - A path to the file to be created.
|
186
|
+
def save_to(filename)
|
41
187
|
field_cache = HashMap.new
|
42
188
|
reader = PdfReader.new(@template)
|
43
189
|
stamper = PdfStamper.new( reader, FileOutputStream.new(filename) )
|
44
190
|
form = stamper.getAcroFields()
|
45
191
|
form.setFieldCache(field_cache)
|
192
|
+
|
193
|
+
all_fields = {}
|
194
|
+
all_fields.merge!(@check_boxes)
|
195
|
+
all_fields.merge!(@radio_buttons)
|
196
|
+
all_fields.merge!(@signature_fields)
|
197
|
+
all_fields.merge!(@text_fields)
|
46
198
|
|
47
|
-
|
199
|
+
all_fields.each do |field, value|
|
48
200
|
form.setField(field.to_s, value.to_s)
|
49
|
-
end
|
201
|
+
end
|
202
|
+
|
203
|
+
# TODO: do something with @images
|
50
204
|
|
51
205
|
stamper.setFormFlattening(true)
|
52
206
|
stamper.close
|
53
207
|
end
|
54
208
|
|
209
|
+
# Renders the PDF Book without saving it to disk and displays it in the browser.
|
55
210
|
def display
|
56
211
|
end
|
57
212
|
|
213
|
+
# Renders the PDF Page, saves it to the specified file and then displays the PDF in the browser.
|
214
|
+
#
|
215
|
+
# * filename - A path to the file to be created.
|
58
216
|
def save_and_display(filename)
|
59
217
|
save(filename)
|
60
218
|
display
|
data/spec/lib/pdf_book_spec.rb
CHANGED
@@ -9,13 +9,13 @@ describe 'Book' do
|
|
9
9
|
pdf_book = File.expand_path(File.dirname(__FILE__) + '/../output/certs.pdf')
|
10
10
|
|
11
11
|
page1 = GBDev::PDF::Page.new(template_file)
|
12
|
-
page1.
|
12
|
+
page1.set_text_field(:full_name, 'Wes Hays')
|
13
13
|
|
14
14
|
page2 = GBDev::PDF::Page.new(template_file)
|
15
|
-
page2.
|
15
|
+
page2.set_text_field(:full_name, 'Darren Johnson')
|
16
16
|
|
17
17
|
page3 = GBDev::PDF::Page.new(template_file)
|
18
|
-
page3.
|
18
|
+
page3.set_text_field(:full_name, 'John Dell')
|
19
19
|
|
20
20
|
book.add_page(page1)
|
21
21
|
book.add_page(page2)
|
@@ -33,13 +33,13 @@ describe 'Book' do
|
|
33
33
|
pdf_book = File.expand_path(File.dirname(__FILE__) + '/../output/certs.pdf')
|
34
34
|
|
35
35
|
page1 = GBDev::PDF::Page.new(template_file)
|
36
|
-
page1.
|
36
|
+
page1.set_text_field(:full_name, 'Wes Hays')
|
37
37
|
|
38
38
|
page2 = GBDev::PDF::Page.new(template_file)
|
39
|
-
page2.
|
39
|
+
page2.set_text_field(:full_name, 'Darren Johnson')
|
40
40
|
|
41
41
|
page3 = GBDev::PDF::Page.new(template_file)
|
42
|
-
page3.
|
42
|
+
page3.set_text_field(:full_name, 'John Dell')
|
43
43
|
|
44
44
|
book.add_page(page1)
|
45
45
|
book.add_page(page2)
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
2
|
+
|
3
|
+
describe 'PDF_DB_Mapper' do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
Address.create_corpus!
|
7
|
+
end
|
8
|
+
|
9
|
+
after(:each) do
|
10
|
+
Address.destroy_all
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should allow all database columns to be mapped if no :only or :except is specified' do
|
14
|
+
address = Address.first
|
15
|
+
fields_array = address.mapped_fields.collect{|f| f.to_s}.sort
|
16
|
+
fields_array.should == ['id', 'address1', 'address2', 'city', 'state', 'postal_code'].sort
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should only map the fields specified by :only' do
|
20
|
+
address = ClientAddress.first
|
21
|
+
fields_array = address.mapped_fields.collect{|f| f.to_s}.sort
|
22
|
+
fields_array.should == ['city', 'state'].sort
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should map all the fields except the fields specified by :except' do
|
26
|
+
address = ContactAddress.first
|
27
|
+
fields_array = address.mapped_fields.collect{|f| f.to_s}.sort
|
28
|
+
fields_array.should == ['address2', 'city', 'state'].sort
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should include the additional mappings specified by :include' do
|
32
|
+
address = UserAddress.first
|
33
|
+
fields_array = address.mapped_fields.collect{|f| f.class.to_s == 'Hash' ? f.first.to_a.flatten.join('::') : f.to_s}.sort
|
34
|
+
fields_array.should == ['id', 'address1', 'address2', 'city', 'state', 'postal_code','full_address::address'].sort
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should only include the mappings specified by :only_include' do
|
38
|
+
address = FamilyAddress.first
|
39
|
+
fields_array = address.mapped_fields.collect{|f| f.first.to_a.flatten.join('::')}.sort
|
40
|
+
fields_array.should == ['full_address::address'].sort
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should map the specified fields for a single record to a single page' do
|
44
|
+
page = PDFPage(File.expand_path(File.dirname(__FILE__) + '/../templates/address_template.pdf'))
|
45
|
+
address = Address.first
|
46
|
+
page.map_to_object(address)
|
47
|
+
page.save_to(File.expand_path(File.dirname(__FILE__) + '/../output/db_address.pdf'))
|
48
|
+
File.exist?(File.dirname(__FILE__) + '/../output/db_address.pdf').should be_true
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
data/spec/lib/pdf_page_spec.rb
CHANGED
@@ -4,16 +4,80 @@ describe 'Page' do
|
|
4
4
|
|
5
5
|
it 'should create the page and write to the output directory' do
|
6
6
|
page = GBDev::PDF::Page.new(File.expand_path(File.dirname(__FILE__) + '/../templates/certificate_template.pdf'))
|
7
|
-
page.
|
7
|
+
page.set_text_field(:full_name, 'Wes Hays')
|
8
8
|
page.save_to(File.expand_path(File.dirname(__FILE__) + '/../output/wes_hays.pdf'))
|
9
9
|
File.exist?(File.dirname(__FILE__) + '/../output/wes_hays.pdf').should be_true
|
10
10
|
end
|
11
11
|
|
12
12
|
it 'should create the page and write to the output directory with Kernel method' do
|
13
13
|
page = PDFPage(File.expand_path(File.dirname(__FILE__) + '/../templates/certificate_template.pdf'))
|
14
|
-
page.
|
14
|
+
page.set_text_field(:full_name, 'Wes Hays')
|
15
15
|
page.save_to(File.expand_path(File.dirname(__FILE__) + '/../output/wes_hays.pdf'))
|
16
16
|
File.exist?(File.dirname(__FILE__) + '/../output/wes_hays.pdf').should be_true
|
17
17
|
end
|
18
18
|
|
19
|
+
it 'should find all three fields: text field, checkbox and radio buttons' do
|
20
|
+
page = PDFPage(File.expand_path(File.dirname(__FILE__) + '/../templates/form_template.pdf'))
|
21
|
+
fields = page.get_pdf_fields
|
22
|
+
|
23
|
+
fields.has_key?(:full_name).should be_true
|
24
|
+
fields[:full_name].should == GBDev::PDF::Page::TEXT_FIELD
|
25
|
+
|
26
|
+
fields.has_key?(:home_owner).should be_true
|
27
|
+
fields[:home_owner].should == GBDev::PDF::Page::RADIO_BUTTON
|
28
|
+
|
29
|
+
fields.has_key?(:newsletter).should be_true
|
30
|
+
fields[:newsletter].should == GBDev::PDF::Page::CHECK_BOX
|
31
|
+
|
32
|
+
fields.has_key?(:car_types).should be_true
|
33
|
+
fields[:car_types].should == GBDev::PDF::Page::LIST
|
34
|
+
|
35
|
+
fields.has_key?(:sibling_count).should be_true
|
36
|
+
fields[:sibling_count].should == GBDev::PDF::Page::COMBO_BOX
|
37
|
+
|
38
|
+
# fields.has_key?(:owner_signature).should be_true
|
39
|
+
# fields[:owner_signature].should == GBDev::PDF::Page::SIGNATURE
|
40
|
+
#
|
41
|
+
# fields.has_key?(:submit_button).should be_true
|
42
|
+
# fields[:submit_button].should == GBDev::PDF::Page::PUSH_BUTTON
|
43
|
+
#
|
44
|
+
# fields.has_key?(:photo).should be_true
|
45
|
+
# fields[:photo].should == GBDev::PDF::Page::IMAGE
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should find all the valid states for the check box' do
|
49
|
+
page = PDFPage(File.expand_path(File.dirname(__FILE__) + '/../templates/form_template.pdf'))
|
50
|
+
states = page.get_field_states(:newsletter) # Checkbox
|
51
|
+
states.should == ['Yes','Off']
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should find all the valid states for the radio button' do
|
55
|
+
page = PDFPage(File.expand_path(File.dirname(__FILE__) + '/../templates/form_template.pdf'))
|
56
|
+
states = page.get_field_states(:home_owner) # radio button
|
57
|
+
states.should == ['Yes','No','Off'] # Off will not be used but AcroFields returns it anyway.
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should find all the valid states for the list' do
|
61
|
+
page = PDFPage(File.expand_path(File.dirname(__FILE__) + '/../templates/form_template.pdf'))
|
62
|
+
states = page.get_field_states(:car_types) # List
|
63
|
+
states.sort.should == ['Chevy', 'Ford', 'Honda', 'Jeep', 'Toyota'].sort
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should find all the valid states for the combo box' do
|
67
|
+
page = PDFPage(File.expand_path(File.dirname(__FILE__) + '/../templates/form_template.pdf'))
|
68
|
+
states = page.get_field_states(:sibling_count) # List
|
69
|
+
states.sort.should == ['Zero','One','Two','Three','Four','Five','Six','Seven','Eight','Nine','Ten'].sort
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should fill all fields' do
|
73
|
+
page = PDFPage(File.expand_path(File.dirname(__FILE__) + '/../templates/form_template.pdf'))
|
74
|
+
page.set_text_field(:full_name, 'Anna Hays')
|
75
|
+
page.set_checkbox(:home_owner, 'Yes')
|
76
|
+
page.set_checkbox(:newsletter, 'Yes')
|
77
|
+
page.set_checkbox(:car_types, 'Jeep')
|
78
|
+
page.set_checkbox(:sibling_count, 'One')
|
79
|
+
page.save_to(File.expand_path(File.dirname(__FILE__) + '/../output/form_test.pdf'))
|
80
|
+
File.exist?(File.dirname(__FILE__) + '/../output/form_test.pdf').should be_true
|
81
|
+
end
|
82
|
+
|
19
83
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -41,16 +41,65 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
41
41
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
42
42
|
require 'pdf_filler'
|
43
43
|
|
44
|
+
|
45
|
+
module GBDev
|
46
|
+
module TestData
|
47
|
+
module Addresses
|
48
|
+
def create_corpus!
|
49
|
+
create!(:address1 => '111 AAA St', :address2 => 'Suite 444', :city => 'Reno', :state => 'Nevada', :postal_code => '89506')
|
50
|
+
create!(:address1 => '222 BBB St', :address2 => 'Suite 555', :city => 'Sparks', :state => 'Nevada', :postal_code => '89434')
|
51
|
+
create!(:address1 => '333 CCC St', :address2 => 'Suite 666', :city => 'Fernley', :state => 'Nevada', :postal_code => '89408')
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
|
44
58
|
Spec::Runner.configure do |config|
|
45
59
|
config.before(:each) do
|
46
60
|
class Client < ActiveRecord::Base
|
61
|
+
acts_as_pdf_db_mapper :only => [:first_name, :last_name]
|
47
62
|
has_many :addresses, :dependent => :destroy
|
63
|
+
|
64
|
+
def full_name
|
65
|
+
[self.first_name, self.last_name].join(' ')
|
66
|
+
end
|
48
67
|
end
|
49
68
|
|
50
69
|
class Address < ActiveRecord::Base
|
51
|
-
|
70
|
+
acts_as_pdf_db_mapper
|
71
|
+
belongs_to :client
|
72
|
+
extend GBDev::TestData::Addresses
|
52
73
|
end
|
53
74
|
|
75
|
+
class ClientAddress < ActiveRecord::Base
|
76
|
+
set_table_name :addresses
|
77
|
+
acts_as_pdf_db_mapper :only => [:state, :city]
|
78
|
+
end
|
79
|
+
|
80
|
+
class ContactAddress < ActiveRecord::Base
|
81
|
+
set_table_name :addresses
|
82
|
+
acts_as_pdf_db_mapper :except => [:id, :address1, :postal_code]
|
83
|
+
end
|
84
|
+
|
85
|
+
class UserAddress < ActiveRecord::Base
|
86
|
+
set_table_name :addresses
|
87
|
+
acts_as_pdf_db_mapper :include => [{:full_address => :address}]
|
88
|
+
|
89
|
+
def full_address
|
90
|
+
[self.address1, self.address2].join(', ')
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
class FamilyAddress < ActiveRecord::Base
|
95
|
+
set_table_name :addresses
|
96
|
+
acts_as_pdf_db_mapper :only_include => [{:full_address => :address}]
|
97
|
+
|
98
|
+
def full_address
|
99
|
+
[self.address1, self.address2].join(', ')
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
54
103
|
Client.destroy_all
|
55
104
|
Address.destroy_all
|
56
105
|
end
|
data/tasks/build_gem.rake
CHANGED
@@ -27,12 +27,14 @@ begin
|
|
27
27
|
'lib/pdf_filler.rb',
|
28
28
|
'lib/pdf_filler/page.rb',
|
29
29
|
'lib/pdf_filler/book.rb',
|
30
|
+
'lib/pdf_filler/pdf_db_mapper',
|
30
31
|
'lib/pdf_filler/util_methods.rb',
|
31
32
|
'tasks/documentation.rake',
|
32
33
|
'tasks/build_gem.rake',
|
33
34
|
'spec/spec_helper.rb',
|
34
35
|
'spec/lib/pdf_page_spec.rb',
|
35
36
|
'spec/lib/pdf_book_spec.rb',
|
37
|
+
'spec/lib/pdf_db_mapper_spec.rb',
|
36
38
|
'spec/output',
|
37
39
|
'spec/templates/certificate_template.pdf']
|
38
40
|
|
data/tasks/documentation.rake
CHANGED
@@ -4,7 +4,7 @@ require 'rake/rdoctask'
|
|
4
4
|
desc 'Generate documentation for PDF-Filler.'
|
5
5
|
Rake::RDocTask.new do |rdoc|
|
6
6
|
rdoc.rdoc_dir = 'doc/html'
|
7
|
-
rdoc.title = '
|
7
|
+
rdoc.title = 'pdf_filler'
|
8
8
|
rdoc.options << '--line-numbers' << '--inline-source'
|
9
9
|
rdoc.main = 'README.rdoc'
|
10
10
|
rdoc.rdoc_files.include('LICENSE', 'lib/')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gbdev-pdf_filler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wes Hays
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-08-
|
13
|
+
date: 2009-08-03 00:00:00 -07:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -44,6 +44,7 @@ files:
|
|
44
44
|
- lib/pdf_filler/page.rb
|
45
45
|
- lib/pdf_filler/util_methods.rb
|
46
46
|
- spec/lib/pdf_book_spec.rb
|
47
|
+
- spec/lib/pdf_db_mapper_spec.rb
|
47
48
|
- spec/lib/pdf_page_spec.rb
|
48
49
|
- spec/spec_helper.rb
|
49
50
|
- spec/templates/certificate_template.pdf
|