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
@@ -7,6 +7,62 @@ module Pdfrb
7
7
  # /Width, /Height, /ColorSpace, /BitsPerComponent, etc.
8
8
  class XObjectImage < Pdfrb::Model::Cos::Stream
9
9
  arlington_object "XObjectImage"
10
+
11
+ def subtype; self[:Subtype]; end
12
+ def width; self[:Width]; end
13
+ def height; self[:Height]; end
14
+ def color_space; self[:ColorSpace]; end
15
+ def bits_per_component; self[:BitsPerComponent]; end
16
+ def filter; self[:Filter]; end
17
+ def decode; self[:Decode]; end
18
+ def intent; self[:Intent]; end
19
+ def image_mask?; truthy?(self[:ImageMask]); end
20
+ def mask; self[:Mask]; end
21
+ def smask; self[:SMask]; end
22
+ def smask_in_data; self[:SMaskInData]; end
23
+ def decode_parms; self[:DecodeParms]; end
24
+ def interpolate?; truthy?(self[:Interpolate]); end
25
+ def alternates; self[:Alternates]; end
26
+ def oc; self[:OC]; end
27
+ def name; self[:Name]; end
28
+ def struct_parent; self[:StructParent]; end
29
+ def associated_files; self[:AF]; end
30
+
31
+ def components
32
+ cs = color_space
33
+ return 0 unless cs
34
+
35
+ case cs.to_sym
36
+ when :DeviceGray, :CalGray, :Indexed then 1
37
+ when :DeviceRGB, :CalRGB, :Lab then 3
38
+ when :DeviceCMYK then 4
39
+ end
40
+ rescue StandardError
41
+ nil
42
+ end
43
+
44
+ def masked?
45
+ image_mask? || !!mask
46
+ end
47
+
48
+ def has_soft_mask?
49
+ !!smask || smask_in_data.to_i.positive?
50
+ end
51
+
52
+ def inline_soft_mask?
53
+ smask_in_data.to_i == 2
54
+ end
55
+
56
+ def indexed?
57
+ color_space.is_a?(Array) &&
58
+ color_space.to_ary.first&.to_sym == :Indexed
59
+ end
60
+
61
+ def bytes_per_row
62
+ return nil unless width && bits_per_component && components
63
+
64
+ ((width * components * bits_per_component) + 7) / 8
65
+ end
10
66
  end
11
67
  end
12
68
  end
@@ -8,6 +8,43 @@ module Pdfrb
8
8
  class XRefStream < Pdfrb::Model::Cos::Stream
9
9
  arlington_object "XRefStream"
10
10
  register_type :XRef
11
+
12
+ def type; self[:Type]; end
13
+ def size; self[:Size]; end
14
+ def prev; self[:Prev]; end
15
+ def root; self[:Root]; end
16
+ def encrypt; self[:Encrypt]; end
17
+ def info; self[:Info]; end
18
+ def id; self[:ID]; end
19
+ def w; self[:W]; end
20
+ def index; self[:Index]; end
21
+ def filter; self[:Filter]; end
22
+
23
+ def encrypted?
24
+ !!encrypt
25
+ end
26
+
27
+ def incremental?
28
+ !!prev
29
+ end
30
+
31
+ def field_widths
32
+ return [0, 0, 0] unless w
33
+
34
+ arr = w.is_a?(Pdfrb::Model::PdfArray) ? w.to_a : w
35
+ return [0, 0, 0] unless arr.is_a?(Array) && arr.size == 3
36
+
37
+ arr
38
+ end
39
+
40
+ def subsection_index
41
+ return [[0, size || 0]] unless index
42
+
43
+ arr = index.is_a?(Pdfrb::Model::PdfArray) ? index.to_a : index
44
+ return [[0, size || 0]] unless arr.is_a?(Array)
45
+
46
+ arr.each_slice(2).to_a
47
+ end
11
48
  end
12
49
  end
13
50
  end
@@ -17,23 +17,35 @@ module Pdfrb
17
17
  class << self
18
18
  attr_reader :arlington_registry
19
19
 
