pdfrb 0.3.0 → 0.6.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 (404) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/Gemfile +1 -0
  4. data/PROPOSAL.canvas-clip.md +92 -0
  5. data/PROPOSAL.canvas-draw-image-matrix.md +87 -0
  6. data/PROPOSAL.canvas-rich-text.md +103 -0
  7. data/PROPOSAL.canvas-text-lines.md +77 -0
  8. data/PROPOSAL.canvas-transparency.md +106 -0
  9. data/PROPOSAL.external-font-metrics.md +129 -0
  10. data/PROPOSAL.font-embedding-fontfile2.md +88 -0
  11. data/PROPOSAL.font-resolver-ttc.md +105 -0
  12. data/PROPOSAL.font-resolver.md +96 -0
  13. data/PROPOSAL.font-subsetting.md +98 -0
  14. data/PROPOSAL.gradient-shadings.md +110 -0
  15. data/PROPOSAL.page-mediabox-setter.md +66 -0
  16. data/PROPOSAL.per-glyph-width.md +91 -0
  17. data/PROPOSAL.stringio-require.md +53 -0
  18. data/PROPOSAL.struct-tree-root.md +102 -0
  19. data/PROPOSAL.text-measurement.md +93 -0
  20. data/PROPOSAL.ttf-table-parsing-fix.md +112 -0
  21. data/RELEASE.md +48 -0
  22. data/lib/pdfrb/action/base.rb +21 -0
  23. data/lib/pdfrb/action/types.rb +178 -0
  24. data/lib/pdfrb/action.rb +55 -0
  25. data/lib/pdfrb/annotation/base.rb +79 -0
  26. data/lib/pdfrb/annotation/types.rb +222 -0
  27. data/lib/pdfrb/annotation.rb +78 -0
  28. data/lib/pdfrb/appearance/generator.rb +216 -0
  29. data/lib/pdfrb/appearance.rb +11 -0
  30. data/lib/pdfrb/arlington/object_definition.rb +2 -2
  31. data/lib/pdfrb/arlington/predicate/evaluator.rb +1 -1
  32. data/lib/pdfrb/arlington/predicate/functions.rb +25 -9
  33. data/lib/pdfrb/arlington/predicate.rb +1 -5
  34. data/lib/pdfrb/cli/batch.rb +18 -0
  35. data/lib/pdfrb/cli/debug_info.rb +18 -0
  36. data/lib/pdfrb/cli/files.rb +16 -0
  37. data/lib/pdfrb/cli/fonts.rb +16 -0
  38. data/lib/pdfrb/cli/form.rb +18 -0
  39. data/lib/pdfrb/cli/image2pdf.rb +18 -0
  40. data/lib/pdfrb/cli/images.rb +34 -0
  41. data/lib/pdfrb/cli/info.rb +20 -0
  42. data/lib/pdfrb/cli/inspect.rb +18 -0
  43. data/lib/pdfrb/cli/merge.rb +18 -0
  44. data/lib/pdfrb/cli/modify.rb +18 -0
  45. data/lib/pdfrb/cli/optimize.rb +18 -0
  46. data/lib/pdfrb/cli/split.rb +21 -0
  47. data/lib/pdfrb/cli/watermark.rb +18 -0
  48. data/lib/pdfrb/cli.rb +291 -7
  49. data/lib/pdfrb/color/color_space.rb +259 -0
  50. data/lib/pdfrb/color/icc_profile.rb +90 -0
  51. data/lib/pdfrb/color.rb +12 -0
  52. data/lib/pdfrb/compare/comparator.rb +244 -0
  53. data/lib/pdfrb/compare/report.rb +78 -0
  54. data/lib/pdfrb/compare.rb +42 -0
  55. data/lib/pdfrb/composer.rb +161 -0
  56. data/lib/pdfrb/conformance/pdf_a.rb +317 -56
  57. data/lib/pdfrb/conformance/pdf_ua.rb +186 -29
  58. data/lib/pdfrb/conformance/pdf_x.rb +247 -0
  59. data/lib/pdfrb/conformance/rule.rb +78 -0
  60. data/lib/pdfrb/conformance/structure_elements.rb +174 -0
  61. data/lib/pdfrb/conformance/verapdf_bridge.rb +92 -0
  62. data/lib/pdfrb/conformance.rb +7 -3
  63. data/lib/pdfrb/content/canvas.rb +217 -72
  64. data/lib/pdfrb/content/color_space.rb +157 -0
  65. data/lib/pdfrb/content/hidden_text_detector.rb +167 -0
  66. data/lib/pdfrb/content/operator.rb +21 -1
  67. data/lib/pdfrb/content/operators/clipping.rb +36 -0
  68. data/lib/pdfrb/content/operators/graphics_state_params.rb +15 -0
  69. data/lib/pdfrb/content/operators.rb +21 -0
  70. data/lib/pdfrb/content/shading/base.rb +139 -0
  71. data/lib/pdfrb/content/shading.rb +17 -0
  72. data/lib/pdfrb/content/smart_text_extractor.rb +85 -0
  73. data/lib/pdfrb/content/tiling_pattern.rb +78 -0
  74. data/lib/pdfrb/content/transformation_matrix.rb +61 -0
  75. data/lib/pdfrb/content.rb +7 -26
  76. data/lib/pdfrb/destination/fit.rb +185 -0
  77. data/lib/pdfrb/destination.rb +13 -0
  78. data/lib/pdfrb/digital_signature/cms_handler.rb +22 -0
  79. data/lib/pdfrb/digital_signature/signing.rb +107 -11
  80. data/lib/pdfrb/digital_signature/timestamp_handler.rb +45 -0
  81. data/lib/pdfrb/digital_signature/verification.rb +88 -9
  82. data/lib/pdfrb/digital_signature/verification_result.rb +14 -0
  83. data/lib/pdfrb/digital_signature.rb +26 -2
  84. data/lib/pdfrb/document/annotations.rb +120 -3
  85. data/lib/pdfrb/document/associated_files.rb +104 -0
  86. data/lib/pdfrb/document/colors.rb +95 -0
  87. data/lib/pdfrb/document/destinations.rb +127 -5
  88. data/lib/pdfrb/document/display.rb +84 -0
  89. data/lib/pdfrb/document/fonts.rb +417 -45
  90. data/lib/pdfrb/document/form.rb +338 -0
  91. data/lib/pdfrb/document/graphics_state.rb +91 -0
  92. data/lib/pdfrb/document/images.rb +4 -4
  93. data/lib/pdfrb/document/info.rb +102 -0
  94. data/lib/pdfrb/document/layers.rb +62 -0
  95. data/lib/pdfrb/document/metadata.rb +12 -5
  96. data/lib/pdfrb/document/output_intents.rb +91 -0
  97. data/lib/pdfrb/document/page_labels.rb +80 -0
  98. data/lib/pdfrb/document/pages.rb +68 -19
  99. data/lib/pdfrb/document/portfolio.rb +119 -0
  100. data/lib/pdfrb/document/shadings.rb +159 -0
  101. data/lib/pdfrb/document/stamps.rb +68 -0
  102. data/lib/pdfrb/document/structure.rb +242 -0
  103. data/lib/pdfrb/document.rb +73 -4
  104. data/lib/pdfrb/encryption/identity.rb +13 -0
  105. data/lib/pdfrb/encryption/password_verification.rb +53 -8
  106. data/lib/pdfrb/encryption/security_handler.rb +8 -5
  107. data/lib/pdfrb/encryption/standard_security_handler.rb +154 -81
  108. data/lib/pdfrb/encryption.rb +17 -0
  109. data/lib/pdfrb/error.rb +2 -2
  110. data/lib/pdfrb/filter/brotli_decode.rb +32 -0
  111. data/lib/pdfrb/filter/ccitt_fax_decode.rb +12 -0
  112. data/lib/pdfrb/filter/crypt.rb +2 -2
  113. data/lib/pdfrb/filter/dct_decode.rb +18 -0
  114. data/lib/pdfrb/filter/flate_decode.rb +4 -18
  115. data/lib/pdfrb/filter/jbig2_decode.rb +12 -0
  116. data/lib/pdfrb/filter/jpx_decode.rb +18 -0
  117. data/lib/pdfrb/filter/lzw_decode.rb +3 -2
  118. data/lib/pdfrb/filter/png_predictor.rb +94 -0
  119. data/lib/pdfrb/filter.rb +26 -13
  120. data/lib/pdfrb/font/afm_parser.rb +50 -26
  121. data/lib/pdfrb/font/cmap/writer.rb +9 -0
  122. data/lib/pdfrb/font/encoding/win_ansi_encoding.rb +17 -0
  123. data/lib/pdfrb/font/encoding.rb +32 -3
  124. data/lib/pdfrb/font/metrics_helper.rb +121 -0
  125. data/lib/pdfrb/font/true_type/file.rb +10 -1
  126. data/lib/pdfrb/font/true_type/glyf.rb +82 -0
  127. data/lib/pdfrb/font/true_type/kern.rb +58 -0
  128. data/lib/pdfrb/font/true_type/loca.rb +42 -0
  129. data/lib/pdfrb/font/true_type/maxp.rb +44 -0
  130. data/lib/pdfrb/font/true_type/name.rb +53 -0
  131. data/lib/pdfrb/font/true_type/post.rb +93 -0
  132. data/lib/pdfrb/font/true_type/subsetter.rb +3 -5
  133. data/lib/pdfrb/font/true_type/wrapper.rb +102 -0
  134. data/lib/pdfrb/font/true_type.rb +7 -0
  135. data/lib/pdfrb/font.rb +2 -0
  136. data/lib/pdfrb/font_loader/from_configuration.rb +19 -0
  137. data/lib/pdfrb/font_loader/from_file.rb +20 -0
  138. data/lib/pdfrb/font_loader/standard14.rb +20 -0
  139. data/lib/pdfrb/font_loader/variant_from_name.rb +36 -0
  140. data/lib/pdfrb/font_loader.rb +4 -0
  141. data/lib/pdfrb/font_resolver.rb +138 -0
  142. data/lib/pdfrb/image/audit.rb +94 -0
  143. data/lib/pdfrb/image/downsampler.rb +124 -0
  144. data/lib/pdfrb/image.rb +13 -0
  145. data/lib/pdfrb/image_loader/jpeg.rb +39 -58
  146. data/lib/pdfrb/image_loader/png.rb +31 -257
  147. data/lib/pdfrb/layout/bidi.rb +198 -0
  148. data/lib/pdfrb/layout/box.rb +49 -0
  149. data/lib/pdfrb/layout/box_fitter.rb +54 -0
  150. data/lib/pdfrb/layout/column_box.rb +71 -0
  151. data/lib/pdfrb/layout/container_box.rb +45 -0
  152. data/lib/pdfrb/layout/frame.rb +67 -0
  153. data/lib/pdfrb/layout/image_box.rb +44 -0
  154. data/lib/pdfrb/layout/inline_box.rb +25 -0
  155. data/lib/pdfrb/layout/line.rb +55 -0
  156. data/lib/pdfrb/layout/list_box.rb +87 -0
  157. data/lib/pdfrb/layout/numeric_refinements.rb +43 -0
  158. data/lib/pdfrb/layout/page_style.rb +65 -0
  159. data/lib/pdfrb/layout/style.rb +62 -0
  160. data/lib/pdfrb/layout/table_box.rb +66 -0
  161. data/lib/pdfrb/layout/text_box.rb +38 -0
  162. data/lib/pdfrb/layout/text_fragment.rb +45 -0
  163. data/lib/pdfrb/layout/text_layouter.rb +123 -0
  164. data/lib/pdfrb/layout.rb +28 -0
  165. data/lib/pdfrb/linearization/hint_stream.rb +93 -0
  166. data/lib/pdfrb/linearization/writer.rb +259 -0
  167. data/lib/pdfrb/linearization.rb +21 -0
  168. data/lib/pdfrb/model/cos/dictionary.rb +12 -0
  169. data/lib/pdfrb/model/pdf_array.rb +2 -2
  170. data/lib/pdfrb/model/type/action.rb +42 -0
  171. data/lib/pdfrb/model/type/action_go_to_3d_view.rb +14 -0
  172. data/lib/pdfrb/model/type/action_go_to_dp.rb +16 -0
  173. data/lib/pdfrb/model/type/action_go_to_r.rb +26 -0
  174. data/lib/pdfrb/model/type/action_goto.rb +34 -0
  175. data/lib/pdfrb/model/type/action_hide.rb +26 -0
  176. data/lib/pdfrb/model/type/action_import_data.rb +18 -0
  177. data/lib/pdfrb/model/type/action_java_script.rb +18 -0
  178. data/lib/pdfrb/model/type/action_launch.rb +22 -0
  179. data/lib/pdfrb/model/type/action_movie.rb +22 -0
  180. data/lib/pdfrb/model/type/action_named.rb +23 -0
  181. data/lib/pdfrb/model/type/action_nop.rb +12 -0
  182. data/lib/pdfrb/model/type/action_rendition.rb +28 -0
  183. data/lib/pdfrb/model/type/action_reset_form.rb +22 -0
  184. data/lib/pdfrb/model/type/action_rich_media_execute.rb +17 -0
  185. data/lib/pdfrb/model/type/action_set_ocg_state.rb +32 -0
  186. data/lib/pdfrb/model/type/action_set_state.rb +14 -0
  187. data/lib/pdfrb/model/type/action_sound_action.rb +23 -0
  188. data/lib/pdfrb/model/type/action_submit_form.rb +64 -0
  189. data/lib/pdfrb/model/type/action_thread.rb +23 -0
  190. data/lib/pdfrb/model/type/action_trans.rb +30 -0
  191. data/lib/pdfrb/model/type/action_uri.rb +30 -0
  192. data/lib/pdfrb/model/type/af_embedded_file.rb +11 -0
  193. data/lib/pdfrb/model/type/af_file_specification.rb +34 -0
  194. data/lib/pdfrb/model/type/annotation.rb +49 -10
  195. data/lib/pdfrb/model/type/appearance.rb +41 -0
  196. data/lib/pdfrb/model/type/appearance_characteristics.rb +36 -0
  197. data/lib/pdfrb/model/type/appearance_generator.rb +22 -0
  198. data/lib/pdfrb/model/type/appearance_trap_net.rb +84 -0
  199. data/lib/pdfrb/model/type/border_effect.rb +25 -0
  200. data/lib/pdfrb/model/type/border_styling.rb +38 -0
  201. data/lib/pdfrb/model/type/box_color_info.rb +21 -0
  202. data/lib/pdfrb/model/type/box_style.rb +19 -0
  203. data/lib/pdfrb/model/type/button.rb +17 -0
  204. data/lib/pdfrb/model/type/cal_gray.rb +17 -0
  205. data/lib/pdfrb/model/type/cal_rgb.rb +22 -0
  206. data/lib/pdfrb/model/type/caret_annotation.rb +21 -0
  207. data/lib/pdfrb/model/type/catalog.rb +99 -16
  208. data/lib/pdfrb/model/type/choice.rb +21 -0
  209. data/lib/pdfrb/model/type/cid_font.rb +52 -1
  210. data/lib/pdfrb/model/type/cid_font_descriptor_metrics.rb +28 -0
  211. data/lib/pdfrb/model/type/cid_system_info.rb +28 -0
  212. data/lib/pdfrb/model/type/circle_annotation.rb +20 -0
  213. data/lib/pdfrb/model/type/collection.rb +27 -0
  214. data/lib/pdfrb/model/type/collection_field.rb +24 -0
  215. data/lib/pdfrb/model/type/collection_item.rb +19 -0
  216. data/lib/pdfrb/model/type/collection_schema.rb +25 -0
  217. data/lib/pdfrb/model/type/collection_sort.rb +13 -0
  218. data/lib/pdfrb/model/type/crypt_filter.rb +58 -0
  219. data/lib/pdfrb/model/type/device_n.rb +37 -0
  220. data/lib/pdfrb/model/type/device_n_mixing_hints.rb +17 -0
  221. data/lib/pdfrb/model/type/device_n_process.rb +13 -0
  222. data/lib/pdfrb/model/type/doc_mdp_transform_parameters.rb +21 -0
  223. data/lib/pdfrb/model/type/document_security_store.rb +55 -0
  224. data/lib/pdfrb/model/type/embedded_file.rb +19 -0
  225. data/lib/pdfrb/model/type/embedded_file_parameter.rb +48 -0
  226. data/lib/pdfrb/model/type/encryption_public_key.rb +38 -0
  227. data/lib/pdfrb/model/type/encryption_standard.rb +68 -0
  228. data/lib/pdfrb/model/type/field_mdp_transform_parameters.rb +26 -0
  229. data/lib/pdfrb/model/type/file_attachment_annotation.rb +29 -0
  230. data/lib/pdfrb/model/type/file_spec_ef.rb +22 -0
  231. data/lib/pdfrb/model/type/file_spec_rf.rb +21 -0
  232. data/lib/pdfrb/model/type/file_specification.rb +43 -0
  233. data/lib/pdfrb/model/type/file_trailer.rb +54 -0
  234. data/lib/pdfrb/model/type/font.rb +73 -2
  235. data/lib/pdfrb/model/type/font_cid_type0.rb +17 -0
  236. data/lib/pdfrb/model/type/font_cid_type2.rb +17 -0
  237. data/lib/pdfrb/model/type/font_descriptor.rb +47 -0
  238. data/lib/pdfrb/model/type/font_descriptor_cid_type0.rb +15 -0
  239. data/lib/pdfrb/model/type/font_descriptor_cid_type2.rb +15 -0
  240. data/lib/pdfrb/model/type/font_encoding.rb +47 -0
  241. data/lib/pdfrb/model/type/font_file.rb +28 -0
  242. data/lib/pdfrb/model/type/font_file2.rb +32 -0
  243. data/lib/pdfrb/model/type/font_file3.rb +23 -0
  244. data/lib/pdfrb/model/type/font_multiple_master.rb +60 -0
  245. data/lib/pdfrb/model/type/font_true_type.rb +1 -1
  246. data/lib/pdfrb/model/type/font_type0.rb +1 -1
  247. data/lib/pdfrb/model/type/font_type1.rb +1 -1
  248. data/lib/pdfrb/model/type/font_type3.rb +1 -1
  249. data/lib/pdfrb/model/type/form_field.rb +73 -0
  250. data/lib/pdfrb/model/type/free_text_annotation.rb +37 -0
  251. data/lib/pdfrb/model/type/function.rb +42 -0
  252. data/lib/pdfrb/model/type/function_exponential.rb +31 -0
  253. data/lib/pdfrb/model/type/function_postscript.rb +25 -0
  254. data/lib/pdfrb/model/type/function_sampled.rb +55 -0
  255. data/lib/pdfrb/model/type/function_stitching.rb +33 -0
  256. data/lib/pdfrb/model/type/generic_appearance.rb +40 -0
  257. data/lib/pdfrb/model/type/graphics_state_parameter.rb +69 -0
  258. data/lib/pdfrb/model/type/halftone.rb +21 -0
  259. data/lib/pdfrb/model/type/halftone_type1.rb +17 -0
  260. data/lib/pdfrb/model/type/halftone_type10.rb +16 -0
  261. data/lib/pdfrb/model/type/halftone_type16.rb +11 -0
  262. data/lib/pdfrb/model/type/halftone_type5.rb +24 -0
  263. data/lib/pdfrb/model/type/halftone_type6.rb +16 -0
  264. data/lib/pdfrb/model/type/highlight_annotation.rb +11 -0
  265. data/lib/pdfrb/model/type/icc_based_color_space.rb +24 -0
  266. data/lib/pdfrb/model/type/icon_fit.rb +31 -0
  267. data/lib/pdfrb/model/type/indexed.rb +32 -0
  268. data/lib/pdfrb/model/type/info.rb +44 -0
  269. data/lib/pdfrb/model/type/ink_annotation.rb +29 -0
  270. data/lib/pdfrb/model/type/interactive_form.rb +36 -0
  271. data/lib/pdfrb/model/type/interior_color.rb +12 -0
  272. data/lib/pdfrb/model/type/jbig2_globals.rb +15 -0
  273. data/lib/pdfrb/model/type/lab.rb +27 -0
  274. data/lib/pdfrb/model/type/line_annotation.rb +44 -0
  275. data/lib/pdfrb/model/type/line_ending_styling.rb +39 -0
  276. data/lib/pdfrb/model/type/link_annotation.rb +41 -0
  277. data/lib/pdfrb/model/type/link_appearance.rb +9 -0
  278. data/lib/pdfrb/model/type/mark_information.rb +23 -0
  279. data/lib/pdfrb/model/type/marked_content_reference.rb +24 -0
  280. data/lib/pdfrb/model/type/markup_annotation.rb +36 -0
  281. data/lib/pdfrb/model/type/mdp_dict.rb +28 -0
  282. data/lib/pdfrb/model/type/measure.rb +39 -0
  283. data/lib/pdfrb/model/type/media_clip.rb +28 -0
  284. data/lib/pdfrb/model/type/media_offset.rb +106 -0
  285. data/lib/pdfrb/model/type/metadata.rb +27 -3
  286. data/lib/pdfrb/model/type/misc_helpers.rb +75 -0
  287. data/lib/pdfrb/model/type/movie.rb +28 -0
  288. data/lib/pdfrb/model/type/names.rb +51 -0
  289. data/lib/pdfrb/model/type/namespace.rb +27 -0
  290. data/lib/pdfrb/model/type/object_reference.rb +31 -0
  291. data/lib/pdfrb/model/type/object_stream.rb +38 -0
  292. data/lib/pdfrb/model/type/opt_content_ext.rb +94 -0
  293. data/lib/pdfrb/model/type/opt_content_page_element.rb +18 -0
  294. data/lib/pdfrb/model/type/optional_content_config.rb +56 -0
  295. data/lib/pdfrb/model/type/optional_content_group.rb +35 -10
  296. data/lib/pdfrb/model/type/optional_content_membership.rb +36 -2
  297. data/lib/pdfrb/model/type/optional_content_properties.rb +16 -1
  298. data/lib/pdfrb/model/type/outline.rb +40 -6
  299. data/lib/pdfrb/model/type/outline_item.rb +45 -0
  300. data/lib/pdfrb/model/type/output_intent.rb +30 -0
  301. data/lib/pdfrb/model/type/page.rb +127 -0
  302. data/lib/pdfrb/model/type/page_label.rb +68 -0
  303. data/lib/pdfrb/model/type/page_tree_node.rb +51 -16
  304. data/lib/pdfrb/model/type/page_tree_node_root.rb +15 -0
  305. data/lib/pdfrb/model/type/pattern.rb +16 -0
  306. data/lib/pdfrb/model/type/pattern_shading.rb +25 -0
  307. data/lib/pdfrb/model/type/pattern_tiling.rb +25 -0
  308. data/lib/pdfrb/model/type/polygon_annotation.rb +29 -0
  309. data/lib/pdfrb/model/type/polygon_polyline.rb +14 -0
  310. data/lib/pdfrb/model/type/polyline_annotation.rb +29 -0
  311. data/lib/pdfrb/model/type/popup_annotation.rb +20 -0
  312. data/lib/pdfrb/model/type/printer_mark_annotation.rb +13 -0
  313. data/lib/pdfrb/model/type/redact_annotation.rb +28 -0
  314. data/lib/pdfrb/model/type/rendition.rb +31 -0
  315. data/lib/pdfrb/model/type/resources.rb +59 -14
  316. data/lib/pdfrb/model/type/rich_media_activation.rb +24 -0
  317. data/lib/pdfrb/model/type/rich_media_animation.rb +25 -0
  318. data/lib/pdfrb/model/type/rich_media_annotation.rb +18 -0
  319. data/lib/pdfrb/model/type/rich_media_command.rb +19 -0
  320. data/lib/pdfrb/model/type/rich_media_configuration.rb +32 -0
  321. data/lib/pdfrb/model/type/rich_media_content.rb +28 -0
  322. data/lib/pdfrb/model/type/rich_media_cue_point.rb +18 -0
  323. data/lib/pdfrb/model/type/rich_media_deactivation.rb +17 -0
  324. data/lib/pdfrb/model/type/rich_media_instance.rb +33 -0
  325. data/lib/pdfrb/model/type/rich_media_presentation.rb +29 -0
  326. data/lib/pdfrb/model/type/rich_media_settings.rb +33 -0
  327. data/lib/pdfrb/model/type/rich_media_window.rb +20 -0
  328. data/lib/pdfrb/model/type/screen_annotation.rb +19 -0
  329. data/lib/pdfrb/model/type/separation.rb +25 -0
  330. data/lib/pdfrb/model/type/sig_field_lock.rb +25 -0
  331. data/lib/pdfrb/model/type/sig_field_seed_value.rb +25 -0
  332. data/lib/pdfrb/model/type/signature.rb +65 -0
  333. data/lib/pdfrb/model/type/signature_build.rb +86 -0
  334. data/lib/pdfrb/model/type/signature_field.rb +17 -0
  335. data/lib/pdfrb/model/type/software_identifier.rb +19 -0
  336. data/lib/pdfrb/model/type/sound.rb +38 -0
  337. data/lib/pdfrb/model/type/sound_annotation.rb +21 -0
  338. data/lib/pdfrb/model/type/square_annotation.rb +24 -0
  339. data/lib/pdfrb/model/type/square_circle.rb +13 -0
  340. data/lib/pdfrb/model/type/squiggly_annotation.rb +11 -0
  341. data/lib/pdfrb/model/type/stamp_annotation.rb +19 -0
  342. data/lib/pdfrb/model/type/strikeout_annotation.rb +11 -0
  343. data/lib/pdfrb/model/type/struct_elem.rb +75 -0
  344. data/lib/pdfrb/model/type/struct_tree_root.rb +34 -0
  345. data/lib/pdfrb/model/type/structure_attributes.rb +44 -0
  346. data/lib/pdfrb/model/type/structure_element_kid.rb +33 -0
  347. data/lib/pdfrb/model/type/text_annotation.rb +25 -0
  348. data/lib/pdfrb/model/type/text_appearance.rb +9 -0
  349. data/lib/pdfrb/model/type/text_field.rb +21 -0
  350. data/lib/pdfrb/model/type/text_markup_annotation.rb +30 -0
  351. data/lib/pdfrb/model/type/three_d_activation.rb +32 -0
  352. data/lib/pdfrb/model/type/three_d_animation_style.rb +24 -0
  353. data/lib/pdfrb/model/type/three_d_background.rb +28 -0
  354. data/lib/pdfrb/model/type/three_d_cross_section.rb +25 -0
  355. data/lib/pdfrb/model/type/three_d_lighting_scheme.rb +26 -0
  356. data/lib/pdfrb/model/type/three_d_measure.rb +20 -0
  357. data/lib/pdfrb/model/type/three_d_measure_3dc.rb +23 -0
  358. data/lib/pdfrb/model/type/three_d_measure_ad3.rb +14 -0
  359. data/lib/pdfrb/model/type/three_d_measure_ld3.rb +14 -0
  360. data/lib/pdfrb/model/type/three_d_measure_pd3.rb +20 -0
  361. data/lib/pdfrb/model/type/three_d_measure_rd3.rb +14 -0
  362. data/lib/pdfrb/model/type/three_d_node.rb +37 -0
  363. data/lib/pdfrb/model/type/three_d_reference.rb +21 -0
  364. data/lib/pdfrb/model/type/three_d_render_mode.rb +34 -0
  365. data/lib/pdfrb/model/type/three_d_stream.rb +48 -0
  366. data/lib/pdfrb/model/type/three_d_units.rb +18 -0
  367. data/lib/pdfrb/model/type/three_d_view.rb +40 -0
  368. data/lib/pdfrb/model/type/to_unicode_cmap_stream.rb +23 -0
  369. data/lib/pdfrb/model/type/transition.rb +68 -0
  370. data/lib/pdfrb/model/type/underline_annotation.rb +11 -0
  371. data/lib/pdfrb/model/type/ur_transform_parameters.rb +33 -0
  372. data/lib/pdfrb/model/type/uri_dict.rb +18 -0
  373. data/lib/pdfrb/model/type/url_alias.rb +19 -0
  374. data/lib/pdfrb/model/type/variable_text_field.rb +47 -0
  375. data/lib/pdfrb/model/type/viewer_preferences.rb +42 -0
  376. data/lib/pdfrb/model/type/watermark_annotation.rb +13 -0
  377. data/lib/pdfrb/model/type/widget_annotation.rb +48 -0
  378. data/lib/pdfrb/model/type/widget_appearance.rb +9 -0
  379. data/lib/pdfrb/model/type/xobject_form.rb +41 -0
  380. data/lib/pdfrb/model/type/xobject_image.rb +56 -0
  381. data/lib/pdfrb/model/type/xref_stream.rb +37 -0
  382. data/lib/pdfrb/model/type.rb +286 -6
  383. data/lib/pdfrb/serializer.rb +2 -2
  384. data/lib/pdfrb/source/tokenizer.rb +0 -2
  385. data/lib/pdfrb/task/benchmark.rb +83 -0
  386. data/lib/pdfrb/task/extract_text.rb +1 -1
  387. data/lib/pdfrb/task/generate_corpus.rb +130 -0
  388. data/lib/pdfrb/task/memory_profile.rb +84 -0
  389. data/lib/pdfrb/task/optimize.rb +97 -7
  390. data/lib/pdfrb/task.rb +3 -3
  391. data/lib/pdfrb/test_utils.rb +112 -0
  392. data/lib/pdfrb/validator.rb +82 -0
  393. data/lib/pdfrb/version.rb +1 -1
  394. data/lib/pdfrb/writer.rb +117 -27
  395. data/lib/pdfrb/xmp/packet.rb +122 -0
  396. data/lib/pdfrb/xmp/schemas.rb +96 -0
  397. data/lib/pdfrb/xmp.rb +44 -0
  398. data/lib/pdfrb/xref_section.rb +2 -2
  399. data/lib/pdfrb.rb +24 -54
  400. data/pdfrb.gemspec +45 -0
  401. data/script/apply_fixes.sh +843 -0
  402. data/script/make_jpeg_fixture.rb +53 -0
  403. data/script/make_png_fixture.rb +25 -0
  404. metadata +311 -2
