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,351 +0,0 @@
1
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
2
-
3
- describe "Document built from a template" do
4
- it "should have the same page count as the source document" do
5
- filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
6
- @pdf = Prawn::Document.new(:template => filename)
7
- page_counter = PDF::Inspector::Page.analyze(@pdf.render)
8
-
9
- page_counter.pages.size.should == 1
10
- end
11
-
12
- it "should not set the template page's parent to the document pages catalog (especially with nested pages)" do
13
- filename = "#{Prawn::DATADIR}/pdfs/nested_pages.pdf"
14
- @pdf = Prawn::Document.new(:template => filename, :skip_page_creation => true)
15
- @pdf.state.page.dictionary.data[:Parent].should_not == @pdf.state.store.pages
16
- end
17
-
18
-
19
- it "should have start with the Y cursor at the top of the document" do
20
- filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
21
-
22
- @pdf = Prawn::Document.new(:template => filename)
23
- (@pdf.y == nil).should == false
24
- end
25
-
26
- it "should respect margins set by Prawn" do
27
- filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
28
-
29
- @pdf = Prawn::Document.new(:template => filename, :margin => 0)
30
- @pdf.page.margins.should == { :left => 0,
31
- :right => 0,
32
- :top => 0,
33
- :bottom => 0 }
34
-
35
- @pdf = Prawn::Document.new(:template => filename, :left_margin => 0)
36
-
37
- @pdf.page.margins.should == { :left => 0,
38
- :right => 36,
39
- :top => 36,
40
- :bottom => 36 }
41
-
42
- @pdf.start_new_page(:right_margin => 0)
43
-
44
- @pdf.page.margins.should == { :left => 0,
45
- :right => 0,
46
- :top => 36,
47
- :bottom => 36 }
48
-
49
-
50
-
51
- end
52
-
53
- it "should not add an extra restore_graphics_state operator to the end of any content stream" do
54
- filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
55
-
56
- @pdf = Prawn::Document.new(:template => filename)
57
- output = StringIO.new(@pdf.render)
58
- hash = PDF::Reader::ObjectHash.new(output)
59
-
60
- hash.each_value do |obj|
61
- next unless obj.kind_of?(PDF::Reader::Stream)
62
-
63
- data = obj.data.tr(" \n\r","")
64
- data.include?("QQ").should == false
65
- end
66
- end
67
-
68
- it "should have a single page object if importing a single page template" do
69
- filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
70
-
71
- @pdf = Prawn::Document.new(:template => filename)
72
- output = StringIO.new(@pdf.render)
73
- hash = PDF::Reader::ObjectHash.new(output)
74
-
75
- pages = hash.values.select { |obj| obj.kind_of?(Hash) && obj[:Type] == :Page }
76
-
77
- pages.size.should == 1
78
- end
79
-
80
- it "should have two content streams if importing a single page template" do
81
- filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
82
-
83
- @pdf = Prawn::Document.new(:template => filename)
84
- output = StringIO.new(@pdf.render)
85
- hash = PDF::Reader::ObjectHash.new(output)
86
-
87
- streams = hash.values.select { |obj| obj.kind_of?(PDF::Reader::Stream) }
88
-
89
- streams.size.should == 2
90
- end
91
-
92
- it "should not die if using this PDF as a template" do
93
- filename = "#{Prawn::DATADIR}/pdfs/complex_template.pdf"
94
-
95
- lambda {
96
- @pdf = Prawn::Document.new(:template => filename)
97
- }.should_not raise_error
98
- end
99
-
100
-
101
- it "should have balance q/Q operators on all content streams" do
102
- filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
103
-
104
- @pdf = Prawn::Document.new(:template => filename)
105
- output = StringIO.new(@pdf.render)
106
- hash = PDF::Reader::ObjectHash.new(output)
107
-
108
- streams = hash.values.select { |obj| obj.kind_of?(PDF::Reader::Stream) }
109
-
110
- streams.each do |stream|
111
- data = stream.unfiltered_data
112
- data.scan("q").size.should == 1
113
- data.scan("Q").size.should == 1
114
- end
115
- end
116
-
117
- it "should allow text to be added to a single page template" do
118
- filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
119
-
120
- @pdf = Prawn::Document.new(:template => filename)
121
-
122
- @pdf.text "Adding some text"
123
-
124
- text = PDF::Inspector::Text.analyze(@pdf.render)
125
- text.strings.first.should == "Adding some text"
126
- end
127
-
128
- it "should allow PDFs with page resources behind an indirect object to be used as templates" do
129
- filename = "#{Prawn::DATADIR}/pdfs/resources_as_indirect_object.pdf"
130
-
131
- @pdf = Prawn::Document.new(:template => filename)
132
-
133
- @pdf.text "Adding some text"
134
-
135
- text = PDF::Inspector::Text.analyze(@pdf.render)
136
- all_text = text.strings.join
137
- all_text.include?("Adding some text").should == true
138
- end
139
-
140
- it "should copy the PDF version from the template file" do
141
- filename = "#{Prawn::DATADIR}/pdfs/version_1_6.pdf"
142
-
143
- @pdf = Prawn::Document.new(:template => filename)
144
- str = @pdf.render
145
- str[0,8].should == "%PDF-1.6"
146
- end
147
-
148
- it "should correctly add a TTF font to a template that has existing fonts" do
149
- filename = "#{Prawn::DATADIR}/pdfs/contains_ttf_font.pdf"
150
- @pdf = Prawn::Document.new(:template => filename)
151
- @pdf.font "#{Prawn::DATADIR}/fonts/Chalkboard.ttf"
152
- @pdf.move_down(40)
153
- @pdf.text "Hi There"
154
-
155
- output = StringIO.new(@pdf.render)
156
- hash = PDF::Reader::ObjectHash.new(output)
157
-
158
- page_dict = hash.values.detect{ |obj| obj.is_a?(Hash) && obj[:Type] == :Page }
159
- resources = page_dict[:Resources]
160
- fonts = resources[:Font]
161
- fonts.size.should == 2
162
- end
163
-
164
- it "should correctly import a template file that is missing a MediaBox entry" do
165
- filename = "#{Prawn::DATADIR}/pdfs/page_without_mediabox.pdf"
166
-
167
- @pdf = Prawn::Document.new(:template => filename)
168
- str = @pdf.render
169
- str[0,4].should == "%PDF"
170
- end
171
-
172
- context "with the template as a stream" do
173
- it "should correctly import a template file from a stream" do
174
- filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
175
- io = StringIO.new(File.binread(filename))
176
- @pdf = Prawn::Document.new(:template => io)
177
- str = @pdf.render
178
- str[0,4].should == "%PDF"
179
- end
180
- end
181
-
182
- it "merges metadata info" do
183
- filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
184
- info = { :Title => "Sample METADATA",
185
- :Author => "Me",
186
- :Subject => "Not Working",
187
- :CreationDate => Time.now }
188
-
189
- @pdf = Prawn::Document.new(:template => filename, :info => info)
190
- output = StringIO.new(@pdf.render)
191
- hash = PDF::Reader::ObjectHash.new(output)
192
- info.keys.each { |k| hash[hash.trailer[:Info]].keys.include?(k).should == true }
193
- end
194
-
195
- end
196
-
197
- describe "Document#start_new_page with :template option" do
198
- filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
199
-
200
- it "should set the imported page's parent to the document pages catalog" do
201
- @pdf = Prawn::Document.new()
202
- @pdf.start_new_page(:template => filename)
203
- @pdf.state.page.dictionary.data[:Parent].should == @pdf.state.store.pages
204
- end
205
-
206
- it "should set start the Y cursor at the top of the page" do
207
- @pdf = Prawn::Document.new()
208
- @pdf.start_new_page(:template => filename)
209
- (@pdf.y == nil).should == false
210
- end
211
-
212
- it "should respect margins set by Prawn" do
213
- @pdf = Prawn::Document.new(:margin => 0)
214
- @pdf.start_new_page(:template => filename)
215
- @pdf.page.margins.should == { :left => 0,
216
- :right => 0,
217
- :top => 0,
218
- :bottom => 0 }
219
-
220
- @pdf = Prawn::Document.new(:left_margin => 0)
221
- @pdf.start_new_page(:template => filename)
222
- @pdf.page.margins.should == { :left => 0,
223
- :right => 36,
224
- :top => 36,
225
- :bottom => 36 }
226
- @pdf.start_new_page(:template => filename, :right_margin => 0)
227
- @pdf.page.margins.should == { :left => 0,
228
- :right => 0,
229
- :top => 36,
230
- :bottom => 36 }
231
- end
232
-
233
- it "should not add an extra restore_graphics_state operator to the end of any content stream" do
234
- @pdf = Prawn::Document.new
235
- @pdf.start_new_page(:template => filename)
236
- output = StringIO.new(@pdf.render)
237
- hash = PDF::Reader::ObjectHash.new(output)
238
-
239
- hash.each_value do |obj|
240
- next unless obj.kind_of?(PDF::Reader::Stream)
241
-
242
- data = obj.data.tr(" \n\r","")
243
- data.include?("QQ").should == false
244
- end
245
- end
246
-
247
- it "should have two content streams if importing a single page template" do
248
- filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
249
- @pdf = Prawn::Document.new()
250
- @pdf.start_new_page(:template => filename)
251
- output = StringIO.new(@pdf.render)
252
- hash = PDF::Reader::ObjectHash.new(output)
253
- pages = hash.values.find {|obj| obj.is_a?(Hash) && obj[:Type] == :Pages}[:Kids]
254
- template_page = hash[pages[1]]
255
- template_page[:Contents].size.should == 2
256
- end
257
-
258
- it "should have balance q/Q operators on all content streams" do
259
- filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
260
-
261
- @pdf = Prawn::Document.new()
262
- @pdf.start_new_page(:template => filename)
263
- output = StringIO.new(@pdf.render)
264
- hash = PDF::Reader::ObjectHash.new(output)
265
-
266
- streams = hash.values.select { |obj| obj.kind_of?(PDF::Reader::Stream) }
267
-
268
- streams.each do |stream|
269
- data = stream.unfiltered_data
270
- data.scan("q").size.should == 1
271
- data.scan("Q").size.should == 1
272
- end
273
- end
274
-
275
- it "should allow text to be added to a single page template" do
276
-
277
- @pdf = Prawn::Document.new()
278
- @pdf.start_new_page(:template => filename)
279
-
280
- @pdf.text "Adding some text"
281
-
282
- text = PDF::Inspector::Text.analyze(@pdf.render)
283
- text.strings.first.should == "Adding some text"
284
- end
285
-
286
- it "should allow PDFs with page resources behind an indirect object to be used as templates" do
287
- filename = "#{Prawn::DATADIR}/pdfs/resources_as_indirect_object.pdf"
288
-
289
- @pdf = Prawn::Document.new()
290
- @pdf.start_new_page(:template => filename)
291
-
292
- @pdf.text "Adding some text"
293
-
294
- text = PDF::Inspector::Text.analyze(@pdf.render)
295
- all_text = text.strings.join
296
- all_text.include?("Adding some text").should == true
297
- end
298
-
299
- it "should correctly add a TTF font to a template that has existing fonts" do
300
- filename = "#{Prawn::DATADIR}/pdfs/contains_ttf_font.pdf"
301
- @pdf = Prawn::Document.new()
302
- @pdf.start_new_page(:template => filename)
303
- @pdf.font "#{Prawn::DATADIR}/fonts/Chalkboard.ttf"
304
- @pdf.move_down(40)
305
- @pdf.text "Hi There"
306
-
307
- output = StringIO.new(@pdf.render)
308
- hash = PDF::Reader::ObjectHash.new(output)
309
- hash = PDF::Reader::ObjectHash.new(output)
310
- pages = hash.values.find {|obj| obj.is_a?(Hash) && obj[:Type] == :Pages}[:Kids]
311
- template_page = hash[pages[1]]
312
- resources = template_page[:Resources]
313
- fonts = resources[:Font]
314
- fonts.size.should == 2
315
- end
316
-
317
- it "indexes template pages when used multiple times" do
318
- filename = "#{Prawn::DATADIR}/pdfs/multipage_template.pdf"
319
- @repeated_pdf = Prawn::Document.new()
320
- 3.times { @repeated_pdf.start_new_page(:template => filename) }
321
- repeated_hash = PDF::Reader::ObjectHash.new(StringIO.new(@repeated_pdf.render))
322
- @sequential_pdf = Prawn::Document.new()
323
- (1..3).each { |p| @sequential_pdf.start_new_page(:template => filename, :template_page => p ) }
324
- sequential_hash = PDF::Reader::ObjectHash.new(StringIO.new(@sequential_pdf.render))
325
- (repeated_hash.size < sequential_hash.size).should == true
326
- end
327
-
328
- context "with the template as a stream" do
329
- it "should correctly import a template file from a stream" do
330
- filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
331
- io = StringIO.new(File.binread(filename))
332
-
333
- @pdf = Prawn::Document.new()
334
- @pdf.start_new_page(:template => io)
335
-
336
- str = @pdf.render
337
- str[0,4].should == "%PDF"
338
- end
339
- end
340
-
341
- context "using template_page option" do
342
- it "uses the specified page option" do
343
- filename = "#{Prawn::DATADIR}/pdfs/multipage_template.pdf"
344
- @pdf = Prawn::Document.new()
345
- @pdf.start_new_page(:template => filename, :template_page => 2)
346
- text = PDF::Inspector::Text.analyze(@pdf.render)
347
- text.strings.first.should == "This is template page 2"
348
- end
349
- end
350
-
351
- end
data/spec/text_at_spec.rb DELETED
@@ -1,130 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "#draw_text" do
6
- before(:each) { create_pdf }
7
-
8
- it "should raise_error ArgumentError if :at option omitted" do
9
- lambda { @pdf.draw_text("hai", { }) }.should raise_error(ArgumentError)
10
- end
11
-
12
- it "should raise_error ArgumentError if :align option included" do
13
- lambda { @pdf.draw_text("hai", :at => [0, 0], :align => :center) }.should raise_error(ArgumentError)
14
- end
15
-
16
- it "should allow drawing empty strings to the page" do
17
- @pdf.draw_text(" ", :at => [100,100])
18
- text = PDF::Inspector::Text.analyze(@pdf.render)
19
- text.strings.first.should == " "
20
- end
21
-
22
- it "should default to 12 point helvetica" do
23
- @pdf.draw_text("Blah", :at => [100,100])
24
- text = PDF::Inspector::Text.analyze(@pdf.render)
25
- text.font_settings[0][:name].should == :Helvetica
26
- text.font_settings[0][:size].should == 12
27
- text.strings.first.should == "Blah"
28
- end
29
-
30
- it "should allow setting font size" do
31
- @pdf.draw_text("Blah", :at => [100,100], :size => 16)
32
- text = PDF::Inspector::Text.analyze(@pdf.render)
33
- text.font_settings[0][:size].should == 16
34
- end
35
-
36
- it "should allow setting a default font size" do
37
- @pdf.font_size = 16
38
- @pdf.draw_text("Blah", :at => [0, 0])
39
- text = PDF::Inspector::Text.analyze(@pdf.render)
40
- text.font_settings[0][:size].should == 16
41
- end
42
-
43
- it "should allow overriding default font for a single instance" do
44
- @pdf.font_size = 16
45
-
46
- @pdf.draw_text("Blah", :size => 11, :at => [0, 0])
47
- @pdf.draw_text("Blaz", :at => [0, 0])
48
- text = PDF::Inspector::Text.analyze(@pdf.render)
49
- text.font_settings[0][:size].should == 11
50
- text.font_settings[1][:size].should == 16
51
- end
52
-
53
- it "should allow setting a font size transaction with a block" do
54
- @pdf.font_size 16 do
55
- @pdf.draw_text('Blah', :at => [0, 0])
56
- end
57
-
58
- @pdf.draw_text('blah', :at => [0, 0])
59
-
60
- text = PDF::Inspector::Text.analyze(@pdf.render)
61
- text.font_settings[0][:size].should == 16
62
- text.font_settings[1][:size].should == 12
63
- end
64
-
65
- it "should allow manual setting the font size " +
66
- "when in a font size block" do
67
- @pdf.font_size(16) do
68
- @pdf.draw_text('Foo', :at => [0, 0])
69
- @pdf.draw_text('Blah', :size => 11, :at => [0, 0])
70
- @pdf.draw_text('Blaz', :at => [0, 0])
71
- end
72
- text = PDF::Inspector::Text.analyze(@pdf.render)
73
- text.font_settings[0][:size].should == 16
74
- text.font_settings[1][:size].should == 11
75
- text.font_settings[2][:size].should == 16
76
- end
77
-
78
- it "should allow registering of built-in font_settings on the fly" do
79
- @pdf.font "Times-Roman"
80
- @pdf.draw_text("Blah", :at => [100,100], :at => [0, 0])
81
- @pdf.font "Courier"
82
- @pdf.draw_text("Blaz", :at => [150,150], :at => [0, 0])
83
- text = PDF::Inspector::Text.analyze(@pdf.render)
84
- text.font_settings[0][:name].should == :"Times-Roman"
85
- text.font_settings[1][:name].should == :Courier
86
- end
87
-
88
- it "should raise_error an exception when an unknown font is used" do
89
- lambda { @pdf.font "Pao bu" }.should raise_error(Prawn::Errors::UnknownFont)
90
- end
91
-
92
- it "should correctly render a utf-8 string when using a built-in font" do
93
- str = "©" # copyright symbol
94
- @pdf.draw_text(str, :at => [0, 0])
95
-
96
- # grab the text from the rendered PDF and ensure it matches
97
- text = PDF::Inspector::Text.analyze(@pdf.render)
98
- text.strings.first.should == str
99
- end
100
-
101
- if "spec".respond_to?(:encode!)
102
- # Handle non utf-8 string encodings in a sane way on M17N aware VMs
103
- it "should raise_error an exception when a utf-8 incompatible string is rendered" do
104
- str = "Blah \xDD"
105
- str.force_encoding("ASCII-8BIT")
106
- lambda { @pdf.draw_text(str, :at => [0, 0]) }.should raise_error(
107
- Prawn::Errors::IncompatibleStringEncoding)
108
- end
109
-
110
- it "should not raise an exception when a shift-jis string is rendered" do
111
- datafile = "#{Prawn::DATADIR}/shift_jis_text.txt"
112
- sjis_str = File.open(datafile, "r:shift_jis") { |f| f.gets }
113
- @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf")
114
-
115
- @pdf.draw_text(sjis_str, :at => [0, 0])
116
- end
117
- else
118
- # Handle non utf-8 string encodings in a sane way on non-M17N aware VMs
119
- it "should raise_error an exception when a corrupt utf-8 string is rendered" do
120
- str = "Blah \xDD"
121
- lambda { @pdf.draw_text(str, :at => [0, 0]) }.should raise_error(
122
- Prawn::Errors::IncompatibleStringEncoding)
123
- end
124
- it "should raise_error an exception when a shift-jis string is rendered" do
125
- sjis_str = File.read("#{Prawn::DATADIR}/shift_jis_text.txt")
126
- lambda { @pdf.draw_text(sjis_str, :at => [0, 0]) }.should raise_error(
127
- Prawn::Errors::IncompatibleStringEncoding)
128
- end
129
- end
130
- end