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,225 +1,222 @@
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
+ module Origami
22
+ module Text
23
+ OPERATORS =
24
+ [
25
+ 'Tc', 'Tw', 'Tz', 'TL', 'Tf', 'Tr', 'Ts', # Text state
26
+ 'BT', 'ET', # Text objects
27
+ 'Td', 'TD', 'Tm', 'T*', # Positioning
28
+ 'Tj', "'", '"', 'TJ' # Showing
29
+ ]
30
+
31
+ module Rendering
32
+ FILL = 0
33
+ STROKE = 1
34
+ FILL_AND_STROKE = 2
35
+ INVISIBLE = 3
36
+ FILL_AND_CLIP = 4
37
+ STROKE_AND_CLIP = 5
38
+ FILL_AND_STROKE_AND_CLIP = 6
39
+ CLIP = 7
40
+ end
5
41
 
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.
42
+ class TextStateError < Error # :nodoc:
43
+ end
10
44
 
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.
45
+ class State
46
+ attr_accessor :char_spacing, :word_spacing, :scaling, :leading
47
+ attr_accessor :font, :font_size
48
+ attr_accessor :rendering_mode
49
+ attr_accessor :text_rise, :text_knockout
50
+
51
+ attr_accessor :text_matrix, :text_line_matrix, :text_rendering_matrix
52
+
53
+ def initialize
54
+ reset
55
+ end
56
+
57
+ def reset
58
+ @char_spacing = 0
59
+ @word_spacing = 0
60
+ @scaling = 100
61
+ @leading = 0
62
+ @font = nil
63
+ @font_size = nil
64
+ @rendering_mode = Rendering::FILL
65
+ @text_rise = 0
66
+ @text_knockout = true
15
67
 
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/>.
68
+ #
69
+ # Text objects
70
+ #
18
71
 
19
- =end
72
+ @text_object = false
73
+ @text_matrix =
74
+ @text_line_matrix =
75
+ @text_rendering_matrix = nil
76
+ end
20
77
 
21
- module Origami
78
+ def is_in_text_object?
79
+ @text_object
80
+ end
22
81
 
23
- module Text
24
-
25
- OPERATORS =
26
- [
27
- 'Tc', 'Tw', 'Tz', 'TL', 'Tf', 'Tr', 'Ts', # Text state
28
- 'BT', 'ET', # Text objects
29
- 'Td', 'TD', 'Tm', 'T*', # Positioning
30
- 'Tj', "'", '"', 'TJ' # Showing
31
- ]
32
-
33
- module Rendering
34
- FILL = 0
35
- STROKE = 1
36
- FILL_AND_STROKE = 2
37
- INVISIBLE = 3
38
- FILL_AND_CLIP = 4
39
- STROKE_AND_CLIP = 5
40
- FILL_AND_STROKE_AND_CLIP = 6
41
- CLIP = 7
82
+ def begin_text_object
83
+ if is_in_text_object?
84
+ raise TextStateError, "Cannot start a text object within an existing text object."
42
85
  end
43
86
 
44
- class TextStateError < Error #:nodoc:
45
- end
87
+ @text_object = true
88
+ @text_matrix =
89
+ @text_line_matrix =
90
+ @text_rendering_matrix = Matrix.identity(3)
91
+ end
46
92
 
