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
@@ -1,283 +1,247 @@
1
1
  =begin
2
2
 
3
- = File
4
- export.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
29
-
30
- #
31
- # Exports the document to a dot Graphiz file.
32
- # _filename_:: The path where to save the file.
33
- #
34
- def export_to_graph(filename)
35
-
36
- def appearance(object) #:nodoc:
37
-
38
- label = object.type.to_s
39
- case object
40
- when Catalog
41
- fontcolor = "red"
42
- color = "mistyrose"
43
- shape = "ellipse"
44
- when Name, Number
45
- label = object.value
46
- fontcolor = "brown"
47
- color = "lightgoldenrodyellow"
48
- shape = "polygon"
49
- when String
50
- label = object.value unless (object.is_binary_data? or object.length > 50)
51
- fontcolor = "red"
52
- color = "white"
53
- shape = "polygon"
54
- when Array
55
- fontcolor = "darkgreen"
56
- color = "lightcyan"
57
- shape = "ellipse"
58
- else
59
- fontcolor = "blue"
60
- color = "aliceblue"
61
- shape = "ellipse"
62
- end
63
-
64
- { :label => label, :fontcolor => fontcolor, :color => color, :shape => shape }
65
- end
66
-
67
- def add_edges(pdf, fd, object) #:nodoc:
68
-
69
- if object.is_a?(Array) or object.is_a?(ObjectStream)
70
-
71
- object.each { |subobj|
72
- subobj = subobj.solve if subobj.is_a?(Reference)
73
- fd << "\t#{object.object_id} -> #{subobj.object_id}\n" unless subobj.nil?
74
- }
75
-
76
- elsif object.is_a?(Dictionary)
77
-
78
- object.each_pair { |name, subobj|
79
- subobj = subobj.solve if subobj.is_a?(Reference)
80
- fd << "\t#{object.object_id} -> #{subobj.object_id} [label=\"#{name.value}\",fontsize=9];\n" unless subobj.nil?
81
- }
82
-
83
- end
84
-
85
- if object.is_a?(Stream)
86
-
87
- object.dictionary.each_pair { |key, value|
88
- value = value.solve if value.is_a?(Reference)
89
- fd << "\t#{object.object_id} -> #{value.object_id} [label=\"#{key.value}\",fontsize=9];\n" unless value.nil?
90
- }
91
-
92
- end
93
-
94
- end
95
-
96
- graphname = "PDF" if graphname.nil? or graphname.empty?
97
- fd = File.open(filename, "w")
98
-
99
- begin
100
- fd << "digraph #{graphname} {\n\n"
101
-
102
- objects = self.objects(:include_keys => false).find_all{ |obj| not obj.is_a?(Reference) }
103
-
104
- objects.each { |object|
105
- attr = appearance(object)
106
-
107
- fd << "\t#{object.object_id} [label=\"#{attr[:label]}\",shape=#{attr[:shape]},color=#{attr[:color]},style=filled,fontcolor=#{attr[:fontcolor]},fontsize=16];\n"
108
-
109
- if object.is_a?(Stream)
110
-
111
- object.dictionary.each { |value|
112
- unless value.is_a?(Reference)
113
- attr = appearance(value)
114
- fd << "\t#{value.object_id} [label=\"#{attr[:label]}\",shape=#{attr[:shape]},color=#{attr[:color]},style=filled,fontcolor=#{attr[:fontcolor]},fontsize=16];\n"
115
- end
116
- }
117
-
118
- end
119
-
120
- add_edges(self, fd, object)
121
- }
122
- fd << "\n}"
123
- ensure
124
- fd.close
125
- end
126
-
127
- end
128
-
129
- #
130
- # Exports the document to a GraphML file.
131
- # _filename_:: The path where to save the file.
132
- #
133
- def export_to_graphml(filename)
134
-
135
- def declare_node(id, attr) #:nodoc:
136
- " <node id=\"#{id}\">\n" <<
137
- " <data key=\"d0\">\n" <<
138
- " <y:ShapeNode>\n" <<
139
- " <y:NodeLabel>#{attr[:label]}</y:NodeLabel>\n" <<
140
- #~ " <y:Shape type=\"#{attr[:shape]}\"/>\n" <<
141
- " </y:ShapeNode>\n" <<
142
- " </data>\n" <<
143
- " </node>\n"
144
- end
145
-
146
- def declare_edge(id, src, dest, label = nil) #:nodoc:
147
- " <edge id=\"#{id}\" source=\"#{src}\" target=\"#{dest}\">\n" <<
148
- " <data key=\"d1\">\n" <<
149
- " <y:PolyLineEdge>\n" <<
150
- " <y:LineStyle type=\"line\" width=\"1.0\" color=\"#000000\"/>\n" <<
151
- " <y:Arrows source=\"none\" target=\"standard\"/>\n" <<
152
- " <y:EdgeLabel>#{label.to_s}</y:EdgeLabel>\n" <<
153
- " </y:PolyLineEdge>\n" <<
154
- " </data>\n" <<
155
- " </edge>\n"
156
- end
157
-
158
- def appearance(object) #:nodoc:
159
-
160
- label = object.type.to_s
161
- case object
162
- when Catalog
163
- fontcolor = "red"
164
- color = "mistyrose"
165
- shape = "doublecircle"
166
- when Name, Number
167
- label = object.value
168
- fontcolor = "orange"
169
- color = "lightgoldenrodyellow"
170
- shape = "polygon"
171
- when String
172
- label = object.value unless (object.is_binary_data? or object.length > 50)
173
- fontcolor = "red"
174
- color = "white"
175
- shape = "polygon"
176
- when Array
177
- fontcolor = "green"
178
- color = "lightcyan"
179
- shape = "ellipse"
180
- else
181
- fontcolor = "blue"
182
- color = "aliceblue"
183
- shape = "ellipse"
184
- end
185
-
186
- { :label => label, :fontcolor => fontcolor, :color => color, :shape => shape }
187
- end
188
-
189
- def add_edges(pdf, fd, object, id) #:nodoc:
190
-
191
- if object.is_a?(Array) or object.is_a?(ObjectStream)
192
-
193
- object.each { |subobj|
194
-
195
- subobj = subobj.solve if subobj.is_a?(Reference)
196
-
197
- unless subobj.nil?
198
- fd << declare_edge("e#{id}", "n#{object.object_id}", "n#{subobj.object_id}")
199
- id = id + 1
23
+ class PDF
24
+
25
+ #
26
+ # Exports the document to a dot Graphiz file.
27
+ # _filename_:: The path where to save the file.
28
+ #
29
+ def export_to_graph(path)
30
+
31
+ appearance = -> (object) do
32
+ label = object.type.to_s
33
+ case object
34
+ when Catalog
35
+ fontcolor = "red"
36
+ color = "mistyrose"
37
+ shape = "ellipse"
38
+ when Name, Number
39
+ label = object.value
40
+ fontcolor = "brown"
41
+ color = "lightgoldenrodyellow"
42
+ shape = "polygon"
43
+ when String
44
+ label = object.value if (object.ascii_only? and object.length <= 50)
45
+ fontcolor = "red"
46
+ color = "white"
47
+ shape = "polygon"
48
+ when Array
49
+ fontcolor = "darkgreen"
50
+ color = "lightcyan"
51
+ shape = "ellipse"
52
+ else
53
+ fontcolor = "blue"
54
+ color = "aliceblue"
55
+ shape = "ellipse"
56
+ end
57
+
58
+ { label: label, fontcolor: fontcolor, color: color, shape: shape }
200
59
  end
201
- }
202
-
203
- elsif object.is_a?(Dictionary)
204
-
205
- object.each_pair { |name, subobj|
206
-
207
- subobj = subobj.solve if subobj.is_a?(Reference)
208
-
209
- unless subobj.nil?
210
- fd << declare_edge("e#{id}", "n#{object.object_id}", "n#{subobj.object_id}", name.value)
211
- id = id + 1
60
+
61
+ add_edges = -> (fd, object) do
62
+ if object.is_a?(Array) or object.is_a?(ObjectStream)
63
+ object.each do |subobj|
64
+ fd << "\t#{object.object_id} -> #{subobj.solve.object_id}\n"
65
+ end
66
+
67
+ elsif object.is_a?(Dictionary)
68
+ object.each_pair do |name, subobj|
69
+ fd << "\t#{object.object_id} -> #{subobj.solve.object_id} "
70
+ fd << "[label=\"#{name.value}\",fontsize=9];\n"
71
+ end
72
+ end
73
+
74
+ if object.is_a?(Stream)
75
+ object.dictionary.each_pair do |key, value|
76
+ fd << "\t#{object.object_id} -> #{value.solve.object_id} "
77
+ fd << "[label=\"#{key.value}\",fontsize=9];\n"
78
+ end
79
+ end
80
+ end
81
+
82
+ graph_name = "PDF" if graph_name.nil? or graph_name.empty?
83
+ fd = File.open(path, "w")
84
+
85
+ begin
86
+ fd << "digraph #{graph_name} {\n\n"
87
+
88
+ objects = self.objects(include_keys: false).find_all{ |obj| not obj.is_a?(Reference) }
89
+
90
+ objects.each do |object|
91
+ attr = appearance[object]
92
+
93
+ fd << "\t#{object.object_id} "
94
+ fd << "[label=\"#{attr[:label]}\",shape=#{attr[:shape]},color=#{attr[:color]},style=filled,fontcolor=#{attr[:fontcolor]},fontsize=16];\n"
95
+
96
+ if object.is_a?(Stream)
97
+ object.dictionary.each do |value|
98
+ unless value.is_a?(Reference)
99
+ attr = appearance[value]
100
+ fd << "\t#{value.object_id} "
101
+ fd << "[label=\"#{attr[:label]}\",shape=#{attr[:shape]},color=#{attr[:color]},style=filled,fontcolor=#{attr[:fontcolor]},fontsize=16];\n"
102
+ end
103
+ end
104
+ end
105
+
106
+ add_edges.call(fd, object)
107
+ end
108
+
109
+ fd << "\n}"
110
+ ensure
111
+ fd.close
212
112
  end
213
- }
214
-
215
113
  end
