pdfrb 0.3.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/CHANGELOG.md +51 -0
  4. data/Gemfile +1 -0
  5. data/PROPOSAL.canvas-clip.md +92 -0
  6. data/PROPOSAL.canvas-draw-image-matrix.md +87 -0
  7. data/PROPOSAL.canvas-rich-text.md +103 -0
  8. data/PROPOSAL.canvas-text-lines.md +77 -0
  9. data/PROPOSAL.canvas-transparency.md +106 -0
  10. data/PROPOSAL.external-font-metrics.md +129 -0
  11. data/PROPOSAL.font-embedding-fontfile2.md +88 -0
  12. data/PROPOSAL.font-resolver-ttc.md +105 -0
  13. data/PROPOSAL.font-resolver.md +96 -0
  14. data/PROPOSAL.font-subsetting.md +98 -0
  15. data/PROPOSAL.gradient-shadings.md +110 -0
  16. data/PROPOSAL.page-mediabox-setter.md +66 -0
  17. data/PROPOSAL.per-glyph-width.md +91 -0
  18. data/PROPOSAL.stringio-require.md +53 -0
  19. data/PROPOSAL.struct-tree-root.md +102 -0
  20. data/PROPOSAL.text-measurement.md +93 -0
  21. data/PROPOSAL.ttf-table-parsing-fix.md +112 -0
  22. data/RELEASE.md +61 -0
  23. data/data/pdfrb/afm/Courier-Bold.afm +342 -342
  24. data/data/pdfrb/afm/Courier-BoldOblique.afm +342 -342
  25. data/data/pdfrb/afm/Courier-Oblique.afm +342 -342
  26. data/data/pdfrb/afm/Courier.afm +342 -342
  27. data/data/pdfrb/afm/Helvetica-Bold.afm +2827 -2827
  28. data/data/pdfrb/afm/Helvetica-BoldOblique.afm +2827 -2827
  29. data/data/pdfrb/afm/Helvetica-Oblique.afm +3051 -3051
  30. data/data/pdfrb/afm/Helvetica.afm +3051 -3051
  31. data/data/pdfrb/afm/Symbol.afm +213 -213
  32. data/data/pdfrb/afm/Times-Bold.afm +2588 -2588
  33. data/data/pdfrb/afm/Times-BoldItalic.afm +2384 -2384
  34. data/data/pdfrb/afm/Times-Italic.afm +2667 -2667
  35. data/data/pdfrb/afm/Times-Roman.afm +2419 -2419
  36. data/data/pdfrb/afm/ZapfDingbats.afm +225 -225
  37. data/lib/pdfrb/action/base.rb +21 -0
  38. data/lib/pdfrb/action/types.rb +178 -0
  39. data/lib/pdfrb/action.rb +55 -0
  40. data/lib/pdfrb/annotation/base.rb +79 -0
  41. data/lib/pdfrb/annotation/types.rb +222 -0
  42. data/lib/pdfrb/annotation.rb +78 -0
  43. data/lib/pdfrb/appearance/generator.rb +216 -0
  44. data/lib/pdfrb/appearance.rb +11 -0
  45. data/lib/pdfrb/arlington/object_definition.rb +2 -2
  46. data/lib/pdfrb/arlington/predicate/evaluator.rb +1 -1
  47. data/lib/pdfrb/arlington/predicate/functions.rb +25 -9
  48. data/lib/pdfrb/arlington/predicate.rb +1 -5
  49. data/lib/pdfrb/cli/batch.rb +18 -0
  50. data/lib/pdfrb/cli/debug_info.rb +18 -0
  51. data/lib/pdfrb/cli/files.rb +16 -0
  52. data/lib/pdfrb/cli/fonts.rb +16 -0
  53. data/lib/pdfrb/cli/form.rb +18 -0
  54. data/lib/pdfrb/cli/image2pdf.rb +18 -0
  55. data/lib/pdfrb/cli/images.rb +34 -0
  56. data/lib/pdfrb/cli/info.rb +20 -0
  57. data/lib/pdfrb/cli/inspect.rb +18 -0
  58. data/lib/pdfrb/cli/merge.rb +18 -0
  59. data/lib/pdfrb/cli/modify.rb +18 -0
  60. data/lib/pdfrb/cli/optimize.rb +18 -0
  61. data/lib/pdfrb/cli/split.rb +21 -0
  62. data/lib/pdfrb/cli/watermark.rb +18 -0
  63. data/lib/pdfrb/cli.rb +291 -7
  64. data/lib/pdfrb/color/color_space.rb +259 -0
  65. data/lib/pdfrb/color/icc_profile.rb +90 -0
  66. data/lib/pdfrb/color.rb +12 -0
  67. data/lib/pdfrb/compare/comparator.rb +244 -0
  68. data/lib/pdfrb/compare/report.rb +78 -0
  69. data/lib/pdfrb/compare.rb +42 -0
  70. data/lib/pdfrb/composer.rb +161 -0
  71. data/lib/pdfrb/conformance/pdf_a.rb +317 -56
  72. data/lib/pdfrb/conformance/pdf_ua.rb +186 -29
  73. data/lib/pdfrb/conformance/pdf_x.rb +247 -0
  74. data/lib/pdfrb/conformance/rule.rb +78 -0
  75. data/lib/pdfrb/conformance/structure_elements.rb +174 -0
  76. data/lib/pdfrb/conformance/verapdf_bridge.rb +92 -0
  77. data/lib/pdfrb/conformance.rb +7 -3
  78. data/lib/pdfrb/content/canvas.rb +354 -72
  79. data/lib/pdfrb/content/color_space.rb +157 -0
  80. data/lib/pdfrb/content/hidden_text_detector.rb +167 -0
  81. data/lib/pdfrb/content/operator.rb +21 -1
  82. data/lib/pdfrb/content/operators/clipping.rb +36 -0
  83. data/lib/pdfrb/content/operators/graphics_state_params.rb +15 -0
  84. data/lib/pdfrb/content/operators/inline_image.rb +53 -0
  85. data/lib/pdfrb/content/operators.rb +22 -0
  86. data/lib/pdfrb/content/shading/base.rb +139 -0
  87. data/lib/pdfrb/content/shading.rb +17 -0
  88. data/lib/pdfrb/content/smart_text_extractor.rb +85 -0
  89. data/lib/pdfrb/content/tiling_pattern.rb +78 -0
  90. data/lib/pdfrb/content/transformation_matrix.rb +61 -0
  91. data/lib/pdfrb/content.rb +7 -26
  92. data/lib/pdfrb/destination/fit.rb +185 -0
  93. data/lib/pdfrb/destination.rb +13 -0
  94. data/lib/pdfrb/digital_signature/cms_handler.rb +22 -0
  95. data/lib/pdfrb/digital_signature/signing.rb +107 -11
  96. data/lib/pdfrb/digital_signature/timestamp_handler.rb +45 -0
  97. data/lib/pdfrb/digital_signature/verification.rb +88 -9
  98. data/lib/pdfrb/digital_signature/verification_result.rb +14 -0
  99. data/lib/pdfrb/digital_signature.rb +26 -2
  100. data/lib/pdfrb/document/annotations.rb +120 -3
  101. data/lib/pdfrb/document/associated_files.rb +104 -0
  102. data/lib/pdfrb/document/colors.rb +95 -0
  103. data/lib/pdfrb/document/destinations.rb +127 -5
  104. data/lib/pdfrb/document/display.rb +84 -0
  105. data/lib/pdfrb/document/fonts.rb +417 -45
  106. data/lib/pdfrb/document/form.rb +338 -0
  107. data/lib/pdfrb/document/graphics_state.rb +91 -0
  108. data/lib/pdfrb/document/images.rb +4 -4
  109. data/lib/pdfrb/document/info.rb +102 -0
  110. data/lib/pdfrb/document/layers.rb +62 -0
  111. data/lib/pdfrb/document/metadata.rb +12 -5
  112. data/lib/pdfrb/document/output_intents.rb +91 -0
  113. data/lib/pdfrb/document/page_labels.rb +80 -0
  114. data/lib/pdfrb/document/pages.rb +68 -19
  115. data/lib/pdfrb/document/portfolio.rb +119 -0
  116. data/lib/pdfrb/document/shadings.rb +159 -0
  117. data/lib/pdfrb/document/stamps.rb +68 -0
  118. data/lib/pdfrb/document/structure.rb +242 -0
  119. data/lib/pdfrb/document.rb +73 -4
  120. data/lib/pdfrb/encryption/identity.rb +13 -0
  121. data/lib/pdfrb/encryption/password_verification.rb +53 -8
  122. data/lib/pdfrb/encryption/security_handler.rb +8 -5
  123. data/lib/pdfrb/encryption/standard_security_handler.rb +154 -81
  124. data/lib/pdfrb/encryption.rb +17 -0
  125. data/lib/pdfrb/error.rb +2 -2
  126. data/lib/pdfrb/filter/brotli_decode.rb +32 -0
  127. data/lib/pdfrb/filter/ccitt_fax_decode.rb +12 -0
  128. data/lib/pdfrb/filter/crypt.rb +2 -2
  129. data/lib/pdfrb/filter/dct_decode.rb +18 -0
  130. data/lib/pdfrb/filter/flate_decode.rb +4 -18
  131. data/lib/pdfrb/filter/jbig2_decode.rb +12 -0
  132. data/lib/pdfrb/filter/jpx_decode.rb +18 -0
  133. data/lib/pdfrb/filter/lzw_decode.rb +3 -2
  134. data/lib/pdfrb/filter/png_predictor.rb +94 -0
  135. data/lib/pdfrb/filter.rb +26 -13
  136. data/lib/pdfrb/font/afm_parser.rb +50 -26
  137. data/lib/pdfrb/font/cmap/writer.rb +9 -0
  138. data/lib/pdfrb/font/encoding/win_ansi_encoding.rb +17 -0
  139. data/lib/pdfrb/font/encoding.rb +32 -3
  140. data/lib/pdfrb/font/metrics_helper.rb +121 -0
  141. data/lib/pdfrb/font/true_type/file.rb +10 -1
  142. data/lib/pdfrb/font/true_type/glyf.rb +82 -0
  143. data/lib/pdfrb/font/true_type/kern.rb +58 -0
  144. data/lib/pdfrb/font/true_type/loca.rb +42 -0
  145. data/lib/pdfrb/font/true_type/maxp.rb +44 -0
  146. data/lib/pdfrb/font/true_type/name.rb +53 -0
  147. data/lib/pdfrb/font/true_type/post.rb +93 -0
  148. data/lib/pdfrb/font/true_type/subsetter.rb +3 -5
  149. data/lib/pdfrb/font/true_type/wrapper.rb +102 -0
  150. data/lib/pdfrb/font/true_type.rb +7 -0
  151. data/lib/pdfrb/font.rb +2 -0
  152. data/lib/pdfrb/font_loader/from_configuration.rb +19 -0
  153. data/lib/pdfrb/font_loader/from_file.rb +20 -0
  154. data/lib/pdfrb/font_loader/standard14.rb +20 -0
  155. data/lib/pdfrb/font_loader/variant_from_name.rb +36 -0
  156. data/lib/pdfrb/font_loader.rb +4 -0
  157. data/lib/pdfrb/font_resolver.rb +138 -0
  158. data/lib/pdfrb/image/audit.rb +94 -0
  159. data/lib/pdfrb/image/downsampler.rb +124 -0
  160. data/lib/pdfrb/image.rb +13 -0
  161. data/lib/pdfrb/image_loader/jpeg.rb +39 -58
  162. data/lib/pdfrb/image_loader/png.rb +82 -251
  163. data/lib/pdfrb/layout/bidi.rb +198 -0
  164. data/lib/pdfrb/layout/box.rb +49 -0
  165. data/lib/pdfrb/layout/box_fitter.rb +54 -0
  166. data/lib/pdfrb/layout/column_box.rb +71 -0
  167. data/lib/pdfrb/layout/container_box.rb +45 -0
  168. data/lib/pdfrb/layout/frame.rb +67 -0
  169. data/lib/pdfrb/layout/image_box.rb +44 -0
  170. data/lib/pdfrb/layout/inline_box.rb +25 -0
  171. data/lib/pdfrb/layout/line.rb +55 -0
  172. data/lib/pdfrb/layout/list_box.rb +87 -0
  173. data/lib/pdfrb/layout/numeric_refinements.rb +43 -0
  174. data/lib/pdfrb/layout/page_style.rb +65 -0
  175. data/lib/pdfrb/layout/style.rb +62 -0
  176. data/lib/pdfrb/layout/table_box.rb +66 -0
  177. data/lib/pdfrb/layout/text_box.rb +38 -0
  178. data/lib/pdfrb/layout/text_fragment.rb +45 -0
  179. data/lib/pdfrb/layout/text_layouter.rb +123 -0
  180. data/lib/pdfrb/layout.rb +28 -0
  181. data/lib/pdfrb/linearization/hint_stream.rb +93 -0
  182. data/lib/pdfrb/linearization/writer.rb +259 -0
  183. data/lib/pdfrb/linearization.rb +21 -0
  184. data/lib/pdfrb/model/cos/dictionary.rb +12 -0
  185. data/lib/pdfrb/model/pdf_array.rb +2 -2
  186. data/lib/pdfrb/model/type/action.rb +42 -0
  187. data/lib/pdfrb/model/type/action_go_to_3d_view.rb +14 -0
  188. data/lib/pdfrb/model/type/action_go_to_dp.rb +16 -0
  189. data/lib/pdfrb/model/type/action_go_to_r.rb +26 -0
  190. data/lib/pdfrb/model/type/action_goto.rb +34 -0
  191. data/lib/pdfrb/model/type/action_hide.rb +26 -0
  192. data/lib/pdfrb/model/type/action_import_data.rb +18 -0
  193. data/lib/pdfrb/model/type/action_java_script.rb +18 -0
  194. data/lib/pdfrb/model/type/action_launch.rb +22 -0
  195. data/lib/pdfrb/model/type/action_movie.rb +22 -0
  196. data/lib/pdfrb/model/type/action_named.rb +23 -0
  197. data/lib/pdfrb/model/type/action_nop.rb +12 -0
  198. data/lib/pdfrb/model/type/action_rendition.rb +28 -0
  199. data/lib/pdfrb/model/type/action_reset_form.rb +22 -0
  200. data/lib/pdfrb/model/type/action_rich_media_execute.rb +17 -0
  201. data/lib/pdfrb/model/type/action_set_ocg_state.rb +32 -0
  202. data/lib/pdfrb/model/type/action_set_state.rb +14 -0
  203. data/lib/pdfrb/model/type/action_sound_action.rb +23 -0
  204. data/lib/pdfrb/model/type/action_submit_form.rb +64 -0
  205. data/lib/pdfrb/model/type/action_thread.rb +23 -0
  206. data/lib/pdfrb/model/type/action_trans.rb +30 -0
  207. data/lib/pdfrb/model/type/action_uri.rb +30 -0
  208. data/lib/pdfrb/model/type/af_embedded_file.rb +11 -0
  209. data/lib/pdfrb/model/type/af_file_specification.rb +34 -0
  210. data/lib/pdfrb/model/type/annotation.rb +49 -10
  211. data/lib/pdfrb/model/type/appearance.rb +41 -0
  212. data/lib/pdfrb/model/type/appearance_characteristics.rb +36 -0
  213. data/lib/pdfrb/model/type/appearance_generator.rb +22 -0
  214. data/lib/pdfrb/model/type/appearance_trap_net.rb +84 -0
  215. data/lib/pdfrb/model/type/border_effect.rb +25 -0
  216. data/lib/pdfrb/model/type/border_styling.rb +38 -0
  217. data/lib/pdfrb/model/type/box_color_info.rb +21 -0
  218. data/lib/pdfrb/model/type/box_style.rb +19 -0
  219. data/lib/pdfrb/model/type/button.rb +17 -0
  220. data/lib/pdfrb/model/type/cal_gray.rb +17 -0
  221. data/lib/pdfrb/model/type/cal_rgb.rb +22 -0
  222. data/lib/pdfrb/model/type/caret_annotation.rb +21 -0
  223. data/lib/pdfrb/model/type/catalog.rb +99 -16
  224. data/lib/pdfrb/model/type/choice.rb +21 -0
  225. data/lib/pdfrb/model/type/cid_font.rb +52 -1
  226. data/lib/pdfrb/model/type/cid_font_descriptor_metrics.rb +28 -0
  227. data/lib/pdfrb/model/type/cid_system_info.rb +28 -0
  228. data/lib/pdfrb/model/type/circle_annotation.rb +20 -0
  229. data/lib/pdfrb/model/type/collection.rb +27 -0
  230. data/lib/pdfrb/model/type/collection_field.rb +24 -0
  231. data/lib/pdfrb/model/type/collection_item.rb +19 -0
  232. data/lib/pdfrb/model/type/collection_schema.rb +25 -0
  233. data/lib/pdfrb/model/type/collection_sort.rb +13 -0
  234. data/lib/pdfrb/model/type/crypt_filter.rb +58 -0
  235. data/lib/pdfrb/model/type/device_n.rb +37 -0
  236. data/lib/pdfrb/model/type/device_n_mixing_hints.rb +17 -0
  237. data/lib/pdfrb/model/type/device_n_process.rb +13 -0
  238. data/lib/pdfrb/model/type/doc_mdp_transform_parameters.rb +21 -0
  239. data/lib/pdfrb/model/type/document_security_store.rb +55 -0
  240. data/lib/pdfrb/model/type/embedded_file.rb +19 -0
  241. data/lib/pdfrb/model/type/embedded_file_parameter.rb +48 -0
  242. data/lib/pdfrb/model/type/encryption_public_key.rb +38 -0
  243. data/lib/pdfrb/model/type/encryption_standard.rb +68 -0
  244. data/lib/pdfrb/model/type/field_mdp_transform_parameters.rb +26 -0
  245. data/lib/pdfrb/model/type/file_attachment_annotation.rb +29 -0
  246. data/lib/pdfrb/model/type/file_spec_ef.rb +22 -0
  247. data/lib/pdfrb/model/type/file_spec_rf.rb +21 -0
  248. data/lib/pdfrb/model/type/file_specification.rb +43 -0
  249. data/lib/pdfrb/model/type/file_trailer.rb +54 -0
  250. data/lib/pdfrb/model/type/font.rb +73 -2
  251. data/lib/pdfrb/model/type/font_cid_type0.rb +17 -0
  252. data/lib/pdfrb/model/type/font_cid_type2.rb +17 -0
  253. data/lib/pdfrb/model/type/font_descriptor.rb +47 -0
  254. data/lib/pdfrb/model/type/font_descriptor_cid_type0.rb +15 -0
  255. data/lib/pdfrb/model/type/font_descriptor_cid_type2.rb +15 -0
  256. data/lib/pdfrb/model/type/font_encoding.rb +47 -0
  257. data/lib/pdfrb/model/type/font_file.rb +28 -0
  258. data/lib/pdfrb/model/type/font_file2.rb +32 -0
  259. data/lib/pdfrb/model/type/font_file3.rb +23 -0
  260. data/lib/pdfrb/model/type/font_multiple_master.rb +60 -0
  261. data/lib/pdfrb/model/type/font_true_type.rb +1 -1
  262. data/lib/pdfrb/model/type/font_type0.rb +1 -1
  263. data/lib/pdfrb/model/type/font_type1.rb +1 -1
  264. data/lib/pdfrb/model/type/font_type3.rb +1 -1
  265. data/lib/pdfrb/model/type/form_field.rb +73 -0
  266. data/lib/pdfrb/model/type/free_text_annotation.rb +37 -0
  267. data/lib/pdfrb/model/type/function.rb +42 -0
  268. data/lib/pdfrb/model/type/function_exponential.rb +31 -0
  269. data/lib/pdfrb/model/type/function_postscript.rb +25 -0
  270. data/lib/pdfrb/model/type/function_sampled.rb +55 -0
  271. data/lib/pdfrb/model/type/function_stitching.rb +33 -0
  272. data/lib/pdfrb/model/type/generic_appearance.rb +40 -0
  273. data/lib/pdfrb/model/type/graphics_state_parameter.rb +69 -0
  274. data/lib/pdfrb/model/type/halftone.rb +21 -0
  275. data/lib/pdfrb/model/type/halftone_type1.rb +17 -0
  276. data/lib/pdfrb/model/type/halftone_type10.rb +16 -0
  277. data/lib/pdfrb/model/type/halftone_type16.rb +11 -0
  278. data/lib/pdfrb/model/type/halftone_type5.rb +24 -0
  279. data/lib/pdfrb/model/type/halftone_type6.rb +16 -0
  280. data/lib/pdfrb/model/type/highlight_annotation.rb +11 -0
  281. data/lib/pdfrb/model/type/icc_based_color_space.rb +24 -0
  282. data/lib/pdfrb/model/type/icon_fit.rb +31 -0
  283. data/lib/pdfrb/model/type/indexed.rb +32 -0
  284. data/lib/pdfrb/model/type/info.rb +44 -0
  285. data/lib/pdfrb/model/type/ink_annotation.rb +29 -0
  286. data/lib/pdfrb/model/type/interactive_form.rb +36 -0
  287. data/lib/pdfrb/model/type/interior_color.rb +12 -0
  288. data/lib/pdfrb/model/type/jbig2_globals.rb +15 -0
  289. data/lib/pdfrb/model/type/lab.rb +27 -0
  290. data/lib/pdfrb/model/type/line_annotation.rb +44 -0
  291. data/lib/pdfrb/model/type/line_ending_styling.rb +39 -0
  292. data/lib/pdfrb/model/type/link_annotation.rb +41 -0
  293. data/lib/pdfrb/model/type/link_appearance.rb +9 -0
  294. data/lib/pdfrb/model/type/mark_information.rb +23 -0
  295. data/lib/pdfrb/model/type/marked_content_reference.rb +24 -0
  296. data/lib/pdfrb/model/type/markup_annotation.rb +36 -0
  297. data/lib/pdfrb/model/type/mdp_dict.rb +28 -0
  298. data/lib/pdfrb/model/type/measure.rb +39 -0
  299. data/lib/pdfrb/model/type/media_clip.rb +28 -0
  300. data/lib/pdfrb/model/type/media_offset.rb +106 -0
  301. data/lib/pdfrb/model/type/metadata.rb +27 -3
  302. data/lib/pdfrb/model/type/misc_helpers.rb +75 -0
  303. data/lib/pdfrb/model/type/movie.rb +28 -0
  304. data/lib/pdfrb/model/type/names.rb +51 -0
  305. data/lib/pdfrb/model/type/namespace.rb +27 -0
  306. data/lib/pdfrb/model/type/object_reference.rb +31 -0
  307. data/lib/pdfrb/model/type/object_stream.rb +38 -0
  308. data/lib/pdfrb/model/type/opt_content_ext.rb +94 -0
  309. data/lib/pdfrb/model/type/opt_content_page_element.rb +18 -0
  310. data/lib/pdfrb/model/type/optional_content_config.rb +56 -0
  311. data/lib/pdfrb/model/type/optional_content_group.rb +35 -10
  312. data/lib/pdfrb/model/type/optional_content_membership.rb +36 -2
  313. data/lib/pdfrb/model/type/optional_content_properties.rb +16 -1
  314. data/lib/pdfrb/model/type/outline.rb +40 -6
  315. data/lib/pdfrb/model/type/outline_item.rb +45 -0
  316. data/lib/pdfrb/model/type/output_intent.rb +30 -0
  317. data/lib/pdfrb/model/type/page.rb +127 -0
  318. data/lib/pdfrb/model/type/page_label.rb +68 -0
  319. data/lib/pdfrb/model/type/page_piece_info.rb +58 -0
  320. data/lib/pdfrb/model/type/page_tree_node.rb +51 -16
  321. data/lib/pdfrb/model/type/page_tree_node_root.rb +15 -0
  322. data/lib/pdfrb/model/type/pattern.rb +16 -0
  323. data/lib/pdfrb/model/type/pattern_shading.rb +25 -0
  324. data/lib/pdfrb/model/type/pattern_tiling.rb +25 -0
  325. data/lib/pdfrb/model/type/polygon_annotation.rb +29 -0
  326. data/lib/pdfrb/model/type/polygon_polyline.rb +14 -0
  327. data/lib/pdfrb/model/type/polyline_annotation.rb +29 -0
  328. data/lib/pdfrb/model/type/popup_annotation.rb +20 -0
  329. data/lib/pdfrb/model/type/printer_mark_annotation.rb +13 -0
  330. data/lib/pdfrb/model/type/redact_annotation.rb +28 -0
  331. data/lib/pdfrb/model/type/rendition.rb +31 -0
  332. data/lib/pdfrb/model/type/resources.rb +59 -14
  333. data/lib/pdfrb/model/type/rich_media_activation.rb +24 -0
  334. data/lib/pdfrb/model/type/rich_media_animation.rb +25 -0
  335. data/lib/pdfrb/model/type/rich_media_annotation.rb +18 -0
  336. data/lib/pdfrb/model/type/rich_media_command.rb +19 -0
  337. data/lib/pdfrb/model/type/rich_media_configuration.rb +32 -0
  338. data/lib/pdfrb/model/type/rich_media_content.rb +28 -0
  339. data/lib/pdfrb/model/type/rich_media_cue_point.rb +18 -0
  340. data/lib/pdfrb/model/type/rich_media_deactivation.rb +17 -0
  341. data/lib/pdfrb/model/type/rich_media_instance.rb +33 -0
  342. data/lib/pdfrb/model/type/rich_media_presentation.rb +29 -0
  343. data/lib/pdfrb/model/type/rich_media_settings.rb +33 -0
  344. data/lib/pdfrb/model/type/rich_media_window.rb +20 -0
  345. data/lib/pdfrb/model/type/screen_annotation.rb +19 -0
  346. data/lib/pdfrb/model/type/separation.rb +25 -0
  347. data/lib/pdfrb/model/type/sig_field_lock.rb +25 -0
  348. data/lib/pdfrb/model/type/sig_field_seed_value.rb +25 -0
  349. data/lib/pdfrb/model/type/signature.rb +65 -0
  350. data/lib/pdfrb/model/type/signature_build.rb +86 -0
  351. data/lib/pdfrb/model/type/signature_field.rb +17 -0
  352. data/lib/pdfrb/model/type/software_identifier.rb +19 -0
  353. data/lib/pdfrb/model/type/sound.rb +38 -0
  354. data/lib/pdfrb/model/type/sound_annotation.rb +21 -0
  355. data/lib/pdfrb/model/type/square_annotation.rb +24 -0
  356. data/lib/pdfrb/model/type/square_circle.rb +13 -0
  357. data/lib/pdfrb/model/type/squiggly_annotation.rb +11 -0
  358. data/lib/pdfrb/model/type/stamp_annotation.rb +19 -0
  359. data/lib/pdfrb/model/type/strikeout_annotation.rb +11 -0
  360. data/lib/pdfrb/model/type/struct_elem.rb +75 -0
  361. data/lib/pdfrb/model/type/struct_tree_root.rb +34 -0
  362. data/lib/pdfrb/model/type/structure_attributes.rb +44 -0
  363. data/lib/pdfrb/model/type/structure_element_kid.rb +33 -0
  364. data/lib/pdfrb/model/type/text_annotation.rb +25 -0
  365. data/lib/pdfrb/model/type/text_appearance.rb +9 -0
  366. data/lib/pdfrb/model/type/text_field.rb +21 -0
  367. data/lib/pdfrb/model/type/text_markup_annotation.rb +30 -0
  368. data/lib/pdfrb/model/type/three_d_activation.rb +32 -0
  369. data/lib/pdfrb/model/type/three_d_animation_style.rb +24 -0
  370. data/lib/pdfrb/model/type/three_d_background.rb +28 -0
  371. data/lib/pdfrb/model/type/three_d_cross_section.rb +25 -0
  372. data/lib/pdfrb/model/type/three_d_lighting_scheme.rb +26 -0
  373. data/lib/pdfrb/model/type/three_d_measure.rb +20 -0
  374. data/lib/pdfrb/model/type/three_d_measure_3dc.rb +23 -0
  375. data/lib/pdfrb/model/type/three_d_measure_ad3.rb +14 -0
  376. data/lib/pdfrb/model/type/three_d_measure_ld3.rb +14 -0
  377. data/lib/pdfrb/model/type/three_d_measure_pd3.rb +20 -0
  378. data/lib/pdfrb/model/type/three_d_measure_rd3.rb +14 -0
  379. data/lib/pdfrb/model/type/three_d_node.rb +37 -0
  380. data/lib/pdfrb/model/type/three_d_reference.rb +21 -0
  381. data/lib/pdfrb/model/type/three_d_render_mode.rb +34 -0
  382. data/lib/pdfrb/model/type/three_d_stream.rb +48 -0
  383. data/lib/pdfrb/model/type/three_d_units.rb +18 -0
  384. data/lib/pdfrb/model/type/three_d_view.rb +40 -0
  385. data/lib/pdfrb/model/type/to_unicode_cmap_stream.rb +23 -0
  386. data/lib/pdfrb/model/type/transition.rb +68 -0
  387. data/lib/pdfrb/model/type/underline_annotation.rb +11 -0
  388. data/lib/pdfrb/model/type/ur_transform_parameters.rb +33 -0
  389. data/lib/pdfrb/model/type/uri_dict.rb +18 -0
  390. data/lib/pdfrb/model/type/url_alias.rb +19 -0
  391. data/lib/pdfrb/model/type/variable_text_field.rb +47 -0
  392. data/lib/pdfrb/model/type/viewer_preferences.rb +42 -0
  393. data/lib/pdfrb/model/type/watermark_annotation.rb +13 -0
  394. data/lib/pdfrb/model/type/widget_annotation.rb +48 -0
  395. data/lib/pdfrb/model/type/widget_appearance.rb +9 -0
  396. data/lib/pdfrb/model/type/xobject_form.rb +41 -0
  397. data/lib/pdfrb/model/type/xobject_image.rb +56 -0
  398. data/lib/pdfrb/model/type/xref_stream.rb +37 -0
  399. data/lib/pdfrb/model/type.rb +289 -6
  400. data/lib/pdfrb/serializer.rb +2 -2
  401. data/lib/pdfrb/source/tokenizer.rb +0 -2
  402. data/lib/pdfrb/task/benchmark.rb +83 -0
  403. data/lib/pdfrb/task/extract_text.rb +1 -1
  404. data/lib/pdfrb/task/generate_corpus.rb +130 -0
  405. data/lib/pdfrb/task/memory_profile.rb +84 -0
  406. data/lib/pdfrb/task/optimize.rb +97 -7
  407. data/lib/pdfrb/task/regenerate_appearances.rb +98 -0
  408. data/lib/pdfrb/task.rb +4 -3
  409. data/lib/pdfrb/test_utils.rb +112 -0
  410. data/lib/pdfrb/validator.rb +82 -0
  411. data/lib/pdfrb/version.rb +1 -1
  412. data/lib/pdfrb/writer.rb +117 -27
  413. data/lib/pdfrb/xmp/packet.rb +122 -0
  414. data/lib/pdfrb/xmp/schemas.rb +96 -0
  415. data/lib/pdfrb/xmp.rb +44 -0
  416. data/lib/pdfrb/xref_section.rb +2 -2
  417. data/lib/pdfrb.rb +24 -54
  418. data/pdfrb.gemspec +45 -0
  419. data/script/apply_fixes.sh +843 -0
  420. data/script/make_jpeg_fixture.rb +53 -0
  421. data/script/make_png_fixture.rb +25 -0
  422. metadata +319 -4
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # EmbeddedFileParameterDictionary (s7.11.3.1). Per /EF entry
7
+ # /Params dict — checksum, size, dates, mac creator.
8
+ class EmbeddedFileParameter < Pdfrb::Model::Cos::Dictionary
9
+ def size; self[:Size]; end
10
+ def creation_date; self[:CreationDate]; end
11
+ def modification_date; self[:ModDate]; end
12
+ def mac; self[:Mac]; end
13
+ def checksum; self[:CheckSum]; end
14
+
15
+ def has_checksum?
16
+ !!checksum
17
+ end
18
+
19
+ def creation_time
20
+ time = creation_date
21
+ return nil unless time
22
+
23
+ time.is_a?(Time) ? time : parse_pdf_date(time.to_s)
24
+ end
25
+
26
+ def modification_time
27
+ time = modification_date
28
+ return nil unless time
29
+
30
+ time.is_a?(Time) ? time : parse_pdf_date(time.to_s)
31
+ end
32
+
33
+ private
34
+
35
+ def parse_pdf_date(str)
36
+ match = str.to_s.match(/^D:(\d{4})(\d{2})(\d{2})(\d{2})?(\d{2})?(\d{2})?/)
37
+ return nil unless match
38
+
39
+ Time.new(match[1].to_i, match[2].to_i, match[3].to_i,
40
+ (match[4] || 0).to_i, (match[5] || 0).to_i, (match[6] || 0).to_i,
41
+ "+00:00")
42
+ rescue StandardError
43
+ nil
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -6,6 +6,44 @@ module Pdfrb
6
6
  # Public-key security handler encryption dict (s7.6.5.1).
