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,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ class SignatureField < Field
7
+ def value; self[:V]; end
8
+ def lock; self[:Lock]; end
9
+ def seed_value; self[:SV]; end
10
+
11
+ def signed?
12
+ value && value[:Contents]
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Software Identifier (s13.3.5.5). Identifies a player for
7
+ # media rendering.
8
+ class SoftwareIdentifier < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def u; self[:U]; end
11
+ def l; self[:L]; end
12
+
13
+ def has_version?
14
+ !!u && !!l
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Sound stream (s13.3). Sound effect annotation payload.
7
+ # /R = sampling rate, /C = channels, /B = bits/sample, /E =
8
+ # encoding (Raw, Signed, MuLaw, ALaw).
9
+ class Sound < Pdfrb::Model::Cos::Stream
10
+ def type; self[:Type]; end
11
+ def sampling_rate; self[:R]; end
12
+ def channels; self[:C] || 1; end
13
+ def bits_per_sample; self[:B] || 8; end
14
+ def encoding; self[:E]&.to_sym || :Raw; end
15
+
16
+ def raw_encoding?; encoding == :Raw; end
17
+ def signed_encoding?; encoding == :Signed; end
18
+ def mu_law_encoding?; encoding == :MuLaw; end
19
+ def a_law_encoding?; encoding == :ALaw; end
20
+
21
+ def sample_bytes
22
+ (channels * bits_per_sample) / 8.0
23
+ end
24
+
25
+ def duration_seconds
26
+ return nil unless sampling_rate&.positive?
27
+
28
+ bytes = stream ? stream.bytesize : 0
29
+ bytes.to_f / (sample_bytes * sampling_rate)
30
+ end
31
+
32
+ def audio_data
33
+ decoded_stream&.force_encoding(Encoding::BINARY)
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
+ # Sound annotation (s12.5.6.18). Sound clip embedded in the page.
7
+ class SoundAnnotation < MarkupAnnotation
8
+ def sound; self[:Sound]; end
9
+ def name; self[:Name]; end
10
+
11
+ def icon_name
12
+ (name || :Speaker).to_sym
13
+ end
14
+
15
+ def has_sound?
16
+ !!sound
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Square / rectangle annotation (s12.5.6.8).
7
+ class SquareAnnotation < MarkupAnnotation
8
+ def border_effect; self[:BE]; end
9
+ def interior_color; self[:IC]; end
10
+ def border_style; self[:BS]; end
11
+ def border; self[:Border]; end
12
+ def rd; self[:RD]; end
13
+
14
+ def has_border_effect?
15
+ !!border_effect
16
+ end
17
+
18
+ def dashed?
19
+ bs && bs[:D]
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ class SquareCircle < Annotation
7
+ def interior_color; self[:IC]; end
8
+ def border_effect; self[:BE]; end
9
+ def rect_difference; self[:RD]; end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Squiggly annotation. /Subtype /Squiggly.
7
+ class SquigglyAnnotation < TextMarkupAnnotation
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Rubber-stamp annotation (s12.5.6.14).
7
+ class StampAnnotation < MarkupAnnotation
8
+ def name; self[:Name]; end
9
+ def interior_color; self[:IC]; end
10
+ def rotation; self[:Rotate] || 0; end
11
+ def intent; self[:IT]; end
12
+
13
+ def rubber_stamp?
14
+ intent.nil? || intent&.to_sym == :Stamp
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # StrikeOut annotation. /Subtype /StrikeOut.
7
+ class StrikeOutAnnotation < TextMarkupAnnotation
8
+ end
9
+ end
10
+ end
11
+ end
@@ -9,6 +9,81 @@ module Pdfrb
9
9
  # for /Figure elements.
10
10
  class StructElem < Pdfrb::Model::Cos::Dictionary
11
11
  arlington_object "StructElem"