@@ -2,26 +2,20 @@
2
2
 
3
3
  module Pdfrb
4
4
  module Content
5
- # High-level drawing API on a Stream (page /Contents or Form
6
- # XObject). The Canvas emits operators via the +Serializer+ and
7
- # appends the bytes to the Stream's raw payload.
8
- #
9
- # Methods mirror HexaPDF::Content::Canvas where the names are
10
- # intuitive; PDF-specific concepts (q/Q, marked content) are
11
- # exposed via Ruby-block syntax.
12
5
  class Canvas
13
- attr_reader :stream, :document, :serializer
6
+ attr_reader :stream, :document, :serializer, :used_fonts, :used_xobjects
14
7
 
15
8
  def initialize(stream, document: nil)
9
+ Pdfrb::Content::Operator.eager_load!
16
10
  @stream = stream
17
11
  @document = document || stream.document
18
12
  @serializer = Pdfrb::Serializer.new
13
+ @used_fonts = {}
14
+ @used_xobjects = {}
19
15
  ensure_stream_payload
20
16
  end
21
17
 
22
- # ---- State stack ----
23
-
24
- def save_graphics_state(&block)
18
+ def save_graphics_state(&)
25
19
  emit_op Pdfrb::Content::Operator::SaveGraphicsState
26
20
  if block_given?
