pdfrb 0.3.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/Gemfile +1 -0
  4. data/PROPOSAL.canvas-clip.md +92 -0
  5. data/PROPOSAL.canvas-draw-image-matrix.md +87 -0
  6. data/PROPOSAL.canvas-rich-text.md +103 -0
  7. data/PROPOSAL.canvas-text-lines.md +77 -0
  8. data/PROPOSAL.canvas-transparency.md +106 -0
  9. data/PROPOSAL.external-font-metrics.md +129 -0
  10. data/PROPOSAL.font-embedding-fontfile2.md +88 -0
  11. data/PROPOSAL.font-resolver-ttc.md +105 -0
  12. data/PROPOSAL.font-resolver.md +96 -0
  13. data/PROPOSAL.font-subsetting.md +98 -0
  14. data/PROPOSAL.gradient-shadings.md +110 -0
  15. data/PROPOSAL.page-mediabox-setter.md +66 -0
  16. data/PROPOSAL.per-glyph-width.md +91 -0
  17. data/PROPOSAL.stringio-require.md +53 -0
  18. data/PROPOSAL.struct-tree-root.md +102 -0
  19. data/PROPOSAL.text-measurement.md +93 -0
  20. data/PROPOSAL.ttf-table-parsing-fix.md +112 -0
  21. data/RELEASE.md +48 -0
  22. data/lib/pdfrb/action/base.rb +21 -0
  23. data/lib/pdfrb/action/types.rb +178 -0
  24. data/lib/pdfrb/action.rb +55 -0
  25. data/lib/pdfrb/annotation/base.rb +79 -0
  26. data/lib/pdfrb/annotation/types.rb +222 -0
  27. data/lib/pdfrb/annotation.rb +78 -0
  28. data/lib/pdfrb/appearance/generator.rb +216 -0
  29. data/lib/pdfrb/appearance.rb +11 -0
  30. data/lib/pdfrb/arlington/object_definition.rb +2 -2
  31. data/lib/pdfrb/arlington/predicate/evaluator.rb +1 -1
  32. data/lib/pdfrb/arlington/predicate/functions.rb +25 -9
  33. data/lib/pdfrb/arlington/predicate.rb +1 -5
  34. data/lib/pdfrb/cli/batch.rb +18 -0
  35. data/lib/pdfrb/cli/debug_info.rb +18 -0
  36. data/lib/pdfrb/cli/files.rb +16 -0
  37. data/lib/pdfrb/cli/fonts.rb +16 -0
  38. data/lib/pdfrb/cli/form.rb +18 -0
  39. data/lib/pdfrb/cli/image2pdf.rb +18 -0
  40. data/lib/pdfrb/cli/images.rb +34 -0
  41. data/lib/pdfrb/cli/info.rb +20 -0
  42. data/lib/pdfrb/cli/inspect.rb +18 -0
  43. data/lib/pdfrb/cli/merge.rb +18 -0
  44. data/lib/pdfrb/cli/modify.rb +18 -0
  45. data/lib/pdfrb/cli/optimize.rb +18 -0
  46. data/lib/pdfrb/cli/split.rb +21 -0
  47. data/lib/pdfrb/cli/watermark.rb +18 -0
  48. data/lib/pdfrb/cli.rb +291 -7
  49. data/lib/pdfrb/color/color_space.rb +259 -0
  50. data/lib/pdfrb/color/icc_profile.rb +90 -0
  51. data/lib/pdfrb/color.rb +12 -0
  52. data/lib/pdfrb/compare/comparator.rb +244 -0
  53. data/lib/pdfrb/compare/report.rb +78 -0
  54. data/lib/pdfrb/compare.rb +42 -0
  55. data/lib/pdfrb/composer.rb +161 -0
  56. data/lib/pdfrb/conformance/pdf_a.rb +317 -56
  57. data/lib/pdfrb/conformance/pdf_ua.rb +186 -29
  58. data/lib/pdfrb/conformance/pdf_x.rb +247 -0
  59. data/lib/pdfrb/conformance/rule.rb +78 -0
  60. data/lib/pdfrb/conformance/structure_elements.rb +174 -0
  61. data/lib/pdfrb/conformance/verapdf_bridge.rb +92 -0
  62. data/lib/pdfrb/conformance.rb +7 -3
  63. data/lib/pdfrb/content/canvas.rb +217 -72
  64. data/lib/pdfrb/content/color_space.rb +157 -0
  65. data/lib/pdfrb/content/hidden_text_detector.rb +167 -0
  66. data/lib/pdfrb/content/operator.rb +21 -1
  67. data/lib/pdfrb/content/operators/clipping.rb +36 -0
  68. data/lib/pdfrb/content/operators/graphics_state_params.rb +15 -0
  69. data/lib/pdfrb/content/operators.rb +21 -0
  70. data/lib/pdfrb/content/shading/base.rb +139 -0
  71. data/lib/pdfrb/content/shading.rb +17 -0
  72. data/lib/pdfrb/content/smart_text_extractor.rb +85 -0
  73. data/lib/pdfrb/content/tiling_pattern.rb +78 -0
  74. data/lib/pdfrb/content/transformation_matrix.rb +61 -0
  75. data/lib/pdfrb/content.rb +7 -26
  76. data/lib/pdfrb/destination/fit.rb +185 -0
  77. data/lib/pdfrb/destination.rb +13 -0
  78. data/lib/pdfrb/digital_signature/cms_handler.rb +22 -0
  79. data/lib/pdfrb/digital_signature/signing.rb +107 -11
  80. data/lib/pdfrb/digital_signature/timestamp_handler.rb +45 -0
  81. data/lib/pdfrb/digital_signature/verification.rb +88 -9
  82. data/lib/pdfrb/digital_signature/verification_result.rb +14 -0
  83. data/lib/pdfrb/digital_signature.rb +26 -2
  84. data/lib/pdfrb/document/annotations.rb +120 -3
  85. data/lib/pdfrb/document/associated_files.rb +104 -0
  86. data/lib/pdfrb/document/colors.rb +95 -0
  87. data/lib/pdfrb/document/destinations.rb +127 -5
  88. data/lib/pdfrb/document/display.rb +84 -0
  89. data/lib/pdfrb/document/fonts.rb +417 -45
  90. data/lib/pdfrb/document/form.rb +338 -0
  91. data/lib/pdfrb/document/graphics_state.rb +91 -0
  92. data/lib/pdfrb/document/images.rb +4 -4
  93. data/lib/pdfrb/document/info.rb +102 -0
  94. data/lib/pdfrb/document/layers.rb +62 -0
  95. data/lib/pdfrb/document/metadata.rb +12 -5
  96. data/lib/pdfrb/document/output_intents.rb +91 -0
  97. data/lib/pdfrb/document/page_labels.rb +80 -0
  98. data/lib/pdfrb/document/pages.rb +68 -19
  99. data/lib/pdfrb/document/portfolio.rb +119 -0
  100. data/lib/pdfrb/document/shadings.rb +159 -0
  101. data/lib/pdfrb/document/stamps.rb +68 -0
  102. data/lib/pdfrb/document/structure.rb +242 -0
  103. data/lib/pdfrb/document.rb +73 -4
  104. data/lib/pdfrb/encryption/identity.rb +13 -0
  105. data/lib/pdfrb/encryption/password_verification.rb +53 -8
  106. data/lib/pdfrb/encryption/security_handler.rb +8 -5
  107. data/lib/pdfrb/encryption/standard_security_handler.rb +154 -81
  108. data/lib/pdfrb/encryption.rb +17 -0
  109. data/lib/pdfrb/error.rb +2 -2
  110. data/lib/pdfrb/filter/brotli_decode.rb +32 -0
  111. data/lib/pdfrb/filter/ccitt_fax_decode.rb +12 -0
  112. data/lib/pdfrb/filter/crypt.rb +2 -2
  113. data/lib/pdfrb/filter/dct_decode.rb +18 -0
  114. data/lib/pdfrb/filter/flate_decode.rb +4 -18
  115. data/lib/pdfrb/filter/jbig2_decode.rb +12 -0
  116. data/lib/pdfrb/filter/jpx_decode.rb +18 -0
  117. data/lib/pdfrb/filter/lzw_decode.rb +3 -2
  118. data/lib/pdfrb/filter/png_predictor.rb +94 -0
  119. data/lib/pdfrb/filter.rb +26 -13
  120. data/lib/pdfrb/font/afm_parser.rb +50 -26
  121. data/lib/pdfrb/font/cmap/writer.rb +9 -0
  122. data/lib/pdfrb/font/encoding/win_ansi_encoding.rb +17 -0
  123. data/lib/pdfrb/font/encoding.rb +32 -3
  124. data/lib/pdfrb/font/metrics_helper.rb +121 -0
  125. data/lib/pdfrb/font/true_type/file.rb +10 -1
  126. data/lib/pdfrb/font/true_type/glyf.rb +82 -0
  127. data/lib/pdfrb/font/true_type/kern.rb +58 -0
  128. data/lib/pdfrb/font/true_type/loca.rb +42 -0
  129. data/lib/pdfrb/font/true_type/maxp.rb +44 -0
  130. data/lib/pdfrb/font/true_type/name.rb +53 -0
  131. data/lib/pdfrb/font/true_type/post.rb +93 -0
  132. data/lib/pdfrb/font/true_type/subsetter.rb +3 -5
  133. data/lib/pdfrb/font/true_type/wrapper.rb +102 -0
  134. data/lib/pdfrb/font/true_type.rb +7 -0
  135. data/lib/pdfrb/font.rb +2 -0
  136. data/lib/pdfrb/font_loader/from_configuration.rb +19 -0
  137. data/lib/pdfrb/font_loader/from_file.rb +20 -0
  138. data/lib/pdfrb/font_loader/standard14.rb +20 -0
  139. data/lib/pdfrb/font_loader/variant_from_name.rb +36 -0
  140. data/lib/pdfrb/font_loader.rb +4 -0
  141. data/lib/pdfrb/font_resolver.rb +138 -0
  142. data/lib/pdfrb/image/audit.rb +94 -0
  143. data/lib/pdfrb/image/downsampler.rb +124 -0
  144. data/lib/pdfrb/image.rb +13 -0
  145. data/lib/pdfrb/image_loader/jpeg.rb +39 -58
  146. data/lib/pdfrb/image_loader/png.rb +31 -257
  147. data/lib/pdfrb/layout/bidi.rb +198 -0
  148. data/lib/pdfrb/layout/box.rb +49 -0
  149. data/lib/pdfrb/layout/box_fitter.rb +54 -0
  150. data/lib/pdfrb/layout/column_box.rb +71 -0
  151. data/lib/pdfrb/layout/container_box.rb +45 -0
  152. data/lib/pdfrb/layout/frame.rb +67 -0
  153. data/lib/pdfrb/layout/image_box.rb +44 -0
  154. data/lib/pdfrb/layout/inline_box.rb +25 -0
  155. data/lib/pdfrb/layout/line.rb +55 -0
  156. data/lib/pdfrb/layout/list_box.rb +87 -0
  157. data/lib/pdfrb/layout/numeric_refinements.rb +43 -0
  158. data/lib/pdfrb/layout/page_style.rb +65 -0
  159. data/lib/pdfrb/layout/style.rb +62 -0
  160. data/lib/pdfrb/layout/table_box.rb +66 -0
  161. data/lib/pdfrb/layout/text_box.rb +38 -0
  162. data/lib/pdfrb/layout/text_fragment.rb +45 -0
  163. data/lib/pdfrb/layout/text_layouter.rb +123 -0
  164. data/lib/pdfrb/layout.rb +28 -0
  165. data/lib/pdfrb/linearization/hint_stream.rb +93 -0
  166. data/lib/pdfrb/linearization/writer.rb +259 -0
  167. data/lib/pdfrb/linearization.rb +21 -0
  168. data/lib/pdfrb/model/cos/dictionary.rb +12 -0
  169. data/lib/pdfrb/model/pdf_array.rb +2 -2
  170. data/lib/pdfrb/model/type/action.rb +42 -0
  171. data/lib/pdfrb/model/type/action_go_to_3d_view.rb +14 -0
  172. data/lib/pdfrb/model/type/action_go_to_dp.rb +16 -0
  173. data/lib/pdfrb/model/type/action_go_to_r.rb +26 -0
  174. data/lib/pdfrb/model/type/action_goto.rb +34 -0
  175. data/lib/pdfrb/model/type/action_hide.rb +26 -0
  176. data/lib/pdfrb/model/type/action_import_data.rb +18 -0
  177. data/lib/pdfrb/model/type/action_java_script.rb +18 -0
  178. data/lib/pdfrb/model/type/action_launch.rb +22 -0
  179. data/lib/pdfrb/model/type/action_movie.rb +22 -0
  180. data/lib/pdfrb/model/type/action_named.rb +23 -0
  181. data/lib/pdfrb/model/type/action_nop.rb +12 -0
  182. data/lib/pdfrb/model/type/action_rendition.rb +28 -0
  183. data/lib/pdfrb/model/type/action_reset_form.rb +22 -0
  184. data/lib/pdfrb/model/type/action_rich_media_execute.rb +17 -0
  185. data/lib/pdfrb/model/type/action_set_ocg_state.rb +32 -0
  186. data/lib/pdfrb/model/type/action_set_state.rb +14 -0
  187. data/lib/pdfrb/model/type/action_sound_action.rb +23 -0
  188. data/lib/pdfrb/model/type/action_submit_form.rb +64 -0
  189. data/lib/pdfrb/model/type/action_thread.rb +23 -0
  190. data/lib/pdfrb/model/type/action_trans.rb +30 -0
  191. data/lib/pdfrb/model/type/action_uri.rb +30 -0
  192. data/lib/pdfrb/model/type/af_embedded_file.rb +11 -0
  193. data/lib/pdfrb/model/type/af_file_specification.rb +34 -0
  194. data/lib/pdfrb/model/type/annotation.rb +49 -10
  195. data/lib/pdfrb/model/type/appearance.rb +41 -0
  196. data/lib/pdfrb/model/type/appearance_characteristics.rb +36 -0
  197. data/lib/pdfrb/model/type/appearance_generator.rb +22 -0
  198. data/lib/pdfrb/model/type/appearance_trap_net.rb +84 -0
  199. data/lib/pdfrb/model/type/border_effect.rb +25 -0
  200. data/lib/pdfrb/model/type/border_styling.rb +38 -0
  201. data/lib/pdfrb/model/type/box_color_info.rb +21 -0
  202. data/lib/pdfrb/model/type/box_style.rb +19 -0
  203. data/lib/pdfrb/model/type/button.rb +17 -0
  204. data/lib/pdfrb/model/type/cal_gray.rb +17 -0
  205. data/lib/pdfrb/model/type/cal_rgb.rb +22 -0
  206. data/lib/pdfrb/model/type/caret_annotation.rb +21 -0
  207. data/lib/pdfrb/model/type/catalog.rb +99 -16
  208. data/lib/pdfrb/model/type/choice.rb +21 -0
  209. data/lib/pdfrb/model/type/cid_font.rb +52 -1
  210. data/lib/pdfrb/model/type/cid_font_descriptor_metrics.rb +28 -0
  211. data/lib/pdfrb/model/type/cid_system_info.rb +28 -0
  212. data/lib/pdfrb/model/type/circle_annotation.rb +20 -0
  213. data/lib/pdfrb/model/type/collection.rb +27 -0
  214. data/lib/pdfrb/model/type/collection_field.rb +24 -0
  215. data/lib/pdfrb/model/type/collection_item.rb +19 -0
  216. data/lib/pdfrb/model/type/collection_schema.rb +25 -0
  217. data/lib/pdfrb/model/type/collection_sort.rb +13 -0
  218. data/lib/pdfrb/model/type/crypt_filter.rb +58 -0
  219. data/lib/pdfrb/model/type/device_n.rb +37 -0
  220. data/lib/pdfrb/model/type/device_n_mixing_hints.rb +17 -0
  221. data/lib/pdfrb/model/type/device_n_process.rb +13 -0
  222. data/lib/pdfrb/model/type/doc_mdp_transform_parameters.rb +21 -0
  223. data/lib/pdfrb/model/type/document_security_store.rb +55 -0
  224. data/lib/pdfrb/model/type/embedded_file.rb +19 -0
  225. data/lib/pdfrb/model/type/embedded_file_parameter.rb +48 -0
  226. data/lib/pdfrb/model/type/encryption_public_key.rb +38 -0
  227. data/lib/pdfrb/model/type/encryption_standard.rb +68 -0
  228. data/lib/pdfrb/model/type/field_mdp_transform_parameters.rb +26 -0
  229. data/lib/pdfrb/model/type/file_attachment_annotation.rb +29 -0
  230. data/lib/pdfrb/model/type/file_spec_ef.rb +22 -0
  231. data/lib/pdfrb/model/type/file_spec_rf.rb +21 -0
  232. data/lib/pdfrb/model/type/file_specification.rb +43 -0
  233. data/lib/pdfrb/model/type/file_trailer.rb +54 -0
  234. data/lib/pdfrb/model/type/font.rb +73 -2
  235. data/lib/pdfrb/model/type/font_cid_type0.rb +17 -0
  236. data/lib/pdfrb/model/type/font_cid_type2.rb +17 -0
  237. data/lib/pdfrb/model/type/font_descriptor.rb +47 -0
  238. data/lib/pdfrb/model/type/font_descriptor_cid_type0.rb +15 -0
  239. data/lib/pdfrb/model/type/font_descriptor_cid_type2.rb +15 -0
  240. data/lib/pdfrb/model/type/font_encoding.rb +47 -0
  241. data/lib/pdfrb/model/type/font_file.rb +28 -0
  242. data/lib/pdfrb/model/type/font_file2.rb +32 -0
  243. data/lib/pdfrb/model/type/font_file3.rb +23 -0
  244. data/lib/pdfrb/model/type/font_multiple_master.rb +60 -0
  245. data/lib/pdfrb/model/type/font_true_type.rb +1 -1
  246. data/lib/pdfrb/model/type/font_type0.rb +1 -1
  247. data/lib/pdfrb/model/type/font_type1.rb +1 -1
  248. data/lib/pdfrb/model/type/font_type3.rb +1 -1
  249. data/lib/pdfrb/model/type/form_field.rb +73 -0
  250. data/lib/pdfrb/model/type/free_text_annotation.rb +37 -0
  251. data/lib/pdfrb/model/type/function.rb +42 -0
  252. data/lib/pdfrb/model/type/function_exponential.rb +31 -0
  253. data/lib/pdfrb/model/type/function_postscript.rb +25 -0
  254. data/lib/pdfrb/model/type/function_sampled.rb +55 -0
  255. data/lib/pdfrb/model/type/function_stitching.rb +33 -0
  256. data/lib/pdfrb/model/type/generic_appearance.rb +40 -0
  257. data/lib/pdfrb/model/type/graphics_state_parameter.rb +69 -0
  258. data/lib/pdfrb/model/type/halftone.rb +21 -0
  259. data/lib/pdfrb/model/type/halftone_type1.rb +17 -0
  260. data/lib/pdfrb/model/type/halftone_type10.rb +16 -0
  261. data/lib/pdfrb/model/type/halftone_type16.rb +11 -0
  262. data/lib/pdfrb/model/type/halftone_type5.rb +24 -0
  263. data/lib/pdfrb/model/type/halftone_type6.rb +16 -0
  264. data/lib/pdfrb/model/type/highlight_annotation.rb +11 -0
  265. data/lib/pdfrb/model/type/icc_based_color_space.rb +24 -0
  266. data/lib/pdfrb/model/type/icon_fit.rb +31 -0
  267. data/lib/pdfrb/model/type/indexed.rb +32 -0
  268. data/lib/pdfrb/model/type/info.rb +44 -0
  269. data/lib/pdfrb/model/type/ink_annotation.rb +29 -0
  270. data/lib/pdfrb/model/type/interactive_form.rb +36 -0
  271. data/lib/pdfrb/model/type/interior_color.rb +12 -0
  272. data/lib/pdfrb/model/type/jbig2_globals.rb +15 -0
  273. data/lib/pdfrb/model/type/lab.rb +27 -0
  274. data/lib/pdfrb/model/type/line_annotation.rb +44 -0
  275. data/lib/pdfrb/model/type/line_ending_styling.rb +39 -0
  276. data/lib/pdfrb/model/type/link_annotation.rb +41 -0
  277. data/lib/pdfrb/model/type/link_appearance.rb +9 -0
  278. data/lib/pdfrb/model/type/mark_information.rb +23 -0
  279. data/lib/pdfrb/model/type/marked_content_reference.rb +24 -0
  280. data/lib/pdfrb/model/type/markup_annotation.rb +36 -0
  281. data/lib/pdfrb/model/type/mdp_dict.rb +28 -0
  282. data/lib/pdfrb/model/type/measure.rb +39 -0
  283. data/lib/pdfrb/model/type/media_clip.rb +28 -0
  284. data/lib/pdfrb/model/type/media_offset.rb +106 -0
  285. data/lib/pdfrb/model/type/metadata.rb +27 -3
  286. data/lib/pdfrb/model/type/misc_helpers.rb +75 -0
  287. data/lib/pdfrb/model/type/movie.rb +28 -0
  288. data/lib/pdfrb/model/type/names.rb +51 -0
  289. data/lib/pdfrb/model/type/namespace.rb +27 -0
  290. data/lib/pdfrb/model/type/object_reference.rb +31 -0
  291. data/lib/pdfrb/model/type/object_stream.rb +38 -0
  292. data/lib/pdfrb/model/type/opt_content_ext.rb +94 -0
  293. data/lib/pdfrb/model/type/opt_content_page_element.rb +18 -0
  294. data/lib/pdfrb/model/type/optional_content_config.rb +56 -0
  295. data/lib/pdfrb/model/type/optional_content_group.rb +35 -10
  296. data/lib/pdfrb/model/type/optional_content_membership.rb +36 -2
  297. data/lib/pdfrb/model/type/optional_content_properties.rb +16 -1
  298. data/lib/pdfrb/model/type/outline.rb +40 -6
  299. data/lib/pdfrb/model/type/outline_item.rb +45 -0
  300. data/lib/pdfrb/model/type/output_intent.rb +30 -0
  301. data/lib/pdfrb/model/type/page.rb +127 -0
  302. data/lib/pdfrb/model/type/page_label.rb +68 -0
  303. data/lib/pdfrb/model/type/page_tree_node.rb +51 -16
  304. data/lib/pdfrb/model/type/page_tree_node_root.rb +15 -0
  305. data/lib/pdfrb/model/type/pattern.rb +16 -0
  306. data/lib/pdfrb/model/type/pattern_shading.rb +25 -0
  307. data/lib/pdfrb/model/type/pattern_tiling.rb +25 -0
  308. data/lib/pdfrb/model/type/polygon_annotation.rb +29 -0
  309. data/lib/pdfrb/model/type/polygon_polyline.rb +14 -0
  310. data/lib/pdfrb/model/type/polyline_annotation.rb +29 -0
  311. data/lib/pdfrb/model/type/popup_annotation.rb +20 -0
  312. data/lib/pdfrb/model/type/printer_mark_annotation.rb +13 -0
  313. data/lib/pdfrb/model/type/redact_annotation.rb +28 -0
  314. data/lib/pdfrb/model/type/rendition.rb +31 -0
  315. data/lib/pdfrb/model/type/resources.rb +59 -14
  316. data/lib/pdfrb/model/type/rich_media_activation.rb +24 -0
  317. data/lib/pdfrb/model/type/rich_media_animation.rb +25 -0
  318. data/lib/pdfrb/model/type/rich_media_annotation.rb +18 -0
  319. data/lib/pdfrb/model/type/rich_media_command.rb +19 -0
  320. data/lib/pdfrb/model/type/rich_media_configuration.rb +32 -0
  321. data/lib/pdfrb/model/type/rich_media_content.rb +28 -0
  322. data/lib/pdfrb/model/type/rich_media_cue_point.rb +18 -0
  323. data/lib/pdfrb/model/type/rich_media_deactivation.rb +17 -0
  324. data/lib/pdfrb/model/type/rich_media_instance.rb +33 -0
  325. data/lib/pdfrb/model/type/rich_media_presentation.rb +29 -0
  326. data/lib/pdfrb/model/type/rich_media_settings.rb +33 -0
  327. data/lib/pdfrb/model/type/rich_media_window.rb +20 -0
  328. data/lib/pdfrb/model/type/screen_annotation.rb +19 -0
  329. data/lib/pdfrb/model/type/separation.rb +25 -0
  330. data/lib/pdfrb/model/type/sig_field_lock.rb +25 -0
  331. data/lib/pdfrb/model/type/sig_field_seed_value.rb +25 -0
  332. data/lib/pdfrb/model/type/signature.rb +65 -0
  333. data/lib/pdfrb/model/type/signature_build.rb +86 -0
  334. data/lib/pdfrb/model/type/signature_field.rb +17 -0
  335. data/lib/pdfrb/model/type/software_identifier.rb +19 -0
  336. data/lib/pdfrb/model/type/sound.rb +38 -0
  337. data/lib/pdfrb/model/type/sound_annotation.rb +21 -0
  338. data/lib/pdfrb/model/type/square_annotation.rb +24 -0
  339. data/lib/pdfrb/model/type/square_circle.rb +13 -0
  340. data/lib/pdfrb/model/type/squiggly_annotation.rb +11 -0
  341. data/lib/pdfrb/model/type/stamp_annotation.rb +19 -0
  342. data/lib/pdfrb/model/type/strikeout_annotation.rb +11 -0
  343. data/lib/pdfrb/model/type/struct_elem.rb +75 -0
  344. data/lib/pdfrb/model/type/struct_tree_root.rb +34 -0
  345. data/lib/pdfrb/model/type/structure_attributes.rb +44 -0
  346. data/lib/pdfrb/model/type/structure_element_kid.rb +33 -0
  347. data/lib/pdfrb/model/type/text_annotation.rb +25 -0
  348. data/lib/pdfrb/model/type/text_appearance.rb +9 -0
  349. data/lib/pdfrb/model/type/text_field.rb +21 -0
  350. data/lib/pdfrb/model/type/text_markup_annotation.rb +30 -0
  351. data/lib/pdfrb/model/type/three_d_activation.rb +32 -0
  352. data/lib/pdfrb/model/type/three_d_animation_style.rb +24 -0
  353. data/lib/pdfrb/model/type/three_d_background.rb +28 -0
  354. data/lib/pdfrb/model/type/three_d_cross_section.rb +25 -0
  355. data/lib/pdfrb/model/type/three_d_lighting_scheme.rb +26 -0
  356. data/lib/pdfrb/model/type/three_d_measure.rb +20 -0
  357. data/lib/pdfrb/model/type/three_d_measure_3dc.rb +23 -0
  358. data/lib/pdfrb/model/type/three_d_measure_ad3.rb +14 -0
  359. data/lib/pdfrb/model/type/three_d_measure_ld3.rb +14 -0
  360. data/lib/pdfrb/model/type/three_d_measure_pd3.rb +20 -0
  361. data/lib/pdfrb/model/type/three_d_measure_rd3.rb +14 -0
  362. data/lib/pdfrb/model/type/three_d_node.rb +37 -0
  363. data/lib/pdfrb/model/type/three_d_reference.rb +21 -0
  364. data/lib/pdfrb/model/type/three_d_render_mode.rb +34 -0
  365. data/lib/pdfrb/model/type/three_d_stream.rb +48 -0
  366. data/lib/pdfrb/model/type/three_d_units.rb +18 -0
  367. data/lib/pdfrb/model/type/three_d_view.rb +40 -0
  368. data/lib/pdfrb/model/type/to_unicode_cmap_stream.rb +23 -0
  369. data/lib/pdfrb/model/type/transition.rb +68 -0
  370. data/lib/pdfrb/model/type/underline_annotation.rb +11 -0
  371. data/lib/pdfrb/model/type/ur_transform_parameters.rb +33 -0
  372. data/lib/pdfrb/model/type/uri_dict.rb +18 -0
  373. data/lib/pdfrb/model/type/url_alias.rb +19 -0
  374. data/lib/pdfrb/model/type/variable_text_field.rb +47 -0
  375. data/lib/pdfrb/model/type/viewer_preferences.rb +42 -0
  376. data/lib/pdfrb/model/type/watermark_annotation.rb +13 -0
  377. data/lib/pdfrb/model/type/widget_annotation.rb +48 -0
  378. data/lib/pdfrb/model/type/widget_appearance.rb +9 -0
  379. data/lib/pdfrb/model/type/xobject_form.rb +41 -0
  380. data/lib/pdfrb/model/type/xobject_image.rb +56 -0
  381. data/lib/pdfrb/model/type/xref_stream.rb +37 -0
  382. data/lib/pdfrb/model/type.rb +286 -6
  383. data/lib/pdfrb/serializer.rb +2 -2
  384. data/lib/pdfrb/source/tokenizer.rb +0 -2
  385. data/lib/pdfrb/task/benchmark.rb +83 -0
  386. data/lib/pdfrb/task/extract_text.rb +1 -1
  387. data/lib/pdfrb/task/generate_corpus.rb +130 -0
  388. data/lib/pdfrb/task/memory_profile.rb +84 -0
  389. data/lib/pdfrb/task/optimize.rb +97 -7
  390. data/lib/pdfrb/task.rb +3 -3
  391. data/lib/pdfrb/test_utils.rb +112 -0
  392. data/lib/pdfrb/validator.rb +82 -0
  393. data/lib/pdfrb/version.rb +1 -1
  394. data/lib/pdfrb/writer.rb +117 -27
  395. data/lib/pdfrb/xmp/packet.rb +122 -0
  396. data/lib/pdfrb/xmp/schemas.rb +96 -0
  397. data/lib/pdfrb/xmp.rb +44 -0
  398. data/lib/pdfrb/xref_section.rb +2 -2
  399. data/lib/pdfrb.rb +24 -54
  400. data/pdfrb.gemspec +45 -0
  401. data/script/apply_fixes.sh +843 -0
  402. data/script/make_jpeg_fixture.rb +53 -0
  403. data/script/make_png_fixture.rb +25 -0
  404. metadata +311 -2
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Type 3 font file stream — the modern container used for CFF
7
+ # (Compact Font Format), OpenType, and CID-keyed fonts.
8
+ # Referenced by FontDescriptor /FontFile3.
9
+ class FontFile3 < Pdfrb::Model::Cos::Stream
10
+ def subtype; self[:Subtype]&.to_sym; end
11
+
12
+ def font_program
13
+ decoded_stream&.force_encoding(Encoding::BINARY)
14
+ end
15
+
16
+ def cid_font_type0?; subtype == :CIDFontType0C; end
17
+ def open_type?; subtype == :OpenType; end
18
+ def type1c?; subtype == :Type1C; end
19
+ def truetype?; subtype == :TrueType; end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # MultipleMaster Type 1 font (s9.6.2.3). Type 1 font with
7
+ # additional design axes between masters. Deprecated in PDF 2.0.
8
+ class FontMultipleMaster < Font
9
+ def subtype; self[:Subtype]&.to_sym; end
10
+ def name; self[:Name]; end
11
+ def first_char; self[:FirstChar]; end
12
+ def last_char; self[:LastChar]; end
13
+ def widths; self[:Widths]; end
14
+ def font_descriptor; self[:FontDescriptor]; end
15
+ def encoding; self[:Encoding]; end
16
+ def blend_axis_types; self[:BlendAxisTypes]; end
17
+
18
+ def mm_type1?
19
+ subtype == :MMType1
20
+ end
21
+
22
+ def first_char_or_default
23
+ first_char || 0
24
+ end
25
+
26
+ def last_char_or_default
27
+ last_char || 255
28
+ end
29
+
30
+ def char_range
31
+ [first_char_or_default, last_char_or_default]
32
+ end
33
+ end
34
+
35
+ # CharProcMap (s9.6.4). Mapping from character names to the
36
+ # content-stream procedures that draw them, used by Type 3 fonts.
37
+ # The actual procedures live as streams under their names in a
38
+ # Tiling pattern's Resources.
39
+ class CharProcMap < Pdfrb::Model::Cos::Dictionary
40
+ def entries
41
+ value.each
42
+ end
43
+
44
+ def each_procedure(&block)
45
+ return enum_for(:each_procedure) unless block
46
+
47
+ value.each(&block)
48
+ end
49
+
50
+ def procedure_for(char_name)
51
+ value[char_name.to_sym] || value[char_name.to_s]
52
+ end
53
+
54
+ def has_glyph?(char_name)
55
+ !!procedure_for(char_name)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -4,7 +4,7 @@ module Pdfrb
4
4
  module Model
