prawn 2.4.0 → 2.5.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 (203) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/prawn/document/bounding_box.rb +213 -141
  4. data/lib/prawn/document/column_box.rb +61 -26
  5. data/lib/prawn/document/internals.rb +25 -16
  6. data/lib/prawn/document/span.rb +20 -18
  7. data/lib/prawn/document.rb +257 -171
  8. data/lib/prawn/encoding.rb +2 -5
  9. data/lib/prawn/errors.rb +23 -34
  10. data/lib/prawn/font.rb +248 -135
  11. data/lib/prawn/font_metric_cache.rb +11 -10
  12. data/lib/prawn/fonts/afm.rb +85 -45
  13. data/lib/prawn/fonts/dfont.rb +7 -1
  14. data/lib/prawn/fonts/otf.rb +4 -1
  15. data/lib/prawn/fonts/to_unicode_cmap.rb +151 -0
  16. data/lib/prawn/fonts/ttc.rb +7 -2
  17. data/lib/prawn/fonts/ttf.rb +305 -93
  18. data/lib/prawn/fonts.rb +14 -0
  19. data/lib/prawn/graphics/blend_mode.rb +25 -28
  20. data/lib/prawn/graphics/cap_style.rb +9 -12
  21. data/lib/prawn/graphics/color.rb +57 -34
  22. data/lib/prawn/graphics/dash.rb +45 -42
  23. data/lib/prawn/graphics/join_style.rb +17 -11
  24. data/lib/prawn/graphics/patterns.rb +190 -69
  25. data/lib/prawn/graphics/transformation.rb +48 -41
  26. data/lib/prawn/graphics/transparency.rb +16 -40
  27. data/lib/prawn/graphics.rb +363 -253
  28. data/lib/prawn/grid.rb +184 -57
  29. data/lib/prawn/image_handler.rb +27 -10
  30. data/lib/prawn/images/image.rb +8 -10
  31. data/lib/prawn/images/jpg.rb +42 -19
  32. data/lib/prawn/images/png.rb +92 -41
  33. data/lib/prawn/images.rb +44 -57
  34. data/lib/prawn/measurement_extensions.rb +39 -8
  35. data/lib/prawn/measurements.rb +60 -5
  36. data/lib/prawn/outline.rb +114 -108
  37. data/lib/prawn/repeater.rb +51 -35
  38. data/lib/prawn/security/arcfour.rb +4 -4
  39. data/lib/prawn/security.rb +75 -70
  40. data/lib/prawn/soft_mask.rb +42 -30
  41. data/lib/prawn/stamp.rb +38 -42
  42. data/lib/prawn/text/box.rb +146 -96
  43. data/lib/prawn/text/formatted/arranger.rb +87 -26
  44. data/lib/prawn/text/formatted/box.rb +221 -150
  45. data/lib/prawn/text/formatted/fragment.rb +130 -14
  46. data/lib/prawn/text/formatted/line_wrap.rb +33 -24
  47. data/lib/prawn/text/formatted/parser.rb +112 -72
  48. data/lib/prawn/text/formatted/wrap.rb +12 -17
  49. data/lib/prawn/text/formatted.rb +75 -0
  50. data/lib/prawn/text.rb +441 -196
  51. data/lib/prawn/transformation_stack.rb +29 -10
  52. data/lib/prawn/utilities.rb +13 -13
  53. data/lib/prawn/version.rb +2 -1
  54. data/lib/prawn/view.rb +68 -53
  55. data/lib/prawn.rb +23 -18
  56. data.tar.gz.sig +0 -0
  57. metadata +54 -177
  58. metadata.gz.sig +0 -0
  59. data/.yardopts +0 -10
  60. data/Gemfile +0 -5
  61. data/Rakefile +0 -25
  62. data/manual/absolute_position.pdf +0 -0
  63. data/manual/basic_concepts/adding_pages.rb +0 -26
  64. data/manual/basic_concepts/basic_concepts.rb +0 -43
  65. data/manual/basic_concepts/creation.rb +0 -38
  66. data/manual/basic_concepts/cursor.rb +0 -32
  67. data/manual/basic_concepts/measurement.rb +0 -24
  68. data/manual/basic_concepts/origin.rb +0 -37
  69. data/manual/basic_concepts/other_cursor_helpers.rb +0 -39
  70. data/manual/basic_concepts/view.rb +0 -48
  71. data/manual/bounding_box/bounding_box.rb +0 -41
  72. data/manual/bounding_box/bounds.rb +0 -48
  73. data/manual/bounding_box/canvas.rb +0 -23
  74. data/manual/bounding_box/creation.rb +0 -22
  75. data/manual/bounding_box/indentation.rb +0 -45
  76. data/manual/bounding_box/nesting.rb +0 -52
  77. data/manual/bounding_box/russian_boxes.rb +0 -40
  78. data/manual/bounding_box/stretchy.rb +0 -29
  79. data/manual/contents.rb +0 -35
  80. data/manual/cover.rb +0 -43
  81. data/manual/document_and_page_options/background.rb +0 -29
  82. data/manual/document_and_page_options/document_and_page_options.rb +0 -34
  83. data/manual/document_and_page_options/metadata.rb +0 -25
  84. data/manual/document_and_page_options/page_margins.rb +0 -36
  85. data/manual/document_and_page_options/page_size.rb +0 -34
  86. data/manual/document_and_page_options/print_scaling.rb +0 -23
  87. data/manual/example_helper.rb +0 -8
  88. data/manual/graphics/blend_mode.rb +0 -52
  89. data/manual/graphics/circle_and_ellipse.rb +0 -21
  90. data/manual/graphics/color.rb +0 -22
  91. data/manual/graphics/common_lines.rb +0 -29
  92. data/manual/graphics/fill_and_stroke.rb +0 -41
  93. data/manual/graphics/fill_rules.rb +0 -38
  94. data/manual/graphics/gradients.rb +0 -43
  95. data/manual/graphics/graphics.rb +0 -64
  96. data/manual/graphics/helper.rb +0 -34
  97. data/manual/graphics/line_width.rb +0 -36
  98. data/manual/graphics/lines_and_curves.rb +0 -40
  99. data/manual/graphics/polygon.rb +0 -27
  100. data/manual/graphics/rectangle.rb +0 -20
  101. data/manual/graphics/rotate.rb +0 -25
  102. data/manual/graphics/scale.rb +0 -42
  103. data/manual/graphics/soft_masks.rb +0 -44
  104. data/manual/graphics/stroke_cap.rb +0 -30
  105. data/manual/graphics/stroke_dash.rb +0 -47
  106. data/manual/graphics/stroke_join.rb +0 -29
  107. data/manual/graphics/translate.rb +0 -29
  108. data/manual/graphics/transparency.rb +0 -33
  109. data/manual/how_to_read_this_manual.rb +0 -39
  110. data/manual/images/absolute_position.rb +0 -22
  111. data/manual/images/fit.rb +0 -20
  112. data/manual/images/horizontal.rb +0 -24
  113. data/manual/images/images.rb +0 -41
  114. data/manual/images/plain_image.rb +0 -17
  115. data/manual/images/scale.rb +0 -21
  116. data/manual/images/vertical.rb +0 -30
  117. data/manual/images/width_and_height.rb +0 -24
  118. data/manual/layout/boxes.rb +0 -26
  119. data/manual/layout/content.rb +0 -24
  120. data/manual/layout/layout.rb +0 -27
  121. data/manual/layout/simple_grid.rb +0 -22
  122. data/manual/outline/add_subsection_to.rb +0 -60
  123. data/manual/outline/insert_section_after.rb +0 -46
  124. data/manual/outline/outline.rb +0 -33
  125. data/manual/outline/sections_and_pages.rb +0 -66
  126. data/manual/repeatable_content/alternate_page_numbering.rb +0 -36
  127. data/manual/repeatable_content/page_numbering.rb +0 -55
  128. data/manual/repeatable_content/repeatable_content.rb +0 -35
  129. data/manual/repeatable_content/repeater.rb +0 -54
  130. data/manual/repeatable_content/stamp.rb +0 -40
  131. data/manual/security/encryption.rb +0 -28
  132. data/manual/security/permissions.rb +0 -43
  133. data/manual/security/security.rb +0 -28
  134. data/manual/table.rb +0 -16
  135. data/manual/text/alignment.rb +0 -43
  136. data/manual/text/color.rb +0 -24
  137. data/manual/text/column_box.rb +0 -30
  138. data/manual/text/fallback_fonts.rb +0 -41
  139. data/manual/text/font.rb +0 -40
  140. data/manual/text/font_size.rb +0 -44
  141. data/manual/text/font_style.rb +0 -25
  142. data/manual/text/formatted_callbacks.rb +0 -70
  143. data/manual/text/formatted_text.rb +0 -61
  144. data/manual/text/free_flowing_text.rb +0 -50
  145. data/manual/text/inline.rb +0 -40
  146. data/manual/text/kerning_and_character_spacing.rb +0 -38
  147. data/manual/text/leading.rb +0 -24
  148. data/manual/text/line_wrapping.rb +0 -60
  149. data/manual/text/paragraph_indentation.rb +0 -31
  150. data/manual/text/positioned_text.rb +0 -37
  151. data/manual/text/registering_families.rb +0 -51
  152. data/manual/text/rendering_and_color.rb +0 -36
  153. data/manual/text/right_to_left_text.rb +0 -54
  154. data/manual/text/rotation.rb +0 -52
  155. data/manual/text/single_usage.rb +0 -36
  156. data/manual/text/text.rb +0 -75
  157. data/manual/text/text_box_excess.rb +0 -35
  158. data/manual/text/text_box_extensions.rb +0 -48
  159. data/manual/text/text_box_overflow.rb +0 -51
  160. data/manual/text/utf8.rb +0 -27
  161. data/manual/text/win_ansi_charset.rb +0 -62
  162. data/prawn.gemspec +0 -51
  163. data/spec/data/curves.pdf +0 -66
  164. data/spec/extensions/encoding_helpers.rb +0 -11
  165. data/spec/prawn/document/bounding_box_spec.rb +0 -550
  166. data/spec/prawn/document/column_box_spec.rb +0 -75
  167. data/spec/prawn/document/security_spec.rb +0 -176
  168. data/spec/prawn/document_annotations_spec.rb +0 -76
  169. data/spec/prawn/document_destinations_spec.rb +0 -15
  170. data/spec/prawn/document_grid_spec.rb +0 -99
  171. data/spec/prawn/document_reference_spec.rb +0 -27
  172. data/spec/prawn/document_span_spec.rb +0 -44
  173. data/spec/prawn/document_spec.rb +0 -805
  174. data/spec/prawn/font_metric_cache_spec.rb +0 -54
  175. data/spec/prawn/font_spec.rb +0 -544
  176. data/spec/prawn/graphics/blend_mode_spec.rb +0 -63
  177. data/spec/prawn/graphics/transparency_spec.rb +0 -81
  178. data/spec/prawn/graphics_spec.rb +0 -872
  179. data/spec/prawn/graphics_stroke_styles_spec.rb +0 -229
  180. data/spec/prawn/image_handler_spec.rb +0 -53
  181. data/spec/prawn/images/jpg_spec.rb +0 -20
  182. data/spec/prawn/images/png_spec.rb +0 -283
  183. data/spec/prawn/images_spec.rb +0 -229
  184. data/spec/prawn/measurements_extensions_spec.rb +0 -24
  185. data/spec/prawn/outline_spec.rb +0 -512
  186. data/spec/prawn/repeater_spec.rb +0 -166
  187. data/spec/prawn/soft_mask_spec.rb +0 -74
  188. data/spec/prawn/stamp_spec.rb +0 -173
  189. data/spec/prawn/text/box_spec.rb +0 -1110
  190. data/spec/prawn/text/formatted/arranger_spec.rb +0 -466
  191. data/spec/prawn/text/formatted/box_spec.rb +0 -849
  192. data/spec/prawn/text/formatted/fragment_spec.rb +0 -343
  193. data/spec/prawn/text/formatted/line_wrap_spec.rb +0 -495
  194. data/spec/prawn/text/formatted/parser_spec.rb +0 -697
  195. data/spec/prawn/text_draw_text_spec.rb +0 -150
  196. data/spec/prawn/text_rendering_mode_spec.rb +0 -48
  197. data/spec/prawn/text_spacing_spec.rb +0 -95
  198. data/spec/prawn/text_spec.rb +0 -603
  199. data/spec/prawn/text_with_inline_formatting_spec.rb +0 -35
  200. data/spec/prawn/transformation_stack_spec.rb +0 -66
  201. data/spec/prawn/view_spec.rb +0 -63
  202. data/spec/prawn_manual_spec.rb +0 -35
  203. data/spec/spec_helper.rb +0 -48