7
7
  class EncryptionPublicKey < Pdfrb::Model::Cos::Dictionary
8
8
  arlington_object "EncryptionPublicKey"
9
+
10
+ def filter; self[:Filter]; end
11
+ def version; self[:V]; end
12
+ def sub_filter; self[:SubFilter]; end
13
+ def length; self[:Length]; end
14
+ def recipients; self[:Recipients]; end
15
+ def encrypt_metadata?; truthy?(self[:EncryptMetadata]); end
16
+
17
+ def public_key?
18
+ filter&.to_sym == :AdobePubSec
19
+ end
20
+
21
+ def s2?
22
+ sub_filter&.to_sym == :S2
23
+ end
24
+
25
+ def s3?
26
+ sub_filter&.to_sym == :S3
27
+ end
28
+
29
+ def s4?
30
+ sub_filter&.to_sym == :S4
31
+ end
32
+
33
+ def recipient_count
34
+ return 0 unless recipients
35
+
36
+ arr = recipients.is_a?(Pdfrb::Model::PdfArray) ? recipients.to_a : recipients
37
+ arr.is_a?(Array) ? arr.size : 0
38
+ end
39
+
40
+ def key_length_bytes
41
+ ((length || 40) / 8)
42
+ end
43
+
44
+ def aes?
45
+ (version || 0) >= 4
46
+ end
9
47
  end
