origami 1.2.7 → 2.0.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.
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