origamindee 3.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 (139) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +89 -0
  3. data/COPYING.LESSER +165 -0
  4. data/README.md +131 -0
  5. data/bin/config/pdfcop.conf.yml +236 -0
  6. data/bin/pdf2pdfa +87 -0
  7. data/bin/pdf2ruby +333 -0
  8. data/bin/pdfcop +476 -0
  9. data/bin/pdfdecompress +97 -0
  10. data/bin/pdfdecrypt +91 -0
  11. data/bin/pdfencrypt +113 -0
  12. data/bin/pdfexplode +223 -0
  13. data/bin/pdfextract +277 -0
  14. data/bin/pdfmetadata +143 -0
  15. data/bin/pdfsh +12 -0
  16. data/bin/shell/console.rb +128 -0
  17. data/bin/shell/hexdump.rb +59 -0
  18. data/bin/shell/irbrc +69 -0
  19. data/examples/README.md +34 -0
  20. data/examples/attachments/attachment.rb +38 -0
  21. data/examples/attachments/nested_document.rb +51 -0
  22. data/examples/encryption/encryption.rb +28 -0
  23. data/examples/events/events.rb +72 -0
  24. data/examples/flash/flash.rb +37 -0
  25. data/examples/flash/helloworld.swf +0 -0
  26. data/examples/forms/javascript.rb +54 -0
  27. data/examples/forms/xfa.rb +115 -0
  28. data/examples/javascript/hello_world.rb +22 -0
  29. data/examples/javascript/js_emulation.rb +54 -0
  30. data/examples/loop/goto.rb +32 -0
  31. data/examples/loop/named.rb +33 -0
  32. data/examples/signature/signature.rb +65 -0
  33. data/examples/uri/javascript.rb +56 -0
  34. data/examples/uri/open-uri.rb +21 -0
  35. data/examples/uri/submitform.rb +47 -0
  36. data/lib/origami/3d.rb +364 -0
  37. data/lib/origami/acroform.rb +321 -0
  38. data/lib/origami/actions.rb +318 -0
  39. data/lib/origami/annotations.rb +711 -0
  40. data/lib/origami/array.rb +242 -0
  41. data/lib/origami/boolean.rb +90 -0
  42. data/lib/origami/catalog.rb +418 -0
  43. data/lib/origami/collections.rb +144 -0
  44. data/lib/origami/compound.rb +161 -0
  45. data/lib/origami/destinations.rb +252 -0
  46. data/lib/origami/dictionary.rb +192 -0
  47. data/lib/origami/encryption.rb +1084 -0
  48. data/lib/origami/extensions/fdf.rb +347 -0
  49. data/lib/origami/extensions/ppklite.rb +422 -0
  50. data/lib/origami/filespec.rb +197 -0
  51. data/lib/origami/filters/ascii.rb +211 -0
  52. data/lib/origami/filters/ccitt/tables.rb +267 -0
  53. data/lib/origami/filters/ccitt.rb +357 -0
  54. data/lib/origami/filters/crypt.rb +38 -0
  55. data/lib/origami/filters/dct.rb +54 -0
  56. data/lib/origami/filters/flate.rb +69 -0
  57. data/lib/origami/filters/jbig2.rb +57 -0
  58. data/lib/origami/filters/jpx.rb +47 -0
  59. data/lib/origami/filters/lzw.rb +170 -0
  60. data/lib/origami/filters/predictors.rb +292 -0
  61. data/lib/origami/filters/runlength.rb +129 -0
  62. data/lib/origami/filters.rb +364 -0
  63. data/lib/origami/font.rb +196 -0
  64. data/lib/origami/functions.rb +79 -0
  65. data/lib/origami/graphics/colors.rb +230 -0
  66. data/lib/origami/graphics/instruction.rb +98 -0
  67. data/lib/origami/graphics/path.rb +182 -0
  68. data/lib/origami/graphics/patterns.rb +174 -0
  69. data/lib/origami/graphics/render.rb +62 -0
  70. data/lib/origami/graphics/state.rb +149 -0
  71. data/lib/origami/graphics/text.rb +225 -0
  72. data/lib/origami/graphics/xobject.rb +918 -0
  73. data/lib/origami/graphics.rb +38 -0
  74. data/lib/origami/header.rb +75 -0
  75. data/lib/origami/javascript.rb +713 -0
  76. data/lib/origami/linearization.rb +330 -0
  77. data/lib/origami/metadata.rb +172 -0
  78. data/lib/origami/name.rb +135 -0
  79. data/lib/origami/null.rb +65 -0
  80. data/lib/origami/numeric.rb +181 -0
  81. data/lib/origami/obfuscation.rb +245 -0
  82. data/lib/origami/object.rb +760 -0
  83. data/lib/origami/optionalcontent.rb +183 -0
  84. data/lib/origami/outline.rb +54 -0
  85. data/lib/origami/outputintents.rb +85 -0
  86. data/lib/origami/page.rb +722 -0
  87. data/lib/origami/parser.rb +269 -0
  88. data/lib/origami/parsers/fdf.rb +56 -0
  89. data/lib/origami/parsers/pdf/lazy.rb +176 -0
  90. data/lib/origami/parsers/pdf/linear.rb +122 -0
  91. data/lib/origami/parsers/pdf.rb +118 -0
  92. data/lib/origami/parsers/ppklite.rb +57 -0
  93. data/lib/origami/pdf.rb +1108 -0
  94. data/lib/origami/reference.rb +134 -0
  95. data/lib/origami/signature.rb +702 -0
  96. data/lib/origami/stream.rb +705 -0
  97. data/lib/origami/string.rb +444 -0
  98. data/lib/origami/template/patterns.rb +56 -0
  99. data/lib/origami/template/widgets.rb +151 -0
  100. data/lib/origami/trailer.rb +190 -0
  101. data/lib/origami/tree.rb +62 -0
  102. data/lib/origami/version.rb +23 -0
  103. data/lib/origami/webcapture.rb +100 -0
  104. data/lib/origami/xfa/config.rb +453 -0
  105. data/lib/origami/xfa/connectionset.rb +146 -0
  106. data/lib/origami/xfa/datasets.rb +49 -0
  107. data/lib/origami/xfa/localeset.rb +42 -0
  108. data/lib/origami/xfa/package.rb +59 -0
  109. data/lib/origami/xfa/pdf.rb +73 -0
  110. data/lib/origami/xfa/signature.rb +42 -0
  111. data/lib/origami/xfa/sourceset.rb +43 -0
  112. data/lib/origami/xfa/stylesheet.rb +44 -0
  113. data/lib/origami/xfa/template.rb +1691 -0
  114. data/lib/origami/xfa/xdc.rb +42 -0
  115. data/lib/origami/xfa/xfa.rb +146 -0
  116. data/lib/origami/xfa/xfdf.rb +43 -0
  117. data/lib/origami/xfa/xmpmeta.rb +43 -0
  118. data/lib/origami/xfa.rb +62 -0
  119. data/lib/origami/xreftable.rb +557 -0
  120. data/lib/origami.rb +47 -0
  121. data/test/dataset/calc.pdf +85 -0
  122. data/test/dataset/crypto.pdf +36 -0
  123. data/test/dataset/empty.pdf +49 -0
  124. data/test/test_actions.rb +27 -0
  125. data/test/test_annotations.rb +68 -0
  126. data/test/test_forms.rb +30 -0
  127. data/test/test_native_types.rb +83 -0
  128. data/test/test_object_tree.rb +33 -0
  129. data/test/test_pages.rb +60 -0
  130. data/test/test_pdf.rb +20 -0
  131. data/test/test_pdf_attachment.rb +34 -0
  132. data/test/test_pdf_create.rb +24 -0
  133. data/test/test_pdf_encrypt.rb +102 -0
  134. data/test/test_pdf_parse.rb +134 -0
  135. data/test/test_pdf_parse_lazy.rb +69 -0
  136. data/test/test_pdf_sign.rb +97 -0
  137. data/test/test_streams.rb +184 -0
  138. data/test/test_xrefs.rb +67 -0
  139. metadata +280 -0
