pdfrb 0.3.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/CHANGELOG.md +51 -0
  4. data/Gemfile +1 -0
  5. data/PROPOSAL.canvas-clip.md +92 -0
  6. data/PROPOSAL.canvas-draw-image-matrix.md +87 -0
  7. data/PROPOSAL.canvas-rich-text.md +103 -0
  8. data/PROPOSAL.canvas-text-lines.md +77 -0
  9. data/PROPOSAL.canvas-transparency.md +106 -0
  10. data/PROPOSAL.external-font-metrics.md +129 -0
  11. data/PROPOSAL.font-embedding-fontfile2.md +88 -0
  12. data/PROPOSAL.font-resolver-ttc.md +105 -0
  13. data/PROPOSAL.font-resolver.md +96 -0
  14. data/PROPOSAL.font-subsetting.md +98 -0
  15. data/PROPOSAL.gradient-shadings.md +110 -0
  16. data/PROPOSAL.page-mediabox-setter.md +66 -0
  17. data/PROPOSAL.per-glyph-width.md +91 -0
  18. data/PROPOSAL.stringio-require.md +53 -0
  19. data/PROPOSAL.struct-tree-root.md +102 -0
  20. data/PROPOSAL.text-measurement.md +93 -0
  21. data/PROPOSAL.ttf-table-parsing-fix.md +112 -0
  22. data/RELEASE.md +61 -0
  23. data/data/pdfrb/afm/Courier-Bold.afm +342 -342
  24. data/data/pdfrb/afm/Courier-BoldOblique.afm +342 -342
  25. data/data/pdfrb/afm/Courier-Oblique.afm +342 -342
  26. data/data/pdfrb/afm/Courier.afm +342 -342
  27. data/data/pdfrb/afm/Helvetica-Bold.afm +2827 -2827
  28. data/data/pdfrb/afm/Helvetica-BoldOblique.afm +2827 -2827
  29. data/data/pdfrb/afm/Helvetica-Oblique.afm +3051 -3051
  30. data/data/pdfrb/afm/Helvetica.afm +3051 -3051
  31. data/data/pdfrb/afm/Symbol.afm +213 -213
  32. data/data/pdfrb/afm/Times-Bold.afm +2588 -2588
  33. data/data/pdfrb/afm/Times-BoldItalic.afm +2384 -2384
  34. data/data/pdfrb/afm/Times-Italic.afm +2667 -2667
  35. data/data/pdfrb/afm/Times-Roman.afm +2419 -2419
  36. data/data/pdfrb/afm/ZapfDingbats.afm +225 -225
  37. data/lib/pdfrb/action/base.rb +21 -0
  38. data/lib/pdfrb/action/types.rb +178 -0
  39. data/lib/pdfrb/action.rb +55 -0
  40. data/lib/pdfrb/annotation/base.rb +79 -0
  41. data/lib/pdfrb/annotation/types.rb +222 -0
  42. data/lib/pdfrb/annotation.rb +78 -0
  43. data/lib/pdfrb/appearance/generator.rb +216 -0
  44. data/lib/pdfrb/appearance.rb +11 -0
  45. data/lib/pdfrb/arlington/object_definition.rb +2 -2
  46. data/lib/pdfrb/arlington/predicate/evaluator.rb +1 -1
  47. data/lib/pdfrb/arlington/predicate/functions.rb +25 -9
  48. data/lib/pdfrb/arlington/predicate.rb +1 -5
  49. data/lib/pdfrb/cli/batch.rb +18 -0
  50. data/lib/pdfrb/cli/debug_info.rb +18 -0
  51. data/lib/pdfrb/cli/files.rb +16 -0
  52. data/lib/pdfrb/cli/fonts.rb +16 -0
  53. data/lib/pdfrb/cli/form.rb +18 -0
  54. data/lib/pdfrb/cli/image2pdf.rb +18 -0
  55. data/lib/pdfrb/cli/images.rb +34 -0
  56. data/lib/pdfrb/cli/info.rb +20 -0
  57. data/lib/pdfrb/cli/inspect.rb +18 -0
  58. data/lib/pdfrb/cli/merge.rb +18 -0
  59. data/lib/pdfrb/cli/modify.rb +18 -0
  60. data/lib/pdfrb/cli/optimize.rb +18 -0
  61. data/lib/pdfrb/cli/split.rb +21 -0
  62. data/lib/pdfrb/cli/watermark.rb +18 -0
  63. data/lib/pdfrb/cli.rb +291 -7
  64. data/lib/pdfrb/color/color_space.rb +259 -0
  65. data/lib/pdfrb/color/icc_profile.rb +90 -0
  66. data/lib/pdfrb/color.rb +12 -0
  67. data/lib/pdfrb/compare/comparator.rb +244 -0
  68. data/lib/pdfrb/compare/report.rb +78 -0
  69. data/lib/pdfrb/compare.rb +42 -0
  70. data/lib/pdfrb/composer.rb +161 -0
  71. data/lib/pdfrb/conformance/pdf_a.rb +317 -56
  72. data/lib/pdfrb/conformance/pdf_ua.rb +186 -29
  73. data/lib/pdfrb/conformance/pdf_x.rb +247 -0
  74. data/lib/pdfrb/conformance/rule.rb +78 -0
  75. data/lib/pdfrb/conformance/structure_elements.rb +174 -0
  76. data/lib/pdfrb/conformance/verapdf_bridge.rb +92 -0
  77. data/lib/pdfrb/conformance.rb +7 -3
  78. data/lib/pdfrb/content/canvas.rb +354 -72
  79. data/lib/pdfrb/content/color_space.rb +157 -0
  80. data/lib/pdfrb/content/hidden_text_detector.rb +167 -0
  81. data/lib/pdfrb/content/operator.rb +21 -1
  82. data/lib/pdfrb/content/operators/clipping.rb +36 -0
  83. data/lib/pdfrb/content/operators/graphics_state_params.rb +15 -0
  84. data/lib/pdfrb/content/operators/inline_image.rb +53 -0
  85. data/lib/pdfrb/content/operators.rb +22 -0
  86. data/lib/pdfrb/content/shading/base.rb +139 -0
  87. data/lib/pdfrb/content/shading.rb +17 -0
  88. data/lib/pdfrb/content/smart_text_extractor.rb +85 -0
  89. data/lib/pdfrb/content/tiling_pattern.rb +78 -0
  90. data/lib/pdfrb/content/transformation_matrix.rb +61 -0
  91. data/lib/pdfrb/content.rb +7 -26
  92. data/lib/pdfrb/destination/fit.rb +185 -0
  93. data/lib/pdfrb/destination.rb +13 -0
  94. data/lib/pdfrb/digital_signature/cms_handler.rb +22 -0
  95. data/lib/pdfrb/digital_signature/signing.rb +107 -11
  96. data/lib/pdfrb/digital_signature/timestamp_handler.rb +45 -0
  97. data/lib/pdfrb/digital_signature/verification.rb +88 -9
  98. data/lib/pdfrb/digital_signature/verification_result.rb +14 -0
  99. data/lib/pdfrb/digital_signature.rb +26 -2
  100. data/lib/pdfrb/document/annotations.rb +120 -3
  101. data/lib/pdfrb/document/associated_files.rb +104 -0
  102. data/lib/pdfrb/document/colors.rb +95 -0
  103. data/lib/pdfrb/document/destinations.rb +127 -5
  104. data/lib/pdfrb/document/display.rb +84 -0
  105. data/lib/pdfrb/document/fonts.rb +417 -45
  106. data/lib/pdfrb/document/form.rb +338 -0
  107. data/lib/pdfrb/document/graphics_state.rb +91 -0
  108. data/lib/pdfrb/document/images.rb +4 -4
  109. data/lib/pdfrb/document/info.rb +102 -0
  110. data/lib/pdfrb/document/layers.rb +62 -0
  111. data/lib/pdfrb/document/metadata.rb +12 -5
  112. data/lib/pdfrb/document/output_intents.rb +91 -0
  113. data/lib/pdfrb/document/page_labels.rb +80 -0
  114. data/lib/pdfrb/document/pages.rb +68 -19
  115. data/lib/pdfrb/document/portfolio.rb +119 -0
  116. data/lib/pdfrb/document/shadings.rb +159 -0
  117. data/lib/pdfrb/document/stamps.rb +68 -0
  118. data/lib/pdfrb/document/structure.rb +242 -0
  119. data/lib/pdfrb/document.rb +73 -4
  120. data/lib/pdfrb/encryption/identity.rb +13 -0
  121. data/lib/pdfrb/encryption/password_verification.rb +53 -8
  122. data/lib/pdfrb/encryption/security_handler.rb +8 -5
  123. data/lib/pdfrb/encryption/standard_security_handler.rb +154 -81
  124. data/lib/pdfrb/encryption.rb +17 -0
  125. data/lib/pdfrb/error.rb +2 -2
  126. data/lib/pdfrb/filter/brotli_decode.rb +32 -0
  127. data/lib/pdfrb/filter/ccitt_fax_decode.rb +12 -0
  128. data/lib/pdfrb/filter/crypt.rb +2 -2
  129. data/lib/pdfrb/filter/dct_decode.rb +18 -0
  130. data/lib/pdfrb/filter/flate_decode.rb +4 -18
  131. data/lib/pdfrb/filter/jbig2_decode.rb +12 -0
  132. data/lib/pdfrb/filter/jpx_decode.rb +18 -0
  133. data/lib/pdfrb/filter/lzw_decode.rb +3 -2
  134. data/lib/pdfrb/filter/png_predictor.rb +94 -0
  135. data/lib/pdfrb/filter.rb +26 -13
  136. data/lib/pdfrb/font/afm_parser.rb +50 -26
  137. data/lib/pdfrb/font/cmap/writer.rb +9 -0
  138. data/lib/pdfrb/font/encoding/win_ansi_encoding.rb +17 -0
  139. data/lib/pdfrb/font/encoding.rb +32 -3
  140. data/lib/pdfrb/font/metrics_helper.rb +121 -0
  141. data/lib/pdfrb/font/true_type/file.rb +10 -1
  142. data/lib/pdfrb/font/true_type/glyf.rb +82 -0
  143. data/lib/pdfrb/font/true_type/kern.rb +58 -0
  144. data/lib/pdfrb/font/true_type/loca.rb +42 -0
  145. data/lib/pdfrb/font/true_type/maxp.rb +44 -0
  146. data/lib/pdfrb/font/true_type/name.rb +53 -0
  147. data/lib/pdfrb/font/true_type/post.rb +93 -0
  148. data/lib/pdfrb/font/true_type/subsetter.rb +3 -5
  149. data/lib/pdfrb/font/true_type/wrapper.rb +102 -0
  150. data/lib/pdfrb/font/true_type.rb +7 -0
  151. data/lib/pdfrb/font.rb +2 -0
  152. data/lib/pdfrb/font_loader/from_configuration.rb +19 -0
  153. data/lib/pdfrb/font_loader/from_file.rb +20 -0
  154. data/lib/pdfrb/font_loader/standard14.rb +20 -0
  155. data/lib/pdfrb/font_loader/variant_from_name.rb +36 -0
  156. data/lib/pdfrb/font_loader.rb +4 -0
  157. data/lib/pdfrb/font_resolver.rb +138 -0
  158. data/lib/pdfrb/image/audit.rb +94 -0
  159. data/lib/pdfrb/image/downsampler.rb +124 -0
  160. data/lib/pdfrb/image.rb +13 -0
  161. data/lib/pdfrb/image_loader/jpeg.rb +39 -58
  162. data/lib/pdfrb/image_loader/png.rb +82 -251
  163. data/lib/pdfrb/layout/bidi.rb +198 -0
  164. data/lib/pdfrb/layout/box.rb +49 -0
  165. data/lib/pdfrb/layout/box_fitter.rb +54 -0
  166. data/lib/pdfrb/layout/column_box.rb +71 -0
  167. data/lib/pdfrb/layout/container_box.rb +45 -0
  168. data/lib/pdfrb/layout/frame.rb +67 -0
  169. data/lib/pdfrb/layout/image_box.rb +44 -0
  170. data/lib/pdfrb/layout/inline_box.rb +25 -0
  171. data/lib/pdfrb/layout/line.rb +55 -0
  172. data/lib/pdfrb/layout/list_box.rb +87 -0
  173. data/lib/pdfrb/layout/numeric_refinements.rb +43 -0
  174. data/lib/pdfrb/layout/page_style.rb +65 -0
  175. data/lib/pdfrb/layout/style.rb +62 -0
  176. data/lib/pdfrb/layout/table_box.rb +66 -0
  177. data/lib/pdfrb/layout/text_box.rb +38 -0
  178. data/lib/pdfrb/layout/text_fragment.rb +45 -0
  179. data/lib/pdfrb/layout/text_layouter.rb +123 -0
  180. data/lib/pdfrb/layout.rb +28 -0
  181. data/lib/pdfrb/linearization/hint_stream.rb +93 -0
  182. data/lib/pdfrb/linearization/writer.rb +259 -0
  183. data/lib/pdfrb/linearization.rb +21 -0
  184. data/lib/pdfrb/model/cos/dictionary.rb +12 -0
  185. data/lib/pdfrb/model/pdf_array.rb +2 -2
  186. data/lib/pdfrb/model/type/action.rb +42 -0
  187. data/lib/pdfrb/model/type/action_go_to_3d_view.rb +14 -0
  188. data/lib/pdfrb/model/type/action_go_to_dp.rb +16 -0
  189. data/lib/pdfrb/model/type/action_go_to_r.rb +26 -0
  190. data/lib/pdfrb/model/type/action_goto.rb +34 -0
  191. data/lib/pdfrb/model/type/action_hide.rb +26 -0
  192. data/lib/pdfrb/model/type/action_import_data.rb +18 -0
  193. data/lib/pdfrb/model/type/action_java_script.rb +18 -0
  194. data/lib/pdfrb/model/type/action_launch.rb +22 -0
  195. data/lib/pdfrb/model/type/action_movie.rb +22 -0
  196. data/lib/pdfrb/model/type/action_named.rb +23 -0
  197. data/lib/pdfrb/model/type/action_nop.rb +12 -0
  198. data/lib/pdfrb/model/type/action_rendition.rb +28 -0
  199. data/lib/pdfrb/model/type/action_reset_form.rb +22 -0
  200. data/lib/pdfrb/model/type/action_rich_media_execute.rb +17 -0
  201. data/lib/pdfrb/model/type/action_set_ocg_state.rb +32 -0
  202. data/lib/pdfrb/model/type/action_set_state.rb +14 -0
  203. data/lib/pdfrb/model/type/action_sound_action.rb +23 -0
  204. data/lib/pdfrb/model/type/action_submit_form.rb +64 -0
  205. data/lib/pdfrb/model/type/action_thread.rb +23 -0
  206. data/lib/pdfrb/model/type/action_trans.rb +30 -0
  207. data/lib/pdfrb/model/type/action_uri.rb +30 -0
  208. data/lib/pdfrb/model/type/af_embedded_file.rb +11 -0
  209. data/lib/pdfrb/model/type/af_file_specification.rb +34 -0
  210. data/lib/pdfrb/model/type/annotation.rb +49 -10
  211. data/lib/pdfrb/model/type/appearance.rb +41 -0
  212. data/lib/pdfrb/model/type/appearance_characteristics.rb +36 -0
  213. data/lib/pdfrb/model/type/appearance_generator.rb +22 -0
  214. data/lib/pdfrb/model/type/appearance_trap_net.rb +84 -0
  215. data/lib/pdfrb/model/type/border_effect.rb +25 -0
  216. data/lib/pdfrb/model/type/border_styling.rb +38 -0
  217. data/lib/pdfrb/model/type/box_color_info.rb +21 -0
  218. data/lib/pdfrb/model/type/box_style.rb +19 -0
  219. data/lib/pdfrb/model/type/button.rb +17 -0
  220. data/lib/pdfrb/model/type/cal_gray.rb +17 -0
  221. data/lib/pdfrb/model/type/cal_rgb.rb +22 -0
  222. data/lib/pdfrb/model/type/caret_annotation.rb +21 -0
  223. data/lib/pdfrb/model/type/catalog.rb +99 -16
  224. data/lib/pdfrb/model/type/choice.rb +21 -0
  225. data/lib/pdfrb/model/type/cid_font.rb +52 -1
  226. data/lib/pdfrb/model/type/cid_font_descriptor_metrics.rb +28 -0
  227. data/lib/pdfrb/model/type/cid_system_info.rb +28 -0
  228. data/lib/pdfrb/model/type/circle_annotation.rb +20 -0
  229. data/lib/pdfrb/model/type/collection.rb +27 -0
  230. data/lib/pdfrb/model/type/collection_field.rb +24 -0
  231. data/lib/pdfrb/model/type/collection_item.rb +19 -0
  232. data/lib/pdfrb/model/type/collection_schema.rb +25 -0
  233. data/lib/pdfrb/model/type/collection_sort.rb +13 -0
  234. data/lib/pdfrb/model/type/crypt_filter.rb +58 -0
  235. data/lib/pdfrb/model/type/device_n.rb +37 -0
  236. data/lib/pdfrb/model/type/device_n_mixing_hints.rb +17 -0
  237. data/lib/pdfrb/model/type/device_n_process.rb +13 -0
  238. data/lib/pdfrb/model/type/doc_mdp_transform_parameters.rb +21 -0
  239. data/lib/pdfrb/model/type/document_security_store.rb +55 -0
  240. data/lib/pdfrb/model/type/embedded_file.rb +19 -0
  241. data/lib/pdfrb/model/type/embedded_file_parameter.rb +48 -0
  242. data/lib/pdfrb/model/type/encryption_public_key.rb +38 -0
  243. data/lib/pdfrb/model/type/encryption_standard.rb +68 -0
  244. data/lib/pdfrb/model/type/field_mdp_transform_parameters.rb +26 -0
  245. data/lib/pdfrb/model/type/file_attachment_annotation.rb +29 -0
  246. data/lib/pdfrb/model/type/file_spec_ef.rb +22 -0
  247. data/lib/pdfrb/model/type/file_spec_rf.rb +21 -0
  248. data/lib/pdfrb/model/type/file_specification.rb +43 -0
  249. data/lib/pdfrb/model/type/file_trailer.rb +54 -0
  250. data/lib/pdfrb/model/type/font.rb +73 -2
  251. data/lib/pdfrb/model/type/font_cid_type0.rb +17 -0
  252. data/lib/pdfrb/model/type/font_cid_type2.rb +17 -0
  253. data/lib/pdfrb/model/type/font_descriptor.rb +47 -0
  254. data/lib/pdfrb/model/type/font_descriptor_cid_type0.rb +15 -0
  255. data/lib/pdfrb/model/type/font_descriptor_cid_type2.rb +15 -0
  256. data/lib/pdfrb/model/type/font_encoding.rb +47 -0
  257. data/lib/pdfrb/model/type/font_file.rb +28 -0
  258. data/lib/pdfrb/model/type/font_file2.rb +32 -0
  259. data/lib/pdfrb/model/type/font_file3.rb +23 -0
  260. data/lib/pdfrb/model/type/font_multiple_master.rb +60 -0
  261. data/lib/pdfrb/model/type/font_true_type.rb +1 -1
  262. data/lib/pdfrb/model/type/font_type0.rb +1 -1
  263. data/lib/pdfrb/model/type/font_type1.rb +1 -1
  264. data/lib/pdfrb/model/type/font_type3.rb +1 -1
  265. data/lib/pdfrb/model/type/form_field.rb +73 -0
  266. data/lib/pdfrb/model/type/free_text_annotation.rb +37 -0
  267. data/lib/pdfrb/model/type/function.rb +42 -0
  268. data/lib/pdfrb/model/type/function_exponential.rb +31 -0
  269. data/lib/pdfrb/model/type/function_postscript.rb +25 -0
  270. data/lib/pdfrb/model/type/function_sampled.rb +55 -0
  271. data/lib/pdfrb/model/type/function_stitching.rb +33 -0
  272. data/lib/pdfrb/model/type/generic_appearance.rb +40 -0
  273. data/lib/pdfrb/model/type/graphics_state_parameter.rb +69 -0
  274. data/lib/pdfrb/model/type/halftone.rb +21 -0
  275. data/lib/pdfrb/model/type/halftone_type1.rb +17 -0
  276. data/lib/pdfrb/model/type/halftone_type10.rb +16 -0
  277. data/lib/pdfrb/model/type/halftone_type16.rb +11 -0
  278. data/lib/pdfrb/model/type/halftone_type5.rb +24 -0
  279. data/lib/pdfrb/model/type/halftone_type6.rb +16 -0
  280. data/lib/pdfrb/model/type/highlight_annotation.rb +11 -0
  281. data/lib/pdfrb/model/type/icc_based_color_space.rb +24 -0
  282. data/lib/pdfrb/model/type/icon_fit.rb +31 -0
  283. data/lib/pdfrb/model/type/indexed.rb +32 -0
  284. data/lib/pdfrb/model/type/info.rb +44 -0
  285. data/lib/pdfrb/model/type/ink_annotation.rb +29 -0
  286. data/lib/pdfrb/model/type/interactive_form.rb +36 -0
  287. data/lib/pdfrb/model/type/interior_color.rb +12 -0
  288. data/lib/pdfrb/model/type/jbig2_globals.rb +15 -0
  289. data/lib/pdfrb/model/type/lab.rb +27 -0
  290. data/lib/pdfrb/model/type/line_annotation.rb +44 -0
  291. data/lib/pdfrb/model/type/line_ending_styling.rb +39 -0
  292. data/lib/pdfrb/model/type/link_annotation.rb +41 -0
  293. data/lib/pdfrb/model/type/link_appearance.rb +9 -0
  294. data/lib/pdfrb/model/type/mark_information.rb +23 -0
  295. data/lib/pdfrb/model/type/marked_content_reference.rb +24 -0
  296. data/lib/pdfrb/model/type/markup_annotation.rb +36 -0
  297. data/lib/pdfrb/model/type/mdp_dict.rb +28 -0
  298. data/lib/pdfrb/model/type/measure.rb +39 -0
  299. data/lib/pdfrb/model/type/media_clip.rb +28 -0
  300. data/lib/pdfrb/model/type/media_offset.rb +106 -0
  301. data/lib/pdfrb/model/type/metadata.rb +27 -3
  302. data/lib/pdfrb/model/type/misc_helpers.rb +75 -0
  303. data/lib/pdfrb/model/type/movie.rb +28 -0
  304. data/lib/pdfrb/model/type/names.rb +51 -0
  305. data/lib/pdfrb/model/type/namespace.rb +27 -0
  306. data/lib/pdfrb/model/type/object_reference.rb +31 -0
  307. data/lib/pdfrb/model/type/object_stream.rb +38 -0
  308. data/lib/pdfrb/model/type/opt_content_ext.rb +94 -0
  309. data/lib/pdfrb/model/type/opt_content_page_element.rb +18 -0
  310. data/lib/pdfrb/model/type/optional_content_config.rb +56 -0
  311. data/lib/pdfrb/model/type/optional_content_group.rb +35 -10
  312. data/lib/pdfrb/model/type/optional_content_membership.rb +36 -2
  313. data/lib/pdfrb/model/type/optional_content_properties.rb +16 -1
  314. data/lib/pdfrb/model/type/outline.rb +40 -6
  315. data/lib/pdfrb/model/type/outline_item.rb +45 -0
  316. data/lib/pdfrb/model/type/output_intent.rb +30 -0
  317. data/lib/pdfrb/model/type/page.rb +127 -0
  318. data/lib/pdfrb/model/type/page_label.rb +68 -0
  319. data/lib/pdfrb/model/type/page_piece_info.rb +58 -0
  320. data/lib/pdfrb/model/type/page_tree_node.rb +51 -16
  321. data/lib/pdfrb/model/type/page_tree_node_root.rb +15 -0
  322. data/lib/pdfrb/model/type/pattern.rb +16 -0
  323. data/lib/pdfrb/model/type/pattern_shading.rb +25 -0
  324. data/lib/pdfrb/model/type/pattern_tiling.rb +25 -0
  325. data/lib/pdfrb/model/type/polygon_annotation.rb +29 -0
  326. data/lib/pdfrb/model/type/polygon_polyline.rb +14 -0
  327. data/lib/pdfrb/model/type/polyline_annotation.rb +29 -0
  328. data/lib/pdfrb/model/type/popup_annotation.rb +20 -0
  329. data/lib/pdfrb/model/type/printer_mark_annotation.rb +13 -0
  330. data/lib/pdfrb/model/type/redact_annotation.rb +28 -0
  331. data/lib/pdfrb/model/type/rendition.rb +31 -0
  332. data/lib/pdfrb/model/type/resources.rb +59 -14
  333. data/lib/pdfrb/model/type/rich_media_activation.rb +24 -0
  334. data/lib/pdfrb/model/type/rich_media_animation.rb +25 -0
  335. data/lib/pdfrb/model/type/rich_media_annotation.rb +18 -0
  336. data/lib/pdfrb/model/type/rich_media_command.rb +19 -0
  337. data/lib/pdfrb/model/type/rich_media_configuration.rb +32 -0
  338. data/lib/pdfrb/model/type/rich_media_content.rb +28 -0
  339. data/lib/pdfrb/model/type/rich_media_cue_point.rb +18 -0
  340. data/lib/pdfrb/model/type/rich_media_deactivation.rb +17 -0
  341. data/lib/pdfrb/model/type/rich_media_instance.rb +33 -0
  342. data/lib/pdfrb/model/type/rich_media_presentation.rb +29 -0
  343. data/lib/pdfrb/model/type/rich_media_settings.rb +33 -0
  344. data/lib/pdfrb/model/type/rich_media_window.rb +20 -0
  345. data/lib/pdfrb/model/type/screen_annotation.rb +19 -0
  346. data/lib/pdfrb/model/type/separation.rb +25 -0
  347. data/lib/pdfrb/model/type/sig_field_lock.rb +25 -0
  348. data/lib/pdfrb/model/type/sig_field_seed_value.rb +25 -0
  349. data/lib/pdfrb/model/type/signature.rb +65 -0
  350. data/lib/pdfrb/model/type/signature_build.rb +86 -0
  351. data/lib/pdfrb/model/type/signature_field.rb +17 -0
  352. data/lib/pdfrb/model/type/software_identifier.rb +19 -0
  353. data/lib/pdfrb/model/type/sound.rb +38 -0
  354. data/lib/pdfrb/model/type/sound_annotation.rb +21 -0
  355. data/lib/pdfrb/model/type/square_annotation.rb +24 -0
  356. data/lib/pdfrb/model/type/square_circle.rb +13 -0
  357. data/lib/pdfrb/model/type/squiggly_annotation.rb +11 -0
  358. data/lib/pdfrb/model/type/stamp_annotation.rb +19 -0
  359. data/lib/pdfrb/model/type/strikeout_annotation.rb +11 -0
  360. data/lib/pdfrb/model/type/struct_elem.rb +75 -0
  361. data/lib/pdfrb/model/type/struct_tree_root.rb +34 -0
  362. data/lib/pdfrb/model/type/structure_attributes.rb +44 -0
  363. data/lib/pdfrb/model/type/structure_element_kid.rb +33 -0
  364. data/lib/pdfrb/model/type/text_annotation.rb +25 -0
  365. data/lib/pdfrb/model/type/text_appearance.rb +9 -0
  366. data/lib/pdfrb/model/type/text_field.rb +21 -0
  367. data/lib/pdfrb/model/type/text_markup_annotation.rb +30 -0
  368. data/lib/pdfrb/model/type/three_d_activation.rb +32 -0
  369. data/lib/pdfrb/model/type/three_d_animation_style.rb +24 -0
  370. data/lib/pdfrb/model/type/three_d_background.rb +28 -0
  371. data/lib/pdfrb/model/type/three_d_cross_section.rb +25 -0
  372. data/lib/pdfrb/model/type/three_d_lighting_scheme.rb +26 -0
  373. data/lib/pdfrb/model/type/three_d_measure.rb +20 -0
  374. data/lib/pdfrb/model/type/three_d_measure_3dc.rb +23 -0
  375. data/lib/pdfrb/model/type/three_d_measure_ad3.rb +14 -0
  376. data/lib/pdfrb/model/type/three_d_measure_ld3.rb +14 -0
  377. data/lib/pdfrb/model/type/three_d_measure_pd3.rb +20 -0
  378. data/lib/pdfrb/model/type/three_d_measure_rd3.rb +14 -0
  379. data/lib/pdfrb/model/type/three_d_node.rb +37 -0
  380. data/lib/pdfrb/model/type/three_d_reference.rb +21 -0
  381. data/lib/pdfrb/model/type/three_d_render_mode.rb +34 -0
  382. data/lib/pdfrb/model/type/three_d_stream.rb +48 -0
  383. data/lib/pdfrb/model/type/three_d_units.rb +18 -0
  384. data/lib/pdfrb/model/type/three_d_view.rb +40 -0
  385. data/lib/pdfrb/model/type/to_unicode_cmap_stream.rb +23 -0
  386. data/lib/pdfrb/model/type/transition.rb +68 -0
  387. data/lib/pdfrb/model/type/underline_annotation.rb +11 -0
  388. data/lib/pdfrb/model/type/ur_transform_parameters.rb +33 -0
  389. data/lib/pdfrb/model/type/uri_dict.rb +18 -0
  390. data/lib/pdfrb/model/type/url_alias.rb +19 -0
  391. data/lib/pdfrb/model/type/variable_text_field.rb +47 -0
  392. data/lib/pdfrb/model/type/viewer_preferences.rb +42 -0
  393. data/lib/pdfrb/model/type/watermark_annotation.rb +13 -0
  394. data/lib/pdfrb/model/type/widget_annotation.rb +48 -0
  395. data/lib/pdfrb/model/type/widget_appearance.rb +9 -0
  396. data/lib/pdfrb/model/type/xobject_form.rb +41 -0
  397. data/lib/pdfrb/model/type/xobject_image.rb +56 -0
  398. data/lib/pdfrb/model/type/xref_stream.rb +37 -0
  399. data/lib/pdfrb/model/type.rb +289 -6
  400. data/lib/pdfrb/serializer.rb +2 -2
  401. data/lib/pdfrb/source/tokenizer.rb +0 -2
  402. data/lib/pdfrb/task/benchmark.rb +83 -0
  403. data/lib/pdfrb/task/extract_text.rb +1 -1
  404. data/lib/pdfrb/task/generate_corpus.rb +130 -0
  405. data/lib/pdfrb/task/memory_profile.rb +84 -0
  406. data/lib/pdfrb/task/optimize.rb +97 -7
  407. data/lib/pdfrb/task/regenerate_appearances.rb +98 -0
  408. data/lib/pdfrb/task.rb +4 -3
  409. data/lib/pdfrb/test_utils.rb +112 -0
  410. data/lib/pdfrb/validator.rb +82 -0
  411. data/lib/pdfrb/version.rb +1 -1
  412. data/lib/pdfrb/writer.rb +117 -27
  413. data/lib/pdfrb/xmp/packet.rb +122 -0
  414. data/lib/pdfrb/xmp/schemas.rb +96 -0
  415. data/lib/pdfrb/xmp.rb +44 -0
  416. data/lib/pdfrb/xref_section.rb +2 -2
  417. data/lib/pdfrb.rb +24 -54
  418. data/pdfrb.gemspec +45 -0
  419. data/script/apply_fixes.sh +843 -0
  420. data/script/make_jpeg_fixture.rb +53 -0
  421. data/script/make_png_fixture.rb +25 -0
  422. metadata +319 -4
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Set OCG State action (s12.6.4.13). Toggle visibility of
7
+ # optional-content groups.
8
+ class ActionSetOCGState < Action
9
+ register_subtype :SetOCGState
10
+
11
+ def state; self[:State]; end
12
+ def preserve_rb?; self[:PreserveRB] == true; end
13
+
14
+ def each_state_transition
15
+ return enum_for(:each_state_transition) unless block_given?
16
+ return unless state
17
+
18
+ arr = state.is_a?(Pdfrb::Model::PdfArray) ? state.to_a : state
19
+ return unless arr.is_a?(Array)
20
+
21
+ current_op = :ON
22
+ arr.each do |entry|
23
+ case entry
24
+ when :ON, :OFF, :Toggle then current_op = entry
25
+ else yield current_op, entry
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Set-state action (deprecated in PDF 1.2, replaced by SetOCGState).
7
+ class ActionSetState < Action
8
+ register_subtype :SetState
9
+
10
+ def state; self[:State]; end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Sound action (s12.6.4.6). Plays a Sound stream.
7
+ class ActionSoundAction < Action
8
+ register_subtype :Sound
9
+
10
+ def sound; self[:Sound]; end
11
+ def volume; self[:Volume]; end
12
+ def mix?; truthy?(self[:Mix]); end
13
+
14
+ def resolved_sound
15
+ ref = sound
16
+ return nil unless ref && document
17
+
18
+ document.object(ref)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Submit-form action (s12.7.6.2). Submits form values to a URL.
7
+ class ActionSubmitForm < Action
8
+ register_subtype :SubmitForm
9
+
10
+ def url; self[:F]; end
11
+ def fields; self[:Fields]; end
12
+ def flags; self[:Flags] || 0; end
13
+
14
+ def include_exclude?
15
+ flags & 1 != 0
16
+ end
17
+
18
+ def include_no_value_fields?
19
+ flags & 2 != 0
20
+ end
21
+
22
+ def export_format?
23
+ flags & 4 != 0
24
+ end
25
+
26
+ def get_method?
27
+ flags & 8 != 0
28
+ end
29
+
30
+ def submit_coordinates?
31
+ flags & 16 != 0
32
+ end
33
+
34
+ def submit_as_xfdf?
35
+ flags & 32 != 0
36
+ end
37
+
38
+ def submit_as_append?
39
+ flags & 64 != 0
40
+ end
41
+
42
+ def submit_as_pdf?
43
+ flags & 256 != 0
44
+ end
45
+
46
+ def canonical_date_format?
47
+ flags & 512 != 0
48
+ end
49
+
50
+ def submit_as_xfdf_with_annotations?
51
+ flags & 1024 != 0
52
+ end
53
+
54
+ def submit_as_xdp?
55
+ flags & 2048 != 0
56
+ end
57
+
58
+ def submit_as_xfdf_charset?
59
+ flags & 4096 != 0
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Thread action (s12.6.4.6). Navigate within an article thread.
7
+ class ActionThread < Action
8
+ register_subtype :Thread
9
+
10
+ def thread; self[:F]; end
11
+ def destination_bead; self[:D]; end
12
+
13
+ def first_bead?
14
+ destination_bead.zero? || destination_bead.nil?
15
+ end
16
+
17
+ def last_bead?
18
+ destination_bead == -1
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Transition action (s12.4.3). Specifies page transition for slide-show.
7
+ class ActionTrans < Action
8
+ register_subtype :Trans
9
+
10
+ def transition; self[:Trans]; end
11
+
12
+ def has_transition?
13
+ !!transition
14
+ end
15
+
16
+ def transition_style
17
+ return nil unless transition
18
+
19
+ transition[:S]&.to_sym
20
+ end
21
+
22
+ def duration
23
+ return nil unless transition
24
+
25
+ transition[:D]
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # URI action (s12.6.4.7). Opens a URL in the browser.
7
+ class ActionURI < Action
8
+ register_subtype :URI
9
+
10
+ def uri; self[:URI]; end
11
+ def track_mouse?; self[:IsMap] == true; end
12
+
13
+ def scheme
14
+ return nil unless uri
15
+
16
+ match = uri.to_s.match(%r{^([a-zA-Z][a-zA-Z0-9+.-]*):})
17
+ match && match[1].downcase
18
+ end
19
+
20
+ def http?
21
+ ["http", "https"].include?(scheme)
22
+ end
23
+
24
+ def mailto?
25
+ scheme == "mailto"
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -6,6 +6,17 @@ module Pdfrb
6
6
  # PDF 2.0 Associated-File embedded stream (App Note 002).
