pdfrb 0.3.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/Gemfile +1 -0
  4. data/PROPOSAL.canvas-clip.md +92 -0
  5. data/PROPOSAL.canvas-draw-image-matrix.md +87 -0
  6. data/PROPOSAL.canvas-rich-text.md +103 -0
  7. data/PROPOSAL.canvas-text-lines.md +77 -0
  8. data/PROPOSAL.canvas-transparency.md +106 -0
  9. data/PROPOSAL.external-font-metrics.md +129 -0
  10. data/PROPOSAL.font-embedding-fontfile2.md +88 -0
  11. data/PROPOSAL.font-resolver-ttc.md +105 -0
  12. data/PROPOSAL.font-resolver.md +96 -0
  13. data/PROPOSAL.font-subsetting.md +98 -0
  14. data/PROPOSAL.gradient-shadings.md +110 -0
  15. data/PROPOSAL.page-mediabox-setter.md +66 -0
  16. data/PROPOSAL.per-glyph-width.md +91 -0
  17. data/PROPOSAL.stringio-require.md +53 -0
  18. data/PROPOSAL.struct-tree-root.md +102 -0
  19. data/PROPOSAL.text-measurement.md +93 -0
  20. data/PROPOSAL.ttf-table-parsing-fix.md +112 -0
  21. data/RELEASE.md +48 -0
  22. data/lib/pdfrb/action/base.rb +21 -0
  23. data/lib/pdfrb/action/types.rb +178 -0
  24. data/lib/pdfrb/action.rb +55 -0
  25. data/lib/pdfrb/annotation/base.rb +79 -0
  26. data/lib/pdfrb/annotation/types.rb +222 -0
  27. data/lib/pdfrb/annotation.rb +78 -0
  28. data/lib/pdfrb/appearance/generator.rb +216 -0
  29. data/lib/pdfrb/appearance.rb +11 -0
  30. data/lib/pdfrb/arlington/object_definition.rb +2 -2
  31. data/lib/pdfrb/arlington/predicate/evaluator.rb +1 -1
  32. data/lib/pdfrb/arlington/predicate/functions.rb +25 -9
  33. data/lib/pdfrb/arlington/predicate.rb +1 -5
  34. data/lib/pdfrb/cli/batch.rb +18 -0
  35. data/lib/pdfrb/cli/debug_info.rb +18 -0
  36. data/lib/pdfrb/cli/files.rb +16 -0
  37. data/lib/pdfrb/cli/fonts.rb +16 -0
  38. data/lib/pdfrb/cli/form.rb +18 -0
  39. data/lib/pdfrb/cli/image2pdf.rb +18 -0
  40. data/lib/pdfrb/cli/images.rb +34 -0
  41. data/lib/pdfrb/cli/info.rb +20 -0
  42. data/lib/pdfrb/cli/inspect.rb +18 -0
  43. data/lib/pdfrb/cli/merge.rb +18 -0
  44. data/lib/pdfrb/cli/modify.rb +18 -0
  45. data/lib/pdfrb/cli/optimize.rb +18 -0
  46. data/lib/pdfrb/cli/split.rb +21 -0
  47. data/lib/pdfrb/cli/watermark.rb +18 -0
  48. data/lib/pdfrb/cli.rb +291 -7
  49. data/lib/pdfrb/color/color_space.rb +259 -0
  50. data/lib/pdfrb/color/icc_profile.rb +90 -0
  51. data/lib/pdfrb/color.rb +12 -0
  52. data/lib/pdfrb/compare/comparator.rb +244 -0
  53. data/lib/pdfrb/compare/report.rb +78 -0
  54. data/lib/pdfrb/compare.rb +42 -0
  55. data/lib/pdfrb/composer.rb +161 -0
  56. data/lib/pdfrb/conformance/pdf_a.rb +317 -56
  57. data/lib/pdfrb/conformance/pdf_ua.rb +186 -29
  58. data/lib/pdfrb/conformance/pdf_x.rb +247 -0
  59. data/lib/pdfrb/conformance/rule.rb +78 -0
  60. data/lib/pdfrb/conformance/structure_elements.rb +174 -0
  61. data/lib/pdfrb/conformance/verapdf_bridge.rb +92 -0
  62. data/lib/pdfrb/conformance.rb +7 -3
  63. data/lib/pdfrb/content/canvas.rb +217 -72
  64. data/lib/pdfrb/content/color_space.rb +157 -0
  65. data/lib/pdfrb/content/hidden_text_detector.rb +167 -0
  66. data/lib/pdfrb/content/operator.rb +21 -1
  67. data/lib/pdfrb/content/operators/clipping.rb +36 -0
  68. data/lib/pdfrb/content/operators/graphics_state_params.rb +15 -0
  69. data/lib/pdfrb/content/operators.rb +21 -0
  70. data/lib/pdfrb/content/shading/base.rb +139 -0
  71. data/lib/pdfrb/content/shading.rb +17 -0
  72. data/lib/pdfrb/content/smart_text_extractor.rb +85 -0
  73. data/lib/pdfrb/content/tiling_pattern.rb +78 -0
  74. data/lib/pdfrb/content/transformation_matrix.rb +61 -0
  75. data/lib/pdfrb/content.rb +7 -26
  76. data/lib/pdfrb/destination/fit.rb +185 -0
  77. data/lib/pdfrb/destination.rb +13 -0
  78. data/lib/pdfrb/digital_signature/cms_handler.rb +22 -0
  79. data/lib/pdfrb/digital_signature/signing.rb +107 -11
  80. data/lib/pdfrb/digital_signature/timestamp_handler.rb +45 -0
  81. data/lib/pdfrb/digital_signature/verification.rb +88 -9
  82. data/lib/pdfrb/digital_signature/verification_result.rb +14 -0
  83. data/lib/pdfrb/digital_signature.rb +26 -2
  84. data/lib/pdfrb/document/annotations.rb +120 -3
  85. data/lib/pdfrb/document/associated_files.rb +104 -0
  86. data/lib/pdfrb/document/colors.rb +95 -0
  87. data/lib/pdfrb/document/destinations.rb +127 -5
  88. data/lib/pdfrb/document/display.rb +84 -0
  89. data/lib/pdfrb/document/fonts.rb +417 -45
  90. data/lib/pdfrb/document/form.rb +338 -0
  91. data/lib/pdfrb/document/graphics_state.rb +91 -0
  92. data/lib/pdfrb/document/images.rb +4 -4
  93. data/lib/pdfrb/document/info.rb +102 -0
  94. data/lib/pdfrb/document/layers.rb +62 -0
  95. data/lib/pdfrb/document/metadata.rb +12 -5
  96. data/lib/pdfrb/document/output_intents.rb +91 -0
  97. data/lib/pdfrb/document/page_labels.rb +80 -0
  98. data/lib/pdfrb/document/pages.rb +68 -19
  99. data/lib/pdfrb/document/portfolio.rb +119 -0
  100. data/lib/pdfrb/document/shadings.rb +159 -0
  101. data/lib/pdfrb/document/stamps.rb +68 -0
  102. data/lib/pdfrb/document/structure.rb +242 -0
  103. data/lib/pdfrb/document.rb +73 -4
  104. data/lib/pdfrb/encryption/identity.rb +13 -0
  105. data/lib/pdfrb/encryption/password_verification.rb +53 -8
  106. data/lib/pdfrb/encryption/security_handler.rb +8 -5
  107. data/lib/pdfrb/encryption/standard_security_handler.rb +154 -81
  108. data/lib/pdfrb/encryption.rb +17 -0
  109. data/lib/pdfrb/error.rb +2 -2
  110. data/lib/pdfrb/filter/brotli_decode.rb +32 -0
  111. data/lib/pdfrb/filter/ccitt_fax_decode.rb +12 -0
  112. data/lib/pdfrb/filter/crypt.rb +2 -2
  113. data/lib/pdfrb/filter/dct_decode.rb +18 -0
  114. data/lib/pdfrb/filter/flate_decode.rb +4 -18
  115. data/lib/pdfrb/filter/jbig2_decode.rb +12 -0
  116. data/lib/pdfrb/filter/jpx_decode.rb +18 -0
  117. data/lib/pdfrb/filter/lzw_decode.rb +3 -2
  118. data/lib/pdfrb/filter/png_predictor.rb +94 -0
  119. data/lib/pdfrb/filter.rb +26 -13
  120. data/lib/pdfrb/font/afm_parser.rb +50 -26
  121. data/lib/pdfrb/font/cmap/writer.rb +9 -0
  122. data/lib/pdfrb/font/encoding/win_ansi_encoding.rb +17 -0
  123. data/lib/pdfrb/font/encoding.rb +32 -3
  124. data/lib/pdfrb/font/metrics_helper.rb +121 -0
  125. data/lib/pdfrb/font/true_type/file.rb +10 -1
  126. data/lib/pdfrb/font/true_type/glyf.rb +82 -0
  127. data/lib/pdfrb/font/true_type/kern.rb +58 -0
  128. data/lib/pdfrb/font/true_type/loca.rb +42 -0
  129. data/lib/pdfrb/font/true_type/maxp.rb +44 -0
  130. data/lib/pdfrb/font/true_type/name.rb +53 -0
  131. data/lib/pdfrb/font/true_type/post.rb +93 -0
  132. data/lib/pdfrb/font/true_type/subsetter.rb +3 -5
  133. data/lib/pdfrb/font/true_type/wrapper.rb +102 -0
  134. data/lib/pdfrb/font/true_type.rb +7 -0
  135. data/lib/pdfrb/font.rb +2 -0
  136. data/lib/pdfrb/font_loader/from_configuration.rb +19 -0
  137. data/lib/pdfrb/font_loader/from_file.rb +20 -0
  138. data/lib/pdfrb/font_loader/standard14.rb +20 -0
  139. data/lib/pdfrb/font_loader/variant_from_name.rb +36 -0
  140. data/lib/pdfrb/font_loader.rb +4 -0
  141. data/lib/pdfrb/font_resolver.rb +138 -0
  142. data/lib/pdfrb/image/audit.rb +94 -0
  143. data/lib/pdfrb/image/downsampler.rb +124 -0
  144. data/lib/pdfrb/image.rb +13 -0
  145. data/lib/pdfrb/image_loader/jpeg.rb +39 -58
  146. data/lib/pdfrb/image_loader/png.rb +31 -257
  147. data/lib/pdfrb/layout/bidi.rb +198 -0
  148. data/lib/pdfrb/layout/box.rb +49 -0
  149. data/lib/pdfrb/layout/box_fitter.rb +54 -0
  150. data/lib/pdfrb/layout/column_box.rb +71 -0
  151. data/lib/pdfrb/layout/container_box.rb +45 -0
  152. data/lib/pdfrb/layout/frame.rb +67 -0
  153. data/lib/pdfrb/layout/image_box.rb +44 -0
  154. data/lib/pdfrb/layout/inline_box.rb +25 -0
  155. data/lib/pdfrb/layout/line.rb +55 -0
  156. data/lib/pdfrb/layout/list_box.rb +87 -0
  157. data/lib/pdfrb/layout/numeric_refinements.rb +43 -0
  158. data/lib/pdfrb/layout/page_style.rb +65 -0
  159. data/lib/pdfrb/layout/style.rb +62 -0
  160. data/lib/pdfrb/layout/table_box.rb +66 -0
  161. data/lib/pdfrb/layout/text_box.rb +38 -0
  162. data/lib/pdfrb/layout/text_fragment.rb +45 -0
  163. data/lib/pdfrb/layout/text_layouter.rb +123 -0
  164. data/lib/pdfrb/layout.rb +28 -0
  165. data/lib/pdfrb/linearization/hint_stream.rb +93 -0
  166. data/lib/pdfrb/linearization/writer.rb +259 -0
  167. data/lib/pdfrb/linearization.rb +21 -0
  168. data/lib/pdfrb/model/cos/dictionary.rb +12 -0
  169. data/lib/pdfrb/model/pdf_array.rb +2 -2
  170. data/lib/pdfrb/model/type/action.rb +42 -0
  171. data/lib/pdfrb/model/type/action_go_to_3d_view.rb +14 -0
  172. data/lib/pdfrb/model/type/action_go_to_dp.rb +16 -0
  173. data/lib/pdfrb/model/type/action_go_to_r.rb +26 -0
  174. data/lib/pdfrb/model/type/action_goto.rb +34 -0
  175. data/lib/pdfrb/model/type/action_hide.rb +26 -0
  176. data/lib/pdfrb/model/type/action_import_data.rb +18 -0
  177. data/lib/pdfrb/model/type/action_java_script.rb +18 -0
  178. data/lib/pdfrb/model/type/action_launch.rb +22 -0
  179. data/lib/pdfrb/model/type/action_movie.rb +22 -0
  180. data/lib/pdfrb/model/type/action_named.rb +23 -0
  181. data/lib/pdfrb/model/type/action_nop.rb +12 -0
  182. data/lib/pdfrb/model/type/action_rendition.rb +28 -0
  183. data/lib/pdfrb/model/type/action_reset_form.rb +22 -0
  184. data/lib/pdfrb/model/type/action_rich_media_execute.rb +17 -0
  185. data/lib/pdfrb/model/type/action_set_ocg_state.rb +32 -0
  186. data/lib/pdfrb/model/type/action_set_state.rb +14 -0
  187. data/lib/pdfrb/model/type/action_sound_action.rb +23 -0
  188. data/lib/pdfrb/model/type/action_submit_form.rb +64 -0
  189. data/lib/pdfrb/model/type/action_thread.rb +23 -0
  190. data/lib/pdfrb/model/type/action_trans.rb +30 -0
  191. data/lib/pdfrb/model/type/action_uri.rb +30 -0
  192. data/lib/pdfrb/model/type/af_embedded_file.rb +11 -0
  193. data/lib/pdfrb/model/type/af_file_specification.rb +34 -0
  194. data/lib/pdfrb/model/type/annotation.rb +49 -10
  195. data/lib/pdfrb/model/type/appearance.rb +41 -0
  196. data/lib/pdfrb/model/type/appearance_characteristics.rb +36 -0
  197. data/lib/pdfrb/model/type/appearance_generator.rb +22 -0
  198. data/lib/pdfrb/model/type/appearance_trap_net.rb +84 -0
  199. data/lib/pdfrb/model/type/border_effect.rb +25 -0
  200. data/lib/pdfrb/model/type/border_styling.rb +38 -0
  201. data/lib/pdfrb/model/type/box_color_info.rb +21 -0
  202. data/lib/pdfrb/model/type/box_style.rb +19 -0
  203. data/lib/pdfrb/model/type/button.rb +17 -0
  204. data/lib/pdfrb/model/type/cal_gray.rb +17 -0
  205. data/lib/pdfrb/model/type/cal_rgb.rb +22 -0
  206. data/lib/pdfrb/model/type/caret_annotation.rb +21 -0
  207. data/lib/pdfrb/model/type/catalog.rb +99 -16
  208. data/lib/pdfrb/model/type/choice.rb +21 -0
  209. data/lib/pdfrb/model/type/cid_font.rb +52 -1
  210. data/lib/pdfrb/model/type/cid_font_descriptor_metrics.rb +28 -0
  211. data/lib/pdfrb/model/type/cid_system_info.rb +28 -0
  212. data/lib/pdfrb/model/type/circle_annotation.rb +20 -0
  213. data/lib/pdfrb/model/type/collection.rb +27 -0
  214. data/lib/pdfrb/model/type/collection_field.rb +24 -0
  215. data/lib/pdfrb/model/type/collection_item.rb +19 -0
  216. data/lib/pdfrb/model/type/collection_schema.rb +25 -0
  217. data/lib/pdfrb/model/type/collection_sort.rb +13 -0
  218. data/lib/pdfrb/model/type/crypt_filter.rb +58 -0
  219. data/lib/pdfrb/model/type/device_n.rb +37 -0
  220. data/lib/pdfrb/model/type/device_n_mixing_hints.rb +17 -0
  221. data/lib/pdfrb/model/type/device_n_process.rb +13 -0
  222. data/lib/pdfrb/model/type/doc_mdp_transform_parameters.rb +21 -0
  223. data/lib/pdfrb/model/type/document_security_store.rb +55 -0
  224. data/lib/pdfrb/model/type/embedded_file.rb +19 -0
  225. data/lib/pdfrb/model/type/embedded_file_parameter.rb +48 -0
  226. data/lib/pdfrb/model/type/encryption_public_key.rb +38 -0
  227. data/lib/pdfrb/model/type/encryption_standard.rb +68 -0
  228. data/lib/pdfrb/model/type/field_mdp_transform_parameters.rb +26 -0
  229. data/lib/pdfrb/model/type/file_attachment_annotation.rb +29 -0
  230. data/lib/pdfrb/model/type/file_spec_ef.rb +22 -0
  231. data/lib/pdfrb/model/type/file_spec_rf.rb +21 -0
  232. data/lib/pdfrb/model/type/file_specification.rb +43 -0
  233. data/lib/pdfrb/model/type/file_trailer.rb +54 -0
  234. data/lib/pdfrb/model/type/font.rb +73 -2
  235. data/lib/pdfrb/model/type/font_cid_type0.rb +17 -0
  236. data/lib/pdfrb/model/type/font_cid_type2.rb +17 -0
  237. data/lib/pdfrb/model/type/font_descriptor.rb +47 -0
  238. data/lib/pdfrb/model/type/font_descriptor_cid_type0.rb +15 -0
  239. data/lib/pdfrb/model/type/font_descriptor_cid_type2.rb +15 -0
  240. data/lib/pdfrb/model/type/font_encoding.rb +47 -0
  241. data/lib/pdfrb/model/type/font_file.rb +28 -0
  242. data/lib/pdfrb/model/type/font_file2.rb +32 -0
  243. data/lib/pdfrb/model/type/font_file3.rb +23 -0
  244. data/lib/pdfrb/model/type/font_multiple_master.rb +60 -0
  245. data/lib/pdfrb/model/type/font_true_type.rb +1 -1
  246. data/lib/pdfrb/model/type/font_type0.rb +1 -1
  247. data/lib/pdfrb/model/type/font_type1.rb +1 -1
  248. data/lib/pdfrb/model/type/font_type3.rb +1 -1
  249. data/lib/pdfrb/model/type/form_field.rb +73 -0
  250. data/lib/pdfrb/model/type/free_text_annotation.rb +37 -0
  251. data/lib/pdfrb/model/type/function.rb +42 -0
  252. data/lib/pdfrb/model/type/function_exponential.rb +31 -0
  253. data/lib/pdfrb/model/type/function_postscript.rb +25 -0
  254. data/lib/pdfrb/model/type/function_sampled.rb +55 -0
  255. data/lib/pdfrb/model/type/function_stitching.rb +33 -0
  256. data/lib/pdfrb/model/type/generic_appearance.rb +40 -0
  257. data/lib/pdfrb/model/type/graphics_state_parameter.rb +69 -0
  258. data/lib/pdfrb/model/type/halftone.rb +21 -0
  259. data/lib/pdfrb/model/type/halftone_type1.rb +17 -0
  260. data/lib/pdfrb/model/type/halftone_type10.rb +16 -0
  261. data/lib/pdfrb/model/type/halftone_type16.rb +11 -0
  262. data/lib/pdfrb/model/type/halftone_type5.rb +24 -0
  263. data/lib/pdfrb/model/type/halftone_type6.rb +16 -0
  264. data/lib/pdfrb/model/type/highlight_annotation.rb +11 -0
  265. data/lib/pdfrb/model/type/icc_based_color_space.rb +24 -0
  266. data/lib/pdfrb/model/type/icon_fit.rb +31 -0
  267. data/lib/pdfrb/model/type/indexed.rb +32 -0
  268. data/lib/pdfrb/model/type/info.rb +44 -0
  269. data/lib/pdfrb/model/type/ink_annotation.rb +29 -0
  270. data/lib/pdfrb/model/type/interactive_form.rb +36 -0
  271. data/lib/pdfrb/model/type/interior_color.rb +12 -0
  272. data/lib/pdfrb/model/type/jbig2_globals.rb +15 -0
  273. data/lib/pdfrb/model/type/lab.rb +27 -0
  274. data/lib/pdfrb/model/type/line_annotation.rb +44 -0
  275. data/lib/pdfrb/model/type/line_ending_styling.rb +39 -0
  276. data/lib/pdfrb/model/type/link_annotation.rb +41 -0
  277. data/lib/pdfrb/model/type/link_appearance.rb +9 -0
  278. data/lib/pdfrb/model/type/mark_information.rb +23 -0
  279. data/lib/pdfrb/model/type/marked_content_reference.rb +24 -0
  280. data/lib/pdfrb/model/type/markup_annotation.rb +36 -0
  281. data/lib/pdfrb/model/type/mdp_dict.rb +28 -0
  282. data/lib/pdfrb/model/type/measure.rb +39 -0
  283. data/lib/pdfrb/model/type/media_clip.rb +28 -0
  284. data/lib/pdfrb/model/type/media_offset.rb +106 -0
  285. data/lib/pdfrb/model/type/metadata.rb +27 -3
  286. data/lib/pdfrb/model/type/misc_helpers.rb +75 -0
  287. data/lib/pdfrb/model/type/movie.rb +28 -0
  288. data/lib/pdfrb/model/type/names.rb +51 -0
  289. data/lib/pdfrb/model/type/namespace.rb +27 -0
  290. data/lib/pdfrb/model/type/object_reference.rb +31 -0
  291. data/lib/pdfrb/model/type/object_stream.rb +38 -0
  292. data/lib/pdfrb/model/type/opt_content_ext.rb +94 -0
  293. data/lib/pdfrb/model/type/opt_content_page_element.rb +18 -0
  294. data/lib/pdfrb/model/type/optional_content_config.rb +56 -0
  295. data/lib/pdfrb/model/type/optional_content_group.rb +35 -10
  296. data/lib/pdfrb/model/type/optional_content_membership.rb +36 -2
  297. data/lib/pdfrb/model/type/optional_content_properties.rb +16 -1
  298. data/lib/pdfrb/model/type/outline.rb +40 -6
  299. data/lib/pdfrb/model/type/outline_item.rb +45 -0
  300. data/lib/pdfrb/model/type/output_intent.rb +30 -0
  301. data/lib/pdfrb/model/type/page.rb +127 -0
  302. data/lib/pdfrb/model/type/page_label.rb +68 -0
  303. data/lib/pdfrb/model/type/page_tree_node.rb +51 -16
  304. data/lib/pdfrb/model/type/page_tree_node_root.rb +15 -0
  305. data/lib/pdfrb/model/type/pattern.rb +16 -0
  306. data/lib/pdfrb/model/type/pattern_shading.rb +25 -0
  307. data/lib/pdfrb/model/type/pattern_tiling.rb +25 -0
  308. data/lib/pdfrb/model/type/polygon_annotation.rb +29 -0
  309. data/lib/pdfrb/model/type/polygon_polyline.rb +14 -0
  310. data/lib/pdfrb/model/type/polyline_annotation.rb +29 -0
  311. data/lib/pdfrb/model/type/popup_annotation.rb +20 -0
  312. data/lib/pdfrb/model/type/printer_mark_annotation.rb +13 -0
  313. data/lib/pdfrb/model/type/redact_annotation.rb +28 -0
  314. data/lib/pdfrb/model/type/rendition.rb +31 -0
  315. data/lib/pdfrb/model/type/resources.rb +59 -14
  316. data/lib/pdfrb/model/type/rich_media_activation.rb +24 -0
  317. data/lib/pdfrb/model/type/rich_media_animation.rb +25 -0
  318. data/lib/pdfrb/model/type/rich_media_annotation.rb +18 -0
  319. data/lib/pdfrb/model/type/rich_media_command.rb +19 -0
  320. data/lib/pdfrb/model/type/rich_media_configuration.rb +32 -0
  321. data/lib/pdfrb/model/type/rich_media_content.rb +28 -0
  322. data/lib/pdfrb/model/type/rich_media_cue_point.rb +18 -0
  323. data/lib/pdfrb/model/type/rich_media_deactivation.rb +17 -0
  324. data/lib/pdfrb/model/type/rich_media_instance.rb +33 -0
  325. data/lib/pdfrb/model/type/rich_media_presentation.rb +29 -0
  326. data/lib/pdfrb/model/type/rich_media_settings.rb +33 -0
  327. data/lib/pdfrb/model/type/rich_media_window.rb +20 -0
  328. data/lib/pdfrb/model/type/screen_annotation.rb +19 -0
  329. data/lib/pdfrb/model/type/separation.rb +25 -0
  330. data/lib/pdfrb/model/type/sig_field_lock.rb +25 -0
  331. data/lib/pdfrb/model/type/sig_field_seed_value.rb +25 -0
  332. data/lib/pdfrb/model/type/signature.rb +65 -0
  333. data/lib/pdfrb/model/type/signature_build.rb +86 -0
  334. data/lib/pdfrb/model/type/signature_field.rb +17 -0
  335. data/lib/pdfrb/model/type/software_identifier.rb +19 -0
  336. data/lib/pdfrb/model/type/sound.rb +38 -0
  337. data/lib/pdfrb/model/type/sound_annotation.rb +21 -0
  338. data/lib/pdfrb/model/type/square_annotation.rb +24 -0
  339. data/lib/pdfrb/model/type/square_circle.rb +13 -0
  340. data/lib/pdfrb/model/type/squiggly_annotation.rb +11 -0
  341. data/lib/pdfrb/model/type/stamp_annotation.rb +19 -0
  342. data/lib/pdfrb/model/type/strikeout_annotation.rb +11 -0
  343. data/lib/pdfrb/model/type/struct_elem.rb +75 -0
  344. data/lib/pdfrb/model/type/struct_tree_root.rb +34 -0
  345. data/lib/pdfrb/model/type/structure_attributes.rb +44 -0
  346. data/lib/pdfrb/model/type/structure_element_kid.rb +33 -0
  347. data/lib/pdfrb/model/type/text_annotation.rb +25 -0
  348. data/lib/pdfrb/model/type/text_appearance.rb +9 -0
  349. data/lib/pdfrb/model/type/text_field.rb +21 -0
  350. data/lib/pdfrb/model/type/text_markup_annotation.rb +30 -0
  351. data/lib/pdfrb/model/type/three_d_activation.rb +32 -0
  352. data/lib/pdfrb/model/type/three_d_animation_style.rb +24 -0
  353. data/lib/pdfrb/model/type/three_d_background.rb +28 -0
  354. data/lib/pdfrb/model/type/three_d_cross_section.rb +25 -0
  355. data/lib/pdfrb/model/type/three_d_lighting_scheme.rb +26 -0
  356. data/lib/pdfrb/model/type/three_d_measure.rb +20 -0
  357. data/lib/pdfrb/model/type/three_d_measure_3dc.rb +23 -0
  358. data/lib/pdfrb/model/type/three_d_measure_ad3.rb +14 -0
  359. data/lib/pdfrb/model/type/three_d_measure_ld3.rb +14 -0
  360. data/lib/pdfrb/model/type/three_d_measure_pd3.rb +20 -0
  361. data/lib/pdfrb/model/type/three_d_measure_rd3.rb +14 -0
  362. data/lib/pdfrb/model/type/three_d_node.rb +37 -0
  363. data/lib/pdfrb/model/type/three_d_reference.rb +21 -0
  364. data/lib/pdfrb/model/type/three_d_render_mode.rb +34 -0
  365. data/lib/pdfrb/model/type/three_d_stream.rb +48 -0
  366. data/lib/pdfrb/model/type/three_d_units.rb +18 -0
  367. data/lib/pdfrb/model/type/three_d_view.rb +40 -0
  368. data/lib/pdfrb/model/type/to_unicode_cmap_stream.rb +23 -0
  369. data/lib/pdfrb/model/type/transition.rb +68 -0
  370. data/lib/pdfrb/model/type/underline_annotation.rb +11 -0
  371. data/lib/pdfrb/model/type/ur_transform_parameters.rb +33 -0
  372. data/lib/pdfrb/model/type/uri_dict.rb +18 -0
  373. data/lib/pdfrb/model/type/url_alias.rb +19 -0
  374. data/lib/pdfrb/model/type/variable_text_field.rb +47 -0
  375. data/lib/pdfrb/model/type/viewer_preferences.rb +42 -0
  376. data/lib/pdfrb/model/type/watermark_annotation.rb +13 -0
  377. data/lib/pdfrb/model/type/widget_annotation.rb +48 -0
  378. data/lib/pdfrb/model/type/widget_appearance.rb +9 -0
  379. data/lib/pdfrb/model/type/xobject_form.rb +41 -0
  380. data/lib/pdfrb/model/type/xobject_image.rb +56 -0
  381. data/lib/pdfrb/model/type/xref_stream.rb +37 -0
  382. data/lib/pdfrb/model/type.rb +286 -6
  383. data/lib/pdfrb/serializer.rb +2 -2
  384. data/lib/pdfrb/source/tokenizer.rb +0 -2
  385. data/lib/pdfrb/task/benchmark.rb +83 -0
  386. data/lib/pdfrb/task/extract_text.rb +1 -1
  387. data/lib/pdfrb/task/generate_corpus.rb +130 -0
  388. data/lib/pdfrb/task/memory_profile.rb +84 -0
  389. data/lib/pdfrb/task/optimize.rb +97 -7
  390. data/lib/pdfrb/task.rb +3 -3
  391. data/lib/pdfrb/test_utils.rb +112 -0
  392. data/lib/pdfrb/validator.rb +82 -0
  393. data/lib/pdfrb/version.rb +1 -1
  394. data/lib/pdfrb/writer.rb +117 -27
  395. data/lib/pdfrb/xmp/packet.rb +122 -0
  396. data/lib/pdfrb/xmp/schemas.rb +96 -0
  397. data/lib/pdfrb/xmp.rb +44 -0
  398. data/lib/pdfrb/xref_section.rb +2 -2
  399. data/lib/pdfrb.rb +24 -54
  400. data/pdfrb.gemspec +45 -0
  401. data/script/apply_fixes.sh +843 -0
  402. data/script/make_jpeg_fixture.rb +53 -0
  403. data/script/make_png_fixture.rb +25 -0
  404. metadata +311 -2
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # 3D Linear Distance measure (LD3, s13.6.4).
7
+ class ThreeDMeasureLD3 < ThreeDMeasure
8
+ def annotation1; self[:A1]; end
9
+ def annotation2; self[:A2]; end
10
+ def distance; self[:D]; end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # 3D Perpendicular Distance measure (PD3, s13.6.4).
7
+ class ThreeDMeasurePD3 < ThreeDMeasure
8
+ def annotation1; self[:A1]; end
9
+ def annotation2; self[:A2]; end
10
+ def distance; self[:D]; end
11
+ def leader_line_extension; self[:LE]; end
12
+ def leader_line_length; self[:LL]; end
13
+
14
+ def has_both_anchors?
15
+ !!annotation1 && !!annotation2
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # 3D Radial Distance measure (RD3, s13.6.4).
7
+ class ThreeDMeasureRD3 < ThreeDMeasure
8
+ def annotation1; self[:A1]; end
9
+ def annotation2; self[:A2]; end
10
+ def distance; self[:D]; end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # 3D Node (s13.6.4). A node in a 3D model's scene graph.
7
+ class ThreeDNode < Pdfrb::Model::Cos::Dictionary
8
+ def type; self[:Type]; end
9
+ def name; self[:N]; end
10
+ def opacity; self[:O]; end
11
+ def visible?; truthy?(self[:V]); end
12
+ def matrix; self[:M]; end
13
+ def instance; self[:Instance]; end
14
+ def data; self[:Data]; end
15
+ def render_mode; self[:RM]; end
16
+
17
+ def has_render_mode?
18
+ !!render_mode
19
+ end
20
+
21
+ def resolved_instance
22
+ ref = instance
23
+ return nil unless ref && document
24
+
25
+ document.object(ref)
26
+ end
27
+
28
+ def resolved_render_mode
29
+ ref = render_mode
30
+ return nil unless ref && document
31
+
32
+ document.object(ref)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # 3D Reference (s13.6.5). Indirect reference to a 3D stream
7
+ # elsewhere in the document.
8
+ class ThreeDReference < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def target_stream; self[:Target]; end
11
+
12
+ def resolved_target
13
+ ref = target_stream
14
+ return nil unless ref && document
15
+
16
+ document.object(ref)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # 3D Render Mode (s13.6.4, Table 318-319). Rendering style for
7
+ # 3D objects (solid, wireframe, transparent, etc.).
8
+ class ThreeDRenderMode < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def subtype; self[:Subtype]&.to_sym; end
11
+ def auxiliary_color; self[:AC]; end
12
+ def face_color; self[:FC]; end
13
+ def opacity; self[:O] || 0.5; end
14
+ def crease_value; self[:CV] || 45; end
15
+
16
+ def solid?; subtype == :Solid; end
17
+ def solid_wireframe?; subtype == :SolidWireframe; end
18
+ def transparent?; subtype == :Transparent; end
19
+ def transparent_wireframe?; subtype == :TransparentWireframe; end
20
+ def bounding_box?; subtype == :BoundingBox; end
21
+ def wireframe?; subtype == :Wireframe; end
22
+ def shaded_wireframe?; subtype == :ShadedWireframe; end
23
+ def hidden_wireframe?; subtype == :HiddenWireframe; end
24
+ def vertices?; subtype == :Vertices; end
25
+ def illustration?; subtype == :Illustration; end
26
+ def solid_outline?; subtype == :SolidOutline; end
27
+
28
+ def has_opacity?
29
+ opacity.between?(0, 1)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # 3D Stream (s13.6.3). Carries a U3D or PRC binary 3D model.
7
+ class ThreeDStream < Pdfrb::Model::Cos::Stream
8
+ def type; self[:Type]; end
9
+ def subtype; self[:Subtype]&.to_sym; end
10
+ def views; self[:VA]; end
11
+ def default_view; self[:DV]; end
12
+ def animation; self[:AN]; end
13
+ def on_instantiate; self[:OnInstantiate]; end
14
+ def color_space; self[:ColorSpace]; end
15
+
16
+ def u3d?
17
+ subtype == :U3D
18
+ end
19
+
20
+ def prc?
21
+ subtype == :PRC
22
+ end
23
+
24
+ def step?
25
+ subtype == :STEP
26
+ end
27
+
28
+ def view_count
29
+ return 0 unless views
30
+
31
+ arr = views.is_a?(Pdfrb::Model::PdfArray) ? views.to_a : views
32
+ arr.is_a?(Array) ? arr.size : 0
33
+ end
34
+
35
+ def each_view
36
+ return enum_for(:each_view) unless block_given?
37
+ return unless views && document
38
+
39
+ arr = views.is_a?(Pdfrb::Model::PdfArray) ? views.to_a : views
40
+ arr.each do |ref|
41
+ obj = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
42
+ yield obj if obj
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # 3D Units (s13.6.4). Scaling factor and unit name for 3D measures.
7
+ class ThreeDUnits < Pdfrb::Model::Cos::Dictionary
8
+ def type; self[:Type]; end
9
+ def unit_name; self[:U]; end
10
+ def scale_factor; self[:SF]; end
11
+
12
+ def has_scale_factor?
13
+ !!scale_factor
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # 3D View (s13.6.4). A single camera/lighting/material configuration
7
+ # for a 3D stream.
8
+ class ThreeDView < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def external_name; self[:XN]; end
11
+ def internal_name; self[:IN]; end
12
+ def measure_space; self[:MS]&.to_sym; end
13
+ def camera_to_world; self[:C2W]; end
14
+ def u3d_path; self[:U3DPath]; end
15
+ def camera_offset; self[:CO]; end
16
+ def projection; self[:P]; end
17
+ def measures; self[:MA]; end
18
+
19
+ def matrix_space?
20
+ measure_space == :M
21
+ end
22
+
23
+ def u3d_space?
24
+ measure_space == :U3D
25
+ end
26
+
27
+ def has_measures?
28
+ !!measures && (!measures.is_a?(Array) || !measures.empty?)
29
+ end
30
+
31
+ def resolved_projection
32
+ ref = projection
33
+ return nil unless ref && document
34
+
35
+ document.object(ref)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # ToUnicode CMap stream (s9.10.3). Maps glyph codes to Unicode
7
+ # strings for text extraction.
8
+ class ToUnicodeCMapStream < Pdfrb::Model::Cos::Stream
9
+ def type; self[:Type]; end
10
+
11
+ def cmap_source
12
+ decoded_stream&.force_encoding(Encoding::BINARY)
13
+ end
14
+
15
+ def has_codespace?
16
+ return false unless cmap_source
17
+
18
+ cmap_source.include?("begincodespacerange")
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Page Transition dict (s12.4.3). Animation for moving between
7
+ # pages in FullScreen mode. Lives on Page /Trans or on an
8
+ # ActionTrans.
9
+ class Transition < Pdfrb::Model::Cos::Dictionary
10
+ def type; self[:Type]; end
11
+ def style; self[:S]&.to_sym; end
12
+ def duration; self[:D]; end
13
+ def dimension; self[:Dm]&.to_sym; end
14
+ def motion_direction; self[:M]&.to_sym; end
15
+ def direction; self[:Di] || 0; end
16
+ def scale; self[:SS] || 1.0; end
17
+ def bidirectional?; truthy?(self[:B]); end
18
+
19
+ def split?; style == :Split; end
20
+ def blinds?; style == :Blinds; end
21
+ def box?; style == :Box; end
22
+ def wipe?; style == :Wipe; end
23
+ def dissolve?; style == :Dissolve; end
24
+ def glitter?; style == :Glitter; end
25
+ def fly?; style == :Fly; end
26
+ def push?; style == :Push; end
27
+ def cover?; style == :Cover; end
28
+ def uncover?; style == :Uncover; end
29
+ def fade?; style == :Fade; end
30
+
31
+ def horizontal?; dimension == :H; end
32
+ def vertical?; dimension == :V; end
33
+
34
+ def inward?; motion_direction == :I; end
35
+ def outward?; motion_direction == :O; end
36
+ end
37
+
38
+ # Printer Mark sub-dictionary (s12.5.6.18). Per-printer-mark
39
+ # sub-parameters.
40
+ class PrinterMarkSubDict < Pdfrb::Model::Cos::Dictionary
41
+ def printer; self[:PRINTER]; end
42
+ def credentials; self[:CREDS]; end
43
+ end
44
+
45
+ # ExData 3D Markup (s13.6.1). 3D scene metadata for Projection
46
+ # annotations / 3D models.
47
+ class ExData3DMarkup < Pdfrb::Model::Cos::Dictionary
48
+ def type; self[:Type]; end
49
+ def v3d; self[:V3D]; end
50
+
51
+ def has_3d?
52
+ !!v3d
53
+ end
54
+ end
55
+
56
+ # ExData Markup Geo (s12.5.6.21). Geo-spatial markup attached to
57
+ # a Projection annotation.
58
+ class ExDataMarkupGeo < Pdfrb::Model::Cos::Dictionary
59
+ def type; self[:Type]; end
60
+ def coordinate_path; self[:CoordinatePath]; end
61
+
62
+ def has_coordinate_path?
63
+ !!coordinate_path
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Underline annotation. /Subtype /Underline.
7
+ class UnderlineAnnotation < TextMarkupAnnotation
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # UR Transform Parameters (s12.8.2.3). Adobe Reader-enabled
7
+ # usage rights — annotations, form fill-in, signatures allowed.
8
+ class URTransformParameters < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def annotations; self[:Annots]; end
11
+ def form; self[:Form]; end
12
+ def signature; self[:Signature]; end
13
+ def ef; self[:EF]; end
14
+
15
+ def has_annotation_rights?
16
+ !!annotations
17
+ end
18
+
19
+ def has_form_rights?
20
+ !!form
21
+ end
22
+
23
+ def has_signature_rights?
24
+ !!signature
25
+ end
26
+
27
+ def has_embedded_file_rights?
28
+ !!ef
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # URI dict (s12.5.6.5). Catalog /URI dict for base URI and
7
+ # retriever map.
8
+ class URIDict < Pdfrb::Model::Cos::Dictionary
9
+ def base; self[:Base]; end
10
+ def retriever_map; self[:Map]; end
11
+
12
+ def has_base?
13
+ !!base
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
+ # URL Alias (s7.9.6). Names dictionary entry mapping friendly
7
+ # URLs to actual URLs for collection sub-items.
8
+ class URLAlias < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def alias_value; self[:U]; end
11
+ def url; self[:URL]; end
12
+
13
+ def has_alias?
14
+ !!alias_value
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Variable Text Field (s12.7.4.3). Base for text fields with
7
+ # dynamic appearance generation. Adds /DA, /Q, /RV.
8
+ class VariableTextField < Field
9
+ def default_appearance; self[:DA]; end
10
+ def da; self[:DA]; end
11
+ def q; self[:Q]; end
12
+ def rv; self[:RV]; end
13
+
14
+ def text_alignment
15
+ case q
16
+ when 1 then :center
17
+ when 2 then :right
18
+ when 3 then :justify
19
+ else :left
20
+ end
21
+ end
22
+
23
+ def has_rich_text?
24
+ !!rv
25
+ end
26
+
27
+ def default_appearance_font
28
+ return nil unless default_appearance
29
+
30
+ match = default_appearance.to_s.match(/\/(\w+)\s+([\d.]+)\s+Tf/)
31
+ return nil unless match
32
+
33
+ [match[1].to_sym, match[2].to_f]
34
+ end
35
+
36
+ def default_appearance_color
37
+ return nil unless default_appearance
38
+
39
+ match = default_appearance.to_s.match(/([\d.]+)\s+([\d.]+)\s+([\d.]+)\s+rg/)
40
+ return nil unless match
41
+
42
+ [match[1].to_f, match[2].to_f, match[3].to_f]
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # ViewerPreferences (s12.2, ISO 32000-2 7.7.2). Catalog /ViewerPreferences.
7
+ class ViewerPreferences < Cos::Dictionary
8
+ register_type :ViewerPreferences
9
+
10
+ def type; self[:Type]; end
11
+ def hide_toolbar?; truthy?(self[:HideToolbar]); end
12
+ def hide_menubar?; truthy?(self[:HideMenubar]); end
13
+ def hide_window_ui?; truthy?(self[:HideWindowUI]); end
14
+ def fit_window?; truthy?(self[:FitWindow]); end
15
+ def center_window?; truthy?(self[:CenterWindow]); end
16
+ def display_doc_title?; truthy?(self[:DisplayDocTitle]); end
17
+ def non_fullscreen_page_mode; self[:NonFullScreenPageMode]; end
18
+ def direction; self[:Direction]; end
19
+ def view_area; self[:ViewArea]; end
20
+ def view_clip; self[:ViewClip]; end
21
+ def print_area; self[:PrintArea]; end
22
+ def print_clip; self[:PrintClip]; end
23
+ def print_scaling; self[:PrintScaling]; end
24
+ def duplex; self[:Duplex]; end
25
+ def pick_tray_by_pdf_size?; truthy?(self[:PickTrayByPDFSize]); end
26
+ def print_pagerange; self[:PrintPageRange]; end
27
+ def num_copies; self[:NumCopies]; end
28
+
29
+ def left_to_right?; direction&.to_sym == :L2R; end
30
+ def right_to_left?; direction&.to_sym == :R2L; end
31
+
32
+ def simplex?; duplex&.to_sym == :Simplex; end
33
+ def duplex_flip_short_edge?; duplex&.to_sym == :DuplexFlipShortEdge; end
34
+ def duplex_flip_long_edge?; duplex&.to_sym == :DuplexFlipLongEdge; end
35
+
36
+ def enforce_print_scaling?
37
+ print_scaling&.to_sym == :AppDefault
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Watermark annotation (s12.5.6.23). PDF 2.0. Non-printing,
7
+ # non-interactive visual watermark behind/over page content.
8
+ class WatermarkAnnotation < Annotation
9
+ def fixed_print?; !!value[:FixedPrint]; end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ class WidgetAnnotation < Annotation
7
+ def field; self[:Parent]; end
8
+ def appearance_stream; self[:AP]; end
9
+ def highlight_mode; self[:H]; end
10
+ def mk; self[:MK]; end
11
+ def action; self[:A]; end
12
+ def additional_actions; self[:AA]; end
13
+
14
+ def resolved_field
15
+ ref = field
16
+ return nil unless ref && document
17
+
18
+ document.object(ref)
19
+ end
20
+
21
+ def button_background_color
22
+ return nil unless mk
23
+
24
+ obj = mk.is_a?(Pdfrb::Model::Reference) && document ? document.object(mk) : mk
25
+ obj && obj[:BG]
26
+ end
27
+
28
+ def button_caption
29
+ return nil unless mk
30
+
31
+ obj = mk.is_a?(Pdfrb::Model::Reference) && document ? document.object(mk) : mk
32
+ obj && obj[:CA]
33
+ end
34
+
35
+ def normal_caption
36
+ return nil unless mk
37
+
38
+ obj = mk.is_a?(Pdfrb::Model::Reference) && document ? document.object(mk) : mk
39
+ obj && obj[:CA]
40
+ end
41
+
42
+ def has_action?
43
+ !!action
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ class WidgetAppearance < GenericAppearance; end
7
+ end
8
+ end
9
+ end
@@ -7,6 +7,47 @@ module Pdfrb
7
7
  # /BBox, /Matrix, /Resources, /Group, /Filter, etc.
