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,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # CalRGB color space dictionary (s8.6.3.3). Calibrated RGB:
7
+ # [/CalRGB <dict>].
8
+ class CalRGB < Pdfrb::Model::Cos::Dictionary
9
+ def white_point; self[:WhitePoint]; end
10
+ def black_point; self[:BlackPoint]; end
11
+ def gamma; self[:Gamma]; end
12
+ def matrix; self[:Matrix]; end
13
+
14
+ def components; 3; end
15
+
16
+ def has_matrix?
17
+ !!matrix
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Caret annotation (s12.5.6.11). Text-insertion indicator.
7
+ class CaretAnnotation < MarkupAnnotation
8
+ def rd; self[:RD]; end
9
+ def sy; self[:Sy]; end
10
+
11
+ def paragraph_style?
12
+ sy&.to_sym == :P
13
+ end
14
+
15
+ def new_line_style?
16
+ sy&.to_sym == :None
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -15,34 +15,117 @@ module Pdfrb
15
15
  arlington_object "Catalog"
16
16
  register_type :Catalog
17
17
 
18
- # Returns the /Pages tree root, auto-resolving the reference.
19
- def pages
20
- self[:Pages]
18
+ def pages; self[:Pages]; end
19
+ def page_labels; self[:PageLabels]; end
20
+ def names; self[:Names]; end
21
+ def destinations; self[:Dests]; end
22
+ def viewer_preferences; self[:ViewerPreferences]; end
23
+ def page_layout; self[:PageLayout]; end
24
+ def page_mode; self[:PageMode]; end
25
+ def outlines; self[:Outlines]; end
26
+ def threads; self[:Threads]; end
27
+ def open_action; self[:OpenAction]; end
28
+ def additional_actions; self[:AA]; end
29
+ def uri; self[:URI]; end
30
+ def acro_form; self[:AcroForm]; end
31
+ def metadata; self[:Metadata]; end
32
+ def struct_tree_root; self[:StructTreeRoot]; end
33
+ def mark_info; self[:MarkInfo]; end
34
+ def lang; self[:Lang]; end
35
+ def spider_info; self[:SpiderInfo]; end
36
+ def output_intents; self[:OutputIntents]; end
37
+ def piece_info; self[:PieceInfo]; end
38
+ def oc_properties; self[:OCProperties]; end
39
+ def perms; self[:Perms]; end
40
+ def legal; self[:Legal]; end
41
+ def requirements; self[:Requirements]; end
42
+ def collection; self[:Collection]; end
43
+ def needs_rendering?; truthy?(self[:NeedsRendering]); end
44
+ def dss; self[:DSS]; end
45
+ def associated_files; self[:AF]; end
46
+ def dpart_root; self[:DPartRoot]; end
47
+ def version_override; self[:Version]; end
48
+ def extensions; self[:Extensions]; end
49
+
50
+ def single_page_layout?; page_layout&.to_sym == :SinglePage; end
51
+ def one_column_layout?; page_layout&.to_sym == :OneColumn; end
52
+
53
+ def two_column_layout?
54
+ [:TwoColumnLeft, :TwoColumnRight].include?(page_layout&.to_sym)
55
+ end
56
+
57
+ def two_page_layout?
58
+ [:TwoPageLeft, :TwoPageRight].include?(page_layout&.to_sym)
59
+ end
60
+
61
+ def use_attachments_mode?; page_mode&.to_sym == :UseAttachments; end
62
+ def use_thumbs_mode?; page_mode&.to_sym == :UseThumbs; end
63
+ def use_outlines_mode?; page_mode&.to_sym == :UseOutlines; end
64
+ def full_screen_mode?; page_mode&.to_sym == :FullScreen; end
65
+ def use_oc_mode?; page_mode&.to_sym == :UseOC; end
66
+
67
+ def tagged?
68
+ mark_info && !!mark_info[:Marked]
69
+ end
70
+
71
+ def contains_struct_tree?
72
+ !!struct_tree_root
73
+ end
74
+
75
+ def contains_form?
76
+ !!acro_form
21
77
  end
22
78
 