7
7
  class AFEmbeddedFile < EmbeddedFile
8
8
  arlington_object "AFEmbeddedFileStream"
9
+
10
+ def af_relationship
11
+ return nil unless params
12
+
13
+ obj = params.is_a?(Pdfrb::Model::Reference) && document ? document.object(params) : params
14
+ obj && obj[:AFRelationship]
15
+ end
16
+
17
+ def associated_file_relationship?
18
+ !!af_relationship
19
+ end
9
20
  end
10
21
  end
11
22
  end
@@ -7,6 +7,40 @@ module Pdfrb
7
7
  # /AFRelationship to the base FileSpec.
8
8
  class AFFileSpecification < FileSpecification
9
9
  arlington_object "AFFileSpecification"
10
+
11
+ def af_relationship; self[:AFRelationship]; end
12
+
13
+ def source?
14
+ af_relationship&.to_sym == :Source
15
+ end
16
+
17
+ def data?
18
+ af_relationship&.to_sym == :Data
19
+ end
20
+
21
+ def alternative?
22
+ af_relationship&.to_sym == :Alternative
23
+ end
24
+
25
+ def supplement?
26
+ af_relationship&.to_sym == :Supplement
27
+ end
28
+
29
+ def encrypted?
30
+ af_relationship&.to_sym == :EncryptedPayload
31
+ end
32
+
33
+ def form_fillin?
34
+ af_relationship&.to_sym == :FormData
35
+ end
36
+
37
+ def schema?
38
+ af_relationship&.to_sym == :Schema
39
+ end
40
+
41
+ def unspecified?
42
+ af_relationship.nil? || af_relationship&.to_sym == :Unspecified
43
+ end
10
44
  end