47
- class State
48
- attr_accessor :char_spacing, :word_spacing, :scaling, :leading
49
- attr_accessor :font, :font_size
50
- attr_accessor :rendering_mode
51
- attr_accessor :text_rise, :text_knockout
52
-
53
- attr_accessor :text_matrix, :text_line_matrix, :text_rendering_matrix
54
-
55
- def initialize
56
- self.reset
57
- end
58
-
59
- def reset
60
- @char_spacing = 0
61
- @word_spacing = 0
62
- @scaling = 100
63
- @leading = 0
64
- @font = nil
65
- @font_size = nil
66
- @rendering_mode = Rendering::FILL
67
- @text_rise = 0
68
- @text_knockout = true
69
-
70
- #
71
- # Text objects
72
- #
73
-
74
- @text_object = false
75
- @text_matrix =
76
- @text_line_matrix =
77
- @text_rendering_matrix = nil
78
- end
79
-
80
- def is_in_text_object?
81
- @text_object
82
- end
83
-
84
- def begin_text_object
85
- if is_in_text_object?
86
- raise TextStateError, "Cannot start a text object within an existing text object."
87
- end
88
-
89
- @text_object = true
90
- @text_matrix =
91
- @text_line_matrix =
92
- @text_rendering_matrix = Matrix.identity(3)
93
- end
94
-
95
- def end_text_object
96
- unless is_in_text_object?
97
- raise TextStateError, "Cannot end text object : no previous text object has begun."
98
- end
99
-
100
- @text_object = false
101
- @text_matrix =
102
- @text_line_matrix =
103
- @text_rendering_matrix = nil
104
- end
105
- end #class State
106
- end #module Text
107
-
108
- class PDF::Instruction
109
- #
110
- # Text instructions definitions
111
- #
112
- insn 'Tc', Real do |canvas, cS| canvas.gs.text_state.char_spacing = cS end
113
- insn 'Tw', Real do |canvas, wS| canvas.gs.text_state.word_spacing = wS end
114
- insn 'Tz', Real do |canvas, s| canvas.gs.text_state.scaling = s end
115
- insn 'TL', Real do |canvas, l| canvas.gs.text_state.leading = l end
116
-
117
- insn 'Tf', Name, Real do |canvas, font, size|
118
- canvas.gs.text_state.font = font
119
- canvas.gs.text_state.font_size = size
93
+ def end_text_object
94
+ unless is_in_text_object?
95
+ raise TextStateError, "Cannot end text object : no previous text object has begun."
120
96
  end
121
97
 
122
- insn 'Tr', Integer do |canvas, r| canvas.gs.text_state.rendering_mode = r end
123
- insn 'Ts', Real do |canvas, s| canvas.gs.text_state.text_rise = s end
124
- insn 'BT' do |canvas| canvas.gs.text_state.begin_text_object end
125
- insn 'ET' do |canvas| canvas.gs.text_state.end_text_object end
98
+ @text_object = false
99
+ @text_matrix =
100
+ @text_line_matrix =
101
+ @text_rendering_matrix = nil
102
+ end
103
+ end # class State
104
+ end # module Text
105
+
106
+ class PDF::Instruction
107
+ #
108
+ # Text instructions definitions
109
+ #
110
+ insn 'Tc', Real do |canvas, cS| canvas.gs.text_state.char_spacing = cS end
111
+ insn 'Tw', Real do |canvas, wS| canvas.gs.text_state.word_spacing = wS end
112
+ insn 'Tz', Real do |canvas, s| canvas.gs.text_state.scaling = s end
113
+ insn 'TL', Real do |canvas, l| canvas.gs.text_state.leading = l end
114
+
115
+ insn 'Tf', Name, Real do |canvas, font, size|
116
+ canvas.gs.text_state.font = font
117
+ canvas.gs.text_state.font_size = size
118
+ end
126
119
 
127
- insn 'Td', Real, Real do |canvas, tx, ty|
128
- unless canvas.gs.text_state.is_in_text_object?
129
- raise TextStateError, "Must be in a text object to use operator : Td"
130
- end
120
+ insn 'Tr', Integer do |canvas, r| canvas.gs.text_state.rendering_mode = r end
121
+ insn 'Ts', Real do |canvas, s| canvas.gs.text_state.text_rise = s end
122
+ insn 'BT' do |canvas| canvas.gs.text_state.begin_text_object end
123
+ insn 'ET' do |canvas| canvas.gs.text_state.end_text_object end
131
124
 