216
-
217
- if object.is_a?(Stream)
218
-
219
- object.dictionary.each_pair { |key, value|
220
-
221
- value = value.solve if value.is_a?(Reference)
222
-
223
- unless value.nil?
224
- fd << declare_edge("e#{id}", "n#{object.object_id}", "n#{value.object_id}", key.value)
225
- id = id + 1
114
+
115
+ #
116
+ # Exports the document to a GraphML file.
117
+ # _filename_:: The path where to save the file.
118
+ #
119
+ def export_to_graphml(path)
120
+ require 'rexml/document'
121
+
122
+ declare_node = -> (id, attr) do
123
+ <<-XML
124
+ <node id="#{id}">
125
+ <data key="d0">
126
+ <y:ShapeNode>
127
+ <y:NodeLabel>#{attr[:label]}</y:NodeLabel>
128
+ </y:ShapeNode>
129
+ </data>
130
+ </node>
131
+ XML
132
+ end
133
+
134
+ declare_edge = -> (id, src, dest, label = nil) do
135
+ <<-XML
136
+ <edge id="#{id}" source="#{src}" target="#{dest}">
137
+ <data key="d1">
138
+ <y:PolyLineEdge>
139
+ <y:LineStyle type="line" width="1.0" color="#000000"/>
140
+ <y:Arrows source="none" target="standard"/>
141
+ <y:EdgeLabel>#{label.to_s}</y:EdgeLabel>
142
+ </y:PolyLineEdge>
143
+ </data>
144
+ </edge>
145
+ XML
146
+ end
147
+
148
+ appearance = -> (object) do
149
+ label = object.type.to_s
150
+ case object
151
+ when Catalog
152
+ fontcolor = "red"
153
+ color = "mistyrose"
154
+ shape = "doublecircle"
155
+ when Name, Number
156
+ label = object.value
157
+ fontcolor = "orange"
158
+ color = "lightgoldenrodyellow"
159
+ shape = "polygon"
160
+ when String
161
+ label = object.value if (object.ascii_only? and object.length <= 50)
162
+ fontcolor = "red"
163
+ color = "white"
164
+ shape = "polygon"
165
+ when Array
166
+ fontcolor = "green"
167
+ color = "lightcyan"
168
+ shape = "ellipse"
169
+ else
170
+ fontcolor = "blue"
171
+ color = "aliceblue"
172
+ shape = "ellipse"
173
+ end
174
+
175
+ { label: label, fontcolor: fontcolor, color: color, shape: shape }
176
+ end
177
+
178
+ add_edges = -> (xml, object, id) do
179
+ if object.is_a?(Array) or object.is_a?(ObjectStream)
180
+ object.each do |subobj|
181
+ xml << declare_edge["e#{id}", "n#{object.object_id}", "n#{subobj.solve.object_id}"]
182
+ id = id + 1
183
+ end
184
+
185
+ elsif object.is_a?(Dictionary)
186
+ object.each_pair do |name, subobj|
187
+ xml << declare_edge["e#{id}", "n#{object.object_id}", "n#{subobj.solve.object_id}",
188
+ name.value]
189
+ id = id + 1
190
+ end
191
+ end
192
+
193
+ if object.is_a?(Stream)
194
+ object.dictionary.each_pair do |key, value|
195
+ xml << declare_edge["e#{id}", "n#{object.object_id}", "n#{value.object_id}", key.value]
196
+ id = id + 1
197
+ end
198
+ end
199
+
200
+ id
201
+ end
202
+
203
+ graph_name = "PDF" if graph_name.nil? or graph_name.empty?
204
+
205
+ edge_nb = 1
206
+ xml = <<-XML
207
+ <?xml version="1.0" encoding="UTF-8"?>
208
+ <graphml xmlns="http://graphml.graphdrawing.org/xmlns/graphml"
209
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
210
+ xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns/graphml
211
+ http://www.yworks.com/xml/schema/graphml/1.0/ygraphml.xsd"
212
+ xmlns:y="http://www.yworks.com/xml/graphml">
213
+ <key id="d0" for="node" yfiles.type="nodegraphics"/>
214
+ <key id="d1" for="edge" yfiles.type="edgegraphics"/>
215
+ <graph id="#{graph_name}" edgedefault="directed">
216
+ XML
217
+
218
+ objects = self.objects(include_keys: false).find_all{ |obj| not obj.is_a?(Reference) }
219
+
220
+ objects.each do |object|
221
+ xml << declare_node["n#{object.object_id}", appearance[object]]
222
+
223
+ if object.is_a?(Stream)
224
+ object.dictionary.each do |value|
225
+ unless value.is_a?(Reference)
226
+ xml << declare_node[value.object_id, appearance[value]]
227
+ end
228
+ end
229
+ end
230
+
231
+ edge_nb = add_edges[xml, object, edge_nb]
232
+ end
233
+
234
+ xml << '</graph>' << "\n"
235
+ xml << '</graphml>'
236
+
237
+ doc = REXML::Document.new(xml)
238
+ formatter = REXML::Formatters::Pretty.new(4)
239
+ formatter.compact = true
240
+
241
+ File.open(path, "w") do |fd|
242
+ formatter.write(doc, fd)
226
243
  end
227
- }
228
-
229
244
  end
