origami 1.2.7 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/README.md +112 -0
  4. data/bin/config/pdfcop.conf.yml +232 -233
  5. data/bin/gui/about.rb +27 -37
  6. data/bin/gui/config.rb +108 -117
  7. data/bin/gui/file.rb +416 -365
  8. data/bin/gui/gtkhex.rb +1138 -1153
  9. data/bin/gui/hexview.rb +55 -57
  10. data/bin/gui/imgview.rb +48 -51
  11. data/bin/gui/menu.rb +388 -386
  12. data/bin/gui/properties.rb +114 -130
  13. data/bin/gui/signing.rb +571 -617
  14. data/bin/gui/textview.rb +77 -95
  15. data/bin/gui/treeview.rb +382 -387
  16. data/bin/gui/walker.rb +227 -232
  17. data/bin/gui/xrefs.rb +56 -60
  18. data/bin/pdf2pdfa +53 -57
  19. data/bin/pdf2ruby +212 -228
  20. data/bin/pdfcop +338 -348
  21. data/bin/pdfdecompress +58 -65
  22. data/bin/pdfdecrypt +56 -60
  23. data/bin/pdfencrypt +75 -80
  24. data/bin/pdfexplode +185 -182
  25. data/bin/pdfextract +201 -218
  26. data/bin/pdfmetadata +83 -82
  27. data/bin/pdfsh +4 -5
  28. data/bin/pdfwalker +1 -2
  29. data/bin/shell/.irbrc +45 -82
  30. data/bin/shell/console.rb +105 -130
  31. data/bin/shell/hexdump.rb +40 -64
  32. data/examples/README.md +34 -0
  33. data/examples/attachments/attachment.rb +38 -0
  34. data/examples/attachments/nested_document.rb +51 -0
  35. data/examples/encryption/encryption.rb +28 -0
  36. data/{samples/actions/triggerevents/trigger.rb → examples/events/events.rb} +13 -16
  37. data/examples/flash/flash.rb +37 -0
  38. data/{samples → examples}/flash/helloworld.swf +0 -0
  39. data/examples/forms/javascript.rb +54 -0
  40. data/examples/forms/xfa.rb +115 -0
  41. data/examples/javascript/hello_world.rb +22 -0
  42. data/examples/javascript/js_emulation.rb +54 -0
  43. data/examples/loop/goto.rb +32 -0
  44. data/examples/loop/named.rb +33 -0
  45. data/examples/signature/signature.rb +65 -0
  46. data/examples/uri/javascript.rb +56 -0
  47. data/examples/uri/open-uri.rb +21 -0
  48. data/examples/uri/submitform.rb +47 -0
  49. data/lib/origami.rb +29 -42
  50. data/lib/origami/3d.rb +350 -225
  51. data/lib/origami/acroform.rb +262 -288
  52. data/lib/origami/actions.rb +268 -288
  53. data/lib/origami/annotations.rb +697 -722
  54. data/lib/origami/array.rb +258 -184
  55. data/lib/origami/boolean.rb +74 -84
  56. data/lib/origami/catalog.rb +397 -434
  57. data/lib/origami/collections.rb +144 -0
  58. data/lib/origami/destinations.rb +233 -194
  59. data/lib/origami/dictionary.rb +253 -232
  60. data/lib/origami/encryption.rb +1274 -1243
  61. data/lib/origami/export.rb +232 -268
  62. data/lib/origami/extensions/fdf.rb +307 -220
  63. data/lib/origami/extensions/ppklite.rb +368 -435
  64. data/lib/origami/filespec.rb +197 -0
  65. data/lib/origami/filters.rb +301 -295
  66. data/lib/origami/filters/ascii.rb +177 -180
  67. data/lib/origami/filters/ccitt.rb +528 -535
  68. data/lib/origami/filters/crypt.rb +26 -35
  69. data/lib/origami/filters/dct.rb +46 -52
  70. data/lib/origami/filters/flate.rb +95 -94
  71. data/lib/origami/filters/jbig2.rb +49 -55
  72. data/lib/origami/filters/jpx.rb +38 -44
  73. data/lib/origami/filters/lzw.rb +189 -183
  74. data/lib/origami/filters/predictors.rb +221 -235
  75. data/lib/origami/filters/runlength.rb +103 -104
  76. data/lib/origami/font.rb +173 -186
  77. data/lib/origami/functions.rb +67 -81
  78. data/lib/origami/graphics.rb +25 -21
  79. data/lib/origami/graphics/colors.rb +178 -187
  80. data/lib/origami/graphics/instruction.rb +79 -85
  81. data/lib/origami/graphics/path.rb +142 -148
  82. data/lib/origami/graphics/patterns.rb +160 -167
  83. data/lib/origami/graphics/render.rb +43 -50
  84. data/lib/origami/graphics/state.rb +138 -153
  85. data/lib/origami/graphics/text.rb +188 -205
  86. data/lib/origami/graphics/xobject.rb +819 -815
  87. data/lib/origami/header.rb +63 -78
  88. data/lib/origami/javascript.rb +596 -597
  89. data/lib/origami/linearization.rb +285 -290
  90. data/lib/origami/metadata.rb +139 -148
  91. data/lib/origami/name.rb +112 -148
  92. data/lib/origami/null.rb +53 -62
  93. data/lib/origami/numeric.rb +162 -175
  94. data/lib/origami/obfuscation.rb +186 -174
  95. data/lib/origami/object.rb +593 -573
  96. data/lib/origami/outline.rb +42 -47
  97. data/lib/origami/outputintents.rb +73 -82
  98. data/lib/origami/page.rb +703 -592
  99. data/lib/origami/parser.rb +238 -290
  100. data/lib/origami/parsers/fdf.rb +41 -33
  101. data/lib/origami/parsers/pdf.rb +75 -95
  102. data/lib/origami/parsers/pdf/lazy.rb +137 -0
  103. data/lib/origami/parsers/pdf/linear.rb +64 -66
  104. data/lib/origami/parsers/ppklite.rb +34 -70
  105. data/lib/origami/pdf.rb +1030 -1005
  106. data/lib/origami/reference.rb +102 -102
  107. data/lib/origami/signature.rb +591 -609
  108. data/lib/origami/stream.rb +668 -551
  109. data/lib/origami/string.rb +397 -373
  110. data/lib/origami/template/patterns.rb +56 -0
  111. data/lib/origami/template/widgets.rb +151 -0
  112. data/lib/origami/trailer.rb +144 -158
  113. data/lib/origami/tree.rb +62 -0
  114. data/lib/origami/version.rb +23 -0
  115. data/lib/origami/webcapture.rb +88 -79
  116. data/lib/origami/xfa.rb +2863 -2882
  117. data/lib/origami/xreftable.rb +472 -384
  118. data/test/dataset/calc.pdf +85 -0
  119. data/test/dataset/crypto.pdf +82 -0
  120. data/test/dataset/empty.pdf +49 -0
  121. data/test/test_actions.rb +27 -0
  122. data/test/test_annotations.rb +90 -0
  123. data/test/test_pages.rb +31 -0
  124. data/test/test_pdf.rb +16 -0
  125. data/test/test_pdf_attachment.rb +34 -0
  126. data/test/test_pdf_create.rb +24 -0
  127. data/test/test_pdf_encrypt.rb +95 -0
  128. data/test/test_pdf_parse.rb +96 -0
  129. data/test/test_pdf_sign.rb +58 -0
  130. data/test/test_streams.rb +182 -0
  131. data/test/test_xrefs.rb +67 -0
  132. metadata +88 -58
  133. data/README +0 -67
  134. data/bin/pdf2graph +0 -121
  135. data/bin/pdfcocoon +0 -104
  136. data/lib/origami/file.rb +0 -233
  137. data/samples/README.txt +0 -45
  138. data/samples/actions/launch/calc.rb +0 -87
  139. data/samples/actions/launch/winparams.rb +0 -22
  140. data/samples/actions/loop/loopgoto.rb +0 -24
  141. data/samples/actions/loop/loopnamed.rb +0 -21
  142. data/samples/actions/named/named.rb +0 -31
  143. data/samples/actions/samba/smbrelay.rb +0 -26
  144. data/samples/actions/webbug/submitform.js +0 -26
  145. data/samples/actions/webbug/webbug-browser.rb +0 -68
  146. data/samples/actions/webbug/webbug-js.rb +0 -67
  147. data/samples/actions/webbug/webbug-reader.rb +0 -90
  148. data/samples/attachments/attach.rb +0 -40
  149. data/samples/attachments/attached.txt +0 -1
  150. data/samples/crypto/crypto.rb +0 -28
  151. data/samples/digsig/signed.rb +0 -46
  152. data/samples/exploits/cve-2008-2992-utilprintf.rb +0 -87
  153. data/samples/exploits/cve-2009-0927-geticon.rb +0 -65
  154. data/samples/exploits/exploit_customdictopen.rb +0 -55
  155. data/samples/exploits/getannots.rb +0 -69
  156. data/samples/flash/flash.rb +0 -31
  157. data/samples/javascript/attached.txt +0 -1
  158. data/samples/javascript/js.rb +0 -52
  159. data/templates/patterns.rb +0 -66
  160. data/templates/widgets.rb +0 -173
  161. data/templates/xdp.rb +0 -92
  162. data/test/ts_pdf.rb +0 -50
