pdfrb 0.3.0 → 0.7.1

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 (422) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/CHANGELOG.md +51 -0
  4. data/Gemfile +1 -0
  5. data/PROPOSAL.canvas-clip.md +92 -0
  6. data/PROPOSAL.canvas-draw-image-matrix.md +87 -0
  7. data/PROPOSAL.canvas-rich-text.md +103 -0
  8. data/PROPOSAL.canvas-text-lines.md +77 -0
  9. data/PROPOSAL.canvas-transparency.md +106 -0
  10. data/PROPOSAL.external-font-metrics.md +129 -0
  11. data/PROPOSAL.font-embedding-fontfile2.md +88 -0
  12. data/PROPOSAL.font-resolver-ttc.md +105 -0
  13. data/PROPOSAL.font-resolver.md +96 -0
  14. data/PROPOSAL.font-subsetting.md +98 -0
  15. data/PROPOSAL.gradient-shadings.md +110 -0
  16. data/PROPOSAL.page-mediabox-setter.md +66 -0
  17. data/PROPOSAL.per-glyph-width.md +91 -0
  18. data/PROPOSAL.stringio-require.md +53 -0
  19. data/PROPOSAL.struct-tree-root.md +102 -0
  20. data/PROPOSAL.text-measurement.md +93 -0
  21. data/PROPOSAL.ttf-table-parsing-fix.md +112 -0
  22. data/RELEASE.md +61 -0
  23. data/data/pdfrb/afm/Courier-Bold.afm +342 -342
  24. data/data/pdfrb/afm/Courier-BoldOblique.afm +342 -342
  25. data/data/pdfrb/afm/Courier-Oblique.afm +342 -342
  26. data/data/pdfrb/afm/Courier.afm +342 -342
  27. data/data/pdfrb/afm/Helvetica-Bold.afm +2827 -2827
  28. data/data/pdfrb/afm/Helvetica-BoldOblique.afm +2827 -2827
  29. data/data/pdfrb/afm/Helvetica-Oblique.afm +3051 -3051
  30. data/data/pdfrb/afm/Helvetica.afm +3051 -3051
  31. data/data/pdfrb/afm/Symbol.afm +213 -213
  32. data/data/pdfrb/afm/Times-Bold.afm +2588 -2588
  33. data/data/pdfrb/afm/Times-BoldItalic.afm +2384 -2384
  34. data/data/pdfrb/afm/Times-Italic.afm +2667 -2667
  35. data/data/pdfrb/afm/Times-Roman.afm +2419 -2419
  36. data/data/pdfrb/afm/ZapfDingbats.afm +225 -225
  37. data/lib/pdfrb/action/base.rb +21 -0
  38. data/lib/pdfrb/action/types.rb +178 -0
  39. data/lib/pdfrb/action.rb +55 -0
  40. data/lib/pdfrb/annotation/base.rb +79 -0
  41. data/lib/pdfrb/annotation/types.rb +222 -0
  42. data/lib/pdfrb/annotation.rb +78 -0
  43. data/lib/pdfrb/appearance/generator.rb +216 -0
  44. data/lib/pdfrb/appearance.rb +11 -0
  45. data/lib/pdfrb/arlington/object_definition.rb +2 -2
  46. data/lib/pdfrb/arlington/predicate/evaluator.rb +1 -1
  47. data/lib/pdfrb/arlington/predicate/functions.rb +25 -9
  48. data/lib/pdfrb/arlington/predicate.rb +1 -5
  49. data/lib/pdfrb/cli/batch.rb +18 -0
  50. data/lib/pdfrb/cli/debug_info.rb +18 -0
  51. data/lib/pdfrb/cli/files.rb +16 -0
  52. data/lib/pdfrb/cli/fonts.rb +16 -0
  53. data/lib/pdfrb/cli/form.rb +18 -0
  54. data/lib/pdfrb/cli/image2pdf.rb +18 -0
  55. data/lib/pdfrb/cli/images.rb +34 -0
  56. data/lib/pdfrb/cli/info.rb +20 -0
  57. data/lib/pdfrb/cli/inspect.rb +18 -0
  58. data/lib/pdfrb/cli/merge.rb +18 -0
  59. data/lib/pdfrb/cli/modify.rb +18 -0
  60. data/lib/pdfrb/cli/optimize.rb +18 -0
  61. data/lib/pdfrb/cli/split.rb +21 -0
  62. data/lib/pdfrb/cli/watermark.rb +18 -0
  63. data/lib/pdfrb/cli.rb +291 -7
  64. data/lib/pdfrb/color/color_space.rb +259 -0
  65. data/lib/pdfrb/color/icc_profile.rb +90 -0
  66. data/lib/pdfrb/color.rb +12 -0
  67. data/lib/pdfrb/compare/comparator.rb +244 -0
  68. data/lib/pdfrb/compare/report.rb +78 -0
  69. data/lib/pdfrb/compare.rb +42 -0
  70. data/lib/pdfrb/composer.rb +161 -0
  71. data/lib/pdfrb/conformance/pdf_a.rb +317 -56
  72. data/lib/pdfrb/conformance/pdf_ua.rb +186 -29
  73. data/lib/pdfrb/conformance/pdf_x.rb +247 -0
  74. data/lib/pdfrb/conformance/rule.rb +78 -0
  75. data/lib/pdfrb/conformance/structure_elements.rb +174 -0
  76. data/lib/pdfrb/conformance/verapdf_bridge.rb +92 -0
  77. data/lib/pdfrb/conformance.rb +7 -3
  78. data/lib/pdfrb/content/canvas.rb +354 -72
  79. data/lib/pdfrb/content/color_space.rb +157 -0
  80. data/lib/pdfrb/content/hidden_text_detector.rb +167 -0
  81. data/lib/pdfrb/content/operator.rb +21 -1
  82. data/lib/pdfrb/content/operators/clipping.rb +36 -0
  83. data/lib/pdfrb/content/operators/graphics_state_params.rb +15 -0
  84. data/lib/pdfrb/content/operators/inline_image.rb +53 -0
  85. data/lib/pdfrb/content/operators.rb +22 -0
  86. data/lib/pdfrb/content/shading/base.rb +139 -0
  87. data/lib/pdfrb/content/shading.rb +17 -0
  88. data/lib/pdfrb/content/smart_text_extractor.rb +85 -0
  89. data/lib/pdfrb/content/tiling_pattern.rb +78 -0
  90. data/lib/pdfrb/content/transformation_matrix.rb +61 -0
  91. data/lib/pdfrb/content.rb +7 -26
  92. data/lib/pdfrb/destination/fit.rb +185 -0
  93. data/lib/pdfrb/destination.rb +13 -0
  94. data/lib/pdfrb/digital_signature/cms_handler.rb +22 -0
  95. data/lib/pdfrb/digital_signature/signing.rb +107 -11
  96. data/lib/pdfrb/digital_signature/timestamp_handler.rb +45 -0
  97. data/lib/pdfrb/digital_signature/verification.rb +88 -9
  98. data/lib/pdfrb/digital_signature/verification_result.rb +14 -0
  99. data/lib/pdfrb/digital_signature.rb +26 -2
  100. data/lib/pdfrb/document/annotations.rb +120 -3
  101. data/lib/pdfrb/document/associated_files.rb +104 -0
  102. data/lib/pdfrb/document/colors.rb +95 -0
  103. data/lib/pdfrb/document/destinations.rb +127 -5
  104. data/lib/pdfrb/document/display.rb +84 -0
  105. data/lib/pdfrb/document/fonts.rb +417 -45
  106. data/lib/pdfrb/document/form.rb +338 -0
  107. data/lib/pdfrb/document/graphics_state.rb +91 -0
  108. data/lib/pdfrb/document/images.rb +4 -4
  109. data/lib/pdfrb/document/info.rb +102 -0
  110. data/lib/pdfrb/document/layers.rb +62 -0
  111. data/lib/pdfrb/document/metadata.rb +12 -5
  112. data/lib/pdfrb/document/output_intents.rb +91 -0
  113. data/lib/pdfrb/document/page_labels.rb +80 -0
  114. data/lib/pdfrb/document/pages.rb +68 -19
  115. data/lib/pdfrb/document/portfolio.rb +119 -0
  116. data/lib/pdfrb/document/shadings.rb +159 -0
  117. data/lib/pdfrb/document/stamps.rb +68 -0
  118. data/lib/pdfrb/document/structure.rb +242 -0
  119. data/lib/pdfrb/document.rb +73 -4
  120. data/lib/pdfrb/encryption/identity.rb +13 -0
  121. data/lib/pdfrb/encryption/password_verification.rb +53 -8
  122. data/lib/pdfrb/encryption/security_handler.rb +8 -5
  123. data/lib/pdfrb/encryption/standard_security_handler.rb +154 -81
  124. data/lib/pdfrb/encryption.rb +17 -0
  125. data/lib/pdfrb/error.rb +2 -2
  126. data/lib/pdfrb/filter/brotli_decode.rb +32 -0
  127. data/lib/pdfrb/filter/ccitt_fax_decode.rb +12 -0
  128. data/lib/pdfrb/filter/crypt.rb +2 -2
  129. data/lib/pdfrb/filter/dct_decode.rb +18 -0
  130. data/lib/pdfrb/filter/flate_decode.rb +4 -18
  131. data/lib/pdfrb/filter/jbig2_decode.rb +12 -0
  132. data/lib/pdfrb/filter/jpx_decode.rb +18 -0
  133. data/lib/pdfrb/filter/lzw_decode.rb +3 -2
  134. data/lib/pdfrb/filter/png_predictor.rb +94 -0
  135. data/lib/pdfrb/filter.rb +26 -13
  136. data/lib/pdfrb/font/afm_parser.rb +50 -26
  137. data/lib/pdfrb/font/cmap/writer.rb +9 -0
  138. data/lib/pdfrb/font/encoding/win_ansi_encoding.rb +17 -0
  139. data/lib/pdfrb/font/encoding.rb +32 -3
  140. data/lib/pdfrb/font/metrics_helper.rb +121 -0
  141. data/lib/pdfrb/font/true_type/file.rb +10 -1
  142. data/lib/pdfrb/font/true_type/glyf.rb +82 -0
  143. data/lib/pdfrb/font/true_type/kern.rb +58 -0
  144. data/lib/pdfrb/font/true_type/loca.rb +42 -0
  145. data/lib/pdfrb/font/true_type/maxp.rb +44 -0
  146. data/lib/pdfrb/font/true_type/name.rb +53 -0
  147. data/lib/pdfrb/font/true_type/post.rb +93 -0
  148. data/lib/pdfrb/font/true_type/subsetter.rb +3 -5
  149. data/lib/pdfrb/font/true_type/wrapper.rb +102 -0
  150. data/lib/pdfrb/font/true_type.rb +7 -0
  151. data/lib/pdfrb/font.rb +2 -0
  152. data/lib/pdfrb/font_loader/from_configuration.rb +19 -0
  153. data/lib/pdfrb/font_loader/from_file.rb +20 -0
  154. data/lib/pdfrb/font_loader/standard14.rb +20 -0
  155. data/lib/pdfrb/font_loader/variant_from_name.rb +36 -0
  156. data/lib/pdfrb/font_loader.rb +4 -0
  157. data/lib/pdfrb/font_resolver.rb +138 -0
  158. data/lib/pdfrb/image/audit.rb +94 -0
  159. data/lib/pdfrb/image/downsampler.rb +124 -0
  160. data/lib/pdfrb/image.rb +13 -0
  161. data/lib/pdfrb/image_loader/jpeg.rb +39 -58
  162. data/lib/pdfrb/image_loader/png.rb +82 -251
  163. data/lib/pdfrb/layout/bidi.rb +198 -0
  164. data/lib/pdfrb/layout/box.rb +49 -0
  165. data/lib/pdfrb/layout/box_fitter.rb +54 -0
  166. data/lib/pdfrb/layout/column_box.rb +71 -0
  167. data/lib/pdfrb/layout/container_box.rb +45 -0
  168. data/lib/pdfrb/layout/frame.rb +67 -0
  169. data/lib/pdfrb/layout/image_box.rb +44 -0
  170. data/lib/pdfrb/layout/inline_box.rb +25 -0
  171. data/lib/pdfrb/layout/line.rb +55 -0
  172. data/lib/pdfrb/layout/list_box.rb +87 -0
  173. data/lib/pdfrb/layout/numeric_refinements.rb +43 -0
  174. data/lib/pdfrb/layout/page_style.rb +65 -0
  175. data/lib/pdfrb/layout/style.rb +62 -0
  176. data/lib/pdfrb/layout/table_box.rb +66 -0
  177. data/lib/pdfrb/layout/text_box.rb +38 -0
  178. data/lib/pdfrb/layout/text_fragment.rb +45 -0
  179. data/lib/pdfrb/layout/text_layouter.rb +123 -0
  180. data/lib/pdfrb/layout.rb +28 -0
  181. data/lib/pdfrb/linearization/hint_stream.rb +93 -0
  182. data/lib/pdfrb/linearization/writer.rb +259 -0
  183. data/lib/pdfrb/linearization.rb +21 -0
  184. data/lib/pdfrb/model/cos/dictionary.rb +12 -0
  185. data/lib/pdfrb/model/pdf_array.rb +2 -2
  186. data/lib/pdfrb/model/type/action.rb +42 -0
  187. data/lib/pdfrb/model/type/action_go_to_3d_view.rb +14 -0
  188. data/lib/pdfrb/model/type/action_go_to_dp.rb +16 -0
  189. data/lib/pdfrb/model/type/action_go_to_r.rb +26 -0
  190. data/lib/pdfrb/model/type/action_goto.rb +34 -0
  191. data/lib/pdfrb/model/type/action_hide.rb +26 -0
  192. data/lib/pdfrb/model/type/action_import_data.rb +18 -0
  193. data/lib/pdfrb/model/type/action_java_script.rb +18 -0
  194. data/lib/pdfrb/model/type/action_launch.rb +22 -0
  195. data/lib/pdfrb/model/type/action_movie.rb +22 -0
  196. data/lib/pdfrb/model/type/action_named.rb +23 -0
  197. data/lib/pdfrb/model/type/action_nop.rb +12 -0
  198. data/lib/pdfrb/model/type/action_rendition.rb +28 -0
  199. data/lib/pdfrb/model/type/action_reset_form.rb +22 -0
  200. data/lib/pdfrb/model/type/action_rich_media_execute.rb +17 -0
  201. data/lib/pdfrb/model/type/action_set_ocg_state.rb +32 -0
  202. data/lib/pdfrb/model/type/action_set_state.rb +14 -0
  203. data/lib/pdfrb/model/type/action_sound_action.rb +23 -0
  204. data/lib/pdfrb/model/type/action_submit_form.rb +64 -0
  205. data/lib/pdfrb/model/type/action_thread.rb +23 -0
  206. data/lib/pdfrb/model/type/action_trans.rb +30 -0
  207. data/lib/pdfrb/model/type/action_uri.rb +30 -0
  208. data/lib/pdfrb/model/type/af_embedded_file.rb +11 -0
  209. data/lib/pdfrb/model/type/af_file_specification.rb +34 -0
  210. data/lib/pdfrb/model/type/annotation.rb +49 -10
  211. data/lib/pdfrb/model/type/appearance.rb +41 -0
  212. data/lib/pdfrb/model/type/appearance_characteristics.rb +36 -0
  213. data/lib/pdfrb/model/type/appearance_generator.rb +22 -0
  214. data/lib/pdfrb/model/type/appearance_trap_net.rb +84 -0
  215. data/lib/pdfrb/model/type/border_effect.rb +25 -0
  216. data/lib/pdfrb/model/type/border_styling.rb +38 -0
  217. data/lib/pdfrb/model/type/box_color_info.rb +21 -0
  218. data/lib/pdfrb/model/type/box_style.rb +19 -0
  219. data/lib/pdfrb/model/type/button.rb +17 -0
  220. data/lib/pdfrb/model/type/cal_gray.rb +17 -0
  221. data/lib/pdfrb/model/type/cal_rgb.rb +22 -0
  222. data/lib/pdfrb/model/type/caret_annotation.rb +21 -0
  223. data/lib/pdfrb/model/type/catalog.rb +99 -16
  224. data/lib/pdfrb/model/type/choice.rb +21 -0
  225. data/lib/pdfrb/model/type/cid_font.rb +52 -1
  226. data/lib/pdfrb/model/type/cid_font_descriptor_metrics.rb +28 -0
  227. data/lib/pdfrb/model/type/cid_system_info.rb +28 -0
  228. data/lib/pdfrb/model/type/circle_annotation.rb +20 -0
  229. data/lib/pdfrb/model/type/collection.rb +27 -0
  230. data/lib/pdfrb/model/type/collection_field.rb +24 -0
  231. data/lib/pdfrb/model/type/collection_item.rb +19 -0
  232. data/lib/pdfrb/model/type/collection_schema.rb +25 -0
  233. data/lib/pdfrb/model/type/collection_sort.rb +13 -0
  234. data/lib/pdfrb/model/type/crypt_filter.rb +58 -0
  235. data/lib/pdfrb/model/type/device_n.rb +37 -0
  236. data/lib/pdfrb/model/type/device_n_mixing_hints.rb +17 -0
  237. data/lib/pdfrb/model/type/device_n_process.rb +13 -0
  238. data/lib/pdfrb/model/type/doc_mdp_transform_parameters.rb +21 -0
  239. data/lib/pdfrb/model/type/document_security_store.rb +55 -0
  240. data/lib/pdfrb/model/type/embedded_file.rb +19 -0
  241. data/lib/pdfrb/model/type/embedded_file_parameter.rb +48 -0
  242. data/lib/pdfrb/model/type/encryption_public_key.rb +38 -0
  243. data/lib/pdfrb/model/type/encryption_standard.rb +68 -0
  244. data/lib/pdfrb/model/type/field_mdp_transform_parameters.rb +26 -0
  245. data/lib/pdfrb/model/type/file_attachment_annotation.rb +29 -0
  246. data/lib/pdfrb/model/type/file_spec_ef.rb +22 -0
  247. data/lib/pdfrb/model/type/file_spec_rf.rb +21 -0
  248. data/lib/pdfrb/model/type/file_specification.rb +43 -0
  249. data/lib/pdfrb/model/type/file_trailer.rb +54 -0
  250. data/lib/pdfrb/model/type/font.rb +73 -2
  251. data/lib/pdfrb/model/type/font_cid_type0.rb +17 -0
  252. data/lib/pdfrb/model/type/font_cid_type2.rb +17 -0
  253. data/lib/pdfrb/model/type/font_descriptor.rb +47 -0
  254. data/lib/pdfrb/model/type/font_descriptor_cid_type0.rb +15 -0
  255. data/lib/pdfrb/model/type/font_descriptor_cid_type2.rb +15 -0
  256. data/lib/pdfrb/model/type/font_encoding.rb +47 -0
  257. data/lib/pdfrb/model/type/font_file.rb +28 -0
  258. data/lib/pdfrb/model/type/font_file2.rb +32 -0
  259. data/lib/pdfrb/model/type/font_file3.rb +23 -0
  260. data/lib/pdfrb/model/type/font_multiple_master.rb +60 -0
  261. data/lib/pdfrb/model/type/font_true_type.rb +1 -1
  262. data/lib/pdfrb/model/type/font_type0.rb +1 -1
  263. data/lib/pdfrb/model/type/font_type1.rb +1 -1
  264. data/lib/pdfrb/model/type/font_type3.rb +1 -1
  265. data/lib/pdfrb/model/type/form_field.rb +73 -0
  266. data/lib/pdfrb/model/type/free_text_annotation.rb +37 -0
  267. data/lib/pdfrb/model/type/function.rb +42 -0
  268. data/lib/pdfrb/model/type/function_exponential.rb +31 -0
  269. data/lib/pdfrb/model/type/function_postscript.rb +25 -0
  270. data/lib/pdfrb/model/type/function_sampled.rb +55 -0
  271. data/lib/pdfrb/model/type/function_stitching.rb +33 -0
  272. data/lib/pdfrb/model/type/generic_appearance.rb +40 -0
  273. data/lib/pdfrb/model/type/graphics_state_parameter.rb +69 -0
  274. data/lib/pdfrb/model/type/halftone.rb +21 -0
  275. data/lib/pdfrb/model/type/halftone_type1.rb +17 -0
  276. data/lib/pdfrb/model/type/halftone_type10.rb +16 -0
  277. data/lib/pdfrb/model/type/halftone_type16.rb +11 -0
  278. data/lib/pdfrb/model/type/halftone_type5.rb +24 -0
  279. data/lib/pdfrb/model/type/halftone_type6.rb +16 -0
  280. data/lib/pdfrb/model/type/highlight_annotation.rb +11 -0
  281. data/lib/pdfrb/model/type/icc_based_color_space.rb +24 -0
  282. data/lib/pdfrb/model/type/icon_fit.rb +31 -0
  283. data/lib/pdfrb/model/type/indexed.rb +32 -0
  284. data/lib/pdfrb/model/type/info.rb +44 -0
  285. data/lib/pdfrb/model/type/ink_annotation.rb +29 -0
  286. data/lib/pdfrb/model/type/interactive_form.rb +36 -0
  287. data/lib/pdfrb/model/type/interior_color.rb +12 -0
  288. data/lib/pdfrb/model/type/jbig2_globals.rb +15 -0
  289. data/lib/pdfrb/model/type/lab.rb +27 -0
  290. data/lib/pdfrb/model/type/line_annotation.rb +44 -0
  291. data/lib/pdfrb/model/type/line_ending_styling.rb +39 -0
  292. data/lib/pdfrb/model/type/link_annotation.rb +41 -0
  293. data/lib/pdfrb/model/type/link_appearance.rb +9 -0
  294. data/lib/pdfrb/model/type/mark_information.rb +23 -0
  295. data/lib/pdfrb/model/type/marked_content_reference.rb +24 -0
  296. data/lib/pdfrb/model/type/markup_annotation.rb +36 -0
  297. data/lib/pdfrb/model/type/mdp_dict.rb +28 -0
  298. data/lib/pdfrb/model/type/measure.rb +39 -0
  299. data/lib/pdfrb/model/type/media_clip.rb +28 -0
  300. data/lib/pdfrb/model/type/media_offset.rb +106 -0
  301. data/lib/pdfrb/model/type/metadata.rb +27 -3
  302. data/lib/pdfrb/model/type/misc_helpers.rb +75 -0
  303. data/lib/pdfrb/model/type/movie.rb +28 -0
  304. data/lib/pdfrb/model/type/names.rb +51 -0
  305. data/lib/pdfrb/model/type/namespace.rb +27 -0
  306. data/lib/pdfrb/model/type/object_reference.rb +31 -0
  307. data/lib/pdfrb/model/type/object_stream.rb +38 -0
  308. data/lib/pdfrb/model/type/opt_content_ext.rb +94 -0
  309. data/lib/pdfrb/model/type/opt_content_page_element.rb +18 -0
  310. data/lib/pdfrb/model/type/optional_content_config.rb +56 -0
  311. data/lib/pdfrb/model/type/optional_content_group.rb +35 -10
  312. data/lib/pdfrb/model/type/optional_content_membership.rb +36 -2
  313. data/lib/pdfrb/model/type/optional_content_properties.rb +16 -1
  314. data/lib/pdfrb/model/type/outline.rb +40 -6
  315. data/lib/pdfrb/model/type/outline_item.rb +45 -0
  316. data/lib/pdfrb/model/type/output_intent.rb +30 -0
  317. data/lib/pdfrb/model/type/page.rb +127 -0
  318. data/lib/pdfrb/model/type/page_label.rb +68 -0
  319. data/lib/pdfrb/model/type/page_piece_info.rb +58 -0
  320. data/lib/pdfrb/model/type/page_tree_node.rb +51 -16
  321. data/lib/pdfrb/model/type/page_tree_node_root.rb +15 -0
  322. data/lib/pdfrb/model/type/pattern.rb +16 -0
  323. data/lib/pdfrb/model/type/pattern_shading.rb +25 -0
  324. data/lib/pdfrb/model/type/pattern_tiling.rb +25 -0
  325. data/lib/pdfrb/model/type/polygon_annotation.rb +29 -0
  326. data/lib/pdfrb/model/type/polygon_polyline.rb +14 -0
  327. data/lib/pdfrb/model/type/polyline_annotation.rb +29 -0
  328. data/lib/pdfrb/model/type/popup_annotation.rb +20 -0
  329. data/lib/pdfrb/model/type/printer_mark_annotation.rb +13 -0
  330. data/lib/pdfrb/model/type/redact_annotation.rb +28 -0
  331. data/lib/pdfrb/model/type/rendition.rb +31 -0
  332. data/lib/pdfrb/model/type/resources.rb +59 -14
  333. data/lib/pdfrb/model/type/rich_media_activation.rb +24 -0
  334. data/lib/pdfrb/model/type/rich_media_animation.rb +25 -0
  335. data/lib/pdfrb/model/type/rich_media_annotation.rb +18 -0
  336. data/lib/pdfrb/model/type/rich_media_command.rb +19 -0
  337. data/lib/pdfrb/model/type/rich_media_configuration.rb +32 -0
  338. data/lib/pdfrb/model/type/rich_media_content.rb +28 -0
  339. data/lib/pdfrb/model/type/rich_media_cue_point.rb +18 -0
  340. data/lib/pdfrb/model/type/rich_media_deactivation.rb +17 -0
  341. data/lib/pdfrb/model/type/rich_media_instance.rb +33 -0
  342. data/lib/pdfrb/model/type/rich_media_presentation.rb +29 -0
  343. data/lib/pdfrb/model/type/rich_media_settings.rb +33 -0
  344. data/lib/pdfrb/model/type/rich_media_window.rb +20 -0
  345. data/lib/pdfrb/model/type/screen_annotation.rb +19 -0
  346. data/lib/pdfrb/model/type/separation.rb +25 -0
  347. data/lib/pdfrb/model/type/sig_field_lock.rb +25 -0
  348. data/lib/pdfrb/model/type/sig_field_seed_value.rb +25 -0
  349. data/lib/pdfrb/model/type/signature.rb +65 -0
  350. data/lib/pdfrb/model/type/signature_build.rb +86 -0
  351. data/lib/pdfrb/model/type/signature_field.rb +17 -0
  352. data/lib/pdfrb/model/type/software_identifier.rb +19 -0
  353. data/lib/pdfrb/model/type/sound.rb +38 -0
  354. data/lib/pdfrb/model/type/sound_annotation.rb +21 -0
  355. data/lib/pdfrb/model/type/square_annotation.rb +24 -0
  356. data/lib/pdfrb/model/type/square_circle.rb +13 -0
  357. data/lib/pdfrb/model/type/squiggly_annotation.rb +11 -0
  358. data/lib/pdfrb/model/type/stamp_annotation.rb +19 -0
  359. data/lib/pdfrb/model/type/strikeout_annotation.rb +11 -0
  360. data/lib/pdfrb/model/type/struct_elem.rb +75 -0
  361. data/lib/pdfrb/model/type/struct_tree_root.rb +34 -0
  362. data/lib/pdfrb/model/type/structure_attributes.rb +44 -0
  363. data/lib/pdfrb/model/type/structure_element_kid.rb +33 -0
  364. data/lib/pdfrb/model/type/text_annotation.rb +25 -0
  365. data/lib/pdfrb/model/type/text_appearance.rb +9 -0
  366. data/lib/pdfrb/model/type/text_field.rb +21 -0
  367. data/lib/pdfrb/model/type/text_markup_annotation.rb +30 -0
  368. data/lib/pdfrb/model/type/three_d_activation.rb +32 -0
  369. data/lib/pdfrb/model/type/three_d_animation_style.rb +24 -0
  370. data/lib/pdfrb/model/type/three_d_background.rb +28 -0
  371. data/lib/pdfrb/model/type/three_d_cross_section.rb +25 -0
  372. data/lib/pdfrb/model/type/three_d_lighting_scheme.rb +26 -0
  373. data/lib/pdfrb/model/type/three_d_measure.rb +20 -0
  374. data/lib/pdfrb/model/type/three_d_measure_3dc.rb +23 -0
  375. data/lib/pdfrb/model/type/three_d_measure_ad3.rb +14 -0
  376. data/lib/pdfrb/model/type/three_d_measure_ld3.rb +14 -0
  377. data/lib/pdfrb/model/type/three_d_measure_pd3.rb +20 -0
  378. data/lib/pdfrb/model/type/three_d_measure_rd3.rb +14 -0
  379. data/lib/pdfrb/model/type/three_d_node.rb +37 -0
  380. data/lib/pdfrb/model/type/three_d_reference.rb +21 -0
  381. data/lib/pdfrb/model/type/three_d_render_mode.rb +34 -0
  382. data/lib/pdfrb/model/type/three_d_stream.rb +48 -0
  383. data/lib/pdfrb/model/type/three_d_units.rb +18 -0
  384. data/lib/pdfrb/model/type/three_d_view.rb +40 -0
  385. data/lib/pdfrb/model/type/to_unicode_cmap_stream.rb +23 -0
  386. data/lib/pdfrb/model/type/transition.rb +68 -0
  387. data/lib/pdfrb/model/type/underline_annotation.rb +11 -0
  388. data/lib/pdfrb/model/type/ur_transform_parameters.rb +33 -0
  389. data/lib/pdfrb/model/type/uri_dict.rb +18 -0
  390. data/lib/pdfrb/model/type/url_alias.rb +19 -0
  391. data/lib/pdfrb/model/type/variable_text_field.rb +47 -0
  392. data/lib/pdfrb/model/type/viewer_preferences.rb +42 -0
  393. data/lib/pdfrb/model/type/watermark_annotation.rb +13 -0
  394. data/lib/pdfrb/model/type/widget_annotation.rb +48 -0
  395. data/lib/pdfrb/model/type/widget_appearance.rb +9 -0
  396. data/lib/pdfrb/model/type/xobject_form.rb +41 -0
  397. data/lib/pdfrb/model/type/xobject_image.rb +56 -0
  398. data/lib/pdfrb/model/type/xref_stream.rb +37 -0
  399. data/lib/pdfrb/model/type.rb +289 -6
  400. data/lib/pdfrb/serializer.rb +2 -2
  401. data/lib/pdfrb/source/tokenizer.rb +0 -2
  402. data/lib/pdfrb/task/benchmark.rb +83 -0
  403. data/lib/pdfrb/task/extract_text.rb +1 -1
  404. data/lib/pdfrb/task/generate_corpus.rb +130 -0
  405. data/lib/pdfrb/task/memory_profile.rb +84 -0
  406. data/lib/pdfrb/task/optimize.rb +97 -7
  407. data/lib/pdfrb/task/regenerate_appearances.rb +98 -0
  408. data/lib/pdfrb/task.rb +4 -3
  409. data/lib/pdfrb/test_utils.rb +112 -0
  410. data/lib/pdfrb/validator.rb +82 -0
  411. data/lib/pdfrb/version.rb +1 -1
  412. data/lib/pdfrb/writer.rb +117 -27
  413. data/lib/pdfrb/xmp/packet.rb +122 -0
  414. data/lib/pdfrb/xmp/schemas.rb +96 -0
  415. data/lib/pdfrb/xmp.rb +44 -0
  416. data/lib/pdfrb/xref_section.rb +2 -2
  417. data/lib/pdfrb.rb +24 -54
  418. data/pdfrb.gemspec +45 -0
  419. data/script/apply_fixes.sh +843 -0
  420. data/script/make_jpeg_fixture.rb +53 -0
  421. data/script/make_png_fixture.rb +25 -0
  422. metadata +319 -4
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Media Offset Time (s13.3.6.5). Time-based media offset.
7
+ class MediaOffsetTime < Pdfrb::Model::Cos::Dictionary
8
+ def subtype; self[:S]&.to_sym; end
9
+ def timespan; self[:T]; end
10
+
11
+ def time_offset
12
+ return nil unless timespan
13
+
14
+ timespan.is_a?(Pdfrb::Model::Cos::Dictionary) ? timespan[:V] : timespan
15
+ end
16
+ end
17
+
18
+ # Media Offset Frame (s13.3.6.5). Frame-based media offset.
19
+ class MediaOffsetFrame < Pdfrb::Model::Cos::Dictionary
20
+ def subtype; self[:S]&.to_sym; end
21
+ def frame_number; self[:F]; end
22
+ def time; self[:T]; end
23
+
24
+ def has_frame?
25
+ !!frame_number
26
+ end
27
+ end
28
+
29
+ # Media Offset Marker (s13.3.6.5). Marker-based media offset.
30
+ class MediaOffsetMarker < Pdfrb::Model::Cos::Dictionary
31
+ def subtype; self[:S]&.to_sym; end
32
+ def marker_name; self[:M]; end
33
+ end
34
+
35
+ # Media Player Info (s13.3.5.5). Identifies which players can
36
+ # render the rendition.
37
+ class MediaPlayerInfo < Pdfrb::Model::Cos::Dictionary
38
+ def player_identifier; self[:PID]; end
39
+ def must_honor; self[:MH]; end
40
+ def best_effort; self[:BE]; end
41
+
42
+ def has_constraints?
43
+ !!must_honor || !!best_effort
44
+ end
45
+
46
+ def resolved_player_identifier
47
+ ref = player_identifier
48
+ return nil unless ref && document
49
+
50
+ document.object(ref)
51
+ end
52
+ end
53
+
54
+ # Media Players (s13.3.5.5). Player info lists.
55
+ class MediaPlayers < Pdfrb::Model::Cos::Dictionary
56
+ def must_use; self[:MU]; end
57
+ def alternate; self[:A]; end
58
+ def never_use; self[:NU]; end
59
+
60
+ def must_use_count
61
+ return 0 unless must_use
62
+
63
+ arr = must_use.is_a?(Pdfrb::Model::PdfArray) ? must_use.to_a : must_use
64
+ arr.is_a?(Array) ? arr.size : 0
65
+ end
66
+
67
+ def never_use_count
68
+ return 0 unless never_use
69
+
70
+ arr = never_use.is_a?(Pdfrb::Model::PdfArray) ? never_use.to_a : never_use
71
+ arr.is_a?(Array) ? arr.size : 0
72
+ end
73
+ end
74
+
75
+ # Media Screen Parameters (s13.3.5.4). Controls how media is
76
+ # displayed on the screen annotation.
77
+ class MediaScreenParameters < Pdfrb::Model::Cos::Dictionary
78
+ def must_honor; self[:MH]; end
79
+ def best_effort; self[:BE]; end
80
+ def fit; self[:FIT]; end
81
+
82
+ def fit_meet?; fit == :Meet; end
83
+ def fit_slice?; fit == :Slice; end
84
+ def fit_fill?; fit == :Fill; end
85
+ def fit_hidden?; fit == :Hidden; end
86
+ def fit_tiled?; fit == :Tiled; end
87
+ end
88
+
89
+ # Media Criteria (s13.3.5.5). Constraints when selecting players.
90
+ class MediaCriteria < Pdfrb::Model::Cos::Dictionary
91
+ def must_honor; self[:MH]; end
92
+ def best_effort; self[:BE]; end
93
+ def bit_rate; self[:Rate]; end
94
+ def bandwidth; self[:RateBS]; end
95
+ def cpu; self[:RateCpu]; end
96
+ def ram; self[:RateRam]; end
97
+ def language; self[:Lang]; end
98
+ def mime_type; self[:MimeType]; end
99
+
100
+ def has_bit_rate_constraint?
101
+ !!bit_rate
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -9,9 +9,33 @@ module Pdfrb
9
9
  arlington_object "Metadata"