27
21
  begin
@@ -34,44 +28,39 @@ module Pdfrb
34
28
  end
35
29
  alias with_graphics_state save_graphics_state
36
30
 
37
- # ---- Transforms ----
38
-
39
- def translate(tx, ty, &block)
40
- concat(1, 0, 0, 1, tx, ty, &block)
31
+ def translate(tx, ty, &)
32
+ concat(1, 0, 0, 1, tx, ty, &)
41
33
  end
42
34
 
43
- def scale(sx, sy = sx, &block)
44
- concat(sx, 0, 0, sy, 0, 0, &block)
35
+ def scale(sx, sy = sx, &)
36
+ concat(sx, 0, 0, sy, 0, 0, &)
45
37
  end
46
38
 
47
- def rotate(angle_in_radians, &block)
39
+ def rotate(angle_in_radians, &)
48
40
  c = Math.cos(angle_in_radians)
49
41
  s = Math.sin(angle_in_radians)
50
- concat(c, s, -s, c, 0, 0, &block)
42
+ concat(c, s, -s, c, 0, 0, &)
51
43
  end
52
44
 
53
- def concat(a, b, c, d, e, f, &block)
45
+ def concat(a, b, c, d, e, f, &)
54
46
  emit_op Pdfrb::Content::Operator::ConcatMatrix, a, b, c, d, e, f
