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
@@ -3,9 +3,24 @@
3
3
  module Pdfrb
4
4
  module Model
5
5
  module Type
6
- # Alias for OptionalContentProperties autoload path.
6
+ # Optional Content Properties (s8.11.1). Catalog /OCProperties.
7
7
  class OptionalContentProperties < Pdfrb::Model::Cos::Dictionary
8
8
  arlington_object "OptContentProperties"
9
+
10
+ def ocgs; self[:OCGs]; end
11
+ def default_config; self[:D]; end
12
+ def configs; self[:Configs]; end
13
+ def list_mode; self[:ListMode]; end
14
+
15
+ def has_configs?
16
+ !!configs
17
+ end
18
+
19
+ def base_state
20
+ return :ON_UNLESS_OFF unless default_config
21
+
22
+ default_config[:BaseState]&.to_sym || :ON_UNLESS_OFF
23
+ end
9
24
  end
10
25
  end
11
26
  end
@@ -7,13 +7,47 @@ module Pdfrb
7
7
  class Outline < Pdfrb::Model::Cos::Dictionary
8
8
  arlington_object "Outline"
9
9
  register_type :Outlines
10
- end
11
10
 
12
- # One bookmark entry (s12.3.3). Forms a doubly-linked list with
13
- # /Next, /Prev, /First, /Last, /Parent; carries /Title, /A or
14
- # /Dest for the navigation target.
15
- class OutlineItem < Pdfrb::Model::Cos::Dictionary
16
- arlington_object "OutlineItem"
11
+ def type; self[:Type]; end
12
+ def first; self[:First]; end
13
+ def last; self[:Last]; end
14
+ def count; self[:Count]; end
15
+
16
+ def empty?
17
+ !first
18
+ end
19
+
20
+ def has_items?
21
+ !!first
22
+ end
23
+
24
+ def resolved_first
25
+ ref = first
26
+ return nil unless ref && document
27
+
28
+ document.object(ref)
29
+ end
30
+
31
+ def resolved_last
32
+ ref = last
33
+ return nil unless ref && document
34
+
35
+ document.object(ref)
36
+ end
37
+
38
+ def each_item(&block)
39
+ return enum_for(:each_item) unless block
40
+ return unless first && document
41
+
42
+ cur_ref = first
43
+ while cur_ref
44
+ item = document.object(cur_ref)
45
+ break unless item
46
+
47
+ yield item
48
+ cur_ref = item[:Next]
49
+ end
50
+ end
17
51
  end
18
52
  end
19
53
  end
@@ -7,6 +7,51 @@ module Pdfrb
7
7
  # path matches the TSV-derived class name.
8
8
  class OutlineItem < Pdfrb::Model::Cos::Dictionary
9
9
  arlington_object "OutlineItem"
10
+
11
+ def title; self[:Title]; end
12
+ def parent; self[:Parent]; end
13
+ def prev; self[:Prev]; end
14
+ def next; self[:Next]; end
15
+ def first; self[:First]; end
16
+ def last; self[:Last]; end
17
+ def count; self[:Count]; end
18
+ def dest; self[:Dest]; end
19
+ def action; self[:A]; end
20
+ def se; self[:SE]; end
21
+ def c; self[:C]; end
22
+ def f; self[:F]; end
23
+
24
+ def color
25
+ c if c && (!c.is_a?(Array) || !c.empty?)
26
+ end
27
+
28
+ def bold?
29
+ f&.anybits?(1)
30
+ end
31
+
32
+ def italic?
33
+ f&.anybits?(2)
34
+ end
35
+
36
+ def has_children?
37
+ !!(count && count.nonzero?)
38
+ end
39
+
40
+ def open?
41
+ return true unless count
42
+
43
+ count.positive?
44
+ end
45
+
46
+ def child_count
47
+ return 0 unless count
48
+
49
+ count.abs
50
+ end
51
+
52
+ def destination
53
+ dest || (action && action[:D])
54
+ end
10
55
  end
11
56
  end
12
57
  end