10
48
  end
11
49
  end
@@ -6,6 +6,74 @@ module Pdfrb
6
6
  # Standard security handler encryption dict (s7.6.3.4).
7
7
  class EncryptionStandard < Pdfrb::Model::Cos::Dictionary
8
8
  arlington_object "EncryptionStandard"
9
+
10
+ def filter; self[:Filter]; end
11
+ def sub_filter; self[:SubFilter]; end
12
+ def version; self[:V]; end
13
+ def revision; self[:R]; end
14
+ def length; self[:Length]; end
15
+ def permissions; self[:P]; end
16
+ def owner_password; self[:O]; end
17
+ def user_password; self[:U]; end
18
+ def encrypt_metadata?; self[:EncryptMetadata]; end
19
+ def recipient_info; self[:Recipients]; end
20
+
21
+ def key_length_bytes
22
+ ((length || 40) / 8)
23
+ end
24
+
25
+ def aes?
26
+ (version || 0) >= 4
27
+ end
28
+
29
+ def rc4?
30
+ (version || 0) < 4
31
+ end
32
+
33
+ def public_key?
34
+ filter&.to_sym == :AdobePubSec
35
+ end
36
+
37
+ def standard?
38
+ filter&.to_sym == :Standard
39
+ end
40
+
41
+ def metadata_encrypted?
42
+ value = encrypt_metadata?
43
+ value.nil? || !!value
44
+ end
45
+
46
+ def allow_print?
47
+ permissions&.anybits?(4)
48
+ end
49
+
50
+ def allow_modify_contents?
51
+ permissions&.anybits?(8)
52
+ end
53
+
54
+ def allow_copy?
55
+ permissions&.anybits?(16)
56
+ end
57
+
58
+ def allow_annotations?
59
+ permissions&.anybits?(32)
60
+ end
61
+
62
+ def allow_fill_in?
63
+ permissions&.anybits?(256)
64
+ end
65
+
66
+ def allow_extract?
67
+ permissions&.anybits?(512)
68
+ end
69
+
70
+ def allow_assemble?
71
+ permissions&.anybits?(1024)
72
+ end
73
+
74
+ def allow_print_high_res?
75
+ permissions&.anybits?(2048)
76
+ end
9
77
  end