55
47
  return self unless block_given?
56
48
 
57
49
  begin
58
50
  yield self
59
51
  ensure
60
- # Reverse by save/restore so the caller's matrix is unchanged.
61
52
  emit_op Pdfrb::Content::Operator::SaveGraphicsState
62
53
  end
63
54
  self
64
55
  end
65
56
 
66
- # ---- Path construction ----
67
-
68
57
  def move_to(x, y)
69
- emit_op Pdfrb::Content::Operator::MoveTo, x, y
58
+ emit_op(Pdfrb::Content::Operator::MoveTo, x, y)
70
59
  self
71
60
  end
72
61
 
73
62
  def line_to(x, y)
74
- emit_op Pdfrb::Content::Operator::LineTo, x, y
63
+ emit_op(Pdfrb::Content::Operator::LineTo, x, y)
75
64
  self
76
65
  end
77
66
 
@@ -80,24 +69,22 @@ module Pdfrb
80
69
  end
81
70
 
82
71
  def curve_to(c1x, c1y, c2x, c2y, x, y)
83
- emit_op Pdfrb::Content::Operator::CurveTo, c1x, c1y, c2x, c2y, x, y
72
+ emit_op(Pdfrb::Content::Operator::CurveTo, c1x, c1y, c2x, c2y, x, y)
84
73
  self
