prawn 0.12.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (282) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +2 -2
  3. data/Gemfile +18 -0
  4. data/LICENSE +1 -1
  5. data/README.md +17 -4
  6. data/Rakefile +18 -22
  7. data/data/images/indexed_color.dat +0 -0
  8. data/data/images/indexed_color.png +0 -0
  9. data/data/pdfs/nested_pages.pdf +13 -13
  10. data/lib/pdf/core.rb +35 -0
  11. data/lib/{prawn → pdf}/core/annotations.rb +6 -7
  12. data/lib/{prawn → pdf}/core/byte_string.rb +1 -1
  13. data/lib/{prawn → pdf}/core/destinations.rb +23 -23
  14. data/lib/{prawn → pdf}/core/document_state.rb +8 -8
  15. data/lib/pdf/core/filter_list.rb +51 -0
  16. data/lib/pdf/core/filters.rb +36 -0
  17. data/lib/pdf/core/graphics_state.rb +68 -0
  18. data/lib/{prawn → pdf}/core/literal_string.rb +1 -1
  19. data/lib/{prawn → pdf}/core/name_tree.rb +14 -2
  20. data/lib/{prawn → pdf}/core/object_store.rb +80 -24
  21. data/lib/pdf/core/outline.rb +315 -0
  22. data/lib/{prawn → pdf}/core/page.rb +23 -26
  23. data/lib/{prawn/document → pdf/core}/page_geometry.rb +11 -21
  24. data/lib/{prawn → pdf}/core/pdf_object.rb +48 -32
  25. data/lib/{prawn → pdf}/core/reference.rb +35 -44
  26. data/lib/pdf/core/stream.rb +98 -0
  27. data/lib/{prawn → pdf}/core/text.rb +24 -17
  28. data/lib/prawn.rb +95 -17
  29. data/lib/prawn/compatibility.rb +66 -26
  30. data/lib/prawn/document.rb +48 -30
  31. data/lib/prawn/document/bounding_box.rb +3 -3
  32. data/lib/prawn/document/column_box.rb +46 -8
  33. data/lib/prawn/document/graphics_state.rb +10 -73
  34. data/lib/prawn/document/internals.rb +24 -23
  35. data/lib/prawn/document/snapshot.rb +6 -7
  36. data/lib/prawn/document/span.rb +10 -10
  37. data/lib/prawn/encoding.rb +7 -7
  38. data/lib/prawn/errors.rb +18 -29
  39. data/lib/prawn/font.rb +64 -28
  40. data/lib/prawn/font/afm.rb +32 -74
  41. data/lib/prawn/font/dfont.rb +2 -2
  42. data/lib/prawn/font/ttf.rb +28 -57
  43. data/lib/prawn/font_metric_cache.rb +45 -0
  44. data/lib/prawn/graphics.rb +307 -41
  45. data/lib/prawn/graphics/cap_style.rb +3 -3
  46. data/lib/prawn/graphics/color.rb +12 -5
  47. data/lib/prawn/graphics/dash.rb +52 -31
  48. data/lib/prawn/graphics/join_style.rb +7 -7
  49. data/lib/prawn/graphics/patterns.rb +137 -0
  50. data/lib/prawn/graphics/transformation.rb +9 -9
  51. data/lib/prawn/graphics/transparency.rb +1 -1
  52. data/lib/prawn/image_handler.rb +30 -0
  53. data/lib/prawn/images.rb +86 -105
  54. data/lib/prawn/images/image.rb +48 -0
  55. data/lib/prawn/images/jpg.rb +14 -10
  56. data/lib/prawn/images/png.rb +50 -37
  57. data/lib/prawn/layout.rb +2 -2
  58. data/lib/prawn/layout/grid.rb +51 -51
  59. data/lib/prawn/measurement_extensions.rb +5 -5
  60. data/lib/prawn/measurements.rb +25 -21
  61. data/lib/prawn/outline.rb +4 -308
  62. data/lib/prawn/repeater.rb +8 -8
  63. data/lib/prawn/security.rb +50 -36
  64. data/lib/prawn/soft_mask.rb +94 -0
  65. data/lib/prawn/stamp.rb +3 -3
  66. data/lib/prawn/table.rb +292 -118
  67. data/lib/prawn/table/cell.rb +272 -45
  68. data/lib/prawn/table/cell/image.rb +70 -0
  69. data/lib/prawn/table/cell/in_table.rb +2 -2
  70. data/lib/prawn/table/cell/span_dummy.rb +92 -0
  71. data/lib/prawn/table/cell/subtable.rb +2 -2
  72. data/lib/prawn/table/cell/text.rb +42 -24
  73. data/lib/prawn/table/cells.rb +137 -48
  74. data/lib/prawn/text.rb +35 -23
  75. data/lib/prawn/text/box.rb +18 -5
  76. data/lib/prawn/text/formatted.rb +5 -4
  77. data/lib/prawn/text/formatted/arranger.rb +292 -0
  78. data/lib/prawn/text/formatted/box.rb +52 -13
  79. data/lib/prawn/text/formatted/fragment.rb +37 -22
  80. data/lib/prawn/text/formatted/line_wrap.rb +286 -0
  81. data/lib/prawn/text/formatted/parser.rb +14 -6
  82. data/lib/prawn/text/formatted/wrap.rb +151 -0
  83. data/lib/prawn/utilities.rb +44 -0
  84. data/manual/basic_concepts/adding_pages.rb +27 -0
  85. data/manual/basic_concepts/basic_concepts.rb +34 -0
  86. data/manual/basic_concepts/creation.rb +39 -0
  87. data/manual/basic_concepts/cursor.rb +33 -0
  88. data/manual/basic_concepts/measurement.rb +25 -0
  89. data/manual/basic_concepts/origin.rb +38 -0
  90. data/manual/basic_concepts/other_cursor_helpers.rb +40 -0
  91. data/manual/bounding_box/bounding_box.rb +39 -0
  92. data/manual/bounding_box/bounds.rb +49 -0
  93. data/manual/bounding_box/canvas.rb +24 -0
  94. data/manual/bounding_box/creation.rb +23 -0
  95. data/manual/bounding_box/indentation.rb +46 -0
  96. data/manual/bounding_box/nesting.rb +45 -0
  97. data/manual/bounding_box/russian_boxes.rb +40 -0
  98. data/manual/bounding_box/stretchy.rb +31 -0
  99. data/manual/document_and_page_options/background.rb +27 -0
  100. data/manual/document_and_page_options/document_and_page_options.rb +31 -0
  101. data/manual/document_and_page_options/metadata.rb +23 -0
  102. data/manual/document_and_page_options/page_margins.rb +38 -0
  103. data/manual/document_and_page_options/page_size.rb +34 -0
  104. data/manual/example_file.rb +116 -0
  105. data/manual/example_helper.rb +411 -0
  106. data/manual/example_package.rb +53 -0
  107. data/manual/example_section.rb +46 -0
  108. data/manual/graphics/circle_and_ellipse.rb +22 -0
  109. data/manual/graphics/color.rb +24 -0
  110. data/manual/graphics/common_lines.rb +28 -0
  111. data/manual/graphics/fill_and_stroke.rb +42 -0
  112. data/manual/graphics/fill_rules.rb +37 -0
  113. data/manual/graphics/gradients.rb +37 -0
  114. data/manual/graphics/graphics.rb +58 -0
  115. data/manual/graphics/helper.rb +24 -0
  116. data/manual/graphics/line_width.rb +35 -0
  117. data/manual/graphics/lines_and_curves.rb +41 -0
  118. data/manual/graphics/polygon.rb +29 -0
  119. data/manual/graphics/rectangle.rb +21 -0
  120. data/manual/graphics/rotate.rb +28 -0
  121. data/manual/graphics/scale.rb +41 -0
  122. data/manual/graphics/soft_masks.rb +46 -0
  123. data/manual/graphics/stroke_cap.rb +31 -0
  124. data/manual/graphics/stroke_dash.rb +48 -0
  125. data/manual/graphics/stroke_join.rb +30 -0
  126. data/manual/graphics/translate.rb +29 -0
  127. data/manual/graphics/transparency.rb +35 -0
  128. data/manual/images/absolute_position.rb +23 -0
  129. data/manual/images/fit.rb +21 -0
  130. data/manual/images/horizontal.rb +25 -0
  131. data/manual/images/images.rb +40 -0
  132. data/manual/images/plain_image.rb +18 -0
  133. data/manual/images/scale.rb +22 -0
  134. data/manual/images/vertical.rb +28 -0
  135. data/manual/images/width_and_height.rb +25 -0
  136. data/manual/layout/boxes.rb +27 -0
  137. data/manual/layout/content.rb +25 -0
  138. data/manual/layout/layout.rb +28 -0
  139. data/manual/layout/simple_grid.rb +23 -0
  140. data/manual/manual/cover.rb +35 -0
  141. data/manual/manual/foreword.rb +85 -0
  142. data/manual/manual/how_to_read_this_manual.rb +41 -0
  143. data/manual/manual/manual.rb +35 -0
  144. data/manual/outline/add_subsection_to.rb +61 -0
  145. data/manual/outline/insert_section_after.rb +47 -0
  146. data/manual/outline/outline.rb +32 -0
  147. data/manual/outline/sections_and_pages.rb +67 -0
  148. data/manual/repeatable_content/page_numbering.rb +54 -0
  149. data/manual/repeatable_content/repeatable_content.rb +31 -0
  150. data/manual/repeatable_content/repeater.rb +55 -0
  151. data/manual/repeatable_content/stamp.rb +41 -0
  152. data/manual/security/encryption.rb +31 -0
  153. data/manual/security/permissions.rb +38 -0
  154. data/manual/security/security.rb +28 -0
  155. data/manual/syntax_highlight.rb +52 -0
  156. data/manual/table/basic_block.rb +53 -0
  157. data/manual/table/before_rendering_page.rb +26 -0
  158. data/manual/table/cell_border_lines.rb +24 -0
  159. data/manual/table/cell_borders_and_bg.rb +31 -0
  160. data/manual/table/cell_dimensions.rb +30 -0
  161. data/manual/table/cell_text.rb +38 -0
  162. data/manual/table/column_widths.rb +30 -0
  163. data/manual/table/content_and_subtables.rb +39 -0
  164. data/manual/table/creation.rb +27 -0
  165. data/manual/table/filtering.rb +36 -0
  166. data/manual/table/flow_and_header.rb +17 -0
  167. data/manual/table/image_cells.rb +33 -0
  168. data/manual/table/position.rb +29 -0
  169. data/manual/table/row_colors.rb +20 -0
  170. data/manual/table/span.rb +30 -0
  171. data/manual/table/style.rb +22 -0
  172. data/manual/table/table.rb +52 -0
  173. data/manual/table/width.rb +27 -0
  174. data/manual/templates/full_template.rb +25 -0
  175. data/manual/templates/page_template.rb +48 -0
  176. data/manual/templates/templates.rb +27 -0
  177. data/manual/text/alignment.rb +44 -0
  178. data/manual/text/color.rb +24 -0
  179. data/manual/text/column_box.rb +32 -0
  180. data/manual/text/fallback_fonts.rb +37 -0
  181. data/manual/text/font.rb +41 -0
  182. data/manual/text/font_size.rb +45 -0
  183. data/manual/text/font_style.rb +23 -0
  184. data/manual/text/formatted_callbacks.rb +60 -0
  185. data/manual/text/formatted_text.rb +54 -0
  186. data/manual/text/free_flowing_text.rb +51 -0
  187. data/manual/text/group.rb +29 -0
  188. data/manual/text/inline.rb +43 -0
  189. data/manual/text/kerning_and_character_spacing.rb +39 -0
  190. data/manual/text/leading.rb +25 -0
  191. data/manual/text/line_wrapping.rb +41 -0
  192. data/manual/text/paragraph_indentation.rb +26 -0
  193. data/manual/text/positioned_text.rb +38 -0
  194. data/manual/text/registering_families.rb +48 -0
  195. data/manual/text/rendering_and_color.rb +37 -0
  196. data/manual/text/right_to_left_text.rb +43 -0
  197. data/manual/text/rotation.rb +43 -0
  198. data/manual/text/single_usage.rb +37 -0
  199. data/manual/text/text.rb +75 -0
  200. data/manual/text/text_box_excess.rb +32 -0
  201. data/manual/text/text_box_extensions.rb +45 -0
  202. data/manual/text/text_box_overflow.rb +44 -0
  203. data/manual/text/utf8.rb +28 -0
  204. data/{examples/m17n → manual/text}/win_ansi_charset.rb +14 -10
  205. data/prawn.gemspec +18 -12
  206. data/spec/acceptance/png.rb +23 -0
  207. data/spec/annotations_spec.rb +16 -32
  208. data/spec/bounding_box_spec.rb +128 -15
  209. data/spec/cell_spec.rb +169 -38
  210. data/spec/column_box_spec.rb +33 -0
  211. data/spec/destinations_spec.rb +5 -5
  212. data/spec/document_spec.rb +150 -104
  213. data/spec/extensions/encoding_helpers.rb +10 -0
  214. data/spec/extensions/mocha.rb +1 -0
  215. data/spec/filters_spec.rb +34 -0
  216. data/spec/font_metric_cache_spec.rb +52 -0
  217. data/spec/font_spec.rb +183 -97
  218. data/spec/formatted_text_arranger_spec.rb +43 -43
  219. data/spec/formatted_text_box_spec.rb +30 -20
  220. data/spec/formatted_text_fragment_spec.rb +8 -8
  221. data/spec/graphics_spec.rb +158 -69
  222. data/spec/grid_spec.rb +15 -15
  223. data/spec/image_handler_spec.rb +42 -0
  224. data/spec/images_spec.rb +49 -24
  225. data/spec/inline_formatted_text_parser_spec.rb +73 -19
  226. data/spec/jpg_spec.rb +4 -4
  227. data/spec/line_wrap_spec.rb +26 -26
  228. data/spec/measurement_units_spec.rb +6 -6
  229. data/spec/name_tree_spec.rb +21 -21
  230. data/spec/object_store_spec.rb +39 -39
  231. data/spec/outline_spec.rb +93 -53
  232. data/spec/pdf_object_spec.rb +88 -86
  233. data/spec/png_spec.rb +31 -28
  234. data/spec/reference_spec.rb +32 -32
  235. data/spec/repeater_spec.rb +25 -11
  236. data/spec/security_spec.rb +44 -12
  237. data/spec/snapshot_spec.rb +8 -9
  238. data/spec/soft_mask_spec.rb +117 -0
  239. data/spec/span_spec.rb +10 -15
  240. data/spec/spec_helper.rb +25 -8
  241. data/spec/stamp_spec.rb +29 -30
  242. data/spec/stream_spec.rb +58 -0
  243. data/spec/stroke_styles_spec.rb +36 -18
  244. data/spec/table/span_dummy_spec.rb +17 -0
  245. data/spec/table_spec.rb +697 -105
  246. data/spec/template_spec.rb +108 -54
  247. data/spec/text_at_spec.rb +18 -17
  248. data/spec/text_box_spec.rb +111 -62
  249. data/spec/text_rendering_mode_spec.rb +5 -5
  250. data/spec/text_spacing_spec.rb +4 -4
  251. data/spec/text_spec.rb +57 -49
  252. data/spec/transparency_spec.rb +5 -5
  253. metadata +421 -213
  254. data/data/fonts/Action Man.dfont +0 -0
  255. data/data/fonts/Activa.ttf +0 -0
  256. data/data/fonts/Chalkboard.ttf +0 -0
  257. data/data/fonts/DejaVuSans.ttf +0 -0
  258. data/data/fonts/Dustismo_Roman.ttf +0 -0
  259. data/data/fonts/comicsans.ttf +0 -0
  260. data/data/fonts/gkai00mp.ttf +0 -0
  261. data/data/images/rails.dat +0 -0
  262. data/data/images/rails.png +0 -0
  263. data/examples/bounding_box/russian_boxes.rb +0 -37
  264. data/examples/example_helper.rb +0 -11
  265. data/examples/general/context_sensitive_headers.rb +0 -38
  266. data/examples/graphics/cmyk.rb +0 -13
  267. data/examples/graphics/gradient.rb +0 -23
  268. data/examples/graphics/png_types.rb +0 -23
  269. data/examples/graphics/remote_images.rb +0 -13
  270. data/examples/m17n/full_win_ansi_character_list.rb +0 -20
  271. data/examples/m17n/sjis.rb +0 -29
  272. data/examples/table/bill.rb +0 -54
  273. data/examples/table/header.rb +0 -15
  274. data/examples/text/font_calculations.rb +0 -92
  275. data/examples/text/hyphenation.rb +0 -45
  276. data/examples/text/indent_paragraphs.rb +0 -24
  277. data/lib/prawn/core.rb +0 -85
  278. data/lib/prawn/core/text/formatted/arranger.rb +0 -294
  279. data/lib/prawn/core/text/formatted/line_wrap.rb +0 -273
  280. data/lib/prawn/core/text/formatted/wrap.rb +0 -153
  281. data/lib/prawn/graphics/gradient.rb +0 -84
  282. data/lib/prawn/security/arcfour.rb +0 -51