5
5
  module Type
6
6
  # TrueType font (s9.6.3). /Subtype /TrueType.
7
- class FontTrueType < Pdfrb::Model::Cos::Dictionary
7
+ class FontTrueType < Pdfrb::Model::Type::Font
8
8
  arlington_object "FontTrueType"
9
9
  end
10
10
  end
@@ -4,7 +4,7 @@ module Pdfrb
4
4
  module Model
5
5
  module Type
6
6
  # Type0 (composite) font (s9.7). Outer font that wraps a CIDFont.
7
- class FontType0 < Pdfrb::Model::Cos::Dictionary
7
+ class FontType0 < Pdfrb::Model::Type::Font
8
8
  arlington_object "FontType0"
9
9
  end
10
10
  end
@@ -4,7 +4,7 @@ module Pdfrb
4
4
  module Model
5
5
  module Type
6
6
  # Type1 font (s9.6.2). /Subtype /Type1.
7
- class FontType1 < Pdfrb::Model::Cos::Dictionary
7
+ class FontType1 < Pdfrb::Model::Type::Font
8
8
  arlington_object "FontType1"
9
9
  end
10
10
  end
@@ -5,7 +5,7 @@ module Pdfrb
5
5
  module Type
6
6
  # Type 3 glyph font (s9.6.5). /Subtype /Type3, /CharProcs,