@@ -4,8 +4,38 @@ module Pdfrb
4
4
  module Model
5
5
  module Type
6
6
  # Output intent (s14.11.5) — ICC profile + condition metadata.
7
+ # Required for PDF/X and PDF/A conformance.
7
8
  class OutputIntent < Pdfrb::Model::Cos::Dictionary
8
9
  arlington_object "OutputIntents"
10
+ register_type :OutputIntent
11
+
12
+ def type; self[:Type]; end
13
+ def output_intent_type; self[:S]; end
14
+ def output_condition; self[:OutputCondition]; end
15
+ def output_condition_identifier; self[:OutputConditionIdentifier]; end
16
+ def registry_name; self[:RegistryName]; end
17
+ def info; self[:Info]; end
18
+ def dest_output_profile; self[:DestOutputProfile]; end
19
+ def dest_output_profile_ref; self[:DestOutputProfileRef]; end
20
+
21
+ def pdfx?
22
+ output_intent_type&.to_sym == :GTS_PDFX
23
+ end
24
+
25
+ def pdfa?
26
+ [:GTS_PDFA1, :GTS_PDFA2, :GTS_PDFA3].include?(output_intent_type&.to_sym)
27
+ end
28
+
29
+ def has_embedded_profile?
30
+ !!dest_output_profile
31
+ end
32
+
33
+ def resolved_profile
34
+ ref = dest_output_profile
35
+ return nil unless ref && document
36
+
37
+ document.object(ref)
38
+ end
9
39
  end
10
40
  end
11
41
  end
@@ -61,10 +61,137 @@ module Pdfrb
61
61
  inheritable(:Resources)
62
62
  end
63
63
 
64
+ def media_box=(box)
65
+ value[:MediaBox] = box
66
+ end
67
+
68
+ def bleed_box=(box)
69
+ value[:BleedBox] = box
70
+ end
71
+
72
+ def trim_box=(box)
73
+ value[:TrimBox] = box
74
+ end
75
+
76
+ def art_box=(box)
77
+ value[:ArtBox] = box
78
+ end
79
+
80
+ def crop_box=(box)
81
+ value[:CropBox] = box
82
+ end
83
+
84
+ def bleed_box
85
+ value[:BleedBox]
86
+ end
87
+
88
+ def trim_box
89
+ value[:TrimBox]
90
+ end
91
+
92
+ def art_box
93
+ value[:ArtBox]
94
+ end
95
+
64
96
  def rotate
65
97
  inheritable(:Rotate) || 0
66
98
  end
67
99
 
100
+ def parent
101
+ ref = value[:Parent]
102
+ return nil unless ref && document
103
+
104
+ document.object(ref)
105
+ end
106
+
107
+ def annotations
108
+ self[:Annots]
109
+ end
110
+
111
+ def has_annotations?
112
+ !!annotations
113
+ end
114
+
115
+ def user_unit
116
+ self[:UserUnit] || 1.0
117
+ end
118
+
119
+ def duration
120
+ self[:Dur]
121
+ end
122
+
123
+ def transition
124
+ self[:Trans]
125
+ end
126
+
127
+ def thumbnail
128
+ self[:Thumb]
129
+ end
130
+
131
+ def tab_order
132
+ self[:Tabs]&.to_sym
133
+ end
134
+
135
+ def structural_parent
136
+ self[:StructParents]
137
+ end
138
+
139
+ def metadata
140
+ self[:Metadata]
141
+ end
142
+
143
+ def associated_files
144
+ self[:AF]
145
+ end
146
+
147
+ def output_intents
148
+ self[:OutputIntents]
149
+ end
150
+
151
+ def group
152
+ self[:Group]
153
+ end
154
+
155
+ def has_group?
156
+ !!group
157
+ end
158
+
159
+ def rotated?
160
+ rotate != 0
161
+ end
162
+
163
+ def landscape?
164
+ mb = media_box
165
+ return false unless mb.is_a?(Array) && mb.size >= 4
166
+
167
+ width = mb[2].to_f - mb[0].to_f
168
+ height = mb[3].to_f - mb[1].to_f
169
+ width > height
170
+ end
171
+
172
+ def portrait?
173
+ mb = media_box
174
+ return false unless mb.is_a?(Array) && mb.size >= 4
175
+
176
+ width = mb[2].to_f - mb[0].to_f
177
+ height = mb[3].to_f - mb[1].to_f
178
+ height > width
179
+ end
180
+
181
+ def each_annotation
182
+ return enum_for(:each_annotation) unless block_given?
183
+ return unless annotations && document
184
+
185
+ arr = annotations.is_a?(Pdfrb::Model::Reference) ?
186
+ document.object(annotations) : annotations
187
+ return unless arr.is_a?(Array) || arr.is_a?(Pdfrb::Model::PdfArray)
188
+
189
+ arr.each do |entry|
190
+ obj = entry.is_a?(Pdfrb::Model::Reference) ? document.object(entry) : entry
191
+ yield obj if obj
192
+ end
193
+ end
194
+
68
195
  private