@@ -7,7 +7,6 @@
7
7
  # This is free software. Please see the LICENSE and COPYING files for details.
8
8
 
9
9
  require "stringio"
10
- require "prawn/document/page_geometry"
11
10
  require "prawn/document/bounding_box"
12
11
  require "prawn/document/column_box"
13
12
  require "prawn/document/internals"
@@ -52,8 +51,8 @@ module Prawn
52
51
  #
53
52
  class Document
54
53
  include Prawn::Document::Internals
55
- include Prawn::Core::Annotations
56
- include Prawn::Core::Destinations
54
+ include PDF::Core::Annotations
55
+ include PDF::Core::Destinations
57
56
  include Prawn::Document::Snapshot
58
57
  include Prawn::Document::GraphicsState
59
58
  include Prawn::Document::Security
@@ -61,6 +60,7 @@ module Prawn
61
60
  include Prawn::Graphics
62
61
  include Prawn::Images
63
62
  include Prawn::Stamp
63
+ include Prawn::SoftMask
64
64
 
65
65
  # Any module added to this array will be included into instances of
66
66
  # Prawn::Document at the per-object level. These will also be inherited by
@@ -136,8 +136,10 @@ module Prawn
136
136
  # <tt>:compress</tt>:: Compresses content streams before rendering them [false]