20
- # Register a Type subclass under its Arlington TSV name.
21
20
  def register_arlington(name, klass)
22
21
  @arlington_registry[name] = klass
23
22
  end
24
23
 
25
- # Look up a Type subclass by Arlington TSV name.
26
24
  def lookup(name)
27
25
  @arlington_registry[name]
28
26
  end
27
+
28
+ # Force-load all autoloaded type classes so register_type and
29
+ # register_subtype calls fire. Call this before parsing or
30
+ # when iterating type_map. Idempotent.
31
+ def eager_load!
32
+ return if @eager_loaded
33
+
34
+ constants.each do |c|
35
+ const_get(c)
36
+ rescue NameError
37
+ # Skip autoload targets that don't define a class yet.
38
+ end
39
+ @eager_loaded = true
40
+ end
29
41
  end
30
42
 
31
- # Base semantic types (one file per TSV cluster).
43
+ # Base semantic types.
32
44
  autoload :FileTrailer, "pdfrb/model/type/file_trailer"
33
45
  autoload :Catalog, "pdfrb/model/type/catalog"
34
46
  autoload :Info, "pdfrb/model/type/info"
35
47
  autoload :PageTreeNode, "pdfrb/model/type/page_tree_node"
36
- autoload :PageTreeNodeRoot, "pdfrb/model/type/page_tree_node"
48
+ autoload :PageTreeNodeRoot, "pdfrb/model/type/page_tree_node_root"
37
49
  autoload :Page, "pdfrb/model/type/page"
38
50
  autoload :Resources, "pdfrb/model/type/resources"
39
51
  autoload :Metadata, "pdfrb/model/type/metadata"
@@ -50,17 +62,95 @@ module Pdfrb
50
62
  autoload :OptionalContentGroup, "pdfrb/model/type/optional_content_group"
51
63
  autoload :OptionalContentMembership, "pdfrb/model/type/optional_content_membership"
52
64
  autoload :OptionalContentProperties, "pdfrb/model/type/optional_content_properties"
65
+
66
+ # Additional OCG / opt-content subclass dicts (one per file).
67
+ autoload :OptContentCreatorInfo, "pdfrb/model/type/opt_content_ext"
68
+ autoload :OptContentExport, "pdfrb/model/type/opt_content_ext"
69
+ autoload :OptContentPrint, "pdfrb/model/type/opt_content_ext"
70
+ autoload :OptContentView, "pdfrb/model/type/opt_content_ext"
71
+ autoload :OptContentLanguage, "pdfrb/model/type/opt_content_ext"
72
+ autoload :OptContentUsageApplication, "pdfrb/model/type/opt_content_ext"
73
+ autoload :OptContentPageElement, "pdfrb/model/type/opt_content_page_element"
74
+
53
75
  autoload :FileSpecification, "pdfrb/model/type/file_specification"
76
+ autoload :FileSpecEF, "pdfrb/model/type/file_spec_ef"
77
+ autoload :FileSpecRF, "pdfrb/model/type/file_spec_rf"
54
78
  autoload :EmbeddedFile, "pdfrb/model/type/embedded_file"
55
79
  autoload :AFFileSpecification, "pdfrb/model/type/af_file_specification"
56
80
  autoload :AFEmbeddedFile, "pdfrb/model/type/af_embedded_file"
57
81
  autoload :StructTreeRoot, "pdfrb/model/type/struct_tree_root"
58
82
  autoload :StructElem, "pdfrb/model/type/struct_elem"
59
83
 