10
78
  end
11
79
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Field MDP Transform Parameters (s12.7.6.5). Specifies which
7
+ # fields are locked by a FieldMDP signature reference.
8
+ class FieldMDPTransformParameters < Pdfrb::Model::Cos::Dictionary
9
+ def type; self[:Type]; end
10
+ def action; self[:Action]&.to_sym; end
11
+ def fields; self[:Fields]; end
12
+
13
+ def all_locked?; action == :All; end
14
+ def include_locked?; action == :Include; end
15
+ def exclude_locked?; action == :Exclude; end
16
+
17
+ def locked_field_names
18
+ return [] unless fields
19
+
20
+ arr = fields.is_a?(Pdfrb::Model::PdfArray) ? fields.to_a : fields
21
+ arr.is_a?(Array) ? arr : []
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # File-attachment annotation (s12.5.6.15). Embedded file displayed
7
+ # as a paper-clip icon.
8
+ class FileAttachmentAnnotation < MarkupAnnotation
9
+ def embedded_file; self[:FS]; end
10
+ def name; self[:Name]; end
11
+
12
+ def icon_name
13
+ (name || :PushPin).to_sym
14
+ end
15
+
16
+ def has_attachment?
17
+ !!embedded_file
18
+ end
19
+
20
+ def resolved_file_spec
21
+ ref = embedded_file
22
+ return nil unless ref && document
23
+
24
+ document.object(ref)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Filespec EF dict (s7.11.2.2). Maps variant file type to
7
+ # EmbeddedFile stream reference: /F (type 1), /UF (Unicode),
8
+ # /DOS, /Mac, /Unix.
9
+ class FileSpecEF < Pdfrb::Model::Cos::Dictionary
10
+ def primary_file; self[:F]; end
11
+ def unicode_file; self[:UF]; end
12
+ def dos_file; self[:DOS]; end
13
+ def mac_file; self[:Mac]; end
14
+ def unix_file; self[:Unix]; end
15
+
16
+ def any?
17
+ !!(primary_file || unicode_file || dos_file || mac_file || unix_file)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Filespec RF dict (s7.11.2.3). Related files name tree.
7
+ class FileSpecRF < Pdfrb::Model::Cos::Dictionary
8
+ def related_files; self[:Names]; end
9
+
10
+ def each_related(&block)
11
+ return enum_for(:each_related) unless block
12
+
13
+ return unless related_files
14
+
15
+ arr = related_files.is_a?(Pdfrb::Model::PdfArray) ? related_files.to_a : related_files
16
+ arr.each_slice(2, &block)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -6,6 +6,49 @@ module Pdfrb
6
6
  # File specification (s7.11.2). /FS, /F, /UF, /EF, /Desc, etc.
