prawn 0.14.0 → 0.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +2 -1
- data/Rakefile +12 -0
- data/lib/prawn.rb +9 -21
- data/lib/prawn/document.rb +95 -68
- data/lib/prawn/document/bounding_box.rb +22 -4
- data/lib/prawn/document/column_box.rb +2 -0
- data/lib/prawn/document/graphics_state.rb +1 -1
- data/lib/prawn/document/internals.rb +2 -2
- data/lib/prawn/document/snapshot.rb +2 -1
- data/lib/prawn/document/span.rb +2 -0
- data/lib/prawn/encoding.rb +1 -1
- data/lib/prawn/font.rb +89 -75
- data/lib/prawn/font/afm.rb +3 -0
- data/lib/prawn/font/dfont.rb +1 -0
- data/lib/prawn/font/ttf.rb +2 -0
- data/lib/prawn/font_metric_cache.rb +3 -1
- data/lib/prawn/graphics.rb +2 -14
- data/lib/prawn/graphics/cap_style.rb +1 -0
- data/lib/prawn/graphics/color.rb +1 -0
- data/lib/prawn/graphics/dash.rb +3 -2
- data/lib/prawn/graphics/join_style.rb +2 -0
- data/lib/prawn/graphics/patterns.rb +1 -0
- data/lib/prawn/graphics/transformation.rb +1 -0
- data/lib/prawn/graphics/transparency.rb +2 -0
- data/lib/prawn/image_handler.rb +2 -0
- data/lib/prawn/images.rb +5 -0
- data/lib/prawn/images/image.rb +1 -0
- data/lib/prawn/images/jpg.rb +3 -0
- data/lib/prawn/images/png.rb +2 -0
- data/lib/prawn/layout.rb +8 -13
- data/lib/prawn/layout/grid.rb +15 -3
- data/lib/prawn/measurement_extensions.rb +4 -0
- data/lib/prawn/measurements.rb +2 -0
- data/lib/prawn/outline.rb +3 -1
- data/lib/prawn/repeater.rb +3 -1
- data/lib/prawn/security.rb +15 -7
- data/lib/prawn/security/arcfour.rb +52 -0
- data/lib/prawn/soft_mask.rb +3 -1
- data/lib/prawn/stamp.rb +2 -0
- data/lib/prawn/table.rb +2 -0
- data/lib/prawn/table/cell.rb +4 -1
- data/lib/prawn/table/cell/image.rb +1 -2
- data/lib/prawn/table/cell/in_table.rb +2 -0
- data/lib/prawn/table/cell/span_dummy.rb +1 -0
- data/lib/prawn/table/cells.rb +7 -2
- data/lib/prawn/table/column_width_calculator.rb +8 -2
- data/lib/prawn/text.rb +4 -2
- data/lib/prawn/text/box.rb +3 -0
- data/lib/prawn/text/formatted/arranger.rb +2 -0
- data/lib/prawn/text/formatted/box.rb +55 -50
- data/lib/prawn/text/formatted/fragment.rb +2 -0
- data/lib/prawn/text/formatted/line_wrap.rb +1 -0
- data/lib/prawn/text/formatted/parser.rb +2 -0
- data/lib/prawn/text/formatted/wrap.rb +2 -0
- data/lib/prawn/utilities.rb +5 -3
- data/manual/graphics/common_lines.rb +2 -0
- data/manual/text/group.rb +2 -0
- data/manual/text/text.rb +1 -1
- data/prawn.gemspec +4 -3
- data/spec/grid_spec.rb +11 -0
- data/spec/object_store_spec.rb +1 -96
- data/spec/reference_spec.rb +0 -57
- data/spec/spec_helper.rb +7 -0
- data/spec/table_spec.rb +26 -0
- metadata +172 -185
- data/lib/pdf/core.rb +0 -35
- 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 -79
- 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 -89
- 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 -311
- 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 -99
- 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/prawn/templates.rb +0 -75
- data/spec/filters_spec.rb +0 -34
- data/spec/name_tree_spec.rb +0 -112
- data/spec/pdf_object_spec.rb +0 -172
- data/spec/stream_spec.rb +0 -58
- data/spec/template_spec_obsolete.rb +0 -352
data/lib/prawn/templates.rb
DELETED
@@ -1,75 +0,0 @@
|
|
1
|
-
warn "Templates are no longer supported in Prawn!\n" +
|
2
|
-
"This code is for experimental testing only, and\n" +
|
3
|
-
"will extracted into its own gem in a future Prawn release"
|
4
|
-
|
5
|
-
module Prawn
|
6
|
-
module Templates
|
7
|
-
def initialize_first_page(options)
|
8
|
-
return super unless options[:template]
|
9
|
-
|
10
|
-
fresh_content_streams(options)
|
11
|
-
go_to_page(1)
|
12
|
-
end
|
13
|
-
|
14
|
-
## FIXME: This is going to be terribly brittle because
|
15
|
-
# it copy-pastes the start_new_page method. But at least
|
16
|
-
# it should only run when templates are used.
|
17
|
-
|
18
|
-
def start_new_page(options = {})
|
19
|
-
return super unless options[:template]
|
20
|
-
|
21
|
-
if last_page = state.page
|
22
|
-
last_page_size = last_page.size
|
23
|
-
last_page_layout = last_page.layout
|
24
|
-
last_page_margins = last_page.margins
|
25
|
-
end
|
26
|
-
|
27
|
-
page_options = {:size => options[:size] || last_page_size,
|
28
|
-
:layout => options[:layout] || last_page_layout,
|
29
|
-
:margins => last_page_margins}
|
30
|
-
if last_page
|
31
|
-
new_graphic_state = last_page.graphic_state.dup if last_page.graphic_state
|
32
|
-
#erase the color space so that it gets reset on new page for fussy pdf-readers
|
33
|
-
new_graphic_state.color_space = {} if new_graphic_state
|
34
|
-
page_options.merge!(:graphic_state => new_graphic_state)
|
35
|
-
end
|
36
|
-
|
37
|
-
merge_template_options(page_options, options)
|
38
|
-
|
39
|
-
state.page = PDF::Core::Page.new(self, page_options)
|
40
|
-
|
41
|
-
apply_margin_options(options)
|
42
|
-
generate_margin_box
|
43
|
-
|
44
|
-
# Reset the bounding box if the new page has different size or layout
|
45
|
-
if last_page && (last_page.size != state.page.size ||
|
46
|
-
last_page.layout != state.page.layout)
|
47
|
-
@bounding_box = @margin_box
|
48
|
-
end
|
49
|
-
|
50
|
-
state.page.new_content_stream
|
51
|
-
use_graphic_settings(true)
|
52
|
-
forget_text_rendering_mode!
|
53
|
-
|
54
|
-
unless options[:orphan]
|
55
|
-
state.insert_page(state.page, @page_number)
|
56
|
-
@page_number += 1
|
57
|
-
|
58
|
-
canvas { image(@background, :scale => @background_scale, :at => bounds.top_left) } if @background
|
59
|
-
@y = @bounding_box.absolute_top
|
60
|
-
|
61
|
-
float do
|
62
|
-
state.on_page_create_action(self)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def merge_template_options(page_options, options)
|
68
|
-
object_id = state.store.import_page(options[:template], options[:template_page] || 1)
|
69
|
-
page_options.merge!(:object_id => object_id, :page_template => true)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
Prawn::Document::VALID_OPTIONS << :template
|
75
|
-
Prawn::Document.extensions << Prawn::Templates
|
data/spec/filters_spec.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
4
|
-
|
5
|
-
FILTERS = {
|
6
|
-
:FlateDecode => {'test' => "x\x9C+I-.\x01\x00\x04]\x01\xC1".force_encoding(Encoding::ASCII_8BIT) },
|
7
|
-
:DCTDecode => {'test' => "test"}
|
8
|
-
}
|
9
|
-
|
10
|
-
FILTERS.each do |filter_name, examples|
|
11
|
-
filter = PDF::Core::Filters.const_get(filter_name)
|
12
|
-
|
13
|
-
describe "#{filter_name} filter" do
|
14
|
-
it "should encode stream" do
|
15
|
-
examples.each do |in_stream, out_stream|
|
16
|
-
filter.encode(in_stream).should == out_stream
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should decode stream" do
|
21
|
-
examples.each do |in_stream, out_stream|
|
22
|
-
filter.decode(out_stream).should == in_stream
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should be symmetric" do
|
27
|
-
examples.each do |in_stream, out_stream|
|
28
|
-
filter.decode(filter.encode(in_stream)).should == in_stream
|
29
|
-
|
30
|
-
filter.encode(filter.decode(out_stream)).should == out_stream
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
data/spec/name_tree_spec.rb
DELETED
@@ -1,112 +0,0 @@
|
|
1
|
-
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
2
|
-
|
3
|
-
def tree_dump(tree)
|
4
|
-
if tree.is_a?(PDF::Core::NameTree::Node)
|
5
|
-
"[" + tree.children.map { |child| tree_dump(child) }.join(",") + "]"
|
6
|
-
else
|
7
|
-
"#{tree.name}=#{tree.value}"
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def tree_add(tree, *args)
|
12
|
-
args.each do |(name, value)|
|
13
|
-
tree.add(name, value)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def tree_value(name, value)
|
18
|
-
PDF::Core::NameTree::Value.new(name, value)
|
19
|
-
end
|
20
|
-
|
21
|
-
class RefExposingDocument < Prawn::Document
|
22
|
-
def object_store
|
23
|
-
state.store
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
describe "Name Tree" do
|
28
|
-
before(:each) { create_pdf(RefExposingDocument) }
|
29
|
-
|
30
|
-
it "should have no children when first initialized" do
|
31
|
-
node = PDF::Core::NameTree::Node.new(@pdf, 3)
|
32
|
-
node.children.length.should == 0
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should have no subtrees while child limit is not reached" do
|
36
|
-
node = PDF::Core::NameTree::Node.new(@pdf, 3)
|
37
|
-
tree_add(node, ["one", 1], ["two", 2], ["three", 3])
|
38
|
-
tree_dump(node).should == "[one=1,three=3,two=2]"
|
39
|
-
end
|
40
|
-
|
41
|
-
it "should split into subtrees when limit is exceeded" do
|
42
|
-
node = PDF::Core::NameTree::Node.new(@pdf, 3)
|
43
|
-
tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
|
44
|
-
tree_dump(node).should == "[[four=4,one=1],[three=3,two=2]]"
|
45
|
-
end
|
46
|
-
|
47
|
-
it "should create a two new references when root is split" do
|
48
|
-
ref_count = @pdf.object_store.length
|
49
|
-
node = PDF::Core::NameTree::Node.new(@pdf, 3)
|
50
|
-
tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
|
51
|
-
@pdf.object_store.length.should == ref_count+2
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should create a one new reference when subtree is split" do
|
55
|
-
node = PDF::Core::NameTree::Node.new(@pdf, 3)
|
56
|
-
tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
|
57
|
-
|
58
|
-
ref_count = @pdf.object_store.length # save when root is split
|
59
|
-
tree_add(node, ["five", 5], ["six", 6], ["seven", 7])
|
60
|
-
tree_dump(node).should == "[[five=5,four=4,one=1],[seven=7,six=6],[three=3,two=2]]"
|
61
|
-
@pdf.object_store.length.should == ref_count+1
|
62
|
-
end
|
63
|
-
|
64
|
-
it "should keep tree balanced when subtree split cascades to root" do
|
65
|
-
node = PDF::Core::NameTree::Node.new(@pdf, 3)
|
66
|
-
tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
|
67
|
-
tree_add(node, ["five", 5], ["six", 6], ["seven", 7], ["eight", 8])
|
68
|
-
tree_dump(node).should == "[[[eight=8,five=5],[four=4,one=1]],[[seven=7,six=6],[three=3,two=2]]]"
|
69
|
-
end
|
70
|
-
|
71
|
-
it "should maintain order of already properly ordered nodes" do
|
72
|
-
node = PDF::Core::NameTree::Node.new(@pdf, 3)
|
73
|
-
tree_add(node, ["eight", 8], ["five", 5], ["four", 4], ["one", 1])
|
74
|
-
tree_add(node, ['seven', 7], ['six', 6], ['three', 3], ['two', 2])
|
75
|
-
tree_dump(node).should == "[[[eight=8,five=5],[four=4,one=1]],[[seven=7,six=6],[three=3,two=2]]]"
|
76
|
-
end
|
77
|
-
|
78
|
-
it "should emit only :Names key with to_hash if root is only node" do
|
79
|
-
node = PDF::Core::NameTree::Node.new(@pdf, 3)
|
80
|
-
tree_add(node, ["one", 1], ["two", 2], ["three", 3])
|
81
|
-
node.to_hash.should ==(
|
82
|
-
{ :Names => [tree_value("one", 1), tree_value("three", 3), tree_value("two", 2)] }
|
83
|
-
)
|
84
|
-
end
|
85
|
-
|
86
|
-
it "should emit only :Kids key with to_hash if root has children" do
|
87
|
-
node = PDF::Core::NameTree::Node.new(@pdf, 3)
|
88
|
-
tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
|
89
|
-
node.to_hash.should ==({ :Kids => node.children.map { |child| child.ref } })
|
90
|
-
end
|
91
|
-
|
92
|
-
it "should emit :Limits and :Names keys with to_hash for leaf node" do
|
93
|
-
node = PDF::Core::NameTree::Node.new(@pdf, 3)
|
94
|
-
tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
|
95
|
-
node.children.first.to_hash.should ==(
|
96
|
-
{ :Limits => %w(four one),
|
97
|
-
:Names => [tree_value("four", 4), tree_value("one", 1)] }
|
98
|
-
)
|
99
|
-
end
|
100
|
-
|
101
|
-
it "should emit :Limits and :Kids keys with to_hash for inner node" do
|
102
|
-
node = PDF::Core::NameTree::Node.new(@pdf, 3)
|
103
|
-
tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4])
|
104
|
-
tree_add(node, ["five", 5], ["six", 6], ["seven", 7], ["eight", 8])
|
105
|
-
tree_add(node, ["nine", 9], ["ten", 10], ["eleven", 11], ["twelve", 12])
|
106
|
-
tree_add(node, ["thirteen", 13], ["fourteen", 14], ["fifteen", 15], ["sixteen", 16])
|
107
|
-
node.children.first.to_hash.should ==(
|
108
|
-
{ :Limits => %w(eight one),
|
109
|
-
:Kids => node.children.first.children.map { |child| child.ref } }
|
110
|
-
)
|
111
|
-
end
|
112
|
-
end
|
data/spec/pdf_object_spec.rb
DELETED
@@ -1,172 +0,0 @@
|
|
1
|
-
# encoding: ASCII-8BIT
|
2
|
-
|
3
|
-
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
4
|
-
|
5
|
-
# See PDF Reference, Sixth Edition (1.7) pp51-60 for details
|
6
|
-
describe "PDF Object Serialization" do
|
7
|
-
|
8
|
-
it "should convert Ruby's nil to PDF null" do
|
9
|
-
PDF::Core::PdfObject(nil).should == "null"
|
10
|
-
end
|
11
|
-
|
12
|
-
it "should convert Ruby booleans to PDF booleans" do
|
13
|
-
PDF::Core::PdfObject(true).should == "true"
|
14
|
-
PDF::Core::PdfObject(false).should == "false"
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should convert a Ruby number to PDF number" do
|
18
|
-
PDF::Core::PdfObject(1).should == "1"
|
19
|
-
PDF::Core::PdfObject(1.214112421).should == "1.214112421"
|
20
|
-
# scientific notation is not valid in PDF
|
21
|
-
PDF::Core::PdfObject(0.000005).should == "0.000005"
|
22
|
-
end
|
23
|
-
|
24
|
-
it "should convert a Ruby time object to a PDF timestamp" do
|
25
|
-
t = Time.now
|
26
|
-
PDF::Core::PdfObject(t).should == t.strftime("(D:%Y%m%d%H%M%S%z").chop.chop + "'00')"
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should convert a Ruby string to PDF string when inside a content stream" do
|
30
|
-
s = "I can has a string"
|
31
|
-
PDF::Inspector.parse(PDF::Core::PdfObject(s, true)).should == s
|
32
|
-
end
|
33
|
-
|
34
|
-
it "should convert a Ruby string to a UTF-16 PDF string when outside a content stream" do
|
35
|
-
s = "I can has a string"
|
36
|
-
s_utf16 = "\xFE\xFF" + s.unpack("U*").pack("n*")
|
37
|
-
PDF::Inspector.parse(PDF::Core::PdfObject(s, false)).should == s_utf16
|
38
|
-
end
|
39
|
-
|
40
|
-
it "should convert a Ruby string with characters outside the BMP to its " +
|
41
|
-
"UTF-16 representation with a BOM" do
|
42
|
-
# U+10192 ROMAN SEMUNCIA SIGN
|
43
|
-
semuncia = [65938].pack("U")
|
44
|
-
PDF::Core::PdfObject(semuncia, false).upcase.should == "<FEFFD800DD92>"
|
45
|
-
end
|
46
|
-
|
47
|
-
it "should pass through bytes regardless of content stream status for ByteString" do
|
48
|
-
PDF::Core::PdfObject(PDF::Core::ByteString.new("\xDE\xAD\xBE\xEF")).upcase.
|
49
|
-
should == "<DEADBEEF>"
|
50
|
-
end
|
51
|
-
|
52
|
-
it "should escape parens when converting from Ruby string to PDF" do
|
53
|
-
s = 'I )(can has a string'
|
54
|
-
PDF::Inspector.parse(PDF::Core::PdfObject(s, true)).should == s
|
55
|
-
end
|
56
|
-
|
57
|
-
it "should handle ruby escaped parens when converting to PDF string" do
|
58
|
-
s = 'I can \\)( has string'
|
59
|
-
PDF::Inspector.parse(PDF::Core::PdfObject(s, true)).should == s
|
60
|
-
end
|
61
|
-
|
62
|
-
it "should escape various strings correctly when converting a LiteralString" do
|
63
|
-
ls = PDF::Core::LiteralString.new("abc")
|
64
|
-
PDF::Core::PdfObject(ls).should == "(abc)"
|
65
|
-
|
66
|
-
ls = PDF::Core::LiteralString.new("abc\x0Ade") # should escape \n
|
67
|
-
PDF::Core::PdfObject(ls).should == "(abc\x5C\x0Ade)"
|
68
|
-
|
69
|
-
ls = PDF::Core::LiteralString.new("abc\x0Dde") # should escape \r
|
70
|
-
PDF::Core::PdfObject(ls).should == "(abc\x5C\x0Dde)"
|
71
|
-
|
72
|
-
ls = PDF::Core::LiteralString.new("abc\x09de") # should escape \t
|
73
|
-
PDF::Core::PdfObject(ls).should == "(abc\x5C\x09de)"
|
74
|
-
|
75
|
-
ls = PDF::Core::LiteralString.new("abc\x08de") # should escape \b
|
76
|
-
PDF::Core::PdfObject(ls).should == "(abc\x5C\x08de)"
|
77
|
-
|
78
|
-
ls = PDF::Core::LiteralString.new("abc\x0Cde") # should escape \f
|
79
|
-
PDF::Core::PdfObject(ls).should == "(abc\x5C\x0Cde)"
|
80
|
-
|
81
|
-
ls = PDF::Core::LiteralString.new("abc(de") # should escape \(
|
82
|
-
PDF::Core::PdfObject(ls).should == "(abc\x5C(de)"
|
83
|
-
|
84
|
-
ls = PDF::Core::LiteralString.new("abc)de") # should escape \)
|
85
|
-
PDF::Core::PdfObject(ls).should == "(abc\x5C)de)"
|
86
|
-
|
87
|
-
ls = PDF::Core::LiteralString.new("abc\x5Cde") # should escape \\
|
88
|
-
PDF::Core::PdfObject(ls).should == "(abc\x5C\x5Cde)"
|
89
|
-
PDF::Core::PdfObject(ls).size.should == 9
|
90
|
-
end
|
91
|
-
|
92
|
-
it "should escape strings correctly when converting a LiteralString that is not utf-8" do
|
93
|
-
data = "\x43\xaf\xc9\x7f\xef\xf\xe6\xa8\xcb\x5c\xaf\xd0"
|
94
|
-
ls = PDF::Core::LiteralString.new(data)
|
95
|
-
PDF::Core::PdfObject(ls).should == "(\x43\xaf\xc9\x7f\xef\xf\xe6\xa8\xcb\x5c\x5c\xaf\xd0)"
|
96
|
-
end
|
97
|
-
|
98
|
-
it "should convert a Ruby symbol to PDF name" do
|
99
|
-
PDF::Core::PdfObject(:my_symbol).should == "/my_symbol"
|
100
|
-
PDF::Core::PdfObject(:"A;Name_With-Various***Characters?").should ==
|
101
|
-
"/A;Name_With-Various***Characters?"
|
102
|
-
end
|
103
|
-
|
104
|
-
it "should convert a whitespace or delimiter containing Ruby symbol to a PDF name" do
|
105
|
-
PDF::Core::PdfObject(:"my symbol").should == "/my#20symbol"
|
106
|
-
PDF::Core::PdfObject(:"my#symbol").should == "/my#23symbol"
|
107
|
-
PDF::Core::PdfObject(:"my/symbol").should == "/my#2Fsymbol"
|
108
|
-
PDF::Core::PdfObject(:"my(symbol").should == "/my#28symbol"
|
109
|
-
PDF::Core::PdfObject(:"my)symbol").should == "/my#29symbol"
|
110
|
-
PDF::Core::PdfObject(:"my<symbol").should == "/my#3Csymbol"
|
111
|
-
PDF::Core::PdfObject(:"my>symbol").should == "/my#3Esymbol"
|
112
|
-
end
|
113
|
-
|
114
|
-
it "should convert a Ruby array to PDF Array when inside a content stream" do
|
115
|
-
PDF::Core::PdfObject([1,2,3]).should == "[1 2 3]"
|
116
|
-
PDF::Inspector.parse(PDF::Core::PdfObject([[1,2],:foo,"Bar"], true)).should ==
|
117
|
-
[[1,2],:foo, "Bar"]
|
118
|
-
end
|
119
|
-
|
120
|
-
it "should convert a Ruby array to PDF Array when outside a content stream" do
|
121
|
-
bar = "\xFE\xFF" + "Bar".unpack("U*").pack("n*")
|
122
|
-
PDF::Core::PdfObject([1,2,3]).should == "[1 2 3]"
|
123
|
-
PDF::Inspector.parse(PDF::Core::PdfObject([[1,2],:foo,"Bar"], false)).should ==
|
124
|
-
[[1,2],:foo, bar]
|
125
|
-
end
|
126
|
-
|
127
|
-
it "should convert a Ruby hash to a PDF Dictionary when inside a content stream" do
|
128
|
-
dict = PDF::Core::PdfObject( {:foo => :bar,
|
129
|
-
"baz" => [1,2,3],
|
130
|
-
:bang => {:a => "what", :b => [:you, :say] }}, true )
|
131
|
-
|
132
|
-
res = PDF::Inspector.parse(dict)
|
133
|
-
|
134
|
-
res[:foo].should == :bar
|
135
|
-
res[:baz].should == [1,2,3]
|
136
|
-
res[:bang].should == { :a => "what", :b => [:you, :say] }
|
137
|
-
|
138
|
-
end
|
139
|
-
|
140
|
-
it "should convert a Ruby hash to a PDF Dictionary when outside a content stream" do
|
141
|
-
what = "\xFE\xFF" + "what".unpack("U*").pack("n*")
|
142
|
-
dict = PDF::Core::PdfObject( {:foo => :bar,
|
143
|
-
"baz" => [1,2,3],
|
144
|
-
:bang => {:a => "what", :b => [:you, :say] }}, false )
|
145
|
-
|
146
|
-
res = PDF::Inspector.parse(dict)
|
147
|
-
|
148
|
-
res[:foo].should == :bar
|
149
|
-
res[:baz].should == [1,2,3]
|
150
|
-
res[:bang].should == { :a => what, :b => [:you, :say] }
|
151
|
-
|
152
|
-
end
|
153
|
-
|
154
|
-
it "should not allow keys other than strings or symbols for PDF dicts" do
|
155
|
-
lambda { PDF::Core::PdfObject(:foo => :bar, :baz => :bang, 1 => 4) }.
|
156
|
-
should raise_error(PDF::Core::Errors::FailedObjectConversion)
|
157
|
-
end
|
158
|
-
|
159
|
-
it "should convert a Prawn::Reference to a PDF indirect object reference" do
|
160
|
-
ref = PDF::Core::Reference(1,true)
|
161
|
-
PDF::Core::PdfObject(ref).should == ref.to_s
|
162
|
-
end
|
163
|
-
|
164
|
-
it "should convert a NameTree::Node to a PDF hash" do
|
165
|
-
node = PDF::Core::NameTree::Node.new(Prawn::Document.new, 10)
|
166
|
-
node.add "hello", 1.0
|
167
|
-
node.add "world", 2.0
|
168
|
-
data = PDF::Core::PdfObject(node)
|
169
|
-
res = PDF::Inspector.parse(data)
|
170
|
-
res.should == {:Names => ["hello", 1.0, "world", 2.0]}
|
171
|
-
end
|
172
|
-
end
|
data/spec/stream_spec.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
4
|
-
|
5
|
-
describe "Stream object" do
|
6
|
-
it "should compress a stream upon request" do
|
7
|
-
stream = PDF::Core::Stream.new
|
8
|
-
stream << "Hi There " * 20
|
9
|
-
|
10
|
-
cstream = PDF::Core::Stream.new
|
11
|
-
cstream << "Hi There " * 20
|
12
|
-
cstream.compress!
|
13
|
-
|
14
|
-
cstream.filtered_stream.length.should be < stream.length,
|
15
|
-
"compressed stream expected to be smaller than source but wasn't"
|
16
|
-
cstream.data[:Filter].should == [:FlateDecode]
|
17
|
-
end
|
18
|
-
|
19
|
-
it "should expose sompression state" do
|
20
|
-
stream = PDF::Core::Stream.new
|
21
|
-
stream << "Hello"
|
22
|
-
stream.compress!
|
23
|
-
|
24
|
-
stream.should be_compressed
|
25
|
-
end
|
26
|
-
|
27
|
-
it "should detect from filters if stream is compressed" do
|
28
|
-
stream = PDF::Core::Stream.new
|
29
|
-
stream << "Hello"
|
30
|
-
stream.filters << :FlateDecode
|
31
|
-
|
32
|
-
stream.should be_compressed
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should have Length if in data" do
|
36
|
-
stream = PDF::Core::Stream.new
|
37
|
-
stream << "hello"
|
38
|
-
|
39
|
-
stream.data[:Length].should == 5
|
40
|
-
end
|
41
|
-
|
42
|
-
it "should update Length when updated" do
|
43
|
-
stream = PDF::Core::Stream.new
|
44
|
-
stream << "hello"
|
45
|
-
stream.data[:Length].should == 5
|
46
|
-
|
47
|
-
stream << " world"
|
48
|
-
stream.data[:Length].should == 11
|
49
|
-
end
|
50
|
-
|
51
|
-
it "should corecly handle decode params" do
|
52
|
-
stream = PDF::Core::Stream.new
|
53
|
-
stream << "Hello"
|
54
|
-
stream.filters << { :FlateDecode => { :Predictor => 15 } }
|
55
|
-
|
56
|
-
stream.data[:DecodeParms].should == [{ :Predictor => 15 }]
|
57
|
-
end
|
58
|
-
end
|