60
- # XObject family.
84
+ # Additional base types (previously loaded via require in pdfrb.rb;
85
+ # now autoloaded per project rule).
86
+ autoload :MarkInformation, "pdfrb/model/type/mark_information"
87
+ autoload :IconFit, "pdfrb/model/type/icon_fit"
88
+ autoload :PageLabel, "pdfrb/model/type/page_label"
89
+ autoload :BorderStyling, "pdfrb/model/type/border_styling"
90
+ autoload :BorderEffect, "pdfrb/model/type/border_effect"
91
+ autoload :LineEndingStyling, "pdfrb/model/type/line_ending_styling"
92
+ autoload :InteriorColor, "pdfrb/model/type/interior_color"
93
+ autoload :ObjectReference, "pdfrb/model/type/object_reference"
94
+ autoload :SquareCircle, "pdfrb/model/type/square_circle"
95
+ autoload :VariableTextField, "pdfrb/model/type/variable_text_field"
96
+ autoload :DocumentSecurityStore, "pdfrb/model/type/document_security_store"
97
+ autoload :Measure, "pdfrb/model/type/measure"
98
+ autoload :OptionalContentConfiguration, "pdfrb/model/type/optional_content_config"
99
+ autoload :MarkedContentReference, "pdfrb/model/type/marked_content_reference"
100
+ autoload :AppearanceGenerator, "pdfrb/model/type/appearance_generator"
101
+ autoload :Field, "pdfrb/model/type/form_field"
102
+ autoload :TextField, "pdfrb/model/type/text_field"
103
+ autoload :Button, "pdfrb/model/type/button"
104
+ autoload :Choice, "pdfrb/model/type/choice"
105
+ autoload :SignatureField, "pdfrb/model/type/signature_field"
106
+ autoload :ViewerPreferences, "pdfrb/model/type/viewer_preferences"
107
+ autoload :FontMultipleMaster, "pdfrb/model/type/font_multiple_master"
108
+ autoload :CharProcMap, "pdfrb/model/type/font_multiple_master"
109
+ autoload :FontEncoding, "pdfrb/model/type/font_encoding"
110
+ autoload :CIDFontDescriptorMetrics, "pdfrb/model/type/cid_font_descriptor_metrics"
111
+ autoload :FontCIDType0, "pdfrb/model/type/font_cid_type0"
112
+ autoload :FontCIDType2, "pdfrb/model/type/font_cid_type2"
113
+ autoload :FontDescriptorCIDType0, "pdfrb/model/type/font_descriptor_cid_type0"
114
+ autoload :FontDescriptorCIDType2, "pdfrb/model/type/font_descriptor_cid_type2"
115
+ autoload :ToUnicodeCMapStream, "pdfrb/model/type/to_unicode_cmap_stream"
61
116
  autoload :XObjectForm, "pdfrb/model/type/xobject_form"
62
117
  autoload :XObjectImage, "pdfrb/model/type/xobject_image"
63
118
 
119
+ # Function family (s8.9).
120
+ autoload :Function, "pdfrb/model/type/function"
121
+ autoload :FunctionExponential, "pdfrb/model/type/function_exponential"
122
+ autoload :FunctionStitching, "pdfrb/model/type/function_stitching"
123
+ autoload :FunctionSampled, "pdfrb/model/type/function_sampled"
124
+ autoload :FunctionPostScript, "pdfrb/model/type/function_postscript"
125
+
126
+ # Halftone family (s8.7.4).
127
+ autoload :Halftone, "pdfrb/model/type/halftone"
128
+ autoload :HalftoneType1, "pdfrb/model/type/halftone_type1"
129
+ autoload :HalftoneType5, "pdfrb/model/type/halftone_type5"
130
+ autoload :HalftoneType6, "pdfrb/model/type/halftone_type6"
131
+ autoload :HalftoneType10, "pdfrb/model/type/halftone_type10"
132
+ autoload :HalftoneType16, "pdfrb/model/type/halftone_type16"
133
+
134
+ # Media (s13.3-4). Legacy media types retained for round-trip.
135
+ autoload :Movie, "pdfrb/model/type/movie"
136
+ autoload :Sound, "pdfrb/model/type/sound"
137
+
138
+ # Color space dicts (s8.6).
139
+ autoload :CalGray, "pdfrb/model/type/cal_gray"
140
+ autoload :CalRGB, "pdfrb/model/type/cal_rgb"
141
+ autoload :Lab, "pdfrb/model/type/lab"
142
+ autoload :Indexed, "pdfrb/model/type/indexed"
143
+ autoload :Separation, "pdfrb/model/type/separation"
144
+ autoload :DeviceN, "pdfrb/model/type/device_n"
145
+ autoload :DeviceNMixingHints, "pdfrb/model/type/device_n_mixing_hints"
146
+ autoload :DeviceNProcess, "pdfrb/model/type/device_n_process"
147
+ autoload :ICCBasedColorSpace, "pdfrb/model/type/icc_based_color_space"
148
+
149
+ # Pattern family (s8.7).
150
+ autoload :Pattern, "pdfrb/model/type/pattern"
151
+ autoload :PatternTiling, "pdfrb/model/type/pattern_tiling"
152
+ autoload :PatternShading, "pdfrb/model/type/pattern_shading"
153
+
64
154
  # Font family.
