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,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # ICCBased Color Space (s8.6.5.5). Wrapper for the
7
+ # [/ICCBased <stream-ref>] array form.
8
+ class ICCBasedColorSpace < Pdfrb::Model::Cos::Stream
9
+ def component_count; self[:N]; end
10
+ def alternate; self[:Alternate]; end
11
+ def range; self[:Range]; end
12
+ def metadata_stream; self[:Metadata]; end
13
+
14
+ def has_alternate?
15
+ !!alternate
16
+ end
17
+
18
+ def has_metadata?
19
+ !!metadata_stream
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # IconFit (s12.5.6.19). Controls positioning/scaling of a button
7
+ # field's icon within its rectangle.
8
+ class IconFit < Cos::Dictionary
9
+ register_type :IconFit
10
+
11
+ def type; self[:Type]; end
12
+ def scale_type; self[:SW]&.to_sym; end
13
+ def fit; self[:S]&.to_sym; end
14
+ def always_scaled?; scale_type.nil? || scale_type == :A; end
15
+ def scale_when_bigger?; scale_type == :B; end
16
+ def scale_when_smaller?; scale_type == :S; end
17
+ def never_scale?; scale_type == :N; end
18
+ def proportional_fit?; fit.nil? || fit == :P; end
19
+ def non_proportional_fit?; fit == :A; end
20
+
21
+ def border_background; self[:BG]; end
22
+ def border_arrow_left; self[:IF]; end
23
+ def tp; self[:TP]; end
24
+
25
+ def placement_mode
26
+ tp || 0
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Indexed color space array wrapper. The /Indexed color space is
7
+ # [/Indexed base hival lookup]; the lookup table is the stream payload
8
+ # or a string.
9
+ class Indexed < Pdfrb::Model::Cos::Stream
10
+ def base_color_space; self[:Base]; end
11
+ def hival; self[:Hival]; end
12
+ def lookup; self[:Lookup]; end
13
+
14
+ def components
15
+ return nil unless base_color_space
16
+
17
+ case base_color_space.to_sym
18
+ when :DeviceGray, :CalGray then 1
19
+ when :DeviceRGB, :CalRGB then 3
20
+ when :DeviceCMYK then 4
21
+ end
22
+ rescue StandardError
23
+ nil
24
+ end
25
+
26
+ def palette_entries
27
+ (hival || -1) + 1
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -9,6 +9,50 @@ module Pdfrb
9
9
  # still widely used.
10
10
  class Info < Pdfrb::Model::Cos::Dictionary
11
11
  arlington_object "DocInfo"
12
+ register_type :Info
13
+
14
+ def title; self[:Title]; end
15
+ def author; self[:Author]; end
16
+ def subject; self[:Subject]; end
17
+ def keywords; self[:Keywords]; end
18
+ def creator; self[:Creator]; end
19
+ def producer; self[:Producer]; end
20
+ def creation_date; self[:CreationDate]; end
21
+ def modification_date; self[:ModDate]; end
22
+ def trapped; self[:Trapped]; end
23
+
24
+ def trapped?
25
+ trapped&.to_sym == :True
26
+ end
27
+
28
+ def creation_time
29
+ parse_pdf_date(creation_date)
30
+ end
31
+
32
+ def modification_time
33
+ parse_pdf_date(modification_date)
34
+ end
35
+
36
+ private
37
+
38
+ def parse_pdf_date(str)
39
+ return str if str.is_a?(Time)
40
+ return nil unless str
41
+
42
+ match = str.to_s.match(/^D:(\d{4})(\d{2})(\d{2})(\d{2})?(\d{2})?(\d{2})?/)
43
+ return nil unless match
44
+
45
+ year = match[1].to_i
46
+ month = match[2].to_i
47
+ day = match[3].to_i
48
+ hour = (match[4] || 0).to_i
49
+ min = (match[5] || 0).to_i
50
+ sec = (match[6] || 0).to_i
51
+
52
+ Time.new(year, month, day, hour, min, sec, "+00:00")
53
+ rescue StandardError
54
+ nil
55
+ end
12
56
  end
13
57
  end
14
58
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Ink annotation (s12.5.6.13). Freehand scribble path(s).
7
+ class InkAnnotation < MarkupAnnotation
8
+ def ink_list; self[:InkList]; end
9
+ def interior_color; self[:IC]; end
10
+ def border_style; self[:BS]; end
11
+ def border; self[:Border]; end
12
+
13
+ def path_count
14
+ return 0 unless ink_list
15
+
16
+ arr = ink_list.is_a?(Pdfrb::Model::PdfArray) ? ink_list.to_a : ink_list
17
+ arr.is_a?(Array) ? arr.size : 0
18
+ end
19
+
20
+ def path_at(index)
21
+ return nil unless ink_list
22
+
23
+ arr = ink_list.is_a?(Pdfrb::Model::PdfArray) ? ink_list.to_a : ink_list
24
+ arr && arr[index]
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -6,6 +6,42 @@ module Pdfrb
6
6
  # AcroForm interactive form root (s12.7.2). Catalog /AcroForm.
