prawn 0.13.0 → 2.4.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.
Files changed (348) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.yardopts +10 -0
  4. data/GPLv2 +20 -21
  5. data/Gemfile +3 -16
  6. data/Rakefile +17 -39
  7. data/lib/prawn/document/bounding_box.rb +85 -42
  8. data/lib/prawn/document/column_box.rb +21 -11
  9. data/lib/prawn/document/internals.rb +40 -147
  10. data/lib/prawn/document/span.rb +25 -17
  11. data/lib/prawn/document.rb +286 -245
  12. data/lib/prawn/encoding.rb +68 -101
  13. data/lib/prawn/errors.rb +47 -43
  14. data/lib/prawn/font.rb +204 -155
  15. data/lib/prawn/font_metric_cache.rb +25 -21
  16. data/lib/prawn/fonts/afm.rb +292 -0
  17. data/lib/prawn/{font → fonts}/dfont.rb +7 -13
  18. data/lib/prawn/fonts/otf.rb +11 -0
  19. data/lib/prawn/fonts/ttc.rb +36 -0
  20. data/lib/prawn/{font → fonts}/ttf.rb +142 -80
  21. data/lib/prawn/graphics/blend_mode.rb +65 -0
  22. data/lib/prawn/graphics/cap_style.rb +6 -5
  23. data/lib/prawn/graphics/color.rb +47 -44
  24. data/lib/prawn/graphics/dash.rb +30 -13
  25. data/lib/prawn/graphics/join_style.rb +13 -6
  26. data/lib/prawn/graphics/patterns.rb +221 -90
  27. data/lib/prawn/graphics/transformation.rb +21 -12
  28. data/lib/prawn/graphics/transparency.rb +21 -17
  29. data/lib/prawn/graphics.rb +155 -128
  30. data/lib/prawn/{layout/grid.rb → grid.rb} +110 -47
  31. data/lib/prawn/image_handler.rb +16 -2
  32. data/lib/prawn/images/image.rb +4 -2
  33. data/lib/prawn/images/jpg.rb +39 -30
  34. data/lib/prawn/images/png.rb +132 -169
  35. data/lib/prawn/images.rb +70 -62
  36. data/lib/prawn/measurement_extensions.rb +15 -10
  37. data/lib/prawn/measurements.rb +22 -23
  38. data/lib/prawn/outline.rb +301 -13
  39. data/lib/prawn/repeater.rb +19 -17
  40. data/lib/prawn/security/arcfour.rb +54 -0
  41. data/lib/prawn/security.rb +108 -86
  42. data/lib/prawn/soft_mask.rb +40 -41
  43. data/lib/prawn/stamp.rb +29 -12
  44. data/lib/prawn/text/box.rb +27 -29
  45. data/lib/prawn/text/formatted/arranger.rb +110 -67
  46. data/lib/prawn/text/formatted/box.rb +233 -165
  47. data/lib/prawn/text/formatted/fragment.rb +27 -27
  48. data/lib/prawn/text/formatted/line_wrap.rb +137 -97
  49. data/lib/prawn/text/formatted/parser.rb +149 -127
  50. data/lib/prawn/text/formatted/wrap.rb +57 -37
  51. data/lib/prawn/text/formatted.rb +6 -4
  52. data/lib/prawn/text.rb +105 -73
  53. data/lib/prawn/transformation_stack.rb +44 -0
  54. data/lib/prawn/utilities.rb +11 -21
  55. data/lib/prawn/version.rb +5 -0
  56. data/lib/prawn/view.rb +101 -0
  57. data/lib/prawn.rb +42 -68
  58. data/{data/images/fractal.jpg → manual/absolute_position.pdf} +0 -0
  59. data/manual/basic_concepts/adding_pages.rb +9 -10
  60. data/manual/basic_concepts/basic_concepts.rb +33 -24
  61. data/manual/basic_concepts/creation.rb +10 -11
  62. data/manual/basic_concepts/cursor.rb +9 -10
  63. data/manual/basic_concepts/measurement.rb +10 -11
  64. data/manual/basic_concepts/origin.rb +8 -9
  65. data/manual/basic_concepts/other_cursor_helpers.rb +17 -18
  66. data/manual/basic_concepts/view.rb +48 -0
  67. data/manual/bounding_box/bounding_box.rb +31 -29
  68. data/manual/bounding_box/bounds.rb +17 -18
  69. data/manual/bounding_box/canvas.rb +8 -9
  70. data/manual/bounding_box/creation.rb +8 -9
  71. data/manual/bounding_box/indentation.rb +22 -23
  72. data/manual/bounding_box/nesting.rb +32 -25
  73. data/manual/bounding_box/russian_boxes.rb +19 -19
  74. data/manual/bounding_box/stretchy.rb +18 -20
  75. data/manual/contents.rb +35 -0
  76. data/manual/cover.rb +43 -0
  77. data/manual/document_and_page_options/background.rb +16 -14
  78. data/manual/document_and_page_options/document_and_page_options.rb +26 -23
  79. data/manual/document_and_page_options/metadata.rb +21 -19
  80. data/manual/document_and_page_options/page_margins.rb +20 -22
  81. data/manual/document_and_page_options/page_size.rb +15 -15
  82. data/manual/document_and_page_options/print_scaling.rb +23 -0
  83. data/manual/example_helper.rb +5 -408
  84. data/manual/graphics/blend_mode.rb +52 -0
  85. data/manual/graphics/circle_and_ellipse.rb +8 -9
  86. data/manual/graphics/color.rb +11 -13
  87. data/manual/graphics/common_lines.rb +13 -12
  88. data/manual/graphics/fill_and_stroke.rb +10 -11
  89. data/manual/graphics/fill_rules.rb +13 -12
  90. data/manual/graphics/gradients.rb +28 -22
  91. data/manual/graphics/graphics.rb +52 -46
  92. data/manual/graphics/helper.rb +20 -10
  93. data/manual/graphics/line_width.rb +13 -12
  94. data/manual/graphics/lines_and_curves.rb +13 -14
  95. data/manual/graphics/polygon.rb +10 -12
  96. data/manual/graphics/rectangle.rb +7 -8
  97. data/manual/graphics/rotate.rb +9 -12
  98. data/manual/graphics/scale.rb +19 -18
  99. data/manual/graphics/soft_masks.rb +5 -7
  100. data/manual/graphics/stroke_cap.rb +10 -11
  101. data/manual/graphics/stroke_dash.rb +16 -17
  102. data/manual/graphics/stroke_join.rb +10 -11
  103. data/manual/graphics/translate.rb +13 -13
  104. data/manual/graphics/transparency.rb +11 -13
  105. data/manual/{manual/how_to_read_this_manual.rb → how_to_read_this_manual.rb} +23 -25
  106. data/manual/images/absolute_position.rb +9 -10
  107. data/manual/images/fit.rb +9 -10
  108. data/manual/images/horizontal.rb +13 -14
  109. data/manual/images/images.rb +31 -30
  110. data/manual/images/plain_image.rb +6 -7
  111. data/manual/images/scale.rb +12 -13
  112. data/manual/images/vertical.rb +19 -17
  113. data/manual/images/width_and_height.rb +13 -14
  114. data/manual/layout/boxes.rb +14 -15
  115. data/manual/layout/content.rb +12 -13
  116. data/manual/layout/layout.rb +19 -20
  117. data/manual/layout/simple_grid.rb +8 -9
  118. data/manual/outline/add_subsection_to.rb +26 -27
  119. data/manual/outline/insert_section_after.rb +19 -20
  120. data/manual/outline/outline.rb +23 -22
  121. data/manual/outline/sections_and_pages.rb +24 -25
  122. data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
  123. data/manual/repeatable_content/page_numbering.rb +20 -19
  124. data/manual/repeatable_content/repeatable_content.rb +26 -22
  125. data/manual/repeatable_content/repeater.rb +18 -19
  126. data/manual/repeatable_content/stamp.rb +18 -19
  127. data/manual/security/encryption.rb +8 -11
  128. data/manual/security/permissions.rb +20 -15
  129. data/manual/security/security.rb +20 -20
  130. data/manual/table.rb +16 -0
  131. data/manual/text/alignment.rb +17 -18
  132. data/manual/text/color.rb +13 -13
  133. data/manual/text/column_box.rb +10 -12
  134. data/manual/text/fallback_fonts.rb +29 -25
  135. data/manual/text/font.rb +17 -18
  136. data/manual/text/font_size.rb +21 -22
  137. data/manual/text/font_style.rb +12 -10
  138. data/manual/text/formatted_callbacks.rb +36 -26
  139. data/manual/text/formatted_text.rb +41 -34
  140. data/manual/text/free_flowing_text.rb +28 -29
  141. data/manual/text/inline.rb +23 -26
  142. data/manual/text/kerning_and_character_spacing.rb +20 -21
  143. data/manual/text/leading.rb +10 -11
  144. data/manual/text/line_wrapping.rb +40 -21
  145. data/manual/text/paragraph_indentation.rb +17 -12
  146. data/manual/text/positioned_text.rb +19 -20
  147. data/manual/text/registering_families.rb +33 -30
  148. data/manual/text/rendering_and_color.rb +11 -12
  149. data/manual/text/right_to_left_text.rb +31 -20
  150. data/manual/text/rotation.rb +36 -27
  151. data/manual/text/single_usage.rb +13 -14
  152. data/manual/text/text.rb +62 -62
  153. data/manual/text/text_box_excess.rb +22 -19
  154. data/manual/text/text_box_extensions.rb +21 -18
  155. data/manual/text/text_box_overflow.rb +28 -21
  156. data/manual/text/utf8.rb +16 -17
  157. data/manual/text/win_ansi_charset.rb +29 -26
  158. data/prawn.gemspec +45 -43
  159. data/spec/extensions/encoding_helpers.rb +4 -3
  160. data/spec/prawn/document/bounding_box_spec.rb +550 -0
  161. data/spec/prawn/document/column_box_spec.rb +75 -0
  162. data/spec/prawn/document/security_spec.rb +176 -0
  163. data/spec/prawn/document_annotations_spec.rb +76 -0
  164. data/spec/prawn/document_destinations_spec.rb +15 -0
  165. data/spec/prawn/document_grid_spec.rb +99 -0
  166. data/spec/prawn/document_reference_spec.rb +27 -0
  167. data/spec/prawn/document_span_spec.rb +44 -0
  168. data/spec/prawn/document_spec.rb +805 -0
  169. data/spec/prawn/font_metric_cache_spec.rb +54 -0
  170. data/spec/prawn/font_spec.rb +544 -0
  171. data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
  172. data/spec/prawn/graphics/transparency_spec.rb +81 -0
  173. data/spec/prawn/graphics_spec.rb +872 -0
  174. data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
  175. data/spec/prawn/image_handler_spec.rb +53 -0
  176. data/spec/prawn/images/jpg_spec.rb +20 -0
  177. data/spec/prawn/images/png_spec.rb +283 -0
  178. data/spec/prawn/images_spec.rb +229 -0
  179. data/spec/prawn/measurements_extensions_spec.rb +24 -0
  180. data/spec/prawn/outline_spec.rb +512 -0
  181. data/spec/prawn/repeater_spec.rb +166 -0
  182. data/spec/prawn/soft_mask_spec.rb +74 -0
  183. data/spec/prawn/stamp_spec.rb +173 -0
  184. data/spec/prawn/text/box_spec.rb +1110 -0
  185. data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
  186. data/spec/prawn/text/formatted/box_spec.rb +849 -0
  187. data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
  188. data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
  189. data/spec/prawn/text/formatted/parser_spec.rb +697 -0
  190. data/spec/prawn/text_draw_text_spec.rb +150 -0
  191. data/spec/prawn/text_rendering_mode_spec.rb +48 -0
  192. data/spec/prawn/text_spacing_spec.rb +95 -0
  193. data/spec/prawn/text_spec.rb +603 -0
  194. data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
  195. data/spec/prawn/transformation_stack_spec.rb +66 -0
  196. data/spec/prawn/view_spec.rb +63 -0
  197. data/spec/prawn_manual_spec.rb +35 -0
  198. data/spec/spec_helper.rb +22 -21
  199. data.tar.gz.sig +0 -0
  200. metadata +168 -307
  201. metadata.gz.sig +0 -0
  202. data/README.md +0 -109
  203. data/data/encodings/win_ansi.txt +0 -29
  204. data/data/images/16bit.alpha +0 -0
  205. data/data/images/16bit.dat +0 -0
  206. data/data/images/16bit.png +0 -0
  207. data/data/images/arrow.png +0 -0
  208. data/data/images/arrow2.png +0 -0
  209. data/data/images/barcode_issue.png +0 -0
  210. data/data/images/dice.alpha +0 -0
  211. data/data/images/dice.dat +0 -0
  212. data/data/images/dice.png +0 -0
  213. data/data/images/dice_interlaced.png +0 -0
  214. data/data/images/indexed_color.dat +0 -0
  215. data/data/images/indexed_color.png +0 -0
  216. data/data/images/letterhead.jpg +0 -0
  217. data/data/images/page_white_text.alpha +0 -0
  218. data/data/images/page_white_text.dat +0 -0
  219. data/data/images/page_white_text.png +0 -0
  220. data/data/images/pigs.jpg +0 -0
  221. data/data/images/prawn.png +0 -0
  222. data/data/images/ruport.png +0 -0
  223. data/data/images/ruport_data.dat +0 -0
  224. data/data/images/ruport_transparent.png +0 -0
  225. data/data/images/ruport_type0.png +0 -0
  226. data/data/images/stef.jpg +0 -0
  227. data/data/images/tru256.bmp +0 -0
  228. data/data/images/web-links.dat +0 -1
  229. data/data/images/web-links.png +0 -0
  230. data/data/pdfs/complex_template.pdf +0 -0
  231. data/data/pdfs/contains_ttf_font.pdf +0 -0
  232. data/data/pdfs/encrypted.pdf +0 -0
  233. data/data/pdfs/form.pdf +1 -819
  234. data/data/pdfs/hexagon.pdf +0 -61
  235. data/data/pdfs/indirect_reference.pdf +0 -86
  236. data/data/pdfs/multipage_template.pdf +0 -127
  237. data/data/pdfs/nested_pages.pdf +0 -118
  238. data/data/pdfs/page_without_mediabox.pdf +0 -193
  239. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  240. data/data/pdfs/two_hexagons.pdf +0 -90
  241. data/data/pdfs/version_1_6.pdf +0 -61
  242. data/data/shift_jis_text.txt +0 -1
  243. data/lib/pdf/core/annotations.rb +0 -60
  244. data/lib/pdf/core/byte_string.rb +0 -9
  245. data/lib/pdf/core/destinations.rb +0 -90
  246. data/lib/pdf/core/document_state.rb +0 -78
  247. data/lib/pdf/core/filter_list.rb +0 -51
  248. data/lib/pdf/core/filters.rb +0 -36
  249. data/lib/pdf/core/graphics_state.rb +0 -68
  250. data/lib/pdf/core/literal_string.rb +0 -16
  251. data/lib/pdf/core/name_tree.rb +0 -177
  252. data/lib/pdf/core/object_store.rb +0 -320
  253. data/lib/pdf/core/outline.rb +0 -315
  254. data/lib/pdf/core/page.rb +0 -212
  255. data/lib/pdf/core/page_geometry.rb +0 -126
  256. data/lib/pdf/core/pdf_object.rb +0 -124
  257. data/lib/pdf/core/reference.rb +0 -103
  258. data/lib/pdf/core/stream.rb +0 -98
  259. data/lib/pdf/core/text.rb +0 -275
  260. data/lib/pdf/core.rb +0 -35
  261. data/lib/prawn/compatibility.rb +0 -91
  262. data/lib/prawn/document/graphics_state.rb +0 -73
  263. data/lib/prawn/document/snapshot.rb +0 -89
  264. data/lib/prawn/font/afm.rb +0 -203
  265. data/lib/prawn/layout.rb +0 -20
  266. data/lib/prawn/table/cell/image.rb +0 -70
  267. data/lib/prawn/table/cell/in_table.rb +0 -27
  268. data/lib/prawn/table/cell/span_dummy.rb +0 -92
  269. data/lib/prawn/table/cell/subtable.rb +0 -65
  270. data/lib/prawn/table/cell/text.rb +0 -153
  271. data/lib/prawn/table/cell.rb +0 -770
  272. data/lib/prawn/table/cells.rb +0 -295
  273. data/lib/prawn/table.rb +0 -643
  274. data/manual/example_file.rb +0 -116
  275. data/manual/example_package.rb +0 -53
  276. data/manual/example_section.rb +0 -46
  277. data/manual/manual/cover.rb +0 -35
  278. data/manual/manual/foreword.rb +0 -85
  279. data/manual/manual/manual.rb +0 -35
  280. data/manual/syntax_highlight.rb +0 -52
  281. data/manual/table/basic_block.rb +0 -53
  282. data/manual/table/before_rendering_page.rb +0 -26
  283. data/manual/table/cell_border_lines.rb +0 -24
  284. data/manual/table/cell_borders_and_bg.rb +0 -31
  285. data/manual/table/cell_dimensions.rb +0 -30
  286. data/manual/table/cell_text.rb +0 -38
  287. data/manual/table/column_widths.rb +0 -30
  288. data/manual/table/content_and_subtables.rb +0 -39
  289. data/manual/table/creation.rb +0 -27
  290. data/manual/table/filtering.rb +0 -36
  291. data/manual/table/flow_and_header.rb +0 -17
  292. data/manual/table/image_cells.rb +0 -33
  293. data/manual/table/position.rb +0 -29
  294. data/manual/table/row_colors.rb +0 -20
  295. data/manual/table/span.rb +0 -30
  296. data/manual/table/style.rb +0 -22
  297. data/manual/table/table.rb +0 -52
  298. data/manual/table/width.rb +0 -27
  299. data/manual/templates/full_template.rb +0 -25
  300. data/manual/templates/page_template.rb +0 -48
  301. data/manual/templates/templates.rb +0 -27
  302. data/manual/text/group.rb +0 -29
  303. data/spec/acceptance/png.rb +0 -23
  304. data/spec/annotations_spec.rb +0 -74
  305. data/spec/bounding_box_spec.rb +0 -493
  306. data/spec/cell_spec.rb +0 -628
  307. data/spec/column_box_spec.rb +0 -33
  308. data/spec/destinations_spec.rb +0 -15
  309. data/spec/document_spec.rb +0 -761
  310. data/spec/extensions/mocha.rb +0 -44
  311. data/spec/filters_spec.rb +0 -34
  312. data/spec/font_metric_cache_spec.rb +0 -52
  313. data/spec/font_spec.rb +0 -464
  314. data/spec/formatted_text_arranger_spec.rb +0 -421
  315. data/spec/formatted_text_box_spec.rb +0 -650
  316. data/spec/formatted_text_fragment_spec.rb +0 -298
  317. data/spec/graphics_spec.rb +0 -651
  318. data/spec/grid_spec.rb +0 -85
  319. data/spec/image_handler_spec.rb +0 -42
  320. data/spec/images_spec.rb +0 -157
  321. data/spec/inline_formatted_text_parser_spec.rb +0 -564
  322. data/spec/jpg_spec.rb +0 -25
  323. data/spec/line_wrap_spec.rb +0 -333
  324. data/spec/measurement_units_spec.rb +0 -23
  325. data/spec/name_tree_spec.rb +0 -112
  326. data/spec/object_store_spec.rb +0 -170
  327. data/spec/outline_spec.rb +0 -448
  328. data/spec/pdf_object_spec.rb +0 -172
  329. data/spec/png_spec.rb +0 -240
  330. data/spec/reference_spec.rb +0 -82
  331. data/spec/repeater_spec.rb +0 -158
  332. data/spec/security_spec.rb +0 -158
  333. data/spec/snapshot_spec.rb +0 -186
  334. data/spec/soft_mask_spec.rb +0 -117
  335. data/spec/span_spec.rb +0 -44
  336. data/spec/stamp_spec.rb +0 -158
  337. data/spec/stream_spec.rb +0 -58
  338. data/spec/stroke_styles_spec.rb +0 -211
  339. data/spec/table/span_dummy_spec.rb +0 -17
  340. data/spec/table_spec.rb +0 -1355
  341. data/spec/template_spec.rb +0 -351
  342. data/spec/text_at_spec.rb +0 -130
  343. data/spec/text_box_spec.rb +0 -1030
  344. data/spec/text_rendering_mode_spec.rb +0 -45
  345. data/spec/text_spacing_spec.rb +0 -93
  346. data/spec/text_spec.rb +0 -425
  347. data/spec/text_with_inline_formatting_spec.rb +0 -35
  348. data/spec/transparency_spec.rb +0 -89