85
74
  end
86
75
 
87
76
  def rectangle(x, y, width, height)
88
- emit_op Pdfrb::Content::Operator::Rectangle, x, y, width, height
77
+ emit_op(Pdfrb::Content::Operator::Rectangle, x, y, width, height)
89
78
  self
90
79
  end
91
80
 
92
81
  def close_path
93
- emit_op Pdfrb::Content::Operator::ClosePath
82
+ emit_op(Pdfrb::Content::Operator::ClosePath)
94
83
  self
95
84
  end
96
85
 
97
- # ---- Painting ----
98
-
99
86
  def stroke
100
- emit_op Pdfrb::Content::Operator::Stroke
87
+ emit_op(Pdfrb::Content::Operator::Stroke)
101
88
  self
102
89
  end
103
90
 
@@ -105,7 +92,7 @@ module Pdfrb
105
92
  op = rule == :even_odd ?
106
93
  Pdfrb::Content::Operator::FillEvenOdd :
107
94
  Pdfrb::Content::Operator::FillNonZero
108
- emit_op op
95
+ emit_op(op)
109
96
  self
110
97
  end
111
98
 
@@ -113,16 +100,31 @@ module Pdfrb
113
100
  op = rule == :even_odd ?
114
101
  Pdfrb::Content::Operator::FillStrokeEvenOdd :