7
7
  class FileSpecification < Pdfrb::Model::Cos::Dictionary
8
8
  arlington_object "FileSpecification"
9
+ register_type :Filespec
10
+
11
+ def file_system; self[:FS]; end
12
+ def file; self[:F]; end
13
+ def unicode_file; self[:UF]; end
14
+ def dos_file; self[:DOS]; end
15
+ def mac_file; self[:Mac]; end
16
+ def unix_file; self[:Unix]; end
17
+ def id; self[:ID]; end
18
+ def volatile; self[:V]; end
19
+ def embedded_file; self[:EF]; end
20
+ def related_files; self[:RF]; end
21
+ def description; self[:Desc]; end
22
+ def collection; self[:Collection]; end
23
+ def type; self[:Type]; end
24
+
25
+ def simple?
26
+ !!(file || unicode_file)
27
+ end
28
+
29
+ def url?
30
+ file_system&.to_sym == :URL
31
+ end
32
+
33
+ def effective_filename
34
+ unicode_file || file || dos_file || mac_file || unix_file
35
+ end
36
+
37
+ def effective_embedded_file
38
+ return nil unless embedded_file
39
+
40
+ mapping = if embedded_file.is_a?(Pdfrb::Model::Reference) && document
41
+ document.object(embedded_file)
42
+ else
43
+ embedded_file
44
+ end
45
+ return nil unless mapping.is_a?(Hash)
46
+
47
+ ref = mapping[:UF] || mapping[:F]
48
+ return nil unless ref && document
49
+
50
+ document.object(ref)
51
+ end
9
52
  end