@@ -0,0 +1,144 @@
1
+ =begin
2
+
3
+ This file is part of Origami, PDF manipulation framework for Ruby
4
+ Copyright (C) 2016 Guillaume Delugré.
5
+
6
+ Origami is free software: you can redistribute it and/or modify
7
+ it under the terms of the GNU Lesser General Public License as published by
8
+ the Free Software Foundation, either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ Origami is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU Lesser General Public License for more details.
15
+
16
+ You should have received a copy of the GNU Lesser General Public License
17
+ along with Origami. If not, see <http://www.gnu.org/licenses/>.
18
+
19
+ =end
20
+
21
+ module Origami
22
+
23
+ class PDF
24
+ #
25
+ # Returns true if the document behaves as a portfolio for embedded files.
26
+ #
27
+ def portfolio?
28
+ self.Catalog.Collection.is_a?(Dictionary)
29
+ end
30
+ end
31
+
32
+ class Collection < Dictionary
33
+ include StandardObject
34
+
35
+ module View
36
+ DETAILS = :D
37
+ TILE = :T
38
+ HIDDEN = :H
39
+ end
40
+
41
+ class Schema < Dictionary
42
+ include StandardObject
43
+
44
+ field :Type, :Type => Name, :Default => :CollectionSchema
45
+ end
46
+
47
+ class Navigator < Dictionary
48
+ include StandardObject
49
+
50
+ module Type
51
+ FLEX = :Module
52
+ FLASH = :Default
53
+ end
54
+
55
+ field :SWF, :Type => String, :Required => true
56
+ field :Name, :Type => String, :Required => true
57
+ field :Desc, :Type => String
58
+ field :Category, :Type => String
59
+ field :ID, :Type => String, :Required => true
60
+ field :Version, :Type => String
61
+ field :APIVersion, :Type => String, :Required => true
62
+ field :LoadType, :Type => Name, :Default => Type::FLASH
63
+ field :Icon, :Type => String
64
+ field :Locale, :Type => String
65
+ field :Strings, :Type => NameTreeNode.of(String)
66
+ field :InitialFields, :Type => Schema
67
+ field :Resources, :Type => NameTreeNode.of(Stream), :Required => true
68
+ end
69
+
70
+ class Color < Dictionary
71
+ include StandardObject
72
+
73
+ field :Background, :Type => Array.of(Number, length: 3)
74
+ field :CardBackground, :Type => Array.of(Number, length: 3)
75
+ field :CardBorder, :Type => Array.of(Number, length: 3)
76
+ field :PrimaryText, :Type => Array.of(Number, length: 3)
77
+ field :SecondaryText, :Type => Array.of(Number, length: 3)
78
+ end
79
+
80
+ class Split < Dictionary
81
+ include StandardObject
82
+
83
+ HORIZONTAL = :H
84
+ VERTICAL = :V
85
+ NONE = :N
86
+
87
+ field :Direction, :Type => Name
88
+ field :Position, :Type => Number
89
+ end
90
+
91
+ class Item < Dictionary
92
+ include StandardObject
93
+
94
+ field :Type, :Type => Name, :Default => :CollectionItem
95
+ end
96
+
97
+ class Subitem < Dictionary
98
+ include StandardObject
99
+
100
+ field :Type, :Type => Name, :Default => :CollectionSubitem
101
+ field :D, :Type => [ String, Number ]
102
+ field :P, :Type => String
103
+ end
104
+
105
+ class Folder < Dictionary
106
+ include StandardObject
107
+
108
+ field :Type, :Type => Name, :Default => :Folder
109
+ field :ID, :Type => Integer, :Required => true
110
+ field :Name, :Type => String, :Required => true
111
+ field :Parent, :Type => Folder
112
+ field :Child, :Type => Folder
113
+ field :Next, :Type => Folder
114
+ field :CI, :Type => Item
115
+ field :Desc, :Type => String
116
+ field :CreationDate, :Type => String
117
+ field :ModDate, :Type => String
118
+ field :Thumb, :Type => Stream
119
+ field :Free, :Type => Array.of(Array.of(Integer, length: 2))
120
+ end
121
+
122
+ class Sort < Dictionary
123
+ include StandardObject
124
+
125
+ field :Type, :Type => Name, :Default => :CollectionSort
126
+ field :S, :Type => [ Name, Array.of(Name) ]
127
+ field :A, :Type => [ Boolean, Array.of(Boolean) ]
128
+ end
129
+
130
+ #
131
+ # Collection fields.
132
+ #
133
+ field :Type, :Type => Name, :Default => :Collection
134
+ field :Schema, :Type => Schema
135
+ field :D, :Type => String
136
+ field :View, :Type => Name, :Default => View::DETAILS
137
+ field :Sort, :Type => Sort
138
+ field :Navigator, :Type => Navigator, :ExtensionLevel => 3
139
+ field :Resources, :Type => NameTreeNode.of(Stream), :ExtensionLevel => 3
140
+ field :Colors, :Type => Color, :ExtensionLevel => 3
141
+ field :Folders, :Type => Folder, :ExtensionLevel => 3
142
+ field :Split, :Type => Split, :ExtensionLevel => 3
143
+ end
144
+ end
@@ -1,213 +1,252 @@
1
1
  =begin
