ruport-util 0.5.0 → 0.6.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.
- data/Rakefile +1 -1
- data/example/foo.svg +83 -0
- data/example/form.pdf +160 -0
- data/example/form.rb +46 -0
- data/example/graph_report.rb +0 -1
- data/example/invoice_report.rb +1 -2
- data/example/mailer.rb +1 -1
- data/example/managed_report.rb +1 -2
- data/example/out.pdf +229 -0
- data/lib/ruport/util/graph.rb +29 -36
- data/lib/ruport/util/pdf/form.rb +121 -0
- data/lib/ruport/util.rb +2 -1
- metadata +8 -2
data/Rakefile
CHANGED
|
@@ -18,7 +18,7 @@ end
|
|
|
18
18
|
|
|
19
19
|
spec = Gem::Specification.new do |spec|
|
|
20
20
|
spec.name = "ruport-util"
|
|
21
|
-
spec.version = "0.
|
|
21
|
+
spec.version = "0.6.0"
|
|
22
22
|
spec.platform = Gem::Platform::RUBY
|
|
23
23
|
spec.summary = "A set of tools and helper libs for Ruby Reports"
|
|
24
24
|
spec.files = Dir.glob("{example,lib,test,bin}/**/**/*") +
|
data/example/foo.svg
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<?DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" type=""?>
|
|
3
|
+
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="300" width="500">
|
|
4
|
+
<g id="scruffy_graph">
|
|
5
|
+
<g transform="translate(0.0, 0.0)" id="background">
|
|
6
|
+
<defs>
|
|
7
|
+
<linearGradient y2="100%" x1="0%" x2="0%" id="BackgroundGradient" y1="0%">
|
|
8
|
+
<stop stop-color="black" offset="5%"/>
|
|
9
|
+
<stop stop-color="#4A465A" offset="95%"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
</defs>
|
|
12
|
+
<rect x="0" y="0" height="300.0" width="500.0" fill="url(#BackgroundGradient)"/>
|
|
13
|
+
</g>
|
|
14
|
+
<g transform="translate(25.0, 6.0)" id="title">
|
|
15
|
+
<text x="225.0" font-size="21.0" text-anchor="middle" y="21.0" class="title" stroke-width="0" fill="white" stroke="none"></text>
|
|
16
|
+
</g>
|
|
17
|
+
<g transform="translate(10.0, 78.0)" id="view">
|
|
18
|
+
<g>
|
|
19
|
+
<g transform="translate(0.0, 3.96)" id="values">
|
|
20
|
+
<text x="80.1" font-size="14.0976" text-anchor="end" y="176.22" fill="white">0</text>
|
|
21
|
+
<text x="80.1" font-size="14.0976" text-anchor="end" y="132.165" fill="white">18</text>
|
|
22
|
+
<text x="80.1" font-size="14.0976" text-anchor="end" y="88.11" fill="white">35</text>
|
|
23
|
+
<text x="80.1" font-size="14.0976" text-anchor="end" y="44.055" fill="white">52</text>
|
|
24
|
+
<text x="80.1" font-size="14.0976" text-anchor="end" y="0.0" fill="white">70</text>
|
|
25
|
+
</g>
|
|
26
|
+
<g transform="translate(89.0, 0.0)" id="grid">
|
|
27
|
+
<line y2="0.0" x1="0" x2="356.0" style="stroke: white; stroke-width: 2;" y1="0.0"/>
|
|
28
|
+
<line y2="44.055" x1="0" x2="356.0" style="stroke: white; stroke-width: 2;" y1="44.055"/>
|
|
29
|
+
<line y2="88.11" x1="0" x2="356.0" style="stroke: white; stroke-width: 2;" y1="88.11"/>
|
|
30
|
+
<line y2="132.165" x1="0" x2="356.0" style="stroke: white; stroke-width: 2;" y1="132.165"/>
|
|
31
|
+
<line y2="176.22" x1="0" x2="356.0" style="stroke: white; stroke-width: 2;" y1="176.22"/>
|
|
32
|
+
</g>
|
|
33
|
+
<g transform="translate(89.0, 182.16)" id="labels">
|
|
34
|
+
<text x="0.0" font-size="14.256" text-anchor="middle" y="15.84" fill="white">a</text>
|
|
35
|
+
<text x="89.0" font-size="14.256" text-anchor="middle" y="15.84" fill="white">b</text>
|
|
36
|
+
<text x="178.0" font-size="14.256" text-anchor="middle" y="15.84" fill="white">c</text>
|
|
37
|
+
<text x="267.0" font-size="14.256" text-anchor="middle" y="15.84" fill="white">d</text>
|
|
38
|
+
<text x="356.0" font-size="14.256" text-anchor="middle" y="15.84" fill="white">e</text>
|
|
39
|
+
</g>
|
|
40
|
+
<g transform="translate(89.0, 0.0)" id="graphs">
|
|
41
|
+
<g class="graph_layer" id="component_graphs_graph_0">
|
|
42
|
+
<g class="shadow" transform="translate(0.8811, 0.8811)">
|
|
43
|
+
<polyline points="0.0,173.702571428571 89.0,171.185142857143 178.0,168.667714285714 267.0,166.150285714286 356.0,163.632857142857" stroke-width="3.5244" style="fill-opacity: 0; stroke-opacity: 0.35" fill="transparent" stroke="black"/>
|
|
44
|
+
<circle cx="0.0" cy="175.288551428571" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
|
45
|
+
<circle cx="89.0" cy="172.771122857143" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
|
46
|
+
<circle cx="178.0" cy="170.253694285714" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
|
47
|
+
<circle cx="267.0" cy="167.736265714286" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
|
48
|
+
<circle cx="356.0" cy="165.218837142857" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
|
49
|
+
</g>
|
|
50
|
+
<polyline points="0.0,173.702571428571 89.0,171.185142857143 178.0,168.667714285714 267.0,166.150285714286 356.0,163.632857142857" stroke-width="3.5244" fill="none" stroke="#6886B4"/>
|
|
51
|
+
<circle cx="0.0" cy="173.702571428571" style="stroke-width: 3.5244; stroke: #6886B4; fill: #6886B4" r="3.5244"/>
|
|
52
|
+
<circle cx="89.0" cy="171.185142857143" style="stroke-width: 3.5244; stroke: #6886B4; fill: #6886B4" r="3.5244"/>
|
|
53
|
+
<circle cx="178.0" cy="168.667714285714" style="stroke-width: 3.5244; stroke: #6886B4; fill: #6886B4" r="3.5244"/>
|
|
54
|
+
<circle cx="267.0" cy="166.150285714286" style="stroke-width: 3.5244; stroke: #6886B4; fill: #6886B4" r="3.5244"/>
|
|
55
|
+
<circle cx="356.0" cy="163.632857142857" style="stroke-width: 3.5244; stroke: #6886B4; fill: #6886B4" r="3.5244"/>
|
|
56
|
+
</g>
|
|
57
|
+
<g class="graph_layer" id="component_graphs_graph_1">
|
|
58
|
+
<g class="shadow" transform="translate(0.8811, 0.8811)">
|
|
59
|
+
<polyline points="0.0,148.528285714286 89.0,120.836571428571 178.0,0.0 267.0,171.185142857143 356.0,128.388857142857" stroke-width="3.5244" style="fill-opacity: 0; stroke-opacity: 0.35" fill="transparent" stroke="black"/>
|
|
60
|
+
<circle cx="0.0" cy="150.114265714286" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
|
61
|
+
<circle cx="89.0" cy="122.422551428571" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
|
62
|
+
<circle cx="178.0" cy="1.58598" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
|
63
|
+
<circle cx="267.0" cy="172.771122857143" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
|
64
|
+
<circle cx="356.0" cy="129.974837142857" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
|
65
|
+
</g>
|
|
66
|
+
<polyline points="0.0,148.528285714286 89.0,120.836571428571 178.0,0.0 267.0,171.185142857143 356.0,128.388857142857" stroke-width="3.5244" fill="none" stroke="#FDD84E"/>
|
|
67
|
+
<circle cx="0.0" cy="148.528285714286" style="stroke-width: 3.5244; stroke: #FDD84E; fill: #FDD84E" r="3.5244"/>
|
|
68
|
+
<circle cx="89.0" cy="120.836571428571" style="stroke-width: 3.5244; stroke: #FDD84E; fill: #FDD84E" r="3.5244"/>
|
|
69
|
+
<circle cx="178.0" cy="0.0" style="stroke-width: 3.5244; stroke: #FDD84E; fill: #FDD84E" r="3.5244"/>
|
|
70
|
+
<circle cx="267.0" cy="171.185142857143" style="stroke-width: 3.5244; stroke: #FDD84E; fill: #FDD84E" r="3.5244"/>
|
|
71
|
+
<circle cx="356.0" cy="128.388857142857" style="stroke-width: 3.5244; stroke: #FDD84E; fill: #FDD84E" r="3.5244"/>
|
|
72
|
+
</g>
|
|
73
|
+
</g>
|
|
74
|
+
</g>
|
|
75
|
+
</g>
|
|
76
|
+
<g transform="translate(25.0, 39.0)" id="legend">
|
|
77
|
+
<rect x="180.0" y="4.5" height="9.0" width="10.8" fill="#6886B4"/>
|
|
78
|
+
<text x="198.0" font-size="14.4" y="14.4" fill="white">foo</text>
|
|
79
|
+
<rect x="234.0" y="4.5" height="9.0" width="10.8" fill="#FDD84E"/>
|
|
80
|
+
<text x="252.0" font-size="14.4" y="14.4" fill="white">bar</text>
|
|
81
|
+
</g>
|
|
82
|
+
</g>
|
|
83
|
+
</svg>
|
data/example/form.pdf
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
%PDF-1.3
|
|
2
|
+
%����
|
|
3
|
+
|
|
4
|
+
1 0 obj
|
|
5
|
+
<< /Type /Catalog
|
|
6
|
+
/Outlines 2 0 R
|
|
7
|
+
/Pages 3 0 R>>
|
|
8
|
+
endobj
|
|
9
|
+
2 0 obj
|
|
10
|
+
<< /Type /Outlines >>
|
|
11
|
+
endobj
|
|
12
|
+
3 0 obj
|
|
13
|
+
<< /Type /Pages
|
|
14
|
+
/Kids [6 0 R
|
|
15
|
+
]
|
|
16
|
+
/Count 1
|
|
17
|
+
/Resources <<
|
|
18
|
+
/ProcSet 4 0 R
|
|
19
|
+
/Font <<
|
|
20
|
+
/F1 8 0 R
|
|
21
|
+
/F2 10 0 R >>
|
|
22
|
+
>>
|
|
23
|
+
/MediaBox [0 0 612.0 792.0]
|
|
24
|
+
>>
|
|
25
|
+
endobj
|
|
26
|
+
4 0 obj
|
|
27
|
+
[/PDF /Text ]
|
|
28
|
+
endobj
|
|
29
|
+
5 0 obj
|
|
30
|
+
<<
|
|
31
|
+
/CreationDate (D:200705301332)
|
|
32
|
+
/Creator (form.rb)
|
|
33
|
+
/Producer (PDF::Writer for Ruby)
|
|
34
|
+
>>
|
|
35
|
+
endobj
|
|
36
|
+
6 0 obj
|
|
37
|
+
<< /Type /Page
|
|
38
|
+
/Parent 3 0 R
|
|
39
|
+
/Contents 7 0 R
|
|
40
|
+
>>
|
|
41
|
+
endobj
|
|
42
|
+
7 0 obj
|
|
43
|
+
<<
|
|
44
|
+
/Length 1381 >>
|
|
45
|
+
stream
|
|
46
|
+
|
|
47
|
+
0.000 0.000 0.000 rg
|
|
48
|
+
0.000 0.000 0.000 RG
|
|
49
|
+
BT 257.992 737.504 Td /F1 16.0 Tf 0 Tr (Sample Form) Tj ET
|
|
50
|
+
BT 135.000 636.440 Td /F2 10.0 Tf 0 Tr (Name:) Tj /F1 10.0 Tf 0 Tr ( Gregory Brown) Tj ET
|
|
51
|
+
1 w
|
|
52
|
+
125.000 650.000 m
|
|
53
|
+
325.000 650.000 l S
|
|
54
|
+
1 w
|
|
55
|
+
125.000 628.440 m
|
|
56
|
+
325.000 628.440 l S
|
|
57
|
+
1 w
|
|
58
|
+
125.000 650.000 m
|
|
59
|
+
125.000 628.440 l S
|
|
60
|
+
BT 335.000 636.440 Td /F2 10.0 Tf 0 Tr (User ID:) Tj /F1 10.0 Tf 0 Tr ( sandal) Tj ET
|
|
61
|
+
1 w
|
|
62
|
+
325.000 650.000 m
|
|
63
|
+
475.000 650.000 l S
|
|
64
|
+
1 w
|
|
65
|
+
475.000 650.000 m
|
|
66
|
+
475.000 628.440 l S
|
|
67
|
+
1 w
|
|
68
|
+
325.000 628.440 m
|
|
69
|
+
475.000 628.440 l S
|
|
70
|
+
1 w
|
|
71
|
+
325.000 650.000 m
|
|
72
|
+
325.000 628.440 l S
|
|
73
|
+
BT 135.000 616.440 Td /F2 10.0 Tf 0 Tr (Email:) Tj /F1 10.0 Tf 0 Tr ( gregory.t.brown@gmail.com) Tj ET
|
|
74
|
+
1 w
|
|
75
|
+
475.000 630.000 m
|
|
76
|
+
475.000 608.440 l S
|
|
77
|
+
1 w
|
|
78
|
+
125.000 608.440 m
|
|
79
|
+
475.000 608.440 l S
|
|
80
|
+
1 w
|
|
81
|
+
125.000 630.000 m
|
|
82
|
+
125.000 608.440 l S
|
|
83
|
+
BT 280.000 588.440 Td /F1 10.0 Tf 0 Tr (Favorite Fruit: ) Tj ET
|
|
84
|
+
1 w
|
|
85
|
+
350.000 597.000 m
|
|
86
|
+
362.000 597.000 l S
|
|
87
|
+
1 w
|
|
88
|
+
362.000 597.000 m
|
|
89
|
+
362.000 585.000 l S
|
|
90
|
+
1 w
|
|
91
|
+
350.000 585.000 m
|
|
92
|
+
362.000 585.000 l S
|
|
93
|
+
1 w
|
|
94
|
+
350.000 597.000 m
|
|
95
|
+
350.000 585.000 l S
|
|
96
|
+
BT 370.000 588.440 Td /F1 10.0 Tf 0 Tr (Apple) Tj ET
|
|
97
|
+
1 w
|
|
98
|
+
410.000 597.000 m
|
|
99
|
+
422.000 597.000 l S
|
|
100
|
+
1 w
|
|
101
|
+
422.000 597.000 m
|
|
102
|
+
422.000 585.000 l S
|
|
103
|
+
1 w
|
|
104
|
+
410.000 585.000 m
|
|
105
|
+
422.000 585.000 l S
|
|
106
|
+
1 w
|
|
107
|
+
410.000 597.000 m
|
|
108
|
+
410.000 585.000 l S
|
|
109
|
+
410.000 597.000 m
|
|
110
|
+
422.000 585.000 l
|
|
111
|
+
422.000 597.000 m
|
|
112
|
+
410.000 585.000 l S
|
|
113
|
+
BT 430.000 588.440 Td /F1 10.0 Tf 0 Tr (Banana) Tj ET
|
|
114
|
+
endstream
|
|
115
|
+
endobj
|
|
116
|
+
|
|
117
|
+
8 0 obj
|
|
118
|
+
<< /Type /Font
|
|
119
|
+
/Subtype /Type1
|
|
120
|
+
/Name /F1
|
|
121
|
+
/BaseFont /Helvetica
|
|
122
|
+
/Encoding /WinAnsiEncoding
|
|
123
|
+
>>
|
|
124
|
+
endobj
|
|
125
|
+
9 0 obj
|
|
126
|
+
<< /Type /Encoding
|
|
127
|
+
/BaseEncoding /WinAnsiEncoding
|
|
128
|
+
|
|
129
|
+
>>
|
|
130
|
+
endobj
|
|
131
|
+
10 0 obj
|
|
132
|
+
<< /Type /Font
|
|
133
|
+
/Subtype /Type1
|
|
134
|
+
/Name /F2
|
|
135
|
+
/BaseFont /Helvetica-Bold
|
|
136
|
+
/Encoding 9 0 R
|
|
137
|
+
>>
|
|
138
|
+
endobj
|
|
139
|
+
xref
|
|
140
|
+
0 11
|
|
141
|
+
0000000000 65535 f
|
|
142
|
+
0000000015 00000 n
|
|
143
|
+
0000000079 00000 n
|
|
144
|
+
0000000116 00000 n
|
|
145
|
+
0000000269 00000 n
|
|
146
|
+
0000000298 00000 n
|
|
147
|
+
0000000402 00000 n
|
|
148
|
+
0000000465 00000 n
|
|
149
|
+
0000001899 00000 n
|
|
150
|
+
0000002006 00000 n
|
|
151
|
+
0000002075 00000 n
|
|
152
|
+
|
|
153
|
+
trailer
|
|
154
|
+
<< /Size 11
|
|
155
|
+
/Root 1 0 R
|
|
156
|
+
/Info 5 0 R
|
|
157
|
+
>>
|
|
158
|
+
startxref
|
|
159
|
+
2177
|
|
160
|
+
%%EOF
|
data/example/form.rb
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require "ruport"
|
|
2
|
+
require "ruport/util"
|
|
3
|
+
|
|
4
|
+
class SimpleForm < Ruport::Renderer
|
|
5
|
+
|
|
6
|
+
stage :form_header, :form_body
|
|
7
|
+
finalize :form
|
|
8
|
+
|
|
9
|
+
required_option :name, :userid, :fruit, :email
|
|
10
|
+
|
|
11
|
+
class PDF < Ruport::Formatter::PDF
|
|
12
|
+
renders :pdf, :for => SimpleForm
|
|
13
|
+
include Ruport::Util::FormHelpers
|
|
14
|
+
|
|
15
|
+
def build_form_header
|
|
16
|
+
add_text "Sample Form", :font_size => 16, :justification => :center
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def build_form_body
|
|
20
|
+
options.text_format = { :font_size => 10 }
|
|
21
|
+
form_field "Name:", options.name, :y => 650, :x => 125, :width => 200,
|
|
22
|
+
:border => [1,0,1,1]
|
|
23
|
+
form_field "User ID:", options.userid, :y => 650, :width => 150, :x => 325
|
|
24
|
+
form_field "Email:", options.email, :y => 630, :width => 350, :x => 125,
|
|
25
|
+
:border => [0,1,1]
|
|
26
|
+
|
|
27
|
+
draw_text "Favorite Fruit: ", :left => 280, :y => 600
|
|
28
|
+
option_box :apple, options.fruit, :label => "Apple", :y => 600, :x => 340
|
|
29
|
+
option_box :banana, options.fruit, :label => "Banana", :y => 600, :x => 400
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def finalize_form
|
|
34
|
+
render_pdf
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
puts SimpleForm.render_pdf { |r|
|
|
42
|
+
r.name = "Gregory Brown"
|
|
43
|
+
r.userid = "sandal"
|
|
44
|
+
r.fruit = :banana
|
|
45
|
+
r.email = "gregory.t.brown@gmail.com"
|
|
46
|
+
}
|
data/example/graph_report.rb
CHANGED
data/example/invoice_report.rb
CHANGED
data/example/mailer.rb
CHANGED
data/example/managed_report.rb
CHANGED
data/example/out.pdf
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
%PDF-1.3
|
|
2
|
+
%����
|
|
3
|
+
|
|
4
|
+
1 0 obj
|
|
5
|
+
<< /Type /Catalog
|
|
6
|
+
/Outlines 2 0 R
|
|
7
|
+
/Pages 3 0 R>>
|
|
8
|
+
endobj
|
|
9
|
+
2 0 obj
|
|
10
|
+
<< /Type /Outlines >>
|
|
11
|
+
endobj
|
|
12
|
+
3 0 obj
|
|
13
|
+
<< /Type /Pages
|
|
14
|
+
/Kids [6 0 R
|
|
15
|
+
]
|
|
16
|
+
/Count 1
|
|
17
|
+
/Resources <<
|
|
18
|
+
/ProcSet 4 0 R
|
|
19
|
+
/Font <<
|
|
20
|
+
/F1 8 0 R
|
|
21
|
+
/F2 10 0 R >>
|
|
22
|
+
>>
|
|
23
|
+
/MediaBox [0 0 612.0 792.0]
|
|
24
|
+
>>
|
|
25
|
+
endobj
|
|
26
|
+
4 0 obj
|
|
27
|
+
[/PDF /Text ]
|
|
28
|
+
endobj
|
|
29
|
+
5 0 obj
|
|
30
|
+
<<
|
|
31
|
+
/CreationDate (D:200705301339)
|
|
32
|
+
/Creator (invoice_report.rb)
|
|
33
|
+
/Producer (PDF::Writer for Ruby)
|
|
34
|
+
>>
|
|
35
|
+
endobj
|
|
36
|
+
6 0 obj
|
|
37
|
+
<< /Type /Page
|
|
38
|
+
/Parent 3 0 R
|
|
39
|
+
/Contents [
|
|
40
|
+
7 0 R
|
|
41
|
+
11 0 R
|
|
42
|
+
12 0 R
|
|
43
|
+
]
|
|
44
|
+
>>
|
|
45
|
+
endobj
|
|
46
|
+
7 0 obj
|
|
47
|
+
<<
|
|
48
|
+
/Length 2223 >>
|
|
49
|
+
stream
|
|
50
|
+
|
|
51
|
+
0.000 0.000 0.000 rg
|
|
52
|
+
0.000 0.000 0.000 RG
|
|
53
|
+
q
|
|
54
|
+
1.000 1.000 1.000 rg
|
|
55
|
+
49.000 756.000 m
|
|
56
|
+
243.000 756.000 l
|
|
57
|
+
244.500 756.000 246.000 754.500 246.000 753.000 c
|
|
58
|
+
246.000 709.000 l
|
|
59
|
+
246.000 707.500 244.500 706.000 243.000 706.000 c
|
|
60
|
+
49.000 706.000 l
|
|
61
|
+
47.500 706.000 46.000 707.500 46.000 709.000 c
|
|
62
|
+
46.000 753.000 l
|
|
63
|
+
46.000 754.500 47.500 756.000 49.000 756.000 c
|
|
64
|
+
246.000 706.000 m B
|
|
65
|
+
1 w
|
|
66
|
+
Q
|
|
67
|
+
BT 87.640 744.440 Td /F1 10.0 Tf 0 Tr (Stone Code Productions
|
|
68
|
+
) Tj ET
|
|
69
|
+
BT 108.480 732.880 Td /F1 10.0 Tf 0 Tr (43 Neagle Street) Tj ET
|
|
70
|
+
q
|
|
71
|
+
1.000 1.000 1.000 rg
|
|
72
|
+
49.000 701.000 m
|
|
73
|
+
243.000 701.000 l
|
|
74
|
+
244.500 701.000 246.000 699.500 246.000 698.000 c
|
|
75
|
+
246.000 654.000 l
|
|
76
|
+
246.000 652.500 244.500 651.000 243.000 651.000 c
|
|
77
|
+
49.000 651.000 l
|
|
78
|
+
47.500 651.000 46.000 652.500 46.000 654.000 c
|
|
79
|
+
46.000 698.000 l
|
|
80
|
+
46.000 699.500 47.500 701.000 49.000 701.000 c
|
|
81
|
+
246.000 651.000 m B
|
|
82
|
+
1 w
|
|
83
|
+
Q
|
|
84
|
+
BT 108.215 689.440 Td /F1 10.0 Tf 0 Tr (Gregory Brown
|
|
85
|
+
) Tj ET
|
|
86
|
+
BT 112.095 677.880 Td /F1 10.0 Tf 0 Tr (200 Foo Ave.
|
|
87
|
+
) Tj ET
|
|
88
|
+
q
|
|
89
|
+
0.800 0.800 0.800 rg
|
|
90
|
+
381.000 756.000 m
|
|
91
|
+
571.000 756.000 l
|
|
92
|
+
573.500 756.000 576.000 753.500 576.000 751.000 c
|
|
93
|
+
576.000 741.000 l
|
|
94
|
+
576.000 738.500 573.500 736.000 571.000 736.000 c
|
|
95
|
+
381.000 736.000 l
|
|
96
|
+
378.500 736.000 376.000 738.500 376.000 741.000 c
|
|
97
|
+
376.000 751.000 l
|
|
98
|
+
376.000 753.500 378.500 756.000 381.000 756.000 c
|
|
99
|
+
576.000 736.000 m B
|
|
100
|
+
1 w
|
|
101
|
+
Q
|
|
102
|
+
BT 386.724 743.284 Td /F2 11.0 Tf 0 Tr (Invoice for 12.15.2006 - 12.31.2006) Tj ET
|
|
103
|
+
q
|
|
104
|
+
1.000 1.000 1.000 rg
|
|
105
|
+
381.000 731.000 m
|
|
106
|
+
571.000 731.000 l
|
|
107
|
+
573.500 731.000 576.000 728.500 576.000 726.000 c
|
|
108
|
+
576.000 656.000 l
|
|
109
|
+
576.000 653.500 573.500 651.000 571.000 651.000 c
|
|
110
|
+
381.000 651.000 l
|
|
111
|
+
378.500 651.000 376.000 653.500 376.000 656.000 c
|
|
112
|
+
376.000 726.000 l
|
|
113
|
+
376.000 728.500 378.500 731.000 381.000 731.000 c
|
|
114
|
+
576.000 651.000 m B
|
|
115
|
+
376.000 711.000 m
|
|
116
|
+
576.000 711.000 l S
|
|
117
|
+
0.000 0.000 0.000 rg
|
|
118
|
+
BT 431.830 716.440 Td /F2 10.0 Tf 0 Tr (Billing Information) Tj ET
|
|
119
|
+
1 w
|
|
120
|
+
Q
|
|
121
|
+
BT 447.665 699.440 Td /F2 10.0 Tf 0 Tr (Some info
|
|
122
|
+
) Tj ET
|
|
123
|
+
BT 435.995 687.880 Td /F2 10.0 Tf 0 Tr (about your order) Tj ET
|
|
124
|
+
0.800 0.800 0.800 RG
|
|
125
|
+
BT 66.000 584.128 Td /F1 12.0 Tf 0 Tr (Item Number) Tj ET
|
|
126
|
+
BT 232.274 584.128 Td /F1 12.0 Tf 0 Tr (Description) Tj ET
|
|
127
|
+
BT 407.650 584.128 Td /F1 12.0 Tf 0 Tr (Price) Tj ET
|
|
128
|
+
q
|
|
129
|
+
0.800 0.800 0.800 rg
|
|
130
|
+
61.000 562.068 480.000 15.560 re f
|
|
131
|
+
1 w
|
|
132
|
+
Q
|
|
133
|
+
endstream
|
|
134
|
+
endobj
|
|
135
|
+
|
|
136
|
+
8 0 obj
|
|
137
|
+
<< /Type /Font
|
|
138
|
+
/Subtype /Type1
|
|
139
|
+
/Name /F1
|
|
140
|
+
/BaseFont /Helvetica
|
|
141
|
+
/Encoding /WinAnsiEncoding
|
|
142
|
+
>>
|
|
143
|
+
endobj
|
|
144
|
+
9 0 obj
|
|
145
|
+
<< /Type /Encoding
|
|
146
|
+
/BaseEncoding /WinAnsiEncoding
|
|
147
|
+
|
|
148
|
+
>>
|
|
149
|
+
endobj
|
|
150
|
+
10 0 obj
|
|
151
|
+
<< /Type /Font
|
|
152
|
+
/Subtype /Type1
|
|
153
|
+
/Name /F2
|
|
154
|
+
/BaseFont /Helvetica-Bold
|
|
155
|
+
/Encoding 9 0 R
|
|
156
|
+
>>
|
|
157
|
+
endobj
|
|
158
|
+
11 0 obj
|
|
159
|
+
<<
|
|
160
|
+
/Length 631 >>
|
|
161
|
+
stream
|
|
162
|
+
|
|
163
|
+
BT 66.000 566.318 Td /F1 10.0 Tf 0 Tr (101) Tj ET
|
|
164
|
+
BT 232.274 566.318 Td /F1 10.0 Tf 0 Tr (Erlang The Movie) Tj ET
|
|
165
|
+
BT 407.650 566.318 Td /F1 10.0 Tf 0 Tr ($1000.00) Tj ET
|
|
166
|
+
BT 66.000 550.758 Td /F1 10.0 Tf 0 Tr (102) Tj ET
|
|
167
|
+
BT 232.274 550.758 Td /F1 10.0 Tf 0 Tr (Erlang The Book) Tj ET
|
|
168
|
+
BT 407.650 550.758 Td /F1 10.0 Tf 0 Tr ($45.95) Tj ET
|
|
169
|
+
0.000 0.000 0.000 RG
|
|
170
|
+
1 w
|
|
171
|
+
61.000 600.000 m
|
|
172
|
+
61.000 546.508 l S
|
|
173
|
+
1 w
|
|
174
|
+
227.274 600.000 m
|
|
175
|
+
227.274 546.508 l S
|
|
176
|
+
402.650 600.000 m
|
|
177
|
+
402.650 546.508 l S
|
|
178
|
+
1 w
|
|
179
|
+
541.000 600.000 m
|
|
180
|
+
541.000 546.508 l S
|
|
181
|
+
60.500 600.000 m
|
|
182
|
+
541.500 600.000 l S
|
|
183
|
+
61.000 579.878 m
|
|
184
|
+
541.000 579.878 l S
|
|
185
|
+
60.500 546.508 m
|
|
186
|
+
541.500 546.508 l S
|
|
187
|
+
endstream
|
|
188
|
+
endobj
|
|
189
|
+
|
|
190
|
+
12 0 obj
|
|
191
|
+
<<
|
|
192
|
+
/Length 154 >>
|
|
193
|
+
stream
|
|
194
|
+
|
|
195
|
+
q
|
|
196
|
+
0.000 0.000 0.000 RG
|
|
197
|
+
1 w 0 J 0 j [ ] 0 d
|
|
198
|
+
56.000 60.000 m
|
|
199
|
+
551.000 60.000 l S
|
|
200
|
+
BT 256.265 38.440 Td /F1 10.0 Tf 0 Tr (Hello Mike! Hello Joe!) Tj ET
|
|
201
|
+
1 w
|
|
202
|
+
Q
|
|
203
|
+
endstream
|
|
204
|
+
endobj
|
|
205
|
+
|
|
206
|
+
xref
|
|
207
|
+
0 13
|
|
208
|
+
0000000000 65535 f
|
|
209
|
+
0000000015 00000 n
|
|
210
|
+
0000000079 00000 n
|
|
211
|
+
0000000116 00000 n
|
|
212
|
+
0000000269 00000 n
|
|
213
|
+
0000000298 00000 n
|
|
214
|
+
0000000412 00000 n
|
|
215
|
+
0000000493 00000 n
|
|
216
|
+
0000002769 00000 n
|
|
217
|
+
0000002876 00000 n
|
|
218
|
+
0000002945 00000 n
|
|
219
|
+
0000003047 00000 n
|
|
220
|
+
0000003731 00000 n
|
|
221
|
+
|
|
222
|
+
trailer
|
|
223
|
+
<< /Size 13
|
|
224
|
+
/Root 1 0 R
|
|
225
|
+
/Info 5 0 R
|
|
226
|
+
>>
|
|
227
|
+
startxref
|
|
228
|
+
3938
|
|
229
|
+
%%EOF
|
data/lib/ruport/util/graph.rb
CHANGED
|
@@ -19,42 +19,6 @@ module Ruport
|
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
module_function :Graph
|
|
22
|
-
|
|
23
|
-
class Graph < Ruport::Data::Table
|
|
24
|
-
|
|
25
|
-
class Line < Ruport::Data::Record
|
|
26
|
-
attr_accessor :name
|
|
27
|
-
|
|
28
|
-
def initialize_copy(from)
|
|
29
|
-
@name = from.name.dup if from.name
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def initialize(options={})
|
|
34
|
-
super({:record_class => Line}.merge(options))
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def add_line(row_data,options={})
|
|
38
|
-
self << row_data
|
|
39
|
-
self[-1].name = options[:name]
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def dup
|
|
43
|
-
obj = self.class.new(:column_names => column_names)
|
|
44
|
-
data.each { |r| obj.add_line(r.to_a,:name => r.name)}
|
|
45
|
-
return obj
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def as(format,*args,&block)
|
|
49
|
-
Ruport::Renderer::Graph.render(format,*args,&block)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def method_missing(id,*args,&block)
|
|
53
|
-
id.to_s =~ /^to_(.*)/
|
|
54
|
-
$1 ? as($1.to_sym,{:data => self}.merge(args[0]||{}),&block) : super
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
end
|
|
58
22
|
|
|
59
23
|
# This class implements the basic graphing engine for Ruport.
|
|
60
24
|
#
|
|
@@ -84,6 +48,35 @@ module Ruport
|
|
|
84
48
|
|
|
85
49
|
finalize :graph
|
|
86
50
|
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
class Graph < Ruport::Data::Table
|
|
54
|
+
|
|
55
|
+
renders_with Renderer::Graph
|
|
56
|
+
|
|
57
|
+
class Line < Ruport::Data::Record
|
|
58
|
+
attr_accessor :name
|
|
59
|
+
|
|
60
|
+
def initialize_copy(from)
|
|
61
|
+
@name = from.name.dup if from.name
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def initialize(options={})
|
|
66
|
+
super({:record_class => Line}.merge(options))
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def add_line(row_data,options={})
|
|
70
|
+
self << row_data
|
|
71
|
+
self[-1].name = options[:name]
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def dup
|
|
75
|
+
obj = self.class.new(:column_names => column_names)
|
|
76
|
+
data.each { |r| obj.add_line(r.to_a,:name => r.name)}
|
|
77
|
+
return obj
|
|
78
|
+
end
|
|
79
|
+
|
|
87
80
|
end
|
|
88
81
|
|
|
89
82
|
class Formatter::SVG < Formatter
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
module Ruport
|
|
2
|
+
module Util
|
|
3
|
+
module FormHelpers
|
|
4
|
+
|
|
5
|
+
def form_field(label,text,opts={})
|
|
6
|
+
padding = Array(opts.delete(:padding) || 0)
|
|
7
|
+
padding_top = padding[0]
|
|
8
|
+
padding_right = padding[1] || padding_top
|
|
9
|
+
padding_bottom = padding[2] || padding_top
|
|
10
|
+
padding_left = padding[3] || padding_right
|
|
11
|
+
|
|
12
|
+
x = opts.delete(:x) || left_boundary
|
|
13
|
+
y = opts.delete(:y) || cursor
|
|
14
|
+
width = opts.delete(:width) || full_width(x)
|
|
15
|
+
height = opts.delete(:height)
|
|
16
|
+
|
|
17
|
+
old_cursor = cursor
|
|
18
|
+
old_font = pdf_writer.font_size
|
|
19
|
+
|
|
20
|
+
move_cursor_to(y - 2 - padding_top)
|
|
21
|
+
if opts[:style] == "vertical"
|
|
22
|
+
draw_text "<b>#{label}</b>\n#{text}", :left => x + 10 + padding_left
|
|
23
|
+
height ||= pdf_writer.font_height * (text.count("\n") + 2) + 10 +
|
|
24
|
+
padding_top + padding_bottom
|
|
25
|
+
else
|
|
26
|
+
draw_text "<b>#{label}</b> #{text}", :left => x + 10 + padding_left
|
|
27
|
+
height ||= pdf_writer.font_height + 10 + padding_top + padding_bottom
|
|
28
|
+
end
|
|
29
|
+
draw_border(x,y,width,height,opts)
|
|
30
|
+
|
|
31
|
+
if opts[:maintain_cursor]
|
|
32
|
+
move_cursor_to(old_cursor)
|
|
33
|
+
else
|
|
34
|
+
move_cursor(-8 - padding_bottom)
|
|
35
|
+
end
|
|
36
|
+
pdf_writer.font_size = old_font
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def option_box(opt,choice,opts={})
|
|
40
|
+
x = opts[:x] || left_boundary
|
|
41
|
+
y = opts[:y] || cursor
|
|
42
|
+
width = opts[:width] || 12
|
|
43
|
+
height = opts[:height] || 12
|
|
44
|
+
|
|
45
|
+
old_cursor = cursor
|
|
46
|
+
old_font = pdf_writer.font_size
|
|
47
|
+
|
|
48
|
+
if opt.eql?(choice)
|
|
49
|
+
checked_box(x + 10, y - 3, width, height)
|
|
50
|
+
else
|
|
51
|
+
unchecked_box(x + 10, y - 3, width, height)
|
|
52
|
+
end
|
|
53
|
+
draw_text opts[:label], :left => x + 10 + width + 8,
|
|
54
|
+
:y => y if opts[:label]
|
|
55
|
+
|
|
56
|
+
opts[:maintain_cursor] ? move_cursor_to(old_cursor) : move_cursor(-8)
|
|
57
|
+
pdf_writer.font_size = old_font
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def checked_box(x,y,width=12,height=12)
|
|
61
|
+
draw_border(x,y,width,height)
|
|
62
|
+
pdf_writer.line(x, y, x + width, y - height)
|
|
63
|
+
pdf_writer.line(x + width, y, x, y - height)
|
|
64
|
+
pdf_writer.stroke
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def unchecked_box(x,y,width=12,height=12)
|
|
68
|
+
draw_border(x,y,width,height)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Draws a box at the specified x and y coordinates (top left corner),
|
|
72
|
+
# with the specified width and height
|
|
73
|
+
def draw_border(x,y,width,height,opts={})
|
|
74
|
+
border = Array(opts[:border] || 1)
|
|
75
|
+
border_top = border[0]
|
|
76
|
+
border_right = border[1] || border_top
|
|
77
|
+
border_bottom = border[2] || border_top
|
|
78
|
+
border_left = border[3] || border_right
|
|
79
|
+
|
|
80
|
+
draw_line(x, y, x + width, y,
|
|
81
|
+
border_top) if border_top > 0
|
|
82
|
+
draw_line(x + width, y, x + width, y - height,
|
|
83
|
+
border_right) if border_right > 0
|
|
84
|
+
draw_line(x, y - height, x + width, y - height,
|
|
85
|
+
border_bottom) if border_bottom > 0
|
|
86
|
+
draw_line(x, y, x, y - height,
|
|
87
|
+
border_left) if border_left > 0
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def draw_line(x1,y1,x2,y2,thickness)
|
|
91
|
+
ss = PDF::Writer::StrokeStyle.new(thickness)
|
|
92
|
+
pdf_writer.stroke_style(ss)
|
|
93
|
+
pdf_writer.line(x1,y1,x2,y2)
|
|
94
|
+
pdf_writer.stroke
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# draws a horizontal line at y from x1 to x2
|
|
98
|
+
def horizontal_line_at(y,x1,x2)
|
|
99
|
+
pdf_writer.line(x1,y,x2,y)
|
|
100
|
+
pdf_writer.stroke
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def full_width(x=nil)
|
|
104
|
+
x ? right_boundary - x : right_boundary - left_boundary
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
module Ruport
|
|
112
|
+
class Formatter::PDF
|
|
113
|
+
alias_method :original_draw_text, :draw_text
|
|
114
|
+
|
|
115
|
+
def draw_text(text,text_opts)
|
|
116
|
+
y_pos = cursor
|
|
117
|
+
original_draw_text(text,text_opts)
|
|
118
|
+
move_cursor_to(y_pos) if text_opts[:maintain_cursor]
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
data/lib/ruport/util.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module Ruport
|
|
2
2
|
module Util
|
|
3
|
-
VERSION = "0.
|
|
3
|
+
VERSION = "0.6.0"
|
|
4
4
|
end
|
|
5
5
|
end
|
|
6
6
|
require "ruport/util/report"
|
|
@@ -10,3 +10,4 @@ require "ruport/util/report_manager"
|
|
|
10
10
|
require "ruport/util/mailer"
|
|
11
11
|
require "ruport/util/bench"
|
|
12
12
|
require "ruport/util/generator"
|
|
13
|
+
require "ruport/util/pdf/form"
|
metadata
CHANGED
|
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
|
3
3
|
specification_version: 1
|
|
4
4
|
name: ruport-util
|
|
5
5
|
version: !ruby/object:Gem::Version
|
|
6
|
-
version: 0.
|
|
7
|
-
date: 2007-05-
|
|
6
|
+
version: 0.6.0
|
|
7
|
+
date: 2007-05-30 00:00:00 -04:00
|
|
8
8
|
summary: A set of tools and helper libs for Ruby Reports
|
|
9
9
|
require_paths:
|
|
10
10
|
- lib
|
|
@@ -29,10 +29,14 @@ post_install_message:
|
|
|
29
29
|
authors:
|
|
30
30
|
- Gregory Brown
|
|
31
31
|
files:
|
|
32
|
+
- example/foo.svg
|
|
33
|
+
- example/form.pdf
|
|
34
|
+
- example/form.rb
|
|
32
35
|
- example/graph_report.rb
|
|
33
36
|
- example/invoice_report.rb
|
|
34
37
|
- example/mailer.rb
|
|
35
38
|
- example/managed_report.rb
|
|
39
|
+
- example/out.pdf
|
|
36
40
|
- lib/ruport
|
|
37
41
|
- lib/ruport/util
|
|
38
42
|
- lib/ruport/util.rb
|
|
@@ -41,8 +45,10 @@ files:
|
|
|
41
45
|
- lib/ruport/util/graph.rb
|
|
42
46
|
- lib/ruport/util/invoice.rb
|
|
43
47
|
- lib/ruport/util/mailer.rb
|
|
48
|
+
- lib/ruport/util/pdf
|
|
44
49
|
- lib/ruport/util/report.rb
|
|
45
50
|
- lib/ruport/util/report_manager.rb
|
|
51
|
+
- lib/ruport/util/pdf/form.rb
|
|
46
52
|
- test/init.rb
|
|
47
53
|
- test/samples
|
|
48
54
|
- test/test_graph_renderer.rb
|