137
137
  # <tt>:optimize_objects</tt>:: Reduce number of PDF objects in output, at expense of render time [false]
138
138
  # <tt>:background</tt>:: An image path to be used as background on all pages [nil]
139
+ # <tt>:background_scale</tt>:: Backgound image scale [1] [nil]
139
140
  # <tt>:info</tt>:: Generic hash allowing for custom metadata properties [nil]
140
141
  # <tt>:template</tt>:: The path to an existing PDF file to use as a template [nil]
142
+ # <tt>:text_formatter</tt>: The text formatter to use for <tt>:inline_format</tt>ted text [Prawn::Text::Formatted::Parser]
141
143
  #
142
144
  # Setting e.g. the :margin to 100 points and the :left_margin to 50 will result in margins
143
145
  # of 100 points on every side except for the left, where it will be 50.
@@ -166,7 +168,7 @@ module Prawn
166
168
  # pdf = Prawn::Document.new(:page_size => [200, 300])
167
169
  #
168
170
  # # New document, with background
169
- # pdf = Prawn::Document.new(:background => "#{Prawn::BASEDIR}/data/images/pigs.jpg")
171
+ # pdf = Prawn::Document.new(:background => "#{Prawn::DATADIR}/images/pigs.jpg")
170
172
  #
171
173
  def initialize(options={},&block)