7
7
  class InteractiveForm < Pdfrb::Model::Cos::Dictionary
8
8
  arlington_object "InteractiveForm"
9
+ register_type :AcroForm
10
+
11
+ def fields; self[:Fields]; end
12
+ def need_appearances; self[:NeedAppearances]; end
13
+ def sig_flags; self[:SigFlags]; end
14
+ def co; self[:CO]; end
15
+ def dr; self[:DR]; end
16
+ def da; self[:DA]; end
17
+ def q; self[:Q]; end
18
+
19
+ def need_appearances?
20
+ !!need_appearances
21
+ end
22
+
23
+ def field_count
24
+ return 0 unless fields
25
+
26
+ arr = fields.is_a?(Pdfrb::Model::PdfArray) ? fields.to_a : fields
27
+ arr.is_a?(Array) ? arr.size : 0
28
+ end
29
+
30
+ def append_only_signatures?
31
+ sig_flags&.anybits?(1)
32
+ end
33
+
34
+ def contains_signature_dr_usage?
35
+ sig_flags&.anybits?(2)
36
+ end
37
+
38
+ def text_alignment
39
+ case q
40
+ when 0 then :left
41
+ when 1 then :center
42
+ when 2 then :right
43
+ end
44
+ end
9
45
  end
10
46
  end
11
47
  end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ class InteriorColor < Cos::Dictionary