@@ -0,0 +1,190 @@
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
+ #
26
+ # Returns the current trailer.
27
+ # This might be either a Trailer or XRefStream.
28
+ #
29
+ def trailer
30
+ #
31
+ # First look for a standard trailer dictionary
32
+ #
33
+ if @revisions.last.trailer.dictionary?
34
+ trl = @revisions.last.trailer
35
+
36
+ #
37
+ # Otherwise look for a xref stream.
38
+ #
39
+ else
40
+ trl = @revisions.last.xrefstm
41
+ end
42
+
43
+ raise InvalidPDFError, "No trailer found" if trl.nil?
44
+
45
+ trl
46
+ end
47
+
48
+ private
49
+
50
+ def trailer_key?(attr) #:nodoc:
51
+ !!trailer_key(attr)
52
+ end
53
+
54
+ def trailer_key(attr) #:nodoc:
55
+ @revisions.reverse_each do |rev|
56
+ if rev.trailer.dictionary? and rev.trailer.key?(attr)
57
+ return rev.trailer[attr].solve
58
+ elsif rev.xrefstm?
59
+ xrefstm = rev.xrefstm
60
+ if xrefstm.is_a?(XRefStream) and xrefstm.key?(attr)
61
+ return xrefstm[attr].solve
62
+ end
63
+ end
64
+ end
65
+
66
+ nil
67
+ end
68
+
69
+ def generate_id
70
+ id = HexaString.new Random.new.bytes 16
71
+ self.trailer.ID = [ id, id ]
72
+ end
73
+ end
74
+
75
+ class InvalidTrailerError < Error #:nodoc:
76
+ end
77
+
78
+ # Forward declarations.
79
+ class Catalog < Dictionary; end
80
+ class Metadata < Dictionary; end
81
+
82
+ #
83
+ # Class representing a PDF file Trailer.
84
+ #
85
+ class Trailer
86
+ include StandardObject
87
+
88
+ TOKENS = %w{ trailer %%EOF } #:nodoc:
89
+ XREF_TOKEN = "startxref" #:nodoc:
90
+
91
+ @@regexp_open = Regexp.new(WHITESPACES + TOKENS.first + WHITESPACES)
92
+ @@regexp_xref = Regexp.new(WHITESPACES + XREF_TOKEN + WHITESPACES + "(?<startxref>\\d+)")
93
+ @@regexp_close = Regexp.new(WHITESPACES + TOKENS.last + WHITESPACES)
94
+
95
+ attr_accessor :document
96
+ attr_accessor :startxref
97
+ attr_reader :dictionary
98
+
99
+ field :Size, :Type => Integer, :Required => true
100
+ field :Prev, :Type => Integer
101
+ field :Root, :Type => Catalog, :Required => true
102
+ field :Encrypt, :Type => Encryption::Standard::Dictionary
103
+ field :Info, :Type => Metadata
104
+ field :ID, :Type => Array.of(String, length: 2)
105
+ field :XRefStm, :Type => Integer
106
+
107
+ #
108
+ # Creates a new Trailer.
109
+ # _startxref_:: The file _offset_ to the XRef::Section.
110
+ # _dictionary_:: A hash of attributes to set in the Trailer Dictionary.
111
+ #
112
+ def initialize(startxref = 0, dictionary = {})
113
+ @startxref, self.dictionary = startxref, dictionary && Dictionary.new(dictionary)
114
+ end
115
+
116
+ def self.parse(stream, parser = nil) #:nodoc:
117
+ scanner = Parser.init_scanner(stream)
118
+
119
+ if scanner.skip(@@regexp_open)
120
+ dictionary = Dictionary.parse(scanner, parser)
121
+ else
122
+ dictionary = nil
123
+ end
124
+
125
+ if not scanner.scan(@@regexp_xref)
126
+ raise InvalidTrailerError, "Cannot get startxref value"
127
+ end
128
+
129
+ startxref = scanner['startxref'].to_i
130
+
131
+ if not scanner.scan(@@regexp_close)
132
+ parser.warn("No %%EOF token found") if parser
133
+ end
134
+
135
+ Trailer.new(startxref, dictionary)
136
+ end
137
+
138
+ #
139
+ # Returns true if the specified key is present in the Trailer dictionary.
140
+ #
141
+ def key?(key)
142
+ self.dictionary? and @dictionary.key?(key)
143
+ end
144
+
145
+ #
146
+ # Access a key in the trailer dictionary if present.
147
+ #
148
+ def [](key)
149
+ @dictionary[key] if dictionary?
150
+ end
151
+
152
+ #
153
+ # Sets a value in the trailer dictionary.
154
+ #
155
+ def []=(key, value)
156
+ self.dictionary = Dictionary.new unless dictionary?
157
+ @dictionary[key] = value
158
+ end
159
+
160
+ #
161
+ # Sets the trailer dictionary.
162
+ #
163
+ def dictionary=(dict)
164
+ dict.parent = self if dict
165
+ @dictionary = dict
166
+ end
167
+
168
+ #
169
+ # Returns true if the Trailer contains a Dictionary.
170
+ #
171
+ def dictionary?
172
+ not @dictionary.nil?
173
+ end
174
+
175
+ #
176
+ # Outputs self into PDF code.
177
+ #
178
+ def to_s(indent: 1, eol: $/)
179
+ content = ""
180
+ if self.dictionary?
181
+ content << TOKENS.first << eol << @dictionary.to_s(indent: indent, eol: eol) << eol
182
+ end
183
+
184
+ content << XREF_TOKEN << eol << @startxref.to_s << eol << TOKENS.last << eol
185
+
186
+ content
187
+ end
188
+ end
189
+
190
+ end
@@ -0,0 +1,62 @@
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 InvalidNameTreeError < Error #:nodoc:
24
+ end
25
+
26
+ #
27
+ # Class representing a node in a Name tree.
28
+ #
29
+ class NameTreeNode < Dictionary
30
+ include StandardObject
31
+
32
+ field :Kids, :Type => Array.of(self)
33
+ field :Names, :Type => Array.of(String, Object)
34
+ field :Limits, :Type => Array.of(String, length: 2)
35
+
36
+ def self.of(klass)
37
+ return Class.new(self) do
38
+ field :Kids, :Type => Array.of(self)
39
+ field :Names, :Type => Array.of(String, klass)
40
+ end
41
+ end
42
+ end
43
+
44
+ #
45
+ # Class representing a node in a Number tree.
46
+ #
47
+ class NumberTreeNode < Dictionary
48
+ include StandardObject
49
+
50
+ field :Kids, :Type => Array.of(self)
51
+ field :Nums, :Type => Array.of(Number, Object)
52
+ field :Limits, :Type => Array.of(Number, length: 2)
53
+
54
+ def self.of(klass)
55
+ return Class.new(self) do
56
+ field :Kids, :Type => Array.of(self)
57
+ field :Nums, :Type => Array.of(Number, klass)
58
+ end
59
+ end
60
+ end
61
+
62
+ end
@@ -0,0 +1,23 @@
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
+ VERSION = "3.0.0"
23
+ end
@@ -0,0 +1,100 @@
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
+ module WebCapture
24
+
25
+ class CommandSettings < Dictionary
26
+ include StandardObject
27
+
28
+ field :G, :Type => Dictionary
29
+ field :C, :Type => Dictionary
30
+ end
31
+
32
+ class Command < Dictionary
33
+ include StandardObject
34
+
35
+ module Flags
36
+ SAMESITE = 1 << 1
37
+ SAMEPATH = 1 << 2
38
+ SUBMIT = 1 << 3
39
+ end
40
+
41
+ field :URL, :Type => String, :Required => true
42
+ field :L, :Type => Integer, :Default => 1
43
+ field :F, :Type => Integer, :Default => 0
44
+ field :P, :Type => [ String, Stream ]
45
+ field :CT, :Type => String, :Default => "application/x-www-form-urlencoded"
46
+ field :H, :Type => String
47
+ field :S, :Type => CommandSettings
48
+ end
49
+
50
+ class SourceInformation < Dictionary
51
+ include StandardObject
52
+
53
+ module SubmissionType
54
+ NOFORM = 0
55
+ GETFORM = 1
56
+ POSTFORM = 2
57
+ end
58
+
59
+ field :AU, :Type => [ String, Dictionary ], :Required => true
60
+ field :TS, :Type => String
61
+ field :E, :Type => String
62
+ field :S, :Type => Integer, :Default => 0
63
+ field :C, :Type => Command
64
+ end
65
+
66
+ class SpiderInfo < Dictionary
67
+ include StandardObject
68
+
69
+ field :V, :Type => Real, :Default => 1.0, :Version => "1.3", :Required => true
70
+ field :C, :Type => Array.of(Command)
71
+ end
72
+
73
+ class ContentSet < Dictionary
74
+ include StandardObject
75
+
76
+ PAGE_SET = :SPS
77
+ IMAGE_SET = :SIS
78
+
79
+ field :Type, :Type => Name, :Default => :SpiderContentSet
80
+ field :S, :Type => Name, :Required => true
81
+ field :ID, :Type => String, :Required => true
82
+ field :O, :Type => Array, :Required => true
83
+ field :SI, :Type => [ SourceInformation, Array.of(SourceInformation) ], :Required => true
84
+ field :CT, :Type => String
85
+ field :TS, :Type => String
86
+ end
87
+
88
+ class PageContentSet < ContentSet
89
+ field :S, :Type => Name, :Default => ContentSet::PAGE_SET, :Required => true
90
+ field :T, :Type => String
91
+ field :TID, :Type => String
92
+ end
93
+
94
+ class ImageContentSet < ContentSet
95
+ field :S, :Type => Name, :Default => ContentSet::IMAGE_SET, :Required => true
96
+ field :R, :Type => [ Integer, Array.of(Integer) ], :Required => true
97
+ end
98
+ end
99
+
100
+ end