12
+ register_type :StructElem
13
+
14
+ def type; self[:Type]; end
15
+ def structure_type; self[:S]; end
16
+ def parent; self[:P]; end
17
+ def kids; self[:K]; end
18
+ def page; self[:Pg]; end
19
+ def attributes; self[:A]; end
20
+ def classes; self[:C]; end
21
+ def actual_text; self[:ActualText]; end
22
+ def alt_text; self[:Alt]; end
23
+ def title; self[:T]; end
24
+ def lang; self[:Lang]; end
25
+ def expanded_abbreviation; self[:E]; end
26
+
27
+ def block_level?
28
+ %i[Document Part Art Sect Div BlockQuote Caption TOC TOCI
29
+ Index NonStruct H H1 H2 H3 H4 H5 H6 P L LI Lbl LBody
30
+ Table TR TH TD THead TBody TFoot].include?(structure_type&.to_sym)
31
+ end
32
+
33
+ def inline_level?
34
+ %i[Span Quote Note Reference BibEntry Code Figure Formula Form].include?(structure_type&.to_sym)
35
+ end
36
+
37
+ def has_alt_text?
38
+ !!alt_text
39
+ end
40
+
41
+ def has_actual_text?
42
+ !!actual_text
43
+ end
44
+
45
+ def figure?
46
+ structure_type&.to_sym == :Figure
47
+ end
48
+
49
+ def link?
50
+ structure_type&.to_sym == :Link
51
+ end
52
+
53
+ def heading?
54
+ %i[H H1 H2 H3 H4 H5 H6].include?(structure_type&.to_sym)
55
+ end
56
+
57
+ def table?
58
+ structure_type&.to_sym == :Table
59
+ end
60
+
61
+ def resolved_parent
62
+ ref = parent
63
+ return nil unless ref && document
64
+
65
+ document.object(ref)
66
+ end
67
+
68
+ def resolved_page
69
+ ref = page
70
+ return nil unless ref && document
71
+
72
+ document.object(ref)
73
+ end
74
+
75
+ def each_child
76
+ return enum_for(:each_child) unless block_given?
77
+ return unless kids && document
78
+
79
+ arr = kids.is_a?(Pdfrb::Model::Reference) ? document.object(kids) : kids
80
+ return unless arr.is_a?(Array) || arr.is_a?(Pdfrb::Model::PdfArray)
81
+
82
+ arr.each do |kid|
83
+ obj = kid.is_a?(Pdfrb::Model::Reference) ? document.object(kid) : kid
84
+ yield obj if obj
85
+ end
86
+ end
12
87
  end
13
88
  end
14
89
  end
@@ -9,6 +9,40 @@ module Pdfrb
9
9
  class StructTreeRoot < Pdfrb::Model::Cos::Dictionary
10
10
  arlington_object "StructTreeRoot"
11
11
  register_type :StructTreeRoot
12
+
13
+ def type; self[:Type]; end
14
+ def children; self[:K]; end
15
+ def parent_tree; self[:ParentTree]; end
16
+ def parent_tree_next_key; self[:ParentTreeNextKey]; end
17
+ def role_map; self[:RoleMap]; end
18
+ def class_map; self[:ClassMap]; end
19
+
20
+ def each_child
21
+ return enum_for(:each_child) unless block_given?
22
+ return unless children && document
23
+
24
+ arr = children.is_a?(Pdfrb::Model::Reference) ? document.object(children) : children
25
+ return unless arr.is_a?(Array) || arr.is_a?(Pdfrb::Model::PdfArray)
26
+
27
+ arr.each do |kid_ref|
28
+ obj = kid_ref.is_a?(Pdfrb::Model::Reference) ? document.object(kid_ref) : kid_ref
29
+ yield obj if obj
30
+ end
31
+ end
32
+
33
+ def mapped_role(custom_name)
34
+ return nil unless role_map.is_a?(::Hash)
35
+
36
+ role_map[custom_name.to_sym] || role_map[custom_name.to_s]
37
+ end
38
+
39
+ def has_role_map?
40
+ !!role_map
41
+ end
42
+
43
+ def has_class_map?
44
+ !!class_map
45
+ end
12
46
  end
13
47
  end
14
48
  end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Structure Attributes Dictionary (s14.7.5). Per-structure-element