115
102
  Pdfrb::Content::Operator::FillStrokeNonZero
116
- emit_op op
103
+ emit_op(op)
117
104
  self
118
105
  end
119
106
 
120
107
  def end_path
121
- emit_op Pdfrb::Content::Operator::EndPath
108
+ emit_op(Pdfrb::Content::Operator::EndPath)
122
109
  self
123
110
  end
124
111
 
125
- # ---- Color ----
112
+ def clip
113
+ emit_op(Pdfrb::Content::Operator::ClipNonZero)
114
+ emit_op(Pdfrb::Content::Operator::EndPath)
115
+ self
116
+ end
117
+
118
+ def clip_even_odd
119
+ emit_op(Pdfrb::Content::Operator::ClipEvenOdd)
120
+ emit_op(Pdfrb::Content::Operator::EndPath)
121
+ self
122
+ end
123
+
124
+ def fill_shading(name)
125
+ append(" /#{name} sh\n")
126
+ self
127
+ end
126
128
 
127
129
  def fill_color(color)
128
130
  case color
@@ -144,69 +146,191 @@ module Pdfrb
144
146
  self
145
147
  end
146
148
 
147
- # ---- Text ----
149
+ def opacity=(alpha)
150
+ emit_op(Pdfrb::Content::Operator::ApplyExtGState,
151
+ create_ext_g_state(ca: alpha, CA: alpha))
152
+ end
153
+
154
+ def blend_mode=(mode)
155
+ emit_op(Pdfrb::Content::Operator::ApplyExtGState,
156
+ create_ext_g_state(BM: mode.to_s))
157
+ end
158
+
159
+ def with_transparency(opacity: 1.0, blend_mode: nil)
160
+ save_graphics_state
161
+ self.opacity = opacity if opacity < 1.0
162
+ self.blend_mode = blend_mode if blend_mode
163
+
164
+ begin
165
+ yield self
166
+ ensure
167
+ emit_op(Pdfrb::Content::Operator::RestoreGraphicsState)
168
+ end
169
+ self
170
+ end
171
+
172
+ def draw_image(name, at: nil, width: nil, height: nil, matrix: nil)
173
+ @used_xobjects[name] = true
174
+ save_graphics_state do
175
+ if matrix
176
+ a, b, c, d, e, f = matrix
177
+ concat(a, b, c, d, e, f)
178
+ emit_op(Pdfrb::Content::Operator::InvokeXObject, name)
179
+ else
180
+ translate(at[0], at[1])
181
+ concat(width, 0, 0, height, 0, 0)
182
+ append(" /#{name} Do\n")
183
+ end
184
+ end
185
+ self
186
+ end
187
+
188
+ def draw_image_matrix(name, a:, b:, c:, d:, e:, f:)
189
+ @used_xobjects[name] = true
190
+ save_graphics_state do
191
+ concat(a, b, c, d, e, f)
192
+ emit_op(Pdfrb::Content::Operator::InvokeXObject, name)
193
+ end
194
+ self
195
+ end
196
+
197
+ # Draw a Form XObject by resource name at (x, y) with an optional
198
+ # matrix transform. Public API for page stamping, form flattening,
199
+ # and appearance-stream embedding.
200
+ # @param name [Symbol] the resource name in /Resources /XObject.
201
+ # @param at [Array<Numeric>] x, y translation.
202
+ # @param matrix [Array<Numeric>, nil] 6-element transform matrix.
203
+ def draw_form_xobject(name, at: [0, 0], matrix: nil)
204
+ @used_xobjects[name] = true
205
+ save_graphics_state do
206
+ if matrix
207
+ a, b, c, d, e, f = matrix
208
+ concat(a, b, c, d, e, f)
209
+ elsif at
210
+ translate(at[0], at[1])
211
+ end
212
+ emit_op(Pdfrb::Content::Operator::InvokeXObject, name)
213
+ end
214
+ self
215
+ end
148
216
 
149
- # Show +text+ at (+x+, +y+) in the named font. Caller is
150
- # responsible for registering the font in the page resources
151
- # under +font_name+ before this call.
152
217
  def text(str, at:, font:, size:, char_spacing: nil, word_spacing: nil)