10
53
  end
11
54
  end
@@ -8,6 +8,60 @@ module Pdfrb
8
8
  # /AuthCode, /AdditionalStreams, /DocChecksum.
9
9
  class FileTrailer < Pdfrb::Model::Cos::Dictionary
10
10
  arlington_object "FileTrailer"
11
+ register_type :FileTrailer
12
+
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 xref_stream_offset; self[:XRefStm]; end
20
+ def doc_checksum; self[:DocChecksum]; end
21
+
22
+ def encrypted?
23
+ !!encrypt
24
+ end
25
+
26
+ def incremental?
27
+ !!prev
28
+ end
29
+
30
+ def has_id?
31
+ id.is_a?(Array) && id.size == 2
32
+ end
33
+
34
+ def original_id
35
+ return nil unless has_id?
36
+
37
+ arr = id.is_a?(Pdfrb::Model::PdfArray) ? id.to_a : id
38
+ arr[0]
39
+ end
40
+
41
+ def current_id
42
+ return nil unless has_id?
43
+
44
+ arr = id.is_a?(Pdfrb::Model::PdfArray) ? id.to_a : id
45
+ arr[1] || arr[0]
46
+ end
47
+
48
+ def resolved_root
49
+ return nil unless root && document
50
+
51
+ document.object(root)
52
+ end
53
+
54
+ def resolved_info
55
+ return nil unless info && document
56
+
57
+ document.object(info)
58
+ end
59
+
60
+ def resolved_encrypt
61
+ return nil unless encrypt && document
62
+
63
+ document.object(encrypt)
64
+ end
11
65
  end
