hexapdf 0.32.2 → 0.34.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 (221) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +104 -1
  3. data/README.md +9 -0
  4. data/examples/002-graphics.rb +15 -17
  5. data/examples/003-arcs.rb +9 -9
  6. data/examples/009-text_layouter_alignment.rb +1 -1
  7. data/examples/010-text_layouter_inline_boxes.rb +2 -2
  8. data/examples/011-text_layouter_line_wrapping.rb +1 -1
  9. data/examples/012-text_layouter_styling.rb +7 -7
  10. data/examples/013-text_layouter_shapes.rb +1 -1
  11. data/examples/014-text_in_polygon.rb +1 -1
  12. data/examples/015-boxes.rb +8 -7
  13. data/examples/016-frame_automatic_box_placement.rb +2 -2
  14. data/examples/017-frame_text_flow.rb +2 -1
  15. data/examples/018-composer.rb +1 -1
  16. data/examples/020-column_box.rb +2 -1
  17. data/examples/025-table_box.rb +46 -0
  18. data/examples/026-optional_content.rb +55 -0
  19. data/examples/027-composer_optional_content.rb +83 -0
  20. data/lib/hexapdf/cli/command.rb +12 -3
  21. data/lib/hexapdf/cli/fonts.rb +1 -1
  22. data/lib/hexapdf/cli/form.rb +5 -5
  23. data/lib/hexapdf/cli/inspect.rb +5 -7
  24. data/lib/hexapdf/composer.rb +106 -53
  25. data/lib/hexapdf/configuration.rb +65 -40
  26. data/lib/hexapdf/content/canvas.rb +445 -267
  27. data/lib/hexapdf/content/color_space.rb +72 -25
  28. data/lib/hexapdf/content/graphic_object/arc.rb +57 -24
  29. data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +66 -23
  30. data/lib/hexapdf/content/graphic_object/geom2d.rb +47 -6
  31. data/lib/hexapdf/content/graphic_object/solid_arc.rb +58 -36
  32. data/lib/hexapdf/content/graphic_object.rb +6 -7
  33. data/lib/hexapdf/content/graphics_state.rb +54 -45
  34. data/lib/hexapdf/content/operator.rb +54 -54
  35. data/lib/hexapdf/content/parser.rb +2 -2
  36. data/lib/hexapdf/content/processor.rb +15 -15
  37. data/lib/hexapdf/content/transformation_matrix.rb +1 -1
  38. data/lib/hexapdf/content.rb +5 -0
  39. data/lib/hexapdf/dictionary.rb +7 -5
  40. data/lib/hexapdf/dictionary_fields.rb +43 -16
  41. data/lib/hexapdf/digital_signature/cms_handler.rb +2 -2
  42. data/lib/hexapdf/digital_signature/handler.rb +1 -1
  43. data/lib/hexapdf/digital_signature/pkcs1_handler.rb +2 -3
  44. data/lib/hexapdf/digital_signature/signature.rb +6 -6
  45. data/lib/hexapdf/digital_signature/signatures.rb +13 -12
  46. data/lib/hexapdf/digital_signature/signing/default_handler.rb +14 -5
  47. data/lib/hexapdf/digital_signature/signing/signed_data_creator.rb +2 -4
  48. data/lib/hexapdf/digital_signature/signing/timestamp_handler.rb +4 -4
  49. data/lib/hexapdf/digital_signature/signing.rb +4 -0
  50. data/lib/hexapdf/digital_signature/verification_result.rb +3 -4
  51. data/lib/hexapdf/digital_signature.rb +7 -2
  52. data/lib/hexapdf/document/destinations.rb +12 -11
  53. data/lib/hexapdf/document/files.rb +1 -1
  54. data/lib/hexapdf/document/fonts.rb +1 -1
  55. data/lib/hexapdf/document/layout.rb +170 -39
  56. data/lib/hexapdf/document/pages.rb +4 -3
  57. data/lib/hexapdf/document.rb +96 -55
  58. data/lib/hexapdf/encryption/aes.rb +5 -5
  59. data/lib/hexapdf/encryption/arc4.rb +1 -1
  60. data/lib/hexapdf/encryption/fast_aes.rb +2 -2
  61. data/lib/hexapdf/encryption/fast_arc4.rb +1 -1
  62. data/lib/hexapdf/encryption/identity.rb +1 -1
  63. data/lib/hexapdf/encryption/ruby_aes.rb +11 -21
  64. data/lib/hexapdf/encryption/ruby_arc4.rb +1 -1
  65. data/lib/hexapdf/encryption/security_handler.rb +31 -24
  66. data/lib/hexapdf/encryption/standard_security_handler.rb +45 -36
  67. data/lib/hexapdf/encryption.rb +7 -2
  68. data/lib/hexapdf/error.rb +18 -0
  69. data/lib/hexapdf/filter/ascii85_decode.rb +1 -1
  70. data/lib/hexapdf/filter/ascii_hex_decode.rb +1 -1
  71. data/lib/hexapdf/filter/flate_decode.rb +1 -1
  72. data/lib/hexapdf/filter/lzw_decode.rb +1 -1
  73. data/lib/hexapdf/filter/pass_through.rb +1 -1
  74. data/lib/hexapdf/filter/predictor.rb +1 -1
  75. data/lib/hexapdf/filter/run_length_decode.rb +1 -1
  76. data/lib/hexapdf/filter.rb +55 -6
  77. data/lib/hexapdf/font/cmap/parser.rb +2 -2
  78. data/lib/hexapdf/font/cmap.rb +1 -1
  79. data/lib/hexapdf/font/encoding/difference_encoding.rb +1 -1
  80. data/lib/hexapdf/font/encoding/mac_expert_encoding.rb +1 -1
  81. data/lib/hexapdf/font/encoding/mac_roman_encoding.rb +2 -2
  82. data/lib/hexapdf/font/encoding/standard_encoding.rb +1 -1
  83. data/lib/hexapdf/font/encoding/symbol_encoding.rb +1 -1
  84. data/lib/hexapdf/font/encoding/win_ansi_encoding.rb +3 -3
  85. data/lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb +1 -1
  86. data/lib/hexapdf/font/invalid_glyph.rb +3 -0
  87. data/lib/hexapdf/font/true_type_wrapper.rb +17 -4
  88. data/lib/hexapdf/font/type1_wrapper.rb +19 -4
  89. data/lib/hexapdf/font_loader/from_configuration.rb +5 -2
  90. data/lib/hexapdf/font_loader/from_file.rb +5 -5
  91. data/lib/hexapdf/font_loader/standard14.rb +3 -3
  92. data/lib/hexapdf/font_loader.rb +3 -0
  93. data/lib/hexapdf/image_loader/jpeg.rb +2 -2
  94. data/lib/hexapdf/image_loader/pdf.rb +1 -1
  95. data/lib/hexapdf/image_loader/png.rb +2 -2
  96. data/lib/hexapdf/image_loader.rb +1 -1
  97. data/lib/hexapdf/importer.rb +13 -0
  98. data/lib/hexapdf/layout/box.rb +32 -5
  99. data/lib/hexapdf/layout/box_fitter.rb +2 -2
  100. data/lib/hexapdf/layout/column_box.rb +20 -5
  101. data/lib/hexapdf/layout/frame.rb +53 -18
  102. data/lib/hexapdf/layout/image_box.rb +5 -0
  103. data/lib/hexapdf/layout/inline_box.rb +21 -9
  104. data/lib/hexapdf/layout/list_box.rb +50 -20
  105. data/lib/hexapdf/layout/page_style.rb +6 -5
  106. data/lib/hexapdf/layout/style.rb +64 -9
  107. data/lib/hexapdf/layout/table_box.rb +684 -0
  108. data/lib/hexapdf/layout/text_box.rb +12 -3
  109. data/lib/hexapdf/layout/text_fragment.rb +29 -3
  110. data/lib/hexapdf/layout/text_layouter.rb +32 -8
  111. data/lib/hexapdf/layout.rb +1 -0
  112. data/lib/hexapdf/name_tree_node.rb +1 -1
  113. data/lib/hexapdf/number_tree_node.rb +1 -1
  114. data/lib/hexapdf/object.rb +18 -7
  115. data/lib/hexapdf/parser.rb +7 -7
  116. data/lib/hexapdf/pdf_array.rb +1 -1
  117. data/lib/hexapdf/rectangle.rb +1 -1
  118. data/lib/hexapdf/reference.rb +1 -1
  119. data/lib/hexapdf/revision.rb +1 -1
  120. data/lib/hexapdf/revisions.rb +3 -3
  121. data/lib/hexapdf/serializer.rb +15 -15
  122. data/lib/hexapdf/stream.rb +5 -4
  123. data/lib/hexapdf/tokenizer.rb +14 -14
  124. data/lib/hexapdf/type/acro_form/appearance_generator.rb +22 -22
  125. data/lib/hexapdf/type/acro_form/button_field.rb +1 -1
  126. data/lib/hexapdf/type/acro_form/choice_field.rb +1 -1
  127. data/lib/hexapdf/type/acro_form/field.rb +2 -2
  128. data/lib/hexapdf/type/acro_form/form.rb +1 -1
  129. data/lib/hexapdf/type/acro_form/signature_field.rb +4 -4
  130. data/lib/hexapdf/type/acro_form/text_field.rb +1 -1
  131. data/lib/hexapdf/type/acro_form/variable_text_field.rb +1 -1
  132. data/lib/hexapdf/type/acro_form.rb +1 -1
  133. data/lib/hexapdf/type/action.rb +1 -1
  134. data/lib/hexapdf/type/actions/go_to.rb +1 -1
  135. data/lib/hexapdf/type/actions/go_to_r.rb +1 -1
  136. data/lib/hexapdf/type/actions/launch.rb +1 -1
  137. data/lib/hexapdf/type/actions/set_ocg_state.rb +86 -0
  138. data/lib/hexapdf/type/actions/uri.rb +1 -1
  139. data/lib/hexapdf/type/actions.rb +2 -1
  140. data/lib/hexapdf/type/annotation.rb +3 -3
  141. data/lib/hexapdf/type/annotations/link.rb +1 -1
  142. data/lib/hexapdf/type/annotations/markup_annotation.rb +1 -1
  143. data/lib/hexapdf/type/annotations/text.rb +2 -3
  144. data/lib/hexapdf/type/annotations/widget.rb +2 -2
  145. data/lib/hexapdf/type/annotations.rb +1 -1
  146. data/lib/hexapdf/type/catalog.rb +11 -2
  147. data/lib/hexapdf/type/cid_font.rb +18 -4
  148. data/lib/hexapdf/type/embedded_file.rb +1 -1
  149. data/lib/hexapdf/type/file_specification.rb +2 -2
  150. data/lib/hexapdf/type/font_descriptor.rb +1 -1
  151. data/lib/hexapdf/type/font_simple.rb +2 -2
  152. data/lib/hexapdf/type/font_type0.rb +3 -3
  153. data/lib/hexapdf/type/font_type3.rb +1 -1
  154. data/lib/hexapdf/type/form.rb +76 -6
  155. data/lib/hexapdf/type/graphics_state_parameter.rb +1 -1
  156. data/lib/hexapdf/type/icon_fit.rb +1 -1
  157. data/lib/hexapdf/type/image.rb +1 -1
  158. data/lib/hexapdf/type/info.rb +1 -1
  159. data/lib/hexapdf/type/mark_information.rb +1 -1
  160. data/lib/hexapdf/type/names.rb +2 -2
  161. data/lib/hexapdf/type/object_stream.rb +2 -1
  162. data/lib/hexapdf/type/optional_content_configuration.rb +170 -0
  163. data/lib/hexapdf/type/optional_content_group.rb +370 -0
  164. data/lib/hexapdf/type/optional_content_membership.rb +63 -0
  165. data/lib/hexapdf/type/optional_content_properties.rb +158 -0
  166. data/lib/hexapdf/type/outline.rb +1 -1
  167. data/lib/hexapdf/type/outline_item.rb +1 -1
  168. data/lib/hexapdf/type/page.rb +46 -21
  169. data/lib/hexapdf/type/page_label.rb +5 -9
  170. data/lib/hexapdf/type/page_tree_node.rb +1 -1
  171. data/lib/hexapdf/type/resources.rb +1 -1
  172. data/lib/hexapdf/type/trailer.rb +2 -2
  173. data/lib/hexapdf/type/viewer_preferences.rb +1 -1
  174. data/lib/hexapdf/type/xref_stream.rb +2 -2
  175. data/lib/hexapdf/type.rb +4 -0
  176. data/lib/hexapdf/utils/pdf_doc_encoding.rb +1 -2
  177. data/lib/hexapdf/version.rb +1 -1
  178. data/lib/hexapdf/writer.rb +4 -4
  179. data/lib/hexapdf/xref_section.rb +2 -2
  180. data/test/hexapdf/content/graphic_object/test_endpoint_arc.rb +11 -1
  181. data/test/hexapdf/content/graphic_object/test_geom2d.rb +7 -0
  182. data/test/hexapdf/content/test_canvas.rb +49 -1
  183. data/test/hexapdf/digital_signature/test_signatures.rb +22 -0
  184. data/test/hexapdf/document/test_files.rb +2 -2
  185. data/test/hexapdf/document/test_layout.rb +105 -2
  186. data/test/hexapdf/document/test_pages.rb +6 -6
  187. data/test/hexapdf/encryption/test_security_handler.rb +12 -11
  188. data/test/hexapdf/encryption/test_standard_security_handler.rb +35 -23
  189. data/test/hexapdf/font/test_true_type_wrapper.rb +18 -1
  190. data/test/hexapdf/font/test_type1_wrapper.rb +15 -1
  191. data/test/hexapdf/layout/test_box.rb +14 -5
  192. data/test/hexapdf/layout/test_column_box.rb +65 -21
  193. data/test/hexapdf/layout/test_frame.rb +27 -15
  194. data/test/hexapdf/layout/test_image_box.rb +4 -0
  195. data/test/hexapdf/layout/test_inline_box.rb +17 -3
  196. data/test/hexapdf/layout/test_list_box.rb +84 -33
  197. data/test/hexapdf/layout/test_page_style.rb +3 -2
  198. data/test/hexapdf/layout/test_style.rb +60 -0
  199. data/test/hexapdf/layout/test_table_box.rb +728 -0
  200. data/test/hexapdf/layout/test_text_box.rb +26 -0
  201. data/test/hexapdf/layout/test_text_fragment.rb +33 -0
  202. data/test/hexapdf/layout/test_text_layouter.rb +36 -5
  203. data/test/hexapdf/test_composer.rb +10 -0
  204. data/test/hexapdf/test_dictionary.rb +10 -0
  205. data/test/hexapdf/test_dictionary_fields.rb +4 -1
  206. data/test/hexapdf/test_document.rb +5 -0
  207. data/test/hexapdf/test_filter.rb +8 -0
  208. data/test/hexapdf/test_importer.rb +9 -0
  209. data/test/hexapdf/test_object.rb +16 -5
  210. data/test/hexapdf/test_stream.rb +7 -0
  211. data/test/hexapdf/test_writer.rb +3 -3
  212. data/test/hexapdf/type/acro_form/test_appearance_generator.rb +13 -5
  213. data/test/hexapdf/type/acro_form/test_form.rb +4 -3
  214. data/test/hexapdf/type/actions/test_set_ocg_state.rb +40 -0
  215. data/test/hexapdf/type/test_catalog.rb +11 -0
  216. data/test/hexapdf/type/test_form.rb +119 -0
  217. data/test/hexapdf/type/test_optional_content_configuration.rb +112 -0
  218. data/test/hexapdf/type/test_optional_content_group.rb +158 -0
  219. data/test/hexapdf/type/test_optional_content_properties.rb +109 -0
  220. data/test/hexapdf/type/test_page.rb +20 -6
  221. metadata +28 -8