7
+ # attributes — owner + per-owner attribute fields (Layout, Table,
8
+ # List, PrintField, etc.).
9
+ class StructureAttributes < Pdfrb::Model::Cos::Dictionary
10
+ def owner; self[:O]; end
11
+ def namespace; self[:NS]; end
12
+ def placement; self[:Placement]&.to_sym; end
13
+ def writing_mode; (self[:WritingMode] || :LrTb).to_sym; end
14
+ def background_color; self[:BackgroundColor]; end
15
+ def border_color; self[:BorderColor]; end
16
+ def border_style; self[:BorderStyle]; end
17
+ def border_thickness; self[:BorderThickness]; end
18
+ def padding; self[:Padding]; end
19
+ def color; self[:Color]; end
20
+ def text_align; self[:TextAlign]&.to_sym; end
21
+ def width; self[:Width]; end
22
+ def height; self[:Height]; end
23
+ def space_before; self[:SpaceBefore]; end
24
+ def space_after; self[:SpaceAfter]; end
25
+ def start_indent; self[:StartIndent]; end
26
+ def end_indent; self[:EndIndent]; end
27
+ def text_indent; self[:TextIndent]; end
28
+ def line_height; self[:LineHeight]; end
29
+
30
+ def layout_owner?; owner == :Layout; end
31
+ def list_owner?; owner == :List; end
32
+ def table_owner?; owner == :Table; end
33
+ def print_field_owner?; owner == :PrintField; end
34
+ def artifact_owner?; owner == :Artifact; end
35
+ def xml_owner?; owner.to_s.start_with?("XML", "HTML"); end
36
+ def user_properties_owner?; owner == :UserProperties; end
37
+
38
+ def has_namespace?
39
+ !!namespace
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Structure Element Kid Reference. When a struct element's kid
7
+ # is a content-stream marker (MCID), the kid is represented as
8
+ # an integer; when it's a sub-element, it's a dict reference.
9
+ class StructureElementKid < Pdfrb::Model::Cos::Dictionary
10
+ def type; self[:Type]; end
11
+ def page; self[:Pg]; end
12
+ def mcid; self[:MCID]; end
13
+ def object; self[:Obj]; end
14
+ def structure_type; self[:S]; end
15
+
16
+ def content_item?
17
+ !mcid.nil?
18
+ end
19
+
20
+ def object_reference?
21
+ !!object
22
+ end
23
+
24
+ def resolved_page
25
+ ref = page
26
+ return nil unless ref && document
27
+
28
+ document.object(ref)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Sticky note annotation (s12.5.6.10).
7
+ class TextAnnotation < MarkupAnnotation
8
+ def state; self[:State]; end
9
+ def state_model; self[:StateModel]; end
10
+
11
+ def open?
12
+ !!value[:Open]
13
+ end
14
+
15
+ def marked_state?
16
+ state_model&.to_sym == :Marked
17
+ end
18
+
19
+ def review_state?
20
+ state_model&.to_sym == :Review
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ class TextAppearance < GenericAppearance; end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ class TextField < Field
7
+ def max_len; self[:MaxLen]; end
8
+ def value; self[:V]; end
9
+ def rich_text_value; self[:RV]; end
10
+
11
+ def multiline?; flags & 0x1000 != 0; end
12
+ def password?; flags & 0x2000 != 0; end
13
+ def file_select?; flags & 0x100000 != 0; end
14
+ def do_not_spell_check?; flags & 0x400000 != 0; end
15
+ def do_not_scroll?; flags & 0x800000 != 0; end
16
+ def comb?; flags & 0x1000000 != 0; end
17
+ def rich_text?; flags & 0x2000000 != 0; end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Text-markup annotations (s12.5.6.10). Common base for Highlight,
7
+ # Underline, Squiggly, StrikeOut — all share /QuadPoints.
8
+ class TextMarkupAnnotation < MarkupAnnotation
9
+ def quad_points; self[:QuadPoints]; end
10
+
11
+ def quad_point_count
12
+ return 0 unless quad_points
13
+
14
+ arr = quad_points.is_a?(Pdfrb::Model::PdfArray) ? quad_points.to_a : quad_points
15
+ arr.is_a?(Array) ? arr.size / 8 : 0
16
+ end
17
+
18
+ def each_quad(&block)
19
+ return enum_for(:each_quad) unless block
20
+ return unless quad_points
21
+
22
+ arr = quad_points.is_a?(Pdfrb::Model::PdfArray) ? quad_points.to_a : quad_points
23
+ return unless arr.is_a?(Array)
24
+
25
+ arr.each_slice(8, &block)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # 3D Activation (s13.6.2). Controls when a 3D stream becomes
7
+ # active and how it's deactivated.
8
+ class ThreeDActivation < Pdfrb::Model::Cos::Dictionary
9
+ def activation_mode; self[:A]&.to_sym; end
10
+ def activation_instance; self[:AIS]&.to_sym; end
11
+ def deactivation_mode; self[:D]&.to_sym; end
12
+ def deactivation_instance; self[:DIS]&.to_sym; end
13
+ def toolbar?; truthy?(self[:TB]); end
14
+ def new_page?; truthy?(self[:NP]); end
15
+ def style; self[:Style]&.to_sym; end
16
+ def transparent?; truthy?(self[:Transparent]); end
17
+ def window; self[:Window]; end
18
+
19
+ def activation_on_click?; activation_mode == :PO; end
20
+ def activation_on_page_open?; activation_mode == :PV; end
21
+ def activation_on_page_visible?; activation_mode == :XA; end
22
+
23
+ def deactivation_on_page_close?; deactivation_mode == :PC; end
24
+ def deactivation_on_page_hidden?; deactivation_mode == :PI; end
25
+ def deactivation_on_external_deactivation?; deactivation_mode == :XD; end
26
+
27
+ def embedded_style?; style == :Embedded; end
28
+ def windowed_style?; style == :Windowed; end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # 3D Animation Style (s13.6.3, Table 312-313). Animation control
7
+ # for a 3D stream.
8
+ class ThreeDAnimationStyle < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def subtype; self[:Subtype]&.to_sym; end
11
+ def play_count; self[:PC] || 0; end
12
+ def time_multiplier; self[:TM] || 1; end
13
+
14
+ def no_animation?; subtype == :None; end
15
+ def linear?; subtype == :Linear; end
16
+ def oscillating?; subtype == :Oscillating; end
17
+
18
+ def loop_forever?
19
+ play_count.zero?
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # 3D Background (s13.6.4). Background fill for a 3D view.
7
+ class ThreeDBackground < Pdfrb::Model::Cos::Dictionary
8
+ def type; self[:Type]; end
9
+ def subtype; self[:Subtype]&.to_sym; end
10
+ def color_space; self[:CS]; end
11
+ def color; self[:C]; end
12
+ def enable_alpha?; truthy?(self[:EA]); end
13
+
14
+ def solid_color?
15
+ subtype == :SC
16
+ end
17
+
18
+ def image_background?
19
+ subtype == :I
20
+ end
21
+
22
+ def default_white?
23
+ color == [1, 1, 1]
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # 3D Cross Section (s13.6.4). Plane cutaway view of a 3D model.
7
+ class ThreeDCrossSection < Pdfrb::Model::Cos::Dictionary
8
+ def type; self[:Type]; end
9
+ def center; self[:C]; end
10
+ def orientation; self[:O]; end
11
+ def plane_opacity; self[:PO] || 0.5; end
12
+ def plane_color; self[:PC]; end
13
+ def intersection_visible?; truthy?(self[:IV]); end
14
+ def plane_visible?; truthy?(self[:PV]); end
15
+ def show_transparent?; truthy?(self[:ST]); end
16
+ def show_cut?; truthy?(self[:SC]); end
17
+ def intersection_color; self[:IC]; end
18
+
19
+ def has_plane_color?
20
+ !!plane_color
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # 3D Lighting Scheme (s13.6.4, Table 320-321). Lighting preset.
7
+ class ThreeDLightingScheme < Pdfrb::Model::Cos::Dictionary
8
+ def type; self[:Type]; end
9
+ def subtype; self[:Subtype]&.to_sym; end
10
+
11
+ def artwork?; subtype == :Artwork; end
12
+ def none?; subtype == :None; end
13
+ def white?; subtype == :White; end
14
+ def day?; subtype == :Day; end
15
+ def night?; subtype == :Night; end
16
+ def hard?; subtype == :Hard; end
17
+ def primary?; subtype == :Primary; end
18
+ def blue?; subtype == :Blue; end
19
+ def red?; subtype == :Red; end
20
+ def cube?; subtype == :Cube; end
21
+ def cad?; subtype == :CAD; end
22
+ def headlamp?; subtype == :Headlamp; end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # 3D Measure base (s13.6.4). Common base for the 3D measure
7
+ # subtypes: 3DC, AD3, LD3, PD3, RD3.
8
+ class ThreeDMeasure < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def subtype; self[:Subtype]&.to_sym; end
11
+
12
+ def perpendicular_distance?; subtype == :PD3; end
13
+ def linear_distance?; subtype == :LD3; end
14
+ def radial_distance?; subtype == :RD3; end
15
+ def angle?; subtype == :AD3; end
16
+ def comment?; subtype == :"3DC"; end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # 3D Comment (3DC) measure (s13.6.4). A 3D measurement note.
7
+ class ThreeDMeasure3DC < ThreeDMeasure
8
+ def text; self[:TRL]; end
9
+ def anchor; self[:A1]; end
10
+ def name; self[:N1]; end
11
+ def text_position; self[:TP]; end
12
+ def text_box; self[:TB]; end
13
+ def text_size; self[:TS] || 12; end
14
+ def color; self[:C]; end
15
+ def unit_text; self[:UT]; end
16
+
17
+ def default_color?
18
+ color == [1, 1, 1]
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # 3D Angle Distance measure (AD3, s13.6.4).
7
+ class ThreeDMeasureAD3 < ThreeDMeasure
8
+ def annotation1; self[:A1]; end
9
+ def annotation2; self[:A2]; end
10
+ def angle; self[:A]; end
11
+ end
12
+ end
13
+ end
14
+ end