8
8
  class XObjectForm < Pdfrb::Model::Cos::Stream
9
9
  arlington_object "XObjectFormType1"
10
+
11
+ def subtype; self[:Subtype]; end
12
+ def bbox; self[:BBox]; end
13
+ def matrix; self[:Matrix]; end
14
+ def resources; self[:Resources]; end
15
+ def group; self[:Group]; end
16
+ def filter; self[:Filter]; end
17
+ def decode_parms; self[:DecodeParms]; end
18
+ def form_type; self[:FormType] || 1; end
19
+ def oc; self[:OC]; end
20
+ def name; self[:Name]; end
21
+ def last_modified; self[:LastModified]; end
22
+ def piece_info; self[:PieceInfo]; end
23
+ def struct_parent; self[:StructParent]; end
24
+ def associated_files; self[:AF]; end
25
+ def mark_stream_data?; truthy?(self[:MS]); end
26
+
27
+ def transparency_group?
28
+ !!group
29
+ end
30
+
31
+ def isolated?
32
+ group && !!group[:I]
33
+ end
34
+
35
+ def knockout?
36
+ group && !!group[:K]
37
+ end
38
+
39
+ def default_color_space
40
+ group && group[:CS]
41
+ end
42
+
43
+ def identity_matrix?
44
+ return true unless matrix
45
+
46
+ arr = matrix.is_a?(Pdfrb::Model::PdfArray) ? matrix.to_a : matrix
47
+ return true unless arr.is_a?(Array) && arr.size == 6
48
+
49
+ arr[0] == 1 && arr[1].zero? && arr[2].zero? && arr[3] == 1 && arr[4].zero? && arr[5].zero?
50
+ end
10
51
  end
11
52
  end
12
53
  end