prawn 2.0.2 → 2.3.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 +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/GPLv2 +20 -21
- data/Gemfile +3 -9
- data/Rakefile +20 -23
- data/lib/prawn.rb +37 -49
- data/lib/prawn/document.rb +181 -133
- data/lib/prawn/document/bounding_box.rb +41 -29
- data/lib/prawn/document/column_box.rb +7 -7
- data/lib/prawn/document/internals.rb +18 -8
- data/lib/prawn/document/span.rb +21 -16
- data/lib/prawn/encoding.rb +69 -68
- data/lib/prawn/errors.rb +12 -7
- data/lib/prawn/font.rb +115 -69
- data/lib/prawn/font_metric_cache.rb +14 -8
- data/lib/prawn/{font → fonts}/afm.rb +102 -68
- data/lib/prawn/{font → fonts}/dfont.rb +5 -11
- data/lib/prawn/fonts/otf.rb +11 -0
- data/lib/prawn/fonts/ttc.rb +36 -0
- data/lib/prawn/{font → fonts}/ttf.rb +87 -68
- data/lib/prawn/graphics.rb +120 -80
- data/lib/prawn/graphics/blend_mode.rb +65 -0
- data/lib/prawn/graphics/cap_style.rb +3 -3
- data/lib/prawn/graphics/color.rb +27 -25
- data/lib/prawn/graphics/dash.rb +23 -11
- data/lib/prawn/graphics/join_style.rb +9 -3
- data/lib/prawn/graphics/patterns.rb +197 -67
- data/lib/prawn/graphics/transformation.rb +17 -8
- data/lib/prawn/graphics/transparency.rb +17 -13
- data/lib/prawn/grid.rb +48 -47
- data/lib/prawn/image_handler.rb +5 -5
- data/lib/prawn/images.rb +39 -30
- data/lib/prawn/images/image.rb +2 -1
- data/lib/prawn/images/jpg.rb +28 -22
- data/lib/prawn/images/png.rb +107 -66
- data/lib/prawn/measurement_extensions.rb +10 -9
- data/lib/prawn/measurements.rb +19 -15
- data/lib/prawn/outline.rb +97 -77
- data/lib/prawn/repeater.rb +14 -10
- data/lib/prawn/security.rb +81 -61
- data/lib/prawn/security/arcfour.rb +2 -2
- data/lib/prawn/soft_mask.rb +26 -26
- data/lib/prawn/stamp.rb +20 -13
- data/lib/prawn/text.rb +68 -52
- data/lib/prawn/text/box.rb +11 -8
- data/lib/prawn/text/formatted.rb +5 -5
- data/lib/prawn/text/formatted/arranger.rb +78 -49
- data/lib/prawn/text/formatted/box.rb +134 -100
- data/lib/prawn/text/formatted/fragment.rb +11 -14
- data/lib/prawn/text/formatted/line_wrap.rb +121 -63
- data/lib/prawn/text/formatted/parser.rb +139 -117
- data/lib/prawn/text/formatted/wrap.rb +43 -31
- data/lib/prawn/transformation_stack.rb +44 -0
- data/lib/prawn/utilities.rb +7 -22
- data/lib/prawn/version.rb +2 -2
- data/lib/prawn/view.rb +17 -7
- data/manual/basic_concepts/adding_pages.rb +6 -7
- data/manual/basic_concepts/basic_concepts.rb +31 -22
- data/manual/basic_concepts/creation.rb +10 -11
- data/manual/basic_concepts/cursor.rb +4 -5
- data/manual/basic_concepts/measurement.rb +6 -7
- data/manual/basic_concepts/origin.rb +5 -6
- data/manual/basic_concepts/other_cursor_helpers.rb +11 -12
- data/manual/basic_concepts/view.rb +22 -16
- data/manual/bounding_box/bounding_box.rb +29 -24
- data/manual/bounding_box/bounds.rb +11 -12
- data/manual/bounding_box/canvas.rb +4 -5
- data/manual/bounding_box/creation.rb +6 -7
- data/manual/bounding_box/indentation.rb +14 -15
- data/manual/bounding_box/nesting.rb +24 -17
- data/manual/bounding_box/russian_boxes.rb +14 -13
- data/manual/bounding_box/stretchy.rb +12 -13
- data/manual/contents.rb +28 -22
- data/manual/cover.rb +33 -28
- data/manual/document_and_page_options/background.rb +11 -13
- data/manual/document_and_page_options/document_and_page_options.rb +25 -20
- data/manual/document_and_page_options/metadata.rb +18 -16
- data/manual/document_and_page_options/page_margins.rb +18 -20
- data/manual/document_and_page_options/page_size.rb +13 -12
- data/manual/document_and_page_options/print_scaling.rb +17 -15
- data/manual/example_helper.rb +5 -4
- data/manual/graphics/blend_mode.rb +52 -0
- data/manual/graphics/circle_and_ellipse.rb +4 -5
- data/manual/graphics/color.rb +7 -9
- data/manual/graphics/common_lines.rb +7 -8
- data/manual/graphics/fill_and_stroke.rb +4 -5
- data/manual/graphics/fill_rules.rb +9 -10
- data/manual/graphics/gradients.rb +27 -21
- data/manual/graphics/graphics.rb +48 -39
- data/manual/graphics/helper.rb +12 -9
- data/manual/graphics/line_width.rb +8 -7
- data/manual/graphics/lines_and_curves.rb +7 -8
- data/manual/graphics/polygon.rb +6 -8
- data/manual/graphics/rectangle.rb +4 -5
- data/manual/graphics/rotate.rb +6 -7
- data/manual/graphics/scale.rb +14 -15
- data/manual/graphics/soft_masks.rb +4 -5
- data/manual/graphics/stroke_cap.rb +6 -7
- data/manual/graphics/stroke_dash.rb +11 -12
- data/manual/graphics/stroke_join.rb +5 -6
- data/manual/graphics/translate.rb +9 -10
- data/manual/graphics/transparency.rb +7 -8
- data/manual/how_to_read_this_manual.rb +6 -6
- data/manual/images/absolute_position.rb +6 -7
- data/manual/images/fit.rb +7 -8
- data/manual/images/horizontal.rb +9 -10
- data/manual/images/images.rb +28 -24
- data/manual/images/plain_image.rb +5 -6
- data/manual/images/scale.rb +9 -10
- data/manual/images/vertical.rb +13 -14
- data/manual/images/width_and_height.rb +10 -11
- data/manual/layout/boxes.rb +5 -6
- data/manual/layout/content.rb +7 -8
- data/manual/layout/layout.rb +18 -16
- data/manual/layout/simple_grid.rb +6 -7
- data/manual/outline/add_subsection_to.rb +20 -21
- data/manual/outline/insert_section_after.rb +15 -16
- data/manual/outline/outline.rb +21 -17
- data/manual/outline/sections_and_pages.rb +17 -18
- data/manual/repeatable_content/alternate_page_numbering.rb +21 -17
- data/manual/repeatable_content/page_numbering.rb +17 -16
- data/manual/repeatable_content/repeatable_content.rb +25 -19
- data/manual/repeatable_content/repeater.rb +14 -15
- data/manual/repeatable_content/stamp.rb +14 -15
- data/manual/security/encryption.rb +9 -10
- data/manual/security/permissions.rb +19 -14
- data/manual/security/security.rb +19 -16
- data/manual/table.rb +3 -3
- data/manual/text/alignment.rb +16 -17
- data/manual/text/color.rb +12 -11
- data/manual/text/column_box.rb +9 -10
- data/manual/text/fallback_fonts.rb +25 -21
- data/manual/text/font.rb +11 -12
- data/manual/text/font_size.rb +13 -14
- data/manual/text/font_style.rb +7 -8
- data/manual/text/formatted_callbacks.rb +25 -21
- data/manual/text/formatted_text.rb +33 -25
- data/manual/text/free_flowing_text.rb +20 -21
- data/manual/text/inline.rb +18 -19
- data/manual/text/kerning_and_character_spacing.rb +14 -15
- data/manual/text/leading.rb +7 -8
- data/manual/text/line_wrapping.rb +37 -18
- data/manual/text/paragraph_indentation.rb +13 -14
- data/manual/text/positioned_text.rb +15 -16
- data/manual/text/registering_families.rb +20 -21
- data/manual/text/rendering_and_color.rb +9 -10
- data/manual/text/right_to_left_text.rb +26 -19
- data/manual/text/rotation.rb +28 -23
- data/manual/text/single_usage.rb +8 -9
- data/manual/text/text.rb +57 -52
- data/manual/text/text_box_excess.rb +20 -17
- data/manual/text/text_box_extensions.rb +18 -15
- data/manual/text/text_box_overflow.rb +18 -19
- data/manual/text/utf8.rb +11 -12
- data/manual/text/win_ansi_charset.rb +21 -19
- data/prawn.gemspec +45 -33
- data/spec/extensions/encoding_helpers.rb +3 -3
- data/spec/prawn/document/bounding_box_spec.rb +546 -0
- data/spec/prawn/document/column_box_spec.rb +75 -0
- data/spec/prawn/document/security_spec.rb +176 -0
- data/spec/prawn/document_annotations_spec.rb +76 -0
- data/spec/prawn/document_destinations_spec.rb +15 -0
- data/spec/prawn/document_grid_spec.rb +99 -0
- data/spec/prawn/document_reference_spec.rb +27 -0
- data/spec/prawn/document_span_spec.rb +36 -0
- data/spec/prawn/document_spec.rb +802 -0
- data/spec/prawn/font_metric_cache_spec.rb +54 -0
- data/spec/prawn/font_spec.rb +542 -0
- data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
- data/spec/prawn/graphics/transparency_spec.rb +81 -0
- data/spec/prawn/graphics_spec.rb +837 -0
- data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
- data/spec/prawn/image_handler_spec.rb +53 -0
- data/spec/prawn/images/jpg_spec.rb +20 -0
- data/spec/prawn/images/png_spec.rb +283 -0
- data/spec/prawn/images_spec.rb +224 -0
- data/spec/prawn/measurements_extensions_spec.rb +24 -0
- data/spec/prawn/outline_spec.rb +412 -0
- data/spec/prawn/repeater_spec.rb +165 -0
- data/spec/prawn/soft_mask_spec.rb +74 -0
- data/spec/prawn/stamp_spec.rb +172 -0
- data/spec/prawn/text/box_spec.rb +1112 -0
- data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
- data/spec/prawn/text/formatted/box_spec.rb +846 -0
- data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
- data/spec/prawn/text/formatted/line_wrap_spec.rb +494 -0
- data/spec/prawn/text/formatted/parser_spec.rb +697 -0
- data/spec/prawn/text_draw_text_spec.rb +149 -0
- data/spec/prawn/text_rendering_mode_spec.rb +48 -0
- data/spec/prawn/text_spacing_spec.rb +95 -0
- data/spec/prawn/text_spec.rb +603 -0
- data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
- data/spec/prawn/transformation_stack_spec.rb +66 -0
- data/spec/prawn/view_spec.rb +63 -0
- data/spec/prawn_manual_spec.rb +35 -0
- data/spec/spec_helper.rb +19 -23
- metadata +145 -185
- metadata.gz.sig +4 -0
- data/data/images/16bit.alpha +0 -0
- data/data/images/16bit.color +0 -0
- data/data/images/16bit.png +0 -0
- data/data/images/arrow.png +0 -0
- data/data/images/arrow2.png +0 -0
- data/data/images/dice.alpha +0 -0
- data/data/images/dice.color +0 -0
- data/data/images/dice.png +0 -0
- data/data/images/dice_interlaced.png +0 -0
- data/data/images/fractal.jpg +0 -0
- data/data/images/indexed_color.dat +0 -0
- data/data/images/indexed_color.png +0 -0
- data/data/images/letterhead.jpg +0 -0
- data/data/images/license.md +0 -8
- data/data/images/page_white_text.alpha +0 -0
- data/data/images/page_white_text.color +0 -0
- data/data/images/page_white_text.png +0 -0
- data/data/images/pal_bk.png +0 -0
- data/data/images/pigs.jpg +0 -0
- data/data/images/prawn.png +0 -0
- data/data/images/ruport.png +0 -0
- data/data/images/ruport_data.dat +0 -0
- data/data/images/ruport_transparent.png +0 -0
- data/data/images/ruport_type0.png +0 -0
- data/data/images/stef.jpg +0 -0
- data/data/images/tru256.bmp +0 -0
- data/data/images/web-links.dat +0 -1
- data/data/images/web-links.png +0 -0
- data/data/pdfs/complex_template.pdf +0 -0
- data/data/pdfs/contains_ttf_font.pdf +0 -0
- data/data/pdfs/encrypted.pdf +0 -0
- data/data/pdfs/form.pdf +1 -819
- data/data/pdfs/hexagon.pdf +0 -61
- data/data/pdfs/indirect_reference.pdf +0 -86
- data/data/pdfs/multipage_template.pdf +0 -127
- data/data/pdfs/nested_pages.pdf +0 -118
- data/data/pdfs/page_without_mediabox.pdf +0 -193
- data/data/pdfs/resources_as_indirect_object.pdf +0 -83
- data/data/pdfs/two_hexagons.pdf +0 -90
- data/data/pdfs/version_1_6.pdf +0 -61
- data/data/shift_jis_text.txt +0 -1
- data/spec/acceptance/png.rb +0 -24
- data/spec/annotations_spec.rb +0 -67
- data/spec/bounding_box_spec.rb +0 -501
- data/spec/column_box_spec.rb +0 -59
- data/spec/destinations_spec.rb +0 -13
- data/spec/document_spec.rb +0 -742
- data/spec/extensions/mocha.rb +0 -45
- data/spec/font_metric_cache_spec.rb +0 -52
- data/spec/font_spec.rb +0 -475
- data/spec/formatted_text_arranger_spec.rb +0 -423
- data/spec/formatted_text_box_spec.rb +0 -716
- data/spec/formatted_text_fragment_spec.rb +0 -299
- data/spec/graphics_spec.rb +0 -666
- data/spec/grid_spec.rb +0 -95
- data/spec/image_handler_spec.rb +0 -53
- data/spec/images_spec.rb +0 -167
- data/spec/inline_formatted_text_parser_spec.rb +0 -568
- data/spec/jpg_spec.rb +0 -23
- data/spec/line_wrap_spec.rb +0 -366
- data/spec/measurement_units_spec.rb +0 -22
- data/spec/outline_spec.rb +0 -409
- data/spec/png_spec.rb +0 -235
- data/spec/reference_spec.rb +0 -25
- data/spec/repeater_spec.rb +0 -154
- data/spec/security_spec.rb +0 -151
- data/spec/soft_mask_spec.rb +0 -78
- data/spec/span_spec.rb +0 -43
- data/spec/stamp_spec.rb +0 -179
- data/spec/stroke_styles_spec.rb +0 -208
- data/spec/text_at_spec.rb +0 -142
- data/spec/text_box_spec.rb +0 -1038
- data/spec/text_rendering_mode_spec.rb +0 -45
- data/spec/text_spacing_spec.rb +0 -93
- data/spec/text_spec.rb +0 -549
- data/spec/text_with_inline_formatting_spec.rb +0 -35
- data/spec/transparency_spec.rb +0 -91
- data/spec/view_spec.rb +0 -42
data/spec/png_spec.rb
DELETED
@@ -1,235 +0,0 @@
|
|
1
|
-
# encoding: ASCII-8BIT
|
2
|
-
|
3
|
-
# Spec'ing the PNG class. Not complete yet - still needs to check the
|
4
|
-
# contents of palette and transparency to ensure they're correct.
|
5
|
-
# Need to find files that have these sections first.
|
6
|
-
#
|
7
|
-
# see http://www.w3.org/TR/PNG/ for a detailed description of the PNG spec,
|
8
|
-
# particuarly Table 11.1 for the different color types
|
9
|
-
|
10
|
-
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
11
|
-
|
12
|
-
describe "When reading a greyscale PNG file (color type 0)" do
|
13
|
-
before(:each) do
|
14
|
-
@filename = "#{Prawn::DATADIR}/images/web-links.png"
|
15
|
-
@data_filename = "#{Prawn::DATADIR}/images/web-links.dat"
|
16
|
-
@img_data = File.binread(@filename)
|
17
|
-
end
|
18
|
-
|
19
|
-
it "should read the attributes from the header chunk correctly" do
|
20
|
-
png = Prawn::Images::PNG.new(@img_data)
|
21
|
-
|
22
|
-
expect(png.width).to eq(21)
|
23
|
-
expect(png.height).to eq(14)
|
24
|
-
expect(png.bits).to eq(8)
|
25
|
-
expect(png.color_type).to eq(0)
|
26
|
-
expect(png.compression_method).to eq(0)
|
27
|
-
expect(png.filter_method).to eq(0)
|
28
|
-
expect(png.interlace_method).to eq(0)
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should read the image data chunk correctly" do
|
32
|
-
png = Prawn::Images::PNG.new(@img_data)
|
33
|
-
data = Zlib::Inflate.inflate(File.binread(@data_filename))
|
34
|
-
expect(png.img_data).to eq(data)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe "When reading a greyscale PNG file with transparency (color type 0)" do
|
39
|
-
before(:each) do
|
40
|
-
@filename = "#{Prawn::DATADIR}/images/ruport_type0.png"
|
41
|
-
@img_data = File.binread(@filename)
|
42
|
-
end
|
43
|
-
|
44
|
-
# In a greyscale type 0 PNG image, the tRNS chunk should contain a single value
|
45
|
-
# that indicates the color that should be interpreted as transparent.
|
46
|
-
#
|
47
|
-
# http://www.w3.org/TR/PNG/#11tRNS
|
48
|
-
it "should read the tRNS chunk correctly" do
|
49
|
-
png = Prawn::Images::PNG.new(@img_data)
|
50
|
-
expect(png.transparency[:grayscale]).to eq(255)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
describe "When reading an RGB PNG file (color type 2)" do
|
55
|
-
before(:each) do
|
56
|
-
@filename = "#{Prawn::DATADIR}/images/ruport.png"
|
57
|
-
@data_filename = "#{Prawn::DATADIR}/images/ruport_data.dat"
|
58
|
-
@img_data = File.binread(@filename)
|
59
|
-
end
|
60
|
-
|
61
|
-
it "should read the attributes from the header chunk correctly" do
|
62
|
-
png = Prawn::Images::PNG.new(@img_data)
|
63
|
-
|
64
|
-
expect(png.width).to eq(258)
|
65
|
-
expect(png.height).to eq(105)
|
66
|
-
expect(png.bits).to eq(8)
|
67
|
-
expect(png.color_type).to eq(2)
|
68
|
-
expect(png.compression_method).to eq(0)
|
69
|
-
expect(png.filter_method).to eq(0)
|
70
|
-
expect(png.interlace_method).to eq(0)
|
71
|
-
end
|
72
|
-
|
73
|
-
it "should read the image data chunk correctly" do
|
74
|
-
png = Prawn::Images::PNG.new(@img_data)
|
75
|
-
data = Zlib::Inflate.inflate(File.binread(@data_filename))
|
76
|
-
expect(png.img_data).to eq(data)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
describe "When reading an RGB PNG file with transparency (color type 2)" do
|
81
|
-
before(:each) do
|
82
|
-
@filename = "#{Prawn::DATADIR}/images/arrow2.png"
|
83
|
-
@img_data = File.binread(@filename)
|
84
|
-
end
|
85
|
-
|
86
|
-
# In a RGB type 2 PNG image, the tRNS chunk should contain a single RGB value
|
87
|
-
# that indicates the color that should be interpreted as transparent. In this
|
88
|
-
# case it's green.
|
89
|
-
#
|
90
|
-
# http://www.w3.org/TR/PNG/#11tRNS
|
91
|
-
it "should read the tRNS chunk correctly" do
|
92
|
-
png = Prawn::Images::PNG.new(@img_data)
|
93
|
-
expect(png.transparency[:rgb]).to eq([0, 255, 0])
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
describe "When reading an indexed color PNG file with transparency (color type 3)" do
|
98
|
-
it "raises a not supported error" do
|
99
|
-
bin = File.binread("#{Prawn::DATADIR}/images/pal_bk.png")
|
100
|
-
expect { Prawn::Images::PNG.new(bin) }.to(
|
101
|
-
raise_error(Prawn::Errors::UnsupportedImageType))
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
describe "When reading an indexed color PNG file (color type 3)" do
|
106
|
-
before(:each) do
|
107
|
-
@filename = "#{Prawn::DATADIR}/images/indexed_color.png"
|
108
|
-
@data_filename = "#{Prawn::DATADIR}/images/indexed_color.dat"
|
109
|
-
@img_data = File.binread(@filename)
|
110
|
-
end
|
111
|
-
|
112
|
-
it "should read the attributes from the header chunk correctly" do
|
113
|
-
png = Prawn::Images::PNG.new(@img_data)
|
114
|
-
|
115
|
-
expect(png.width).to eq(150)
|
116
|
-
expect(png.height).to eq(200)
|
117
|
-
expect(png.bits).to eq(8)
|
118
|
-
expect(png.color_type).to eq(3)
|
119
|
-
expect(png.compression_method).to eq(0)
|
120
|
-
expect(png.filter_method).to eq(0)
|
121
|
-
expect(png.interlace_method).to eq(0)
|
122
|
-
end
|
123
|
-
|
124
|
-
it "should read the image data chunk correctly" do
|
125
|
-
png = Prawn::Images::PNG.new(@img_data)
|
126
|
-
data = Zlib::Inflate.inflate(File.binread(@data_filename))
|
127
|
-
expect(png.img_data).to eq(data)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
describe "When reading a greyscale+alpha PNG file (color type 4)" do
|
132
|
-
before(:each) do
|
133
|
-
@filename = "#{Prawn::DATADIR}/images/page_white_text.png"
|
134
|
-
@color_data_filename = "#{Prawn::DATADIR}/images/page_white_text.color"
|
135
|
-
@alpha_data_filename = "#{Prawn::DATADIR}/images/page_white_text.alpha"
|
136
|
-
@img_data = File.binread(@filename)
|
137
|
-
end
|
138
|
-
|
139
|
-
it "should read the attributes from the header chunk correctly" do
|
140
|
-
png = Prawn::Images::PNG.new(@img_data)
|
141
|
-
|
142
|
-
expect(png.width).to eq(16)
|
143
|
-
expect(png.height).to eq(16)
|
144
|
-
expect(png.bits).to eq(8)
|
145
|
-
expect(png.color_type).to eq(4)
|
146
|
-
expect(png.compression_method).to eq(0)
|
147
|
-
expect(png.filter_method).to eq(0)
|
148
|
-
expect(png.interlace_method).to eq(0)
|
149
|
-
end
|
150
|
-
|
151
|
-
it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do
|
152
|
-
png = Prawn::Images::PNG.new(@img_data)
|
153
|
-
png.split_alpha_channel!
|
154
|
-
data = File.binread(@color_data_filename)
|
155
|
-
expect(png.img_data).to eq(data)
|
156
|
-
end
|
157
|
-
|
158
|
-
it "should correctly extract the alpha channel data from the image data chunk" do
|
159
|
-
png = Prawn::Images::PNG.new(@img_data)
|
160
|
-
png.split_alpha_channel!
|
161
|
-
data = File.binread(@alpha_data_filename)
|
162
|
-
expect(png.alpha_channel).to eq(data)
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
describe "When reading an RGB+alpha PNG file (color type 6)" do
|
167
|
-
before(:each) do
|
168
|
-
@filename = "#{Prawn::DATADIR}/images/dice.png"
|
169
|
-
@color_data_filename = "#{Prawn::DATADIR}/images/dice.color"
|
170
|
-
@alpha_data_filename = "#{Prawn::DATADIR}/images/dice.alpha"
|
171
|
-
@img_data = File.binread(@filename)
|
172
|
-
end
|
173
|
-
|
174
|
-
it "should read the attributes from the header chunk correctly" do
|
175
|
-
png = Prawn::Images::PNG.new(@img_data)
|
176
|
-
|
177
|
-
expect(png.width).to eq(320)
|
178
|
-
expect(png.height).to eq(240)
|
179
|
-
expect(png.bits).to eq(8)
|
180
|
-
expect(png.color_type).to eq(6)
|
181
|
-
expect(png.compression_method).to eq(0)
|
182
|
-
expect(png.filter_method).to eq(0)
|
183
|
-
expect(png.interlace_method).to eq(0)
|
184
|
-
end
|
185
|
-
|
186
|
-
it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do
|
187
|
-
png = Prawn::Images::PNG.new(@img_data)
|
188
|
-
png.split_alpha_channel!
|
189
|
-
data = File.binread(@color_data_filename)
|
190
|
-
expect(png.img_data).to eq(data)
|
191
|
-
end
|
192
|
-
|
193
|
-
it "should correctly extract the alpha channel data from the image data chunk" do
|
194
|
-
png = Prawn::Images::PNG.new(@img_data)
|
195
|
-
png.split_alpha_channel!
|
196
|
-
data = File.binread(@alpha_data_filename)
|
197
|
-
expect(png.alpha_channel).to eq(data)
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
|
-
describe "When reading a 16bit RGB+alpha PNG file (color type 6)" do
|
202
|
-
before(:each) do
|
203
|
-
@filename = "#{Prawn::DATADIR}/images/16bit.png"
|
204
|
-
@color_data_filename = "#{Prawn::DATADIR}/images/16bit.color"
|
205
|
-
# alpha channel truncated to 8-bit
|
206
|
-
@alpha_data_filename = "#{Prawn::DATADIR}/images/16bit.alpha"
|
207
|
-
@img_data = File.binread(@filename)
|
208
|
-
end
|
209
|
-
|
210
|
-
it "should read the attributes from the header chunk correctly" do
|
211
|
-
png = Prawn::Images::PNG.new(@img_data)
|
212
|
-
|
213
|
-
expect(png.width).to eq(32)
|
214
|
-
expect(png.height).to eq(32)
|
215
|
-
expect(png.bits).to eq(16)
|
216
|
-
expect(png.color_type).to eq(6)
|
217
|
-
expect(png.compression_method).to eq(0)
|
218
|
-
expect(png.filter_method).to eq(0)
|
219
|
-
expect(png.interlace_method).to eq(0)
|
220
|
-
end
|
221
|
-
|
222
|
-
it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do
|
223
|
-
png = Prawn::Images::PNG.new(@img_data)
|
224
|
-
png.split_alpha_channel!
|
225
|
-
data = File.binread(@color_data_filename)
|
226
|
-
expect(png.img_data).to eq(data)
|
227
|
-
end
|
228
|
-
|
229
|
-
it "should correctly extract the alpha channel data from the image data chunk" do
|
230
|
-
png = Prawn::Images::PNG.new(@img_data)
|
231
|
-
png.split_alpha_channel!
|
232
|
-
data = File.binread(@alpha_data_filename)
|
233
|
-
expect(png.alpha_channel).to eq(data)
|
234
|
-
end
|
235
|
-
end
|
data/spec/reference_spec.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
4
|
-
|
5
|
-
describe "A Reference object" do
|
6
|
-
describe "generated via Prawn::Document" do
|
7
|
-
it "should return a proper reference on ref!" do
|
8
|
-
pdf = Prawn::Document.new
|
9
|
-
expect(pdf.ref!({}).is_a?(PDF::Core::Reference)).to eq(true)
|
10
|
-
end
|
11
|
-
|
12
|
-
it "should return an identifier on ref" do
|
13
|
-
pdf = Prawn::Document.new
|
14
|
-
r = pdf.ref({})
|
15
|
-
expect(r.is_a?(Integer)).to eq(true)
|
16
|
-
end
|
17
|
-
|
18
|
-
it "should have :Length of stream if it has one when compression disabled" do
|
19
|
-
pdf = Prawn::Document.new :compress => false
|
20
|
-
ref = pdf.ref!({})
|
21
|
-
ref << 'Hello'
|
22
|
-
expect(ref.stream.data[:Length]).to eq(5)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/spec/repeater_spec.rb
DELETED
@@ -1,154 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
4
|
-
|
5
|
-
describe "Repeaters" do
|
6
|
-
it "creates a stamp and increments Prawn::Repeater.count on initialize" do
|
7
|
-
orig_count = Prawn::Repeater.count
|
8
|
-
|
9
|
-
doc = sample_document
|
10
|
-
doc.expects(:create_stamp).with("prawn_repeater(#{orig_count})")
|
11
|
-
|
12
|
-
r = repeater(doc, :all) { :do_nothing }
|
13
|
-
|
14
|
-
expect(Prawn::Repeater.count).to eq(orig_count + 1)
|
15
|
-
end
|
16
|
-
|
17
|
-
it "must provide an :all filter" do
|
18
|
-
doc = sample_document
|
19
|
-
r = repeater(doc, :all) { :do_nothing }
|
20
|
-
|
21
|
-
expect((1..doc.page_count).all? { |i| r.match?(i) }).to be_true
|
22
|
-
end
|
23
|
-
|
24
|
-
it "must provide an :odd filter" do
|
25
|
-
doc = sample_document
|
26
|
-
r = repeater(doc, :odd) { :do_nothing }
|
27
|
-
|
28
|
-
odd, even = (1..doc.page_count).partition(&:odd?)
|
29
|
-
|
30
|
-
expect(odd.all? { |i| r.match?(i) }).to be_true
|
31
|
-
expect(even.any? { |i| r.match?(i) }).to be_false
|
32
|
-
end
|
33
|
-
|
34
|
-
it "must be able to filter by an array of page numbers" do
|
35
|
-
doc = sample_document
|
36
|
-
r = repeater(doc, [1, 2, 7]) { :do_nothing }
|
37
|
-
|
38
|
-
expect((1..10).select { |i| r.match?(i) }).to eq([1, 2, 7])
|
39
|
-
end
|
40
|
-
|
41
|
-
it "must be able to filter by a range of page numbers" do
|
42
|
-
doc = sample_document
|
43
|
-
r = repeater(doc, 2..4) { :do_nothing }
|
44
|
-
|
45
|
-
expect((1..10).select { |i| r.match?(i) }).to eq([2, 3, 4])
|
46
|
-
end
|
47
|
-
|
48
|
-
it "must be able to filter by an arbitrary proc" do
|
49
|
-
doc = sample_document
|
50
|
-
r = repeater(doc, lambda { |x| x == 1 or x % 3 == 0 })
|
51
|
-
|
52
|
-
expect((1..10).select { |i| r.match?(i) }).to eq([1, 3, 6, 9])
|
53
|
-
end
|
54
|
-
|
55
|
-
it "must try to run a stamp if the page number matches" do
|
56
|
-
doc = sample_document
|
57
|
-
doc.expects(:stamp)
|
58
|
-
|
59
|
-
repeater(doc, :odd).run(3)
|
60
|
-
end
|
61
|
-
|
62
|
-
it "must not try to run a stamp unless the page number matches" do
|
63
|
-
doc = sample_document
|
64
|
-
|
65
|
-
doc.expects(:stamp).never
|
66
|
-
repeater(doc, :odd).run(2)
|
67
|
-
end
|
68
|
-
|
69
|
-
it "must not try to run a stamp if dynamic is selected" do
|
70
|
-
doc = sample_document
|
71
|
-
|
72
|
-
doc.expects(:stamp).never
|
73
|
-
(1..10).each { |p| repeater(doc, :all, true){ :do_nothing }.run(p) }
|
74
|
-
end
|
75
|
-
|
76
|
-
it "must try to run a block if the page number matches" do
|
77
|
-
doc = sample_document
|
78
|
-
|
79
|
-
doc.expects(:draw_text).twice
|
80
|
-
(1..10).each { |p| repeater(doc, [1, 2], true){ doc.draw_text "foo" }.run(p) }
|
81
|
-
end
|
82
|
-
|
83
|
-
it "must not try to run a block unless the page number matches" do
|
84
|
-
doc = sample_document
|
85
|
-
|
86
|
-
doc.expects(:draw_text).never
|
87
|
-
repeater(doc, :odd, true){ doc.draw_text "foo" }.run(2)
|
88
|
-
end
|
89
|
-
|
90
|
-
it "must treat any block as a closure" do
|
91
|
-
doc = sample_document
|
92
|
-
|
93
|
-
@page = "Page" # ensure access to ivars
|
94
|
-
doc.repeat(:all, :dynamic => true) do
|
95
|
-
doc.draw_text "#@page #{doc.page_number}", :at => [500, 0]
|
96
|
-
end
|
97
|
-
|
98
|
-
text = PDF::Inspector::Text.analyze(doc.render)
|
99
|
-
expect(text.strings).to eq((1..10).to_a.map{ |p| "Page #{p}" })
|
100
|
-
end
|
101
|
-
|
102
|
-
it "must treat any block as a closure (Document.new instance_eval form)" do
|
103
|
-
doc = Prawn::Document.new(:skip_page_creation => true) do
|
104
|
-
10.times { start_new_page }
|
105
|
-
|
106
|
-
@page = "Page"
|
107
|
-
repeat(:all, :dynamic => true) do
|
108
|
-
# ensure self is accessible here
|
109
|
-
draw_text "#@page #{page_number}", :at => [500, 0]
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
text = PDF::Inspector::Text.analyze(doc.render)
|
114
|
-
expect(text.strings).to eq((1..10).to_a.map{ |p| "Page #{p}" })
|
115
|
-
end
|
116
|
-
|
117
|
-
def sample_document
|
118
|
-
doc = Prawn::Document.new(:skip_page_creation => true)
|
119
|
-
10.times { |e| doc.start_new_page }
|
120
|
-
doc
|
121
|
-
end
|
122
|
-
|
123
|
-
def repeater(*args, &b)
|
124
|
-
Prawn::Repeater.new(*args, &b)
|
125
|
-
end
|
126
|
-
|
127
|
-
context "graphic state" do
|
128
|
-
it "should not alter the graphic state stack color space" do
|
129
|
-
create_pdf
|
130
|
-
starting_color_space = @pdf.state.page.graphic_state.color_space.dup
|
131
|
-
@pdf.repeat :all do
|
132
|
-
@pdf.text "Testing", :size => 24, :style => :bold
|
133
|
-
end
|
134
|
-
expect(@pdf.state.page.graphic_state.color_space).to eq(starting_color_space)
|
135
|
-
end
|
136
|
-
|
137
|
-
context "dynamic repeaters" do
|
138
|
-
it "should preserve the graphic state at creation time" do
|
139
|
-
create_pdf
|
140
|
-
@pdf.repeat :all, :dynamic => true do
|
141
|
-
@pdf.text "fill_color: #{@pdf.graphic_state.fill_color}"
|
142
|
-
@pdf.text "cap_style: #{@pdf.graphic_state.cap_style}"
|
143
|
-
end
|
144
|
-
@pdf.fill_color "666666"
|
145
|
-
@pdf.cap_style :round
|
146
|
-
text = PDF::Inspector::Text.analyze(@pdf.render)
|
147
|
-
expect(text.strings.include?("fill_color: 666666")).to eq(false)
|
148
|
-
expect(text.strings.include?("fill_color: 000000")).to eq(true)
|
149
|
-
expect(text.strings.include?("cap_style: round")).to eq(false)
|
150
|
-
expect(text.strings.include?("cap_style: butt")).to eq(true)
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
data/spec/security_spec.rb
DELETED
@@ -1,151 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require "tempfile"
|
3
|
-
|
4
|
-
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
5
|
-
|
6
|
-
describe "Document encryption" do
|
7
|
-
describe "Password padding" do
|
8
|
-
include Prawn::Document::Security
|
9
|
-
|
10
|
-
it "should truncate 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 "should pad short passwords" do
|
18
|
-
pw = "abcd"
|
19
|
-
padded = pad_password(pw)
|
20
|
-
expect(padded.length).to eq(32)
|
21
|
-
expect(padded).to eq(pw + Prawn::Document::Security::PasswordPadding[0, 28])
|
22
|
-
end
|
23
|
-
|
24
|
-
it "should fully pad null passwords" do
|
25
|
-
pw = ""
|
26
|
-
padded = pad_password(pw)
|
27
|
-
expect(padded.length).to eq(32)
|
28
|
-
expect(padded).to eq(Prawn::Document::Security::PasswordPadding)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe "Setting permissions" do
|
33
|
-
def doc_with_permissions(permissions)
|
34
|
-
pdf = Prawn::Document.new
|
35
|
-
|
36
|
-
class << pdf
|
37
|
-
# Make things easier to test
|
38
|
-
public :permissions_value
|
39
|
-
end
|
40
|
-
|
41
|
-
pdf.encrypt_document(:permissions => permissions)
|
42
|
-
pdf
|
43
|
-
end
|
44
|
-
|
45
|
-
it "should default to full permissions" do
|
46
|
-
expect(doc_with_permissions({}).permissions_value).to eq(0xFFFFFFFF)
|
47
|
-
expect(doc_with_permissions(:print_document => true,
|
48
|
-
:modify_contents => true,
|
49
|
-
:copy_contents => true,
|
50
|
-
:modify_annotations => true).permissions_value).
|
51
|
-
to eq(0xFFFFFFFF)
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should clear the appropriate bits for each permission flag" do
|
55
|
-
expect(doc_with_permissions(:print_document => false).permissions_value).
|
56
|
-
to eq(0b1111_1111_1111_1111_1111_1111_1111_1011)
|
57
|
-
expect(doc_with_permissions(:modify_contents => false).permissions_value).
|
58
|
-
to eq(0b1111_1111_1111_1111_1111_1111_1111_0111)
|
59
|
-
expect(doc_with_permissions(:copy_contents => false).permissions_value).
|
60
|
-
to eq(0b1111_1111_1111_1111_1111_1111_1110_1111)
|
61
|
-
expect(doc_with_permissions(:modify_annotations => false).permissions_value).
|
62
|
-
to eq(0b1111_1111_1111_1111_1111_1111_1101_1111)
|
63
|
-
end
|
64
|
-
|
65
|
-
it "should raise_error ArgumentError if invalid option is provided" do
|
66
|
-
expect {
|
67
|
-
doc_with_permissions(:modify_document => false)
|
68
|
-
}.to raise_error(ArgumentError)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
describe "Encryption keys" do
|
73
|
-
# Since PDF::Reader doesn't read encrypted PDF files, we just take the
|
74
|
-
# roundabout method of verifying each step of the encryption. This works
|
75
|
-
# fine because the encryption method is deterministic.
|
76
|
-
|
77
|
-
before(:each) do
|
78
|
-
@pdf = Prawn::Document.new
|
79
|
-
class << @pdf
|
80
|
-
public :owner_password_hash, :user_password_hash, :user_encryption_key
|
81
|
-
end
|
82
|
-
@pdf.encrypt_document :user_password => 'foo',
|
83
|
-
:owner_password => 'bar',
|
84
|
-
:permissions => { :print_document => false }
|
85
|
-
end
|
86
|
-
|
87
|
-
it "should calculate the correct owner hash" do
|
88
|
-
expect(@pdf.owner_password_hash.unpack("H*").first).to match(/^61CA855012/i)
|
89
|
-
end
|
90
|
-
|
91
|
-
it "should calculate the correct user hash" do
|
92
|
-
expect(@pdf.user_password_hash.unpack("H*").first).to match(/^6BC8C51031/i)
|
93
|
-
end
|
94
|
-
|
95
|
-
it "should calculate the correct user_encryption_key" do
|
96
|
-
expect(@pdf.user_encryption_key.unpack("H*").first.upcase).to eq("B100AB6429")
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
describe "EncryptedPdfObject" do
|
101
|
-
it "should delegate to PdfObject for simple types" do
|
102
|
-
expect(PDF::Core::EncryptedPdfObject(true, nil, nil, nil)).to eq("true")
|
103
|
-
expect(PDF::Core::EncryptedPdfObject(42, nil, nil, nil)).to eq("42")
|
104
|
-
end
|
105
|
-
|
106
|
-
it "should encrypt strings properly" do
|
107
|
-
expect(PDF::Core::EncryptedPdfObject("foo", "12345", 123, 0)).to eq("<4ad6e3>")
|
108
|
-
end
|
109
|
-
|
110
|
-
it "should encrypt literal strings properly" do
|
111
|
-
expect(PDF::Core::EncryptedPdfObject(PDF::Core::LiteralString.new("foo"), "12345", 123, 0)).to eq(bin_string("(J\xD6\xE3)"))
|
112
|
-
expect(PDF::Core::EncryptedPdfObject(PDF::Core::LiteralString.new("lhfbqg3do5u0satu3fjf"), nil, 123, 0)).to eq(bin_string("(\xF1\x8B\\(\b\xBB\xE18S\x130~4*#\\(%\x87\xE7\x8E\\\n)"))
|
113
|
-
end
|
114
|
-
|
115
|
-
it "should encrypt time properly" do
|
116
|
-
expect(PDF::Core::EncryptedPdfObject(Time.utc(2050, 04, 26, 10, 17, 10), "12345", 123, 0)).to eq(bin_string("(h\x83\xBE\xDC\xEC\x99\x0F\xD7\\)%\x13\xD4$\xB8\xF0\x16\xB8\x80\xC5\xE91+\xCF)"))
|
117
|
-
end
|
118
|
-
|
119
|
-
it "should properly handle compound types" do
|
120
|
-
expect(PDF::Core::EncryptedPdfObject({ :Bar => "foo" }, "12345", 123, 0)).to eq(
|
121
|
-
"<< /Bar <4ad6e3>\n>>"
|
122
|
-
)
|
123
|
-
expect(PDF::Core::EncryptedPdfObject(["foo", "bar"], "12345", 123, 0)).to eq(
|
124
|
-
"[<4ad6e3> <4ed8fe>]"
|
125
|
-
)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
describe "Reference#encrypted_object" do
|
130
|
-
it "should encrypt references properly" do
|
131
|
-
ref = PDF::Core::Reference(1, ["foo"])
|
132
|
-
expect(ref.encrypted_object(nil)).to eq("1 0 obj\n[<4fca3f>]\nendobj\n")
|
133
|
-
end
|
134
|
-
|
135
|
-
it "should encrypt references with streams properly" do
|
136
|
-
ref = PDF::Core::Reference(1, {})
|
137
|
-
ref << 'foo'
|
138
|
-
result = bin_string("1 0 obj\n<< /Length 3\n>>\nstream\nO\xCA?\nendstream\nendobj\n")
|
139
|
-
expect(ref.encrypted_object(nil)).to eq(result)
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
describe "String#encrypted_object" do
|
144
|
-
it "should encrypt stream properly" do
|
145
|
-
stream = PDF::Core::Stream.new
|
146
|
-
stream << "foo"
|
147
|
-
result = bin_string("stream\nO\xCA?\nendstream\n")
|
148
|
-
expect(stream.encrypted_object(nil, 1, 0)).to eq(result)
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|