11
45
  end
12
46
  end
@@ -3,14 +3,7 @@
3
3
  module Pdfrb
4
4
  module Model
5
5
  module Type
6
- # Annotation base class (s12.5). The base dict shape is encoded
7
- # across the per-subtype TSVs (AnnotLink, AnnotText, ...), not
8
- # a single Annot.tsv — so the base class registers in the
9
- # type_map and dispatches to a specific subtype class via
10
- # /Subtype lookup.
11
6
  class Annotation < Pdfrb::Model::Cos::Dictionary
12
- # Common annotation fields per s12.5.2 (hand-coded; base dict
13
- # is shared across all subtypes before subtype-specific keys).
14
7
  define_field :Type, type: Symbol, default: :Annot
15
8
  define_field :Subtype, type: Symbol, required: true
16
9
  define_field :Rect, type: Pdfrb::Model::Rectangle
@@ -25,12 +18,59 @@ module Pdfrb
25
18
  define_field :C, type: Pdfrb::Model::PdfArray
26
19
  define_field :A, type: Pdfrb::Model::Cos::Dictionary
27
20
  define_field :AA, type: Pdfrb::Model::Cos::Dictionary
21
+ define_field :StructParent, type: Integer
22
+ define_field :OC, type: Pdfrb::Model::Cos::Dictionary
28
23
 