172
174
  options = options.dup
@@ -174,17 +176,18 @@ module Prawn
174
176
  Prawn.verify_options [:page_size, :page_layout, :margin, :left_margin,
175
177
  :right_margin, :top_margin, :bottom_margin, :skip_page_creation,
176
178
  :compress, :skip_encoding, :background, :info,
177
- :optimize_objects, :template], options
179
+ :optimize_objects, :template, :text_formatter], options
178
180
 
179
181
  # need to fix, as the refactoring breaks this
180
182
  # raise NotImplementedError if options[:skip_page_creation]
181
183
 
182
184
  self.class.extensions.reverse_each { |e| extend e }
183
- @internal_state = Prawn::Core::DocumentState.new(options)
185
+ @internal_state = PDF::Core::DocumentState.new(options)
184
186
  @internal_state.populate_pages_from_store(self)
185
187
  min_version(state.store.min_version) if state.store.min_version
186
188
 
187
189
  @background = options[:background]
190
+ @background_scale = options[:background_scale] || 1
188
191
  @font_size = 12
189
192
 
190
193
  @bounding_box = nil
@@ -192,6 +195,8 @@ module Prawn
192
195
 
193
196
  @page_number = 0
194
197
 
198
+ @text_formatter = options.delete(:text_formatter) || Text::Formatted::Parser
199
+
195
200
  options[:size] = options.delete(:page_size)