@@ -50,10 +50,9 @@ module HexaPDF
50
50
  # color to the specified gray value.
51
51
  #
52
52
  # Since HexaPDF doesn't have a content stream rendering facility, it is only interested in the
53
- # effects an operator has on the graphics state. By calling the #invoke method with a
54
- # Content::Processor as first argument and the operands as the rest of the arguments, the
55
- # operator can modify the graphics state as needed. This ensures internal consistency and
56
- # correct operation.
53
+ # effects an operator has on the graphics state. By calling the #invoke method with a Processor
54
+ # as first argument and the operands as the rest of the arguments, the operator can modify the
55
+ # graphics state as needed. This ensures internal consistency and correct operation.
57
56
  #
58
57
  # Operator objects are designed to be state-less. This means that the operands have to be
59
58
  # passed as arguments to the methods that need them.
@@ -62,8 +61,7 @@ module HexaPDF
62
61
  # == Operator Implementations
63
62
  #
64
63
  # HexaPDF comes with operator implementations for all PDF operations. These operator
65
- # implementations are derived from the Operator::BaseOperator class which provides all needed
66
- # methods.
64
+ # implementations are derived from the BaseOperator class which provides all needed methods.
67
65
  #
68
66
  # In general, an operator implementation is an object that responds to the following methods:
69
67
  #
@@ -76,10 +74,10 @@ module HexaPDF
76
74
  # #name::
77
75
  # Returns the name of the operator as String.
78
76
  #
79
- # See: PDF1.7 s8, s9
77
+ # See: PDF2.0 s8, s9
80
78
  module Operator
81
79
 
82
- # A base class for operator implementations.
80
+ # Base class for operator implementations.
83
81
  #
84
82
  # A default implementation for the #serialize method is provided. However, for performance
85
83
  # reasons each operator should provide a custom #serialize method.
@@ -148,7 +146,7 @@ module HexaPDF
148
146
 
149
147
  # Implementation of the 'q' operator.
150
148
  #
151
- # See: PDF1.7 s8.4.4
149
+ # See: PDF2.0 s8.4.4
152
150
  class SaveGraphicsState < NoArgumentOperator
153
151
 
154
152
  # Creates the operator.
@@ -164,7 +162,7 @@ module HexaPDF
164
162
 
165
163
  # Implementation of the 'Q' operator.
166
164
  #
167
- # See: PDF1.7 s8.4.4
165
+ # See: PDF2.0 s8.4.4
168
166
  class RestoreGraphicsState < NoArgumentOperator
169
167
 
170
168
  # Creates the operator.
@@ -180,7 +178,7 @@ module HexaPDF
180
178
 
