pdfrb 0.2.1 → 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 (406) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/CHANGELOG.md +24 -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 +48 -0
  23. data/lib/pdfrb/action/base.rb +21 -0
  24. data/lib/pdfrb/action/types.rb +178 -0
  25. data/lib/pdfrb/action.rb +55 -0
  26. data/lib/pdfrb/annotation/base.rb +79 -0
  27. data/lib/pdfrb/annotation/types.rb +222 -0
  28. data/lib/pdfrb/annotation.rb +78 -0
  29. data/lib/pdfrb/appearance/generator.rb +216 -0
  30. data/lib/pdfrb/appearance.rb +11 -0
  31. data/lib/pdfrb/arlington/object_definition.rb +2 -2
  32. data/lib/pdfrb/arlington/predicate/evaluator.rb +1 -1
  33. data/lib/pdfrb/arlington/predicate/functions.rb +25 -9
  34. data/lib/pdfrb/arlington/predicate.rb +1 -5
  35. data/lib/pdfrb/cli/batch.rb +18 -0
  36. data/lib/pdfrb/cli/debug_info.rb +18 -0
  37. data/lib/pdfrb/cli/files.rb +16 -0
  38. data/lib/pdfrb/cli/fonts.rb +16 -0
  39. data/lib/pdfrb/cli/form.rb +18 -0
  40. data/lib/pdfrb/cli/image2pdf.rb +18 -0
  41. data/lib/pdfrb/cli/images.rb +34 -0
  42. data/lib/pdfrb/cli/info.rb +20 -0
  43. data/lib/pdfrb/cli/inspect.rb +18 -0
  44. data/lib/pdfrb/cli/merge.rb +18 -0
  45. data/lib/pdfrb/cli/modify.rb +18 -0
  46. data/lib/pdfrb/cli/optimize.rb +18 -0
  47. data/lib/pdfrb/cli/split.rb +21 -0
  48. data/lib/pdfrb/cli/watermark.rb +18 -0
  49. data/lib/pdfrb/cli.rb +312 -7
  50. data/lib/pdfrb/color/color_space.rb +259 -0
  51. data/lib/pdfrb/color/icc_profile.rb +90 -0
  52. data/lib/pdfrb/color.rb +12 -0
  53. data/lib/pdfrb/compare/comparator.rb +244 -0
  54. data/lib/pdfrb/compare/report.rb +78 -0
  55. data/lib/pdfrb/compare.rb +42 -0
  56. data/lib/pdfrb/composer.rb +161 -0
  57. data/lib/pdfrb/conformance/pdf_a.rb +317 -56
  58. data/lib/pdfrb/conformance/pdf_ua.rb +186 -29
  59. data/lib/pdfrb/conformance/pdf_x.rb +247 -0
  60. data/lib/pdfrb/conformance/rule.rb +78 -0
  61. data/lib/pdfrb/conformance/structure_elements.rb +174 -0
  62. data/lib/pdfrb/conformance/verapdf_bridge.rb +92 -0
  63. data/lib/pdfrb/conformance.rb +7 -3
  64. data/lib/pdfrb/content/canvas.rb +217 -72
  65. data/lib/pdfrb/content/color_space.rb +157 -0
  66. data/lib/pdfrb/content/hidden_text_detector.rb +167 -0
  67. data/lib/pdfrb/content/operator.rb +21 -1
  68. data/lib/pdfrb/content/operators/clipping.rb +36 -0
  69. data/lib/pdfrb/content/operators/graphics_state_params.rb +15 -0
  70. data/lib/pdfrb/content/operators.rb +21 -0
  71. data/lib/pdfrb/content/shading/base.rb +139 -0
  72. data/lib/pdfrb/content/shading.rb +17 -0
  73. data/lib/pdfrb/content/smart_text_extractor.rb +85 -0
  74. data/lib/pdfrb/content/tiling_pattern.rb +78 -0
  75. data/lib/pdfrb/content/transformation_matrix.rb +61 -0
  76. data/lib/pdfrb/content.rb +7 -26
  77. data/lib/pdfrb/destination/fit.rb +185 -0
  78. data/lib/pdfrb/destination.rb +13 -0
  79. data/lib/pdfrb/digital_signature/cms_handler.rb +22 -0
  80. data/lib/pdfrb/digital_signature/signing.rb +107 -11
  81. data/lib/pdfrb/digital_signature/timestamp_handler.rb +45 -0
  82. data/lib/pdfrb/digital_signature/verification.rb +88 -9
  83. data/lib/pdfrb/digital_signature/verification_result.rb +14 -0
  84. data/lib/pdfrb/digital_signature.rb +26 -2
  85. data/lib/pdfrb/document/annotations.rb +120 -3
  86. data/lib/pdfrb/document/associated_files.rb +104 -0
  87. data/lib/pdfrb/document/colors.rb +95 -0
  88. data/lib/pdfrb/document/destinations.rb +127 -5
  89. data/lib/pdfrb/document/display.rb +84 -0
  90. data/lib/pdfrb/document/fonts.rb +417 -45
  91. data/lib/pdfrb/document/form.rb +338 -0
  92. data/lib/pdfrb/document/form_xobject.rb +68 -0
  93. data/lib/pdfrb/document/graphics_state.rb +91 -0
  94. data/lib/pdfrb/document/images.rb +4 -4
  95. data/lib/pdfrb/document/info.rb +102 -0
  96. data/lib/pdfrb/document/layers.rb +62 -0
  97. data/lib/pdfrb/document/metadata.rb +12 -5
  98. data/lib/pdfrb/document/output_intents.rb +91 -0
  99. data/lib/pdfrb/document/page_labels.rb +80 -0
  100. data/lib/pdfrb/document/pages.rb +68 -19
  101. data/lib/pdfrb/document/portfolio.rb +119 -0
  102. data/lib/pdfrb/document/shadings.rb +159 -0
  103. data/lib/pdfrb/document/stamps.rb +68 -0
  104. data/lib/pdfrb/document/structure.rb +242 -0
  105. data/lib/pdfrb/document.rb +73 -4
  106. data/lib/pdfrb/encryption/identity.rb +13 -0
  107. data/lib/pdfrb/encryption/password_verification.rb +53 -8
  108. data/lib/pdfrb/encryption/security_handler.rb +8 -5
  109. data/lib/pdfrb/encryption/standard_security_handler.rb +154 -81
  110. data/lib/pdfrb/encryption.rb +17 -0
  111. data/lib/pdfrb/error.rb +2 -2
  112. data/lib/pdfrb/filter/brotli_decode.rb +32 -0
  113. data/lib/pdfrb/filter/ccitt_fax_decode.rb +12 -0
  114. data/lib/pdfrb/filter/crypt.rb +2 -2
  115. data/lib/pdfrb/filter/dct_decode.rb +18 -0
  116. data/lib/pdfrb/filter/flate_decode.rb +4 -18
  117. data/lib/pdfrb/filter/jbig2_decode.rb +12 -0
  118. data/lib/pdfrb/filter/jpx_decode.rb +18 -0
  119. data/lib/pdfrb/filter/lzw_decode.rb +3 -2
  120. data/lib/pdfrb/filter/png_predictor.rb +94 -0
  121. data/lib/pdfrb/filter.rb +26 -13
  122. data/lib/pdfrb/font/afm_parser.rb +50 -26
  123. data/lib/pdfrb/font/cmap/writer.rb +9 -0
  124. data/lib/pdfrb/font/encoding/win_ansi_encoding.rb +17 -0
  125. data/lib/pdfrb/font/encoding.rb +32 -3
  126. data/lib/pdfrb/font/metrics_helper.rb +121 -0
  127. data/lib/pdfrb/font/true_type/file.rb +10 -1
  128. data/lib/pdfrb/font/true_type/glyf.rb +82 -0
  129. data/lib/pdfrb/font/true_type/kern.rb +58 -0
  130. data/lib/pdfrb/font/true_type/loca.rb +42 -0
  131. data/lib/pdfrb/font/true_type/maxp.rb +44 -0
  132. data/lib/pdfrb/font/true_type/name.rb +53 -0
  133. data/lib/pdfrb/font/true_type/post.rb +93 -0
  134. data/lib/pdfrb/font/true_type/subsetter.rb +3 -5
  135. data/lib/pdfrb/font/true_type/wrapper.rb +102 -0
  136. data/lib/pdfrb/font/true_type.rb +7 -0
  137. data/lib/pdfrb/font.rb +2 -0
  138. data/lib/pdfrb/font_loader/from_configuration.rb +19 -0
  139. data/lib/pdfrb/font_loader/from_file.rb +20 -0
  140. data/lib/pdfrb/font_loader/standard14.rb +20 -0
  141. data/lib/pdfrb/font_loader/variant_from_name.rb +36 -0
  142. data/lib/pdfrb/font_loader.rb +4 -0
  143. data/lib/pdfrb/font_resolver.rb +138 -0
  144. data/lib/pdfrb/image/audit.rb +94 -0
  145. data/lib/pdfrb/image/downsampler.rb +124 -0
  146. data/lib/pdfrb/image.rb +13 -0
  147. data/lib/pdfrb/image_loader/jpeg.rb +39 -58
  148. data/lib/pdfrb/image_loader/png.rb +31 -257
  149. data/lib/pdfrb/layout/bidi.rb +198 -0
  150. data/lib/pdfrb/layout/box.rb +49 -0
  151. data/lib/pdfrb/layout/box_fitter.rb +54 -0
  152. data/lib/pdfrb/layout/column_box.rb +71 -0
  153. data/lib/pdfrb/layout/container_box.rb +45 -0
  154. data/lib/pdfrb/layout/frame.rb +67 -0
  155. data/lib/pdfrb/layout/image_box.rb +44 -0
  156. data/lib/pdfrb/layout/inline_box.rb +25 -0
  157. data/lib/pdfrb/layout/line.rb +55 -0
  158. data/lib/pdfrb/layout/list_box.rb +87 -0
  159. data/lib/pdfrb/layout/numeric_refinements.rb +43 -0
  160. data/lib/pdfrb/layout/page_style.rb +65 -0
  161. data/lib/pdfrb/layout/style.rb +62 -0
  162. data/lib/pdfrb/layout/table_box.rb +66 -0
  163. data/lib/pdfrb/layout/text_box.rb +38 -0
  164. data/lib/pdfrb/layout/text_fragment.rb +45 -0
  165. data/lib/pdfrb/layout/text_layouter.rb +123 -0
  166. data/lib/pdfrb/layout.rb +28 -0
  167. data/lib/pdfrb/linearization/hint_stream.rb +93 -0
  168. data/lib/pdfrb/linearization/writer.rb +259 -0
  169. data/lib/pdfrb/linearization.rb +21 -0
  170. data/lib/pdfrb/model/cos/dictionary.rb +12 -0
  171. data/lib/pdfrb/model/pdf_array.rb +2 -2
  172. data/lib/pdfrb/model/type/action.rb +42 -0
  173. data/lib/pdfrb/model/type/action_go_to_3d_view.rb +14 -0
  174. data/lib/pdfrb/model/type/action_go_to_dp.rb +16 -0
  175. data/lib/pdfrb/model/type/action_go_to_r.rb +26 -0
  176. data/lib/pdfrb/model/type/action_goto.rb +34 -0
  177. data/lib/pdfrb/model/type/action_hide.rb +26 -0
  178. data/lib/pdfrb/model/type/action_import_data.rb +18 -0
  179. data/lib/pdfrb/model/type/action_java_script.rb +18 -0
  180. data/lib/pdfrb/model/type/action_launch.rb +22 -0
  181. data/lib/pdfrb/model/type/action_movie.rb +22 -0
  182. data/lib/pdfrb/model/type/action_named.rb +23 -0
  183. data/lib/pdfrb/model/type/action_nop.rb +12 -0
  184. data/lib/pdfrb/model/type/action_rendition.rb +28 -0
  185. data/lib/pdfrb/model/type/action_reset_form.rb +22 -0
  186. data/lib/pdfrb/model/type/action_rich_media_execute.rb +17 -0
  187. data/lib/pdfrb/model/type/action_set_ocg_state.rb +32 -0
  188. data/lib/pdfrb/model/type/action_set_state.rb +14 -0
  189. data/lib/pdfrb/model/type/action_sound_action.rb +23 -0
  190. data/lib/pdfrb/model/type/action_submit_form.rb +64 -0
  191. data/lib/pdfrb/model/type/action_thread.rb +23 -0
  192. data/lib/pdfrb/model/type/action_trans.rb +30 -0
  193. data/lib/pdfrb/model/type/action_uri.rb +30 -0
  194. data/lib/pdfrb/model/type/af_embedded_file.rb +11 -0
  195. data/lib/pdfrb/model/type/af_file_specification.rb +34 -0
  196. data/lib/pdfrb/model/type/annotation.rb +49 -10
  197. data/lib/pdfrb/model/type/appearance.rb +41 -0
  198. data/lib/pdfrb/model/type/appearance_characteristics.rb +36 -0
  199. data/lib/pdfrb/model/type/appearance_generator.rb +22 -0
  200. data/lib/pdfrb/model/type/appearance_trap_net.rb +84 -0
  201. data/lib/pdfrb/model/type/border_effect.rb +25 -0
  202. data/lib/pdfrb/model/type/border_styling.rb +38 -0
  203. data/lib/pdfrb/model/type/box_color_info.rb +21 -0
  204. data/lib/pdfrb/model/type/box_style.rb +19 -0
  205. data/lib/pdfrb/model/type/button.rb +17 -0
  206. data/lib/pdfrb/model/type/cal_gray.rb +17 -0
  207. data/lib/pdfrb/model/type/cal_rgb.rb +22 -0
  208. data/lib/pdfrb/model/type/caret_annotation.rb +21 -0
  209. data/lib/pdfrb/model/type/catalog.rb +99 -16
  210. data/lib/pdfrb/model/type/choice.rb +21 -0
  211. data/lib/pdfrb/model/type/cid_font.rb +52 -1
  212. data/lib/pdfrb/model/type/cid_font_descriptor_metrics.rb +28 -0
  213. data/lib/pdfrb/model/type/cid_system_info.rb +28 -0
  214. data/lib/pdfrb/model/type/circle_annotation.rb +20 -0
  215. data/lib/pdfrb/model/type/collection.rb +27 -0
  216. data/lib/pdfrb/model/type/collection_field.rb +24 -0
  217. data/lib/pdfrb/model/type/collection_item.rb +19 -0
  218. data/lib/pdfrb/model/type/collection_schema.rb +25 -0
  219. data/lib/pdfrb/model/type/collection_sort.rb +13 -0
  220. data/lib/pdfrb/model/type/crypt_filter.rb +58 -0
  221. data/lib/pdfrb/model/type/device_n.rb +37 -0
  222. data/lib/pdfrb/model/type/device_n_mixing_hints.rb +17 -0
  223. data/lib/pdfrb/model/type/device_n_process.rb +13 -0
  224. data/lib/pdfrb/model/type/doc_mdp_transform_parameters.rb +21 -0
  225. data/lib/pdfrb/model/type/document_security_store.rb +55 -0
  226. data/lib/pdfrb/model/type/embedded_file.rb +19 -0
  227. data/lib/pdfrb/model/type/embedded_file_parameter.rb +48 -0
  228. data/lib/pdfrb/model/type/encryption_public_key.rb +38 -0
  229. data/lib/pdfrb/model/type/encryption_standard.rb +68 -0
  230. data/lib/pdfrb/model/type/field_mdp_transform_parameters.rb +26 -0
  231. data/lib/pdfrb/model/type/file_attachment_annotation.rb +29 -0
  232. data/lib/pdfrb/model/type/file_spec_ef.rb +22 -0
  233. data/lib/pdfrb/model/type/file_spec_rf.rb +21 -0
  234. data/lib/pdfrb/model/type/file_specification.rb +43 -0
  235. data/lib/pdfrb/model/type/file_trailer.rb +54 -0
  236. data/lib/pdfrb/model/type/font.rb +73 -2
  237. data/lib/pdfrb/model/type/font_cid_type0.rb +17 -0
  238. data/lib/pdfrb/model/type/font_cid_type2.rb +17 -0
  239. data/lib/pdfrb/model/type/font_descriptor.rb +47 -0
  240. data/lib/pdfrb/model/type/font_descriptor_cid_type0.rb +15 -0
  241. data/lib/pdfrb/model/type/font_descriptor_cid_type2.rb +15 -0
  242. data/lib/pdfrb/model/type/font_encoding.rb +47 -0
  243. data/lib/pdfrb/model/type/font_file.rb +28 -0
  244. data/lib/pdfrb/model/type/font_file2.rb +32 -0
  245. data/lib/pdfrb/model/type/font_file3.rb +23 -0
  246. data/lib/pdfrb/model/type/font_multiple_master.rb +60 -0
  247. data/lib/pdfrb/model/type/font_true_type.rb +1 -1
  248. data/lib/pdfrb/model/type/font_type0.rb +1 -1
  249. data/lib/pdfrb/model/type/font_type1.rb +1 -1
  250. data/lib/pdfrb/model/type/font_type3.rb +1 -1
  251. data/lib/pdfrb/model/type/form_field.rb +73 -0
  252. data/lib/pdfrb/model/type/free_text_annotation.rb +37 -0
  253. data/lib/pdfrb/model/type/function.rb +42 -0
  254. data/lib/pdfrb/model/type/function_exponential.rb +31 -0
  255. data/lib/pdfrb/model/type/function_postscript.rb +25 -0
  256. data/lib/pdfrb/model/type/function_sampled.rb +55 -0
  257. data/lib/pdfrb/model/type/function_stitching.rb +33 -0
  258. data/lib/pdfrb/model/type/generic_appearance.rb +40 -0
  259. data/lib/pdfrb/model/type/graphics_state_parameter.rb +69 -0
  260. data/lib/pdfrb/model/type/halftone.rb +21 -0
  261. data/lib/pdfrb/model/type/halftone_type1.rb +17 -0
  262. data/lib/pdfrb/model/type/halftone_type10.rb +16 -0
  263. data/lib/pdfrb/model/type/halftone_type16.rb +11 -0
  264. data/lib/pdfrb/model/type/halftone_type5.rb +24 -0
  265. data/lib/pdfrb/model/type/halftone_type6.rb +16 -0
  266. data/lib/pdfrb/model/type/highlight_annotation.rb +11 -0
  267. data/lib/pdfrb/model/type/icc_based_color_space.rb +24 -0
  268. data/lib/pdfrb/model/type/icon_fit.rb +31 -0
  269. data/lib/pdfrb/model/type/indexed.rb +32 -0
  270. data/lib/pdfrb/model/type/info.rb +44 -0
  271. data/lib/pdfrb/model/type/ink_annotation.rb +29 -0
  272. data/lib/pdfrb/model/type/interactive_form.rb +36 -0
  273. data/lib/pdfrb/model/type/interior_color.rb +12 -0
  274. data/lib/pdfrb/model/type/jbig2_globals.rb +15 -0
  275. data/lib/pdfrb/model/type/lab.rb +27 -0
  276. data/lib/pdfrb/model/type/line_annotation.rb +44 -0
  277. data/lib/pdfrb/model/type/line_ending_styling.rb +39 -0
  278. data/lib/pdfrb/model/type/link_annotation.rb +41 -0
  279. data/lib/pdfrb/model/type/link_appearance.rb +9 -0
  280. data/lib/pdfrb/model/type/mark_information.rb +23 -0
  281. data/lib/pdfrb/model/type/marked_content_reference.rb +24 -0
  282. data/lib/pdfrb/model/type/markup_annotation.rb +36 -0
  283. data/lib/pdfrb/model/type/mdp_dict.rb +28 -0
  284. data/lib/pdfrb/model/type/measure.rb +39 -0
  285. data/lib/pdfrb/model/type/media_clip.rb +28 -0
  286. data/lib/pdfrb/model/type/media_offset.rb +106 -0
  287. data/lib/pdfrb/model/type/metadata.rb +27 -3
  288. data/lib/pdfrb/model/type/misc_helpers.rb +75 -0
  289. data/lib/pdfrb/model/type/movie.rb +28 -0
  290. data/lib/pdfrb/model/type/names.rb +51 -0
  291. data/lib/pdfrb/model/type/namespace.rb +27 -0
  292. data/lib/pdfrb/model/type/object_reference.rb +31 -0
  293. data/lib/pdfrb/model/type/object_stream.rb +38 -0
  294. data/lib/pdfrb/model/type/opt_content_ext.rb +94 -0
  295. data/lib/pdfrb/model/type/opt_content_page_element.rb +18 -0
  296. data/lib/pdfrb/model/type/optional_content_config.rb +56 -0
  297. data/lib/pdfrb/model/type/optional_content_group.rb +35 -10
  298. data/lib/pdfrb/model/type/optional_content_membership.rb +36 -2
  299. data/lib/pdfrb/model/type/optional_content_properties.rb +16 -1
  300. data/lib/pdfrb/model/type/outline.rb +40 -6
  301. data/lib/pdfrb/model/type/outline_item.rb +45 -0
  302. data/lib/pdfrb/model/type/output_intent.rb +30 -0
  303. data/lib/pdfrb/model/type/page.rb +127 -0
  304. data/lib/pdfrb/model/type/page_label.rb +68 -0
  305. data/lib/pdfrb/model/type/page_tree_node.rb +51 -16
  306. data/lib/pdfrb/model/type/page_tree_node_root.rb +15 -0
  307. data/lib/pdfrb/model/type/pattern.rb +16 -0
  308. data/lib/pdfrb/model/type/pattern_shading.rb +25 -0
  309. data/lib/pdfrb/model/type/pattern_tiling.rb +25 -0
  310. data/lib/pdfrb/model/type/polygon_annotation.rb +29 -0
  311. data/lib/pdfrb/model/type/polygon_polyline.rb +14 -0
  312. data/lib/pdfrb/model/type/polyline_annotation.rb +29 -0
  313. data/lib/pdfrb/model/type/popup_annotation.rb +20 -0
  314. data/lib/pdfrb/model/type/printer_mark_annotation.rb +13 -0
  315. data/lib/pdfrb/model/type/redact_annotation.rb +28 -0
  316. data/lib/pdfrb/model/type/rendition.rb +31 -0
  317. data/lib/pdfrb/model/type/resources.rb +59 -14
  318. data/lib/pdfrb/model/type/rich_media_activation.rb +24 -0
  319. data/lib/pdfrb/model/type/rich_media_animation.rb +25 -0
  320. data/lib/pdfrb/model/type/rich_media_annotation.rb +18 -0
  321. data/lib/pdfrb/model/type/rich_media_command.rb +19 -0
  322. data/lib/pdfrb/model/type/rich_media_configuration.rb +32 -0
  323. data/lib/pdfrb/model/type/rich_media_content.rb +28 -0
  324. data/lib/pdfrb/model/type/rich_media_cue_point.rb +18 -0
  325. data/lib/pdfrb/model/type/rich_media_deactivation.rb +17 -0
  326. data/lib/pdfrb/model/type/rich_media_instance.rb +33 -0
  327. data/lib/pdfrb/model/type/rich_media_presentation.rb +29 -0
  328. data/lib/pdfrb/model/type/rich_media_settings.rb +33 -0
  329. data/lib/pdfrb/model/type/rich_media_window.rb +20 -0
  330. data/lib/pdfrb/model/type/screen_annotation.rb +19 -0
  331. data/lib/pdfrb/model/type/separation.rb +25 -0
  332. data/lib/pdfrb/model/type/sig_field_lock.rb +25 -0
  333. data/lib/pdfrb/model/type/sig_field_seed_value.rb +25 -0
  334. data/lib/pdfrb/model/type/signature.rb +65 -0
  335. data/lib/pdfrb/model/type/signature_build.rb +86 -0
  336. data/lib/pdfrb/model/type/signature_field.rb +17 -0
  337. data/lib/pdfrb/model/type/software_identifier.rb +19 -0
  338. data/lib/pdfrb/model/type/sound.rb +38 -0
  339. data/lib/pdfrb/model/type/sound_annotation.rb +21 -0
  340. data/lib/pdfrb/model/type/square_annotation.rb +24 -0
  341. data/lib/pdfrb/model/type/square_circle.rb +13 -0
  342. data/lib/pdfrb/model/type/squiggly_annotation.rb +11 -0
  343. data/lib/pdfrb/model/type/stamp_annotation.rb +19 -0
  344. data/lib/pdfrb/model/type/strikeout_annotation.rb +11 -0
  345. data/lib/pdfrb/model/type/struct_elem.rb +75 -0
  346. data/lib/pdfrb/model/type/struct_tree_root.rb +34 -0
  347. data/lib/pdfrb/model/type/structure_attributes.rb +44 -0
  348. data/lib/pdfrb/model/type/structure_element_kid.rb +33 -0
  349. data/lib/pdfrb/model/type/text_annotation.rb +25 -0
  350. data/lib/pdfrb/model/type/text_appearance.rb +9 -0
  351. data/lib/pdfrb/model/type/text_field.rb +21 -0
  352. data/lib/pdfrb/model/type/text_markup_annotation.rb +30 -0
  353. data/lib/pdfrb/model/type/three_d_activation.rb +32 -0
  354. data/lib/pdfrb/model/type/three_d_animation_style.rb +24 -0
  355. data/lib/pdfrb/model/type/three_d_background.rb +28 -0
  356. data/lib/pdfrb/model/type/three_d_cross_section.rb +25 -0
  357. data/lib/pdfrb/model/type/three_d_lighting_scheme.rb +26 -0
  358. data/lib/pdfrb/model/type/three_d_measure.rb +20 -0
  359. data/lib/pdfrb/model/type/three_d_measure_3dc.rb +23 -0
  360. data/lib/pdfrb/model/type/three_d_measure_ad3.rb +14 -0
  361. data/lib/pdfrb/model/type/three_d_measure_ld3.rb +14 -0
  362. data/lib/pdfrb/model/type/three_d_measure_pd3.rb +20 -0
  363. data/lib/pdfrb/model/type/three_d_measure_rd3.rb +14 -0
  364. data/lib/pdfrb/model/type/three_d_node.rb +37 -0
  365. data/lib/pdfrb/model/type/three_d_reference.rb +21 -0
  366. data/lib/pdfrb/model/type/three_d_render_mode.rb +34 -0
  367. data/lib/pdfrb/model/type/three_d_stream.rb +48 -0
  368. data/lib/pdfrb/model/type/three_d_units.rb +18 -0
  369. data/lib/pdfrb/model/type/three_d_view.rb +40 -0
  370. data/lib/pdfrb/model/type/to_unicode_cmap_stream.rb +23 -0
  371. data/lib/pdfrb/model/type/transition.rb +68 -0
  372. data/lib/pdfrb/model/type/underline_annotation.rb +11 -0
  373. data/lib/pdfrb/model/type/ur_transform_parameters.rb +33 -0
  374. data/lib/pdfrb/model/type/uri_dict.rb +18 -0
  375. data/lib/pdfrb/model/type/url_alias.rb +19 -0
  376. data/lib/pdfrb/model/type/variable_text_field.rb +47 -0
  377. data/lib/pdfrb/model/type/viewer_preferences.rb +42 -0
  378. data/lib/pdfrb/model/type/watermark_annotation.rb +13 -0
  379. data/lib/pdfrb/model/type/widget_annotation.rb +48 -0
  380. data/lib/pdfrb/model/type/widget_appearance.rb +9 -0
  381. data/lib/pdfrb/model/type/xobject_form.rb +41 -0
  382. data/lib/pdfrb/model/type/xobject_image.rb +56 -0
  383. data/lib/pdfrb/model/type/xref_stream.rb +37 -0
  384. data/lib/pdfrb/model/type.rb +286 -6
  385. data/lib/pdfrb/serializer.rb +2 -2
  386. data/lib/pdfrb/source/tokenizer.rb +0 -2
  387. data/lib/pdfrb/task/benchmark.rb +83 -0
  388. data/lib/pdfrb/task/extract_text.rb +1 -1
  389. data/lib/pdfrb/task/generate_corpus.rb +130 -0
  390. data/lib/pdfrb/task/memory_profile.rb +84 -0
  391. data/lib/pdfrb/task/optimize.rb +97 -7
  392. data/lib/pdfrb/task.rb +3 -3
  393. data/lib/pdfrb/test_utils.rb +112 -0
  394. data/lib/pdfrb/validator.rb +82 -0
  395. data/lib/pdfrb/version.rb +1 -1
  396. data/lib/pdfrb/writer.rb +117 -27
  397. data/lib/pdfrb/xmp/packet.rb +122 -0
  398. data/lib/pdfrb/xmp/schemas.rb +96 -0
  399. data/lib/pdfrb/xmp.rb +44 -0
  400. data/lib/pdfrb/xref_section.rb +2 -2
  401. data/lib/pdfrb.rb +25 -53
  402. data/pdfrb.gemspec +45 -0
  403. data/script/apply_fixes.sh +843 -0
  404. data/script/make_jpeg_fixture.rb +53 -0
  405. data/script/make_png_fixture.rb +25 -0
  406. metadata +312 -2
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Rendition dictionary (s13.3.5). Describes a media clip plus
7
+ # how it should be played.
8
+ class Rendition < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def subtype; self[:S]&.to_sym; end
11
+ def media_clip; self[:C]; end
12
+ def operation; self[:OP]; end
13
+
14
+ def media?
15
+ subtype == :MR
16
+ end
17
+
18
+ def selector?
19
+ subtype == :SR
20
+ end
21
+
22
+ def resolved_media_clip
23
+ ref = media_clip
24
+ return nil unless ref && document
25
+
26
+ document.object(ref)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -8,36 +8,81 @@ module Pdfrb
8
8
  class Resources < Pdfrb::Model::Cos::Dictionary