69
196
 
70
197
  def inheritable(key)
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # PageLabel (s12.4.2). Catalog /PageLabels /Nums entry. Defines
7
+ # how page numbers are displayed in the viewer.
8
+ class PageLabel < Cos::Dictionary
9
+ register_type :PageLabel
10
+
11
+ def type; self[:Type]; end
12
+ def style; self[:S]; end
13
+ def prefix; self[:P]; end
14
+ def start; self[:St] || 1; end
15
+
16
+ def decimal_style?; style&.to_sym == :D; end
17
+ def uppercase_roman_style?; style&.to_sym == :R; end
18
+ def lowercase_roman_style?; style&.to_sym == :r; end
19
+ def uppercase_letters_style?; style&.to_sym == :A; end
20
+ def lowercase_letters_style?; style&.to_sym == :a; end
21
+
22
+ def label_for(page_index)
23
+ return prefix.to_s unless style
24
+
25
+ number = start + page_index
26
+ case style.to_sym
27
+ when :D then "#{prefix}#{number}"
28
+ when :R then "#{prefix}#{to_roman(number).upcase}"
29
+ when :r then "#{prefix}#{to_roman(number).downcase}"
30
+ when :A then "#{prefix}#{to_letters(number).upcase}"
31
+ when :a then "#{prefix}#{to_letters(number).downcase}"
32
+ else prefix.to_s
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def to_roman(n)
39
+ return "0" if n <= 0
40
+
41
+ mappings = [
42
+ [1000, "M"], [900, "CM"], [500, "D"], [400, "CD"],
43
+ [100, "C"], [90, "XC"], [50, "L"], [40, "XL"],
44
+ [10, "X"], [9, "IX"], [5, "V"], [4, "IV"], [1, "I"]
45
+ ]
46
+ result = +""
47
+ mappings.each do |value, symbol|
48
+ while n >= value
49
+ result << symbol
50
+ n -= value
51
+ end
52
+ end
53
+ result
54
+ end
55
+
56
+ def to_letters(n)
57
+ result = +""
58
+ n -= 1
59
+ while n >= 0
60
+ result = (65 + (n % 26)).chr + result
61
+ n = (n / 26) - 1
62
+ end
63
+ result
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Page-piece dictionary (s14.5). Per-page metadata recording
7
+ # application-specific private data. The dictionary hangs off
8
+ # a page's /PieceInfo key and is keyed by application name;
9
+ # each value carries /LastModified, /Private, and (optionally)
10
+ # an /ASFStream reference for a stream-encoded private payload.
11
+ #
12
+ # Conforming readers MUST NOT interpret application-private
13
+ # data; it survives round-trips and incremental updates intact.
14
+ class PagePieceInfo < Pdfrb::Model::Cos::Dictionary
15
+ # The application-name key (e.g. :Adobe, :Pdfrb). Multiple
16
+ # applications may each have their own entry in the same
17
+ # /PieceInfo dict.
18
+ def application_name
19
+ value.key?(:Application) ? value[:Application] : nil
20
+ end
21
+
22
+ # /LastModified — PDF date string, parsed to a Time.
23
+ def last_modified
24
+ v = value[:LastModified]
25
+ return nil unless v.is_a?(::String)
26
+
27
+ Pdfrb::Model::Date.parse(v)
28
+ end
29
+
30
+ # /Private — application-private dict. Untyped on purpose:
31
+ # the contents are app-defined.
32
+ def private_data
33
+ value[:Private]
34
+ end
35
+
36
+ # Set the application's /LastModified to +time+. +time+ is
37
+ # converted to a PDF date string.
38
+ def last_modified=(time)
39
+ value[:LastModified] = Pdfrb::Model::Date.format(time)
40
+ end
41
+
42
+ # Merge +hash+ into /Private. If /Private is absent, it is
43
+ # created from the hash.
44
+ def merge_private!(hash)
45
+ existing = value[:Private]
46
+ if existing.is_a?(Pdfrb::Model::Cos::Dictionary)
47
+ existing.value.merge!(hash)
48
+ elsif existing.is_a?(::Hash)
49
+ existing.merge!(hash)
50
+ else
51
+ value[:Private] = hash
52
+ end
53
+ self
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -12,16 +12,39 @@ module Pdfrb
12
12
  arlington_object "PageTreeNode"
