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,176 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'tempfile'
5
-
6
- describe Prawn::Document::Security do
7
- describe 'Password padding' do
8
- include described_class
9
-
10
- it 'truncates long passwords' do
11
- pw = 'Long long string' * 30
12
- padded = pad_password(pw)
13
- expect(padded.length).to eq(32)
14
- expect(padded).to eq(pw[0, 32])
15
- end
16
-
17
- it 'pads short passwords' do
18
- pw = 'abcd'
19
- padded = pad_password(pw)
20
- expect(padded.length).to eq(32)
21
- expect(padded).to eq(
22
- pw + Prawn::Document::Security::PASSWORD_PADDING[0, 28]
23
- )
24
- end
25
-
26
- it 'fullies pad null passwords' do
27
- pw = ''
28
- padded = pad_password(pw)
29
- expect(padded.length).to eq(32)
30
- expect(padded).to eq(Prawn::Document::Security::PASSWORD_PADDING)
31
- end
32
- end
33
-
34
- describe 'Setting permissions' do
35
- def doc_with_permissions(permissions)
36
- pdf = Prawn::Document.new
37
-
38
- # Make things easier to test
39
- pdf.singleton_class.__send__ :public, :permissions_value
40
- # class << pdf
41
- # public :permissions_value
42
- # end
43
-
44
- pdf.encrypt_document(permissions: permissions)
45
- pdf
46
- end
47
-
48
- it 'defaults to full permissions' do
49
- expect(doc_with_permissions({}).permissions_value).to eq(0xFFFFFFFF)
50
- expect(doc_with_permissions(
51
- print_document: true,
52
- modify_contents: true,
53
- copy_contents: true,
54
- modify_annotations: true
55
- ).permissions_value)
56
- .to eq(0xFFFFFFFF)
57
- end
58
-
59
- it 'clears the appropriate bits for each permission flag' do
60
- expect(doc_with_permissions(print_document: false).permissions_value)
61
- .to eq(0b1111_1111_1111_1111_1111_1111_1111_1011)
62
- expect(doc_with_permissions(modify_contents: false).permissions_value)
63
- .to eq(0b1111_1111_1111_1111_1111_1111_1111_0111)
64
- expect(doc_with_permissions(copy_contents: false).permissions_value)
65
- .to eq(0b1111_1111_1111_1111_1111_1111_1110_1111)
66
- expect(doc_with_permissions(modify_annotations: false).permissions_value)
67
- .to eq(0b1111_1111_1111_1111_1111_1111_1101_1111)
68
- end
69
-
70
- it 'raise_errors ArgumentError if invalid option is provided' do
71
- expect do
72
- doc_with_permissions(modify_document: false)
73
- end.to raise_error(ArgumentError)
74
- end
75
- end
76
-
77
- describe 'Encryption keys' do
78
- # Since PDF::Reader doesn't read encrypted PDF files, we just take the
79
- # roundabout method of verifying each step of the encryption. This works
80
- # fine because the encryption method is deterministic.
81
-
82
- let(:pdf) do
83
- Prawn::Document.new do |pdf|
84
- class << pdf
85
- public :owner_password_hash, :user_password_hash, :user_encryption_key
86
- end
87
- pdf.encrypt_document(
88
- user_password: 'foo',
89
- owner_password: 'bar',
90
- permissions: { print_document: false }
91
- )
92
- end
93
- end
94
-
95
- it 'calculates the correct owner hash' do
96
- expect(pdf.owner_password_hash.unpack1('H*'))
97
- .to match(/^61CA855012/i)
98
- end
99
-
100
- it 'calculates the correct user hash' do
101
- expect(pdf.user_password_hash.unpack1('H*'))
102
- .to match(/^6BC8C51031/i)
103
- end
104
-
105
- it 'calculates the correct user_encryption_key' do
106
- expect(pdf.user_encryption_key.unpack1('H*').upcase)
107
- .to eq('B100AB6429')
108
- end
109
- end
110
-
111
- describe 'encrypted_pdf_object' do
112
- it 'delegates to PdfObject for simple types' do
113
- expect(PDF::Core.encrypted_pdf_object(true, nil, nil, nil)).to eq('true')
114
- expect(PDF::Core.encrypted_pdf_object(42, nil, nil, nil)).to eq('42')
115
- end
116
-
117
- it 'encrypts strings properly' do
118
- expect(PDF::Core.encrypted_pdf_object('foo', '12345', 123, 0))
119
- .to eq('<4ad6e3>')
120
- end
121
-
122
- it 'encrypts literal strings properly' do
123
- expect(PDF::Core.encrypted_pdf_object(
124
- PDF::Core::LiteralString.new('foo'), '12345', 123, 0
125
- )).to eq(bin_string("(J\xD6\xE3)"))
126
- expect(PDF::Core.encrypted_pdf_object(
127
- PDF::Core::LiteralString.new('lhfbqg3do5u0satu3fjf'), nil, 123, 0
128
- )).to eq(bin_string(
129
- "(\xF1\x8B\\(\b\xBB\xE18S\x130~4*#\\(%\x87\xE7\x8E\\\n)"
130
- ))
131
- end
132
-
133
- it 'encrypts time properly' do
134
- expect(PDF::Core.encrypted_pdf_object(
135
- Time.utc(2050, 0o4, 26, 10, 17, 10), '12345', 123, 0
136
- )).to eq(bin_string(
137
- "(h\x83\xBE\xDC\xEC\x99\x0F\xD7\\)%\x13\xD4$\xB8\xF0\x16\xB8\x80\xC5"\
138
- "\xE91+\xCF)"
139
- ))
140
- end
141
-
142
- it 'properlies handle compound types' do
143
- expect(PDF::Core.encrypted_pdf_object({ Bar: 'foo' }, '12345', 123, 0))
144
- .to eq(
145
- "<< /Bar <4ad6e3>\n>>"
146
- )
147
- expect(PDF::Core.encrypted_pdf_object(%w[foo bar], '12345', 123, 0))
148
- .to eq('[<4ad6e3> <4ed8fe>]')
149
- end
150
- end
151
-
152
- describe 'Reference#encrypted_object' do
153
- it 'encrypts references properly' do
154
- ref = PDF::Core::Reference.new(1, ['foo'])
155
- expect(ref.encrypted_object(nil)).to eq("1 0 obj\n[<4fca3f>]\nendobj\n")
156
- end
157
-
158
- it 'encrypts references with streams properly' do
159
- ref = PDF::Core::Reference.new(1, {})
160
- ref << 'foo'
161
- result = bin_string(
162
- "1 0 obj\n<< /Length 3\n>>\nstream\nO\xCA?\nendstream\nendobj\n"
163
- )
164
- expect(ref.encrypted_object(nil)).to eq(result)
165
- end
166
- end
167
-
168
- describe 'String#encrypted_object' do
169
- it 'encrypts stream properly' do
170
- stream = PDF::Core::Stream.new
171
- stream << 'foo'
172
- result = bin_string("stream\nO\xCA?\nendstream\n")
173
- expect(stream.encrypted_object(nil, 1, 0)).to eq(result)
174
- end
175
- end
176
- end
@@ -1,76 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe Prawn::Document do
6
- let(:pdf) { create_pdf }
7
-
8
- describe 'When creating annotations' do
9
- it 'appends annotation to current page' do
10
- pdf.start_new_page
11
- pdf.annotate(
12
- Rect: [0, 0, 10, 10],
13
- Subtype: :Text,
14
- Contents: 'Hello world!'
15
- )
16
- PDF::Reader.open(StringIO.new(pdf.render)) do |pdf|
17
- expect(pdf.page(1).attributes[:Annots]).to be_nil
18
- expect(pdf.page(2).attributes[:Annots].size).to eq(1)
19
- end
20
- end
21
-
22
- it 'forces :Type to be :Annot' do
23
- opts = pdf.annotate(
24
- Rect: [0, 0, 10, 10],
25
- Subtype: :Text,
26
- Contents: 'Hello world!'
27
- )
28
- expect(opts[:Type]).to eq(:Annot)
29
- opts = pdf.annotate(
30
- Type: :Bogus,
31
- Rect: [0, 0, 10, 10],
32
- Subtype: :Text,
33
- Contents: 'Hello world!'
34
- )
35
- expect(opts[:Type]).to eq(:Annot)
36
- end
37
- end
38
-
39
- describe 'When creating text annotations' do
40
- let(:rect) { [0, 0, 10, 10] }
41
- let(:content) { 'Hello, world!' }
42
-
43
- it 'builds appropriate annotation' do
44
- opts = pdf.text_annotation(rect, content)
45
- expect(opts[:Type]).to eq(:Annot)
46
- expect(opts[:Subtype]).to eq(:Text)
47
- expect(opts[:Rect]).to eq(rect)
48
- expect(opts[:Contents]).to eq(content)
49
- end
50
-
51
- it 'merges extra options' do
52
- opts = pdf.text_annotation(rect, content, Open: true, Subtype: :Bogus)
53
- expect(opts[:Subtype]).to eq(:Text)
54
- expect(opts[:Open]).to eq(true)
55
- end
56
- end
57
-
58
- describe 'When creating link annotations' do
59
- let(:rect) { [0, 0, 10, 10] }
60
- let(:dest) { 'home' }
61
-
62
- it 'builds appropriate annotation' do
63
- opts = pdf.link_annotation(rect, Dest: dest)
64
- expect(opts[:Type]).to eq(:Annot)
65
- expect(opts[:Subtype]).to eq(:Link)
66
- expect(opts[:Rect]).to eq(rect)
67
- expect(opts[:Dest]).to eq(dest)
68
- end
69
-
70
- it 'merges extra options' do
71
- opts = pdf.link_annotation(rect, Dest: dest, Subtype: :Bogus)
72
- expect(opts[:Subtype]).to eq(:Link)
73
- expect(opts[:Dest]).to eq(dest)
74
- end
75
- end
76
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe Prawn::Document do
6
- describe 'When creating destinations' do
7
- let(:pdf) { create_pdf }
8
-
9
- it 'adds entry to Dests name tree' do
10
- expect(pdf.dests.data.empty?).to eq(true)
11
- pdf.add_dest 'candy', 'chocolate'
12
- expect(pdf.dests.data.size).to eq(1)
13
- end
14
- end
15
- end
@@ -1,99 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe Prawn::Document do
6
- describe 'grid' do
7
- let(:pdf) { described_class.new }
8
-
9
- it 'allows definition of a grid' do
10
- pdf.define_grid(columns: 5, rows: 8, gutter: 0.1)
11
- expect(pdf.grid.columns).to eq(5)
12
- expect(pdf.grid.rows).to eq(8)
13
- expect(pdf.grid.gutter).to eq(0.1)
14
- end
15
-
16
- it 'allows re-definition of a grid' do
17
- pdf.define_grid(columns: 5, rows: 8, gutter: 0.1)
18
- expect(pdf.grid.columns).to eq(5)
19
- expect(pdf.grid.rows).to eq(8)
20
- expect(pdf.grid.gutter).to eq(0.1)
21
- pdf.define_grid(columns: 3, rows: 6, gutter: 0.1)
22
- expect(pdf.grid.columns).to eq(3)
23
- expect(pdf.grid.rows).to eq(6)
24
- expect(pdf.grid.gutter).to eq(0.1)
25
- end
26
-
27
- describe 'when a grid is defined' do
28
- let(:num_columns) { 5 }
29
- let(:num_rows) { 8 }
30
- let(:gutter) { 10.0 }
31
-
32
- before do
33
- pdf.define_grid(
34
- columns: num_columns,
35
- rows: num_rows,
36
- gutter: gutter
37
- )
38
- end
39
-
40
- it 'computes the column width' do
41
- expect(pdf.grid.column_width * num_columns.to_f +
42
- gutter * (num_columns - 1).to_f).to eq(pdf.bounds.width)
43
- end
44
-
45
- it 'computes the row height' do
46
- expect(pdf.grid.row_height * num_rows.to_f +
47
- gutter * (num_rows - 1).to_f).to eq(pdf.bounds.height)
48
- end
49
-
50
- it 'gives the edges of a grid box' do
51
- grid_width = (pdf.bounds.width.to_f -
52
- (gutter * (num_columns - 1).to_f)) / num_columns.to_f
53
- grid_height = (pdf.bounds.height.to_f -
54
- (gutter * (num_rows - 1).to_f)) / num_rows.to_f
55
-
56
- exp_tl_x = (grid_width + gutter.to_f) * 4.0
57
- exp_tl_y = pdf.bounds.height.to_f - (grid_height + gutter.to_f)
58
-
59
- expect(pdf.grid(1, 4).top_left).to eq([exp_tl_x, exp_tl_y])
60
- expect(pdf.grid(1, 4).top_right).to eq [exp_tl_x + grid_width, exp_tl_y]
61
- expect(pdf.grid(1, 4).bottom_left)
62
- .to eq([exp_tl_x, exp_tl_y - grid_height])
63
- expect(pdf.grid(1, 4).bottom_right)
64
- .to eq([exp_tl_x + grid_width, exp_tl_y - grid_height])
65
- end
66
-
67
- it 'gives the edges of a multiple grid boxes' do
68
- # Hand verified. Cheating a bit. Don't tell.
69
- expect(pdf.grid([1, 3], [2, 5]).top_left).to eq([330.0, 628.75])
70
- expect(pdf.grid([1, 3], [2, 5]).top_right).to eq([650.0, 628.75])
71
- expect(pdf.grid([1, 3], [2, 5]).bottom_left).to eq([330.0, 456.25])
72
- expect(pdf.grid([1, 3], [2, 5]).bottom_right).to eq([650.0, 456.25])
73
- end
74
-
75
- it 'draws outlines without changing global default colors' do
76
- pdf.grid.show_all('cccccc')
77
-
78
- colors = PDF::Inspector::Graphics::Color.analyze(pdf.render)
79
- expect(colors.fill_color).to_not eq([0.8, 0.8, 0.8])
80
- expect(colors.stroke_color).to_not eq([0.8, 0.8, 0.8])
81
-
82
- # Hardcoded default color as I haven't been able to come up with
83
- # a stable converter between fill_color without lots code.
84
- expect(colors.stroke_color).to eq([0.0, 0.0, 0.0])
85
- end
86
-
87
- it 'draws outlines without curent color settings' do
88
- pdf.fill_color 'ccff00'
89
- pdf.stroke_color 'ffcc00'
90
-
91
- pdf.grid.show_all
92
-
93
- colors = PDF::Inspector::Graphics::Color.analyze(pdf.render)
94
- expect(colors.fill_color).to eq([0.8, 1.0, 0.0])
95
- expect(colors.stroke_color).to eq([1.0, 0.8, 0.0])
96
- end
97
- end
98
- end
99
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe Prawn::Document do
6
- describe 'A Reference object' do
7
- describe 'generated via Prawn::Document' do
8
- it 'returns a proper reference on ref!' do
9
- pdf = described_class.new
10
- expect(pdf.ref!({}).is_a?(PDF::Core::Reference)).to eq(true)
11
- end
12
-
13
- it 'returns an identifier on ref' do
14
- pdf = described_class.new
15
- r = pdf.ref({})
16
- expect(r.is_a?(Integer)).to eq(true)
17
- end
18
-
19
- it 'has :Length of stream if it has one when compression disabled' do
20
- pdf = described_class.new compress: false
21
- ref = pdf.ref!({})
22
- ref << 'Hello'
23
- expect(ref.stream.data[:Length]).to eq(5)
24
- end
25
- end
26
- end
27
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe Prawn::Document do
6
- let(:pdf) { create_pdf }
7
-
8
- it 'onlies accept :position as option in debug mode' do
9
- Prawn.debug = true
10
- expect do
11
- pdf.span(350, x: 3) do
12
- # draw
13
- end
14
- end.to raise_error(Prawn::Errors::UnknownOption)
15
- end
16
-
17
- it 'has raise an error if :position is invalid' do
18
- expect do
19
- pdf.span(350, position: :x) do
20
- # draw
21
- end
22
- end.to raise_error(ArgumentError)
23
- end
24
-
25
- it 'restores the margin box when bounding box exits' do
26
- margin_box = pdf.bounds
27
-
28
- pdf.span(350, position: :center) do
29
- pdf.text "Here's some centered text in a 350 point column. " * 100
30
- end
31
-
32
- expect(pdf.bounds).to eq(margin_box)
33
- end
34
-
35
- it 'does create a margin box' do
36
- margin_box =
37
- pdf.span(350, position: :center) do
38
- pdf.text "Here's some centered text in a 350 point column. " * 100
39
- end
40
-
41
- expect(margin_box.top).to eq(792.0)
42
- expect(margin_box.bottom).to eq(0)
43
- end
44
- end