7
7
  # /Resources, /FontBBox, /FontMatrix, /Encoding, /Widths.
8
- class FontType3 < Pdfrb::Model::Cos::Dictionary
8
+ class FontType3 < Pdfrb::Model::Type::Font
9
9
  arlington_object "FontType3"
10
10
  end
11
11
  end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ class Field < Cos::Dictionary
7
+ register_type :Field
8
+
9
+ def field_type; self[:FT]; end
10
+ def field_name; self[:T]; end
11
+ def alternate_field_name; self[:TU]; end
12
+ def mapping_field_name; self[:TM]; end
13
+ def field_value; self[:V]; end
14
+ def default_value; self[:DV]; end
15
+ def kids; self[:Kids]; end
16
+ def parent; self[:Parent]; end
17
+ def flags; self[:Ff] || 0; end
18
+ def additional_actions; self[:AA]; end
19
+ def appearance_characteristics; self[:MK]; end
20
+
21
+ def button?; field_type&.to_sym == :Btn; end
22
+ def text?; field_type&.to_sym == :Tx; end
23
+ def choice?; field_type&.to_sym == :Ch; end
24
+ def signature?; field_type&.to_sym == :Sig; end
25
+
26
+ def read_only?; flags & 1 != 0; end
27
+ def required?; flags & 2 != 0; end
28
+ def no_export?; flags & 4 != 0; end
29
+
30
+ def has_kids?
31
+ kids && (!kids.is_a?(Array) || !kids.empty?)
32
+ end
33
+
34
+ def terminal_field?
35
+ !has_kids?
36
+ end
37
+
38
+ def resolved_parent
39
+ ref = parent
40
+ return nil unless ref && document
41
+
42
+ document.object(ref)
43
+ end
44
+
45
+ def root_field
46
+ cur = self
47
+ while cur&.parent
48
+ parent_ref = cur.parent
49
+ cur = if parent_ref.is_a?(Pdfrb::Model::Reference) && document
50
+ document.object(parent_ref)
51
+ else
52
+ parent_ref
53
+ end
54
+ end
55
+ cur
56
+ end
57
+
58
+ def fully_qualified_name
59
+ parts = []
60
+ cur = self
61
+ while cur
62
+ parts << cur.field_name if cur.field_name
63
+ parent_ref = cur.parent
64
+ break unless parent_ref && document
65
+
66
+ cur = document.object(parent_ref)
67
+ end
68
+ parts.reverse.join(".")
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Free-text annotation (s12.5.6.6). Text shown directly on the page.
7
+ class FreeTextAnnotation < MarkupAnnotation
8
+ def default_appearance; self[:DA]; end
9
+ def q; self[:Q]; end
10
+ def rc; self[:RC]; end
11
+ def ds; self[:DS]; end
12
+ def cl; self[:CL]; end
13
+ def it; self[:IT]; end
14
+ def be; self[:BE]; end
15
+ def rd; self[:RD]; end
16
+ def style_string; default_appearance; end
17
+
18
+ def text_alignment
19
+ case q
20
+ when 1 then :center
21
+ when 2 then :right
22
+ when 3 then :justify
23
+ else :left
24
+ end
25
+ end
26
+
27
+ def callout?
28
+ !!cl
29
+ end
30
+
31
+ def border_effect?
32
+ !!be
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # PDF Function dictionary (s8.9.1). Functions map input values to
7
+ # output values; used by shadings, color spaces, and other
8
+ # computational graphics primitives.
9
+ #
10
+ # Four function types exist (s8.9.4..7):
11
+ # * Type 0: Sampled (N-dimensional lookup table)
12
+ # * Type 2: Exponential (C0 + (C1 - C0) * t^r)
13
+ # * Type 3: Stitching (concatenation of multiple subfunctions)
14
+ # * Type 4: PostScript calculator (most flexible)
15
+ class Function < Pdfrb::Model::Cos::Dictionary
16
+ def function_type; self[:FunctionType]; end
17
+
18
+ def domain; self[:Domain]; end
19
+ def range; self[:Range]; end
20
+
21
+ def sampled?; function_type.zero?; end
22
+ def exponential?; function_type == 2; end
23
+ def stitching?; function_type == 3; end
24
+ def postscript?; function_type == 4; end
25
+
26
+ def input_dimension
27
+ return nil unless domain
28
+
29
+ arr = domain.is_a?(Pdfrb::Model::PdfArray) ? domain.to_a : domain
30
+ arr.is_a?(Array) ? arr.size / 2 : nil
31
+ end
32
+
33
+ def output_dimension
34
+ return nil unless range
35
+
36
+ arr = range.is_a?(Pdfrb::Model::PdfArray) ? range.to_a : range
37
+ arr.is_a?(Array) ? arr.size / 2 : nil
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Type 2 Exponential interpolation function (s8.9.4).
7
+ # Maps +t+ ∈ [0,1] to C0 + (C1 - C0) * t^N.
8
+ # Commonly used for 2-color linear gradients.
9
+ class FunctionExponential < Function
10
+ def c0; self[:C0]; end
11
+ def c1; self[:C1]; end
12
+ def exponent; self[:N] || 1; end
13
+
14
+ def linear?
15
+ exponent == 1
16
+ end
17
+
18
+ def evaluate(t)
19
+ return nil unless c0 && c1
20
+
21
+ arr0 = c0.is_a?(Pdfrb::Model::PdfArray) ? c0.to_a : c0
22
+ arr1 = c1.is_a?(Pdfrb::Model::PdfArray) ? c1.to_a : c1
23
+ n = exponent.to_f
24
+ arr0.each_with_index.map do |a, i|
25
+ a.to_f + ((arr1[i].to_f - a.to_f) * (t**n))
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Type 4 PostScript calculator function (s8.9.6). Carries a
7
+ # PostScript program in the stream payload that computes the
8
+ # output values from input values.
9
+ class FunctionPostScript < Pdfrb::Model::Cos::Stream
10
+ def function_type; self[:FunctionType] || 4; end
11
+
12
+ def domain; self[:Domain]; end
13
+ def range; self[:Range]; end
14
+
15
+ def postscript?
16
+ true
17
+ end
18
+
19
+ def program
20
+ decoded_stream&.force_encoding(Encoding::BINARY)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Type 0 Sampled function (s8.9.3). N-dimensional lookup table
7
+ # with interpolation. Carries sample data in the stream payload.
8
+ class FunctionSampled < Pdfrb::Model::Cos::Stream
9
+ def function_type; self[:FunctionType] || 0; end
10
+
11
+ def domain; self[:Domain]; end
12
+ def range; self[:Range]; end
13
+ def size; self[:Size]; end
14
+ def bits_per_sample; self[:BitsPerSample]; end
15
+ def encode; self[:Encode]; end
16
+ def decode; self[:Decode]; end
17
+
18
+ def sampled?
19
+ true
20
+ end
21
+
22
+ def input_dimension
23
+ return nil unless domain
24
+
25
+ arr = domain.is_a?(Pdfrb::Model::PdfArray) ? domain.to_a : domain
26
+ arr.is_a?(Array) ? arr.size / 2 : nil
27
+ end
28
+
29
+ def output_dimension
30
+ return nil unless range
31
+
32
+ arr = range.is_a?(Pdfrb::Model::PdfArray) ? range.to_a : range
33
+ arr.is_a?(Array) ? arr.size / 2 : nil
34
+ end
35
+
36
+ def sample_count
37
+ return 1 unless size
38
+
39
+ arr = size.is_a?(Pdfrb::Model::PdfArray) ? size.to_a : size
40
+ return 1 unless arr.is_a?(Array) && !arr.empty?
41
+
42
+ arr.reduce(1) { |product, n| product * n.to_i }
43
+ end
44
+
45
+ def bit_depth_8?
46
+ bits_per_sample == 8
47
+ end
48
+
49
+ def bit_depth_16?
50
+ bits_per_sample == 16
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Type 3 Stitching function (s8.9.5). Concatenates multiple
7
+ # sub-functions over a stitched input domain.
8
+ class FunctionStitching < Function
9
+ def sub_functions; self[:Functions]; end
10
+ def bounds; self[:Bounds]; end
11
+ def encode; self[:Encode]; end
12
+
13
+ def subfunction_count
14
+ return 0 unless sub_functions
15
+
16
+ arr = sub_functions.is_a?(Pdfrb::Model::PdfArray) ? sub_functions.to_a : sub_functions
17
+ arr.is_a?(Array) ? arr.size : 0
18
+ end
19
+
20
+ def each_subfunction
21
+ return enum_for(:each_subfunction) unless block_given?
22
+ return unless sub_functions && document
23
+
24
+ arr = sub_functions.is_a?(Pdfrb::Model::PdfArray) ? sub_functions.to_a : sub_functions
25
+ arr.each do |ref|
26
+ obj = ref.is_a?(Pdfrb::Model::Reference) ? document.object(ref) : ref
27
+ yield obj if obj
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ class GenericAppearance
7
+ attr_reader :annotation, :document
8
+
9
+ def initialize(annotation, document)
10
+ @annotation = annotation
11
+ @document = document
12
+ end
13
+
14
+ def create_appearance
15
+ rect = annotation[:Rect]
16
+ return nil unless rect.is_a?(::Array) && rect.length == 4
17
+
18
+ x0, y0, x1, y1 = rect
19
+ width = (x1 - x0).abs
20
+ height = (y1 - y0).abs
21
+ return nil if width.zero? || height.zero?
22
+
23
+ stream = document.add(
24
+ {
25
+ Type: :XObject,
26
+ Subtype: :Form,
27
+ BBox: [0, 0, width, height],
28
+ Matrix: [1, 0, 0, 1, 0, 0],
29
+ Length: 0,
30
+ },
31
+ type: Pdfrb::Model::Cos::Stream
32
+ )
33
+ stream.stream = "q Q\n"
34
+ annotation[:AP] = { N: Pdfrb::Model::Reference.new(stream.oid, stream.gen) }
35
+ stream
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -11,6 +11,75 @@ module Pdfrb
11
11
  class GraphicsStateParameter < Pdfrb::Model::Cos::Dictionary
