prawn 2.3.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/prawn/document/bounding_box.rb +223 -143
- data/lib/prawn/document/column_box.rb +61 -26
- data/lib/prawn/document/internals.rb +25 -16
- data/lib/prawn/document/span.rb +21 -18
- data/lib/prawn/document.rb +273 -182
- data/lib/prawn/encoding.rb +2 -5
- data/lib/prawn/errors.rb +23 -34
- data/lib/prawn/font.rb +254 -139
- data/lib/prawn/font_metric_cache.rb +18 -16
- data/lib/prawn/fonts/afm.rb +99 -57
- data/lib/prawn/fonts/dfont.rb +7 -1
- data/lib/prawn/fonts/otf.rb +4 -1
- data/lib/prawn/fonts/to_unicode_cmap.rb +151 -0
- data/lib/prawn/fonts/ttc.rb +7 -2
- data/lib/prawn/fonts/ttf.rb +345 -107
- data/lib/prawn/fonts.rb +14 -0
- data/lib/prawn/graphics/blend_mode.rb +25 -28
- data/lib/prawn/graphics/cap_style.rb +9 -12
- data/lib/prawn/graphics/color.rb +75 -50
- data/lib/prawn/graphics/dash.rb +45 -42
- data/lib/prawn/graphics/join_style.rb +18 -12
- data/lib/prawn/graphics/patterns.rb +239 -110
- data/lib/prawn/graphics/transformation.rb +51 -44
- data/lib/prawn/graphics/transparency.rb +16 -40
- data/lib/prawn/graphics.rb +370 -260
- data/lib/prawn/grid.rb +219 -57
- data/lib/prawn/image_handler.rb +27 -10
- data/lib/prawn/images/image.rb +8 -10
- data/lib/prawn/images/jpg.rb +46 -20
- data/lib/prawn/images/png.rb +94 -42
- data/lib/prawn/images.rb +70 -81
- data/lib/prawn/measurement_extensions.rb +39 -8
- data/lib/prawn/measurements.rb +60 -5
- data/lib/prawn/outline.rb +120 -113
- data/lib/prawn/repeater.rb +52 -36
- data/lib/prawn/security/arcfour.rb +4 -4
- data/lib/prawn/security.rb +106 -98
- data/lib/prawn/soft_mask.rb +42 -30
- data/lib/prawn/stamp.rb +38 -42
- data/lib/prawn/text/box.rb +156 -105
- data/lib/prawn/text/formatted/arranger.rb +121 -41
- data/lib/prawn/text/formatted/box.rb +239 -163
- data/lib/prawn/text/formatted/fragment.rb +130 -14
- data/lib/prawn/text/formatted/line_wrap.rb +49 -38
- data/lib/prawn/text/formatted/parser.rb +116 -74
- data/lib/prawn/text/formatted/wrap.rb +25 -26
- data/lib/prawn/text/formatted.rb +75 -0
- data/lib/prawn/text.rb +456 -211
- data/lib/prawn/transformation_stack.rb +29 -10
- data/lib/prawn/utilities.rb +13 -13
- data/lib/prawn/version.rb +2 -1
- data/lib/prawn/view.rb +69 -54
- data/lib/prawn.rb +24 -18
- data.tar.gz.sig +0 -0
- metadata +55 -262
- metadata.gz.sig +3 -4
- data/.yardopts +0 -10
- data/Gemfile +0 -5
- data/Rakefile +0 -54
- data/manual/absolute_position.pdf +0 -0
- data/manual/basic_concepts/adding_pages.rb +0 -26
- data/manual/basic_concepts/basic_concepts.rb +0 -43
- data/manual/basic_concepts/creation.rb +0 -38
- data/manual/basic_concepts/cursor.rb +0 -32
- data/manual/basic_concepts/measurement.rb +0 -24
- data/manual/basic_concepts/origin.rb +0 -37
- data/manual/basic_concepts/other_cursor_helpers.rb +0 -39
- data/manual/basic_concepts/view.rb +0 -48
- data/manual/bounding_box/bounding_box.rb +0 -41
- data/manual/bounding_box/bounds.rb +0 -48
- data/manual/bounding_box/canvas.rb +0 -23
- data/manual/bounding_box/creation.rb +0 -22
- data/manual/bounding_box/indentation.rb +0 -45
- data/manual/bounding_box/nesting.rb +0 -52
- data/manual/bounding_box/russian_boxes.rb +0 -40
- data/manual/bounding_box/stretchy.rb +0 -29
- data/manual/contents.rb +0 -35
- data/manual/cover.rb +0 -43
- data/manual/document_and_page_options/background.rb +0 -25
- data/manual/document_and_page_options/document_and_page_options.rb +0 -34
- data/manual/document_and_page_options/metadata.rb +0 -25
- data/manual/document_and_page_options/page_margins.rb +0 -36
- data/manual/document_and_page_options/page_size.rb +0 -34
- data/manual/document_and_page_options/print_scaling.rb +0 -22
- data/manual/example_helper.rb +0 -8
- data/manual/graphics/blend_mode.rb +0 -52
- data/manual/graphics/circle_and_ellipse.rb +0 -21
- data/manual/graphics/color.rb +0 -22
- data/manual/graphics/common_lines.rb +0 -29
- data/manual/graphics/fill_and_stroke.rb +0 -41
- data/manual/graphics/fill_rules.rb +0 -37
- data/manual/graphics/gradients.rb +0 -43
- data/manual/graphics/graphics.rb +0 -64
- data/manual/graphics/helper.rb +0 -27
- data/manual/graphics/line_width.rb +0 -36
- data/manual/graphics/lines_and_curves.rb +0 -40
- data/manual/graphics/polygon.rb +0 -27
- data/manual/graphics/rectangle.rb +0 -20
- data/manual/graphics/rotate.rb +0 -25
- data/manual/graphics/scale.rb +0 -42
- data/manual/graphics/soft_masks.rb +0 -44
- data/manual/graphics/stroke_cap.rb +0 -30
- data/manual/graphics/stroke_dash.rb +0 -47
- data/manual/graphics/stroke_join.rb +0 -29
- data/manual/graphics/translate.rb +0 -28
- data/manual/graphics/transparency.rb +0 -33
- data/manual/how_to_read_this_manual.rb +0 -39
- data/manual/images/absolute_position.rb +0 -22
- data/manual/images/fit.rb +0 -20
- data/manual/images/horizontal.rb +0 -24
- data/manual/images/images.rb +0 -41
- data/manual/images/plain_image.rb +0 -17
- data/manual/images/scale.rb +0 -21
- data/manual/images/vertical.rb +0 -27
- data/manual/images/width_and_height.rb +0 -24
- data/manual/layout/boxes.rb +0 -26
- data/manual/layout/content.rb +0 -24
- data/manual/layout/layout.rb +0 -27
- data/manual/layout/simple_grid.rb +0 -22
- data/manual/outline/add_subsection_to.rb +0 -60
- data/manual/outline/insert_section_after.rb +0 -46
- data/manual/outline/outline.rb +0 -33
- data/manual/outline/sections_and_pages.rb +0 -66
- data/manual/repeatable_content/alternate_page_numbering.rb +0 -36
- data/manual/repeatable_content/page_numbering.rb +0 -55
- data/manual/repeatable_content/repeatable_content.rb +0 -35
- data/manual/repeatable_content/repeater.rb +0 -54
- data/manual/repeatable_content/stamp.rb +0 -40
- data/manual/security/encryption.rb +0 -28
- data/manual/security/permissions.rb +0 -41
- data/manual/security/security.rb +0 -28
- data/manual/table.rb +0 -16
- data/manual/text/alignment.rb +0 -43
- data/manual/text/color.rb +0 -24
- data/manual/text/column_box.rb +0 -30
- data/manual/text/fallback_fonts.rb +0 -41
- data/manual/text/font.rb +0 -40
- data/manual/text/font_size.rb +0 -44
- data/manual/text/font_style.rb +0 -22
- data/manual/text/formatted_callbacks.rb +0 -65
- data/manual/text/formatted_text.rb +0 -58
- data/manual/text/free_flowing_text.rb +0 -50
- data/manual/text/inline.rb +0 -40
- data/manual/text/kerning_and_character_spacing.rb +0 -38
- data/manual/text/leading.rb +0 -24
- data/manual/text/line_wrapping.rb +0 -60
- data/manual/text/paragraph_indentation.rb +0 -32
- data/manual/text/positioned_text.rb +0 -37
- data/manual/text/registering_families.rb +0 -51
- data/manual/text/rendering_and_color.rb +0 -36
- data/manual/text/right_to_left_text.rb +0 -54
- data/manual/text/rotation.rb +0 -47
- data/manual/text/single_usage.rb +0 -36
- data/manual/text/text.rb +0 -75
- data/manual/text/text_box_excess.rb +0 -35
- data/manual/text/text_box_extensions.rb +0 -48
- data/manual/text/text_box_overflow.rb +0 -49
- data/manual/text/utf8.rb +0 -27
- data/manual/text/win_ansi_charset.rb +0 -62
- data/prawn.gemspec +0 -57
- data/spec/data/curves.pdf +0 -66
- data/spec/extensions/encoding_helpers.rb +0 -11
- data/spec/prawn/document/bounding_box_spec.rb +0 -546
- data/spec/prawn/document/column_box_spec.rb +0 -75
- data/spec/prawn/document/security_spec.rb +0 -176
- data/spec/prawn/document_annotations_spec.rb +0 -76
- data/spec/prawn/document_destinations_spec.rb +0 -15
- data/spec/prawn/document_grid_spec.rb +0 -99
- data/spec/prawn/document_reference_spec.rb +0 -27
- data/spec/prawn/document_span_spec.rb +0 -36
- data/spec/prawn/document_spec.rb +0 -802
- data/spec/prawn/font_metric_cache_spec.rb +0 -54
- data/spec/prawn/font_spec.rb +0 -542
- data/spec/prawn/graphics/blend_mode_spec.rb +0 -63
- data/spec/prawn/graphics/transparency_spec.rb +0 -81
- data/spec/prawn/graphics_spec.rb +0 -837
- data/spec/prawn/graphics_stroke_styles_spec.rb +0 -229
- data/spec/prawn/image_handler_spec.rb +0 -53
- data/spec/prawn/images/jpg_spec.rb +0 -20
- data/spec/prawn/images/png_spec.rb +0 -283
- data/spec/prawn/images_spec.rb +0 -224
- data/spec/prawn/measurements_extensions_spec.rb +0 -24
- data/spec/prawn/outline_spec.rb +0 -412
- data/spec/prawn/repeater_spec.rb +0 -165
- data/spec/prawn/soft_mask_spec.rb +0 -74
- data/spec/prawn/stamp_spec.rb +0 -172
- data/spec/prawn/text/box_spec.rb +0 -1112
- data/spec/prawn/text/formatted/arranger_spec.rb +0 -466
- data/spec/prawn/text/formatted/box_spec.rb +0 -846
- data/spec/prawn/text/formatted/fragment_spec.rb +0 -343
- data/spec/prawn/text/formatted/line_wrap_spec.rb +0 -494
- data/spec/prawn/text/formatted/parser_spec.rb +0 -697
- data/spec/prawn/text_draw_text_spec.rb +0 -149
- data/spec/prawn/text_rendering_mode_spec.rb +0 -48
- data/spec/prawn/text_spacing_spec.rb +0 -95
- data/spec/prawn/text_spec.rb +0 -603
- data/spec/prawn/text_with_inline_formatting_spec.rb +0 -35
- data/spec/prawn/transformation_stack_spec.rb +0 -66
- data/spec/prawn/view_spec.rb +0 -63
- data/spec/prawn_manual_spec.rb +0 -35
- 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,36 +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 { pdf.span(350, x: 3) {} }
|
11
|
-
.to raise_error(Prawn::Errors::UnknownOption)
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'has raise an error if :position is invalid' do
|
15
|
-
expect { pdf.span(350, position: :x) {} }.to raise_error(ArgumentError)
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'restores the margin box when bounding box exits' do
|
19
|
-
margin_box = pdf.bounds
|
20
|
-
|
21
|
-
pdf.span(350, position: :center) do
|
22
|
-
pdf.text "Here's some centered text in a 350 point column. " * 100
|
23
|
-
end
|
24
|
-
|
25
|
-
expect(pdf.bounds).to eq(margin_box)
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'does create a margin box' do
|
29
|
-
margin_box = pdf.span(350, position: :center) do
|
30
|
-
pdf.text "Here's some centered text in a 350 point column. " * 100
|
31
|
-
end
|
32
|
-
|
33
|
-
expect(margin_box.top).to eq(792.0)
|
34
|
-
expect(margin_box.bottom).to eq(0)
|
35
|
-
end
|
36
|
-
end
|