origami-docspring 2.2.0 → 2.3.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 (118) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/examples/attachments/attachment.rb +7 -8
  4. data/examples/attachments/nested_document.rb +6 -5
  5. data/examples/encryption/encryption.rb +5 -4
  6. data/examples/events/events.rb +7 -6
  7. data/examples/flash/flash.rb +10 -9
  8. data/examples/forms/javascript.rb +14 -13
  9. data/examples/forms/xfa.rb +67 -66
  10. data/examples/javascript/hello_world.rb +6 -5
  11. data/examples/javascript/js_emulation.rb +26 -26
  12. data/examples/loop/goto.rb +12 -11
  13. data/examples/loop/named.rb +17 -16
  14. data/examples/signature/signature.rb +11 -11
  15. data/examples/uri/javascript.rb +25 -24
  16. data/examples/uri/open-uri.rb +5 -4
  17. data/examples/uri/submitform.rb +11 -10
  18. data/lib/origami/3d.rb +330 -334
  19. data/lib/origami/acroform.rb +267 -268
  20. data/lib/origami/actions.rb +266 -278
  21. data/lib/origami/annotations.rb +659 -670
  22. data/lib/origami/array.rb +192 -196
  23. data/lib/origami/boolean.rb +66 -70
  24. data/lib/origami/catalog.rb +360 -363
  25. data/lib/origami/collections.rb +132 -133
  26. data/lib/origami/compound.rb +125 -129
  27. data/lib/origami/destinations.rb +226 -237
  28. data/lib/origami/dictionary.rb +155 -154
  29. data/lib/origami/encryption.rb +967 -923
  30. data/lib/origami/extensions/fdf.rb +270 -275
  31. data/lib/origami/extensions/ppklite.rb +323 -328
  32. data/lib/origami/filespec.rb +170 -173
  33. data/lib/origami/filters/ascii.rb +162 -167
  34. data/lib/origami/filters/ccitt/tables.rb +248 -252
  35. data/lib/origami/filters/ccitt.rb +309 -312
  36. data/lib/origami/filters/crypt.rb +31 -34
  37. data/lib/origami/filters/dct.rb +47 -50
  38. data/lib/origami/filters/flate.rb +57 -60
  39. data/lib/origami/filters/jbig2.rb +50 -53
  40. data/lib/origami/filters/jpx.rb +40 -43
  41. data/lib/origami/filters/lzw.rb +151 -155
  42. data/lib/origami/filters/predictors.rb +250 -255
  43. data/lib/origami/filters/runlength.rb +111 -115
  44. data/lib/origami/filters.rb +319 -325
  45. data/lib/origami/font.rb +173 -177
  46. data/lib/origami/functions.rb +62 -66
  47. data/lib/origami/graphics/colors.rb +203 -208
  48. data/lib/origami/graphics/instruction.rb +79 -81
  49. data/lib/origami/graphics/path.rb +141 -144
  50. data/lib/origami/graphics/patterns.rb +156 -160
  51. data/lib/origami/graphics/render.rb +51 -47
  52. data/lib/origami/graphics/state.rb +144 -142
  53. data/lib/origami/graphics/text.rb +185 -188
  54. data/lib/origami/graphics/xobject.rb +818 -804
  55. data/lib/origami/graphics.rb +25 -26
  56. data/lib/origami/header.rb +63 -65
  57. data/lib/origami/javascript.rb +718 -651
  58. data/lib/origami/linearization.rb +284 -285
  59. data/lib/origami/metadata.rb +156 -135
  60. data/lib/origami/name.rb +98 -100
  61. data/lib/origami/null.rb +49 -51
  62. data/lib/origami/numeric.rb +133 -135
  63. data/lib/origami/obfuscation.rb +180 -182
  64. data/lib/origami/object.rb +634 -631
  65. data/lib/origami/optionalcontent.rb +147 -149
  66. data/lib/origami/outline.rb +46 -48
  67. data/lib/origami/outputintents.rb +76 -77
  68. data/lib/origami/page.rb +637 -596
  69. data/lib/origami/parser.rb +214 -221
  70. data/lib/origami/parsers/fdf.rb +44 -45
  71. data/lib/origami/parsers/pdf/lazy.rb +147 -154
  72. data/lib/origami/parsers/pdf/linear.rb +104 -109
  73. data/lib/origami/parsers/pdf.rb +109 -107
  74. data/lib/origami/parsers/ppklite.rb +44 -46
  75. data/lib/origami/pdf.rb +886 -896
  76. data/lib/origami/reference.rb +116 -120
  77. data/lib/origami/signature.rb +617 -625
  78. data/lib/origami/stream.rb +560 -558
  79. data/lib/origami/string.rb +366 -368
  80. data/lib/origami/template/patterns.rb +50 -52
  81. data/lib/origami/template/widgets.rb +111 -114
  82. data/lib/origami/trailer.rb +153 -157
  83. data/lib/origami/tree.rb +55 -57
  84. data/lib/origami/version.rb +19 -19
  85. data/lib/origami/webcapture.rb +87 -90
  86. data/lib/origami/xfa/config.rb +409 -414
  87. data/lib/origami/xfa/connectionset.rb +113 -117
  88. data/lib/origami/xfa/datasets.rb +38 -42
  89. data/lib/origami/xfa/localeset.rb +33 -37
  90. data/lib/origami/xfa/package.rb +49 -52
  91. data/lib/origami/xfa/pdf.rb +54 -59
  92. data/lib/origami/xfa/signature.rb +33 -37
  93. data/lib/origami/xfa/sourceset.rb +34 -38
  94. data/lib/origami/xfa/stylesheet.rb +35 -39
  95. data/lib/origami/xfa/template.rb +1630 -1634
  96. data/lib/origami/xfa/xdc.rb +33 -37
  97. data/lib/origami/xfa/xfa.rb +132 -123
  98. data/lib/origami/xfa/xfdf.rb +34 -38
  99. data/lib/origami/xfa/xmpmeta.rb +34 -38
  100. data/lib/origami/xfa.rb +50 -53
  101. data/lib/origami/xreftable.rb +462 -462
  102. data/lib/origami.rb +37 -38
  103. data/test/test_actions.rb +22 -20
  104. data/test/test_annotations.rb +54 -52
  105. data/test/test_forms.rb +23 -21
  106. data/test/test_native_types.rb +82 -78
  107. data/test/test_object_tree.rb +25 -24
  108. data/test/test_pages.rb +43 -41
  109. data/test/test_pdf.rb +2 -0
  110. data/test/test_pdf_attachment.rb +23 -21
  111. data/test/test_pdf_create.rb +16 -15
  112. data/test/test_pdf_encrypt.rb +69 -66
  113. data/test/test_pdf_parse.rb +131 -129
  114. data/test/test_pdf_parse_lazy.rb +53 -53
  115. data/test/test_pdf_sign.rb +67 -67
  116. data/test/test_streams.rb +145 -143
  117. data/test/test_xrefs.rb +46 -45
  118. metadata +64 -8