10
10
  register_type :Metadata
11
11
 
12
- # Per PDF 2.0 App Note 003, /Metadata must NOT appear on
13
- # Document Part Metadata (DPM) dicts. Validate callers don't
14
- # try to attach one there.
12
+ def type; self[:Type]; end
13
+ def subtype; self[:Subtype]; end
14
+ def filter; self[:Filter]; end
15
+ def associated_files; self[:AF]; end
16
+
17
+ def xml?
18
+ subtype&.to_sym == :XML
19
+ end
20
+
21
+ def xmp?
22
+ return false unless xml? && stream
23
+
24
+ data = stream.to_s
25
+ data.include?("<x:xmpmeta") || data.include?("xmlns:x=")
26
+ end
27
+
28
+ def xmp_packet?
29
+ return false unless stream
30
+
31
+ stream.to_s.include?("<?xpacket")
32
+ end
33
+
34
+ def xmp_string
35
+ return nil unless stream
36
+
37
+ stream.to_s.force_encoding(Encoding::UTF_8)
38
+ end
15
39
  end
16
40
  end
17
41
  end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Border array [horizontal_radius vertical_radius width_dash
7
+ # ...] Deprecated; use BorderStyling instead (s7.7.3.3).
8
+ # Encapsulated as a thin struct.
9
+ class BorderArray < Pdfrb::Model::PdfArray
10
+ def horizontal_radius
11
+ self[0] || 0
12
+ end
13
+
14
+ def vertical_radius
15
+ self[1] || 0
16
+ end
17
+
18
+ def border_width
19
+ self[2] || 1
20
+ end
21
+
22
+ def horizontal_style
23
+ (self[3]&.to_s || :S).to_sym
24
+ end
25
+ end
26
+
27
+ # Lab Range Array [a_min a_max b_min b_max]. Used inside the
28
+ # Lab color space dict (s8.6.3.4).
29
+ class LabRangeArray < Pdfrb::Model::PdfArray
30
+ def a_min; self[0]; end
31
+ def a_max; self[1]; end
32
+ def b_min; self[2]; end
33
+ def b_max; self[3]; end
34
+
35
+ def default?
36
+ a_min == -100 && a_max == 100 && b_min == -100 && b_max == 100
37
+ end
38
+ end
39
+
40
+ # Dest Output Profile Ref (s7.9.6, optional indirect reference).
41
+ # Used by PDF PostScript/XMP reference forms.
42
+ class DestOutputProfileRef < Pdfrb::Model::Reference
43
+ def resolved
44
+ document&.object(self)
45
+ end
46
+ end
47
+
48
+ # Output Intents array (s14.11.5). Container for the Catalog
49
+ # /OutputIntents array — convenience wrapper that just forwards
50
+ # to the type.
51
+ class OutputIntentsContainer < Pdfrb::Model::Cos::Dictionary
52
+ def intent_type; self[:S]; end
53
+
54
+ def pdfx?
55
+ intent_type&.to_sym == :GTS_PDFX
56
+ end
57
+
58
+ def pdfa?
59
+ intent_type&.to_sym == :GTS_PDFA
60
+ end
61
+ end
62
+
63
+ # CMapStream (s9.7.5.3). CMap stream definition embedded in a PDF.
64
+ class CMapStream < Pdfrb::Model::Cos::Stream
65
+ def type; self[:Type]; end
66
+ def base_font; self[:BaseFont]; end
67
+ def encoding; self[:Encoding]; end
68
+
69
+ def cmap_data
70
+ decoded_stream&.force_encoding(Encoding::BINARY)
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Movie dictionary (s13.4). Deprecated since PDF 2.0 but still
7
+ # appears in legacy PDFs. Use Screen + Rendition actions instead.
8
+ class Movie < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def file_spec; self[:F]; end
11
+ def aspect; self[:Aspect]; end
12
+ def rotate; self[:Rotate] || 0; end
13
+ def poster; self[:Poster]; end
14
+
15
+ def has_poster?
16
+ !!poster
17
+ end
18
+
19
+ def resolved_file_spec
20
+ ref = file_spec
21
+ return nil unless ref && document
22
+
23
+ document.object(ref)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -8,6 +8,57 @@ module Pdfrb
8
8
  # /EmbeddedFiles, /AlternatePresentations, /Renditions.
9
9
  class Names < Pdfrb::Model::Cos::Dictionary
10
10
  arlington_object "Name"
11
+ register_type :Names
12
+
13
+ def destinations; self[:Dests]; end
14
+ def ap; self[:AP]; end
15
+ def javascript; self[:JavaScript]; end
16
+ def pages; self[:Pages]; end
17
+ def templates; self[:Templates]; end
18
+ def urls; self[:URLS]; end
19
+ def embedded_files; self[:EmbeddedFiles]; end
20
+ def alternate_presentations; self[:AlternatePresentations]; end
21
+ def renditions; self[:Renditions]; end
22
+
23
+ def has_embedded_files?
24
+ !!embedded_files
25
+ end
26
+
27
+ def has_javascript?
28
+ !!javascript
29
+ end
30
+
31
+ def has_destinations?
32
+ !!destinations
33
+ end
34
+
35
+ def each_embedded_file(&block)
36
+ return enum_for(:each_embedded_file) unless block
37
+ return unless embedded_files && document
38
+
39
+ walk_name_tree(embedded_files, &block)
40
+ end
41
+
42
+ private
43
+
44
+ def walk_name_tree(node_ref, &block)
45
+ node = if node_ref.is_a?(Pdfrb::Model::Reference) && document
46
+ document.object(node_ref)
47
+ else
48
+ node_ref
49
+ end
50
+ return unless node
51
+
52
+ if node[:Names]
53
+ arr = node[:Names]
54
+ arr = arr.to_a if arr.is_a?(Pdfrb::Model::PdfArray)
55
+ arr.each_slice(2, &block)
56
+ elsif node[:Kids]
57
+ arr = node[:Kids]
58
+ arr = arr.to_a if arr.is_a?(Pdfrb::Model::PdfArray)
59
+ arr.each { |kid| walk_name_tree(kid, &block) }
60
+ end
61
+ end
11
62
  end
12
63
  end
13
64
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Namespace dictionary (s14.7.6.1, PDF 2.0). Namespaces for
7
+ # structure element types in tagged PDF documents.
8
+ class Namespace < Cos::Dictionary
9
+ register_type :Namespace
10
+
11
+ def type; self[:Type]; end
12
+ def namespace_name; self[:NS]; end
13
+ def role_map_ns; self[:RoleMapNS]; end
14
+
15
+ def has_role_map?
16
+ !!role_map_ns
17
+ end
18
+
19
+ def mapped_role(custom_name)
20
+ return nil unless role_map_ns.is_a?(Hash)
21
+
22
+ role_map_ns[custom_name.to_sym] || role_map_ns[custom_name.to_s]
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Object reference dict (s14.7.6). Used in structure trees to
7
+ # refer to a content item without including it directly.
8
+ class ObjectReference < Cos::Dictionary
9
+ register_type :ObjRef
10
+
11
+ def type; self[:Type]; end
12
+ def page; self[:Pg]; end
13
+ def object; self[:Obj]; end
14
+
15
+ def resolved_page
16
+ ref = page
17
+ return nil unless ref && document
18
+
19
+ document.object(ref)
20
+ end
21
+
22
+ def resolved_object
23
+ ref = object
24
+ return nil unless ref && document
25
+
26
+ document.object(ref)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -8,6 +8,44 @@ module Pdfrb
8
8
  class ObjectStream < Pdfrb::Model::Cos::Stream
9
9
  arlington_object "ObjectStream"
10
10
  register_type :ObjStm
11
+
12
+ def type; self[:Type]; end
13
+ def number_of_objects; self[:N]; end
14
+ def first_byte_offset; self[:First]; end
15
+ def extends; self[:Extends]; end
16
+ def filter; self[:Filter]; end
17
+
18
+ def has_parent?
19
+ !!extends
20
+ end
21
+
22
+ def compressed_count
23
+ number_of_objects || 0
24
+ end
25
+
26
+ def each_object_reference
27
+ return enum_for(:each_object_reference) unless block_given?
28
+ return unless number_of_objects && first_byte_offset
29
+
30
+ stream_data = decoded_stream
31
+ return unless stream_data
32
+
33
+ offset = 0
34
+ number_of_objects.times do
35
+ space_idx = stream_data.index(" ", offset)
36
+ return if space_idx.nil?
37
+
38
+ oid = stream_data[offset...space_idx].to_i
39
+
40
+ newline_idx = stream_data.index(/\s/, space_idx + 1)
41
+ return if newline_idx.nil?
42
+
43
+ byte_offset = stream_data[(space_idx + 1)...newline_idx].to_i
44
+
45
+ yield oid, byte_offset + first_byte_offset
46
+ offset = newline_idx + 1
47
+ end
48
+ end
11
49
  end
12
50
  end
13
51
  end
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Optional Content Usage Application dict (s8.11.4.1). Decides
7
+ # which OCGs to enable when the user views/prints/exports the
8
+ # document.
9
+ class OptContentUsageApplication < Pdfrb::Model::Cos::Dictionary
10
+ def event; self[:Event]&.to_sym; end
11
+ def ocgs; self[:OCGs]; end
12
+ def category; self[:Category]; end
13
+
14
+ def view_event?; event == :View; end
15
+ def print_event?; event == :Print; end
16
+ def export_event?; event == :Export; end
17
+
18
+ def each_ocg
19
+ return enum_for(:each_ocg) unless block_given?
20
+ return unless ocgs && document
21
+
22
+ arr = ocgs.is_a?(Pdfrb::Model::PdfArray) ? ocgs.to_a : ocgs
23
+ arr.each do |ref|
24
+ obj = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
25
+ yield obj if obj
26
+ end
27
+ end
28
+ end
29
+
30
+ # Optional Content Creator Info dict (s8.11.2.2). Attribution
31
+ # for who created a layer.
32
+ class OptContentCreatorInfo < Pdfrb::Model::Cos::Dictionary
33
+ def creator; self[:Creator]; end
34
+ def subtitle; self[:Subtitle]; end
35
+ def creator_app_version; self[:CreatorAppVersion]; end
36
+
37
+ def has_creator?
38
+ !!creator
39
+ end
40
+ end
41
+
42
+ # Optional Content Export dict (s8.11.2.3). Specific OCG toggle
43
+ # for the export workflow.
44
+ class OptContentExport < Pdfrb::Model::Cos::Dictionary
45
+ def export_ocgs; self[:ExportOCGs]; end
46
+ def intent; self[:Intent]&.to_sym; end
47
+
48
+ def visible_only?
49
+ intent == :Visible
50
+ end
51
+
52
+ def all_export?
53
+ intent == :All
54
+ end
55
+ end
56
+
57
+ # Optional Content Print dict (s8.11.2.4). Similar to Export but
58
+ # for the printing workflow.
59
+ class OptContentPrint < Pdfrb::Model::Cos::Dictionary
60
+ def print_ocgs; self[:PrintOCGs]; end
61
+ def print_state; self[:PrintState]&.to_sym; end
62
+
63
+ def on_printed?; print_state == :On; end
64
+ def off_printed?; print_state == :Off; end
65
+ def leave_unchanged?; print_state == :Unchanged; end
66
+ end
67
+
68
+ # Optional Content View dict (s8.11.2.5). Per-view OCG visibility.
69
+ class OptContentView < Pdfrb::Model::Cos::Dictionary
70
+ def view_name; self[:Name]; end
71
+ def view_state_name; self[:ViewState]; end
72
+ end
73
+
74
+ # Optional Content Language dict (s8.11.2.6). Maps OCG to natural
75
+ # language for preference-based visibility.
76
+ class OptContentLanguage < Pdfrb::Model::Cos::Dictionary
77
+ def language_string; self[:Lang]; end
78
+ def ocgs; self[:OCGs]; end
79
+ def preferred; self[:Preferred] || 0; end
80
+
81
+ def each_ocg
82
+ return enum_for(:each_ocg) unless block_given?
83
+ return unless ocgs && document
84
+
85
+ arr = ocgs.is_a?(Pdfrb::Model::PdfArray) ? ocgs.to_a : ocgs
86
+ arr.each do |ref|
87
+ obj = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
88
+ yield obj if obj
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Opt Content Page Element (s8.11). Marks page elements for
7
+ # automatic optional-content group creation.
8
+ class OptContentPageElement < Pdfrb::Model::Cos::Dictionary
9
+ def subtype; self[:Subtype]&.to_sym; end
10
+ def ocgs; self[:OCGs]; end
11
+
12
+ def has_ocgs?
13
+ !!ocgs && (!ocgs.is_a?(Array) || !ocgs.empty?)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Optional Content Configuration (s8.11.4.1). Per-view configuration
7
+ # of OCG visibility, intent, and locking.
8
+ class OptionalContentConfiguration < Cos::Dictionary
9
+ register_type :OCConfig
10
+
11
+ def type; self[:Type]; end
12
+ def name; self[:Name]; end
13
+ def creator; self[:Creator]; end
14
+ def base_state; (self[:BaseState] || :ON).to_sym; end
15
+ def on; self[:ON]; end
16
+ def off; self[:OFF]; end
17
+ def intent; self[:Intent]; end
18
+ def list_mode; self[:ListMode]&.to_sym || :AllPages; end
19
+ def rb_groups; self[:RBGroups]; end
20
+ def locked; self[:Locked]; end
21
+
22
+ def all_on?; base_state == :ON; end
23
+ def all_off?; base_state == :OFF; end
24
+ def unchanged?; base_state == :Unchanged; end
25
+
26
+ def has_intent?
27
+ !!intent
28
+ end
29
+
30
+ def view_intent?
31
+ return true unless intent
32
+
33
+ arr = intent.is_a?(Pdfrb::Model::PdfArray) ? intent.to_a : intent
34
+ arr = [arr] unless arr.is_a?(Array)
35
+ arr.map(&:to_sym).include?(:View)
36
+ end
37
+
38
+ def print_intent?
39
+ return false unless intent
40
+
41
+ arr = intent.is_a?(Pdfrb::Model::PdfArray) ? intent.to_a : intent
42
+ arr = [arr] unless arr.is_a?(Array)
43
+ arr.map(&:to_sym).include?(:Print)
44
+ end
45
+
46
+ def locked_groups?
47
+ !!locked
48
+ end
49
+
50
+ def radio_button_groups?
51
+ !!rb_groups
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -7,18 +7,43 @@ module Pdfrb
7
7
  class OptionalContentGroup < Pdfrb::Model::Cos::Dictionary
8
8
  arlington_object "OptContentGroup"
9
9
  register_type :OCG
10
- end
11
10
 
12
- # Optional Content Membership (s8.11.4.2). Boolean combination
13
- # of OCG visibility states.
14
- class OptionalContentMembership < Pdfrb::Model::Cos::Dictionary
15
- arlington_object "OptContentMembership"
16
- register_type :OCMD
17
- end
11
+ def type; self[:Type]; end
12
+ def name; self[:Name]; end
13
+ def intent; self[:Intent]; end
14
+ def usage; self[:Usage]; end
15
+
16
+ def view_intent?
17
+ return true unless intent
18
+
19
+ arr = intent.is_a?(Pdfrb::Model::PdfArray) ? intent.to_a : intent
20
+ arr = [arr] unless arr.is_a?(Array)
21
+ arr.map(&:to_sym).include?(:View)
22
+ end
23
+
24
+ def print_intent?
25
+ return false unless intent
26
+
27
+ arr = intent.is_a?(Pdfrb::Model::PdfArray) ? intent.to_a : intent
28
+ arr = [arr] unless arr.is_a?(Array)
29
+ arr.map(&:to_sym).include?(:Print)
30
+ end
31
+
32
+ def export_intent?
33
+ return false unless intent
34
+
35
+ arr = intent.is_a?(Pdfrb::Model::PdfArray) ? intent.to_a : intent
36
+ arr = [arr] unless arr.is_a?(Array)
37
+ arr.map(&:to_sym).include?(:Export)
38
+ end
39
+
40
+ def default_visible?
41
+ usage && usage[:View] && usage[:View][:ViewState]&.to_sym == :ON
42
+ end
18
43
 
19
- # Optional Content Properties (s8.11.1). Catalog /OCProperties.
20
- class OptionalContentProperties < Pdfrb::Model::Cos::Dictionary
21
- arlington_object "OptContentProperties"
44
+ def has_usage?
45
+ !!usage
46
+ end
22
47
  end
23
48
  end
24
49
  end
@@ -3,10 +3,44 @@
3
3
  module Pdfrb
4
4
  module Model
5
5
  module Type
6
- # Alias for OptionalContentMembership keeps the autoload path
7
- # distinct from the group class.
6
+ # Optional Content Membership (s8.11.4.2). Boolean combination
7
+ # of OCG visibility states.
8
8
  class OptionalContentMembership < Pdfrb::Model::Cos::Dictionary
9
9
  arlington_object "OptContentMembership"
10
+ register_type :OCMD
11
+
12
+ def ocfgs; self[:OCGs]; end
13
+ def policy; self[:P]; end
14
+ def expression; self[:VE]; end
15
+
16
+ def all_on_policy?
17
+ (policy || 1) == 1
18
+ end
19
+
20
+ def any_on_policy?
21
+ policy == 2
22
+ end
23
+
24
+ def any_off_policy?
25
+ policy == 3
26
+ end
27
+
28
+ def has_expression?
29
+ !!expression
30
+ end
31
+
32
+ def each_ocg
33
+ return enum_for(:each_ocg) unless block_given?
34
+ return unless ocfgs && document
35
+
36
+ arr = ocfgs.is_a?(Pdfrb::Model::Reference) ? document.object(ocfgs) : ocfgs
37
+ return unless arr.is_a?(Array) || arr.is_a?(Pdfrb::Model::PdfArray)
38
+
39
+ arr.each do |ref|
40
+ obj = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
41
+ yield obj if obj
42
+ end
43
+ end
10
44
  end
11
45
  end
12
46
  end