230
-
231
- id
232
- end
233
-
234
- @@edge_nb = 1
235
-
236
- graphname = "PDF" if graphname.nil? or graphname.empty?
237
-
238
- fd = File.open(filename, "w")
239
-
240
- edge_nb = 1
241
- begin
242
-
243
- fd << '<?xml version="1.0" encoding="UTF-8"?>' << "\n"
244
- fd << '<graphml xmlns="http://graphml.graphdrawing.org/xmlns/graphml"' << "\n"
245
- fd << ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' << "\n"
246
- fd << ' xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns/graphml ' << "\n"
247
- fd << ' http://www.yworks.com/xml/schema/graphml/1.0/ygraphml.xsd"' << "\n"
248
- fd << ' xmlns:y="http://www.yworks.com/xml/graphml">' << "\n"
249
- fd << '<key id="d0" for="node" yfiles.type="nodegraphics"/>' << "\n"
250
- fd << '<key id="d1" for="edge" yfiles.type="edgegraphics"/>' << "\n"
251
- fd << "<graph id=\"#{graphname}\" edgedefault=\"directed\">\n"
252
-
253
- objects = self.objects(:include_keys => false).find_all{ |obj| not obj.is_a?(Reference) }
254
-
255
- objects.each { |object|
256
-
257
- fd << declare_node("n#{object.object_id}", appearance(object))
258
-
259
- if object.is_a?(Stream)
260
-
261
- object.dictionary.each { |value|
262
-
263
- unless value.is_a?(Reference)
264
- fd << declare_node(value.object_id, appearance(value))
265
- end
266
- }
267
- end
268
-
269
- edge_nb = add_edges(self, fd, object, edge_nb)
270
- }
271
-
272
- fd << '</graph>' << "\n"
273
- fd << '</graphml>'
274
-
275
- ensure
276
- fd.close
277
- end
278
-
279
245
  end
280
246
 
281
- end
282
-
283
247
  end