@@ -1,118 +1,120 @@
1
- =begin
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # This file is part of Origami, PDF manipulation framework for Ruby
5
+ # Copyright (C) 2016 Guillaume Delugré.
6
+ #
7
+ # Origami is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # Origami is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with Origami. If not, see <http://www.gnu.org/licenses/>.
19
+ #
2
20
 
3
- This file is part of Origami, PDF manipulation framework for Ruby
4
- Copyright (C) 2016 Guillaume Delugré.
21
+ require 'origami/parser'
5
22
 
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.
23
+ module Origami
24
+ class PDF
25
+ class Parser < Origami::Parser
26
+ def initialize(params = {})
27
+ options =
28
+ {
29
+ decrypt: true, # Attempt to decrypt to document if encrypted (recommended).
30
+ password: '', # Default password being tried when opening a protected document.
31
+ prompt_password: lambda do # Callback procedure to prompt password when document is encrypted.
32
+ require 'io/console'
33
+ $stderr.print "Password: "
34
+ $stdin.noecho(&:gets).chomp
35
+ rescue Errno::ENODEV, LoadError
36
+ # If we can't use noecho (e.g., in a non-interactive environment)
37
+ $stderr.print "Password (will be visible): "
38
+ $stdin.gets.chomp
39
+ end,
40
+ force: false # Force PDF header detection
41
+ }.update(params)
42
+
43
+ super(options)
44
+ end
45
+
46
+ private
47
+
48
+ def parse_initialize # :nodoc:
49
+ if @options[:force] == true
50
+ @data.skip_until(/%PDF-/).nil?
51
+ @data.pos = @data.pos - 5
52
+ end
10
53
 
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.
54
+ pdf = PDF.new(self)
15
55
 
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/>.
56
+ info "...Reading header..."
57
+ begin
58
+ pdf.header = PDF::Header.parse(@data)
59
+ @options[:callback].call(pdf.header)
60
+ rescue InvalidHeaderError
61
+ raise unless @options[:ignore_errors]
62
+ warn "PDF header is invalid, ignoring..."
63
+ end
18
64
 