@@ -1,91 +0,0 @@
1
- # coding: utf-8
2
- #
3
- # Compatibility layer to smooth over differences between Ruby implementations
4
- # The oldest version of Ruby which is supported is MRI 1.8.7
5
- # Ideally, all version-specific or implementation-specific code should be
6
- # kept in this file (but that ideal has not been attained yet)
7
-
8
- class String #:nodoc:
9
- def first_line
10
- self.each_line { |line| return line }
11
- end
12
-
13
- unless "".respond_to?(:codepoints)
14
- def codepoints(&block)
15
- if block_given?
16
- unpack("U*").each(&block)
17
- else
18
- unpack("U*")
19
- end
20
- end
21
-
22
- def each_codepoint(&block)
23
- unpack("U*").each(&block)
24
- end
25
- end
26
-
27
- if "".respond_to?(:encode)
28
- def normalize_to_utf8
29
- begin
30
- encode(Encoding::UTF_8)
31
- rescue
32
- raise Prawn::Errors::IncompatibleStringEncoding, "Encoding " +
33
- "#{text.encoding} can not be transparently converted to UTF-8. " +
34
- "Please ensure the encoding of the string you are attempting " +
35
- "to use is set correctly"
36
- end
37
- end
38
- alias :unicode_characters :each_char
39
- alias :unicode_length :length
40
-
41
- else
42
- def normalize_to_utf8
43
- begin
44
- # use unpack as a hackish way to verify the string is valid utf-8
45
- unpack("U*")
46
- return dup
47
- rescue
48
- raise Prawn::Errors::IncompatibleStringEncoding, "The string you " +
49
- "are attempting to render is not encoded in valid UTF-8."
50
- end
51
- end
52
- def unicode_characters
53
- if block_given?
54
- unpack("U*").each { |c| yield [c].pack("U") }
55
- else
56
- unpack("U*").map { |c| [c].pack("U") }
57
- end
58
- end
59
- def unicode_length
60
- unpack("U*").length
61
- end
62
- end
63
- end
64
-
65
- unless File.respond_to?(:binread)
66
- def File.binread(file) #:nodoc:
67
- File.open(file,"rb") { |f| f.read }
68
- end
69
- end
70
-
71
- if RUBY_VERSION < "1.9"
72
-
73
- def ruby_18 #:nodoc:
74
- yield
75
- end
76
-
77
- def ruby_19 #:nodoc:
78
- false
79
- end
80
-
81
- else
82
-
83
- def ruby_18 #:nodoc:
84
- false
85
- end
86
-
87
- def ruby_19 #:nodoc:
88
- yield
89
- end
90
-
91
- end
@@ -1,73 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # graphics_state.rb: Implements graphics state saving and restoring
4
- #
5
- # Copyright January 2010, Michael Witrant. All Rights Reserved.
6
- #
7
- # This is free software. Please see the LICENSE and COPYING files for details.
8
- #
9
-
10
- module Prawn
11
- class Document
12
- module GraphicsState
13
-
14
- # Pushes the current graphics state on to the graphics state stack so we
15
- # can restore it when finished with a change we want to isolate (such as
16
- # modifying the transformation matrix). Used in pairs with
17
- # restore_graphics_state or passed a block
18
- #
19
- # Example without a block:
20
- #
21
- # save_graphics_state
22
- # rotate 30
23
- # text "rotated text"
24
- # restore_graphics_state
25
- #
26
- # Example with a block:
27
- #
28
- # save_graphics_state do
29
- # rotate 30
30
- # text "rotated text"
31
- # end
32
- #
33
-
34
- def open_graphics_state
35
- add_content "q"
36
- end
37
-
38
- def close_graphics_state
39
- add_content "Q"
40
- end
41
-
42
- def save_graphics_state(graphic_state = nil)
43
- graphic_stack.save_graphic_state(graphic_state)
44
- open_graphics_state
45
- if block_given?
46
- yield
47
- restore_graphics_state
48
- end
49
- end
50
-
51
- # Pops the last saved graphics state off the graphics state stack and
52
- # restores the state to those values
53
- def restore_graphics_state
54
- if graphic_stack.empty?
55
- raise PDF::Core::Errors::EmptyGraphicStateStack,
56
- "\n You have reached the end of the graphic state stack"
57
- end
58
- close_graphics_state
59
- graphic_stack.restore_graphic_state
60
- end
61
-
62
- def graphic_stack
63
- state.page.stack
64
- end
65
-
66
- def graphic_state
67
- save_graphics_state unless graphic_stack.current_state
68
- graphic_stack.current_state
69
- end
70
-
71
- end
72
- end
73
- end
@@ -1,89 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # snapshot.rb : Implements transactional rendering for Prawn
4
- #
5
- # Copyright August 2009, Brad Ediger. All Rights Reserved.
6
- #
7
- # This is free software. Please see the LICENSE and COPYING files for details.
8
-
9
- require 'delegate'
10
-
11
- module Prawn
12
- class Document
13
- module Snapshot
14
-
15
- RollbackTransaction = Class.new(StandardError)
16
-
17
- # Call this within a +transaction+ block to roll back the transaction and
18
- # prevent any of its data from being rendered. You must reset the
19
- # y-position yourself if you have performed any drawing operations that
20
- # modify it.
21
- #
22
- def rollback
23
- raise RollbackTransaction
24
- end
25
-
26
- # Run a block of drawing operations, to be completed atomically. If
27
- # +rollback+ is called or a RollbackTransaction exception is raised
28
- # inside the block, all actions taken inside the block will be rolled
29
- # back (with the exception of y-position, which you must restore
30
- # yourself).
31
- #
32
- # Returns true on success, or false if the transaction was rolled back.
33
- #
34
- def transaction
35
- snap = take_snapshot
36
- yield
37
- true
38
- rescue RollbackTransaction
39
- restore_snapshot(snap)
40
- false
41
- end
42
-
43
- private
44
-
45
- # Takes a current snapshot of the document's state, sufficient to
46
- # reconstruct it after it was amended.
47
- #
48
- def take_snapshot
49
- # current_page holds a ref to the Pages dictionary which grows
50
- # monotonically as data is added to the document, so we share that
51
- # between the old and new copies.
52
- {:page_content => state.page.content.deep_copy,
53
- :current_page => state.page.dictionary.deep_copy([:Parent]),
54
- :bounds => bounds.deep_copy,
55
- :page_number => page_number,
56
- :page_kids => state.store.pages.data[:Kids].compact.map{|kid| kid.identifier},
57
- :dests => names? && names.data[:Dests].deep_copy}
58
- end
59
-
60
- # Rolls the page state back to the state of the given snapshot.
61
- #
62
- def restore_snapshot(shot)
63
- page = state.page
64
- # Because these objects are referenced by identifier from the Pages
65
- # dictionary, we can't just restore them over the current refs in
66
- # page_content and current_page. We have to restore them over the old
67
- # ones.
68
- page.content = shot[:page_content].identifier
69
- page.content.replace shot[:page_content]
70
-
71
- page.dictionary = shot[:current_page].identifier
72
- page.dictionary.replace shot[:current_page]
73
- page.dictionary.data[:Contents] = page.content
74
-
75
- self.page_number = shot[:page_number]
76
-
77
- state.store.pages.data[:Kids] = shot[:page_kids].map{|id| state.store[id]}
78
- state.store.pages.data[:Count] = shot[:page_kids].size
79
-
80
- self.bounds = BoundingBox.restore_deep_copy(shot[:bounds], self)
81
-
82
- if shot[:dests]
83
- names.data[:Dests] = shot[:dests]
84
- end
85
- end
86
-
87
- end
88
- end
89
- end
@@ -1,203 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # prawn/font/afm.rb : Implements AFM font support for Prawn
4
- #
5
- # Copyright May 2008, Gregory Brown / James Healy. All Rights Reserved.
6
- #
7
- # This is free software. Please see the LICENSE and COPYING files for details.
8
-
9
- require 'prawn/encoding'
10
- require 'afm'
11
-
12
- module Prawn
13
- class Font
14
- class AFM < Font
15
- BUILT_INS = %w[ Courier Helvetica Times-Roman Symbol ZapfDingbats
16
- Courier-Bold Courier-Oblique Courier-BoldOblique
17
- Times-Bold Times-Italic Times-BoldItalic
18
- Helvetica-Bold Helvetica-Oblique Helvetica-BoldOblique ]
19
-
20
- def unicode?
21
- false
22
- end
23
-
24
- def self.metrics_path
25
- if m = ENV['METRICS']
26
- @metrics_path ||= m.split(':')
27
- else
28
- @metrics_path ||= [
29
- ".", "/usr/lib/afm",
30
- "/usr/local/lib/afm",
31
- "/usr/openwin/lib/fonts/afm",
32
- Prawn::DATADIR+'/fonts']
33
- end
34
- end
35
-
36
- attr_reader :attributes #:nodoc:
37
-
38
- def initialize(document, name, options={}) #:nodoc:
39
- unless BUILT_INS.include?(name)
40
- raise Prawn::Errors::UnknownFont, "#{name} is not a known font."
41
- end
42
-
43
- super
44
-
45
- @@winansi ||= Prawn::Encoding::WinAnsi.new # parse data/encodings/win_ansi.txt once only
46
- @@font_data ||= SynchronizedCache.new # parse each ATM font file once only
47
-
48
- file_name = @name.dup
49
- file_name << ".afm" unless file_name =~ /\.afm$/
50
- file_name = file_name[0] == ?/ ? file_name : find_font(file_name)
51
-
52
- font_data = @@font_data[file_name] ||= ::AFM::Font.new(file_name)
53
- @glyph_table = build_glyph_table(font_data)
54
- @kern_pairs = font_data.kern_pairs
55
- @kern_pair_table = build_kern_pair_table(@kern_pairs)
56
- @attributes = font_data.metadata
57
-
58
- @ascender = @attributes["Ascender"].to_i
59
- @descender = @attributes["Descender"].to_i
60
- @line_gap = Float(bbox[3] - bbox[1]) - (@ascender - @descender)
61
- end
62
-
63
- # The font bbox, as an array of integers
64
- #
65
- def bbox
66
- @bbox ||= @attributes['FontBBox'].split(/\s+/).map { |e| Integer(e) }
67
- end
68
-
69
- # NOTE: String *must* be encoded as WinAnsi
70
- def compute_width_of(string, options={}) #:nodoc:
71
- scale = (options[:size] || size) / 1000.0
72
-
73
- if options[:kerning]
74
- strings, numbers = kern(string).partition { |e| e.is_a?(String) }
75
- total_kerning_offset = numbers.inject(0.0) { |s,r| s + r }
76
- (unscaled_width_of(strings.join) - total_kerning_offset) * scale
77
- else
78
- unscaled_width_of(string) * scale
79
- end
80
- end
81
-
82
- # Returns true if the font has kerning data, false otherwise
83
- #
84
- def has_kerning_data?
85
- @kern_pairs.any?
86
- end
87
-
88
- # built-in fonts only work with winansi encoding, so translate the
89
- # string. Changes the encoding in-place, so the argument itself
90
- # is replaced with a string in WinAnsi encoding.
91
- #
92
- def normalize_encoding(text)
93
- enc = @@winansi
94
- text.unpack("U*").collect { |i| enc[i] }.pack("C*")
95
- rescue ArgumentError
96
- raise Prawn::Errors::IncompatibleStringEncoding,
97
- "Arguments to text methods must be UTF-8 encoded"
98
- end
99
-
100
- # Returns the number of characters in +str+ (a WinAnsi-encoded string).
101
- #
102
- def character_count(str)
103
- str.length
104
- end
105
-
106
- # Perform any changes to the string that need to happen
107
- # before it is rendered to the canvas. Returns an array of
108
- # subset "chunks", where each chunk is an array of two elements.
109
- # The first element is the font subset number, and the second
110
- # is either a string or an array (for kerned text).
111
- #
112
- # For Adobe fonts, there is only ever a single subset, so
113
- # the first element of the array is "0", and the second is
114
- # the string itself (or an array, if kerning is performed).
115
- #
116
- # The +text+ parameter must be in WinAnsi encoding (cp1252).
117
- #
118
- def encode_text(text, options={})
119
- [[0, options[:kerning] ? kern(text) : text]]
120
- end
121
-
122
- def glyph_present?(char)
123
- if char == "_"
124
- true
125
- else
126
- normalize_encoding(char) != "_"
127
- end
128
- end
129
-
130
- private
131
-
132
- def register(subset)
133
- font_dict = {:Type => :Font,
134
- :Subtype => :Type1,
135
- :BaseFont => name.to_sym}
136
-
137
- # Symbolic AFM fonts (Symbol, ZapfDingbats) have their own encodings
138
- font_dict.merge!(:Encoding => :WinAnsiEncoding) unless symbolic?
139
-
140
- @document.ref!(font_dict)
141
- end
142
-
143
- def symbolic?
144
- attributes["CharacterSet"] == "Special"
145
- end
146
-
147
- def find_font(file)
148
- self.class.metrics_path.find { |f| File.exist? "#{f}/#{file}" } + "/#{file}"
149
- rescue NoMethodError
150
- raise Prawn::Errors::UnknownFont,
151
- "Couldn't find the font: #{file} in any of:\n" +
152
- self.class.metrics_path.join("\n")
153
- end
154
-
155
- # converts a string into an array with spacing offsets
156
- # bewteen characters that need to be kerned
157
- #
158
- # String *must* be encoded as WinAnsi
159
- #
160
- def kern(string)
161
- kerned = [[]]
162
- last_byte = nil
163
-
164
- string.each_byte do |byte|
165
- if k = last_byte && @kern_pair_table[[last_byte, byte]]
166
- kerned << -k << [byte]
167
- else
168
- kerned.last << byte
169
- end
170
- last_byte = byte
171
- end
172
-
173
- kerned.map { |e|
174
- e = (Array === e ? e.pack("C*") : e)
175
- e.respond_to?(:force_encoding) ? e.force_encoding("Windows-1252") : e
176
- }
177
- end
178
-
179
- def build_kern_pair_table(kern_pairs)
180
- character_hash = Hash[Encoding::WinAnsi::CHARACTERS.zip((0..Encoding::WinAnsi::CHARACTERS.size).to_a)]
181
- kern_pairs.inject({}) do |h,p|
182
- h[
183
- [character_hash[p[0]], character_hash[p[1]]]
184
- ] = p[2]
185
- h
186
- end
187
- end
188
-
189
- def build_glyph_table(font_data)
190
- (0..255).map do |char|
191
- metrics = font_data.metrics_for(char)
192
- metrics ? metrics[:wx] : 0
193
- end
194
- end
195
-
196
- def unscaled_width_of(string)
197
- string.bytes.inject(0) do |s,r|
198
- s + @glyph_table[r]
199
- end
200
- end
201
- end
202
- end
203
- end
data/lib/prawn/layout.rb DELETED
@@ -1,20 +0,0 @@
1
- require "prawn/table"
2
- require 'prawn/layout/grid'
3
-
4
- module Prawn
5
-
6
- module Errors
7
-
8
- # This error is raised when table data is malformed
9
- #
10
- InvalidTableData = Class.new(StandardError)
11
-
12
- # This error is raised when an empty or nil table is rendered
13
- #
14
- EmptyTable = Class.new(StandardError)
15
- end
16
-
17
- module Layout
18
-
19
- end
20
- end
@@ -1,70 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # image.rb: Table image cells.
4
- #
5
- # Copyright September 2010, Brad Ediger. All Rights Reserved.
6
- #
7
- # This is free software. Please see the LICENSE and COPYING files for details.
8
- module Prawn
9
- class Table
10
- class Cell
11
-
12
- # A Cell that contains another table.
13
- #
14
- class Image < Cell
15
-
16
- def initialize(pdf, point, options={})
17
- @image_options = {}
18
- super
19
-
20
- @pdf_object, @image_info = @pdf.build_image_object(@file)
21
- @natural_width, @natural_height = @image_info.calc_image_dimensions(
22
- @image_options)
23
- end
24
-
25
- def image=(file)
26
- @file = file
27
- end
28
-
29
- def scale=(s)
30
- @image_options[:scale] = s
31
- end
32
-
33
- def fit=(f)
34
- @image_options[:fit] = f
35
- end
36
-
37
- def image_height=(h)
38
- @image_options[:height] = h
39
- end
40
-
41
- def image_width=(w)
42
- @image_options[:width] = w
43
- end
44
-
45
- def position=(p)
46
- @image_options[:position] = p
47
- end
48
-
49
- def vposition=(vp)
50
- @image_options[:vposition] = vp
51
- end
52
-
53
- def natural_content_width
54
- @natural_width
55
- end
56
-
57
- def natural_content_height
58
- @natural_height
59
- end
60
-
61
- # Draw the image on the page.
62
- #
63
- def draw_content
64
- @pdf.embed_image(@pdf_object, @image_info, @image_options)
65
- end
66
-
67
- end
68
- end
69
- end
70
- end
@@ -1,27 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # Accessors for using a Cell inside a Table.
4
-
5
- module Prawn
6
- class Table
7
- class Cell
8
-
9
- # This module extends Cell objects when they are used in a table (as
10
- # opposed to standalone). Its properties apply to cells-in-tables but not
11
- # cells themselves.
12
- #
13
- module InTable
14
-
15
- # Row number (0-based).
16
- #
17
- attr_accessor :row
18
-
19
- # Column number (0-based).
20
- #
21
- attr_accessor :column
22
-
23
- end
24
-
25
- end
26
- end
27
- end
@@ -1,92 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # span_dummy.rb: Placeholder for non-master spanned cells.
4
- #
5
- # Copyright December 2011, Brad Ediger. All Rights Reserved.
6
- #
7
- # This is free software. Please see the LICENSE and COPYING files for details.
8
- module Prawn
9
- class Table
10
- class Cell
11
-
12
- # A Cell object used to represent all but the topmost cell in a span
13
- # group.
14
- #
15
- class SpanDummy < Cell
16
- def initialize(pdf, master_cell)
17
- super(pdf, [0, pdf.cursor])
18
- @master_cell = master_cell
19
- @padding = [0, 0, 0, 0]
20
- end
21
-
22
- # By default, a span dummy will never increase the height demand.
23
- #
24
- def natural_content_height
25
- 0
26
- end
27
-
28
- # By default, a span dummy will never increase the width demand.
29
- #
30
- def natural_content_width
31
- 0
32
- end
33
-
34
- def avg_spanned_min_width
35
- @master_cell.avg_spanned_min_width
36
- end
37
-
38
- # Dummy cells have nothing to draw.
39
- #
40
- def draw_borders(pt)
41
- end
42
-
43
- # Dummy cells have nothing to draw.
44
- #
45
- def draw_bounded_content(pt)
46
- end
47
-
48
- def padding_right=(val)
49
- @master_cell.padding_right = val if rightmost?
50
- end
51
-
52
- def padding_bottom=(val)
53
- @master_cell.padding_bottom = val if bottommost?
54
- end
55
-
56
- def border_right_color=(val)
57
- @master_cell.border_right_color = val if rightmost?
58
- end
59
-
60
- def border_bottom_color=(val)
61
- @master_cell.border_bottom_color = val if bottommost?
62
- end
63
-
64
- def border_right_width=(val)
65
- @master_cell.border_right_width = val if rightmost?
66
- end
67
-
68
- def border_bottom_width=(val)
69
- @master_cell.border_bottom_width = val if bottommost?
70
- end
71
-
72
- def background_color
73
- @master_cell.background_color
74
- end
75
-
76
- private
77
-
78
- # Are we on the right border of the span?
79
- #
80
- def rightmost?
81
- @column == @master_cell.column + @master_cell.colspan - 1
82
- end
83
-
84
- # Are we on the bottom border of the span?
85
- #
86
- def bottommost?
87
- @row == @master_cell.row + @master_cell.rowspan - 1
88
- end
89
- end
90
- end
91
- end
92
- end