2
2
 
3
- = File
4
- destinations.rb
5
-
6
- = Info
7
- This file is part of Origami, PDF manipulation framework for Ruby
8
- Copyright (C) 2010 Guillaume DelugrÈ <guillaume AT security-labs DOT org>
9
- All right reserved.
10
-
11
- Origami is free software: you can redistribute it and/or modify
12
- it under the terms of the GNU Lesser General Public License as published by
13
- the Free Software Foundation, either version 3 of the License, or
14
- (at your option) any later version.
15
-
16
- Origami is distributed in the hope that it will be useful,
17
- but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- GNU Lesser General Public License for more details.
20
-
21
- You should have received a copy of the GNU Lesser General Public License
22
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
3
+ This file is part of Origami, PDF manipulation framework for Ruby
4
+ Copyright (C) 2016 Guillaume Delugré.
5
+
6
+ Origami is free software: you can redistribute it and/or modify
7
+ it under the terms of the GNU Lesser General Public License as published by
8
+ the Free Software Foundation, either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ Origami is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU Lesser General Public License for more details.
15
+
16
+ You should have received a copy of the GNU Lesser General Public License
17
+ along with Origami. If not, see <http://www.gnu.org/licenses/>.
23
18
 
24
19
  =end
25
20
 
26
21
  module Origami