23
- # Returns the /AcroForm dict (or nil).
24
- def acro_form
25
- self[:AcroForm]
79
+ def contains_outlines?
80
+ !!outlines
26
81
  end
27
82
 
28
- def outlines
29
- self[:Outlines]
83
+ def page_count
84
+ return 0 unless pages
85
+
86
+ obj = pages.is_a?(Pdfrb::Model::Reference) && document ? document.object(pages) : pages
87
+ obj && obj[:Count]
88
+ end
89
+
90
+ def resolved_pages
91
+ return nil unless pages && document
92
+
93
+ document.object(pages)
30
94
  end
31
95
 
32
- def names
33
- self[:Names]
96
+ def resolved_acro_form
97
+ return nil unless acro_form && document
98
+
99
+ document.object(acro_form)
34
100
  end
35
101
 
36
- def metadata
37
- self[:Metadata]
102
+ def resolved_outlines
103
+ return nil unless outlines && document
104
+
105
+ document.object(outlines)
38
106
  end
39
107
 
40
- def struct_tree_root
41
- self[:StructTreeRoot]
108
+ def resolved_metadata
109
+ return nil unless metadata && document
110
+
111
+ document.object(metadata)
42
112
  end
43
113
 
44
- def open_action
45
- self[:OpenAction]
114
+ def each_output_intent
115
+ return enum_for(:each_output_intent) unless block_given?
116
+ return unless output_intents && document
117
+
118
+ arr = if output_intents.is_a?(Pdfrb::Model::Reference)
119
+ document.object(output_intents)
120
+ else
121
+ output_intents
122
+ end
123
+ return unless arr.is_a?(Array) || arr.is_a?(Pdfrb::Model::PdfArray)
124
+
125
+ arr.each do |entry|
126
+ obj = entry.is_a?(Pdfrb::Model::Reference) ? document.object(entry) : entry
127
+ yield obj if obj
128
+ end
46
129
  end
47
130
  end
48
131
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ class Choice < Field
7
+ def value; self[:V]; end
8
+ def opt; self[:Opt]; end
9
+ def top_index; self[:TI]; end
10
+ def indices; self[:I]; end
11
+
12
+ def combo?; flags & 0x20000 != 0; end
13
+ def list?; !combo?; end
14
+ def edit?; flags & 0x40000 != 0; end
15
+ def multi_select?; flags & 0x200000 != 0; end
16
+ def sort?; flags & 0x80000 != 0; end
17
+ def commit_on_change?; flags & 0x4000000 != 0; end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -5,8 +5,59 @@ module Pdfrb
5
5
  module Type
6
6
  # CID-keyed font (s9.7.3). Inner font of a /Type0 composite.
7
7
  # /Subtype /CIDFontType0 or /CIDFontType2.
8
- class CIDFont < Pdfrb::Model::Cos::Dictionary
8
+ class CIDFont < Pdfrb::Model::Type::Font
9
9
  arlington_object "FontCIDType0"
10
+
11
+ def cid_subtype; self[:Subtype]; end
12
+ def base_font; self[:BaseFont]; end
13
+ def cid_system_info; self[:CIDSystemInfo]; end
14
+ def font_descriptor; self[:FontDescriptor]; end
15
+ def dw; self[:DW]; end
16
+ def w; self[:W]; end
17
+ def dw2; self[:DW2]; end
18
+ def w2; self[:W2]; end
19
+ def cid_to_gid_map; self[:CIDToGIDMap]; end
20
+
21
+ def type0?
22
+ cid_subtype&.to_sym == :CIDFontType0
23
+ end
24
+
25
+ def type2?
26
+ cid_subtype&.to_sym == :CIDFontType2
27
+ end
28
+
29
+ def default_width
30
+ dw || 1000
31
+ end
32
+
33
+ def width_for_cid(cid)
34
+ return default_width unless w
35
+
36
+ entries = w.is_a?(Pdfrb::Model::PdfArray) ? w.to_a : w
37
+ i = 0
38
+ while i < entries.size
39
+ first = entries[i]
40
+ second = entries[i + 1]
41
+ return nil unless first && second
42
+
43
+ case second.to_s
44
+ when /\A[\[\]]\z/
45
+ array = entries[i + 2]
46
+ return nil unless first.is_a?(Integer) && array.is_a?(Array)
47
+
48
+ offset = cid - first
49
+ return array[offset] if offset >= 0 && offset < array.size
50
+
51
+ else
52
+ value = entries[i + 2]
53
+ return value if cid.between?(first, second)
54
+
55
+ end
56
+ i += 3
57
+ end
58
+
59
+ default_width
60
+ end
10
61
  end