13
13
  register_type :Pages
14
14
 
15
- # Walk all leaf PageObjects under this node.
16
- def each_page(&block)
17
- return enum_for(:each_page) unless block_given?
15
+ def kids; self[:Kids]; end
16
+ def count; self[:Count] || 0; end
17
+ def parent; self[:Parent]; end
18
+ def media_box; self[:MediaBox]; end
19
+ def crop_box; self[:CropBox]; end
20
+ def resources; self[:Resources]; end
21
+ def rotate; self[:Rotate]; end
22
+
23
+ def root?
24
+ parent.nil?
25
+ end
26
+
27
+ def leaf?
28
+ false
29
+ end
30
+
31
+ def each_child
32
+ return enum_for(:each_child) unless block_given?
33
+ return unless kids && document
18
34
 
19
- kids = self[:Kids] || []
20
- kids.each do |kid_ref|
21
- kid = kid_ref.is_a?(Pdfrb::Model::Reference) ?
22
- document&.object(kid_ref) : kid_ref
23
- next unless kid
35
+ arr = kids.is_a?(Pdfrb::Model::Reference) ? document.object(kids) : kids
36
+ return unless arr.is_a?(Array)
37
+
38
+ arr.each do |kid_ref|
39
+ obj = kid_ref.is_a?(Pdfrb::Model::Reference) ? document.object(kid_ref) : kid_ref
40
+ yield obj if obj
41
+ end
42
+ end
43
+
44
+ def each_page(&block)
45
+ return enum_for(:each_page) unless block
24
46
 
47
+ each_child do |kid|
25
48
  case kid[:Type]
26
49
  when :Pages then kid.each_page(&block)
27
50
  when :Page then yield kid
@@ -29,17 +52,29 @@ module Pdfrb
29
52
  end
30
53
  end
31
54
 
55
+ def pages
56
+ each_page.to_a
57
+ end
58
+
32
59
  def page_count
33
- self[:Count] || 0
60
+ count
61
+ end
62
+
63
+ def first_page
64
+ each_page.first
34
65
  end
35
- end
36
66
 
37
- # The root of the page tree — same shape as PageTreeNode but
38
- # linked directly from the Catalog's /Pages. Tracked separately
39
- # so type-dispatch can distinguish root from interior nodes
40
- # (some validation rules apply only to the root).
41
- class PageTreeNodeRoot < PageTreeNode
42
- arlington_object "PageTreeNodeRoot"
67
+ def last_page
68
+ each_page.to_a.last
69
+ end
70
+
71
+ def page_at(index)
72
+ return nil if index.negative? || index >= page_count
73
+
74
+ each_page.with_index do |page, i|
75
+ return page if i == index
76
+ end
77
+ end
43
78
  end