153
- emit_op Pdfrb::Content::Operator::BeginText
154
- emit_op Pdfrb::Content::Operator::SetTextMatrix,
155
- 1, 0, 0, 1, at[0], at[1]
156
- emit_op Pdfrb::Content::Operator::Font, font, size
157
- emit_op Pdfrb::Content::Operator::CharSpacing, char_spacing if char_spacing
158
- emit_op Pdfrb::Content::Operator::WordSpacing, word_spacing if word_spacing
159
- emit_op Pdfrb::Content::Operator::ShowText, str.to_s
160
- emit_op Pdfrb::Content::Operator::EndText
218
+ @used_fonts[font] = size
219
+ encoded = encode_for_font(str.to_s, font)
220
+ emit_op(Pdfrb::Content::Operator::BeginText)
221
+ emit_op(Pdfrb::Content::Operator::SetTextMatrix, 1, 0, 0, 1, at[0], at[1])
222
+ emit_op(Pdfrb::Content::Operator::Font, font, size)
223
+ emit_op(Pdfrb::Content::Operator::CharSpacing, char_spacing) if char_spacing
224
+ emit_op(Pdfrb::Content::Operator::WordSpacing, word_spacing) if word_spacing
225
+ emit_op(Pdfrb::Content::Operator::ShowText, encoded)
226
+ emit_op(Pdfrb::Content::Operator::EndText)
161
227
  self
162
228
  end
163
229
 
164
- # ---- Graphics-state params ----
230
+ def text_lines(lines, font:, size:, at:, leading: nil, char_spacing: nil,
231
+ word_spacing: nil)
232
+ lead = leading || (size * 1.2)
233
+ x, y = at
234
+ lines.each do |line|
235
+ text(line, at: [x, y], font: font, size: size,
236
+ char_spacing: char_spacing, word_spacing: word_spacing)
237
+ y -= lead
238
+ end
239
+ self
240
+ end
241
+
242
+ def text_rich(runs, at:)
243
+ emit_op(Pdfrb::Content::Operator::BeginText)
244
+ cx, cy = at
245
+ runs.each do |run|
246
+ @used_fonts[run[:font]] = run[:size]
247
+ emit_op(Pdfrb::Content::Operator::SetTextMatrix, 1, 0, 0, 1, cx, cy)
248
+ emit_op(Pdfrb::Content::Operator::Font, run[:font], run[:size])
249
+ fill_color(run[:color]) if run[:color]
250
+ emit_op(Pdfrb::Content::Operator::ShowText,
251
+ encode_for_font(run[:text].to_s, run[:font]))
252
+ advance = @document&.fonts&.measure_text(
253
+ run[:text], font: run[:font], size: run[:size]
254
+ ) || 0
255
+ cx += advance
256
+ end
257
+ emit_op(Pdfrb::Content::Operator::EndText)
258
+ self
259
+ end
165
260
 
166
261
  def line_width=(n)
167
- emit_op Pdfrb::Content::Operator::LineWidth, n
262
+ emit_op(Pdfrb::Content::Operator::LineWidth, n)
168
263
  end
169
264
 
170
265
  def line_cap=(n)
171
- emit_op Pdfrb::Content::Operator::LineCap, n
266
+ emit_op(Pdfrb::Content::Operator::LineCap, n)
172
267
  end
173
268
 
174
269
  def line_join=(n)
175
- emit_op Pdfrb::Content::Operator::LineJoin, n
270
+ emit_op(Pdfrb::Content::Operator::LineJoin, n)
176
271
  end
177
272
 
178
273
  def miter_limit=(n)
179
- emit_op Pdfrb::Content::Operator::MiterLimit, n
274
+ emit_op(Pdfrb::Content::Operator::MiterLimit, n)
180
275
  end
181
276
 
182
277
  def dash_pattern=(spec)
183
- if spec.is_a?(::Array)
184
- array, phase = spec
185
- else
186
- array, phase = spec, 0
187
- end
188
- emit_op Pdfrb::Content::Operator::DashPattern, array, phase
278
+ array, phase = spec.is_a?(::Array) ? spec : [spec, 0]
279
+ emit_op(Pdfrb::Content::Operator::DashPattern, array, phase)
189
280
  end
190
281
 
191
- # ---- Marked content ----
192
-
193
- def marked_content(tag, properties = nil, &block)
282
+ def marked_content(tag, properties = nil, &)
194
283
  if properties
195
- emit_op Pdfrb::Content::Operator::BeginMarkedContentWithProperties, tag, properties
284
+ emit_op(Pdfrb::Content::Operator::BeginMarkedContentWithProperties,
285
+ tag, properties)
196
286
  else
197
- emit_op Pdfrb::Content::Operator::BeginMarkedContent, tag
287
+ emit_op(Pdfrb::Content::Operator::BeginMarkedContent, tag)
198
288
  end
199
289
  return self unless block_given?
200
290
 
201
291
  begin
202
292
  yield self
203
293
  ensure
204
- emit_op Pdfrb::Content::Operator::EndMarkedContent
294
+ emit_op(Pdfrb::Content::Operator::EndMarkedContent)
205
295
  end
206
296
  self
207
297
  end
208
298
 
209
- # ---- Internal ----
299
+ def end_marked_content
300
+ emit_op(Pdfrb::Content::Operator::EndMarkedContent)
301
+ self
302
+ end
303
+
304
+ def tagged(tag, mcid: nil, **props, &)
305
+ p = props.dup
306
+ p[:MCID] = mcid if mcid
307
+ p = nil if p.empty?
308
+ marked_content(tag, p, &)
309
+ end
310
+
311
+ def artifact(type = nil, &)
312
+ if type
313
+ marked_content(:Artifact, { Type: type }, &)
314
+ else
315
+ marked_content(:Artifact, &)
316
+ end
317
+ end
318
+
319
+ def populate_resources!(page)
320
+ r = page.value[:Resources]
321
+ r = {} unless r.is_a?(::Hash)
322
+ unless @used_fonts.empty?
323
+ fd = r[:Font] || {}
324
+ @used_fonts.each_key { |n| fd[n] = fd[n] || n }
325
+ r[:Font] = fd
326
+ end
327
+ unless @used_xobjects.empty?
328
+ xd = r[:XObject] || {}
329
+ @used_xobjects.each_key { |n| xd[n] = xd[n] || n }
330
+ r[:XObject] = xd
331
+ end
332
+ page.value[:Resources] = r
333
+ end
210
334
 
211
335
  def emit_op(op_class, *operands)
212
336
  bytes = op_class.serialize(@serializer, *operands)