12
12
  arlington_object "GraphicsStateParameter"
13
13
  register_type :ExtGState
14
+
15
+ def line_width; self[:LW]; end
16
+ def line_cap; self[:LC]; end
17
+ def line_join; self[:LJ]; end
18
+ def miter_limit; self[:ML]; end
19
+ def dash_pattern; self[:D]; end
20
+ def rendering_intent; self[:RI]; end
21
+ def stroke_adjustment?; truthy?(self[:SA]); end
22
+ def blend_mode; self[:BM]; end
23
+ def stroking_alpha; self[:CA]; end
24
+ def nonstroking_alpha; self[:ca]; end
25
+ def alpha_source?; truthy?(self[:AIS]); end
26
+ def overprint?; truthy?(self[:OP]); end
27
+ def nonstroking_overprint?; truthy?(self[:op]); end
28
+ def overprint_mode; self[:OPM]; end
29
+ def text_knockout?; truthy?(self[:TK]); end
30
+ def font; self[:Font]; end
31
+ def transfer_function; self[:TR]; end
32
+ def transfer_function2; self[:TR2]; end
33
+ def halftone; self[:HT]; end
34
+ def flatness; self[:FL]; end
35
+ def black_point_compensation; self[:UseBlackPtComp]; end
36
+ def soft_mask; self[:SMask]; end
37
+
38
+ def font_name
39
+ return nil unless font
40
+
41
+ arr = font.is_a?(Pdfrb::Model::PdfArray) ? font.to_a : font
42
+ arr.is_a?(Array) ? arr[0] : nil
43
+ end
44
+
45
+ def font_size
46
+ return nil unless font
47
+
48
+ arr = font.is_a?(Pdfrb::Model::PdfArray) ? font.to_a : font
49
+ arr.is_a?(Array) ? arr[1] : nil
50
+ end
51
+
52
+ def has_soft_mask?
53
+ !!soft_mask
54
+ end
55
+
56
+ def has_transparency?
57
+ (stroking_alpha && stroking_alpha != 1) ||
58
+ (nonstroking_alpha && nonstroking_alpha != 1) ||
59
+ !!blend_mode || !!soft_mask
60
+ end
61
+
62
+ def has_font?
63
+ !!font
64
+ end
65
+
66
+ def dash_array
67
+ return nil unless dash_pattern
68
+
69
+ arr = dash_pattern.is_a?(Pdfrb::Model::PdfArray) ? dash_pattern.to_a : dash_pattern
70
+ return nil unless arr.is_a?(Array) && arr.size >= 1
71
+
72
+ arr[0]
73
+ end
74
+
75
+ def dash_phase
76
+ return nil unless dash_pattern
77
+
78
+ arr = dash_pattern.is_a?(Pdfrb::Model::PdfArray) ? dash_pattern.to_a : dash_pattern
79
+ return nil unless arr.is_a?(Array) && arr.size >= 2
80
+
81
+ arr[1]
82
+ end
14
83
  end
