pdf-wrapper 0.3.1 → 0.3.2

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/CHANGELOG CHANGED
@@ -1,3 +1,14 @@
1
+ v0.3.2 (6th September 2010)
2
+ - fix importing of PDF files as images
3
+ - always imports the first page, currently no support for importing the
4
+ second or subsequent pages
5
+ - PDF::Wrapper#cell() - allow font size to be specified as a range. The
6
+ largest size that fits all the cell text will be used
7
+
8
+ v0.3.1 (24th November 2009)
9
+ - avoid errors being printed to stderr when rendering tables
10
+ - allow manual page sizes to be specified
11
+
1
12
  v0.3.0 (15th October 2009)
2
13
  - remove some deprecated functions from Table
3
14
  - added support for table cells with text and images
@@ -50,11 +61,11 @@ v0.1.1 (Unreleased)
50
61
 
51
62
  v0.1.0 (28th May 2008)
52
63
  - added PDF::Wrapper#translate and PDF::Wrapper#scale
53
- - fixed a bug that caused some text to be rendered off the page when wrapping onto 3rd and
64
+ - fixed a bug that caused some text to be rendered off the page when wrapping onto 3rd and
54
65
  subsequent pages
55
66
  - Improved table support using a new class PDF::Wrapper::Table
56
67
  - Added a :center option to Wrapper#image
57
- - Added a :markup option to text related functions. Pango markup can be used to tweak
68
+ - Added a :markup option to text related functions. Pango markup can be used to tweak
58
69
  text style (bold, italics, super script, etc)
59
70
  - Replaced PDF::Wrapper#rounded_rectangle with the :radius option to PDF::Wrapper#rectangle
60
71
  - Allow cells to have a border with rounded corners
data/Rakefile CHANGED
@@ -8,7 +8,7 @@ require 'spec/rake/spectask'
8
8
  require 'roodi'
9
9
  require 'roodi_task'
10
10
 
11
- PKG_VERSION = "0.3.1"
11
+ PKG_VERSION = "0.3.2"
12
12
  PKG_NAME = "pdf-wrapper"
13
13
  PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
14
14
 
@@ -72,12 +72,16 @@ spec = Gem::Specification.new do |spec|
72
72
  spec.has_rdoc = true
73
73
  spec.extra_rdoc_files = %w{README.rdoc CHANGELOG TODO}
74
74
  spec.rdoc_options << '--title' << 'PDF::Wrapper Documentation' << '--main' << 'README.rdoc' << '-q'
75
- spec.add_dependency 'cairo', '>=1.5.0'
76
75
  spec.author = "James Healy"
77
76
  spec.homepage = "http://pdf-wrapper.rubyforge.org/"
78
77
  spec.email = "jimmy@deefa.com"
79
78
  spec.rubyforge_project = "pdf-wrapper"
80
79
  spec.description = "A unicode aware PDF writing library that uses the ruby bindings to various c libraries ( like cairo, pango, poppler and rsvg ) to do the heavy lifting."
80
+ spec.add_dependency("cairo", "~>1.8")
81
+ #spec.add_dependency("pango")
82
+ #spec.add_dependency("poppler")
83
+ #spec.add_dependency("gdkpixbuf")
84
+ # TODO - add rsvg2
81
85
  end
82
86
 
83
87
  # package the library into a gem
@@ -117,7 +117,7 @@ module PDF
117
117
  # based on a similar function in rabbit. Thanks Kou.
118
118
  load_libpoppler
119
119
  x, y = current_point
120
- page = Poppler::Document.new(filename).get_page(1)
120
+ page = Poppler::Document.new(filename).get_page(0)
121
121
  w, h = page.size
122
122
  width, height = calc_image_dimensions(opts[:width], opts[:height], w, h, opts[:proportional])
123
123
  x, y = calc_image_coords(opts[:left] || x, opts[:top] || y, opts[:width] || w, opts[:height] || h, width, height, opts[:center])
@@ -191,7 +191,7 @@ module PDF
191
191
  case detect_image_type(filename)
192
192
  when :pdf then
193
193
  load_libpoppler