181
179
  # Implementation of the 'cm' operator.
182
180
  #
183
- # See: PDF1.7 s8.4.4
181
+ # See: PDF2.0 s8.4.4
184
182
  class ConcatenateMatrix < BaseOperator
185
183
 
186
184
  # Creates the operator.
@@ -202,7 +200,7 @@ module HexaPDF
202
200
 
203
201
  # Implementation of the 'w' operator.
204
202
  #
205
- # See: PDF1.7 s8.4.4
203
+ # See: PDF2.0 s8.4.4
206
204
  class SetLineWidth < SingleNumericArgumentOperator
207
205
 
208
206
  # Creates the operator.
@@ -218,7 +216,7 @@ module HexaPDF
218
216
 
219
217
  # Implementation of the 'J' operator.
220
218
  #
221
- # See: PDF1.7 s8.4.4
219
+ # See: PDF2.0 s8.4.4
222
220
  class SetLineCapStyle < SingleNumericArgumentOperator
223
221
 
224
222
  # Creates the operator.
@@ -234,7 +232,7 @@ module HexaPDF
234
232
 
235
233
  # Implementation of the 'j' operator.
236
234
  #
237
- # See: PDF1.7 s8.4.4
235
+ # See: PDF2.0 s8.4.4
238
236
  class SetLineJoinStyle < SingleNumericArgumentOperator
239
237
 
240
238
  # Creates the operator.
@@ -250,7 +248,7 @@ module HexaPDF
250
248
 
251
249
  # Implementation of the 'M' operator.
252
250
  #
253
- # See: PDF1.7 s8.4.4
251
+ # See: PDF2.0 s8.4.4
254
252
  class SetMiterLimit < SingleNumericArgumentOperator
255
253
 
256
254
  # Creates the operator.
@@ -266,7 +264,7 @@ module HexaPDF
266
264
 
267
265
  # Implementation of the 'd' operator.
268
266
  #
269
- # See: PDF1.7 s8.4.4
267
+ # See: PDF2.0 s8.4.4
270
268
  class SetLineDashPattern < BaseOperator
271
269
 
272
270
  # Creates the operator.
@@ -287,7 +285,7 @@ module HexaPDF
287
285
 
288
286
  # Implementation of the 'ri' operator.
289
287
  #
290
- # See: PDF1.7 s8.4.4
288
+ # See: PDF2.0 s8.4.4
291
289
  class SetRenderingIntent < BaseOperator
292
290
 
293
291
  # Creates the operator.
@@ -310,7 +308,7 @@ module HexaPDF
310
308
  # Note: Only parameters supported by the GraphicsState/TextState classes are assigned, the
311
309
  # rest are ignored!
312
310
  #
313
- # See: PDF1.7 s8.4.4
311
+ # See: PDF2.0 s8.4.4
314
312
  class SetGraphicsStateParameters < BaseOperator
315
313
 
316
314
  # Creates the operator.
@@ -352,7 +350,7 @@ module HexaPDF
352
350
 
353
351
  # Implementation of the 'CS' operator.
354
352
  #
355
- # See: PDF1.7 s8.6.8
353
+ # See: PDF2.0 s8.6.8
356
354
  class SetStrokingColorSpace < BaseOperator
357
355
 
358
356
  # Creates the operator.
@@ -372,7 +370,7 @@ module HexaPDF
372
370
 
373
371
  # Implementation of the 'cs' operator.