7
+ register_type :InteriorColor
8
+ def color; self[:IC]; end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # JBIG2 Globals stream (s7.4.7). Holds shared JBIG2 segment
7
+ # data referenced by /DecodeParms /JBIG2Globals.
8
+ class JBIG2Globals < Pdfrb::Model::Cos::Stream
9
+ def globals_data
10
+ decoded_stream&.force_encoding(Encoding::BINARY)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Lab color space dictionary (s8.6.3.4). CIE L*a*b*:
7
+ # [/Lab <dict>].
8
+ class Lab < Pdfrb::Model::Cos::Dictionary
9
+ def white_point; self[:WhitePoint]; end
10
+ def black_point; self[:BlackPoint]; end
11
+ def range; self[:Range]; end
12
+
13
+ def components; 3; end
14
+
15
+ # /Range is [a_min a_max b_min b_max]; defaults per spec are
16
+ # [-100 100 -100 100].
17
+ def a_range
18
+ range ? [range[0], range[1]] : [-100, 100]
19
+ end
20
+
21
+ def b_range
22
+ range ? [range[2], range[3]] : [-100, 100]
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Line annotation (s12.5.6.7). Line between two coordinate pairs.
7
+ class LineAnnotation < MarkupAnnotation
8
+ def line; self[:L]; end
9
+ def le; self[:LE]; end
10
+ def line_endings; le; end
11
+ def interior_color; self[:IC]; end
12
+ def caption; self[:Cap]; end
13
+ def measure; self[:Measure]; end
14
+ def border_style; self[:BS]; end
15
+ def border; self[:Border]; end
16
+ def co; self[:CO]; end
17
+ def cp; self[:CP]; end
18
+ def ll; self[:LL]; end
19
+ def lle; self[:LLE]; end
20
+ def it; self[:IT]; end
21
+
22
+ def start_point
23
+ return nil unless line.is_a?(Array) && line.size >= 2
24
+
25
+ line[0..1]
26
+ end
27
+
28
+ def end_point
29
+ return nil unless line.is_a?(Array) && line.size >= 4
30
+
31
+ line[2..3]
32
+ end
33
+
34
+ def has_caption?
35
+ !!caption
36
+ end
37
+
38
+ def has_measure?
39
+ !!measure
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # LineEndingStyling (s12.5.5). /LE array of line-ending styles
7
+ # (None, OpenArrow, ClosedArrow, Butt, Diamond, Square, etc.).
8
+ class LineEndingStyling < Cos::Dictionary
9
+ register_type :LineEndingStyling
10
+
11
+ def type; self[:Type]; end
12
+ def line_endings; self[:LE]; end
13
+
14
+ def line_start
15
+ return nil unless line_endings
16
+
17
+ arr = line_endings.is_a?(Pdfrb::Model::PdfArray) ? line_endings.to_a : line_endings
18
+ arr.is_a?(Array) ? arr[0] : nil
19
+ end
20
+
21
+ def line_end
22
+ return nil unless line_endings
23
+
24
+ arr = line_endings.is_a?(Pdfrb::Model::PdfArray) ? line_endings.to_a : line_endings
25
+ arr.is_a?(Array) ? arr[1] : nil
26
+ end
27
+
28
+ def symmetric?
29
+ line_start == line_end
30
+ end
31
+
32
+ def has_arrows?
33
+ [:OpenArrow, :ClosedArrow].include?(line_start&.to_sym) ||
34
+ [:OpenArrow, :ClosedArrow].include?(line_end&.to_sym)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ class LinkAnnotation < Annotation
7
+ def action; self[:A]; end
8
+ def destination; self[:Dest]; end
9
+ def highlight_mode; self[:H]; end
10
+ def uri_action; self[:PA]; end
11
+ def quad_points; self[:QuadPoints]; end
12
+ def border; self[:Border]; end
13
+ def bs; self[:BS]; end
14
+
15
+ def has_action?
16
+ !!action
17
+ end
18
+
19
+ def has_destination?
20
+ !!destination
21
+ end
22
+
23
+ def uri_link?
24
+ has_action? && action && action[:S]&.to_sym == :URI
25
+ end
26
+
27
+ def goto_link?
28
+ has_action? && action && action[:S]&.to_sym == :GoTo
29
+ end
30
+
31
+ def launch_link?
32
+ has_action? && action && action[:S]&.to_sym == :Launch
33
+ end
34
+
35
+ def highlight
36
+ (highlight_mode || :Invert).to_sym
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ class LinkAppearance < GenericAppearance; end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # MarkInformation (s14.7.1). Catalog /MarkInfo — flags whether
7
+ # the document is tagged and structural metadata is reliable.
8
+ class MarkInformation < Cos::Dictionary
9
+ register_type :MarkInfo
10
+
11
+ def type; self[:Type]; end
12
+
13
+ def marked?; truthy?(self[:Marked]); end
14
+ def user_properties?; truthy?(self[:UserProperties]); end
15
+ def suspects?; truthy?(self[:Suspects]); end
16
+
17
+ def tagged?
18
+ marked? && !suspects?
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Marked-Content Reference (s14.7.6.2). Refers to a marked-content
7
+ # sequence on a page by MCID.
8
+ class MarkedContentReference < Cos::Dictionary
9
+ register_type :MCR
10
+
11
+ def type; self[:Type]; end
12
+ def page; self[:Pg]; end
13
+ def content_item; self[:MCID]; end
14
+
15
+ def resolved_page
16
+ ref = page
17
+ return nil unless ref && document
18
+
19
+ document.object(ref)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ class MarkupAnnotation < Annotation
7
+ def title; self[:T]; end
8
+ def popup; self[:Popup]; end
9
+ def rich_contents; self[:RC]; end
10
+ def creation_date; self[:CreationDate]; end
11
+ def subject; self[:Subj]; end
12
+ def intent; self[:IT]; end
13
+ def in_reply_to; self[:IRT]; end
14
+ def reply_type; self[:RT]; end
15
+ def external_data; self[:ExData]; end
16
+ def opacity; self[:CA]; end
17
+ def interior_color; self[:IC]; end
18
+
19
+ def open?
20
+ return false unless popup
21
+
22
+ obj = popup.is_a?(Pdfrb::Model::Reference) && document ? document.object(popup) : popup
23
+ obj && obj[:Open]
24
+ end
25
+
26
+ def reply?
27
+ !!in_reply_to
28
+ end
29
+
30
+ def group_reply?
31
+ reply_type&.to_sym == :Group
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # MDP (Modification Detection and Prevention) dict (s12.8.2.2).
7
+ # The /Reference entry on a Signature, with /TransformMethod /DocMDP
8
+ # or /UR (Usage Rights).
9
+ class MDPDict < Pdfrb::Model::Cos::Dictionary
10
+ def type; self[:Type]; end
11
+ def transform_method; self[:TransformMethod]&.to_sym; end
12
+ def transform_params; self[:TransformParams]; end
13
+
14
+ def doc_mdp?; transform_method == :DocMDP; end
15
+ def ur?; transform_method == :UR; end
16
+ def field_mdp?; transform_method == :FieldMDP; end
17
+ def identity?; transform_method == :Identity; end
18
+
19
+ def resolved_transform_params
20
+ ref = transform_params
21
+ return nil unless ref && document
22
+
23
+ document.object(ref)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Measure dictionary (s11.4). Used by line/poly annotations and
7
+ # XObjects to map PDF units to real-world units.
8
+ class Measure < Cos::Dictionary
9
+ register_type :Measure
10
+
11
+ def type; self[:Type]; end
12
+ def subtype; self[:Subtype]; end
13
+ def scale_ratio; self[:R]; end
14
+ def x_scale; self[:X]; end
15
+ def y_scale; self[:Y]; end
16
+ def cyxy; self[:CYX]; end
17
+ def cyy; self[:CYY]; end
18
+ def distance_format; self[:D]; end
19
+ def area_format; self[:A]; end
20
+ def angular_format; self[:T]; end
21
+ def slope_format; self[:S]; end
22
+ def origin; self[:O]; end
23
+ def ctp; self[:CYX]; end
24
+
25
+ def rectilinear?
26
+ subtype&.to_sym == :RL
27
+ end
28
+
29
+ def geographic?
30
+ subtype&.to_sym == :GEO
31
+ end
32
+
33
+ def has_area_format?
34
+ !!area_format
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Media Clip Data stream (s13.3.3). Carries actual media payload.
7
+ class MediaClip < Pdfrb::Model::Cos::Stream
8
+ def type; self[:Type]; end
9
+ def subtype; self[:S]&.to_sym; end
10
+
11
+ def must_use_honest?
12
+ subtype == :MIMEType
13
+ end
14
+
15
+ def file_spec; self[:D]; end
16
+ def mime_type; self[:CT]; end
17
+ def data_size; self[:S]; 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