194
- page = Poppler::Document.new(filename).get_page(1)
194
+ page = Poppler::Document.new(filename).get_page(0)
195
195
  return page.size
196
196
  when :png then
197
197
  img_surface = Cairo::ImageSurface.from_png(filename)
@@ -1,6 +1,8 @@
1
1
  module PDF
2
2
  class Wrapper
3
3
 
4
+ DEFAULT_CELL_PADDING = 3
5
+
4
6
  # Change the default font size
5
7
  #
6
8
  # If no block is provided, the change is permanent. If a block
@@ -52,16 +54,24 @@ module PDF
52
54
  # <tt>:border_color</tt>:: What color should the border be?
53
55
  # <tt>:fill_color</tt>:: A background color for the cell. Defaults to none.
54
56
  # <tt>:radius</tt>:: Give the border around the cell rounded corners. Implies :border => "tblr"
57
+ #
58
+ # Unlike with the text() method, the :font_size argument can be a range. The
59
+ # largest size in the range that will fit all the text in the cell will be used.
60
+ #
55
61
  def cell(str, x, y, w, h, opts={})
56
62
  # TODO: add a wrap option so wrapping can be disabled
57
63
  # TODO: add an option for vertical alignment
58
64
  # TODO: allow cell contents to be defined as a block, like link_to in EDGE rails
59
65
 
60
66
  options = default_text_options
61
- options.merge!({:border => "tblr", :border_width => @default_line_width, :border_color => :black, :fill_color => nil, :padding => 3, :radius => nil})
67
+ options.merge!({:border => "tblr", :border_width => @default_line_width, :border_color => :black, :fill_color => nil, :padding => DEFAULT_CELL_PADDING, :radius => nil})
62
68
  options.merge!(opts)
63
69
  options.assert_valid_keys(default_text_options.keys + [:width, :border, :border_width, :border_color, :fill_color, :padding, :radius])
64
70
 
71
+ if options[:font_size] && options[:font_size].is_a?(Range)
72
+ options[:font_size] = best_font_size(str, w, h, options[:font_size], options)
73
+ end
74
+
65
75
  # apply padding
66
76
  textw = w - (options[:padding] * 2)
67
77
  texth = h - (options[:padding] * 2)
@@ -214,6 +224,22 @@ module PDF
214
224
 
215
225
  private
216
226
 
227
+ # calculate the largest font size within range that will fit str in
228
+ # a box with dimensions of height by width.
229
+ #
230
+ # best_font_size("Hello There", 50, 50, 5..9)
231
+ # => 9
232
+ #
233
+ def best_font_size(str, width, height, sizes, options = {})
234
+ cellpadding = DEFAULT_CELL_PADDING * 2
235
+ sizes.map { |size|
236
+ opts = options.only(:markup).merge(:font_size => size)
237
+ h = text_height( str, width, opts )
238
+ h <= height - cellpadding ? size : nil
239
+ }.compact[-1] || sizes.first
240
+ end
241
+
242
+
217
243
  # takes a string and a range of options and creates a pango layout for us. Pango
218
244
  # does all the hard work of calculating text layout, wrapping, fonts, sizes,
219
245
  # direction and more. Thank $diety.
data/lib/pdf/wrapper.rb CHANGED
@@ -6,17 +6,15 @@ require 'pdf/errors'
6
6
  require 'tempfile'
7
7
  require 'fileutils'
8
8
 
9
- require File.dirname(__FILE__) + "/wrapper/graphics"
10
- require File.dirname(__FILE__) + "/wrapper/images"
11
- require File.dirname(__FILE__) + "/wrapper/loading"
12
- require File.dirname(__FILE__) + "/wrapper/text_cell"
13
- require File.dirname(__FILE__) + "/wrapper/text_image_cell"
14
- require File.dirname(__FILE__) + "/wrapper/table"
15
- require File.dirname(__FILE__) + "/wrapper/text"
16
- require File.dirname(__FILE__) + "/wrapper/page"
17
-
18
- require 'rubygems'
19
- gem 'cairo', '>=1.5'
9
+ require "pdf/wrapper/graphics"
10
+ require "pdf/wrapper/images"
11
+ require "pdf/wrapper/loading"
12
+ require "pdf/wrapper/text_cell"
13
+ require "pdf/wrapper/text_image_cell"
14
+ require "pdf/wrapper/table"
15
+ require "pdf/wrapper/text"
16
+ require "pdf/wrapper/page"
17
+
20
18
  require 'cairo'
