sogoumap2pdf 0.0.1

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/History.txt ADDED
@@ -0,0 +1,4 @@
1
+ == 0.0.1 2008-08-19
2
+
3
+ * 1 major enhancement:
4
+ * Initial release
data/License.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 FIXME full name
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Manifest.txt ADDED
@@ -0,0 +1,30 @@
1
+ History.txt
2
+ License.txt
3
+ Manifest.txt
4
+ PostInstall.txt
5
+ README.txt
6
+ Rakefile
7
+ bin/sogoumap2pdf
8
+ config/hoe.rb
9
+ config/requirements.rb
10
+ lib/sogoumap2pdf.rb
11
+ lib/sogoumap2pdf/version.rb
12
+ lib/sogoumap2pdf/image_to_pdf.rb
13
+ lib/sogoumap2pdf/sogou_map_image.rb
14
+ script/console
15
+ script/destroy
16
+ script/generate
17
+ script/txt2html
18
+ setup.rb
19
+ spec/sogoumap2pdf_spec.rb
20
+ spec/spec.opts
21
+ spec/spec_helper.rb
22
+ tasks/deployment.rake
23
+ tasks/environment.rake
24
+ tasks/rspec.rake
25
+ tasks/website.rake
26
+ website/index.html
27
+ website/index.txt
28
+ website/javascripts/rounded_corners_lite.inc.js
29
+ website/stylesheets/screen.css
30
+ website/template.html.erb
data/PostInstall.txt ADDED
@@ -0,0 +1,7 @@
1
+
2
+ For more information on sogoumap2pdf, see http://sogoumap2pdf.rubyforge.org
3
+
4
+ NOTE: Change this information in PostInstall.txt
5
+ You can also delete it if you don't want it.
6
+
7
+
data/README.txt ADDED
@@ -0,0 +1,49 @@
1
+ = sogoumap2pdf
2
+
3
+ * sogoumap2pdf.rubyforge.org
4
+
5
+ == DESCRIPTION:
6
+
7
+ * Download map and convert to pdf
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * Download map and convert to pdf
12
+
13
+
14
+ == SYNOPSIS:
15
+
16
+ sogoumap2pdf link map_width map_height row column save_file_name mode
17
+
18
+ == REQUIREMENTS:
19
+
20
+ * pdf-writer
21
+
22
+ == INSTALL:
23
+
24
+ * sudo gem install sogoumap2pdf
25
+
26
+ == LICENSE:
27
+
28
+ (The MIT License)
29
+
30
+ Copyright (c) 2008 FIXME full name
31
+
32
+ Permission is hereby granted, free of charge, to any person obtaining
33
+ a copy of this software and associated documentation files (the
34
+ 'Software'), to deal in the Software without restriction, including
35
+ without limitation the rights to use, copy, modify, merge, publish,
36
+ distribute, sublicense, and/or sell copies of the Software, and to
37
+ permit persons to whom the Software is furnished to do so, subject to
38
+ the following conditions:
39
+
40
+ The above copyright notice and this permission notice shall be
41
+ included in all copies or substantial portions of the Software.
42
+
43
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
44
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
45
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
46
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
47
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
48
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
49
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require 'config/requirements'
2
+ require 'config/hoe' # setup Hoe + all gem configuration
3
+
4
+ Dir['tasks/**/*.rake'].each { |rake| load rake }
data/bin/sogoumap2pdf ADDED
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created on 2008-8-19.
4
+ # Copyright (c) 2008. All rights reserved.
5
+
6
+ begin
7
+ require 'rubygems'
8
+ rescue LoadError
9
+ # no rubygems to load, so we fail silently
10
+ end
11
+
12
+ require 'optparse'
13
+ require 'sogoumap2pdf'
14
+ include Sogoumap2pdf
15
+ # NOTE: the option -p/--path= is given as an example, and should probably be replaced in your application.
16
+
17
+ OPTIONS = {
18
+ :path => '~'
19
+ }
20
+ MANDATORY_OPTIONS = %w( )
21
+
22
+ parser = OptionParser.new do |opts|
23
+ opts.banner = <<BANNER
24
+ This application is wonderful because...
25
+
26
+ Usage: #{File.basename($0)} [options]
27
+
28
+ Options are:
29
+ BANNER
30
+ opts.separator ""
31
+ opts.on("-p", "--path=PATH", String,
32
+ "The root path for selecting files",
33
+ "Default: ~") { |OPTIONS[:path]| }
34
+ opts.on("-h", "--help",
35
+ "Show this help message.") { puts opts; exit }
36
+ opts.parse!(ARGV)
37
+
38
+ if MANDATORY_OPTIONS && MANDATORY_OPTIONS.find { |option| OPTIONS[option.to_sym].nil? }
39
+ puts opts; exit
40
+ end
41
+ end
42
+
43
+ path = OPTIONS[:path]
44
+
45
+ # do stuff
46
+ g=SogouMapImage.new(ARGV[0], ARGV[6])
47
+ gmpdf=ImageToPdf.new(".JPG")
48
+ xres, yres = gmpdf.perfect_fit(ARGV[1].to_i,ARGV[2].to_i,ARGV[3].to_i,ARGV[4].to_i)
49
+ g.fill_map(xres,yres)
50
+ gmpdf.front_page(g)
51
+ gmpdf.create_pages(g)
52
+ gmpdf.save
data/config/hoe.rb ADDED
@@ -0,0 +1,73 @@
1
+ require 'sogoumap2pdf/version'
2
+
3
+ AUTHOR = 'David Ruan' # can also be an array of Authors
4
+ EMAIL = "ruanwz@gmail.com"
5
+ DESCRIPTION = "download the map and convert to pdf"
6
+ GEM_NAME = 'sogoumap2pdf' # what ppl will type to install your gem
7
+ RUBYFORGE_PROJECT = 'sogoumap2pdf' # The unix name for your project
8
+ HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
9
+ DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
10
+ EXTRA_DEPENDENCIES = [
11
+ ['pdf-writer', '>= 1.1.8']
12
+ ] # An array of rubygem dependencies [name, version]
13
+
14
+ @config_file = "~/.rubyforge/user-config.yml"
15
+ @config = nil
16
+ RUBYFORGE_USERNAME = "ruanwz"
17
+ def rubyforge_username
18
+ unless @config
19
+ begin
20
+ @config = YAML.load(File.read(File.expand_path(@config_file)))
21
+ rescue
22
+ puts <<-EOS
23
+ ERROR: No rubyforge config file found: #{@config_file}
24
+ Run 'rubyforge setup' to prepare your env for access to Rubyforge
25
+ - See http://newgem.rubyforge.org/rubyforge.html for more details
26
+ EOS
27
+ exit
28
+ end
29
+ end
30
+ RUBYFORGE_USERNAME.replace @config["username"]
31
+ end
32
+
33
+
34
+ REV = nil
35
+ # UNCOMMENT IF REQUIRED:
36
+ # REV = YAML.load(`svn info`)['Revision']
37
+ VERS = Sogoumap2pdf::VERSION::STRING + (REV ? ".#{REV}" : "")
38
+ RDOC_OPTS = ['--quiet', '--title', 'sogoumap2pdf documentation',
39
+ "--opname", "index.html",
40
+ "--line-numbers",
41
+ "--main", "README",
42
+ "--inline-source"]
43
+
44
+ class Hoe
45
+ def extra_deps
46
+ @extra_deps.reject! { |x| Array(x).first == 'hoe' }
47
+ @extra_deps
48
+ end
49
+ end
50
+
51
+ # Generate all the Rake tasks
52
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
53
+ $hoe = Hoe.new(GEM_NAME, VERS) do |p|
54
+ p.developer(AUTHOR, EMAIL)
55
+ p.description = DESCRIPTION
56
+ p.summary = DESCRIPTION
57
+ p.url = HOMEPATH
58
+ p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
59
+ p.test_globs = ["test/**/test_*.rb"]
60
+ p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store'] #An array of file patterns to delete on clean.
61
+
62
+ # == Optional
63
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
64
+ #p.extra_deps = EXTRA_DEPENDENCIES
65
+
66
+ #p.spec_extras = {} # A hash of extra values to set in the gemspec.
67
+ end
68
+
69
+ CHANGES = $hoe.paragraphs_of('History.txt', 0..1).join("\\n\\n")
70
+ PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
71
+ $hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
72
+ $hoe.rsync_args = '-av --delete --ignore-errors'
73
+ $hoe.spec.post_install_message = File.open(File.dirname(__FILE__) + "/../PostInstall.txt").read rescue ""
@@ -0,0 +1,15 @@
1
+ require 'fileutils'
2
+ include FileUtils
3
+
4
+ require 'rubygems'
5
+ %w[rake hoe newgem rubigen].each do |req_gem|
6
+ begin
7
+ require req_gem
8
+ rescue LoadError
9
+ puts "This Rakefile requires the '#{req_gem}' RubyGem."
10
+ puts "Installation: gem install #{req_gem} -y"
11
+ exit
12
+ end
13
+ end
14
+
15
+ $:.unshift(File.join(File.dirname(__FILE__), %w[.. lib]))
@@ -0,0 +1,226 @@
1
+ require 'rubygems'
2
+ require 'pdf/writer'
3
+ require 'net/http'
4
+ require 'uri'
5
+ require 'RMagick'
6
+ include Magick
7
+
8
+ module Sogoumap2pdf
9
+ class ImageToPdf
10
+ def initialize(link_end)
11
+ #@page_width=600
12
+ @page_width=1280
13
+ #@page_width=800
14
+ #@page_height=768
15
+ @page_height=1024
16
+ #@page_height=480
17
+ @page_overlap=50
18
+ @text_height=15
19
+ @pdf=PDF::Writer.new(:paper=>[0,0,@page_width,@page_height])
20
+ @pdf.margins_pt(0,0,0,0)
21
+ # initialize icons
22
+ @icon_size=20
23
+ @link_end=link_end
24
+ end
25
+ def big_img_crop(x,y,w,h)
26
+ g=@g
27
+ nx0=x/256
28
+ ny0=y/256
29
+ nxn=(x+w)/256+1
30
+ nyn=(y+h)/256+1
31
+ delta_x=x-nx0*256
32
+ delta_y=y-ny0*256
33
+ p "x #{x}"
34
+ p "y #{y}"
35
+ p "delta_x #{delta_x}"
36
+ p "delta_y #{delta_y}"
37
+ ci=ImageList.new # image list to hold results
38
+ page=Rectangle.new( 0, 0, 0, 0)
39
+
40
+ for i in nx0..nxn
41
+ for j in ny0..nyn
42
+ p "big_img_crop #{i},#{j}"
43
+ picture_file_name="~/.sogoumap/0/"+ [g.resource_type,g.resource_level,((g.start_link_x+i)/200).to_s,((g.start_link_y+j)/200).to_s].join("/")+"/"+(g.start_link_x+i).to_s+"_"+(g.start_link_y+j).to_s+g.link_end
44
+ picture_file_name=File.expand_path(picture_file_name)
45
+ if File.exist?(picture_file_name) && File.size(picture_file_name)!= 0 then
46
+ tumb=ImageList.new.read(picture_file_name)[0] # image list to hold results
47
+ path_file_name="~/.sogoumap/0/"+ ["179",g.resource_level,((g.start_link_x+i)/200).to_s,((g.start_link_y+j)/200).to_s].join("/")+"/"+(g.start_link_x+i).to_s+"_"+(g.start_link_y+j).to_s+".PNG"
48
+ path_file_name=File.expand_path(path_file_name)
49
+
50
+ if g.satellite_path && File.exist?(path_file_name) && File.size(path_file_name)!=0 then
51
+
52
+ path_tumb=ImageList.new.read(path_file_name)[0] # image list to hold results
53
+ tumb.composite!(path_tumb, 0, 0, OverCompositeOp)
54
+ end
55
+
56
+ #append tumb
57
+ ci << tumb
58
+ #update page
59
+ page.x=(i-nx0)*256
60
+ page.y=(nyn-j)*256
61
+ ci.page=page
62
+ else
63
+ end
64
+ end
65
+ end
66
+ if ci.length==0 then
67
+ resimg=ImageList.new.read("NULL:white") { self.size = "#{g.npx*@tumb_x}x#{g.npy*@tumb_y}"}
68
+ else
69
+ resimg=ci.mosaic
70
+ end
71
+ return resimg.crop(SouthWestGravity,delta_x,delta_y,w,h,true)
72
+ end
73
+
74
+ def perfect_fit(nh256,nw256,r,c)
75
+ @row=r
76
+ @column=c
77
+ @tumb_x=@page_width*256/(c*@page_width-(c-1)*@page_overlap)
78
+ @tumb_y=@page_height*256/(r*@page_height-(r-1)*@page_overlap)
79
+ @big_img_width,@big_img_height=c*@page_width-(c-1)*@page_overlap, r*@page_height-(r-1)*@page_overlap
80
+
81
+ if nh256==0 then
82
+ return c*@page_width-(c-1)*@page_overlap, r*@page_height-(r-1)*@page_overlap
83
+ else
84
+ return c*nw256*256, r*nh256*256
85
+ end
86
+ end
87
+ def create_pages(g)
88
+ # get the size of the image
89
+ size_x=@big_img_width
90
+ size_y=@big_img_height
91
+
92
+ # calculate the number of requred rows and columns
93
+ cols=(size_x-@page_overlap)/(@page_width-@page_overlap)
94
+ rows=(size_y-@page_overlap)/(@page_height-@page_overlap)
95
+ # create pdf
96
+ for i in 0...rows
97
+ for j in 0...cols
98
+ p "creating page #{i} #{j}"
99
+ p Time.now
100
+ @pdf.new_page
101
+ @pdf.add_destination("map part #{i},#{j}", "Fit")
102
+ pgimg=big_img_crop(j*(@page_width-@page_overlap),
103
+ (rows-1-i)*(@page_height-@page_overlap),@page_width,@page_height)
104
+
105
+ # pgimg=big_image.crop(j*(@page_width-@page_overlap),
106
+ # i*(@page_height-@page_overlap),@page_width,@page_height,true)
107
+ pgimg.write("itptmp#{@link_end}") { self.quality = 70 }
108
+ @pdf.add_image_from_file("itptmp#{@link_end}",0,0)
109
+ ss = PDF::Writer::StrokeStyle.new(4,:cap=>:round)
110
+ @pdf.stroke_style ss
111
+ if j>0 then
112
+ @pdf.add_internal_link("map part #{i},#{j-1}",0,@page_height/2,
113
+ @icon_size,@page_height/2+@icon_size)
114
+ @pdf.line(@icon_size,@page_height/2,0,@page_height/2+@icon_size/2).stroke
115
+ @pdf.line(0,@page_height/2+@icon_size/2,@icon_size,@page_height/2+@icon_size).stroke
116
+ end
117
+ if j<cols-1 then
118
+ @pdf.add_internal_link("map part #{i},#{j+1}",
119
+ @page_width-@icon_size,@page_height/2,
120
+ @page_width,@page_height/2+@icon_size)
121
+ @pdf.line(@page_width-@icon_size,@page_height/2,
122
+ @page_width,@page_height/2+@icon_size/2).stroke
123
+ @pdf.line(@page_width,@page_height/2+@icon_size/2,
124
+ @page_width-@icon_size,@page_height/2+@icon_size).stroke
125
+ end
126
+ if i>0 then
127
+ @pdf.add_internal_link("map part #{i-1},#{j}",@page_width/2,@page_height,
128
+ @page_width/2+@icon_size,@page_height-@icon_size)
129
+ @pdf.line(@page_width/2,@page_height-@icon_size,
130
+ @page_width/2+@icon_size/2,@page_height).stroke
131
+ @pdf.line(@page_width/2+@icon_size/2,@page_height,
132
+ @page_width/2+@icon_size,@page_height-@icon_size).stroke
133
+ end
134
+ if i<rows-1 then
135
+ @pdf.add_internal_link("map part #{i+1},#{j}",@page_width/2,0,
136
+ @page_width/2+@icon_size,@icon_size)
137
+ @pdf.line(@page_width/2,@icon_size,
138
+ @page_width/2+@icon_size/2,0).stroke
139
+ @pdf.line(@page_width/2+@icon_size/2,0,
140
+ @page_width/2+@icon_size,@icon_size).stroke
141
+ end
142
+ # @pdf.restore_state
143
+ end
144
+ end
145
+ end
146
+ def front_page(g)
147
+ size_x=@big_img_width
148
+ size_y=@big_img_height
149
+ # calculate the number of requred rows and columns
150
+ cols=(size_x-@page_overlap)/(@page_width-@page_overlap)
151
+ rows=(size_y-@page_overlap)/(@page_height-@page_overlap)
152
+
153
+ ci=ImageList.new # image list to hold results
154
+ page=Rectangle.new( 0, 0, 0, 0)
155
+ @g=g
156
+ for i in 0... g.npx
157
+ p "resizing #{i} j"
158
+ for j in 0...g.npy
159
+ picture_file_name="~/.sogoumap/0/"+ [g.resource_type,g.resource_level,((g.start_link_x+i)/200).to_s,((g.start_link_y+j)/200).to_s].join("/")+"/"+(g.start_link_x+i).to_s+"_"+(g.start_link_y+j).to_s+g.link_end
160
+ picture_file_name=File.expand_path(picture_file_name)
161
+ if File.exist?(picture_file_name) && File.size(picture_file_name)!= 0 then
162
+ tumb=ImageList.new.read(picture_file_name)[0] # image list to hold results
163
+
164
+ path_file_name="~/.sogoumap/0/"+ ["179",g.resource_level,((g.start_link_x+i)/200).to_s,((g.start_link_y+j)/200).to_s].join("/")+"/"+(g.start_link_x+i).to_s+"_"+(g.start_link_y+j).to_s+".PNG"
165
+ path_file_name=File.expand_path(path_file_name)
166
+ if g.satellite_path && File.exist?(path_file_name) && File.size(path_file_name)!=0 then
167
+ path_tumb=ImageList.new.read(path_file_name)[0] # image list to hold results
168
+ tumb.composite!(path_tumb, 0, 0, OverCompositeOp)
169
+ end
170
+ #resize each to tumb
171
+ tumb.resize!(@tumb_x,@tumb_y)
172
+ #append tumb
173
+ ci << tumb
174
+ #update page
175
+ page.x=i*@tumb_x
176
+ page.y=(g.npy-1-j)*@tumb_y
177
+ ci.page=page
178
+ else
179
+ end
180
+ end
181
+ end
182
+ #mosaic
183
+ if ci.length==0 then
184
+ p "@tumb_x,@tumb_y"
185
+ p @tumb_x
186
+ p @tumb_y
187
+ p "g.npx,g.npy"
188
+ p g.npx
189
+ p g.npy
190
+ p "#{g.npx*@tumb_x}x#{g.npy*@tumb_y}"
191
+ ## can't work
192
+ resimg=ImageList.new.read("null:white") { self.size = "#{g.npx.to_i*@tumb_x.to_i}x#{g.npy.to_i*@tumb_y.to_i}"}
193
+ else
194
+ resimg=ci.mosaic
195
+ end
196
+ #crop
197
+ #map2pdf.rb:339:in `crop!': bignum too big to convert into `long' (RangeError)
198
+ resimg.crop!(SouthWestGravity,@page_width,@page_height)
199
+ resimg.write("itptmp#{@link_end}"){ self.quality = 70 }
200
+ @pdf.add_image_from_file("itptmp#{@link_end}",0,0)
201
+ ss = PDF::Writer::StrokeStyle.new(2)
202
+ @pdf.stroke_style ss
203
+ for i in 1...cols
204
+ @pdf.line(i*@page_width/cols,0,
205
+ i*@page_width/cols,@page_height).stroke
206
+ end
207
+ for i in 1...rows
208
+ @pdf.line(0,i*@page_height/rows,
209
+ @page_width,i*@page_height/rows).stroke
210
+ end
211
+ for i in 0...rows
212
+ for j in 0...cols
213
+ p "adding #{i} #{j} link in front page"
214
+ p Time.now
215
+ @pdf.add_internal_link("map part #{i},#{j}",
216
+ j*@page_width/cols, @page_height-i*@page_height/rows,
217
+ (j+1)*@page_width/cols, @page_height-(i+1)*@page_height/rows)
218
+ end
219
+ end
220
+ end
221
+ def save()
222
+ #@pdf.save_as("map4eeepc.pdf")
223
+ @pdf.save_as(ARGV[5])
224
+ end
225
+ end
226
+ end