132
- canvas.gs.text_state.text_matrix =
133
- canvas.gs.text_state.text_line_matrix =
134
- Matrix.rows([[1,0,0],[0,1,0],[tx, ty, 1]]) * canvas.gs.text_state.text_line_matrix
135
- end
125
+ insn 'Td', Real, Real do |canvas, tx, ty|
126
+ unless canvas.gs.text_state.is_in_text_object?
127
+ raise TextStateError, "Must be in a text object to use operator : Td"
128
+ end
136
129
 
137
- insn 'TD', Real, Real do |canvas, tx, ty|
138
- unless canvas.gs.text_state.is_in_text_object?
139
- raise TextStateError, "Must be in a text object to use operator : TD"
140
- end
130
+ canvas.gs.text_state.text_matrix =
131
+ canvas.gs.text_state.text_line_matrix =
132
+ Matrix.rows([[1, 0, 0], [0, 1, 0], [tx, ty, 1]]) * canvas.gs.text_state.text_line_matrix
133
+ end
141
134
 
142
- canvas.gs.text_state.leading = -ty
135
+ insn 'TD', Real, Real do |canvas, tx, ty|
136
+ unless canvas.gs.text_state.is_in_text_object?
137
+ raise TextStateError, "Must be in a text object to use operator : TD"
138
+ end
143
139
 
144
- canvas.gs.text_state.text_matrix =
145
- canvas.gs.text_state.text_line_matrix =
146
- Matrix.rows([[1,0,0],[0,1,0],[tx,ty,1]]) * canvas.gs.text_state.text_line_matrix
147
- end
140
+ canvas.gs.text_state.leading = -ty
148
141
 
149
- insn 'Tm', Real, Real, Real, Real, Real, Real do |canvas, a, b, c, d, e, f|
150
- unless canvas.gs.text_state.is_in_text_object?
151
- raise TextStateError, "Must be in a text object to use operator : Tm"
152
- end
142
+ canvas.gs.text_state.text_matrix =
143
+ canvas.gs.text_state.text_line_matrix =
144
+ Matrix.rows([[1, 0, 0], [0, 1, 0], [tx, ty, 1]]) * canvas.gs.text_state.text_line_matrix
145
+ end
153
146
 
154
- canvas.gs.text_state.text_matrix =
155
- canvas.gs.text_state.text_line_matrix =
156
- Matrix.rows([[a,b,0],[c,d,0],[e,f,1]])
157
- end
147
+ insn 'Tm', Real, Real, Real, Real, Real, Real do |canvas, a, b, c, d, e, f|
148
+ unless canvas.gs.text_state.is_in_text_object?
149
+ raise TextStateError, "Must be in a text object to use operator : Tm"
150
+ end
158
151
 
159
- insn 'T*' do |canvas|
160
- unless canvas.gs.text_state.is_in_text_object?
161
- raise TextStateError, "Must be in a text object to use operator : T*"
162
- end
152
+ canvas.gs.text_state.text_matrix =
153
+ canvas.gs.text_state.text_line_matrix =
154
+ Matrix.rows([[a, b, 0], [c, d, 0], [e, f, 1]])
155
+ end
163
156
 
164
- tx, ty = 0, -canvas.gs.text_state.leading
157
+ insn 'T*' do |canvas|
158
+ unless canvas.gs.text_state.is_in_text_object?
159
+ raise TextStateError, "Must be in a text object to use operator : T*"
160
+ end
165
161
 
166
- canvas.gs.text_state.text_matrix =
167
- canvas.gs.text_state.text_line_matrix =
168
- Matrix.rows([[1,0,0],[0,1,0],[tx, ty, 1]]) * canvas.gs.text_state.text_line_matrix
169
- end
162
+ tx, ty = 0, -canvas.gs.text_state.leading
170
163
 
171
- insn 'Tj', String do |canvas, s|
172
- unless canvas.gs.text_state.is_in_text_object?
173
- raise TextStateError, "Must be in a text object to use operator : Tj"
174
- end
164
+ canvas.gs.text_state.text_matrix =
165
+ canvas.gs.text_state.text_line_matrix =
166
+ Matrix.rows([[1, 0, 0], [0, 1, 0], [tx, ty, 1]]) * canvas.gs.text_state.text_line_matrix
167
+ end
175
168
 