44
79
  end
45
80
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # The root of the page tree — same shape as PageTreeNode but
7
+ # linked directly from the Catalog's /Pages. Tracked separately
8
+ # so type-dispatch can distinguish root from interior nodes
9
+ # (some validation rules apply only to the root).
10
+ class PageTreeNodeRoot < PageTreeNode
11
+ arlington_object "PageTreeNodeRoot"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Pattern dictionary base (s8.7.2). Patterns tile or shade to fill
7
+ # graphics. Two pattern types: tiling (Type 1) and shading (Type 2).
8
+ class Pattern < Pdfrb::Model::Cos::Dictionary
9
+ def pattern_type; self[:PatternType]; end
10
+
11
+ def tiling?; pattern_type == 1; end
12
+ def shading?; pattern_type == 2; end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Type 2 shading pattern (s8.7.4.1). Fills with a Shading dict.
7
+ class PatternShading < Pattern
8
+ def shading; self[:Shading]; end
9
+ def matrix; self[:Matrix]; end
10
+ def ext_g_state; self[:ExtGState]; end
11
+
12
+ def has_matrix?
13
+ !!matrix
14
+ end
15
+
16
+ def resolved_shading
17
+ ref = shading
18
+ return nil unless ref && document
19
+
20
+ document.object(ref)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Type 1 tiling pattern (s8.7.3). Repeats a graphical cell.
7
+ class PatternTiling < Pattern
8
+ def paint_type; self[:PaintType]; end
9
+ def tiling_type; self[:TilingType]; end
10
+ def bbox; self[:BBox]; end
11
+ def x_step; self[:XStep]; end
12
+ def y_step; self[:YStep]; end
13
+ def resources; self[:Resources]; end
14
+ def matrix; self[:Matrix]; end
15
+
16
+ def colored?; paint_type == 1; end
17
+ def uncolored?; paint_type == 2; end
18
+
19
+ def constant_spacing?; tiling_type == 1; end
20
+ def no_distortion?; tiling_type == 2; end
21
+ def constant_spacing_no_distortion?; tiling_type == 3; end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Polygon annotation (s12.5.6.9). Closed polygon shape.
7
+ class PolygonAnnotation < MarkupAnnotation
8
+ def vertices; self[:Vertices]; end
9
+ def line_endings; self[:LE]; end
10
+ def interior_color; self[:IC]; end
11
+ def border_style; self[:BS]; end
12
+ def border; self[:Border]; end
13
+ def measure; self[:Measure]; end
14
+ def intent; self[:IT]; end
15
+
16
+ def vertex_count
17
+ return 0 unless vertices
18
+
19
+ arr = vertices.is_a?(Pdfrb::Model::PdfArray) ? vertices.to_a : vertices
20
+ arr.is_a?(Array) ? arr.size : 0
21
+ end
22
+
23
+ def has_measure?
24
+ !!measure
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ class PolygonPolyline < Annotation
7
+ def vertices; self[:Vertices]; end
8
+ def line_ending_styling; self[:LE]; end
9
+ def interior_color; self[:IC]; end
10
+ def fill?; self[:Subtype] == :Polygon; end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Polyline annotation (s12.5.6.9). Open polyline (not closed).
7
+ class PolylineAnnotation < MarkupAnnotation
8
+ def vertices; self[:Vertices]; end
9
+ def line_endings; self[:LE]; end
10
+ def interior_color; self[:IC]; end
11
+ def border_style; self[:BS]; end
12
+ def border; self[:Border]; end
13
+ def measure; self[:Measure]; end
14
+ def intent; self[:IT]; end
15
+
16
+ def vertex_count
17
+ return 0 unless vertices
18
+
19
+ arr = vertices.is_a?(Pdfrb::Model::PdfArray) ? vertices.to_a : vertices
20
+ arr.is_a?(Array) ? arr.size : 0
21
+ end
22
+
23
+ def has_measure?
24
+ !!measure
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end