9
9
  arlington_object "Resource"
10
10
 
11
- def font(name)
12
- lookup_named(:Font, name)
11
+ def fonts; self[:Font]; end
12
+ def xobjects; self[:XObject]; end
13
+ def ext_gstates; self[:ExtGState]; end
14
+ def color_spaces; self[:ColorSpace]; end
15
+ def patterns; self[:Pattern]; end
16
+ def shadings; self[:Shading]; end
17
+ def properties_dict; self[:Properties]; end
18
+ def proc_set; self[:ProcSet]; end
19
+
20
+ def font_names
21
+ dict_keys(fonts)
22
+ end
23
+
24
+ def xobject_names
25
+ dict_keys(xobjects)
13
26
  end
14
27
 
15
- def xobject(name)
16
- lookup_named(:XObject, name)
28
+ def ext_gstate_names
29
+ dict_keys(ext_gstates)
17
30
  end
18
31
 
19
- def ext_gstate(name)
20
- lookup_named(:ExtGState, name)
32
+ def color_space_names
33
+ dict_keys(color_spaces)
21
34
  end
22
35
 
23
- def color_space(name)
24
- lookup_named(:ColorSpace, name)
36
+ def pattern_names
37
+ dict_keys(patterns)
25
38
  end
26
39
 
27
- def pattern(name)
28
- lookup_named(:Pattern, name)
40
+ def shading_names
41
+ dict_keys(shadings)
29
42
  end