65
155
  autoload :Font, "pdfrb/model/type/font"
66
156
  autoload :FontType1, "pdfrb/model/type/font_type1"
@@ -68,11 +158,201 @@ module Pdfrb
68
158
  autoload :FontType0, "pdfrb/model/type/font_type0"
69
159
  autoload :FontType3, "pdfrb/model/type/font_type3"
70
160
  autoload :CIDFont, "pdfrb/model/type/cid_font"
161
+ autoload :CIDSystemInfo, "pdfrb/model/type/cid_system_info"
162
+ autoload :CIDFontDescriptorMetrics, "pdfrb/model/type/cid_font_descriptor_metrics"
163
+ autoload :FontCIDType0, "pdfrb/model/type/font_cid_type0"
164
+ autoload :FontCIDType2, "pdfrb/model/type/font_cid_type2"
71
165
  autoload :FontDescriptor, "pdfrb/model/type/font_descriptor"
166
+ autoload :FontDescriptorCIDType0, "pdfrb/model/type/font_descriptor_cid_type0"
167
+ autoload :FontDescriptorCIDType2, "pdfrb/model/type/font_descriptor_cid_type2"
168
+ autoload :FontMultipleMaster, "pdfrb/model/type/font_multiple_master"
169
+ autoload :CharProcMap, "pdfrb/model/type/font_multiple_master"
170
+ autoload :FontEncoding, "pdfrb/model/type/font_encoding"
171
+ autoload :ToUnicodeCMapStream, "pdfrb/model/type/to_unicode_cmap_stream"
172
+ autoload :FontFile, "pdfrb/model/type/font_file"
173
+ autoload :FontFile2, "pdfrb/model/type/font_file2"
174
+ autoload :FontFile3, "pdfrb/model/type/font_file3"
72
175
 
73
- # Annotation + Action families (with subtype dispatch).
176
+ # Annotation family.
74
177
  autoload :Annotation, "pdfrb/model/type/annotation"