12
66
  end
13
67
  end
@@ -3,10 +3,81 @@
3
3
  module Pdfrb
4
4
  module Model
5
5
  module Type
6
- # Base Font dict (s9.6.2). Concrete subclasses: FontType1,
7
- # FontTrueType, FontType0, CIDFont, FontType3.
8
6
  class Font < Pdfrb::Model::Cos::Dictionary
9
7
  arlington_object "FontMap"
8
+
9
+ def subtype; self[:Subtype]; end
10
+ def base_font; self[:BaseFont]; end
11
+ def encoding; self[:Encoding]; end
12
+ def first_char; self[:FirstChar]; end
13
+ def last_char; self[:LastChar]; end
14
+ def widths; self[:Widths]; end
15
+ def to_unicode; self[:ToUnicode]; end
16
+
17
+ def font_descriptor
18
+ ref = self[:FontDescriptor]
19
+ return nil unless ref
20
+
21
+ document ? document.object(ref) : ref
22
+ end
23
+
24
+ def embedded?
25
+ fd = font_descriptor
26
+ return false unless fd
27
+
28
+ !!(fd.value[:FontFile] || fd.value[:FontFile2] || fd.value[:FontFile3])
29
+ end
30
+
31
+ def font_file
32
+ fd = font_descriptor
33
+ return nil unless fd
34
+
35
+ fd.value[:FontFile2] || fd.value[:FontFile3] || fd.value[:FontFile]
36
+ end
37
+
38
+ def simple?
39
+ [:Type1, :TrueType, :MMType1].include?(subtype&.to_sym)
40
+ end
41
+
42
+ def cid?
43
+ subtype&.to_sym == :Type0
44
+ end
45
+
46
+ def type3?
47
+ subtype&.to_sym == :Type3
48
+ end
49
+
50
+ def descendant_font
51
+ return nil unless cid?
52
+
53
+ ref = self[:DescendantFonts]
54
+ return nil unless ref
55
+
56
+ arr = if ref.is_a?(Pdfrb::Model::Reference) && document
57
+ document.object(ref)
58
+ else
59
+ ref
60
+ end
61
+ return nil unless arr.is_a?(Array) || arr.is_a?(Pdfrb::Model::PdfArray)
62
+
63
+ first = arr[0]
64
+ return nil unless first
65
+
66
+ if first.is_a?(Pdfrb::Model::Reference) && document
67
+ document.object(first)
68
+ else
69
+ first
70
+ end
71
+ end
72
+
73
+ def glyph_width(char_code)
74
+ return nil unless widths && first_char && last_char
75
+
76
+ idx = char_code - first_char
77
+ return nil if idx.negative? || idx >= widths.length
78
+
79
+ widths[idx]
80
+ end
10
81
  end