27
22
 
28
- class PDF
23
+ class PDF
24
+ #
25
+ # Lookup destination in the destination name directory.
26
+ #
27
+ def get_destination_by_name(name)
28
+ resolve_name Names::DESTINATIONS, name
29
+ end
29
30
 
30
- #
31
- # Lookup destination in the destination name directory.
32
- #
33
- def get_destination_by_name(name)
34
- resolve_name Names::Root::DESTS, name
31
+ #
32
+ # Calls block for each named destination.
33
+ #
34
+ def each_named_dest(&b)
35
+ each_name(Names::DESTINATIONS, &b)
36
+ end
35
37
  end
36
38
 
37
39
  #
38
- # Calls block for each named destination.
40
+ # A destination represents a specified location into the document.
39
41
  #
40
- def each_named_dest(&b)
41
- each_name(Names::Root::DESTS, &b)
42
- end
43
- end
44
-
45
- #
46
- # A destination represents a specified location into the document.
47
- #
48
- module Destination
49
-
50
- attr_reader :top, :left, :right, :bottom, :zoom
51
-
52
- #
53
- # Class representing a Destination zooming on a part of a document.
54
- #
55
- class Zoom < Origami::Array
56
-
57
- include Destination
58
-
59
- #
60
- # Creates a new zoom Destination.
61
- # _pageref_:: A Reference to a Page.
62
- # _left_, _top_:: Coords in the Page.
63
- # _zoom_:: Zoom factor.
64
- #
65
- def initialize(pageref, left = 0, top = 0, zoom = 0)
66
-
67
- @left, @top, @zoom = left, top, zoom
68
-
69
- super([pageref, :XYZ, left, top, zoom])
70
-
71
- end
72
-
73
- end
74
-
75
- #
76
- # Class representing a Destination showing a Page globally.
77
- #
78
- class GlobalFit < Origami::Array
79
-
80
- include Destination
81
-
82
- #
83
- # Creates a new global fit Destination.
84
- # _pageref_:: A Reference to a Page.
85
- #
86
- def initialize(pageref)
87
- super([pageref, :Fit])
88
- end
89
-
90
- end
91
-
92
- #
93
- # Class representing a Destination fitting a Page horizontally.
94
- #
95
- class HorizontalFit < Origami::Array
96
-
97
- include Destination
98
-
99
- #
100
- # Creates a new horizontal fit destination.
101
- # _pageref_:: A Reference to a Page.
102
- # _top_:: The vertical coord in the Page.
103
- #
104
- def initialize(pageref, top = 0)
105
-
106
- @top = top
107
- super([pageref, :FitH, top])
108
-
109
- end
110
-
111
- end
42
+ class Destination < Origami::Array
43
+ attr_reader :page, :top, :left, :right, :bottom, :zoom
112
44
 