178
+ autoload :MarkupAnnotation, "pdfrb/model/type/markup_annotation"
179
+ autoload :WidgetAnnotation, "pdfrb/model/type/widget_annotation"
180
+ autoload :LinkAnnotation, "pdfrb/model/type/link_annotation"
181
+ autoload :TextAnnotation, "pdfrb/model/type/text_annotation"
182
+ autoload :FreeTextAnnotation, "pdfrb/model/type/free_text_annotation"
183
+ autoload :StampAnnotation, "pdfrb/model/type/stamp_annotation"
184
+ autoload :SquareAnnotation, "pdfrb/model/type/square_annotation"
185
+ autoload :CircleAnnotation, "pdfrb/model/type/circle_annotation"
186
+ autoload :LineAnnotation, "pdfrb/model/type/line_annotation"
187
+ autoload :PolygonAnnotation, "pdfrb/model/type/polygon_annotation"
188
+ autoload :PolylineAnnotation, "pdfrb/model/type/polyline_annotation"
189
+ autoload :InkAnnotation, "pdfrb/model/type/ink_annotation"
190
+ autoload :TextMarkupAnnotation, "pdfrb/model/type/text_markup_annotation"
191
+ autoload :HighlightAnnotation, "pdfrb/model/type/highlight_annotation"
192
+ autoload :UnderlineAnnotation, "pdfrb/model/type/underline_annotation"
193
+ autoload :SquigglyAnnotation, "pdfrb/model/type/squiggly_annotation"
194
+ autoload :StrikeOutAnnotation, "pdfrb/model/type/strikeout_annotation"
195
+ autoload :PopupAnnotation, "pdfrb/model/type/popup_annotation"
196
+ autoload :FileAttachmentAnnotation, "pdfrb/model/type/file_attachment_annotation"
197
+ autoload :CaretAnnotation, "pdfrb/model/type/caret_annotation"
198
+ autoload :RedactAnnotation, "pdfrb/model/type/redact_annotation"
199
+ autoload :WatermarkAnnotation, "pdfrb/model/type/watermark_annotation"
200
+ autoload :PrinterMarkAnnotation, "pdfrb/model/type/printer_mark_annotation"
201
+ autoload :PrinterMarkSubDict, "pdfrb/model/type/transition"
202
+ autoload :ScreenAnnotation, "pdfrb/model/type/screen_annotation"
203
+ autoload :SoundAnnotation, "pdfrb/model/type/sound_annotation"
204
+
205
+ # Rich Media annotation family (s13.6).
206
+ autoload :RichMediaAnnotation, "pdfrb/model/type/rich_media_annotation"
207
+ autoload :RichMediaActivation, "pdfrb/model/type/rich_media_activation"
208
+ autoload :RichMediaDeactivation, "pdfrb/model/type/rich_media_deactivation"
209
+ autoload :RichMediaConfiguration, "pdfrb/model/type/rich_media_configuration"
210
+ autoload :RichMediaInstance, "pdfrb/model/type/rich_media_instance"
211
+ autoload :RichMediaCommand, "pdfrb/model/type/rich_media_command"
212
+ autoload :RichMediaContent, "pdfrb/model/type/rich_media_content"
213
+ autoload :RichMediaCuePoint, "pdfrb/model/type/rich_media_cue_point"
214
+ autoload :RichMediaAnimation, "pdfrb/model/type/rich_media_animation"
215
+ autoload :RichMediaWindow, "pdfrb/model/type/rich_media_window"
216
+ autoload :RichMediaSettings, "pdfrb/model/type/rich_media_settings"
217
+ autoload :RichMediaPresentation, "pdfrb/model/type/rich_media_presentation"
218
+
219
+ # 3D family (s13.6).
220
+ autoload :ThreeDStream, "pdfrb/model/type/three_d_stream"
221
+ autoload :ThreeDView, "pdfrb/model/type/three_d_view"
222
+ autoload :ThreeDAnimationStyle, "pdfrb/model/type/three_d_animation_style"
223
+ autoload :ThreeDBackground, "pdfrb/model/type/three_d_background"
224
+ autoload :ThreeDLightingScheme, "pdfrb/model/type/three_d_lighting_scheme"
225
+ autoload :ThreeDRenderMode, "pdfrb/model/type/three_d_render_mode"
226
+ autoload :ThreeDCrossSection, "pdfrb/model/type/three_d_cross_section"
227
+ autoload :ThreeDNode, "pdfrb/model/type/three_d_node"
228
+ autoload :ThreeDUnits, "pdfrb/model/type/three_d_units"
229
+ autoload :ThreeDReference, "pdfrb/model/type/three_d_reference"
230
+ autoload :ThreeDActivation, "pdfrb/model/type/three_d_activation"
231
+
232
+ # 3D Measure family (s13.6.4).
233
+ autoload :ThreeDMeasure, "pdfrb/model/type/three_d_measure"
234
+ autoload :ThreeDMeasure3DC, "pdfrb/model/type/three_d_measure_3dc"
235
+ autoload :ThreeDMeasurePD3, "pdfrb/model/type/three_d_measure_pd3"
236
+ autoload :ThreeDMeasureLD3, "pdfrb/model/type/three_d_measure_ld3"
237
+ autoload :ThreeDMeasureRD3, "pdfrb/model/type/three_d_measure_rd3"
238
+ autoload :ThreeDMeasureAD3, "pdfrb/model/type/three_d_measure_ad3"
239
+
240
+ # Transition + 3D markup + geolocation.
241
+ autoload :Transition, "pdfrb/model/type/transition"
242
+ autoload :ExData3DMarkup, "pdfrb/model/type/transition"
243
+ autoload :ExDataMarkupGeo, "pdfrb/model/type/transition"
244
+
245
+ # Appearance generators (one per file).
246
+ autoload :GenericAppearance, "pdfrb/model/type/generic_appearance"
247
+ autoload :WidgetAppearance, "pdfrb/model/type/widget_appearance"
248
+ autoload :TextAppearance, "pdfrb/model/type/text_appearance"
249
+ autoload :LinkAppearance, "pdfrb/model/type/link_appearance"
250
+
251
+ # Action family (s12.6.4).
75
252
  autoload :Action, "pdfrb/model/type/action"