374
372
  #
375
- # See: PDF1.7 s8.6.8
373
+ # See: PDF2.0 s8.6.8
376
374
  class SetNonStrokingColorSpace < BaseOperator
377
375
 
378
376
  # Creates the operator.
@@ -392,7 +390,7 @@ module HexaPDF
392
390
 
393
391
  # Implementation of the 'SC' and 'SCN' operator.
394
392
  #
395
- # See: PDF1.7 s8.6.8
393
+ # See: PDF2.0 s8.6.8
396
394
  class SetStrokingColor < BaseOperator
397
395
 
398
396
  def invoke(processor, *operands) #:nodoc:
@@ -404,7 +402,7 @@ module HexaPDF
404
402
 
405
403
  # Implementation of the 'sc' and 'scn' operator.
406
404
  #
407
- # See: PDF1.7 s8.6.8
405
+ # See: PDF2.0 s8.6.8
408
406
  class SetNonStrokingColor < BaseOperator
409
407
 
410
408
  def invoke(processor, *operands) #:nodoc:
@@ -416,7 +414,7 @@ module HexaPDF
416
414
 
417
415
  # Implementation of the 'G' operator.
418
416
  #
419
- # See: PDF1.7 s8.6.8
417
+ # See: PDF2.0 s8.6.8
420
418
  class SetDeviceGrayStrokingColor < SingleNumericArgumentOperator
421
419
 
422
420
  def initialize #:nodoc:
@@ -432,7 +430,7 @@ module HexaPDF
432
430
 
433
431
  # Implementation of the 'g' operator.
434
432
  #
435
- # See: PDF1.7 s8.6.8
433
+ # See: PDF2.0 s8.6.8
436
434
  class SetDeviceGrayNonStrokingColor < SingleNumericArgumentOperator
437
435
 
438
436
  # Creates the operator.
@@ -449,7 +447,7 @@ module HexaPDF
449
447
 
450
448
  # Implementation of the 'RG' operator.
451
449
  #
452
- # See: PDF1.7 s8.6.8
450
+ # See: PDF2.0 s8.6.8
453
451
  class SetDeviceRGBStrokingColor < BaseOperator
454
452
 
455
453
  # Creates the operator.
@@ -471,7 +469,7 @@ module HexaPDF
471
469
 
472
470
  # Implementation of the 'rg' operator.
473
471
  #
474
- # See: PDF1.7 s8.6.8
472
+ # See: PDF2.0 s8.6.8
475
473
  class SetDeviceRGBNonStrokingColor < BaseOperator
476
474
 
477
475
  # Creates the operator.
@@ -493,7 +491,7 @@ module HexaPDF
493
491
 
494
492
  # Implementation of the 'K' operator.
495
493
  #
496
- # See: PDF1.7 s8.6.8
494
+ # See: PDF2.0 s8.6.8
497
495
  class SetDeviceCMYKStrokingColor < BaseOperator
498
496
 
499
497
  # Creates the operator.
@@ -515,7 +513,7 @@ module HexaPDF
515
513
 
516
514
  # Implementation of the 'k' operator.
517
515
  #
518
- # See: PDF1.7 s8.6.8
516
+ # See: PDF2.0 s8.6.8
519
517
  class SetDeviceCMYKNonStrokingColor < BaseOperator
520
518
 
521
519
  # Creates the operator.
@@ -537,7 +535,7 @@ module HexaPDF
537
535
 
538
536
  # Implementation of the 'm' operator.
539
537
  #
540
- # See: PDF1.7 s8.5.2.1
538
+ # See: PDF2.0 s8.5.2.1
541
539
  class MoveTo < BaseOperator
542
540
 
543
541
  # Creates the operator.
@@ -557,7 +555,7 @@ module HexaPDF
557
555
 
558
556
  # Implementation of the 're' operator.
559
557
  #
560
- # See: PDF1.7 s8.5.2.1
558
+ # See: PDF2.0 s8.5.2.1
561
559
  class AppendRectangle < BaseOperator
562
560
 
563
561
  # Creates the operator.
@@ -578,7 +576,7 @@ module HexaPDF
578
576
 
579
577
  # Implementation of the 'l' operator.
580
578
  #
581
- # See: PDF1.7 s8.5.2.1
579
+ # See: PDF2.0 s8.5.2.1
582
580
  class LineTo < BaseOperator
583
581
 
584
582
  # Creates the operator.
@@ -597,7 +595,7 @@ module HexaPDF
597
595
 
598
596
  # Implementation of the 'c' operators.
599
597
  #
600
- # See: PDF1.7 s8.5.2.1
598
+ # See: PDF2.0 s8.5.2.1
601
599
  class CurveTo < BaseOperator
602
600
 
603
601
  # Creates the operator.
@@ -615,7 +613,7 @@ module HexaPDF
615
613
 
616
614
  # Implementation of the 'v' operators.
617
615
  #
618
- # See: PDF1.7 s8.5.2.1
616
+ # See: PDF2.0 s8.5.2.1
619
617
  class CurveToNoFirstControlPoint < BaseOperator
620
618
 
621
619
  # Creates the operator.
@@ -632,7 +630,7 @@ module HexaPDF
632
630
 
633
631
  # Implementation of the 'y' operators.
634
632
  #
635
- # See: PDF1.7 s8.5.2.1
633
+ # See: PDF2.0 s8.5.2.1
636
634
  class CurveToNoSecondControlPoint < BaseOperator
637
635
 
638
636
  # Creates the operator.
@@ -649,7 +647,7 @@ module HexaPDF
649
647
 