15
84
  end
16
85
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Halftone dictionary (s8.7.4). Halftones control how continuous
7
+ # tones are simulated via dot patterns for printing. Six halftone
8
+ # types exist in the PDF spec.
9
+ class Halftone < Pdfrb::Model::Cos::Dictionary
10
+ def halftone_type; self[:HalftoneType]; end
11
+ def halftone_name; self[:HalftoneName]; end
12
+
13
+ def type1?; halftone_type == 1; end
14
+ def type5?; halftone_type == 5; end
15
+ def type6?; halftone_type == 6; end
16
+ def type10?; halftone_type == 10; end
17
+ def type16?; halftone_type == 16; end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Type 1 halftone: a 1-bit tile sampled from a halftone screen
7
+ # cell defined by frequency, angle, and spot function.
8
+ class HalftoneType1 < Halftone
9
+ def frequency; self[:Frequency]; end
10
+ def angle; self[:Angle]; end
11
+ def spot_function; self[:SpotFunction]; end
12
+ def accurate_screens?; truthy?(self[:AccurateScreens]); end
13
+ def transfer_function; self[:TransferFunction]; end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Type 10 halftone: mesh-based continuous-tone (PDF 1.4+, mostly
7
+ # used for non-square pixel grids).
8
+ class HalftoneType10 < HalftoneType6
9
+ def xsquarestep; self[:Xsquarestep]; end
10
+ def ysquarestep; self[:Ysquarestep]; end
11
+ def center_x; self[:CenterX]; end
12
+ def center_y; self[:CenterY]; end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Type 16 halftone: more flexible mesh variant (PDF 1.4+).
7
+ class HalftoneType16 < HalftoneType10
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Type 5 halftone: a dictionary mapping colorant name → HalftoneType1.
7
+ class HalftoneType5 < Halftone
8
+ def halftones; self[:Halftones]; end
9
+ def default; self[:Default]; end
10
+
11
+ def colorant_count
12
+ return 0 unless halftones
13
+
14
+ obj = if halftones.is_a?(Pdfrb::Model::Reference) && document
15
+ document.object(halftones)
16
+ else
17
+ halftones
18
+ end
19
+ obj.is_a?(Pdfrb::Model::Cos::Dictionary) ? obj.value.size : obj&.size || 0
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Type 6 halftone: continuous-tone cell (PDF 1.4+).
7
+ class HalftoneType6 < Halftone
8
+ def width; self[:Width]; end
9
+ def height; self[:Height]; end
10
+ def width2; self[:Width2]; end
11
+ def height2; self[:Height2]; end
12
+ def transfer_function; self[:TransferFunction]; end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Highlight annotation. /Subtype /Highlight.
7
+ class HighlightAnnotation < TextMarkupAnnotation
8
+ end
9
+ end
10
+ end
11
+ end