21
19
 
22
20
  module PDF
data/specs/text_spec.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  require File.dirname(__FILE__) + '/spec_helper'
4
4
 
5
- context "The PDF::Wrapper class" do
5
+ describe PDF::Wrapper do
6
6
 
7
7
  before(:each) { create_pdf }
8
8
 
@@ -168,7 +168,8 @@ context "The PDF::Wrapper class" do
168
168
  opts = {:font_size => 16, :font => "Sans Serif"}
169
169
  @pdf.text(str, opts)
170
170
  @pdf.text_width(str, opts).should eql(131)
171
- @pdf.text_width(str2, opts).should eql(1106)
171
+ (@pdf.text_width(str2, opts) >= 1106).should be_true
172
+ (@pdf.text_width(str2, opts) <= 1107).should be_true
172
173
  end
173
174
 
174
175
  specify "should raise an exception if build_pango_layout is passed anything other than a string" do
@@ -246,4 +247,10 @@ context "The PDF::Wrapper class" do
246
247
  lambda { @pdf.text msg, :wrap => :ponies }.should raise_error(ArgumentError)
247
248
  end
248
249
 
250
+ specify "should determine the largest font size possible that will fit some text in a cell" do
251
+ @pdf.__send__(:best_font_size, "Hello There", 34, 50, 5..9).should eql(9)
252
+ @pdf.__send__(:best_font_size, "<b>Hello There</b>", 34, 50, 5..9, :markup => :pango).should eql(8)
253
+ @pdf.__send__(:best_font_size, "Hello There", 5, 50, 5..9).should eql(5)
254
+ end
255
+
249
256
  end
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdf-wrapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ hash: 23
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 3
9
+ - 2
10
+ version: 0.3.2
5
11
  platform: ruby
6
12
  authors:
7
13
  - James Healy
@@ -9,19 +15,24 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2009-11-24 00:00:00 +11:00
18
+ date: 2010-09-06 00:00:00 +10:00
13
19
  default_executable:
14
20
  dependencies:
15
21
  - !ruby/object:Gem::Dependency
16
22
  name: cairo
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
20
26
  requirements:
21
- - - ">="
27
+ - - ~>
22
28
  - !ruby/object:Gem::Version
23
- version: 1.5.0
24
- version:
29
+ hash: 31
30
+ segments:
31
+ - 1
32
+ - 8
33
+ version: "1.8"
34
+ type: :runtime
35
+ version_requirements: *id001
25
36
  description: A unicode aware PDF writing library that uses the ruby bindings to various c libraries ( like cairo, pango, poppler and rsvg ) to do the heavy lifting.
26
37
  email: jimmy@deefa.com
27
38
  executables: []
@@ -94,21 +105,27 @@ rdoc_options:
94
105
  require_paths:
95
106
  - lib
96
107
  required_ruby_version: !ruby/object:Gem::Requirement
108
+ none: false
97
109
  requirements:
98
110
  - - ">="
99
111
  - !ruby/object:Gem::Version
112
+ hash: 3
113
+ segments:
114
+ - 0
100
115
  version: "0"
101
- version:
102
116
  required_rubygems_version: !ruby/object:Gem::Requirement
117
+ none: false
103
118
  requirements:
104
119
  - - ">="
105
120
  - !ruby/object:Gem::Version
121
+ hash: 3
122
+ segments:
123
+ - 0
106
124
  version: "0"
107
- version:
108
125
  requirements: []
109
126
 
110
127
  rubyforge_project: pdf-wrapper
111
- rubygems_version: 1.3.5
128
+ rubygems_version: 1.3.7
112
129
  signing_key:
113
130
  specification_version: 3
114
131
  summary: A PDF generating library built on top of cairo