196
201
  options[:layout] = options.delete(:page_layout)
197
202
 
@@ -217,6 +222,7 @@ module Prawn
217
222
  attr_reader :margins, :y
218
223
  attr_writer :font_size
219
224
  attr_accessor :page_number
225
+ attr_accessor :text_formatter
220
226
 
221
227
  def state
222
228
  @internal_state
@@ -241,6 +247,9 @@ module Prawn
241
247
  #
242
248
  # pdf.start_new_page(:template => multipage_template.pdf, :template_page => 2)
243
249
  #
250
+ # Note: templates get indexed by either the object_id of the filename or stream
251
+ # entered so that if you reuse the same template multiple times be sure to use the
252
+ # same instance for more efficient use of resources and smaller rendered pdfs.
244
253
  def start_new_page(options = {})
245
254
  if last_page = state.page
246
255
  last_page_size = last_page.size
@@ -252,14 +261,14 @@ module Prawn
252
261
  :layout => options[:layout] || last_page_layout,
253
262
  :margins => last_page_margins}
254
263
  if last_page
255
- new_graphic_state = last_page.graphic_state.dup
264
+ new_graphic_state = last_page.graphic_state.dup if last_page.graphic_state
256
265
  #erase the color space so that it gets reset on new page for fussy pdf-readers
257
- new_graphic_state.color_space = {}
266
+ new_graphic_state.color_space = {} if new_graphic_state
258
267
  page_options.merge!(:graphic_state => new_graphic_state)
259
268
  end
260
269
  merge_template_options(page_options, options) if options[:template]
261
270
 
262
- state.page = Prawn::Core::Page.new(self, page_options)
271
+ state.page = PDF::Core::Page.new(self, page_options)
263
272
 
264
273
  apply_margin_options(options)
265
274
  generate_margin_box