29
24
  register_type :Annot
30
25
 
26
+ # ---- Accessors ----
27
+ def subtype; self[:Subtype]; end
28
+ def rect; self[:Rect]; end
29
+ def contents; self[:Contents]; end
30
+ def name; self[:NM]; end
31
+ def modified_date; self[:M]; end
32
+ def flags; self[:F] || 0; end
33
+ def color; self[:C]; end
34
+ def border; self[:Border]; end
35
+ def appearance; self[:AP]; end
36
+ def appearance_state; self[:AS]; end
37
+ def action; self[:A]; end
38
+ def additional_actions; self[:AA]; end
39
+
40
+ # ---- Page reference ----
41
+ def page
42
+ ref = self[:P]
43
+ return nil unless ref && document
44
+
45
+ document.object(ref)
46
+ end
47
+
48
+ # ---- Flag predicates ----
49
+ def hidden?; flags & 1 != 0; end
50
+ def print?; flags & 2 != 0; end
51
+ def no_zoom?; flags & 4 != 0; end
52
+ def no_rotate?; flags & 8 != 0; end
53
+ def no_view?; flags & 16 != 0; end
54
+ def read_only?; flags & 32 != 0; end
55
+ def locked?; flags & 128 != 0; end
56
+ def toggle_no_view?; flags & 256 != 0; end
57
+ def locked_contents?; flags & 512 != 0; end
58
+
59
+ # ---- Appearance management ----
60
+ def normal_appearance
61
+ ap = appearance
62
+ return nil unless ap
63
+
64
+ ap = document.object(ap) if ap.is_a?(Pdfrb::Model::Reference) && document
65
+ ap && ap[:N]
66
+ end
67
+
68
+ def create_appearance_stream
69
+ AppearanceGenerator.for(self, document: document)&.create_appearance
70
+ end
71
+
72
+ # ---- Subtype dispatch ----
31
73
  class << self