11
82
  end
12
83
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Font CIDType0 (s9.7.3). CIDFontType0 — CID-keyed font based
7
+ # on CFF (Compact Font Format).
8
+ class FontCIDType0 < CIDFont
9
+ def cid_subtype; self[:Subtype]&.to_sym; end
10
+
11
+ def cff?
12
+ cid_subtype == :CIDFontType0
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Font CIDType2 (s9.7.3). CIDFontType2 — CID-keyed font based
7
+ # on TrueType outlines.
8
+ class FontCIDType2 < CIDFont
9
+ def cid_subtype; self[:Subtype]&.to_sym; end
10
+
11
+ def true_type?
12
+ cid_subtype == :CIDFontType2
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -6,6 +6,53 @@ module Pdfrb
6
6
  # Font descriptor (s9.8). Carries metrics + embedded font file.
7
7
  class FontDescriptor < Pdfrb::Model::Cos::Dictionary
8
8
  arlington_object "FontDescriptorType1"
9
+
10
+ def font_name; self[:FontName]; end
11
+ def family_name; self[:FontFamily]; end
12
+ def font_stretch; self[:FontStretch]; end
13
+ def font_weight; self[:FontWeight]; end
14
+ def flags; self[:Flags]; end
15
+ def font_bbox; self[:FontBBox]; end
16
+ def italic_angle; self[:ItalicAngle]; end
17
+ def ascent; self[:Ascent]; end
18
+ def descent; self[:Descent]; end
19
+ def cap_height; self[:CapHeight]; end
20
+ def x_height; self[:XHeight]; end
21
+ def stem_v; self[:StemV]; end
22
+ def stem_h; self[:StemH]; end
23
+ def avg_width; self[:AvgWidth]; end
24
+ def max_width; self[:MaxWidth]; end
25
+ def missing_width; self[:MissingWidth]; end
26
+ def char_set; self[:CharSet]; end
27
+
28
+ def font_file; self[:FontFile]; end
29
+ def font_file2; self[:FontFile2]; end
30
+ def font_file3; self[:FontFile3]; end
31
+
32
+ def embedded?
33
+ !!(font_file || font_file2 || font_file3)
34
+ end
35
+
36
+ def font_file_reference
37
+ font_file2 || font_file3 || font_file
38
+ end
39
+
40
+ def resolved_font_file
41
+ ref = font_file_reference
42
+ return nil unless ref && document
43
+
44
+ document.object(ref)
45
+ end
46
+
47
+ def fixed_pitch?; flags&.anybits?(1); end
48
+ def serif?; flags&.anybits?(2); end
49
+ def symbolic?; flags&.anybits?(4); end
50
+ def script?; flags&.anybits?(8); end
51
+ def nonsymbolic?; flags&.anybits?(32); end
52
+ def italic?; flags&.anybits?(64); end
53
+ def all_cap?; flags&.anybits?(0x10000); end
54
+ def small_cap?; flags&.anybits?(0x20000); end
55
+ def force_bold?; flags&.anybits?(0x40000); end
9
56
  end
10
57
  end
11
58
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Font Descriptor CIDType0 (s9.8). Specialised metrics for
7
+ # CIDFontType0 (CFF-based CID fonts).
8
+ class FontDescriptorCIDType0 < FontDescriptor
9
+ def cid_font_type; 0; end
10
+
11
+ def cff?; true; end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Font Descriptor CIDType2 (s9.8). Specialised metrics for
7
+ # CIDFontType2 (TrueType-based CID fonts).
8
+ class FontDescriptorCIDType2 < FontDescriptor
9
+ def cid_font_type; 2; end
10
+
11
+ def true_type?; true; end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Font Encoding dict (s9.6.1). Base encoding + per-glyph differences
7
+ # table for Type 1 fonts.
8
+ class FontEncoding < Pdfrb::Model::Cos::Dictionary
9
+ def base_encoding; self[:BaseEncoding]&.to_sym; end
10
+ def differences; self[:Differences]; end
11
+
12
+ def win_ansi?; base_encoding == :WinAnsiEncoding; end
13
+ def mac_roman?; base_encoding == :MacRomanEncoding; end
14
+ def mac_expert?; base_encoding == :MacExpertEncoding; end
15
+ def standard?; base_encoding == :StandardEncoding; end
16
+
17
+ def has_differences?
18
+ !!differences && (!differences.is_a?(Array) || !differences.empty?)
19
+ end
20
+
21
+ def each_difference(&block)
22
+ return enum_for(:each_difference) unless block
23
+
24
+ return unless differences.is_a?(Array)
25
+
26
+ current_code = nil
27
+ differences.each do |entry|
28
+ if entry.is_a?(Integer)
29
+ current_code = entry
30
+ else
31
+ yield current_code, entry
32
+ current_code = current_code ? current_code + 1 : nil
33
+ end
34
+ end
35
+ end
36
+
37
+ def glyph_for(char_code)
38
+ result = nil
39
+ each_difference do |code, name|
40
+ result = name if code == char_code
41
+ end
42
+ result
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # Type 1 font file stream (s7.8.2). Holds the Type1 / Type1C
7
+ # font program. Referenced by FontDescriptor /FontFile.
8
+ class FontFile < Pdfrb::Model::Cos::Stream
9
+ def length1; self[:Length1]; end
10
+ def length2; self[:Length2]; end
11
+ def length3; self[:Length3]; end
12
+ def subtype; self[:Subtype]; end
13
+
14
+ def has_clear_text_mark?
15
+ !!length1 && length1.positive?
16
+ end
17
+
18
+ def has_encrypted_portion?
19
+ !!length2 && length2.positive?
20
+ end
21
+
22
+ def font_program
23
+ decoded_stream&.force_encoding(Encoding::BINARY)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pdfrb
4
+ module Model
5
+ module Type
6
+ # TrueType font file stream (s7.8.3). Holds the TTF/OTF program.
7
+ # Referenced by FontDescriptor /FontFile2.
8
+ class FontFile2 < Pdfrb::Model::Cos::Stream
9
+ def length1; self[:Length1]; end
10
+ def subtype; self[:Subtype]; end
11
+
12
+ def font_program
13
+ decoded_stream&.force_encoding(Encoding::BINARY)
14
+ end
15
+
16
+ def magic
17
+ return nil unless stream
18
+
19
+ stream.byteslice(0, 4)
20
+ end
21
+
22
+ def truetype?
23
+ magic == "\x00\x01\x00\x00".b || magic == "true".b
24
+ end
25
+
26
+ def opentype?
27
+ magic == "OTTO".b
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end