19
- =end
65
+ pdf
66
+ end
20
67
 
21
- require 'origami/parser'
68
+ def parse_finalize(pdf) # :nodoc:
69
+ cast_trailer_objects(pdf)
22
70
 
23
- module Origami
71
+ warn "This file has been linearized." if pdf.linearized?
72
+
73
+ propagate_types(pdf) if Origami::OPTIONS[:enable_type_propagation]
74
+
75
+ #
76
+ # Decrypt encrypted file contents
77
+ #
78
+ if pdf.encrypted?
79
+ warn "This document contains encrypted data!"
24
80
 
25
- class PDF
26
- class Parser < Origami::Parser
27
- def initialize(params = {})
28
- options =
29
- {
30
- decrypt: true, # Attempt to decrypt to document if encrypted (recommended).
31
- password: '', # Default password being tried when opening a protected document.
32
- prompt_password: lambda do # Callback procedure to prompt password when document is encrypted.
33
- require 'io/console'
34
- STDERR.print "Password: "
35
- STDIN.noecho(&:gets).chomp
36
- end,
37
- force: false # Force PDF header detection
38
- }.update(params)
39
-
40
- super(options)
41
- end
42
-
43
- private
44
-
45
- def parse_initialize #:nodoc:
46
- if @options[:force] == true
47
- @data.skip_until(/%PDF-/).nil?
48
- @data.pos = @data.pos - 5
49
- end
50
-
51
- pdf = PDF.new(self)
52
-
53
- info "...Reading header..."
54
- begin
55
- pdf.header = PDF::Header.parse(@data)
56
- @options[:callback].call(pdf.header)
57
- rescue InvalidHeaderError
58
- raise unless @options[:ignore_errors]
59
- warn "PDF header is invalid, ignoring..."
60
- end
61
-
62
- pdf
63
- end
64
-
65
- def parse_finalize(pdf) #:nodoc:
66
- cast_trailer_objects(pdf)
67
-
68
- warn "This file has been linearized." if pdf.linearized?
69
-
70
- propagate_types(pdf) if Origami::OPTIONS[:enable_type_propagation]
71
-
72
- #
73
- # Decrypt encrypted file contents
74
- #
75
- if pdf.encrypted?
76
- warn "This document contains encrypted data!"
77
-
78
- decrypt_document(pdf) if @options[:decrypt]
79
- end
80
-
81
- warn "This document has been signed!" if pdf.signed?
82
-
83
- pdf
84
- end
85
-
86
- def cast_trailer_objects(pdf) #:nodoc:
87
- trailer = pdf.trailer
88
-
89
- if trailer[:Root].is_a?(Reference)
90
- pdf.cast_object(trailer[:Root], Catalog)
91
- end
92
-
93
- if trailer[:Info].is_a?(Reference)
94
- pdf.cast_object(trailer[:Info], Metadata)
95
- end
96
-
97
- if trailer[:Encrypt].is_a?(Reference)
98
- pdf.cast_object(trailer[:Encrypt], Encryption::Standard::Dictionary)
99
- end
100
- end
101
-
102
- def decrypt_document(pdf) #:nodoc:
103
- passwd = @options[:password]
104
- begin
105
- pdf.decrypt(passwd)
106
- rescue EncryptionInvalidPasswordError
107
- if passwd.empty?
108
- passwd = @options[:prompt_password].call
109
- retry unless passwd.empty?
110
- end
111
-
112
- raise
113
- end
114
- end
81
+ decrypt_document(pdf) if @options[:decrypt]
115
82
  end