@@ -272,12 +281,13 @@ module Prawn
272
281
 
273
282
  state.page.new_content_stream if options[:template]
274
283
  use_graphic_settings(options[:template])
284
+ forget_text_rendering_mode! if options[:template]
275
285
 
276
286
  unless options[:orphan]
277
287
  state.insert_page(state.page, @page_number)
278
288
  @page_number += 1
279
289
 
280
- canvas { image(@background, :at => bounds.top_left) } if @background
290
+ canvas { image(@background, :scale => @background_scale, :at => bounds.top_left) } if @background
281
291
  @y = @bounding_box.absolute_top
282
292
 
283
293
  float do
@@ -348,19 +358,23 @@ module Prawn
348
358
  self.y = original_y
349
359
  end
350
360
 
351
- # Renders the PDF document to string
361
+ # Renders the PDF document to string.
362
+ # Pass an open file descriptor to render to file.
352
363
  #
353
- def render
354
- output = StringIO.new
364
+ def render(output = StringIO.new)
355
365
  finalize_all_page_contents
356
366
 
357
367
  render_header(output)
358
368
  render_body(output)
359
369
  render_xref(output)
360
370
  render_trailer(output)
361
- str = output.string
362
- str.force_encoding("ASCII-8BIT") if str.respond_to?(:force_encoding)
363
- str
371
+ if output.instance_of?(StringIO)
372
+ str = output.string
373
+ str.force_encoding("ASCII-8BIT") if str.respond_to?(:force_encoding)
374
+ return str
375
+ else
376
+ return nil
377
+ end
364
378
  end
365
379
 
366
380
  # Renders the PDF document to file.
@@ -369,7 +383,7 @@ module Prawn
369
383
  #
370
384
  def render_file(filename)
371
385
  Kernel.const_defined?("Encoding") ? mode = "wb:ASCII-8BIT" : mode = "wb"
372
- File.open(filename,mode) { |f| f << render }
386
+ File.open(filename,mode) { |f| render(f) }
373
387
  end
374
388
 
375
389
  # The bounds method returns the current bounding box you are currently in,
@@ -539,15 +553,15 @@ module Prawn
539
553
  # through existing pages after they are created.
540
554
  #
541
555
  # Parameters are:
542
- #
543
- # <tt>string</tt>:: Template string for page number wording.
556
+ #
557
+ # <tt>string</tt>:: Template string for page number wording.
544
558
  # Should include '<page>' and, optionally, '<total>'.
545
559
  # <tt>options</tt>:: A hash for page numbering and text box options.
546
- # <tt>:page_filter</tt>:: A filter to specify which pages to place page numbers on.
560
+ # <tt>:page_filter</tt>:: A filter to specify which pages to place page numbers on.
547
561
  # Refer to the method 'page_match?'
548
562
  # <tt>:start_count_at</tt>:: The starting count to increment pages from.
549
563
  # <tt>:total_pages</tt>:: If provided, will replace <total> with the value given.
550
- # Useful to override the total number of pages when using
564
+ # Useful to override the total number of pages when using
551
565
  # the start_count_at option.
552
566
  # <tt>:color</tt>:: Text fill color.
553
567
  #
@@ -558,7 +572,7 @@ module Prawn
558
572
  # five.
559
573
  #
560
574
  # Prawn::Document.generate("page_with_numbering.pdf") do
561
- # number_pages "<page> in a total of <total>",
575
+ # number_pages "<page> in a total of <total>",
562
576
  # {:start_count_at => 5,
563
577
  # :page_filter => lambda{ |pg| pg != 1 },
564
578
  # :at => [bounds.right - 50, 0],
@@ -577,8 +591,8 @@ module Prawn
577
591
  total_pages = opts.delete(:total_pages)
578
592
  txtcolor = opts.delete(:color)
579
593
  # An explicit height so that we can draw page numbers in the margins
580
- opts[:height] = 50
581
-
594
+ opts[:height] = 50 unless opts.has_key?(:height)
595
+
582
596
  start_count = false
583
597
  pseudopage = 0
584
598
  (1..page_count).each do |p|
@@ -589,7 +603,7 @@ module Prawn
589
603
  else
590
604
  start_count_at.to_i
591
605
  end
592
- end
606
+ end
593
607
  if page_match?(page_filter, p)
594
608
  go_to_page(p)
595
609
  # have to use fill_color here otherwise text reverts back to default fill color
@@ -598,13 +612,13 @@ module Prawn
598
612
  str = string.gsub("<page>","#{pseudopage}").gsub("<total>","#{total_pages}")
599
613
  text_box str, opts
600
614
  start_count = true # increment page count as soon as first match found