650
648
  # Implementation of the 'S', 's', 'f', 'F', 'f*', 'B', 'B*', 'b', 'b*' and 'n' operators.
651
649
  #
652
- # See: PDF1.7 s8.5.3.1
650
+ # See: PDF2.0 s8.5.3.1
653
651
  class EndPath < NoArgumentOperator
654
652
 
655
653
  def invoke(processor) #:nodoc:
@@ -660,7 +658,7 @@ module HexaPDF
660
658
 
661
659
  # Implementation of the 'W' and 'W*' operators.
662
660
  #
663
- # See: PDF1.7 s8.5.4
661
+ # See: PDF2.0 s8.5.4
664
662
  class ClipPath < NoArgumentOperator
665
663
 
666
664
  def invoke(processor) #:nodoc:
@@ -672,7 +670,7 @@ module HexaPDF
672
670
  # Implementation of the 'BI' operator which handles the *complete* inline image, i.e. the
673
671
  # 'ID' and 'EI' operators are never encountered.
674
672
  #
675
- # See: PDF1.7 s8.9.7
673
+ # See: PDF2.0 s8.9.7
676
674
  class InlineImage < BaseOperator
677
675
 
678
676
  # Creates the operator.
@@ -693,7 +691,7 @@ module HexaPDF
693
691
 
694
692
  # Implementation of the 'Tc' operator.
695
693
  #
696
- # See: PDF1.7 s9.3.1
694
+ # See: PDF2.0 s9.3.1
697
695
  class SetCharacterSpacing < SingleNumericArgumentOperator
698
696
 
699
697
  # Creates the operator.
@@ -709,7 +707,7 @@ module HexaPDF
709
707
 
710
708
  # Implementation of the 'Tw' operator.
711
709
  #
712
- # See: PDF1.7 s9.3.1
710
+ # See: PDF2.0 s9.3.1
713
711
  class SetWordSpacing < SingleNumericArgumentOperator
714
712
 
715
713
  # Creates the operator.
@@ -725,7 +723,7 @@ module HexaPDF
725
723
 
726
724
  # Implementation of the 'Tz' operator.
727
725
  #
728
- # See: PDF1.7 s9.3.1
726
+ # See: PDF2.0 s9.3.1
729
727
  class SetHorizontalScaling < SingleNumericArgumentOperator
730
728
 
731
729
  # Creates the operator.
@@ -741,7 +739,7 @@ module HexaPDF
741
739
 
742
740
  # Implementation of the 'TL' operator.
743
741
  #
744
- # See: PDF1.7 s9.3.1
742
+ # See: PDF2.0 s9.3.1
745
743
  class SetLeading < SingleNumericArgumentOperator
746
744
 
747
745
  # Creates the operator.
@@ -757,7 +755,7 @@ module HexaPDF
757
755
 
758
756
  # Implementation of the 'Tf' operator.
759
757
  #
760
- # See: PDF1.7 s9.3.1
758
+ # See: PDF2.0 s9.3.1
761
759
  class SetFontAndSize < BaseOperator
762
760
 
763
761
  # Creates the operator.
@@ -778,7 +776,7 @@ module HexaPDF
778
776
 
779
777
  # Implementation of the 'Tr' operator.
780
778
  #
781
- # See: PDF1.7 s9.3.1
779
+ # See: PDF2.0 s9.3.1
782
780
  class SetTextRenderingMode < SingleNumericArgumentOperator
783
781
 
784
782
  # Creates the operator.
@@ -794,7 +792,7 @@ module HexaPDF
794
792
 
795
793
  # Implementation of the 'Ts' operator.
796
794
  #
797
- # See: PDF1.7 s9.3.1
795
+ # See: PDF2.0 s9.3.1
798
796
  class SetTextRise < SingleNumericArgumentOperator
799
797
 
800
798
  # Creates the operator.
@@ -810,7 +808,7 @@ module HexaPDF
810
808
 
811
809
  # Implementation of the 'BT' operator.
812
810
  #
813
- # See: PDF1.7 s9.4.1
811
+ # See: PDF2.0 s9.4.1
814
812
  class BeginText < NoArgumentOperator
815
813
 
816
814
  def initialize #:nodoc:
@@ -827,7 +825,7 @@ module HexaPDF
827
825
 
828
826
  # Implementation of the 'ET' operator.
829
827
  #
830
- # See: PDF1.7 s9.4.1
828
+ # See: PDF2.0 s9.4.1
831
829
  class EndText < NoArgumentOperator
832
830
 
833
831
  # Creates the operator.
@@ -845,7 +843,7 @@ module HexaPDF
845
843
 
846
844
  # Implementation of the 'Td' operator.
847
845
  #
848
- # See: PDF1.7 s9.4.2
846
+ # See: PDF2.0 s9.4.2
849
847
  class MoveText < BaseOperator
850
848
 
851
849
  # Creates the operator.
@@ -866,7 +864,7 @@ module HexaPDF
866
864
 
867
865
  # Implementation of the 'TD' operator.
868
866
  #
869
- # See: PDF1.7 s9.4.2
867
+ # See: PDF2.0 s9.4.2
870
868
  class MoveTextAndSetLeading < BaseOperator
871
869
 
872
870
  # Creates the operator.
@@ -887,7 +885,7 @@ module HexaPDF
887
885
 
888
886
  # Implementation of the 'Tm' operator.
889
887
  #
890
- # See: PDF1.7 s9.4.2
888
+ # See: PDF2.0 s9.4.2
891
889
  class SetTextMatrix < BaseOperator