116
- end
117
83
 
84
+ warn "This document has been signed!" if pdf.signed?
85
+
86
+ pdf
87
+ end
88
+
89
+ def cast_trailer_objects(pdf) # :nodoc:
90
+ trailer = pdf.trailer
91
+
92
+ if trailer[:Root].is_a?(Reference)
93
+ pdf.cast_object(trailer[:Root], Catalog)
94
+ end
95
+
96
+ if trailer[:Info].is_a?(Reference)
97
+ pdf.cast_object(trailer[:Info], Metadata)
98
+ end
99
+
100
+ if trailer[:Encrypt].is_a?(Reference)
101
+ pdf.cast_object(trailer[:Encrypt], Encryption::Standard::Dictionary)
102
+ end
103
+ end
104
+
105
+ def decrypt_document(pdf) # :nodoc:
106
+ passwd = @options[:password]
107
+ begin
108
+ pdf.decrypt(passwd)
109
+ rescue EncryptionInvalidPasswordError
110
+ if passwd.empty?
111
+ passwd = @options[:prompt_password].call
112
+ retry unless passwd.empty?
113
+ end
114
+
115
+ raise
116
+ end
117
+ end
118
+ end
119
+ end
118
120
  end
@@ -1,57 +1,55 @@
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
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # This file is part of Origami, PDF manipulation framework for Ruby
5
+ # Copyright (C) 2016 Guillaume Delugré.
6
+ #
7
+ # Origami is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # Origami is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with Origami. If not, see <http://www.gnu.org/licenses/>.
19
+ #
20
20
 
21
21
  require 'origami/parser'
22
22
 
23
23
  module Origami
24
+ class PPKLite
25
+ class Parser < Origami::Parser
26
+ def parse(stream) # :nodoc:
27
+ super
28
+
29
+ address_book = PPKLite.new(self)
30
+ address_book.header = PPKLite::Header.parse(@data)
31
+ @options[:callback].call(address_book.header)
32
+
33
+ loop do
34
+ break if (object = parse_object).nil?
35
+ address_book.insert(object)
36
+ end
24
37
 
25
- class PPKLite
26
-
27
- class Parser < Origami::Parser
28
- def parse(stream) #:nodoc:
29
- super
30
-
31
- address_book = PPKLite.new(self)
32
- address_book.header = PPKLite::Header.parse(@data)
33
- @options[:callback].call(address_book.header)
34
-
35
- loop do
36
- break if (object = parse_object).nil?
37
- address_book.insert(object)
38
- end
39
-
40
- address_book.revisions.first.xreftable = parse_xreftable
41
- address_book.revisions.first.trailer = parse_trailer
42
-
43
- if Origami::OPTIONS[:enable_type_propagation]
44
- trailer = address_book.revisions.first.trailer
38
+ address_book.revisions.first.xreftable = parse_xreftable
39
+ address_book.revisions.first.trailer = parse_trailer
45
40
 
46
- if trailer[:Root].is_a?(Reference)
47
- address_book.cast_object(trailer[:Root], PPKLite::Catalog)
48
- end
41
+ if Origami::OPTIONS[:enable_type_propagation]
42
+ trailer = address_book.revisions.first.trailer
49
43
 
50
- propagate_types(address_book)
51
- end
44
+ if trailer[:Root].is_a?(Reference)
45
+ address_book.cast_object(trailer[:Root], PPKLite::Catalog)
46
+ end
52
47
 
53
- address_book
54
- end
48
+ propagate_types(address_book)
55
49
  end
50
+
51
+ address_book
52
+ end
56
53
  end
54
+ end
57
55
  end