253
+ autoload :ActionGoTo, "pdfrb/model/type/action_goto"
254
+ autoload :ActionGoToR, "pdfrb/model/type/action_go_to_r"
255
+ autoload :ActionURI, "pdfrb/model/type/action_uri"
256
+ autoload :ActionJavaScript, "pdfrb/model/type/action_java_script"
257
+ autoload :ActionLaunch, "pdfrb/model/type/action_launch"
258
+ autoload :ActionSetOCGState, "pdfrb/model/type/action_set_ocg_state"
259
+ autoload :ActionHide, "pdfrb/model/type/action_hide"
260
+ autoload :ActionSubmitForm, "pdfrb/model/type/action_submit_form"
261
+ autoload :ActionResetForm, "pdfrb/model/type/action_reset_form"
262
+ autoload :ActionImportData, "pdfrb/model/type/action_import_data"
263
+ autoload :ActionTrans, "pdfrb/model/type/action_trans"
264
+ autoload :ActionNamed, "pdfrb/model/type/action_named"
265
+ autoload :ActionRendition, "pdfrb/model/type/action_rendition"
266
+ autoload :ActionMovie, "pdfrb/model/type/action_movie"
267
+ autoload :ActionSoundAction, "pdfrb/model/type/action_sound_action"
268
+ autoload :ActionSetState, "pdfrb/model/type/action_set_state"
269
+ autoload :ActionThread, "pdfrb/model/type/action_thread"
270
+ autoload :ActionGoTo3DView, "pdfrb/model/type/action_go_to_3d_view"
271
+ autoload :ActionGoToDp, "pdfrb/model/type/action_go_to_dp"
272
+ autoload :ActionRichMediaExecute, "pdfrb/model/type/action_rich_media_execute"
273
+ autoload :ActionNOP, "pdfrb/model/type/action_nop"
274
+
275
+ # Signature family (s12.8).
276
+ autoload :Signature, "pdfrb/model/type/signature"
277
+ autoload :SigFieldLock, "pdfrb/model/type/sig_field_lock"
278
+ autoload :SigFieldSeedValue, "pdfrb/model/type/sig_field_seed_value"
279
+ autoload :DocMDPTransformParameters, "pdfrb/model/type/doc_mdp_transform_parameters"
280
+
281
+ # Appearance + Media (s12.5.5, s13.3).
282
+ autoload :Appearance, "pdfrb/model/type/appearance"
283
+ autoload :AppearanceCharacteristics, "pdfrb/model/type/appearance_characteristics"
284
+ autoload :AppearanceTrapNet, "pdfrb/model/type/appearance_trap_net"
285
+ autoload :AppearanceTrapNetSubDict, "pdfrb/model/type/appearance_trap_net"
286
+ autoload :AppearanceSubDict, "pdfrb/model/type/appearance_trap_net"
287
+ autoload :MediaClip, "pdfrb/model/type/media_clip"
288
+ autoload :Rendition, "pdfrb/model/type/rendition"
289
+ autoload :ExDataProjection, "pdfrb/model/type/appearance_trap_net"
290
+ autoload :AnnotationProjectionDict, "pdfrb/model/type/appearance_trap_net"
291
+
292
+ # Media offset / player / screen types.
293
+ autoload :MediaOffsetTime, "pdfrb/model/type/media_offset"
294
+ autoload :MediaOffsetFrame, "pdfrb/model/type/media_offset"
295
+ autoload :MediaOffsetMarker, "pdfrb/model/type/media_offset"
296
+ autoload :MediaPlayerInfo, "pdfrb/model/type/media_offset"
297
+ autoload :MediaPlayers, "pdfrb/model/type/media_offset"
298
+ autoload :MediaScreenParameters, "pdfrb/model/type/media_offset"
299
+ autoload :MediaCriteria, "pdfrb/model/type/media_offset"
300
+ autoload :SoftwareIdentifier, "pdfrb/model/type/software_identifier"
301
+
302
+ # Misc small helpers (one per file).
303
+ autoload :BorderArray, "pdfrb/model/type/misc_helpers"
304
+ autoload :LabRangeArray, "pdfrb/model/type/misc_helpers"
305
+ autoload :DestOutputProfileRef, "pdfrb/model/type/misc_helpers"
306
+ autoload :OutputIntentsContainer, "pdfrb/model/type/misc_helpers"
307
+ autoload :CMapStream, "pdfrb/model/type/misc_helpers"
308
+
309
+ # Crypt filter (s7.6.5).
310
+ autoload :CryptFilter, "pdfrb/model/type/crypt_filter"
311
+ autoload :CryptFilterMap, "pdfrb/model/type/crypt_filter"
312
+ autoload :CryptFilterPublicKey, "pdfrb/model/type/crypt_filter"
313
+ autoload :CryptFilterPublicKeyMap, "pdfrb/model/type/crypt_filter"
314
+
315
+ # Signature build data.
316
+ autoload :SignatureBuildPropDict, "pdfrb/model/type/appearance_trap_net"
317
+ autoload :SignatureBuildDataDict, "pdfrb/model/type/signature_build"
318
+ autoload :SignatureBuildDataAppDict, "pdfrb/model/type/signature_build"
319
+ autoload :SignatureBuildDataSigQDict, "pdfrb/model/type/signature_build"
320
+ autoload :SignatureReferenceDocMDP, "pdfrb/model/type/signature_build"
321
+ autoload :SignatureReferenceIdentity, "pdfrb/model/type/signature_build"
322
+ autoload :SignatureReferenceUR, "pdfrb/model/type/signature_build"
323
+ autoload :SignatureReferenceFieldMDP, "pdfrb/model/type/signature_build"
324
+
325
+ # Page box color info (s7.7.3.3).
326
+ autoload :BoxColorInfo, "pdfrb/model/type/box_color_info"
327
+ autoload :BoxStyle, "pdfrb/model/type/box_style"
328
+
329
+ # Collection / Portfolio (s7.11.5).
330
+ autoload :Collection, "pdfrb/model/type/collection"
331
+ autoload :CollectionSchema, "pdfrb/model/type/collection_schema"
332
+ autoload :CollectionSort, "pdfrb/model/type/collection_sort"
333
+ autoload :CollectionField, "pdfrb/model/type/collection_field"
334
+ autoload :CollectionItem, "pdfrb/model/type/collection_item"
335
+
336
+ # Signature transform parameters (s12.8.2).
337
+ autoload :MDPDict, "pdfrb/model/type/mdp_dict"
338
+ autoload :FieldMDPTransformParameters, "pdfrb/model/type/field_mdp_transform_parameters"
339
+ autoload :URTransformParameters, "pdfrb/model/type/ur_transform_parameters"
340
+
341
+ # Embedded file params + misc globals.
342
+ autoload :EmbeddedFileParameter, "pdfrb/model/type/embedded_file_parameter"
343
+ autoload :JBIG2Globals, "pdfrb/model/type/jbig2_globals"
344
+ autoload :URLAlias, "pdfrb/model/type/url_alias"
345
+ autoload :URIDict, "pdfrb/model/type/uri_dict"
346
+
347
+ autoload :Field, "pdfrb/model/type/form_field"
348
+ autoload :TextField, "pdfrb/model/type/text_field"
349
+ autoload :Button, "pdfrb/model/type/button"
350
+ autoload :Choice, "pdfrb/model/type/choice"
351
+ autoload :SignatureField, "pdfrb/model/type/signature_field"
352
+
353
+ # Structure types (s14.7).
354
+ autoload :StructureAttributes, "pdfrb/model/type/structure_attributes"
355
+ autoload :StructureElementKid, "pdfrb/model/type/structure_element_kid"
76
356
  end