601
- end
615
+ end
602
616
  pseudopage += 1 if start_count
603
617
  end
604
618
  end
605
619
 
606
620
  # Provides a way to execute a block of code repeatedly based on a
607
- # page_filter.
621
+ # page_filter.
608
622
  #
609
623
  # Available page filters are:
610
624
  # :all repeats on every page
@@ -612,7 +626,7 @@ module Prawn
612
626
  # :even repeats on even pages
613
627
  # some_array repeats on every page listed in the array
614
628
  # some_range repeats on every page included in the range
615
- # some_lambda yields page number and repeats for true return values
629
+ # some_lambda yields page number and repeats for true return values
616
630
  def page_match?(page_filter, page_number)
617
631
  case page_filter
618
632
  when :all
@@ -626,7 +640,7 @@ module Prawn
626
640
  when Proc
627
641
  page_filter.call(page_number)
628
642
  end
629
- end
643
+ end
630
644
 
631
645
 
632
646
  # Returns true if content streams will be compressed before rendering,
@@ -640,7 +654,7 @@ module Prawn
640
654
 
641
655
  def merge_template_options(page_options, options)
642
656
  object_id = state.store.import_page(options[:template], options[:template_page] || 1)
643
- page_options.merge!(:object_id => object_id )
657
+ page_options.merge!(:object_id => object_id, :page_template => true)
644
658
  end
645
659
 
646
660
  # setting override_settings to true ensures that a new graphic state does not end up using
@@ -697,5 +711,9 @@ module Prawn
697
711
  end
698
712
  end
699
713
  end
714
+
715
+ def font_metric_cache #:nodoc:
716
+ @font_metric_cache ||= FontMetricCache.new( self )
717
+ end
700
718
  end
701
719
  end
@@ -154,10 +154,10 @@ module Prawn
154
154
  # Of course, if you use canvas, you will be responsible for ensuring that
155
155
  # you remain within the printable area of your document.
156
156
  #
157
- def bounding_box(*args, &block)
157
+ def bounding_box(pt, *args, &block)
158
158
  init_bounding_box(block) do |parent_box|
159
- map_to_absolute!(args[0])
160
- @bounding_box = BoundingBox.new(self, parent_box, *args)
159
+ pt = map_to_absolute(pt)
160
+ @bounding_box = BoundingBox.new(self, parent_box, pt, *args)
161
161
  end
162
162
  end
163
163
 
@@ -17,9 +17,9 @@ module Prawn
17
17
  # number of :columns and a :spacer (in points) between columns.
18
18
  #
19
19
  # Defaults are :columns = 3 and :spacer = font_size
20
- #
20
+ #
21
21
  # Under PDF::Writer, "spacer" was known as "gutter"
22
- #
22
+ #
23
23
  def column_box(*args, &block)
24
24
  init_column_box(block) do |parent_box|
25
25
  map_to_absolute!(args[0])
@@ -40,7 +40,7 @@ module Prawn
40
40
 
41
41
  @bounding_box = parent_box
42
42
  end
43
-
43
+
44
44
  # Implements the necessary functionality to allow Document#column_box to
45
45
  # work.
46
46
  #
@@ -53,17 +53,23 @@ module Prawn
53
53
  @current_column = 0
54
54
  end
55
55
 
56
- # The column width, not the width of the whole box. Used to calculate
57
- # how long a line of text can be.
56
+ # The column width, not the width of the whole box,
57
+ # before left and/or right padding
58
+ def bare_column_width
59
+ (@width - @spacer * (@columns - 1)) / @columns
60
+ end
61
+
62
+ # The column width after padding.
63
+ # Used to calculate how long a line of text can be.
58
64
  #
59
65
  def width
60
- super / @columns - @spacer
66
+ bare_column_width - (@total_left_padding + @total_right_padding)
61
67
  end
62
68
 
63
69
  # Column width including the spacer.
64
70
  #
65
71
  def width_of_column
66
- width + @spacer
72
+ bare_column_width + @spacer
67
73
  end
68
74
 
69
75
  # x coordinate of the left edge of the current column
@@ -72,6 +78,12 @@ module Prawn
72
78
  absolute_left + (width_of_column * @current_column)
73
79
  end
74
80
 
81
+ # Relative position of the left edge of the current column
82
+ #
83
+ def left
84
+ width_of_column * @current_column
85
+ end
86
+
75
87
  # x co-orordinate of the right edge of the current column
76
88
  #
77
89
  def right_side
@@ -79,9 +91,15 @@ module Prawn
79
91
  absolute_right - (width_of_column * columns_from_right)
80
92
  end
81
93
 
94
+ # Relative position of the right edge of the current column.
95
+ #
96
+ def right
97
+ left + width
98
+ end
99
+
82
100
  # Moves to the next column or starts a new page if currently positioned at