32
- # Dispatch by /Subtype. Subclasses register via
33
- # `register_subtype :Link`.
34
74
  def subtype_map
35
75
  @subtype_map ||= {}
36
76
  end
@@ -47,4 +87,3 @@ module Pdfrb
47
87
  end
48
88
  end
49
89
  end
50
-
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Appearance stream dictionary (s12.5.5). The /AP dict on an
7
+ # annotation holds three sub-dicts: /N (normal), /R (rollover),
8
+ # /D (down).
9
+ class Appearance < Pdfrb::Model::Cos::Dictionary
10
+ def normal; self[:N]; end
11
+ def rollover; self[:R]; end
12
+ def down; self[:D]; end
13
+
14
+ def has_normal?
15
+ !!normal
16
+ end
17
+
18
+ def has_rollover?
19
+ !!rollover
20
+ end
21
+
22
+ def has_down?
23
+ !!down
24
+ end
25
+
26
+ def normal_for_state(state_name)
27
+ return nil unless normal
28
+
29
+ n = if normal.is_a?(Pdfrb::Model::Reference) && document
30
+ document.object(normal)
31
+ else
32
+ normal
33
+ end
34
+ return nil unless n.is_a?(Hash)
35
+
36
+ n[state_name]
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Appearance Characteristics dictionary (s12.5.5). Defines the
7
+ # visual characteristics of a widget annotation: background/caption
8
+ # colors, normal/rollover/down captions, etc. Often stored under
9
+ # the widget's /MK key.
10
+ class AppearanceCharacteristics < Pdfrb::Model::Cos::Dictionary
11
+ def background_color; self[:BG]; end
12
+ def caption; self[:CA]; end
13
+ def rollover_caption; self[:RC]; end
14
+ def down_caption; self[:AC]; end
15
+ def rotation; self[:R] || 0; end
16
+ def border_color; self[:BC]; end
17
+ def normal_icon; self[:IF]; end
18
+ def alternate_icon; self[:IX]; end
19
+ def icon_fit; self[:IF]; end
20
+ def tp; self[:TP]; end
21
+
22
+ def text_position
23
+ tp || 0
24
+ end
25
+
26
+ def has_background?
27
+ !!background_color
28
+ end
29
+
30
+ def has_caption?
31
+ !!caption
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ class AppearanceGenerator
7
+ def self.for(annotation, document:)
8
+ case annotation[:Subtype]
9
+ when :Widget
10
+ WidgetAppearance.new(annotation, document)
11
+ when :Text
12
+ TextAppearance.new(annotation, document)
13
+ when :Link
14
+ LinkAppearance.new(annotation, document)
15
+ else
16
+ GenericAppearance.new(annotation, document)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # AppearanceTrapNet sub-dictionary (s7.7.3.3, Table 327). Per-
7
+ # appearance-stream trap-net (ink-flattening) parameters.
8
+ class AppearanceTrapNetSubDict < Pdfrb::Model::Cos::Dictionary
9
+ def pos_h; self[:PosH]; end
10
+ def pos_l; self[:PosL]; end
11
+ def span_h_min; self[:SpanH]; end
12
+ def span_l_min; self[:SpanL]; end
13
+ def font_info; self[:FontInfo]; end
14
+
15
+ def has_darkness_corrected?
16
+ !!font_info
17
+ end
18
+ end
19
+
20
+ # AppearanceTrapNet (s7.7.3.3). The trap-net dictionary that wraps
21
+ # appearance sub-dicts.
22
+ class AppearanceTrapNet < Pdfrb::Model::Cos::Dictionary
23
+ def type; self[:Type]; end
24
+ def version; self[:Version]; end
25
+ def font_state_appearance; self[:FontStateAppearance]; end
26
+ def gray_min; self[:GrayMin]; end
27
+ def gray_max; self[:GrayMax]; end
28
+ def monochrome_min; self[:MonoMin]; end
29
+ def monochrome_max; self[:MonoMax]; end
30
+ def colorant_min; self[:ColorantMin]; end
31
+ def colorant_max; self[:ColorantMax]; end
32
+ def step_function; self[:StepFunction]; end
33
+ def trap_net_app_form_name; self[:AppForm]; end
34
+
35
+ def has_step_function?
36
+ !!step_function
37
+ end
38
+ end
39
+
40
+ # AppearanceSubDict (s12.5.4). Sub-dictionary inside Appearance
41
+ # entries /N, /R, /D that maps each appearance state to a stream.
42
+ class AppearanceSubDict < Pdfrb::Model::Cos::Dictionary
43
+ def each_state(&block)
44
+ return enum_for(:each_state) unless block
45
+
46
+ value.each(&block)
47
+ end
48
+
49
+ def state_count
50
+ value.size
51
+ end
52
+
53
+ def states
54
+ value.keys
55
+ end
56
+ end
57
+
58
+ # Signature Build Data Dict (s12.8.4). PPKLite build data.
59
+ class SignatureBuildPropDict < Pdfrb::Model::Cos::Dictionary
60
+ def app_build; self[:App]; end
61
+
62
+ def has_app_build?
63
+ !!app_build
64
+ end
65
+ end
66
+
67
+ # Annotation Projection dict (s12.5.6.21). Projection annotation
68
+ # for spatial content.
69
+ class AnnotationProjectionDict < Pdfrb::Model::Cos::Dictionary
70
+ def ex_data; self[:ExData]; end
71
+ end
72
+
73
+ # ExData Projection dict (s12.5.6.21, Table 198). Holds the
74
+ # geospatial projection details used by Projection annotations.
75
+ class ExDataProjection < Pdfrb::Model::Cos::Dictionary
76
+ def type; self[:Type]; end
77
+
78
+ def project?
79
+ type == :ProjectedPDL
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # BorderEffect (s12.5.4.2). Cloudy / inset border effects for
7
+ # annotations.
8
+ class BorderEffect < Cos::Dictionary
9
+ register_type :BorderEffect
10
+
11
+ def type; self[:Type]; end
12
+ def style; self[:S]&.to_sym; end
13
+ def intensity; self[:I] || 0; end
14
+
15
+ def cloudy?
16
+ style == :C
17
+ end
18
+
19
+ def inset?
20
+ style == :I
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # BorderStyling (s12.5.4.1, PDF 2.0). Replaces the deprecated
7
+ # /Border array on annotations. Specifies width, dash, style.
8
+ class BorderStyling < Cos::Dictionary
9
+ register_type :BorderStyling
10
+
11
+ def type; self[:Type]; end
12
+ def style; self[:S]&.to_sym; end
13
+ def width; self[:W] || 1.0; end
14
+ def dash; self[:D]; end
15
+
16
+ def solid?; style.nil? || style == :S; end
17
+ def dashed?; style == :D; end
18
+ def beveled?; style == :B; end
19
+ def inset?; style == :I; end
20
+ def underline?; style == :U; end
21
+
22
+ def dash_array
23
+ return nil unless dash
24
+
25
+ arr = dash.is_a?(Pdfrb::Model::PdfArray) ? dash.to_a : dash
26
+ arr.is_a?(Array) && arr.size >= 1 ? arr[0] : nil
27
+ end
28
+
29
+ def dash_phase
30
+ return nil unless dash
31
+
32
+ arr = dash.is_a?(Pdfrb::Model::PdfArray) ? dash.to_a : dash
33
+ arr.is_a?(Array) && arr.size >= 2 ? arr[1] : 0
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Box Color Info dictionary (s7.7.3.3, Table 30). Defines the
7
+ # visual guide lines for page boxes (crop, bleed, trim, art) in
8
+ # the viewer. Lives on Page /BoxColorInfo.
9
+ class BoxColorInfo < Pdfrb::Model::Cos::Dictionary
10
+ def crop_box_style; self[:CropBox]; end
11
+ def bleed_box_style; self[:BleedBox]; end
12
+ def trim_box_style; self[:TrimBox]; end
13
+ def art_box_style; self[:ArtBox]; end
14
+
15
+ def empty?
16
+ !crop_box_style && !bleed_box_style && !trim_box_style && !art_box_style
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Box Style dictionary (s7.7.3.3, Table 396). Describes one box
7
+ # guide: color, dash pattern, visibility.
8
+ class BoxStyle < Pdfrb::Model::Cos::Dictionary
9
+ def color; self[:C]; end
10
+ def dash_pattern; self[:W]; end
11
+ def dash_style; self[:S]&.to_sym; end
12
+ def dash_count; self[:D]; end
13
+
14
+ def solid?; dash_style.nil? || dash_style == :S; end
15
+ def dashed?; dash_style == :D; end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ class Button < Field
7
+ def value; self[:V]; end
8
+ def opt; self[:Opt]; end
9
+
10
+ def push_button?; flags & 0x10000 != 0; end
11
+ def radio?; flags & 0x8000 != 0; end
12
+ def no_toggle_to_off?; flags & 0x4000 != 0; end
13
+ def radios_in_unison?; flags & 0x2000000 != 0; end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # CalGray color space dictionary (s8.6.3.2). Single-component
7
+ # calibrated grayscale: [/CalGray <dict>].
8
+ class CalGray < Pdfrb::Model::Cos::Dictionary
9
+ def white_point; self[:WhitePoint]; end
10
+ def black_point; self[:BlackPoint]; end
11
+ def gamma; self[:Gamma] || 1.0; end
12
+
13
+ def components; 1; end
14
+ end
15
+ end
16
+ end
17
+ end