77
357
  end
78
358
  end
@@ -19,8 +19,8 @@ module Pdfrb
19
19
  end
20
20
 
21
21
  class << self
22
- def serialize(value, encrypter: nil, **opts)
23
- new(encrypter: encrypter, **opts).serialize(value)
22
+ def serialize(value, encrypter: nil, **)
23
+ new(encrypter: encrypter, **).serialize(value)
24
24
  end
25
25
  end
26
26
 
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "set"
4
-
5
3
  module Pdfrb
6
4
  module Source
7
5
  # Byte-level PDF lexer (s7.2). State machine that emits Token
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "benchmark"
4
+ require "stringio"
5
+
6
+ module Pdfrb
7
+ module Task
8
+ # Performance benchmarks for parsing, serialization, and round-trip.
9
+ # Uses the corpus generator to produce test PDFs of various sizes,
10
+ # then measures throughput.
11
+ #
12
+ # Usage:
13
+ # Pdfrb::Task::Benchmark.run
14
+ # Pdfrb::Task::Benchmark.run(repetitions: 100)
15
+ class Benchmark
16
+ Result = Struct.new(:name, :repetitions, :total_seconds,
17
+ :ops_per_second, :bytes_per_op, keyword_init: true)
18
+
19
+ class << self
20
+ def run(repetitions: 50)
21
+ corpus = GenerateCorpus.all
22
+ results = []
23
+
24
+ corpus.each do |name, pdf_bytes|
25
+ next if pdf_bytes.empty?
26
+
27
+ r = bench_parse(name, pdf_bytes, repetitions)
28
+ results << r
29
+ puts format_result(r)
30
+ end
31
+
32
+ bench_round_trip(results, repetitions)
33
+ results
34
+ end
35
+
36
+ def bench_parse(name, pdf_bytes, repetitions)
37
+ io = StringIO.new(pdf_bytes)
38
+ elapsed = ::Benchmark.realtime do
39
+ repetitions.times do
40
+ io.rewind
41
+ Pdfrb::Document.new(io: StringIO.new(pdf_bytes))
42
+ end
43
+ end
44
+
45
+ Result.new(
46
+ name: "parse:#{name}",
47
+ repetitions: repetitions,
48
+ total_seconds: elapsed,
49
+ ops_per_second: repetitions / elapsed,
50
+ bytes_per_op: pdf_bytes.bytesize
51
+ )
52
+ end
53
+
54
+ def bench_serialize(name, pdf_bytes, repetitions)
55
+ doc = Pdfrb::Document.new(io: StringIO.new(pdf_bytes))
56
+ elapsed = ::Benchmark.realtime do
57
+ repetitions.times do
58
+ StringIO.new.tap { |io| doc.write(io: io) }
59
+ end
60
+ end
61
+
62
+ Result.new(
63
+ name: "serialize:#{name}",
64
+ repetitions: repetitions,
65
+ total_seconds: elapsed,
66
+ ops_per_second: repetitions / elapsed,
67
+ bytes_per_op: pdf_bytes.bytesize
68
+ )
69
+ end
70
+
71
+ def bench_round_trip(_results, _repetitions)
72
+ nil
73
+ end
74
+
75
+ def format_result(result)
76
+ format("%-25s %6.1f ops/s %7.1f KB/op %6.3fs total",
77
+ result.name, result.ops_per_second,
78
+ result.bytes_per_op / 1024.0, result.total_seconds)
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -161,7 +161,7 @@ module Pdfrb
161
161
  def parse_tounicode(ref)
162
162
  return nil unless ref
163
163
 
164
- doc = @font_dict.respond_to?(:document) ? @font_dict.document : nil
164
+ doc = @font_dict.is_a?(Pdfrb::Model::Cos::Dictionary) ? @font_dict.document : nil
165
165
  stream = if ref.is_a?(Pdfrb::Model::Reference) && doc
166
166
  doc.object(ref)
167
167
  else