30
43
 
31
- def shading(name)
32
- lookup_named(:Shading, name)
44
+ def font(name); lookup_named(:Font, name); end
45
+ def xobject(name); lookup_named(:XObject, name); end
46
+ def ext_gstate(name); lookup_named(:ExtGState, name); end
47
+ def color_space(name); lookup_named(:ColorSpace, name); end
48
+ def pattern(name); lookup_named(:Pattern, name); end
49
+ def shading(name); lookup_named(:Shading, name); end
50
+ def properties(name); lookup_named(:Properties, name); end
51
+
52
+ def has_procset?(name)
53
+ return false unless proc_set
54
+
55
+ arr = proc_set.is_a?(Pdfrb::Model::PdfArray) ? proc_set.to_a : proc_set
56
+ arr.is_a?(Array) && arr.include?(name)
33
57
  end
34
58
 
35
- def properties(name)
36
- lookup_named(:Properties, name)
59
+ def empty?
60
+ %i[Font XObject ExtGState ColorSpace Pattern Shading Properties].all? do |k|
61
+ value[k].nil? || empty_collection?(value[k])
62
+ end
37
63
  end
38
64
 
39
65
  private
40
66
 
67
+ def empty_collection?(value)
68
+ case value
69
+ when ::Array, ::Hash then value.empty?
70
+ when Pdfrb::Model::Cos::Dictionary, Pdfrb::Model::PdfArray then value.value.empty?
71
+ else false
72
+ end
73
+ end
74
+
75
+ def dict_keys(dict)
76
+ return [] unless dict
77
+
78
+ obj = dict.is_a?(Pdfrb::Model::Reference) && document ? document.object(dict) : dict
79
+ case obj
80
+ when Hash then obj.keys
81
+ when Pdfrb::Model::Cos::Dictionary then obj.value.keys
82
+ else []
83
+ end
84
+ end
85
+
41
86
  def lookup_named(key, name)