892
890
 
893
891
  # Creates the operator.
@@ -910,7 +908,7 @@ module HexaPDF
910
908
 
911
909
  # Implementation of the 'T*' operator.
912
910
  #
913
- # See: PDF1.7 s9.4.2
911
+ # See: PDF2.0 s9.4.2
914
912
  class MoveTextNextLine < NoArgumentOperator
915
913
 
916
914
  # Creates the operator.
@@ -927,7 +925,7 @@ module HexaPDF
927
925
 
928
926
  # Implementation of the 'Tj' operator.
929
927
  #
930
- # See: PDF1.7 s9.4.3
928
+ # See: PDF2.0 s9.4.3
931
929
  class ShowText < BaseOperator
932
930
 
933
931
  # Creates the operator.
@@ -943,7 +941,7 @@ module HexaPDF
943
941
 
944
942
  # Implementation of the ' operator.
945
943
  #
946
- # See: PDF1.7 s9.4.3
944
+ # See: PDF2.0 s9.4.3
947
945
  class MoveTextNextLineAndShowText < BaseOperator
948
946
 
949
947
  def initialize #:nodoc:
@@ -963,7 +961,7 @@ module HexaPDF
963
961
 
964
962
  # Implementation of the " operator.
965
963
  #
966
- # See: PDF1.7 s9.4.3
964
+ # See: PDF2.0 s9.4.3
967
965
  class SetSpacingMoveTextNextLineAndShowText < BaseOperator
968
966
 
969
967
  # Creates the operator.
@@ -987,7 +985,7 @@ module HexaPDF
987
985
 
988
986
  # Implementation of the 'TJ' operator.
989
987
  #
990
- # See: PDF1.7 s9.4.3
988
+ # See: PDF2.0 s9.4.3
991
989
  class ShowTextWithPositioning < BaseOperator
992
990
 
993
991
  # Creates the operator.
@@ -1003,6 +1001,8 @@ module HexaPDF
1003
1001
 
1004
1002
  # Mapping of operator names to their default operator implementations.