@@ -1,74 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe Prawn::SoftMask do
6
- let(:pdf) { create_pdf }
7
-
8
- def make_soft_mask
9
- pdf.save_graphics_state do
10
- pdf.soft_mask do
11
- if block_given?
12
- yield
13
- else
14
- pdf.fill_color '808080'
15
- pdf.fill_rectangle [100, 100], 200, 200
16
- end
17
- end
18
-
19
- pdf.fill_color '000000'
20
- pdf.fill_rectangle [0, 0], 200, 200
21
- end
22
- end
23
-
24
- it 'has PDF version at least 1.4' do
25
- make_soft_mask
26
- str = pdf.render
27
- expect(str[0, 8]).to eq('%PDF-1.4')
28
- end
29
-
30
- it 'creates a new extended graphics state for each unique soft mask' do
31
- make_soft_mask do
32
- pdf.fill_color '808080'
33
- pdf.fill_rectangle [100, 100], 200, 200
34
- end
35
-
36
- make_soft_mask do
37
- pdf.fill_color '808080'
38
- pdf.fill_rectangle [10, 10], 200, 200
39
- end
40
-
41
- extgstates = PDF::Inspector::ExtGState.analyze(pdf.render).extgstates
42
- expect(extgstates.length).to eq(2)
43
- end
44
-
45
- it 'a new extended graphics state contains soft mask with drawing '\
46
- 'instructions' do
47
- make_soft_mask do
48
- pdf.fill_color '808080'
49
- pdf.fill_rectangle [100, 100], 200, 200
50
- end
51
-
52
- extgstate = PDF::Inspector::ExtGState.analyze(pdf.render).extgstates.first
53
- expect(extgstate[:soft_mask][:G].data).to eq(
54
- "q\n/DeviceRGB cs\n0.0 0.0 0.0 scn\n/DeviceRGB CS\n0.0 0.0 0.0 SCN\n"\
55
- "1 w\n0 J\n0 j\n[] 0 d\n/DeviceRGB cs\n0.50196 0.50196 0.50196 scn\n"\
56
- "100.0 -100.0 200.0 200.0 re\nf\nQ\n"
57
- )
58
- end
59
-
60
- it 'does not create duplicate extended graphics states' do
61
- make_soft_mask do
62
- pdf.fill_color '808080'
63
- pdf.fill_rectangle [100, 100], 200, 200
64
- end
65
-
66
- make_soft_mask do
67
- pdf.fill_color '808080'
68
- pdf.fill_rectangle [100, 100], 200, 200
69
- end
70
-
71
- extgstates = PDF::Inspector::ExtGState.analyze(pdf.render).extgstates
72
- expect(extgstates.length).to eq(1)
73
- end
74
- end
@@ -1,173 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe Prawn::Stamp do
6
- describe 'create_stamp before any page is added' do
7
- let(:pdf) { Prawn::Document.new(skip_page_creation: true) }
8
-
9
- it 'works with the font class' do
10
- # If anything goes wrong, Prawn::Errors::NotOnPage will be raised
11
- pdf.create_stamp('my_stamp') do
12
- pdf.font.height
13
- end
14
- end
15
-
16
- it 'works with setting color' do
17
- # If anything goes wrong, Prawn::Errors::NotOnPage will be raised
18
- pdf.create_stamp('my_stamp') do
19
- pdf.fill_color = 'ff0000'
20
- end
21
- end
22
- end
23
-
24
- describe '#stamp_at' do
25
- let(:pdf) { create_pdf }
26
-
27
- it 'works' do
28
- pdf.create_stamp('MyStamp')
29
- pdf.stamp_at('MyStamp', [100, 200])
30
- # I had modified PDF::Inspector::XObject to receive the
31
- # invoke_xobject message and count the number of times it was
32
- # called, but it was only called once, so I reverted checking the
33
- # output with a regular expression
34
- expect(pdf.render).to match(%r{/Stamp1 Do.*?}m)
35
- end
36
- end
37
-
38
- describe 'Document with a stamp' do
39
- let(:pdf) { create_pdf }
40
-
41
- it 'raises NameTaken error when attempt to create stamp with '\
42
- 'same name as an existing stamp' do
43
- pdf.create_stamp('MyStamp')
44
- expect do
45
- pdf.create_stamp('MyStamp')
46
- end.to raise_error(Prawn::Errors::NameTaken)
47
- end
48
-
49
- it 'raises InvalidName error when attempt to create stamp with '\
50
- 'a blank name' do
51
- expect do
52
- pdf.create_stamp('')
53
- end.to raise_error(Prawn::Errors::InvalidName)
54
- end
55
-
56
- it 'a new XObject should be defined for each stamp created' do
57
- pdf.create_stamp('MyStamp')
58
- pdf.create_stamp('AnotherStamp')
59
- pdf.stamp('MyStamp')
60
- pdf.stamp('AnotherStamp')
61
-
62
- inspector = PDF::Inspector::XObject.analyze(pdf.render)
63
- xobjects = inspector.page_xobjects.last
64
- expect(xobjects.length).to eq(2)
65
- end
66
-
67
- it 'calling stamp with a name that does not match an existing stamp ' \
68
- 'should raise_error UndefinedObjectName' do
69
- pdf.create_stamp('MyStamp')
70
- expect do
71
- pdf.stamp('OtherStamp')
72
- end.to raise_error(Prawn::Errors::UndefinedObjectName)
73
- end
74
-
75
- it 'stamp should be drawn into the document each time stamp is called' do
76
- pdf.create_stamp('MyStamp')
77
- pdf.stamp('MyStamp')
78
- pdf.stamp('MyStamp')
79
- pdf.stamp('MyStamp')
80
- # I had modified PDF::Inspector::XObject to receive the
81
- # invoke_xobject message and count the number of times it was
82
- # called, but it was only called once, so I reverted checking the
83
- # output with a regular expression
84
- expect(pdf.render).to match(%r{(/Stamp1 Do.*?){3}}m)
85
- end
86
-
87
- it 'stamp should render clickable links' do
88
- pdf.create_stamp 'bar' do
89
- pdf.text '<b>Prawn</b> <link href="http://github.com">GitHub</link>',
90
- inline_format: true
91
- end
92
- pdf.stamp 'bar'
93
-
94
- output = pdf.render
95
- objects = output.split('endobj')
96
-
97
- objects.each do |obj|
98
- next unless %r{/Type /Page$}.match?(obj)
99
-
100
- # The page object must contain the annotation reference
101
- # to render a clickable link
102
- expect(obj).to match(%r{^/Annots \[\d \d .\]$})
103
- end
104
- end
105
-
106
- it 'resources added during stamp creation should be added to the ' \
107
- 'stamp XObject, not the page' do
108
- pdf.create_stamp('MyStamp') do
109
- pdf.transparent(0.5) { pdf.circle([100, 100], 10) }
110
- end
111
- pdf.stamp('MyStamp')
112
-
113
- # Inspector::XObject does not give information about resources, so
114
- # resorting to string matching
115
-
116
- output = pdf.render
117
- objects = output.split('endobj')
118
- objects.each do |object|
119
- case object
120
- when %r{/Type /Page$}
121
- expect(object).to_not match(%r{/ExtGState})
122
- when %r{/Type /XObject$}
123
- expect(object).to match(%r{/ExtGState})
124
- end
125
- end
126
- end
127
-
128
- it 'stamp stream should be wrapped in a graphic state' do
129
- pdf.create_stamp('MyStamp') do
130
- pdf.text "This should have a 'q' before it and a 'Q' after it"
131
- end
132
- pdf.stamp('MyStamp')
133
- stamps = PDF::Inspector::XObject.analyze(pdf.render)
134
- expect(stamps.xobject_streams[:Stamp1].data.chomp).to match(/q(.|\s)*Q\Z/)
135
- end
136
-
137
- it 'does not add to the page graphic state stack' do
138
- expect(pdf.state.page.stack.stack.size).to eq(1)
139
-
140
- pdf.create_stamp('MyStamp') do
141
- pdf.save_graphics_state
142
- pdf.save_graphics_state
143
- pdf.save_graphics_state
144
- pdf.text "This should have a 'q' before it and a 'Q' after it"
145
- pdf.restore_graphics_state
146
- end
147
- expect(pdf.state.page.stack.stack.size).to eq(1)
148
- end
149
-
150
- it 'is able to change fill and stroke colors within the stamp stream' do
151
- pdf.create_stamp('MyStamp') do
152
- pdf.fill_color(100, 100, 20, 0)
153
- pdf.stroke_color(100, 100, 20, 0)
154
- end
155
- pdf.stamp('MyStamp')
156
- stamps = PDF::Inspector::XObject.analyze(pdf.render)
157
- stamp_stream = stamps.xobject_streams[:Stamp1].data
158
- expect(stamp_stream).to include("/DeviceCMYK cs\n1.0 1.0 0.2 0.0 scn")
159
- expect(stamp_stream).to include("/DeviceCMYK CS\n1.0 1.0 0.2 0.0 SCN")
160
- end
161
-
162
- it 'saves the color space even when same as current page color space' do
163
- pdf.stroke_color(100, 100, 20, 0)
164
- pdf.create_stamp('MyStamp') do
165
- pdf.stroke_color(100, 100, 20, 0)
166
- end
167
- pdf.stamp('MyStamp')
168
- stamps = PDF::Inspector::XObject.analyze(pdf.render)
169
- stamp_stream = stamps.xobject_streams[:Stamp1].data
170
- expect(stamp_stream).to include("/DeviceCMYK CS\n1.0 1.0 0.2 0.0 SCN")
171
- end
172
- end
173
- end