prawn 0.13.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data/.yardopts +10 -0
- data/GPLv2 +20 -21
- data/Gemfile +3 -16
- data/Rakefile +17 -39
- data/lib/prawn/document/bounding_box.rb +85 -42
- data/lib/prawn/document/column_box.rb +21 -11
- data/lib/prawn/document/internals.rb +40 -147
- data/lib/prawn/document/span.rb +25 -17
- data/lib/prawn/document.rb +286 -245
- data/lib/prawn/encoding.rb +68 -101
- data/lib/prawn/errors.rb +47 -43
- data/lib/prawn/font.rb +204 -155
- data/lib/prawn/font_metric_cache.rb +25 -21
- data/lib/prawn/fonts/afm.rb +292 -0
- data/lib/prawn/{font → fonts}/dfont.rb +7 -13
- data/lib/prawn/fonts/otf.rb +11 -0
- data/lib/prawn/fonts/ttc.rb +36 -0
- data/lib/prawn/{font → fonts}/ttf.rb +142 -80
- data/lib/prawn/graphics/blend_mode.rb +65 -0
- data/lib/prawn/graphics/cap_style.rb +6 -5
- data/lib/prawn/graphics/color.rb +47 -44
- data/lib/prawn/graphics/dash.rb +30 -13
- data/lib/prawn/graphics/join_style.rb +13 -6
- data/lib/prawn/graphics/patterns.rb +221 -90
- data/lib/prawn/graphics/transformation.rb +21 -12
- data/lib/prawn/graphics/transparency.rb +21 -17
- data/lib/prawn/graphics.rb +155 -128
- data/lib/prawn/{layout/grid.rb → grid.rb} +110 -47
- data/lib/prawn/image_handler.rb +16 -2
- data/lib/prawn/images/image.rb +4 -2
- data/lib/prawn/images/jpg.rb +39 -30
- data/lib/prawn/images/png.rb +132 -169
- data/lib/prawn/images.rb +70 -62
- data/lib/prawn/measurement_extensions.rb +15 -10
- data/lib/prawn/measurements.rb +22 -23
- data/lib/prawn/outline.rb +301 -13
- data/lib/prawn/repeater.rb +19 -17
- data/lib/prawn/security/arcfour.rb +54 -0
- data/lib/prawn/security.rb +108 -86
- data/lib/prawn/soft_mask.rb +40 -41
- data/lib/prawn/stamp.rb +29 -12
- data/lib/prawn/text/box.rb +27 -29
- data/lib/prawn/text/formatted/arranger.rb +110 -67
- data/lib/prawn/text/formatted/box.rb +233 -165
- data/lib/prawn/text/formatted/fragment.rb +27 -27
- data/lib/prawn/text/formatted/line_wrap.rb +137 -97
- data/lib/prawn/text/formatted/parser.rb +149 -127
- data/lib/prawn/text/formatted/wrap.rb +57 -37
- data/lib/prawn/text/formatted.rb +6 -4
- data/lib/prawn/text.rb +105 -73
- data/lib/prawn/transformation_stack.rb +44 -0
- data/lib/prawn/utilities.rb +11 -21
- data/lib/prawn/version.rb +5 -0
- data/lib/prawn/view.rb +101 -0
- data/lib/prawn.rb +42 -68
- data/{data/images/fractal.jpg → manual/absolute_position.pdf} +0 -0
- data/manual/basic_concepts/adding_pages.rb +9 -10
- data/manual/basic_concepts/basic_concepts.rb +33 -24
- data/manual/basic_concepts/creation.rb +10 -11
- data/manual/basic_concepts/cursor.rb +9 -10
- data/manual/basic_concepts/measurement.rb +10 -11
- data/manual/basic_concepts/origin.rb +8 -9
- data/manual/basic_concepts/other_cursor_helpers.rb +17 -18
- data/manual/basic_concepts/view.rb +48 -0
- data/manual/bounding_box/bounding_box.rb +31 -29
- data/manual/bounding_box/bounds.rb +17 -18
- data/manual/bounding_box/canvas.rb +8 -9
- data/manual/bounding_box/creation.rb +8 -9
- data/manual/bounding_box/indentation.rb +22 -23
- data/manual/bounding_box/nesting.rb +32 -25
- data/manual/bounding_box/russian_boxes.rb +19 -19
- data/manual/bounding_box/stretchy.rb +18 -20
- data/manual/contents.rb +35 -0
- data/manual/cover.rb +43 -0
- data/manual/document_and_page_options/background.rb +16 -14
- data/manual/document_and_page_options/document_and_page_options.rb +26 -23
- data/manual/document_and_page_options/metadata.rb +21 -19
- data/manual/document_and_page_options/page_margins.rb +20 -22
- data/manual/document_and_page_options/page_size.rb +15 -15
- data/manual/document_and_page_options/print_scaling.rb +23 -0
- data/manual/example_helper.rb +5 -408
- data/manual/graphics/blend_mode.rb +52 -0
- data/manual/graphics/circle_and_ellipse.rb +8 -9
- data/manual/graphics/color.rb +11 -13
- data/manual/graphics/common_lines.rb +13 -12
- data/manual/graphics/fill_and_stroke.rb +10 -11
- data/manual/graphics/fill_rules.rb +13 -12
- data/manual/graphics/gradients.rb +28 -22
- data/manual/graphics/graphics.rb +52 -46
- data/manual/graphics/helper.rb +20 -10
- data/manual/graphics/line_width.rb +13 -12
- data/manual/graphics/lines_and_curves.rb +13 -14
- data/manual/graphics/polygon.rb +10 -12
- data/manual/graphics/rectangle.rb +7 -8
- data/manual/graphics/rotate.rb +9 -12
- data/manual/graphics/scale.rb +19 -18
- data/manual/graphics/soft_masks.rb +5 -7
- data/manual/graphics/stroke_cap.rb +10 -11
- data/manual/graphics/stroke_dash.rb +16 -17
- data/manual/graphics/stroke_join.rb +10 -11
- data/manual/graphics/translate.rb +13 -13
- data/manual/graphics/transparency.rb +11 -13
- data/manual/{manual/how_to_read_this_manual.rb → how_to_read_this_manual.rb} +23 -25
- data/manual/images/absolute_position.rb +9 -10
- data/manual/images/fit.rb +9 -10
- data/manual/images/horizontal.rb +13 -14
- data/manual/images/images.rb +31 -30
- data/manual/images/plain_image.rb +6 -7
- data/manual/images/scale.rb +12 -13
- data/manual/images/vertical.rb +19 -17
- data/manual/images/width_and_height.rb +13 -14
- data/manual/layout/boxes.rb +14 -15
- data/manual/layout/content.rb +12 -13
- data/manual/layout/layout.rb +19 -20
- data/manual/layout/simple_grid.rb +8 -9
- data/manual/outline/add_subsection_to.rb +26 -27
- data/manual/outline/insert_section_after.rb +19 -20
- data/manual/outline/outline.rb +23 -22
- data/manual/outline/sections_and_pages.rb +24 -25
- data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
- data/manual/repeatable_content/page_numbering.rb +20 -19
- data/manual/repeatable_content/repeatable_content.rb +26 -22
- data/manual/repeatable_content/repeater.rb +18 -19
- data/manual/repeatable_content/stamp.rb +18 -19
- data/manual/security/encryption.rb +8 -11
- data/manual/security/permissions.rb +20 -15
- data/manual/security/security.rb +20 -20
- data/manual/table.rb +16 -0
- data/manual/text/alignment.rb +17 -18
- data/manual/text/color.rb +13 -13
- data/manual/text/column_box.rb +10 -12
- data/manual/text/fallback_fonts.rb +29 -25
- data/manual/text/font.rb +17 -18
- data/manual/text/font_size.rb +21 -22
- data/manual/text/font_style.rb +12 -10
- data/manual/text/formatted_callbacks.rb +36 -26
- data/manual/text/formatted_text.rb +41 -34
- data/manual/text/free_flowing_text.rb +28 -29
- data/manual/text/inline.rb +23 -26
- data/manual/text/kerning_and_character_spacing.rb +20 -21
- data/manual/text/leading.rb +10 -11
- data/manual/text/line_wrapping.rb +40 -21
- data/manual/text/paragraph_indentation.rb +17 -12
- data/manual/text/positioned_text.rb +19 -20
- data/manual/text/registering_families.rb +33 -30
- data/manual/text/rendering_and_color.rb +11 -12
- data/manual/text/right_to_left_text.rb +31 -20
- data/manual/text/rotation.rb +36 -27
- data/manual/text/single_usage.rb +13 -14
- data/manual/text/text.rb +62 -62
- data/manual/text/text_box_excess.rb +22 -19
- data/manual/text/text_box_extensions.rb +21 -18
- data/manual/text/text_box_overflow.rb +28 -21
- data/manual/text/utf8.rb +16 -17
- data/manual/text/win_ansi_charset.rb +29 -26
- data/prawn.gemspec +45 -43
- data/spec/extensions/encoding_helpers.rb +4 -3
- data/spec/prawn/document/bounding_box_spec.rb +550 -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 +44 -0
- data/spec/prawn/document_spec.rb +805 -0
- data/spec/prawn/font_metric_cache_spec.rb +54 -0
- data/spec/prawn/font_spec.rb +544 -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 +872 -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 +229 -0
- data/spec/prawn/measurements_extensions_spec.rb +24 -0
- data/spec/prawn/outline_spec.rb +512 -0
- data/spec/prawn/repeater_spec.rb +166 -0
- data/spec/prawn/soft_mask_spec.rb +74 -0
- data/spec/prawn/stamp_spec.rb +173 -0
- data/spec/prawn/text/box_spec.rb +1110 -0
- data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
- data/spec/prawn/text/formatted/box_spec.rb +849 -0
- data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
- data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
- data/spec/prawn/text/formatted/parser_spec.rb +697 -0
- data/spec/prawn/text_draw_text_spec.rb +150 -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 +22 -21
- data.tar.gz.sig +0 -0
- metadata +168 -307
- metadata.gz.sig +0 -0
- data/README.md +0 -109
- data/data/encodings/win_ansi.txt +0 -29
- data/data/images/16bit.alpha +0 -0
- data/data/images/16bit.dat +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/barcode_issue.png +0 -0
- data/data/images/dice.alpha +0 -0
- data/data/images/dice.dat +0 -0
- data/data/images/dice.png +0 -0
- data/data/images/dice_interlaced.png +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/page_white_text.alpha +0 -0
- data/data/images/page_white_text.dat +0 -0
- data/data/images/page_white_text.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/lib/pdf/core/annotations.rb +0 -60
- data/lib/pdf/core/byte_string.rb +0 -9
- data/lib/pdf/core/destinations.rb +0 -90
- data/lib/pdf/core/document_state.rb +0 -78
- data/lib/pdf/core/filter_list.rb +0 -51
- data/lib/pdf/core/filters.rb +0 -36
- data/lib/pdf/core/graphics_state.rb +0 -68
- data/lib/pdf/core/literal_string.rb +0 -16
- data/lib/pdf/core/name_tree.rb +0 -177
- data/lib/pdf/core/object_store.rb +0 -320
- data/lib/pdf/core/outline.rb +0 -315
- data/lib/pdf/core/page.rb +0 -212
- data/lib/pdf/core/page_geometry.rb +0 -126
- data/lib/pdf/core/pdf_object.rb +0 -124
- data/lib/pdf/core/reference.rb +0 -103
- data/lib/pdf/core/stream.rb +0 -98
- data/lib/pdf/core/text.rb +0 -275
- data/lib/pdf/core.rb +0 -35
- data/lib/prawn/compatibility.rb +0 -91
- data/lib/prawn/document/graphics_state.rb +0 -73
- data/lib/prawn/document/snapshot.rb +0 -89
- data/lib/prawn/font/afm.rb +0 -203
- data/lib/prawn/layout.rb +0 -20
- data/lib/prawn/table/cell/image.rb +0 -70
- data/lib/prawn/table/cell/in_table.rb +0 -27
- data/lib/prawn/table/cell/span_dummy.rb +0 -92
- data/lib/prawn/table/cell/subtable.rb +0 -65
- data/lib/prawn/table/cell/text.rb +0 -153
- data/lib/prawn/table/cell.rb +0 -770
- data/lib/prawn/table/cells.rb +0 -295
- data/lib/prawn/table.rb +0 -643
- data/manual/example_file.rb +0 -116
- data/manual/example_package.rb +0 -53
- data/manual/example_section.rb +0 -46
- data/manual/manual/cover.rb +0 -35
- data/manual/manual/foreword.rb +0 -85
- data/manual/manual/manual.rb +0 -35
- data/manual/syntax_highlight.rb +0 -52
- data/manual/table/basic_block.rb +0 -53
- data/manual/table/before_rendering_page.rb +0 -26
- data/manual/table/cell_border_lines.rb +0 -24
- data/manual/table/cell_borders_and_bg.rb +0 -31
- data/manual/table/cell_dimensions.rb +0 -30
- data/manual/table/cell_text.rb +0 -38
- data/manual/table/column_widths.rb +0 -30
- data/manual/table/content_and_subtables.rb +0 -39
- data/manual/table/creation.rb +0 -27
- data/manual/table/filtering.rb +0 -36
- data/manual/table/flow_and_header.rb +0 -17
- data/manual/table/image_cells.rb +0 -33
- data/manual/table/position.rb +0 -29
- data/manual/table/row_colors.rb +0 -20
- data/manual/table/span.rb +0 -30
- data/manual/table/style.rb +0 -22
- data/manual/table/table.rb +0 -52
- data/manual/table/width.rb +0 -27
- data/manual/templates/full_template.rb +0 -25
- data/manual/templates/page_template.rb +0 -48
- data/manual/templates/templates.rb +0 -27
- data/manual/text/group.rb +0 -29
- data/spec/acceptance/png.rb +0 -23
- data/spec/annotations_spec.rb +0 -74
- data/spec/bounding_box_spec.rb +0 -493
- data/spec/cell_spec.rb +0 -628
- data/spec/column_box_spec.rb +0 -33
- data/spec/destinations_spec.rb +0 -15
- data/spec/document_spec.rb +0 -761
- data/spec/extensions/mocha.rb +0 -44
- data/spec/filters_spec.rb +0 -34
- data/spec/font_metric_cache_spec.rb +0 -52
- data/spec/font_spec.rb +0 -464
- data/spec/formatted_text_arranger_spec.rb +0 -421
- data/spec/formatted_text_box_spec.rb +0 -650
- data/spec/formatted_text_fragment_spec.rb +0 -298
- data/spec/graphics_spec.rb +0 -651
- data/spec/grid_spec.rb +0 -85
- data/spec/image_handler_spec.rb +0 -42
- data/spec/images_spec.rb +0 -157
- data/spec/inline_formatted_text_parser_spec.rb +0 -564
- data/spec/jpg_spec.rb +0 -25
- data/spec/line_wrap_spec.rb +0 -333
- data/spec/measurement_units_spec.rb +0 -23
- data/spec/name_tree_spec.rb +0 -112
- data/spec/object_store_spec.rb +0 -170
- data/spec/outline_spec.rb +0 -448
- data/spec/pdf_object_spec.rb +0 -172
- data/spec/png_spec.rb +0 -240
- data/spec/reference_spec.rb +0 -82
- data/spec/repeater_spec.rb +0 -158
- data/spec/security_spec.rb +0 -158
- data/spec/snapshot_spec.rb +0 -186
- data/spec/soft_mask_spec.rb +0 -117
- data/spec/span_spec.rb +0 -44
- data/spec/stamp_spec.rb +0 -158
- data/spec/stream_spec.rb +0 -58
- data/spec/stroke_styles_spec.rb +0 -211
- data/spec/table/span_dummy_spec.rb +0 -17
- data/spec/table_spec.rb +0 -1355
- data/spec/template_spec.rb +0 -351
- data/spec/text_at_spec.rb +0 -130
- data/spec/text_box_spec.rb +0 -1030
- data/spec/text_rendering_mode_spec.rb +0 -45
- data/spec/text_spacing_spec.rb +0 -93
- data/spec/text_spec.rb +0 -425
- data/spec/text_with_inline_formatting_spec.rb +0 -35
- data/spec/transparency_spec.rb +0 -89
data/spec/template_spec.rb
DELETED
@@ -1,351 +0,0 @@
|
|
1
|
-
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
2
|
-
|
3
|
-
describe "Document built from a template" do
|
4
|
-
it "should have the same page count as the source document" do
|
5
|
-
filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
|
6
|
-
@pdf = Prawn::Document.new(:template => filename)
|
7
|
-
page_counter = PDF::Inspector::Page.analyze(@pdf.render)
|
8
|
-
|
9
|
-
page_counter.pages.size.should == 1
|
10
|
-
end
|
11
|
-
|
12
|
-
it "should not set the template page's parent to the document pages catalog (especially with nested pages)" do
|
13
|
-
filename = "#{Prawn::DATADIR}/pdfs/nested_pages.pdf"
|
14
|
-
@pdf = Prawn::Document.new(:template => filename, :skip_page_creation => true)
|
15
|
-
@pdf.state.page.dictionary.data[:Parent].should_not == @pdf.state.store.pages
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
it "should have start with the Y cursor at the top of the document" do
|
20
|
-
filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
|
21
|
-
|
22
|
-
@pdf = Prawn::Document.new(:template => filename)
|
23
|
-
(@pdf.y == nil).should == false
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should respect margins set by Prawn" do
|
27
|
-
filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
|
28
|
-
|
29
|
-
@pdf = Prawn::Document.new(:template => filename, :margin => 0)
|
30
|
-
@pdf.page.margins.should == { :left => 0,
|
31
|
-
:right => 0,
|
32
|
-
:top => 0,
|
33
|
-
:bottom => 0 }
|
34
|
-
|
35
|
-
@pdf = Prawn::Document.new(:template => filename, :left_margin => 0)
|
36
|
-
|
37
|
-
@pdf.page.margins.should == { :left => 0,
|
38
|
-
:right => 36,
|
39
|
-
:top => 36,
|
40
|
-
:bottom => 36 }
|
41
|
-
|
42
|
-
@pdf.start_new_page(:right_margin => 0)
|
43
|
-
|
44
|
-
@pdf.page.margins.should == { :left => 0,
|
45
|
-
:right => 0,
|
46
|
-
:top => 36,
|
47
|
-
:bottom => 36 }
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
it "should not add an extra restore_graphics_state operator to the end of any content stream" do
|
54
|
-
filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
|
55
|
-
|
56
|
-
@pdf = Prawn::Document.new(:template => filename)
|
57
|
-
output = StringIO.new(@pdf.render)
|
58
|
-
hash = PDF::Reader::ObjectHash.new(output)
|
59
|
-
|
60
|
-
hash.each_value do |obj|
|
61
|
-
next unless obj.kind_of?(PDF::Reader::Stream)
|
62
|
-
|
63
|
-
data = obj.data.tr(" \n\r","")
|
64
|
-
data.include?("QQ").should == false
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
it "should have a single page object if importing a single page template" do
|
69
|
-
filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
|
70
|
-
|
71
|
-
@pdf = Prawn::Document.new(:template => filename)
|
72
|
-
output = StringIO.new(@pdf.render)
|
73
|
-
hash = PDF::Reader::ObjectHash.new(output)
|
74
|
-
|
75
|
-
pages = hash.values.select { |obj| obj.kind_of?(Hash) && obj[:Type] == :Page }
|
76
|
-
|
77
|
-
pages.size.should == 1
|
78
|
-
end
|
79
|
-
|
80
|
-
it "should have two content streams if importing a single page template" do
|
81
|
-
filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
|
82
|
-
|
83
|
-
@pdf = Prawn::Document.new(:template => filename)
|
84
|
-
output = StringIO.new(@pdf.render)
|
85
|
-
hash = PDF::Reader::ObjectHash.new(output)
|
86
|
-
|
87
|
-
streams = hash.values.select { |obj| obj.kind_of?(PDF::Reader::Stream) }
|
88
|
-
|
89
|
-
streams.size.should == 2
|
90
|
-
end
|
91
|
-
|
92
|
-
it "should not die if using this PDF as a template" do
|
93
|
-
filename = "#{Prawn::DATADIR}/pdfs/complex_template.pdf"
|
94
|
-
|
95
|
-
lambda {
|
96
|
-
@pdf = Prawn::Document.new(:template => filename)
|
97
|
-
}.should_not raise_error
|
98
|
-
end
|
99
|
-
|
100
|
-
|
101
|
-
it "should have balance q/Q operators on all content streams" do
|
102
|
-
filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
|
103
|
-
|
104
|
-
@pdf = Prawn::Document.new(:template => filename)
|
105
|
-
output = StringIO.new(@pdf.render)
|
106
|
-
hash = PDF::Reader::ObjectHash.new(output)
|
107
|
-
|
108
|
-
streams = hash.values.select { |obj| obj.kind_of?(PDF::Reader::Stream) }
|
109
|
-
|
110
|
-
streams.each do |stream|
|
111
|
-
data = stream.unfiltered_data
|
112
|
-
data.scan("q").size.should == 1
|
113
|
-
data.scan("Q").size.should == 1
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
it "should allow text to be added to a single page template" do
|
118
|
-
filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
|
119
|
-
|
120
|
-
@pdf = Prawn::Document.new(:template => filename)
|
121
|
-
|
122
|
-
@pdf.text "Adding some text"
|
123
|
-
|
124
|
-
text = PDF::Inspector::Text.analyze(@pdf.render)
|
125
|
-
text.strings.first.should == "Adding some text"
|
126
|
-
end
|
127
|
-
|
128
|
-
it "should allow PDFs with page resources behind an indirect object to be used as templates" do
|
129
|
-
filename = "#{Prawn::DATADIR}/pdfs/resources_as_indirect_object.pdf"
|
130
|
-
|
131
|
-
@pdf = Prawn::Document.new(:template => filename)
|
132
|
-
|
133
|
-
@pdf.text "Adding some text"
|
134
|
-
|
135
|
-
text = PDF::Inspector::Text.analyze(@pdf.render)
|
136
|
-
all_text = text.strings.join
|
137
|
-
all_text.include?("Adding some text").should == true
|
138
|
-
end
|
139
|
-
|
140
|
-
it "should copy the PDF version from the template file" do
|
141
|
-
filename = "#{Prawn::DATADIR}/pdfs/version_1_6.pdf"
|
142
|
-
|
143
|
-
@pdf = Prawn::Document.new(:template => filename)
|
144
|
-
str = @pdf.render
|
145
|
-
str[0,8].should == "%PDF-1.6"
|
146
|
-
end
|
147
|
-
|
148
|
-
it "should correctly add a TTF font to a template that has existing fonts" do
|
149
|
-
filename = "#{Prawn::DATADIR}/pdfs/contains_ttf_font.pdf"
|
150
|
-
@pdf = Prawn::Document.new(:template => filename)
|
151
|
-
@pdf.font "#{Prawn::DATADIR}/fonts/Chalkboard.ttf"
|
152
|
-
@pdf.move_down(40)
|
153
|
-
@pdf.text "Hi There"
|
154
|
-
|
155
|
-
output = StringIO.new(@pdf.render)
|
156
|
-
hash = PDF::Reader::ObjectHash.new(output)
|
157
|
-
|
158
|
-
page_dict = hash.values.detect{ |obj| obj.is_a?(Hash) && obj[:Type] == :Page }
|
159
|
-
resources = page_dict[:Resources]
|
160
|
-
fonts = resources[:Font]
|
161
|
-
fonts.size.should == 2
|
162
|
-
end
|
163
|
-
|
164
|
-
it "should correctly import a template file that is missing a MediaBox entry" do
|
165
|
-
filename = "#{Prawn::DATADIR}/pdfs/page_without_mediabox.pdf"
|
166
|
-
|
167
|
-
@pdf = Prawn::Document.new(:template => filename)
|
168
|
-
str = @pdf.render
|
169
|
-
str[0,4].should == "%PDF"
|
170
|
-
end
|
171
|
-
|
172
|
-
context "with the template as a stream" do
|
173
|
-
it "should correctly import a template file from a stream" do
|
174
|
-
filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
|
175
|
-
io = StringIO.new(File.binread(filename))
|
176
|
-
@pdf = Prawn::Document.new(:template => io)
|
177
|
-
str = @pdf.render
|
178
|
-
str[0,4].should == "%PDF"
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
it "merges metadata info" do
|
183
|
-
filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
|
184
|
-
info = { :Title => "Sample METADATA",
|
185
|
-
:Author => "Me",
|
186
|
-
:Subject => "Not Working",
|
187
|
-
:CreationDate => Time.now }
|
188
|
-
|
189
|
-
@pdf = Prawn::Document.new(:template => filename, :info => info)
|
190
|
-
output = StringIO.new(@pdf.render)
|
191
|
-
hash = PDF::Reader::ObjectHash.new(output)
|
192
|
-
info.keys.each { |k| hash[hash.trailer[:Info]].keys.include?(k).should == true }
|
193
|
-
end
|
194
|
-
|
195
|
-
end
|
196
|
-
|
197
|
-
describe "Document#start_new_page with :template option" do
|
198
|
-
filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf"
|
199
|
-
|
200
|
-
it "should set the imported page's parent to the document pages catalog" do
|
201
|
-
@pdf = Prawn::Document.new()
|
202
|
-
@pdf.start_new_page(:template => filename)
|
203
|
-
@pdf.state.page.dictionary.data[:Parent].should == @pdf.state.store.pages
|
204
|
-
end
|
205
|
-
|
206
|
-
it "should set start the Y cursor at the top of the page" do
|
207
|
-
@pdf = Prawn::Document.new()
|
208
|
-
@pdf.start_new_page(:template => filename)
|
209
|
-
(@pdf.y == nil).should == false
|
210
|
-
end
|
211
|
-
|
212
|
-
it "should respect margins set by Prawn" do
|
213
|
-
@pdf = Prawn::Document.new(:margin => 0)
|
214
|
-
@pdf.start_new_page(:template => filename)
|
215
|
-
@pdf.page.margins.should == { :left => 0,
|
216
|
-
:right => 0,
|
217
|
-
:top => 0,
|
218
|
-
:bottom => 0 }
|
219
|
-
|
220
|
-
@pdf = Prawn::Document.new(:left_margin => 0)
|
221
|
-
@pdf.start_new_page(:template => filename)
|
222
|
-
@pdf.page.margins.should == { :left => 0,
|
223
|
-
:right => 36,
|
224
|
-
:top => 36,
|
225
|
-
:bottom => 36 }
|
226
|
-
@pdf.start_new_page(:template => filename, :right_margin => 0)
|
227
|
-
@pdf.page.margins.should == { :left => 0,
|
228
|
-
:right => 0,
|
229
|
-
:top => 36,
|
230
|
-
:bottom => 36 }
|
231
|
-
end
|
232
|
-
|
233
|
-
it "should not add an extra restore_graphics_state operator to the end of any content stream" do
|
234
|
-
@pdf = Prawn::Document.new
|
235
|
-
@pdf.start_new_page(:template => filename)
|
236
|
-
output = StringIO.new(@pdf.render)
|
237
|
-
hash = PDF::Reader::ObjectHash.new(output)
|
238
|
-
|
239
|
-
hash.each_value do |obj|
|
240
|
-
next unless obj.kind_of?(PDF::Reader::Stream)
|
241
|
-
|
242
|
-
data = obj.data.tr(" \n\r","")
|
243
|
-
data.include?("QQ").should == false
|
244
|
-
end
|
245
|
-
end
|
246
|
-
|
247
|
-
it "should have two content streams if importing a single page template" do
|
248
|
-
filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
|
249
|
-
@pdf = Prawn::Document.new()
|
250
|
-
@pdf.start_new_page(:template => filename)
|
251
|
-
output = StringIO.new(@pdf.render)
|
252
|
-
hash = PDF::Reader::ObjectHash.new(output)
|
253
|
-
pages = hash.values.find {|obj| obj.is_a?(Hash) && obj[:Type] == :Pages}[:Kids]
|
254
|
-
template_page = hash[pages[1]]
|
255
|
-
template_page[:Contents].size.should == 2
|
256
|
-
end
|
257
|
-
|
258
|
-
it "should have balance q/Q operators on all content streams" do
|
259
|
-
filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
|
260
|
-
|
261
|
-
@pdf = Prawn::Document.new()
|
262
|
-
@pdf.start_new_page(:template => filename)
|
263
|
-
output = StringIO.new(@pdf.render)
|
264
|
-
hash = PDF::Reader::ObjectHash.new(output)
|
265
|
-
|
266
|
-
streams = hash.values.select { |obj| obj.kind_of?(PDF::Reader::Stream) }
|
267
|
-
|
268
|
-
streams.each do |stream|
|
269
|
-
data = stream.unfiltered_data
|
270
|
-
data.scan("q").size.should == 1
|
271
|
-
data.scan("Q").size.should == 1
|
272
|
-
end
|
273
|
-
end
|
274
|
-
|
275
|
-
it "should allow text to be added to a single page template" do
|
276
|
-
|
277
|
-
@pdf = Prawn::Document.new()
|
278
|
-
@pdf.start_new_page(:template => filename)
|
279
|
-
|
280
|
-
@pdf.text "Adding some text"
|
281
|
-
|
282
|
-
text = PDF::Inspector::Text.analyze(@pdf.render)
|
283
|
-
text.strings.first.should == "Adding some text"
|
284
|
-
end
|
285
|
-
|
286
|
-
it "should allow PDFs with page resources behind an indirect object to be used as templates" do
|
287
|
-
filename = "#{Prawn::DATADIR}/pdfs/resources_as_indirect_object.pdf"
|
288
|
-
|
289
|
-
@pdf = Prawn::Document.new()
|
290
|
-
@pdf.start_new_page(:template => filename)
|
291
|
-
|
292
|
-
@pdf.text "Adding some text"
|
293
|
-
|
294
|
-
text = PDF::Inspector::Text.analyze(@pdf.render)
|
295
|
-
all_text = text.strings.join
|
296
|
-
all_text.include?("Adding some text").should == true
|
297
|
-
end
|
298
|
-
|
299
|
-
it "should correctly add a TTF font to a template that has existing fonts" do
|
300
|
-
filename = "#{Prawn::DATADIR}/pdfs/contains_ttf_font.pdf"
|
301
|
-
@pdf = Prawn::Document.new()
|
302
|
-
@pdf.start_new_page(:template => filename)
|
303
|
-
@pdf.font "#{Prawn::DATADIR}/fonts/Chalkboard.ttf"
|
304
|
-
@pdf.move_down(40)
|
305
|
-
@pdf.text "Hi There"
|
306
|
-
|
307
|
-
output = StringIO.new(@pdf.render)
|
308
|
-
hash = PDF::Reader::ObjectHash.new(output)
|
309
|
-
hash = PDF::Reader::ObjectHash.new(output)
|
310
|
-
pages = hash.values.find {|obj| obj.is_a?(Hash) && obj[:Type] == :Pages}[:Kids]
|
311
|
-
template_page = hash[pages[1]]
|
312
|
-
resources = template_page[:Resources]
|
313
|
-
fonts = resources[:Font]
|
314
|
-
fonts.size.should == 2
|
315
|
-
end
|
316
|
-
|
317
|
-
it "indexes template pages when used multiple times" do
|
318
|
-
filename = "#{Prawn::DATADIR}/pdfs/multipage_template.pdf"
|
319
|
-
@repeated_pdf = Prawn::Document.new()
|
320
|
-
3.times { @repeated_pdf.start_new_page(:template => filename) }
|
321
|
-
repeated_hash = PDF::Reader::ObjectHash.new(StringIO.new(@repeated_pdf.render))
|
322
|
-
@sequential_pdf = Prawn::Document.new()
|
323
|
-
(1..3).each { |p| @sequential_pdf.start_new_page(:template => filename, :template_page => p ) }
|
324
|
-
sequential_hash = PDF::Reader::ObjectHash.new(StringIO.new(@sequential_pdf.render))
|
325
|
-
(repeated_hash.size < sequential_hash.size).should == true
|
326
|
-
end
|
327
|
-
|
328
|
-
context "with the template as a stream" do
|
329
|
-
it "should correctly import a template file from a stream" do
|
330
|
-
filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf"
|
331
|
-
io = StringIO.new(File.binread(filename))
|
332
|
-
|
333
|
-
@pdf = Prawn::Document.new()
|
334
|
-
@pdf.start_new_page(:template => io)
|
335
|
-
|
336
|
-
str = @pdf.render
|
337
|
-
str[0,4].should == "%PDF"
|
338
|
-
end
|
339
|
-
end
|
340
|
-
|
341
|
-
context "using template_page option" do
|
342
|
-
it "uses the specified page option" do
|
343
|
-
filename = "#{Prawn::DATADIR}/pdfs/multipage_template.pdf"
|
344
|
-
@pdf = Prawn::Document.new()
|
345
|
-
@pdf.start_new_page(:template => filename, :template_page => 2)
|
346
|
-
text = PDF::Inspector::Text.analyze(@pdf.render)
|
347
|
-
text.strings.first.should == "This is template page 2"
|
348
|
-
end
|
349
|
-
end
|
350
|
-
|
351
|
-
end
|
data/spec/text_at_spec.rb
DELETED
@@ -1,130 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
4
|
-
|
5
|
-
describe "#draw_text" do
|
6
|
-
before(:each) { create_pdf }
|
7
|
-
|
8
|
-
it "should raise_error ArgumentError if :at option omitted" do
|
9
|
-
lambda { @pdf.draw_text("hai", { }) }.should raise_error(ArgumentError)
|
10
|
-
end
|
11
|
-
|
12
|
-
it "should raise_error ArgumentError if :align option included" do
|
13
|
-
lambda { @pdf.draw_text("hai", :at => [0, 0], :align => :center) }.should raise_error(ArgumentError)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should allow drawing empty strings to the page" do
|
17
|
-
@pdf.draw_text(" ", :at => [100,100])
|
18
|
-
text = PDF::Inspector::Text.analyze(@pdf.render)
|
19
|
-
text.strings.first.should == " "
|
20
|
-
end
|
21
|
-
|
22
|
-
it "should default to 12 point helvetica" do
|
23
|
-
@pdf.draw_text("Blah", :at => [100,100])
|
24
|
-
text = PDF::Inspector::Text.analyze(@pdf.render)
|
25
|
-
text.font_settings[0][:name].should == :Helvetica
|
26
|
-
text.font_settings[0][:size].should == 12
|
27
|
-
text.strings.first.should == "Blah"
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should allow setting font size" do
|
31
|
-
@pdf.draw_text("Blah", :at => [100,100], :size => 16)
|
32
|
-
text = PDF::Inspector::Text.analyze(@pdf.render)
|
33
|
-
text.font_settings[0][:size].should == 16
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should allow setting a default font size" do
|
37
|
-
@pdf.font_size = 16
|
38
|
-
@pdf.draw_text("Blah", :at => [0, 0])
|
39
|
-
text = PDF::Inspector::Text.analyze(@pdf.render)
|
40
|
-
text.font_settings[0][:size].should == 16
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should allow overriding default font for a single instance" do
|
44
|
-
@pdf.font_size = 16
|
45
|
-
|
46
|
-
@pdf.draw_text("Blah", :size => 11, :at => [0, 0])
|
47
|
-
@pdf.draw_text("Blaz", :at => [0, 0])
|
48
|
-
text = PDF::Inspector::Text.analyze(@pdf.render)
|
49
|
-
text.font_settings[0][:size].should == 11
|
50
|
-
text.font_settings[1][:size].should == 16
|
51
|
-
end
|
52
|
-
|
53
|
-
it "should allow setting a font size transaction with a block" do
|
54
|
-
@pdf.font_size 16 do
|
55
|
-
@pdf.draw_text('Blah', :at => [0, 0])
|
56
|
-
end
|
57
|
-
|
58
|
-
@pdf.draw_text('blah', :at => [0, 0])
|
59
|
-
|
60
|
-
text = PDF::Inspector::Text.analyze(@pdf.render)
|
61
|
-
text.font_settings[0][:size].should == 16
|
62
|
-
text.font_settings[1][:size].should == 12
|
63
|
-
end
|
64
|
-
|
65
|
-
it "should allow manual setting the font size " +
|
66
|
-
"when in a font size block" do
|
67
|
-
@pdf.font_size(16) do
|
68
|
-
@pdf.draw_text('Foo', :at => [0, 0])
|
69
|
-
@pdf.draw_text('Blah', :size => 11, :at => [0, 0])
|
70
|
-
@pdf.draw_text('Blaz', :at => [0, 0])
|
71
|
-
end
|
72
|
-
text = PDF::Inspector::Text.analyze(@pdf.render)
|
73
|
-
text.font_settings[0][:size].should == 16
|
74
|
-
text.font_settings[1][:size].should == 11
|
75
|
-
text.font_settings[2][:size].should == 16
|
76
|
-
end
|
77
|
-
|
78
|
-
it "should allow registering of built-in font_settings on the fly" do
|
79
|
-
@pdf.font "Times-Roman"
|
80
|
-
@pdf.draw_text("Blah", :at => [100,100], :at => [0, 0])
|
81
|
-
@pdf.font "Courier"
|
82
|
-
@pdf.draw_text("Blaz", :at => [150,150], :at => [0, 0])
|
83
|
-
text = PDF::Inspector::Text.analyze(@pdf.render)
|
84
|
-
text.font_settings[0][:name].should == :"Times-Roman"
|
85
|
-
text.font_settings[1][:name].should == :Courier
|
86
|
-
end
|
87
|
-
|
88
|
-
it "should raise_error an exception when an unknown font is used" do
|
89
|
-
lambda { @pdf.font "Pao bu" }.should raise_error(Prawn::Errors::UnknownFont)
|
90
|
-
end
|
91
|
-
|
92
|
-
it "should correctly render a utf-8 string when using a built-in font" do
|
93
|
-
str = "©" # copyright symbol
|
94
|
-
@pdf.draw_text(str, :at => [0, 0])
|
95
|
-
|
96
|
-
# grab the text from the rendered PDF and ensure it matches
|
97
|
-
text = PDF::Inspector::Text.analyze(@pdf.render)
|
98
|
-
text.strings.first.should == str
|
99
|
-
end
|
100
|
-
|
101
|
-
if "spec".respond_to?(:encode!)
|
102
|
-
# Handle non utf-8 string encodings in a sane way on M17N aware VMs
|
103
|
-
it "should raise_error an exception when a utf-8 incompatible string is rendered" do
|
104
|
-
str = "Blah \xDD"
|
105
|
-
str.force_encoding("ASCII-8BIT")
|
106
|
-
lambda { @pdf.draw_text(str, :at => [0, 0]) }.should raise_error(
|
107
|
-
Prawn::Errors::IncompatibleStringEncoding)
|
108
|
-
end
|
109
|
-
|
110
|
-
it "should not raise an exception when a shift-jis string is rendered" do
|
111
|
-
datafile = "#{Prawn::DATADIR}/shift_jis_text.txt"
|
112
|
-
sjis_str = File.open(datafile, "r:shift_jis") { |f| f.gets }
|
113
|
-
@pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf")
|
114
|
-
|
115
|
-
@pdf.draw_text(sjis_str, :at => [0, 0])
|
116
|
-
end
|
117
|
-
else
|
118
|
-
# Handle non utf-8 string encodings in a sane way on non-M17N aware VMs
|
119
|
-
it "should raise_error an exception when a corrupt utf-8 string is rendered" do
|
120
|
-
str = "Blah \xDD"
|
121
|
-
lambda { @pdf.draw_text(str, :at => [0, 0]) }.should raise_error(
|
122
|
-
Prawn::Errors::IncompatibleStringEncoding)
|
123
|
-
end
|
124
|
-
it "should raise_error an exception when a shift-jis string is rendered" do
|
125
|
-
sjis_str = File.read("#{Prawn::DATADIR}/shift_jis_text.txt")
|
126
|
-
lambda { @pdf.draw_text(sjis_str, :at => [0, 0]) }.should raise_error(
|
127
|
-
Prawn::Errors::IncompatibleStringEncoding)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|