113
- #
114
- # Class representing a Destination fitting a Page vertically.
115
- # _pageref_:: A Reference to a Page.
116
- # _left_:: The horizontal coord in the Page.
117
- #
118
- class VerticalFit < Origami::Array
119
-
120
- include Destination
121
-
122
- def initialize(pageref, left = 0)
123
-
124
- @left = left
125
- super([pageref, :FitV, left])
126
-
127
- end
128
-
129
- end
130
-
131
- #
132
- # Class representing a Destination fitting the view on a rectangle in a Page.
133
- #
134
- class RectangleFit < Origami::Array
135
-
136
- include Destination
137
-
138
- #
139
- # Creates a new rectangle fit Destination.
140
- # _pageref_:: A Reference to a Page.
141
- # _left_, _bottom_, _right_, _top_:: The rectangle to fit in.
142
- #
143
- def initialize(pageref, left = 0, bottom = 0, right = 0, top = 0)
144
-
145
- @left, @bottom, @right, @top = left, bottom, right, top
146
- super([pageref, :FitR, left, bottom, right, top])
147
-
148
- end
149
-
150
- end
151
-
152
- #
153
- # Class representing a Destination fitting the bounding box of a Page.
154
- #
155
- class GlobalBoundingBoxFit < Origami::Array
156
-
157
- include Destination
158
-
159
- #
160
- # Creates a new bounding box fit Destination.
161
- # _pageref_:: A Reference to a Page.
162
- #
163
- def initialize(pageref)
164
- super([pageref, :FitB])
165
- end
166
-
167
- end
168
-
169
- #
170
- # Class representing a Destination fitting horizontally the bouding box a Page.
171
- #
172
- class HorizontalBoudingBoxFit < Origami::Array
173
-
174
- include Destination
175
-
176
- #
177
- # Creates a new horizontal bounding box fit Destination.
178
- # _pageref_:: A Reference to a Page.
179
- # _top_:: The vertical coord.
180
- #
181
- def initialize(pageref, top = 0)
182
-
183
- @top = top
184
- super([pageref, :FitBH, top])
185
-
186
- end
187
-
45
+ #
46
+ # Class representing a Destination zooming on a part of a document.
47
+ #
48
+ class Zoom < Destination
49
+
50
+ def initialize(array)
51
+ super(array)
52
+
53
+ @page, _, @left, @top, @zoom = array
54
+ end
55
+
56
+ #
57
+ # Creates a new zoom Destination.
58
+ # _page_:: The destination Page.
59
+ # _left_, _top_:: Coords in the Page.
60
+ # _zoom_:: Zoom factor.
61
+ #
62
+ def self.[](page, left: 0, top: 0, zoom: 0)
63
+ self.new([page, :XYZ, left, top, zoom])
64
+ end
65
+ end
66
+
67
+ def self.Zoom(page, left: 0, top: 0, zoom: 0)
68
+ Zoom[page, left: left, top: top, zoom: zoom]
69
+ end
70
+
71
+
72
+ #
73
+ # Class representing a Destination showing a Page globally.
74
+ #
75
+ class GlobalFit < Destination
76
+
77
+ def initialize(array)
78
+ super(array)
79
+
80
+ @page, _ = array
81
+ end
82
+
83
+ #
84
+ # Creates a new global fit Destination.
85
+ # _page_:: The destination Page.
86
+ #
87
+ def self.[](page)
88
+ self.new([page, :Fit])
89
+ end
90
+ end
91
+
92
+ def self.GlobalFit(page)
93
+ GlobalFit[page]
94
+ end
95
+
96
+ #
97
+ # Class representing a Destination fitting a Page horizontally.
98
+ #
99
+ class HorizontalFit < Destination
100
+
101
+ def initialize(array)
102
+ super(array)
103
+
104
+ @page, _, @top = array
105
+ end
106
+
107
+ #
108
+ # Creates a new horizontal fit destination.
109
+ # _page_:: The destination Page.
110
+ # _top_:: The vertical coord in the Page.
111
+ #
112
+ def self.[](page, top: 0)
113
+ self.new([page, :FitH, top])
114
+ end
115
+ end
116
+
117
+ def self.HorizontalFit(page, top: 0)
118
+ HorizontalFit[page, top: top]
119
+ end
120
+
121
+ #
122
+ # Class representing a Destination fitting a Page vertically.
123
+ # _page_:: The destination Page.
124
+ # _left_:: The horizontal coord in the Page.
125
+ #
126
+ class VerticalFit < Destination
127
+
128
+ def initialize(array)
129
+ super(array)
130
+
131
+ @page, _, @left = array
132
+ end
133
+
134
+ def self.[](page, left: 0)
135
+ self.new([page, :FitV, left])
136
+ end
137
+ end
138
+
139
+ def self.VerticalFit(page, left: 0)
140
+ VerticalFit[page, left: left]
141
+ end
142
+
143
+ #
144
+ # Class representing a Destination fitting the view on a rectangle in a Page.
145
+ #
146
+ class RectangleFit < Destination
147
+
148
+ def initialize(array)
149
+ super(array)
150
+
151
+ @page, _, @left, @bottom, @right, @top = array
152
+ end
153
+
154
+ #
155
+ # Creates a new rectangle fit Destination.
156
+ # _page_:: The destination Page.
157
+ # _left_, _bottom_, _right_, _top_:: The rectangle to fit in.
158
+ #
159
+ def self.[](page, left: 0, bottom: 0, right: 0, top: 0)
160
+ self.new([pageref, :FitR, left, bottom, right, top])
161
+ end
162
+ end
163
+
164
+ def self.RectangleFit(page, left: 0, bottom: 0, right: 0, top: 0)
165
+ RectangleFit[page, left: left, bottom: bottom, right: right, top: top]
166
+ end
167
+
168
+ #
169
+ # Class representing a Destination fitting the bounding box of a Page.
170
+ #
171
+ class GlobalBoundingBoxFit < Destination
172
+
173
+ def initialize(array)
174
+ super(array)
175
+
176
+ @page, _, = array
177
+ end
178
+
179
+ #
180
+ # Creates a new bounding box fit Destination.
181
+ # _page_:: The destination Page.
182
+ #
183
+ def self.[](page)
184
+ self.new([page, :FitB])
185
+ end
186
+ end
187
+
188
+ def self.GlobalBoundingBoxFit(page)
189
+ GlobalBoundingBoxFit[page]
190
+ end
191
+
192
+ #
193
+ # Class representing a Destination fitting horizontally the bouding box a Page.
194
+ #
195
+ class HorizontalBoudingBoxFit < Destination
196
+
197
+ def initialize(array)
198
+ super(array)
199
+
200
+ @page, _, @top = array
201
+ end
202
+
203
+ #
204
+ # Creates a new horizontal bounding box fit Destination.
205
+ # _page_:: The destination Page.
206
+ # _top_:: The vertical coord.
207
+ #
208
+ def self.[](page, top: 0)
209
+ self.new([page, :FitBH, top])
210
+ end
211
+ end
212
+
213
+ def self.HorizontalBoudingBoxFit(page, top: 0)
214
+ HorizontalBoudingBoxFit[page, top: top]
215
+ end
216
+
217
+ #
218
+ # Class representing a Destination fitting vertically the bounding box of a Page.
219
+ #
220
+ class VerticalBoundingBoxFit < Destination
221
+
222
+ def initialize(array)
223
+ super(array)
224
+
225
+ @page, _, @left = array
226
+ end
227
+
228
+ #
229
+ # Creates a new vertical bounding box fit Destination.
230
+ # _page_:: The destination Page.
231
+ # _left_:: The horizontal coord.
232
+ #
233
+ def self.[](page, left: 0)
234
+ self.new([pageref, :FitBV, left])
235
+ end
236
+ end
237
+
238
+ def self.VerticalBoundingBoxFit(page, left: 0)
239
+ VerticalBoundingBoxFit[page, left: left]
240
+ end
188
241
  end
189
-
242
+
190
243
  #
191
- # Class representing a Destination fitting vertically the bounding box of a Page.
244
+ # This kind of Dictionary is used in named destinations.
192
245
  #
193
- class VerticalBoundingBoxFit < Origami::Array
194
-
195
- include Destination
196
-
197
- #
198
- # Creates a new vertical bounding box fit Destination.
199
- # _pageref_:: A Reference to a Page.
200
- # _left_:: The horizontal coord.
201
- #
202
- def initialize(pageref, left = 0)
203
-
204
- @left = left
205
- super([pageref, :FitBV, left])
206
-
207
- end
208
-
246
+ class DestinationDictionary < Dictionary
247
+ include StandardObject
248
+
249
+ field :D, :Type => Destination, :Required => true
209
250
  end
210
-
211
- end
212
251
 
213
252
  end