83
101
  # the rightmost column.
84
- def move_past_bottom
102
+ def move_past_bottom
85
103
  @current_column = (@current_column + 1) % @columns
86
104
  @document.y = @y
87
105
  if 0 == @current_column
@@ -89,6 +107,26 @@ module Prawn
89
107
  end
90
108
  end
91
109
 
110
+ # Override the padding functions so as not to split the padding amount
111
+ # between all columns on the page.
112
+
113
+ def add_left_padding(left_padding)
114
+ @total_left_padding += left_padding
115
+ @x += left_padding
116
+ end
117
+
118
+ def subtract_left_padding(left_padding)
119
+ @total_left_padding -= left_padding
120
+ @x -= left_padding
121
+ end
122
+
123
+ def add_right_padding(right_padding)
124
+ @total_right_padding += right_padding
125
+ end
126
+
127
+ def subtract_right_padding(right_padding)
128
+ @total_right_padding -= right_padding
129
+ end
92
130
  end
93
131
  end
94
132
  end
@@ -8,69 +8,6 @@
8
8
  #
9
9
 
10
10
  module Prawn
11
- class GraphicStateStack
12
- attr_accessor :stack
13
-
14
- def initialize(previous_state = nil)
15
- self.stack = [GraphicState.new(previous_state)]
16
- end
17
-
18
- def save_graphic_state(graphic_state = nil)
19
- stack.push(GraphicState.new(graphic_state || current_state))
20
- end
21
-
22
- def restore_graphic_state
23
- if stack.empty?
24
- raise Prawn::Errors::EmptyGraphicStateStack,
25
- "\n You have reached the end of the graphic state stack"
26
- end
27
- stack.pop
28
- end
29
-
30
- def current_state
31
- stack.last
32
- end
33
-
34
- def present?
35
- stack.size > 0
36
- end
37
-
38
- def empty?
39
- stack.empty?
40
- end
41
-
42
- end
43
-
44
- class GraphicState
45
- attr_accessor :color_space, :dash, :cap_style, :join_style, :line_width, :fill_color, :stroke_color
46
-
47
- def initialize(previous_state = nil)
48
- @color_space = previous_state ? previous_state.color_space.dup : {}
49
- @fill_color = previous_state ? previous_state.fill_color : "000000"
50
- @stroke_color = previous_state ? previous_state.stroke_color : "000000"
51
- @dash = previous_state ? previous_state.dash : { :dash => nil, :space => nil, :phase => 0 }
52
- @cap_style = previous_state ? previous_state.cap_style : :butt
53
- @join_style = previous_state ? previous_state.join_style : :miter
54
- @line_width = previous_state ? previous_state.line_width : 1
55
- end
56
-
57
- def dash_setting
58
- "[#{@dash[:dash]} #{@dash[:space]}] #{@dash[:phase]} d"
59
- end
60
- end
61
-
62
- module Core
63
- class Page
64
- module GraphicsState
65
-
66
- def graphic_state
67
- stack.current_state
68
- end
69
-
70
- end
71
- end
72
- end
73
-
74
11
  class Document
75
12
  module GraphicsState
76
13
 
@@ -93,15 +30,15 @@ module Prawn
93
30
  # text "rotated text"
94
31
  # end
95
32
  #
96
-
33
+
97
34
  def open_graphics_state
98
35
  add_content "q"
99
36
  end
100
-
37
+
101
38
  def close_graphics_state
102
39
  add_content "Q"
103
40
  end
104
-
41
+
105
42
  def save_graphics_state(graphic_state = nil)
106
43
  graphic_stack.save_graphic_state(graphic_state)
107
44
  open_graphics_state
@@ -115,22 +52,22 @@ module Prawn
115
52
  # restores the state to those values
116
53
  def restore_graphics_state
117
54
  if graphic_stack.empty?
118
- raise Prawn::Errors::EmptyGraphicStateStack,
119
- "\n You have reached the end of the graphic state stack"
55
+ raise PDF::Core::Errors::EmptyGraphicStateStack,
56
+ "\n You have reached the end of the graphic state stack"
120
57
  end
121
- close_graphics_state
58
+ close_graphics_state
122
59
  graphic_stack.restore_graphic_state
123
60
  end
124
-
61
+
125
62
  def graphic_stack
126
63
  state.page.stack
127
64
  end
128
-
65
+
129
66
  def graphic_state
130
67
  save_graphics_state unless graphic_stack.current_state
131
- graphic_stack.current_state
68
+ graphic_stack.current_state
132
69
  end
133
-
70
+
134
71
  end
135
72
  end
136
73
  end