11
62
  end
12
63
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # CID Font Descriptor Metrics (s9.8.1, Table 117). Per-CIDFont
7
+ # metrics used for embedded CIDFontType0/CIDFontType2.
8
+ class CIDFontDescriptorMetrics < Pdfrb::Model::Cos::Dictionary
9
+ def style; self[:Style]&.to_sym; end
10
+ def cid_set; self[:CIDSet]; end
11
+
12
+ def monospaced?; style == :Monospaced; end
13
+ def proportional?; style == :Proportional; end
14
+
15
+ def has_cid_set?
16
+ !!cid_set
17
+ end
18
+
19
+ def resolved_cid_set
20
+ ref = cid_set
21
+ return nil unless ref && document
22
+
23
+ document.object(ref)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # CIDSystemInfo dictionary (s9.7.3). Each CIDFont must declare
7
+ # its Character ID system: registry, ordering, supplement.
8
+ # Required for proper glyph interpretation.
9
+ class CIDSystemInfo < Pdfrb::Model::Cos::Dictionary
10
+ def registry; self[:Registry]; end
11
+ def ordering; self[:Ordering]; end
12
+ def supplement; self[:Supplement]; end
13
+
14
+ def identity?
15
+ registry == "Adobe" && ordering == "Identity"
16
+ end
17
+
18
+ def complete?
19
+ !registry.nil? && !ordering.nil? && !supplement.nil?
20
+ end
21
+
22
+ def to_s
23
+ "#{registry}-#{ordering}-#{supplement}"
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Circle / ellipse annotation (s12.5.6.8).
7
+ class CircleAnnotation < MarkupAnnotation
8
+ def border_effect; self[:BE]; end
9
+ def interior_color; self[:IC]; end
10
+ def border_style; self[:BS]; end
11
+ def border; self[:Border]; end
12
+ def rd; self[:RD]; end
13
+
14
+ def has_border_effect?
15
+ !!border_effect
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Collection dictionary (s7.11.5). Describes a PDF Portfolio — a
7
+ # collection of embedded files with a presentation schema. Lives
8
+ # on Catalog /Collection.
9
+ class Collection < Pdfrb::Model::Cos::Dictionary
10
+ def schema; self[:Schema]; end
11
+ def default_view; self[:View]; end
12
+ def sort; self[:Sort]; end
13
+ def split; self[:Split]; end
14
+ def colors; self[:Colors]; end
15
+ def folders; self[:Folders]; end
16
+
17
+ def has_schema?
18
+ !!schema
19
+ end
20
+
21
+ def has_default_view?
22
+ !!default_view
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Collection field (s7.11.5). One column definition.
7
+ class CollectionField < Pdfrb::Model::Cos::Dictionary
8
+ def name; self[:N]; end
9
+ def field_type; self[:Subtype]; end
10
+ def order; self[:O]; end
11
+ def visibility; self[:V]; end
12
+
13
+ def text_field?; field_type == :Text; end
14
+ def number_field?; field_type == :Number; end
15
+ def date_field?; field_type == :Date; end
16
+ def file_name_field?; field_type == :FileName; end
17
+ def file_size_field?; field_type == :FileSize; end
18
+ def description_field?; field_type == :Desc; end
19
+ def modification_date_field?; field_type == :ModDate; end
20
+ def creation_date_field?; field_type == :CreationDate; end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Collection item (s7.11.5). Per-embedded-file values for the
7
+ # schema fields.
8
+ class CollectionItem < Pdfrb::Model::Cos::Dictionary
9
+ def value_for(field_name)
10
+ self[field_name.to_sym] || self[field_name.to_s]
11
+ end
12
+
13
+ def keys
14
+ value.keys
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Collection schema (s7.11.5). Defines the columns/fields shown
7
+ # in the portfolio view.
8
+ class CollectionSchema < Pdfrb::Model::Cos::Dictionary
9
+ def fields
10
+ value.keys
11
+ end
12
+
13
+ def field_count
14
+ value.size
15
+ end
16
+
17
+ def each_field(&)
18
+ return enum_for(:each_field) unless block_given?
19
+
20
+ value.each(&)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Collection sort (s7.11.5). Defines default sort order.
7
+ class CollectionSort < Pdfrb::Model::Cos::Dictionary
8
+ def field_name; self[:S]; end
9
+ def descending?; truthy?(self[:A]); end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Crypt Filter (s7.6.5). Per-stream cipher filter spec — names
7
+ # the cipher and authentication event.
8
+ class CryptFilter < Pdfrb::Model::Cos::Dictionary
9
+ def cipher_method; self[:CFM]&.to_sym; end
10
+ def auth_event; self[:AuthEvent]&.to_sym; end
11
+ def length; self[:Length]; end
12
+
13
+ def none?; cipher_method == :None; end
14
+ def v2?; cipher_method == :V2; end
15
+ def aes_v2?; cipher_method == :AESV2; end
16
+ def aes_v3?; cipher_method == :AESV3; end
17
+ def aes_v4?; cipher_method == :AESV4; end
18
+
19
+ def open_event?; auth_event == :EFOpen; end
20
+ def doc_open_event?; auth_event == :DocOpen; end
21
+
22
+ def has_length?
23
+ length&.positive?
24
+ end
25
+ end
26
+
27
+ # Crypt Filter Map (s7.6.5, Table 26). Maps per-page crypt filter
28
+ # names to the default CryptFilter used.
29
+ class CryptFilterMap < Pdfrb::Model::Cos::Dictionary
30
+ def filter_for(stream_name)
31
+ value[stream_name.to_sym] || value[stream_name.to_s]
32
+ end
33
+
34
+ def each_filter(&)
35
+ return enum_for(:each_filter) unless block_given?
36
+
37
+ value.each(&)
38
+ end
39
+ end
40
+
41
+ # Crypt Filter Public Key (s7.6.5, Table 26). Public-key analog
42
+ # of CryptFilter.
43
+ class CryptFilterPublicKey < Pdfrb::Model::Cos::Dictionary
44
+ def cipher_method; self[:CFM]&.to_sym; end
45
+ def auth_event; self[:AuthEvent]&.to_sym; end
46
+ def recipients; self[:Recipients]; end
47
+ end
48
+
49
+ # Crypt Filter Public Key Map (s7.6.5, Table 26). Maps per-page
50
+ # public-key crypt filters.
51
+ class CryptFilterPublicKeyMap < Pdfrb::Model::Cos::Dictionary
52
+ def filter_for(stream_name)
53
+ value[stream_name.to_sym] || value[stream_name.to_s]
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # DeviceN color space (s8.6.6.4). Multiple custom colorants mapped
7
+ # through a single tint-transform function. Generalises Separation.
8
+ class DeviceN < Pdfrb::Model::Cos::Dictionary
9
+ def colorants; self[:Names]; end
10
+ def alternate_space; self[:AlternateSpace]; end
11
+ def tint_transform; self[:TintTransform]; end
12
+ def attributes; self[:Attributes]; end
13
+
14
+ def colorant_count
15
+ return 0 unless colorants
16
+
17
+ arr = colorants.is_a?(Pdfrb::Model::PdfArray) ? colorants.to_a : colorants
18
+ arr.is_a?(Array) ? arr.size : 0
19
+ end
20
+
21
+ def components
22
+ colorant_count
23
+ end
24
+
25
+ def each_colorant(&)
26
+ return enum_for(:each_colorant) unless block_given?
27
+ return unless colorants
28
+
29
+ arr = colorants.is_a?(Pdfrb::Model::PdfArray) ? colorants.to_a : colorants
30
+ return unless arr.is_a?(Array)
31
+
32
+ arr.each(&)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # DeviceN Mixing Hints (s8.6.6.5). Per-colorant device hints.
7
+ class DeviceNMixingHints < Pdfrb::Model::Cos::Dictionary
8
+ def solidities; self[:Solidities]; end
9
+ def dot_gain; self[:DotGain]; end
10
+
11
+ def has_solidities?
12
+ !!solidities
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # DeviceN Process (s8.6.6.4). Process colorant list.
7
+ class DeviceNProcess < Pdfrb::Model::Cos::Dictionary
8
+ def color_space; self[:ColorSpace]; end
9
+ def components; self[:Components]; end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Document Modification Detection and Prevention (DocMDP) —
7
+ # s12.8.2.2. Restricts what edits are allowed after signing.
8
+ class DocMDPTransformParameters < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def p; self[:P]; end
11
+ def v; self[:V]; end
12
+
13
+ # P=1: no changes allowed; P=2: minimal changes (form fill);
14
+ # P=3: annotations + form fill.
15
+ def no_changes_allowed?; p == 1; end
16
+ def minimal_changes_allowed?; p == 2; end
17
+ def annotations_allowed?; p == 3; end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Document Security Store (s12.8.4.3, PDF 2.0). Holds certs, CRLs,
7
+ # and OCSP responses used by signature verification.
8
+ class DocumentSecurityStore < Cos::Dictionary
9
+ register_type :DSS
10
+
11
+ def type; self[:Type]; end
12
+ def certs; self[:Certs]; end
13
+ def ocsp; self[:OCSPs]; end
14
+ def crl; self[:CRLs]; end
15
+ def vri; self[:VRI]; end
16
+
17
+ def cert_count
18
+ return 0 unless certs
19
+
20
+ arr = certs.is_a?(Pdfrb::Model::PdfArray) ? certs.to_a : certs
21
+ arr.is_a?(Array) ? arr.size : 0
22
+ end
23
+
24
+ def ocsp_count
25
+ return 0 unless ocsp
26
+
27
+ arr = ocsp.is_a?(Pdfrb::Model::PdfArray) ? ocsp.to_a : ocsp
28
+ arr.is_a?(Array) ? arr.size : 0
29
+ end
30
+
31
+ def crl_count
32
+ return 0 unless crl
33
+
34
+ arr = crl.is_a?(Pdfrb::Model::PdfArray) ? crl.to_a : crl
35
+ arr.is_a?(Array) ? arr.size : 0
36
+ end
37
+
38
+ def has_vri?
39
+ !!vri
40
+ end
41
+
42
+ def each_cert
43
+ return enum_for(:each_cert) unless block_given?
44
+ return unless certs && document
45
+
46
+ arr = certs.is_a?(Pdfrb::Model::PdfArray) ? certs.to_a : certs
47
+ arr.each do |ref|
48
+ obj = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
49
+ yield obj if obj
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -7,6 +7,25 @@ module Pdfrb
7
7
  # /Filespec /EF entry.
8
8
  class EmbeddedFile < Pdfrb::Model::Cos::Stream
9
9
  arlington_object "EmbeddedFileStream"
10
+ register_type :EmbeddedFile
11
+
12
+ def subtype; self[:Subtype]; end
13
+ def length; self[:Length]; end
14
+ def filter; self[:Filter]; end
15
+ def params; self[:Params]; end
16
+ def checksum; self[:Params] && self[:Params][:CheckSum]; end
17
+ def creation_date; self[:Params] && self[:Params][:CreationDate]; end
18
+ def modification_date; self[:Params] && self[:Params][:ModDate]; end
19
+ def size; self[:Params] && self[:Params][:Size]; end
20
+ def mac_creator; self[:Params] && self[:Params][:Mac]; end
21
+
22
+ def compressed?
23
+ filter && !filter.to_s.empty?
24
+ end
25
+
26
+ def mime_type
27
+ subtype&.to_s
28
+ end
10
29
  end
11
30
  end
12
31
  end