42
87
  sub = self[key]
43
88
  return nil unless sub.is_a?(::Hash) || sub.is_a?(Pdfrb::Model::Cos::Dictionary)
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Rich Media Activation (s13.6.1). Activation behaviour settings.
7
+ class RichMediaActivation < Pdfrb::Model::Cos::Dictionary
8
+ def type; self[:Type]; end
9
+ def condition; self[:Condition]&.to_sym; end
10
+ def configuration; self[:Configuration]; end
11
+ def presentation; self[:Presentation]; end
12
+ def scripts; self[:Scripts]; end
13
+
14
+ def activation_on_click?; condition == :PO; end
15
+ def activation_on_page_open?; condition == :PV; end
16
+ def activation_on_page_visible?; condition == :XA; end
17
+
18
+ def has_configuration?
19
+ !!configuration
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Rich Media Animation (s13.6.2). Playback control for
7
+ # rich media instances.
8
+ class RichMediaAnimation < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def subtype; self[:Subtype]&.to_sym; end
11
+ def play_count; self[:PlayCount] || -1; end
12
+ def speed; self[:Speed] || 1; end
13
+ def animation_offset; self[:AO] || 0; end
14
+
15
+ def no_animation?; subtype == :None; end
16
+ def linear?; subtype == :Linear; end
17
+ def oscillating?; subtype == :Oscillating; end
18
+
19
+ def loop_forever?
20
+ play_count.negative?
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Rich Media annotation (s12.5.6.20, PDF 1.7 ExtensionLevel 3 +
7
+ # PDF 2.0). Hosts interactive rich media content (Flash, video).
8
+ class RichMediaAnnotation < Annotation
9
+ def rich_media_settings; self[:RichMediaSettings]; end
10
+ def rich_media_content; self[:RichMediaContent]; end
11
+
12
+ def has_rich_media?
13
+ !!rich_media_content
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Rich Media Command (s13.6.4). A command sent to a rich media
7
+ # instance.
8
+ class RichMediaCommand < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def command_name; self[:Cmd]; end
11
+ def arguments; self[:Args]; end
12
+
13
+ def has_arguments?
14
+ !!arguments && (!arguments.is_a?(Array) || !arguments.empty?)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Rich Media Configuration (s13.6.2). A media instance list.
7
+ class RichMediaConfiguration < Pdfrb::Model::Cos::Dictionary
8
+ def type; self[:Type]; end
9
+ def instances; self[:Instances]; end
10
+ def name; self[:Name]; end
11
+
12
+ def instance_count
13
+ return 0 unless instances
14
+
15
+ arr = instances.is_a?(Pdfrb::Model::PdfArray) ? instances.to_a : instances
16
+ arr.is_a?(Array) ? arr.size : 0
17
+ end
18
+
19
+ def each_instance
20
+ return enum_for(:each_instance) unless block_given?
21
+ return unless instances && document
22
+
23
+ arr = instances.is_a?(Pdfrb::Model::PdfArray) ? instances.to_a : instances
24
+ arr.each do |ref|
25
+ obj = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
26
+ yield obj if obj
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Rich Media Content (s13.6.5). Top-level rich media assets bundle.
7
+ class RichMediaContent < Pdfrb::Model::Cos::Dictionary
8
+ def type; self[:Type]; end
9
+ def configurations; self[:Configurations]; end
10
+ def assets; self[:Assets]; end
11
+
12
+ def configuration_count
13
+ return 0 unless configurations
14
+
15
+ arr = configurations.is_a?(Pdfrb::Model::PdfArray) ? configurations.to_a : configurations
16
+ arr.is_a?(Array) ? arr.size : 0
17
+ end
18
+
19
+ def asset_count
20
+ return 0 unless assets
21
+
22
+ obj = assets.is_a?(Pdfrb::Model::Reference) && document ? document.object(assets) : assets
23
+ obj.is_a?(Pdfrb::Model::Cos::Dictionary) ? obj.value.size : 0
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Rich Media Cue Point (s13.6.6). Time marker in a media playback.
7
+ class RichMediaCuePoint < Pdfrb::Model::Cos::Dictionary
8
+ def type; self[:Type]; end
9
+ def time; self[:Time]; end
10
+ def name; self[:Name]; end
11
+
12
+ def has_time?
13
+ !!time
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Rich Media Deactivation (s13.6.1). Deactivation behaviour.
7
+ class RichMediaDeactivation < Pdfrb::Model::Cos::Dictionary
8
+ def type; self[:Type]; end
9
+ def condition; self[:Condition]&.to_sym; end
10
+
11
+ def deactivation_on_click?; condition == :PC; end
12
+ def deactivation_on_page_close?; condition == :PI; end
13
+ def deactivation_on_page_hidden?; condition == :XD; end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Rich Media Instance (s13.6.3). A single playable instance.
7
+ class RichMediaInstance < Pdfrb::Model::Cos::Dictionary
8
+ def type; self[:Type]; end
9
+ def subtype; self[:Subtype]&.to_sym; end
10
+ def media_clip; self[:Asset]; end
11
+
12
+ def flash?
13
+ subtype == :Flash
14
+ end
15
+
16
+ def sound?
17
+ subtype == :Sound
18
+ end
19
+
20
+ def video?
21
+ subtype == :Video
22
+ end
23
+
24
+ def resolved_media_clip
25
+ ref = media_clip
26
+ return nil unless ref && document
27
+
28
+ document.object(ref)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Rich Media Presentation (s13.6.1). Visual presentation settings
7
+ # for a RichMedia annotation (style, window, transparency, etc.).
8
+ class RichMediaPresentation < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def style; self[:Style]&.to_sym; end
11
+ def window; self[:Window]; end
12
+ def transparent?; truthy?(self[:Transparent]); end
13
+ def navigation_pane?; truthy?(self[:NavigationPane]); end
14
+ def toolbar?; truthy?(self[:Toolbar]); end
15
+ def pass_context_click?; truthy?(self[:PassContextClick]); end
16
+
17
+ def embedded_style?; style == :Embedded; end
18
+ def windowed_style?; style == :Windowed; end
19
+
20
+ def resolved_window
21
+ ref = window
22
+ return nil unless ref && document
23
+
24
+ document.object(ref)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Rich Media Settings (s13.6.2). Top-level activation/deactivation
7
+ # configuration for a RichMedia annotation.
8
+ class RichMediaSettings < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def activation; self[:Activation]; end
11
+ def deactivation; self[:Deactivation]; end
12
+
13
+ def has_activation?
14
+ !!activation
15
+ end
16
+
17
+ def resolved_activation
18
+ ref = activation
19
+ return nil unless ref && document
20
+
21
+ document.object(ref)
22
+ end
23
+
24
+ def resolved_deactivation
25
+ ref = deactivation
26
+ return nil unless ref && document
27
+
28
+ document.object(ref)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Rich Media Window (s13.6.1). Window dimensions and position
7
+ # for windowed rich media.
8
+ class RichMediaWindow < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def width; self[:Width]; end
11
+ def height; self[:Height]; end
12
+ def position; self[:Position]; end
13
+
14
+ def has_dimensions?
15
+ !!width && !!height
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Screen annotation (s12.5.6.18). Holds media played via Action
7
+ # triggers. /Subtype /Screen.
8
+ class ScreenAnnotation < Annotation
9
+ def attachment_point; self[:AP]; end
10
+ def media_type; self[:T]; end
11
+ def actions; self[:AA]; end
12
+
13
+ def has_media?
14
+ !!media_type
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
+ # Separation color space (s8.6.6.3). A single custom colorant
7
+ # mapped through a tint-transform function. Used for spot colors
8
+ # like PANTONE 185 C.
9
+ class Separation < Pdfrb::Model::Cos::Dictionary
10
+ def alternate_space; self[:AlternateSpace]; end
11
+ def tint_transform; self[:TintTransform]; end
12
+ def colorant_name; self[:Colorant]; end
13
+
14
+ def components; 1; end
15
+
16
+ def resolved_tint_transform
17
+ ref = tint_transform
18
+ return nil unless ref && document
19
+
20
+ document.object(ref)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Signature field lock (s12.7.6.5). Specifies which fields are
7
+ # locked after signing.
8
+ class SigFieldLock < Pdfrb::Model::Cos::Dictionary
9
+ def action; self[:Action]&.to_sym; end
10
+ def fields; self[:Fields]; end
11
+
12
+ def all_locked?; action == :All; end
13
+ def include_locked?; action == :Include; end
14
+ def exclude_locked?; action == :Exclude; end
15
+
16
+ def locked_field_names
17
+ return [] unless include_locked? && fields
18
+
19
+ arr = fields.is_a?(Pdfrb::Model::PdfArray) ? fields.to_a : fields
20
+ arr.is_a?(Array) ? arr : []
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Signature field seed value (s12.7.6.6). Constraints the signer
7
+ # must obey when signing (cert issuers, hash algorithms, etc.).
8
+ class SigFieldSeedValue < Pdfrb::Model::Cos::Dictionary
9
+ def filter; self[:Filter]; end
10
+ def sub_filter; self[:SubFilter]; end
11
+ def digest_method; self[:DigestMethod]; end
12
+ def cert; self[:Cert]; end
13
+ def flags; self[:F] || 0; end
14
+ def legal_attestation; self[:LegalAttestation]; end
15
+ def add_rev_info?; flags & 1 != 0; end
16
+ def add_doc_mdp?; flags & 2 != 0; end
17
+ def add_field_mdp?; flags & 4 != 0; end
18
+ def required_filter?; filter && flags.anybits?(0x100); end
19
+ def required_subfilter?; sub_filter && flags.anybits?(0x200); end
20
+ def required_digest?; digest_method && flags.anybits?(0x400); end
21
+ def required_cert?; cert && flags.anybits?(0x800); end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Signature dictionary (s12.8.2). Carries the PKCS#7 / CMS
7
+ # signature payload. Lives in a Signature field's /V entry.
8
+ class Signature < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def filter; self[:Filter]; end
11
+ def sub_filter; self[:SubFilter]; end
12
+ def contents; self[:Contents]; end
13
+ def cert; self[:Cert]; end
14
+ def byte_range; self[:ByteRange]; end
15
+ def reference; self[:Reference]; end
16
+ def changes; self[:Changes]; end
17
+ def name; self[:Name]; end
18
+ def reason; self[:Reason]; end
19
+ def location; self[:Location]; end
20
+ def contact_info; self[:ContactInfo]; end
21
+ def m; self[:M]; end
22
+ def prop_build; self[:Prop_Build]; end
23
+ def prop_auth_time; self[:Prop_AuthTime]; end
24
+ def prop_auth_type; self[:Prop_AuthType]; end
25
+
26
+ def signed_time
27
+ return nil unless m
28
+
29
+ m.is_a?(Time) ? m : parse_pdf_date(m)
30
+ end
31
+
32
+ def pkcs7_detached?
33
+ sub_filter == :"adbe.pkcs7.detached"
34
+ end
35
+
36
+ def pkcs7_sha1?
37
+ sub_filter == :"adbe.pkcs7.sha1"
38
+ end
39
+
40
+ def pkcs1?
41
+ sub_filter == :"adbe.x509.rsa_sha1"
42
+ end
43
+
44
+ def has_byte_range?
45
+ byte_range.is_a?(Array) && byte_range.size == 4
46
+ end
47
+
48
+ private
49
+
50
+ def parse_pdf_date(str)
51
+ return nil unless str
52
+
53
+ match = str.to_s.match(/^D:(\d{4})(\d{2})(\d{2})(\d{2})?(\d{2})?(\d{2})?/)
54
+ return nil unless match
55
+
56
+ Time.new(match[1].to_i, match[2].to_i, match[3].to_i,
57
+ (match[4] || 0).to_i, (match[5] || 0).to_i, (match[6] || 0).to_i,
58
+ "+00:00")
59
+ rescue StandardError
60
+ nil
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Signature Build Data Dict (s12.8.4.2, Table 356). Per-PPKLite
7
+ # build-data dict holding filter / PubSec / App / SigQ
8
+ # sub-dictionaries.
9
+ class SignatureBuildDataDict < Pdfrb::Model::Cos::Dictionary
10
+ def filter; self[:Filter]; end
11
+ def pub_sec; self[:PubSec]; end
12
+ def app; self[:App]; end
13
+ def sig_q; self[:SigQ]; end
14
+
15
+ def has_app?
16
+ !!app
17
+ end
18
+
19
+ def has_filter?
20
+ !!filter
21
+ end
22
+ end
23
+
24
+ # Signature Build Data App Dict (s12.8.4.2). Per-app info.
25
+ class SignatureBuildDataAppDict < Pdfrb::Model::Cos::Dictionary
26
+ def name; self[:Name]; end
27
+ def date; self[:Date]; end
28
+ def r; self[:R]; end
29
+ def pre_release?; truthy?(self[:PreRelease]); end
30
+ def build_type; self[:Type]&.to_sym; end
31
+ end
32
+
33
+ # Signature Build Data SigQ Dict (s12.8.4.2). PKCS#7 signing
34
+ # request quality metadata.
35
+ class SignatureBuildDataSigQDict < Pdfrb::Model::Cos::Dictionary
36
+ def r; self[:R]; end
37
+ def q; self[:Q]; end
38
+ def hash; self[:HashAlgorithm]&.to_sym; end
39
+
40
+ def has_quality_flags?
41
+ !!q || !!r
42
+ end
43
+ end
44
+
45
+ # Signature Reference DocMDP (s12.8.2.2). DocMDP signature
46
+ # reference.
47
+ class SignatureReferenceDocMDP < Pdfrb::Model::Cos::Dictionary
48
+ def type; self[:Type]; end
49
+ def digest_method; self[:DigestMethod]&.to_sym; end
50
+
51
+ def rip1?
52
+ type == :DocumentModificationPermissions
53
+ end
54
+ end
55
+
56
+ # Signature Reference Identity (s12.8.2.2). Identity signature
57
+ # reference.
58
+ class SignatureReferenceIdentity < Pdfrb::Model::Cos::Dictionary
59
+ def type; self[:Type]; end
60
+ def digest_method; self[:DigestMethod]&.to_sym; end
61
+ end
62
+
63
+ # Signature Reference UR (Usage Rights, s12.8.2.3).
64
+ class SignatureReferenceUR < Pdfrb::Model::Cos::Dictionary
65
+ def type; self[:Type]; end
66
+ def digest_method; self[:DigestMethod]&.to_sym; end
67
+ def transform_params; self[:TransformParams]; end
68
+
69
+ def resolved_transform_params
70
+ ref = transform_params
71
+ return nil unless ref && document
72
+
73
+ document.object(ref)
74
+ end
75
+ end
76
+
77
+ # Signature Reference FieldMDP (s12.7.6.5). FieldMDP signature
78
+ # reference.
79
+ class SignatureReferenceFieldMDP < Pdfrb::Model::Cos::Dictionary
80
+ def type; self[:Type]; end
81
+ def digest_method; self[:DigestMethod]&.to_sym; end
82
+ def transform_params; self[:TransformParams]; end
83
+ end
84
+ end
85
+ end
86
+ end