@@ -216,19 +340,15 @@ module Pdfrb
216
340
  private
217
341
 
218
342
  def ensure_stream_payload
219
- return if @stream.stream.is_a?(::String)
220
-
221
- @stream.stream = ""
343
+ @stream.stream = "" unless @stream.stream.is_a?(::String)
222
344
  end
223
345
 
224
346
  def append(bytes)
225
- new_payload = (@stream.stream || +"") + bytes.to_s
226
- @stream.stream = new_payload
347
+ @stream.stream = (@stream.stream || +"") + bytes.to_s
227
348
  end
228
349
 
229
350
  def emit_color_op(fill, family, rest)
230
- klass = color_op_class(family, fill)
231
- emit_op(klass, *rest)
351
+ emit_op(color_op_class(family, fill), *rest)
232
352
  end
233
353
 
234
354
  def color_op_class(family, fill)
@@ -243,6 +363,31 @@ module Pdfrb
243
363
  raise ArgumentError, "unknown color family #{family.inspect}"
244
364
  end
245
365
  end
366
+
367
+ def encode_for_font(text, font_resource)
368
+ return text.b if text.encoding == Encoding::BINARY
369
+
370
+ fonts = @document&.fonts
371
+ return text.b unless fonts&.encoding_for(font_resource)
372
+
373
+ fonts.encode_text(text, font_resource)
374
+ end
375
+
376
+ def create_ext_g_state(**fields)
377
+ @ext_g_state_counter ||= 0
378
+ @ext_g_state_counter += 1
379
+ name = :"GS#{@ext_g_state_counter}"
380
+ gs = @document.add(
381
+ { Type: :ExtGState }.merge!(fields),
382
+ type: Pdfrb::Model::Cos::Dictionary
383
+ )
384
+ r = @stream.value[:Resources] || {}
385
+ eg = r[:ExtGState] || {}
386
+ eg[name] = Pdfrb::Model::Reference.new(gs.oid, gs.gen)
387
+ r[:ExtGState] = eg
388
+ @stream.value[:Resources] = r
389
+ name
390
+ end
246
391
  end
247
392
  end
248
393
  end
@@ -0,0 +1,157 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Content
5
+ module ColorSpace
6
+ REGISTRY = {} # rubocop:disable Style/MutableConstant
7
+
8
+ class << self
9
+ def register(name, klass)
10
+ REGISTRY[name.to_sym] = klass
11
+ end
12
+
13
+ def resolve(name, _document = nil)
14
+ REGISTRY[name.to_sym]
15
+ end
16
+
17
+ def families
18
+ REGISTRY.keys
19
+ end
20
+ end
21
+
22
+ class DeviceGray
23
+ def self.family; :DeviceGray; end
24
+ def self.components; 1; end
25
+ def self.default; [0.0]; end
26
+ end
27
+ register :DeviceGray, DeviceGray
28
+
29
+ class DeviceRGB
30
+ def self.family; :DeviceRGB; end
31
+ def self.components; 3; end
32
+ def self.default; [0.0, 0.0, 0.0]; end
33
+ end
34
+ register :DeviceRGB, DeviceRGB
35
+
36
+ class DeviceCMYK
37
+ def self.family; :DeviceCMYK; end
38
+ def self.components; 4; end
39
+ def self.default; [0.0, 0.0, 0.0, 1.0]; end
40
+ end
41
+ register :DeviceCMYK, DeviceCMYK
42
+
43
+ class CalGray
44
+ attr_reader :white_point, :gamma
45
+
46
+ def initialize(white_point:, gamma: 1.0)
47
+ @white_point = white_point
48
+ @gamma = gamma
49
+ end
50
+
51
+ def family; :CalGray; end
52
+ def components; 1; end
53
+ end
54
+ register :CalGray, CalGray
55
+
56
+ class CalRGB
57
+ attr_reader :white_point, :black_point, :gamma
58
+
59
+ def initialize(white_point:, black_point: [0, 0, 0], gamma: [1, 1, 1])
60
+ @white_point = white_point
61
+ @black_point = black_point
62
+ @gamma = gamma
63
+ end
64
+
65
+ def family; :CalRGB; end
66
+ def components; 3; end
67
+ end
68
+ register :CalRGB, CalRGB
69
+
70
+ class Lab
71
+ attr_reader :white_point, :black_point, :range
72
+
73
+ def initialize(white_point:, black_point: [0, 0, 0], range: [-100, 100, -100, 100])
74
+ @white_point = white_point
75
+ @black_point = black_point
76
+ @range = range
77
+ end
78
+
79
+ def family; :Lab; end
80
+ def components; 3; end
81
+ end
82
+ register :Lab, Lab
83
+
84
+ class ICCBased
85
+ attr_reader :stream_ref, :alternate, :range, :n
86
+
87
+ def initialize(stream_ref:, n:, alternate: nil, range: nil)
88
+ @stream_ref = stream_ref
89
+ @n = n
90
+ @alternate = alternate
91
+ @range = range
92
+ end
93
+
94
+ def family; :ICCBased; end
95
+ def components; @n; end
96
+ end
97
+ register :ICCBased, ICCBased
98
+
99
+ class Indexed
100
+ attr_reader :base, :hival, :lookup
101
+
102
+ def initialize(base:, hival:, lookup:)
103
+ @base = base
104
+ @hival = hival
105
+ @lookup = lookup
106
+ end
107
+
108
+ def family; :Indexed; end
109
+ def components; 1; end
110
+ end
111
+ register :Indexed, Indexed
112
+
113
+ class Separation
114
+ attr_reader :name, :alternate_space, :tint_transform
115
+
116
+ def initialize(name:, alternate_space:, tint_transform:)
117
+ @name = name
118
+ @alternate_space = alternate_space
119
+ @tint_transform = tint_transform
120
+ end
121
+
122
+ def family; :Separation; end
123
+ def components; 1; end
124
+ end
125
+ register :Separation, Separation
126
+
127
+ class DeviceN
128
+ attr_reader :names, :alternate_space, :tint_transform
129
+
130
+ def initialize(names:, alternate_space:, tint_transform:)
131
+ @names = names
132
+ @alternate_space = alternate_space
133
+ @tint_transform = tint_transform
134
+ end
135
+
136
+ def family; :DeviceN; end
137
+
138
+ def components
139
+ (@names || []).length
140
+ end
141
+ end
142
+ register :DeviceN, DeviceN
143
+
144
+ class Pattern
145
+ attr_reader :base_space
146
+
147
+ def initialize(base_space: nil)
148
+ @base_space = base_space
149
+ end
150
+
151
+ def family; :Pattern; end
152
+ def components; 0; end
153
+ end
154
+ register :Pattern, Pattern
155
+ end
156
+ end
157
+ end