1005
1003
  DEFAULT_OPERATORS = {
1004
+ BX: NoArgumentOperator.new('BX'),
1005
+ EX: NoArgumentOperator.new('EX'),
1006
1006
  q: SaveGraphicsState.new,
1007
1007
  Q: RestoreGraphicsState.new,
1008
1008
  cm: ConcatenateMatrix.new,
@@ -46,14 +46,14 @@ module HexaPDF
46
46
  #
47
47
  # Changes:
48
48
  #
49
- # * Since a content stream is normally parsed front to back, a StopIteration error can be raised
49
+ # * Since a content stream is usually parsed front to back, a StopIteration error can be raised
50
50
  # instead of returning +NO_MORE_TOKENS+ once the end of the string is reached to avoid costly
51
51
  # checks in each iteration. If this behaviour is wanted, pass "raise_on_eos: true" in the
52
52
  # constructor.
53
53
  #
54
54
  # * Indirect object references are *not* supported by this tokenizer!
55
55
  #
56
- # See: PDF1.7 s7.2
56
+ # See: PDF2.0 s7.2
57
57
  class Tokenizer < HexaPDF::Tokenizer #:nodoc:
58
58
 
59
59
  # The string that is tokenized.
@@ -45,7 +45,7 @@ module HexaPDF
45
45
  # == General Information
46
46
  #
47
47
  # When a content stream is read, operators and their operands are extracted. After extracting
48
- # these operators are normally processed with a Processor instance that ensures that the needed
48
+ # these operators are usually processed with a Processor instance that ensures that the needed
49
49
  # setup (like modifying the graphics state) is done before further processing.
50
50
  #
51
51
  # == How Processing Works
@@ -79,7 +79,7 @@ module HexaPDF
79
79
 
80
80
  # Represents an (immutable) glyph box with positioning information.
81
81
  #
82
- # Since the glyph may have been transformed by an affine matrix, the bounding may not be a
82
+ # Since the glyph may have been transformed by an affine matrix, the bounding box may not be a
83
83
  # rectangle in all cases but it is always a parallelogram.
84
84
  class GlyphBox
85
85
 
@@ -105,7 +105,7 @@ module HexaPDF
105
105
  end
106
106
 
107
107
  # :call-seq:
108
- # fragment.lower_left -> [llx, lly]
108
+ # glyph_box.lower_left -> [llx, lly]
109
109
  #
110
110
  # Returns the lower left coordinate
111
111
  def lower_left
@@ -113,7 +113,7 @@ module HexaPDF
113
113
  end
114
114
 
115
115
  # :call-seq:
116
- # fragment.lower_right -> [lrx, lry]
116
+ # glyph_box.lower_right -> [lrx, lry]
117
117
  #
118
118
  # Returns the lower right coordinate
119
119
  def lower_right
@@ -121,7 +121,7 @@ module HexaPDF
121
121
  end
122
122
 
123
123
  # :call-seq:
124
- # fragment.upper_left -> [ulx, uly]
124
+ # glyph_box.upper_left -> [ulx, uly]
125
125
  #
126
126
  # Returns the upper left coordinate
127
127
  def upper_left
@@ -129,7 +129,7 @@ module HexaPDF
129
129
  end
130
130
 
131
131
  # :call-seq:
132
- # fragment.upper_right -> [urx, ury]
132
+ # glyph_box.upper_right -> [urx, ury]
133
133
  #
134
134
  # Returns the upper right coordinate which is computed by using the other three points of
135
135
  # the parallelogram.
@@ -138,7 +138,7 @@ module HexaPDF
138
138
  end
139
139
 
140
140
  # :call-seq:
141
- # fragment.points -> [llx, lly, lrx, lry, urx, ury, ulx, uly]
141
+ # glyph_box.points -> [llx, lly, lrx, lry, urx, ury, ulx, uly]
142
142
  #
143
143
  # Returns the four corners of the box as an array of coordinates, starting with the lower
144
144
  # left corner and going counterclockwise.
@@ -155,7 +155,7 @@ module HexaPDF
155
155
  # in a straight line.
156
156
  class CompositeBox
157
157
 
158
- # The text boxes contained in this positioned text object.
158
+ # The glyph boxes contained in this composite box object.
159
159
  attr_reader :boxes
160
160
 
161
161
  # Creates an empty object.
@@ -185,7 +185,7 @@ module HexaPDF
185
185
  self
186
186
  end
187
187
 
188
- # Returns the concatenated text of the boxes.
188
+ # Returns the concatenated text of all the glyph boxes.
189
189
  def string
190
190
  @boxes.map(&:string).join
191
191
  end
@@ -311,14 +311,14 @@ module HexaPDF
311
311
 
312
312
  # The GraphicsState object containing the current graphics state.
313
313
  #
314
- # It is not advised that this attribute is changed manually, it is automatically adjusted
315
- # according to the processed operators!
314
+ # It is not advised to change this attribute manually, it is automatically adjusted according
315
+ # to the processed operators!
316
316
  attr_reader :graphics_state
317
317
 
318
318
  # The current graphics object.
319
319
  #
320
- # It is not advised that this attribute is changed manually, it is automatically adjusted
321
- # according to the processed operators!
320
+ # It is not advised to change this attribute manually, it is automatically adjusted according
321
+ # to the processed operators!
322
322
  #
323
323
  # This attribute can have the following values:
324
324
  #
@@ -327,7 +327,7 @@ module HexaPDF
327
327
  # :clipping_path:: The current graphics object is a clipping path.
328
328
  # :text:: The current graphics object is text.
329
329
  #
330
- # See: PDF1.7 s8.2
330
+ # See: PDF2.0 s8.2
331
331
  attr_accessor :graphics_object
332
332
 
333
333
  # Initializes a new processor that uses the resources PDF dictionary for resolving resources
@@ -417,7 +417,7 @@ module HexaPDF
417
417
  # Decodes the given array containing text and positioning information while assuming that the
418
418
  # writing direction is horizontal.
419
419
  #
420
- # See: PDF1.7 s9.4.4
420
+ # See: PDF2.0 s9.4.4
421
421
  def decode_horizontal_text(array)
422
422
  font = graphics_state.font
423
423
  scaled_char_space = graphics_state.scaled_character_spacing
@@ -67,7 +67,7 @@ module HexaPDF
67
67
  #
68
68
  # Details and some examples can be found in the PDF reference.
69
69
  #
70
- # See: PDF1.7 s8.3
70
+ # See: PDF2.0 s8.3
71
71
  class TransformationMatrix
72
72
 
73
73
  include HexaPDF::Utils::MathHelpers
@@ -39,6 +39,11 @@ module HexaPDF
39
39
  # == Overview
40
40
  #
41
41
  # The Content module contains everything related to working with page content streams.
42
+ #
43
+ # The most important classes are:
44
+ #
45
+ # * The Canvas class which provides an interface for drawing graphics and text.
46
+ # * The Parser and Processor classes for processing an existing content stream.
42
47
  module Content
43
48
 
44
49
  autoload(:Canvas, 'hexapdf/content/canvas')
@@ -47,10 +47,11 @@ module HexaPDF
47
47
  # the PDF specification. This allows, among other things, automatic type checking and
48
48
  # basic validation.
49
49
  #
50
- # Fields defined in superclasses are inherited by their subclasses. This avoids duplicating
51
- # basic field information.
50
+ # Fields defined in superclasses are inherited by their subclasses. This avoids duplicating basic
51
+ # field information. If fields differ from their superclass definition, they can be defined again
52
+ # in the subclass.
52
53
  #
53
- # See: PDF1.7 s7.3.7
54
+ # See: PDF2.0 s7.3.7
54
55
  class Dictionary < HexaPDF::Object
55
56
 
56
57
  include DictionaryFields
@@ -85,7 +86,7 @@ module HexaPDF
85
86
  # a Symbol), it has to be the first in the list. Otherwise automatic type conversion
86
87
  # functions won't work correctly.
87
88
  #
88
- # required:: Specifies whether this field is required.
89
+ # required:: Specifies whether this field is required, either +true+ or +false+.
89
90
  #
90
91
  # default:: Specifies the default value for the field, if any.
91
92
  #
@@ -174,7 +175,7 @@ module HexaPDF
174
175
  data
175
176
  end
176
177
 
177
- # Stores the data under name in the dictionary. Name has to be a Symbol object.
178
+ # Stores the data under name in the dictionary. Name has to be a Symbol.
178
179
  #
179
180
  # If the current value for this name has the class HexaPDF::Object (and only this, no
180
181
  # subclasses) and the given value has not (including subclasses), the value is stored inside the
@@ -248,6 +249,7 @@ module HexaPDF
248
249
  # Sets all required fields that have no current value but a default value to their respective
249
250
  # default value.
250
251
  def set_required_fields_with_defaults
252
+ return if (type = value[:Type]) && self.class.type != type
251
253
  self.class.each_field do |name, field|
252
254
  if !key?(name) && field.required? && field.default?
253
255
  value[name] = field.default