176
- canvas.write_text(s)
177
- end
169
+ insn 'Tj', String do |canvas, s|
170
+ unless canvas.gs.text_state.is_in_text_object?
171
+ raise TextStateError, "Must be in a text object to use operator : Tj"
172
+ end
178
173
 
179
- insn "'", String do |canvas, s|
180
- unless canvas.gs.text_state.is_in_text_object?
181
- raise TextStateError, "Must be in a text object to use operator : '"
182
- end
174
+ canvas.write_text(s)
175
+ end
183
176
 
184
- tx, ty = 0, -canvas.gs.text_state.leading
177
+ insn "'", String do |canvas, s|
178
+ unless canvas.gs.text_state.is_in_text_object?
179
+ raise TextStateError, "Must be in a text object to use operator : '"
180
+ end
185
181
 
186
- canvas.gs.text_state.text_matrix =
187
- canvas.gs.text_state.text_line_matrix =
188
- Matrix.rows([[1,0,0],[0,1,0],[tx, ty, 1]]) * canvas.gs.text_state.text_line_matrix
182
+ tx, ty = 0, -canvas.gs.text_state.leading
189
183
 
190
- canvas.write_text(s)
191
- end
184
+ canvas.gs.text_state.text_matrix =
185
+ canvas.gs.text_state.text_line_matrix =
186
+ Matrix.rows([[1, 0, 0], [0, 1, 0], [tx, ty, 1]]) * canvas.gs.text_state.text_line_matrix
192
187
 
193
- insn '"', Real, Real, String do |canvas, w, c, s|
194
- unless canvas.gs.text_state.is_in_text_object?
195
- raise TextStateError, "Must be in a text object to use operator : \""
196
- end
188
+ canvas.write_text(s)
189
+ end
197
190
 
198
- canvas.gs.text_state.word_spacing = w
199
- canvas.gs.text_state.char_spacing = c
191
+ insn '"', Real, Real, String do |canvas, w, c, s|
192
+ unless canvas.gs.text_state.is_in_text_object?
193
+ raise TextStateError, "Must be in a text object to use operator : \""
194
+ end
200
195
 
201
- tx, ty = 0, -gs.text_state.leading
196
+ canvas.gs.text_state.word_spacing = w
197
+ canvas.gs.text_state.char_spacing = c
202
198
 
203
- canvas.gs.text_state.text_matrix =
204
- canvas.gs.text_state.text_line_matrix =
205
- Matrix.rows([[1,0,0],[0,1,0],[tx, ty, 1]]) * canvas.gs.text_state.text_line_matrix
199
+ tx, ty = 0, -gs.text_state.leading
206
200
 
207
- canvas.write_text(s)
208
- end
201
+ canvas.gs.text_state.text_matrix =
202
+ canvas.gs.text_state.text_line_matrix =
203
+ Matrix.rows([[1, 0, 0], [0, 1, 0], [tx, ty, 1]]) * canvas.gs.text_state.text_line_matrix
209
204
 
210
- insn 'TJ', Array do |canvas, arr|
211
- arr.each do |g|
212
- case g
213
- when Fixnum,Float then
214
- # XXX: handle this in text space ?
215
- when ::String then
216
- canvas.write_text(g)
217
- else
218
- raise InvalidPDFInstructionError,
219
- "Invalid component type `#{g.class}` in TJ operand"
220
- end
221
- end
222
- end
205
+ canvas.write_text(s)
223
206
  end
224
207
 
208
+ insn 'TJ', Array do |canvas, arr|
209
+ arr.each do |g|
210
+ case g
211
+ when Integer, Float
212
+ # XXX: handle this in text space ?
213
+ when ::String
214
+ canvas.write_text(g)
215
+ else
216
+ raise InvalidPDFInstructionError,
217
+ "Invalid component type `#{g.class}` in TJ operand"
218
+ end
219
+ end
220
+ end
221
+ end
225
222
  end