hexapdf 0.15.8 → 0.17.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (446) hide show
  1. checksums.yaml +4 -4
  2. data/lib/hexapdf/cli/batch.rb +1 -1
  3. data/lib/hexapdf/cli/command.rb +10 -1
  4. data/lib/hexapdf/cli/files.rb +1 -1
  5. data/lib/hexapdf/cli/fonts.rb +145 -0
  6. data/lib/hexapdf/cli/form.rb +27 -26
  7. data/lib/hexapdf/cli/image2pdf.rb +1 -1
  8. data/lib/hexapdf/cli/images.rb +1 -10
  9. data/lib/hexapdf/cli/info.rb +1 -1
  10. data/lib/hexapdf/cli/inspect.rb +1 -1
  11. data/lib/hexapdf/cli/merge.rb +1 -1
  12. data/lib/hexapdf/cli/modify.rb +1 -1
  13. data/lib/hexapdf/cli/optimize.rb +1 -1
  14. data/lib/hexapdf/cli/split.rb +1 -1
  15. data/lib/hexapdf/cli/watermark.rb +1 -1
  16. data/lib/hexapdf/cli.rb +3 -1
  17. data/lib/hexapdf/composer.rb +1 -1
  18. data/lib/hexapdf/configuration.rb +11 -2
  19. data/lib/hexapdf/content/canvas.rb +658 -167
  20. data/lib/hexapdf/content/color_space.rb +185 -3
  21. data/lib/hexapdf/content/graphic_object/arc.rb +111 -12
  22. data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +1 -1
  23. data/lib/hexapdf/content/graphic_object/geom2d.rb +1 -1
  24. data/lib/hexapdf/content/graphic_object/solid_arc.rb +1 -1
  25. data/lib/hexapdf/content/graphic_object.rb +1 -1
  26. data/lib/hexapdf/content/graphics_state.rb +1 -1
  27. data/lib/hexapdf/content/operator.rb +1 -1
  28. data/lib/hexapdf/content/parser.rb +1 -1
  29. data/lib/hexapdf/content/processor.rb +1 -1
  30. data/lib/hexapdf/content/transformation_matrix.rb +1 -1
  31. data/lib/hexapdf/content.rb +1 -1
  32. data/lib/hexapdf/data_dir.rb +1 -1
  33. data/lib/hexapdf/dictionary.rb +1 -1
  34. data/lib/hexapdf/dictionary_fields.rb +30 -4
  35. data/lib/hexapdf/document/files.rb +3 -3
  36. data/lib/hexapdf/document/fonts.rb +1 -1
  37. data/lib/hexapdf/document/images.rb +1 -1
  38. data/lib/hexapdf/document/pages.rb +1 -1
  39. data/lib/hexapdf/document.rb +1 -1
  40. data/lib/hexapdf/encryption/aes.rb +1 -1
  41. data/lib/hexapdf/encryption/arc4.rb +1 -1
  42. data/lib/hexapdf/encryption/fast_aes.rb +1 -1
  43. data/lib/hexapdf/encryption/fast_arc4.rb +1 -1
  44. data/lib/hexapdf/encryption/identity.rb +1 -1
  45. data/lib/hexapdf/encryption/ruby_aes.rb +1 -1
  46. data/lib/hexapdf/encryption/ruby_arc4.rb +1 -1
  47. data/lib/hexapdf/encryption/security_handler.rb +1 -1
  48. data/lib/hexapdf/encryption/standard_security_handler.rb +1 -1
  49. data/lib/hexapdf/encryption.rb +1 -1
  50. data/lib/hexapdf/error.rb +1 -1
  51. data/lib/hexapdf/filter/ascii85_decode.rb +1 -1
  52. data/lib/hexapdf/filter/ascii_hex_decode.rb +1 -1
  53. data/lib/hexapdf/filter/crypt.rb +1 -1
  54. data/lib/hexapdf/filter/encryption.rb +1 -1
  55. data/lib/hexapdf/filter/flate_decode.rb +1 -1
  56. data/lib/hexapdf/filter/lzw_decode.rb +1 -1
  57. data/lib/hexapdf/filter/pass_through.rb +1 -1
  58. data/lib/hexapdf/filter/predictor.rb +1 -1
  59. data/lib/hexapdf/filter/run_length_decode.rb +1 -1
  60. data/lib/hexapdf/filter.rb +1 -1
  61. data/lib/hexapdf/font/cmap/parser.rb +1 -1
  62. data/lib/hexapdf/font/cmap/writer.rb +1 -1
  63. data/lib/hexapdf/font/cmap.rb +1 -1
  64. data/lib/hexapdf/font/encoding/base.rb +1 -1
  65. data/lib/hexapdf/font/encoding/difference_encoding.rb +1 -1
  66. data/lib/hexapdf/font/encoding/glyph_list.rb +1 -1
  67. data/lib/hexapdf/font/encoding/mac_expert_encoding.rb +1 -1
  68. data/lib/hexapdf/font/encoding/mac_roman_encoding.rb +1 -1
  69. data/lib/hexapdf/font/encoding/standard_encoding.rb +1 -1
  70. data/lib/hexapdf/font/encoding/symbol_encoding.rb +1 -1
  71. data/lib/hexapdf/font/encoding/win_ansi_encoding.rb +1 -1
  72. data/lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb +1 -1
  73. data/lib/hexapdf/font/encoding.rb +1 -1
  74. data/lib/hexapdf/font/invalid_glyph.rb +1 -1
  75. data/lib/hexapdf/font/true_type/builder.rb +1 -1
  76. data/lib/hexapdf/font/true_type/font.rb +1 -1
  77. data/lib/hexapdf/font/true_type/optimizer.rb +1 -1
  78. data/lib/hexapdf/font/true_type/subsetter.rb +1 -1
  79. data/lib/hexapdf/font/true_type/table/cmap.rb +1 -1
  80. data/lib/hexapdf/font/true_type/table/cmap_subtable.rb +1 -1
  81. data/lib/hexapdf/font/true_type/table/directory.rb +1 -1
  82. data/lib/hexapdf/font/true_type/table/glyf.rb +1 -1
  83. data/lib/hexapdf/font/true_type/table/head.rb +1 -1
  84. data/lib/hexapdf/font/true_type/table/hhea.rb +1 -1
  85. data/lib/hexapdf/font/true_type/table/hmtx.rb +1 -1
  86. data/lib/hexapdf/font/true_type/table/kern.rb +1 -1
  87. data/lib/hexapdf/font/true_type/table/loca.rb +1 -1
  88. data/lib/hexapdf/font/true_type/table/maxp.rb +1 -1
  89. data/lib/hexapdf/font/true_type/table/name.rb +1 -1
  90. data/lib/hexapdf/font/true_type/table/os2.rb +1 -1
  91. data/lib/hexapdf/font/true_type/table/post.rb +1 -1
  92. data/lib/hexapdf/font/true_type/table.rb +1 -1
  93. data/lib/hexapdf/font/true_type.rb +1 -1
  94. data/lib/hexapdf/font/true_type_wrapper.rb +1 -1
  95. data/lib/hexapdf/font/type1/afm_parser.rb +1 -1
  96. data/lib/hexapdf/font/type1/character_metrics.rb +1 -1
  97. data/lib/hexapdf/font/type1/font.rb +1 -1
  98. data/lib/hexapdf/font/type1/font_metrics.rb +1 -1
  99. data/lib/hexapdf/font/type1/pfb_parser.rb +1 -1
  100. data/lib/hexapdf/font/type1.rb +1 -1
  101. data/lib/hexapdf/font/type1_wrapper.rb +1 -1
  102. data/lib/hexapdf/font_loader/from_configuration.rb +1 -1
  103. data/lib/hexapdf/font_loader/from_file.rb +1 -1
  104. data/lib/hexapdf/font_loader/standard14.rb +1 -1
  105. data/lib/hexapdf/font_loader.rb +1 -1
  106. data/lib/hexapdf/image_loader/jpeg.rb +1 -1
  107. data/lib/hexapdf/image_loader/pdf.rb +1 -1
  108. data/lib/hexapdf/image_loader/png.rb +1 -1
  109. data/lib/hexapdf/image_loader.rb +1 -1
  110. data/lib/hexapdf/importer.rb +1 -1
  111. data/lib/hexapdf/layout/box.rb +4 -2
  112. data/lib/hexapdf/layout/frame.rb +1 -1
  113. data/lib/hexapdf/layout/image_box.rb +1 -1
  114. data/lib/hexapdf/layout/inline_box.rb +1 -1
  115. data/lib/hexapdf/layout/line.rb +1 -1
  116. data/lib/hexapdf/layout/numeric_refinements.rb +1 -1
  117. data/lib/hexapdf/layout/style.rb +40 -2
  118. data/lib/hexapdf/layout/text_box.rb +1 -1
  119. data/lib/hexapdf/layout/text_fragment.rb +1 -1
  120. data/lib/hexapdf/layout/text_layouter.rb +1 -1
  121. data/lib/hexapdf/layout/text_shaper.rb +1 -1
  122. data/lib/hexapdf/layout/width_from_polygon.rb +2 -2
  123. data/lib/hexapdf/layout.rb +1 -1
  124. data/lib/hexapdf/name_tree_node.rb +1 -1
  125. data/lib/hexapdf/number_tree_node.rb +1 -1
  126. data/lib/hexapdf/object.rb +1 -1
  127. data/lib/hexapdf/parser.rb +2 -2
  128. data/lib/hexapdf/pdf_array.rb +1 -1
  129. data/lib/hexapdf/rectangle.rb +1 -1
  130. data/lib/hexapdf/reference.rb +1 -1
  131. data/lib/hexapdf/revision.rb +1 -1
  132. data/lib/hexapdf/revisions.rb +1 -1
  133. data/lib/hexapdf/serializer.rb +1 -1
  134. data/lib/hexapdf/stream.rb +1 -1
  135. data/lib/hexapdf/task/dereference.rb +1 -1
  136. data/lib/hexapdf/task/optimize.rb +1 -1
  137. data/lib/hexapdf/task.rb +1 -1
  138. data/lib/hexapdf/tokenizer.rb +1 -1
  139. data/lib/hexapdf/type/acro_form/appearance_generator.rb +14 -7
  140. data/lib/hexapdf/type/acro_form/button_field.rb +53 -28
  141. data/lib/hexapdf/type/acro_form/choice_field.rb +1 -1
  142. data/lib/hexapdf/type/acro_form/field.rb +21 -2
  143. data/lib/hexapdf/type/acro_form/form.rb +48 -29
  144. data/lib/hexapdf/type/acro_form/text_field.rb +2 -2
  145. data/lib/hexapdf/type/acro_form/variable_text_field.rb +17 -9
  146. data/lib/hexapdf/type/acro_form.rb +1 -1
  147. data/lib/hexapdf/type/action.rb +1 -1
  148. data/lib/hexapdf/type/actions/go_to.rb +1 -1
  149. data/lib/hexapdf/type/actions/go_to_r.rb +1 -1
  150. data/lib/hexapdf/type/actions/launch.rb +1 -1
  151. data/lib/hexapdf/type/actions/uri.rb +1 -1
  152. data/lib/hexapdf/type/actions.rb +1 -1
  153. data/lib/hexapdf/type/annotation.rb +1 -1
  154. data/lib/hexapdf/type/annotations/link.rb +1 -1
  155. data/lib/hexapdf/type/annotations/markup_annotation.rb +1 -1
  156. data/lib/hexapdf/type/annotations/text.rb +1 -1
  157. data/lib/hexapdf/type/annotations/widget.rb +2 -2
  158. data/lib/hexapdf/type/annotations.rb +1 -1
  159. data/lib/hexapdf/type/catalog.rb +1 -1
  160. data/lib/hexapdf/type/cid_font.rb +1 -1
  161. data/lib/hexapdf/type/embedded_file.rb +1 -1
  162. data/lib/hexapdf/type/file_specification.rb +1 -1
  163. data/lib/hexapdf/type/font.rb +1 -1
  164. data/lib/hexapdf/type/font_descriptor.rb +1 -1
  165. data/lib/hexapdf/type/font_simple.rb +1 -1
  166. data/lib/hexapdf/type/font_true_type.rb +1 -1
  167. data/lib/hexapdf/type/font_type0.rb +1 -1
  168. data/lib/hexapdf/type/font_type1.rb +1 -1
  169. data/lib/hexapdf/type/font_type3.rb +1 -1
  170. data/lib/hexapdf/type/form.rb +1 -1
  171. data/lib/hexapdf/type/graphics_state_parameter.rb +1 -1
  172. data/lib/hexapdf/type/icon_fit.rb +1 -1
  173. data/lib/hexapdf/type/image.rb +1 -1
  174. data/lib/hexapdf/type/info.rb +1 -1
  175. data/lib/hexapdf/type/names.rb +1 -1
  176. data/lib/hexapdf/type/object_stream.rb +1 -1
  177. data/lib/hexapdf/type/page.rb +15 -1
  178. data/lib/hexapdf/type/page_tree_node.rb +1 -1
  179. data/lib/hexapdf/type/resources.rb +1 -1
  180. data/lib/hexapdf/type/trailer.rb +1 -1
  181. data/lib/hexapdf/type/viewer_preferences.rb +1 -1
  182. data/lib/hexapdf/type/xref_stream.rb +1 -1
  183. data/lib/hexapdf/type.rb +1 -1
  184. data/lib/hexapdf/utils/bit_field.rb +1 -1
  185. data/lib/hexapdf/utils/bit_stream.rb +1 -1
  186. data/lib/hexapdf/utils/graphics_helpers.rb +1 -1
  187. data/lib/hexapdf/utils/lru_cache.rb +1 -1
  188. data/lib/hexapdf/utils/math_helpers.rb +1 -1
  189. data/lib/hexapdf/utils/object_hash.rb +1 -1
  190. data/lib/hexapdf/utils/pdf_doc_encoding.rb +1 -1
  191. data/lib/hexapdf/utils/sorted_tree_node.rb +1 -1
  192. data/lib/hexapdf/version.rb +2 -2
  193. data/lib/hexapdf/writer.rb +1 -1
  194. data/lib/hexapdf/xref_section.rb +1 -1
  195. data/lib/hexapdf.rb +1 -1
  196. metadata +5 -264
  197. data/CHANGELOG.md +0 -954
  198. data/LICENSE +0 -29
  199. data/README.md +0 -120
  200. data/Rakefile +0 -108
  201. data/agpl-3.0.txt +0 -661
  202. data/examples/001-hello_world.rb +0 -16
  203. data/examples/002-graphics.rb +0 -275
  204. data/examples/003-arcs.rb +0 -50
  205. data/examples/004-optimizing.rb +0 -23
  206. data/examples/005-merging.rb +0 -27
  207. data/examples/006-standard_pdf_fonts.rb +0 -73
  208. data/examples/007-truetype.rb +0 -42
  209. data/examples/008-show_char_bboxes.rb +0 -55
  210. data/examples/009-text_layouter_alignment.rb +0 -47
  211. data/examples/010-text_layouter_inline_boxes.rb +0 -64
  212. data/examples/011-text_layouter_line_wrapping.rb +0 -57
  213. data/examples/012-text_layouter_styling.rb +0 -122
  214. data/examples/013-text_layouter_shapes.rb +0 -176
  215. data/examples/014-text_in_polygon.rb +0 -60
  216. data/examples/015-boxes.rb +0 -76
  217. data/examples/016-frame_automatic_box_placement.rb +0 -90
  218. data/examples/017-frame_text_flow.rb +0 -60
  219. data/examples/018-composer.rb +0 -44
  220. data/examples/019-acro_form.rb +0 -88
  221. data/examples/emoji-smile.png +0 -0
  222. data/examples/emoji-wink.png +0 -0
  223. data/examples/machupicchu.jpg +0 -0
  224. data/test/data/aes-test-vectors/CBCGFSbox-128-decrypt.data.gz +0 -0
  225. data/test/data/aes-test-vectors/CBCGFSbox-128-encrypt.data.gz +0 -0
  226. data/test/data/aes-test-vectors/CBCGFSbox-192-decrypt.data.gz +0 -0
  227. data/test/data/aes-test-vectors/CBCGFSbox-192-encrypt.data.gz +0 -0
  228. data/test/data/aes-test-vectors/CBCGFSbox-256-decrypt.data.gz +0 -0
  229. data/test/data/aes-test-vectors/CBCGFSbox-256-encrypt.data.gz +0 -0
  230. data/test/data/aes-test-vectors/CBCKeySbox-128-decrypt.data.gz +0 -0
  231. data/test/data/aes-test-vectors/CBCKeySbox-128-encrypt.data.gz +0 -0
  232. data/test/data/aes-test-vectors/CBCKeySbox-192-decrypt.data.gz +0 -0
  233. data/test/data/aes-test-vectors/CBCKeySbox-192-encrypt.data.gz +0 -0
  234. data/test/data/aes-test-vectors/CBCKeySbox-256-decrypt.data.gz +0 -0
  235. data/test/data/aes-test-vectors/CBCKeySbox-256-encrypt.data.gz +0 -0
  236. data/test/data/aes-test-vectors/CBCVarKey-128-decrypt.data.gz +0 -0
  237. data/test/data/aes-test-vectors/CBCVarKey-128-encrypt.data.gz +0 -0
  238. data/test/data/aes-test-vectors/CBCVarKey-192-decrypt.data.gz +0 -0
  239. data/test/data/aes-test-vectors/CBCVarKey-192-encrypt.data.gz +0 -0
  240. data/test/data/aes-test-vectors/CBCVarKey-256-decrypt.data.gz +0 -0
  241. data/test/data/aes-test-vectors/CBCVarKey-256-encrypt.data.gz +0 -0
  242. data/test/data/aes-test-vectors/CBCVarTxt-128-decrypt.data.gz +0 -0
  243. data/test/data/aes-test-vectors/CBCVarTxt-128-encrypt.data.gz +0 -0
  244. data/test/data/aes-test-vectors/CBCVarTxt-192-decrypt.data.gz +0 -0
  245. data/test/data/aes-test-vectors/CBCVarTxt-192-encrypt.data.gz +0 -0
  246. data/test/data/aes-test-vectors/CBCVarTxt-256-decrypt.data.gz +0 -0
  247. data/test/data/aes-test-vectors/CBCVarTxt-256-encrypt.data.gz +0 -0
  248. data/test/data/fonts/Ubuntu-Title.ttf +0 -0
  249. data/test/data/images/cmyk.jpg +0 -0
  250. data/test/data/images/fillbytes.jpg +0 -0
  251. data/test/data/images/gray.jpg +0 -0
  252. data/test/data/images/greyscale-1bit.png +0 -0
  253. data/test/data/images/greyscale-2bit.png +0 -0
  254. data/test/data/images/greyscale-4bit.png +0 -0
  255. data/test/data/images/greyscale-8bit.png +0 -0
  256. data/test/data/images/greyscale-alpha-8bit.png +0 -0
  257. data/test/data/images/greyscale-trns-8bit.png +0 -0
  258. data/test/data/images/greyscale-with-gamma1.0.png +0 -0
  259. data/test/data/images/greyscale-with-gamma1.5.png +0 -0
  260. data/test/data/images/indexed-1bit.png +0 -0
  261. data/test/data/images/indexed-2bit.png +0 -0
  262. data/test/data/images/indexed-4bit.png +0 -0
  263. data/test/data/images/indexed-8bit.png +0 -0
  264. data/test/data/images/indexed-alpha-4bit.png +0 -0
  265. data/test/data/images/indexed-alpha-8bit.png +0 -0
  266. data/test/data/images/rgb.jpg +0 -0
  267. data/test/data/images/truecolour-8bit.png +0 -0
  268. data/test/data/images/truecolour-alpha-8bit.png +0 -0
  269. data/test/data/images/truecolour-gama-chrm-8bit.png +0 -0
  270. data/test/data/images/truecolour-srgb-8bit.png +0 -0
  271. data/test/data/images/ycck.jpg +0 -0
  272. data/test/data/minimal.pdf +0 -44
  273. data/test/data/standard-security-handler/README +0 -9
  274. data/test/data/standard-security-handler/bothpwd-aes-128bit-V4.pdf +0 -44
  275. data/test/data/standard-security-handler/bothpwd-aes-256bit-V5.pdf +0 -0
  276. data/test/data/standard-security-handler/bothpwd-arc4-128bit-V2.pdf +0 -43
  277. data/test/data/standard-security-handler/bothpwd-arc4-128bit-V4.pdf +0 -43
  278. data/test/data/standard-security-handler/bothpwd-arc4-40bit-V1.pdf +0 -0
  279. data/test/data/standard-security-handler/nopwd-aes-128bit-V4.pdf +0 -43
  280. data/test/data/standard-security-handler/nopwd-aes-256bit-V5.pdf +0 -0
  281. data/test/data/standard-security-handler/nopwd-arc4-128bit-V2.pdf +0 -43
  282. data/test/data/standard-security-handler/nopwd-arc4-128bit-V4.pdf +0 -43
  283. data/test/data/standard-security-handler/nopwd-arc4-40bit-V1.pdf +0 -43
  284. data/test/data/standard-security-handler/ownerpwd-aes-128bit-V4.pdf +0 -0
  285. data/test/data/standard-security-handler/ownerpwd-aes-256bit-V5.pdf +0 -43
  286. data/test/data/standard-security-handler/ownerpwd-arc4-128bit-V2.pdf +0 -43
  287. data/test/data/standard-security-handler/ownerpwd-arc4-128bit-V4.pdf +0 -43
  288. data/test/data/standard-security-handler/ownerpwd-arc4-40bit-V1.pdf +0 -43
  289. data/test/data/standard-security-handler/userpwd-aes-128bit-V4.pdf +0 -43
  290. data/test/data/standard-security-handler/userpwd-aes-256bit-V5.pdf +0 -43
  291. data/test/data/standard-security-handler/userpwd-arc4-128bit-V2.pdf +0 -0
  292. data/test/data/standard-security-handler/userpwd-arc4-128bit-V4.pdf +0 -0
  293. data/test/data/standard-security-handler/userpwd-arc4-40bit-V1.pdf +0 -43
  294. data/test/hexapdf/common_tokenizer_tests.rb +0 -236
  295. data/test/hexapdf/content/common.rb +0 -39
  296. data/test/hexapdf/content/graphic_object/test_arc.rb +0 -93
  297. data/test/hexapdf/content/graphic_object/test_endpoint_arc.rb +0 -90
  298. data/test/hexapdf/content/graphic_object/test_geom2d.rb +0 -79
  299. data/test/hexapdf/content/graphic_object/test_solid_arc.rb +0 -86
  300. data/test/hexapdf/content/test_canvas.rb +0 -1216
  301. data/test/hexapdf/content/test_color_space.rb +0 -164
  302. data/test/hexapdf/content/test_graphics_state.rb +0 -151
  303. data/test/hexapdf/content/test_operator.rb +0 -619
  304. data/test/hexapdf/content/test_parser.rb +0 -99
  305. data/test/hexapdf/content/test_processor.rb +0 -163
  306. data/test/hexapdf/content/test_transformation_matrix.rb +0 -64
  307. data/test/hexapdf/document/test_files.rb +0 -72
  308. data/test/hexapdf/document/test_fonts.rb +0 -60
  309. data/test/hexapdf/document/test_images.rb +0 -72
  310. data/test/hexapdf/document/test_pages.rb +0 -130
  311. data/test/hexapdf/encryption/common.rb +0 -87
  312. data/test/hexapdf/encryption/test_aes.rb +0 -129
  313. data/test/hexapdf/encryption/test_arc4.rb +0 -39
  314. data/test/hexapdf/encryption/test_fast_aes.rb +0 -17
  315. data/test/hexapdf/encryption/test_fast_arc4.rb +0 -12
  316. data/test/hexapdf/encryption/test_identity.rb +0 -21
  317. data/test/hexapdf/encryption/test_ruby_aes.rb +0 -23
  318. data/test/hexapdf/encryption/test_ruby_arc4.rb +0 -20
  319. data/test/hexapdf/encryption/test_security_handler.rb +0 -380
  320. data/test/hexapdf/encryption/test_standard_security_handler.rb +0 -322
  321. data/test/hexapdf/filter/common.rb +0 -53
  322. data/test/hexapdf/filter/test_ascii85_decode.rb +0 -59
  323. data/test/hexapdf/filter/test_ascii_hex_decode.rb +0 -38
  324. data/test/hexapdf/filter/test_crypt.rb +0 -21
  325. data/test/hexapdf/filter/test_encryption.rb +0 -24
  326. data/test/hexapdf/filter/test_flate_decode.rb +0 -44
  327. data/test/hexapdf/filter/test_lzw_decode.rb +0 -52
  328. data/test/hexapdf/filter/test_predictor.rb +0 -219
  329. data/test/hexapdf/filter/test_run_length_decode.rb +0 -32
  330. data/test/hexapdf/font/cmap/test_parser.rb +0 -102
  331. data/test/hexapdf/font/cmap/test_writer.rb +0 -66
  332. data/test/hexapdf/font/encoding/test_base.rb +0 -45
  333. data/test/hexapdf/font/encoding/test_difference_encoding.rb +0 -29
  334. data/test/hexapdf/font/encoding/test_glyph_list.rb +0 -59
  335. data/test/hexapdf/font/encoding/test_zapf_dingbats_encoding.rb +0 -16
  336. data/test/hexapdf/font/test_cmap.rb +0 -104
  337. data/test/hexapdf/font/test_encoding.rb +0 -27
  338. data/test/hexapdf/font/test_invalid_glyph.rb +0 -34
  339. data/test/hexapdf/font/test_true_type_wrapper.rb +0 -186
  340. data/test/hexapdf/font/test_type1_wrapper.rb +0 -107
  341. data/test/hexapdf/font/true_type/common.rb +0 -17
  342. data/test/hexapdf/font/true_type/table/common.rb +0 -27
  343. data/test/hexapdf/font/true_type/table/test_cmap.rb +0 -47
  344. data/test/hexapdf/font/true_type/table/test_cmap_subtable.rb +0 -141
  345. data/test/hexapdf/font/true_type/table/test_directory.rb +0 -30
  346. data/test/hexapdf/font/true_type/table/test_glyf.rb +0 -58
  347. data/test/hexapdf/font/true_type/table/test_head.rb +0 -56
  348. data/test/hexapdf/font/true_type/table/test_hhea.rb +0 -26
  349. data/test/hexapdf/font/true_type/table/test_hmtx.rb +0 -30
  350. data/test/hexapdf/font/true_type/table/test_kern.rb +0 -61
  351. data/test/hexapdf/font/true_type/table/test_loca.rb +0 -33
  352. data/test/hexapdf/font/true_type/table/test_maxp.rb +0 -50
  353. data/test/hexapdf/font/true_type/table/test_name.rb +0 -76
  354. data/test/hexapdf/font/true_type/table/test_os2.rb +0 -55
  355. data/test/hexapdf/font/true_type/table/test_post.rb +0 -78
  356. data/test/hexapdf/font/true_type/test_builder.rb +0 -42
  357. data/test/hexapdf/font/true_type/test_font.rb +0 -116
  358. data/test/hexapdf/font/true_type/test_optimizer.rb +0 -26
  359. data/test/hexapdf/font/true_type/test_subsetter.rb +0 -73
  360. data/test/hexapdf/font/true_type/test_table.rb +0 -48
  361. data/test/hexapdf/font/type1/common.rb +0 -6
  362. data/test/hexapdf/font/type1/test_afm_parser.rb +0 -65
  363. data/test/hexapdf/font/type1/test_font.rb +0 -104
  364. data/test/hexapdf/font/type1/test_font_metrics.rb +0 -22
  365. data/test/hexapdf/font/type1/test_pfb_parser.rb +0 -37
  366. data/test/hexapdf/font_loader/test_from_configuration.rb +0 -43
  367. data/test/hexapdf/font_loader/test_from_file.rb +0 -36
  368. data/test/hexapdf/font_loader/test_standard14.rb +0 -33
  369. data/test/hexapdf/image_loader/test_jpeg.rb +0 -93
  370. data/test/hexapdf/image_loader/test_pdf.rb +0 -47
  371. data/test/hexapdf/image_loader/test_png.rb +0 -259
  372. data/test/hexapdf/layout/test_box.rb +0 -152
  373. data/test/hexapdf/layout/test_frame.rb +0 -350
  374. data/test/hexapdf/layout/test_image_box.rb +0 -73
  375. data/test/hexapdf/layout/test_inline_box.rb +0 -71
  376. data/test/hexapdf/layout/test_line.rb +0 -206
  377. data/test/hexapdf/layout/test_style.rb +0 -779
  378. data/test/hexapdf/layout/test_text_box.rb +0 -140
  379. data/test/hexapdf/layout/test_text_fragment.rb +0 -375
  380. data/test/hexapdf/layout/test_text_layouter.rb +0 -758
  381. data/test/hexapdf/layout/test_text_shaper.rb +0 -62
  382. data/test/hexapdf/layout/test_width_from_polygon.rb +0 -108
  383. data/test/hexapdf/task/test_dereference.rb +0 -51
  384. data/test/hexapdf/task/test_optimize.rb +0 -162
  385. data/test/hexapdf/test_composer.rb +0 -258
  386. data/test/hexapdf/test_configuration.rb +0 -93
  387. data/test/hexapdf/test_data_dir.rb +0 -32
  388. data/test/hexapdf/test_dictionary.rb +0 -340
  389. data/test/hexapdf/test_dictionary_fields.rb +0 -245
  390. data/test/hexapdf/test_document.rb +0 -641
  391. data/test/hexapdf/test_filter.rb +0 -100
  392. data/test/hexapdf/test_importer.rb +0 -106
  393. data/test/hexapdf/test_object.rb +0 -258
  394. data/test/hexapdf/test_parser.rb +0 -637
  395. data/test/hexapdf/test_pdf_array.rb +0 -169
  396. data/test/hexapdf/test_rectangle.rb +0 -73
  397. data/test/hexapdf/test_reference.rb +0 -50
  398. data/test/hexapdf/test_revision.rb +0 -188
  399. data/test/hexapdf/test_revisions.rb +0 -196
  400. data/test/hexapdf/test_serializer.rb +0 -195
  401. data/test/hexapdf/test_stream.rb +0 -274
  402. data/test/hexapdf/test_tokenizer.rb +0 -80
  403. data/test/hexapdf/test_type.rb +0 -18
  404. data/test/hexapdf/test_writer.rb +0 -140
  405. data/test/hexapdf/test_xref_section.rb +0 -61
  406. data/test/hexapdf/type/acro_form/test_appearance_generator.rb +0 -794
  407. data/test/hexapdf/type/acro_form/test_button_field.rb +0 -302
  408. data/test/hexapdf/type/acro_form/test_choice_field.rb +0 -220
  409. data/test/hexapdf/type/acro_form/test_field.rb +0 -247
  410. data/test/hexapdf/type/acro_form/test_form.rb +0 -353
  411. data/test/hexapdf/type/acro_form/test_signature_field.rb +0 -38
  412. data/test/hexapdf/type/acro_form/test_text_field.rb +0 -195
  413. data/test/hexapdf/type/acro_form/test_variable_text_field.rb +0 -77
  414. data/test/hexapdf/type/actions/test_launch.rb +0 -24
  415. data/test/hexapdf/type/actions/test_uri.rb +0 -23
  416. data/test/hexapdf/type/annotations/test_markup_annotation.rb +0 -22
  417. data/test/hexapdf/type/annotations/test_text.rb +0 -34
  418. data/test/hexapdf/type/annotations/test_widget.rb +0 -225
  419. data/test/hexapdf/type/test_annotation.rb +0 -97
  420. data/test/hexapdf/type/test_catalog.rb +0 -48
  421. data/test/hexapdf/type/test_cid_font.rb +0 -61
  422. data/test/hexapdf/type/test_file_specification.rb +0 -141
  423. data/test/hexapdf/type/test_font.rb +0 -67
  424. data/test/hexapdf/type/test_font_descriptor.rb +0 -61
  425. data/test/hexapdf/type/test_font_simple.rb +0 -176
  426. data/test/hexapdf/type/test_font_true_type.rb +0 -31
  427. data/test/hexapdf/type/test_font_type0.rb +0 -120
  428. data/test/hexapdf/type/test_font_type1.rb +0 -142
  429. data/test/hexapdf/type/test_font_type3.rb +0 -26
  430. data/test/hexapdf/type/test_form.rb +0 -120
  431. data/test/hexapdf/type/test_image.rb +0 -261
  432. data/test/hexapdf/type/test_info.rb +0 -9
  433. data/test/hexapdf/type/test_object_stream.rb +0 -117
  434. data/test/hexapdf/type/test_page.rb +0 -587
  435. data/test/hexapdf/type/test_page_tree_node.rb +0 -315
  436. data/test/hexapdf/type/test_resources.rb +0 -209
  437. data/test/hexapdf/type/test_trailer.rb +0 -116
  438. data/test/hexapdf/type/test_xref_stream.rb +0 -143
  439. data/test/hexapdf/utils/test_bit_field.rb +0 -63
  440. data/test/hexapdf/utils/test_bit_stream.rb +0 -69
  441. data/test/hexapdf/utils/test_graphics_helpers.rb +0 -37
  442. data/test/hexapdf/utils/test_lru_cache.rb +0 -22
  443. data/test/hexapdf/utils/test_object_hash.rb +0 -120
  444. data/test/hexapdf/utils/test_pdf_doc_encoding.rb +0 -18
  445. data/test/hexapdf/utils/test_sorted_tree_node.rb +0 -239
  446. data/test/test_helper.rb +0 -58
@@ -1,315 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- require 'test_helper'
4
- require 'hexapdf/document'
5
- require 'hexapdf/type/page_tree_node'
6
-
7
- describe HexaPDF::Type::PageTreeNode do
8
- before do
9
- @doc = HexaPDF::Document.new
10
- @root = @doc.add({Type: :Pages})
11
- end
12
-
13
- # Defines the following page tree:
14
- #
15
- # @root
16
- # @kid1
17
- # @kid11
18
- # @pages[0]
19
- # @pages[1]
20
- # @kid12
21
- # @pages[2]
22
- # @pages[3]
23
- # @pages[4]
24
- # @pages[5]
25
- # @kid2
26
- # @pages[6]
27
- # @pages[7]
28
- def define_multilevel_page_tree
29
- @pages = Array.new(8) { @doc.add({Type: :Page}) }
30
- @kid1 = @doc.add({Type: :Pages, Parent: @root, Count: 5})
31
- @kid11 = @doc.add({Type: :Pages, Parent: @kid1})
32
- @kid11.add_page(@pages[0])
33
- @kid11.add_page(@pages[1])
34
- @kid12 = @doc.add({Type: :Pages, Parent: @kid1})
35
- @kid12.add_page(@pages[2])
36
- @kid12.add_page(@pages[3])
37
- @kid12.add_page(@pages[4])
38
- @kid1[:Kids] << @kid11 << @kid12
39
- @root[:Kids] << @kid1
40
-
41
- @pages[5][:Parent] = @root
42
- @root[:Kids] << @pages[5]
43
-
44
- @kid2 = @doc.add({Type: :Pages, Parent: @root})
45
- @kid2.add_page(@pages[6])
46
- @kid2.add_page(@pages[7])
47
- @root[:Kids] << @kid2
48
- @root[:Count] = 8
49
- end
50
-
51
- it "must always be indirect" do
52
- pages = @doc.add({Type: :Pages})
53
- pages.must_be_indirect = false
54
- assert(pages.must_be_indirect?)
55
- end
56
-
57
- describe "page" do
58
- before do
59
- define_multilevel_page_tree
60
- end
61
-
62
- it "returns the page for a given index" do
63
- assert_equal(@pages[0], @root.page(0))
64
- assert_equal(@pages[3], @root.page(3))
65
- assert_equal(@pages[5], @root.page(5))
66
- assert_equal(@pages[7], @root.page(7))
67
- end
68
-
69
- it "works with negative indicies counting backwards from the end" do
70
- assert_equal(@pages[0], @root.page(-8))
71
- assert_equal(@pages[3], @root.page(-5))
72
- assert_equal(@pages[5], @root.page(-3))
73
- assert_equal(@pages[7], @root.page(-1))
74
- end
75
-
76
- it "returns nil for bad indices" do
77
- assert_nil(@root.page(20))
78
- assert_nil(@root.page(-20))
79
- end
80
- end
81
-
82
- describe "insert_page" do
83
- it "uses an empty new page when none is provided, respecting the set configuration options" do
84
- @doc.config['page.default_media_box'] = :A4
85
- @doc.config['page.default_media_orientation'] = :landscape
86
- page = @root.insert_page(3)
87
- assert_equal([page], @root[:Kids].value)
88
- assert_equal(1, @root.page_count)
89
- assert_equal(:Page, page[:Type])
90
- assert_equal(@root, page[:Parent])
91
- assert_kind_of(HexaPDF::Rectangle, page[:MediaBox])
92
- assert_equal([0, 0, 842, 595], page[:MediaBox].value)
93
- assert_equal({}, page[:Resources].value)
94
- refute(@root.value.key?(:Parent))
95
- end
96
-
97
- it "doesn't create a /Resources entry if an inherited one exists" do
98
- @root[:Resources] = {Font: {F1: nil}}
99
- page = @root.insert_page(3)
100
- assert_equal(@root[:Resources], page[:Resources])
101
- end
102
-
103
- it "inserts the provided page at the given index" do
104
- page = @doc.wrap({Type: :Page})
105
- assert_equal(page, @root.insert_page(3, page))
106
- assert_equal([page], @root[:Kids].value)
107
- assert_equal(@root, page[:Parent])
108
- refute(@root.value.key?(:Parent))
109
- end
110
-
111
- it "inserts multiple pages correctly in an empty root node" do
112
- page3 = @root.insert_page(5)
113
- page1 = @root.insert_page(0)
114
- page2 = @root.insert_page(1)
115
- assert_equal([page1, page2, page3], @root[:Kids].value)
116
- assert_equal(3, @root.page_count)
117
- end
118
-
119
- it "inserts multiple pages correctly in a multilevel page tree" do
120
- define_multilevel_page_tree
121
- page = @root.insert_page(2)
122
- assert_equal([@pages[0], @pages[1], page], @kid11[:Kids].value)
123
- assert_equal(3, @kid11.page_count)
124
- assert_equal(6, @kid1.page_count)
125
- assert_equal(9, @root.page_count)
126
-
127
- page = @root.insert_page(4)
128
- assert_equal([@pages[2], page, @pages[3], @pages[4]], @kid12[:Kids].value)
129
- assert_equal(4, @kid12.page_count)
130
- assert_equal(7, @kid1.page_count)
131
- assert_equal(10, @root.page_count)
132
-
133
- page = @root.insert_page(8)
134
- assert_equal([@kid1, @pages[5], page, @kid2], @root[:Kids].value)
135
- assert_equal(11, @root.page_count)
136
-
137
- page = @root.insert_page(100)
138
- assert_equal([@kid1, @pages[5], @root[:Kids][2], @kid2, page], @root[:Kids].value)
139
- assert_equal(12, @root.page_count)
140
- end
141
-
142
- it "allows negative indices to be specified" do
143
- define_multilevel_page_tree
144
- page = @root.insert_page(-1)
145
- assert_equal(page, @root[:Kids][-1])
146
-
147
- page = @root.insert_page(-4)
148
- assert_equal(page, @root[:Kids][2])
149
- end
150
- end
151
-
152
- describe "delete_page" do
153
- before do
154
- define_multilevel_page_tree
155
- end
156
-
157
- it "deletes the correct page by index" do
158
- @root.delete_page(2)
159
- assert_equal(2, @kid12.page_count)
160
- assert_equal(4, @kid1.page_count)
161
- assert_equal(7, @root.page_count)
162
- assert(@pages[2].null?)
163
-
164
- @root.delete_page(4)
165
- assert_equal(6, @root.page_count)
166
- assert(@pages[5].null?)
167
- end
168
-
169
- it "deletes the given page" do
170
- @root.delete_page(@pages[2])
171
- assert(@pages[2].null?)
172
- @root.delete_page(@pages[5])
173
- assert(@pages[5].null?)
174
- end
175
-
176
- it "allows deleting a page from an intermediary node" do
177
- @kid1.delete_page(@pages[2])
178
- assert_equal(7, @root.page_count)
179
- end
180
-
181
- it "does nothing if the page index is not valid" do
182
- @root.delete_page(20)
183
- @root.delete_page(-20)
184
- assert_equal(8, @root.page_count)
185
- end
186
-
187
- it "does nothing if the page has already been deleted" do
188
- @root.delete_page(@pages[2])
189
- @root.delete_page(@pages[2])
190
- assert_equal(7, @root.page_count)
191
- end
192
-
193
- it "fails if the page is not in its parent's /Kids array" do
194
- @kid12[:Kids].delete_at(0)
195
- assert_raises(HexaPDF::Error) { @root.delete_page(@pages[2]) }
196
- assert_equal(8, @root.page_count)
197
- end
198
-
199
- it "does nothing if the page is not part of the page tree" do
200
- pages = @doc.add({Type: :Pages, Count: 1})
201
- page = @doc.add({Type: :Page, Parent: pages})
202
- pages[:Kids] << page
203
-
204
- @root.delete_page(page)
205
- assert_equal(8, @root.page_count)
206
- end
207
- end
208
-
209
- describe "move_page" do
210
- before do
211
- define_multilevel_page_tree
212
- end
213
-
214
- it "moves the page to the first place" do
215
- @root.move_page(@pages[1], 0)
216
- assert_equal([@pages[1], @pages[0], *@pages[2..-1]], @root.each_page.to_a)
217
- assert(@root.validate)
218
- end
219
-
220
- it "moves the page to the correct location with a positive index" do
221
- @root.move_page(1, 3)
222
- assert_equal([@pages[0], @pages[2], @pages[1], *@pages[3..-1]], @root.each_page.to_a)
223
- assert(@root.validate)
224
- end
225
-
226
- it "moves the page to the last place" do
227
- @root.move_page(1, -1)
228
- assert_equal([@pages[0], *@pages[2..-1], @pages[1]], @root.each_page.to_a)
229
- assert(@root.validate)
230
- end
231
-
232
- it "fails if the index to the moving page is invalid" do
233
- assert_raises(HexaPDF::Error) { @root.move_page(10, 0) }
234
- end
235
-
236
- it "fails if the moving page was deleted/is null" do
237
- @doc.delete(@pages[0])
238
- assert_raises(HexaPDF::Error) { @root.move_page(@pages[0], 3) }
239
- end
240
-
241
- it "fails if the page was not yet added to a page tree" do
242
- page = @doc.add({Type: :Page})
243
- assert_raises(HexaPDF::Error) { @root.move_page(page, 3) }
244
- end
245
-
246
- it "fails if the page is not part of the page tree" do
247
- assert_raises(HexaPDF::Error) { @kid1.move_page(@pages[6], 3) }
248
- end
249
- end
250
-
251
- describe "each_page" do
252
- before do
253
- define_multilevel_page_tree
254
- end
255
-
256
- it "iterates over a simple, one-level page tree" do
257
- assert_equal([@pages[2], @pages[3], @pages[4]], @kid12.each_page.to_a)
258
- end
259
-
260
- it "iterates over a multilevel page tree" do
261
- assert_equal(@pages, @root.each_page.to_a)
262
- end
263
- end
264
-
265
- describe "validation" do
266
- it "corrects faulty /Count entries" do
267
- define_multilevel_page_tree
268
- root_count = @root.page_count
269
- @root[:Count] = -5
270
- kid_count = @kid12.page_count
271
- @kid12[:Count] = 100
272
-
273
- called_msg = ''
274
- refute(@root.validate(auto_correct: false) {|msg, _| called_msg = msg })
275
- assert_match(/Count.*invalid/, called_msg)
276
-
277
- assert(@root.validate)
278
- assert_equal(root_count, @root.page_count)
279
- assert_equal(kid_count, @kid12.page_count)
280
- end
281
-
282
- it "corrects faulty /Parent entries" do
283
- define_multilevel_page_tree
284
- @kid12.delete(:Parent)
285
- @kid2.delete(:Parent)
286
-
287
- called_msg = ''
288
- refute(@root.validate(auto_correct: false) {|msg, _| called_msg = msg })
289
- assert_match(/Parent.*invalid/, called_msg)
290
-
291
- assert(@root.validate)
292
- assert_equal(@kid1, @kid12[:Parent])
293
- assert_equal(@root, @kid2[:Parent])
294
- end
295
-
296
- it "removes invalid objects from the page tree (like null objects)" do
297
- define_multilevel_page_tree
298
- assert(@root.validate(auto_correct: false) {|m, _| p m })
299
-
300
- @doc.delete(@pages[3])
301
- refute(@root.validate(auto_correct: false)) do |msg, _|
302
- assert_match(/invalid object/i, msg)
303
- end
304
- assert(@root.validate)
305
- assert_equal(2, @kid12[:Count])
306
- assert_equal([@pages[2], @pages[4]], @kid12[:Kids].value)
307
- end
308
-
309
- it "needs at least one page node" do
310
- refute(@root.validate(auto_correct: false))
311
- assert(@root.validate)
312
- assert_equal(1, @root.page_count)
313
- end
314
- end
315
- end
@@ -1,209 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- require 'test_helper'
4
- require 'hexapdf/type/resources'
5
- require 'hexapdf/document'
6
-
7
- describe HexaPDF::Type::Resources do
8
- before do
9
- @doc = HexaPDF::Document.new
10
- @res = HexaPDF::Type::Resources.new({}, document: @doc)
11
- end
12
-
13
- describe "color_space" do
14
- it "works for device color spaces" do
15
- assert_equal(HexaPDF::Content::ColorSpace::DeviceRGB::DEFAULT,
16
- @res.color_space(:DeviceRGB))
17
- assert_equal(HexaPDF::Content::ColorSpace::DeviceCMYK::DEFAULT,
18
- @res.color_space(:DeviceCMYK))
19
- assert_equal(HexaPDF::Content::ColorSpace::DeviceGray::DEFAULT,
20
- @res.color_space(:DeviceGray))
21
- end
22
-
23
- it "works for color spaces defined only with a name" do
24
- @res[:ColorSpace] = {CSName: :Pattern}
25
- assert_kind_of(HexaPDF::Content::ColorSpace::Universal, @res.color_space(:CSName))
26
- end
27
-
28
- it "works for the Pattern color space" do
29
- assert_kind_of(HexaPDF::Content::ColorSpace::Universal, @res.color_space(:Pattern))
30
- end
31
-
32
- it "returns the universal color space for unknown color spaces, with resolved references" do
33
- data = @doc.add({Some: :data})
34
- @res[:ColorSpace] = {CSName: [:SomeUnknownColorSpace,
35
- HexaPDF::Reference.new(data.oid, data.gen)]}
36
- color_space = @res.color_space(:CSName)
37
- assert_kind_of(HexaPDF::Content::ColorSpace::Universal, color_space)
38
- assert_equal([:SomeUnknownColorSpace, data], color_space.definition)
39
- end
40
-
41
- it "fails if the specified name is neither a device color space nor in the dictionary" do
42
- assert_raises(HexaPDF::Error) { @res.color_space(:UnknownColorSpace) }
43
- end
44
- end
45
-
46
- describe "add_color_space" do
47
- it "returns device color spaces without adding an entry" do
48
- [HexaPDF::Content::ColorSpace::DeviceRGB::DEFAULT,
49
- HexaPDF::Content::ColorSpace::DeviceCMYK::DEFAULT,
50
- HexaPDF::Content::ColorSpace::DeviceGray::DEFAULT].each do |space|
51
- name = @res.add_color_space(space)
52
- assert_equal(space.family, name)
53
- refute(@res.key?(:ColorSpace))
54
- end
55
- end
56
-
57
- it "adds a color space that is not a device color space" do
58
- space = HexaPDF::Content::ColorSpace::Universal.new([:DeviceN, :data])
59
- name = @res.add_color_space(space)
60
- assert(@res[:ColorSpace].key?(name))
61
- assert_equal(space.definition, @res[:ColorSpace][name])
62
- assert_equal(space, @res.color_space(name))
63
- end
64
-
65
- it "doesn't add the same color space twice" do
66
- object = @doc.add({some: :data})
67
- @res[:ColorSpace] = {space: [:DeviceN, HexaPDF::Reference.new(object.oid, object.gen)]}
68
- space = HexaPDF::Content::ColorSpace::Universal.new([:DeviceN, object])
69
- name = @res.add_color_space(space)
70
- assert_equal(:space, name)
71
- assert_equal(1, @res[:ColorSpace].value.size)
72
- assert_equal(space, @res.color_space(name))
73
- end
74
-
75
- it "uses a unique color space name" do
76
- @res[:ColorSpace] = {CS2: [:DeviceN, :test]}
77
- space = HexaPDF::Content::ColorSpace::Universal.new([:DeviceN, :data])
78
- name = @res.add_color_space(space)
79
- refute_equal(:CS2, name)
80
- assert_equal(2, @res[:ColorSpace].value.size)
81
- end
82
- end
83
-
84
- describe "private object_getter" do
85
- it "returns the named entry under the dictionary" do
86
- @res[:XObject] = {name: :value}
87
- assert_equal(:value, @res.xobject(:name))
88
- end
89
-
90
- it "fails if the specified name is not in the dictionary" do
91
- assert_raises(HexaPDF::Error) { @res.xobject(:UnknownXObject) }
92
- end
93
- end
94
-
95
- describe "private object_setter" do
96
- it "adds the object to the specified subdictionary" do
97
- obj = @doc.add({some: :xobject})
98
- name = @res.add_xobject(obj)
99
- assert(@res[:XObject].key?(name))
100
- assert_equal(obj, @res[:XObject][name])
101
- end
102
-
103
- it "doesn't add the same object twice" do
104
- obj = @doc.add({some: :xobject})
105
- name = @res.add_xobject(obj)
106
- name2 = @res.add_xobject(obj)
107
- assert_equal(name, name2)
108
- end
109
- end
110
-
111
- describe "xobject" do
112
- it "invokes the object_getter method" do
113
- assert_method_invoked(@res, :object_getter, [:XObject, :test]) do
114
- @res.xobject(:test)
115
- end
116
- end
117
- end
118
-
119
- describe "add_xobject" do
120
- it "invokes the object_setter method" do
121
- assert_method_invoked(@res, :object_setter, [:XObject, 'XO', :test]) do
122
- @res.add_xobject(:test)
123
- end
124
- end
125
- end
126
-
127
- describe "ext_gstate" do
128
- it "invokes the object_getter method" do
129
- assert_method_invoked(@res, :object_getter, [:ExtGState, :test]) do
130
- @res.ext_gstate(:test)
131
- end
132
- end
133
- end
134
-
135
- describe "add_ext_gstate" do
136
- it "invokes the object_setter method" do
137
- assert_method_invoked(@res, :object_setter, [:ExtGState, 'GS', :test]) do
138
- @res.add_ext_gstate(:test)
139
- end
140
- end
141
- end
142
-
143
- describe "font" do
144
- it "invokes the object_getter method" do
145
- assert_method_invoked(@res, :object_getter, [:Font, :test]) do
146
- @res.font(:test)
147
- end
148
- end
149
- end
150
-
151
- describe "add_font" do
152
- it "invokes the object_setter method" do
153
- assert_method_invoked(@res, :object_setter, [:Font, 'F', :test]) do
154
- @res.add_font(:test)
155
- end
156
- end
157
- end
158
-
159
- describe "property_list" do
160
- it "invokes the object_getter method" do
161
- assert_method_invoked(@res, :object_getter, [:Properties, :test]) do
162
- @res.property_list(:test)
163
- end
164
- end
165
- end
166
-
167
- describe "add_property_list" do
168
- it "invokes the object_setter method" do
169
- assert_method_invoked(@res, :object_setter, [:Properties, 'P', :test]) do
170
- @res.add_property_list(:test)
171
- end
172
- end
173
- end
174
-
175
- describe "pattern" do
176
- it "invokes the object_getter method" do
177
- assert_method_invoked(@res, :object_getter, [:Pattern, :test]) do
178
- @res.pattern(:test)
179
- end
180
- end
181
- end
182
-
183
- describe "add_pattern" do
184
- it "invokes the object_setter method" do
185
- assert_method_invoked(@res, :object_setter, [:Pattern, 'P', :test]) do
186
- @res.add_pattern(:test)
187
- end
188
- end
189
- end
190
-
191
- describe "validation" do
192
- it "assigns the default value if ProcSet is not set" do
193
- @res.validate
194
- assert_equal([:PDF, :Text, :ImageB, :ImageC, :ImageI], @res[:ProcSet].value)
195
- end
196
-
197
- it "handles an invalid ProcSet containing a single value instead of an array" do
198
- @res[:ProcSet] = :PDF
199
- @res.validate
200
- assert_equal([:PDF], @res[:ProcSet].value)
201
- end
202
-
203
- it "removes invalid procedure set names from ProcSet" do
204
- @res[:ProcSet] = [:PDF, :Unknown]
205
- @res.validate
206
- assert_equal([:PDF], @res[:ProcSet].value)
207
- end
208
- end
209
- end
@@ -1,116 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- require 'test_helper'
4
- require 'hexapdf/type/trailer'
5
- require 'hexapdf/object'
6
- require 'hexapdf/type'
7
-
8
- describe HexaPDF::Type::Trailer do
9
- before do
10
- @doc = Object.new
11
- @doc.instance_variable_set(:@version, '1.2')
12
-
13
- def (@doc).version=(v); @version = v; end
14
-
15
- def (@doc).deref(obj); obj; end
16
-
17
- def (@doc).wrap(obj, *)
18
- (obj.kind_of?(Array) ? HexaPDF::PDFArray : HexaPDF::Dictionary).
19
- new(obj, oid: (obj.oid rescue 0))
20
- end
21
-
22
- root = HexaPDF::Dictionary.new({}, oid: 3)
23
- @obj = HexaPDF::Type::Trailer.new({Size: 10, Root: root}, document: @doc)
24
- end
25
-
26
- it "returns the catalog object, creating it if needed" do
27
- doc = Minitest::Mock.new
28
- doc.expect(:add, :val, [{Type: :Catalog}])
29
- trailer = HexaPDF::Type::Trailer.new({}, document: doc)
30
- assert_equal(:val, trailer.catalog)
31
- doc.verify
32
- assert_equal(:val, trailer.value[:Root])
33
- end
34
-
35
- it "returns the info object, creating it if needed" do
36
- doc = Minitest::Mock.new
37
- doc.expect(:add, :val, [{}, type: :XXInfo])
38
- trailer = HexaPDF::Type::Trailer.new({}, document: doc)
39
- assert_equal(:val, trailer.info)
40
- doc.verify
41
- assert_equal(:val, trailer.value[:Info])
42
- end
43
-
44
- describe "ID field" do
45
- it "sets a random ID" do
46
- @obj.set_random_id
47
- assert_kind_of(HexaPDF::PDFArray, @obj[:ID])
48
- assert_equal(2, @obj[:ID].length)
49
- assert_same(@obj[:ID][0], @obj[:ID][1])
50
- assert_kind_of(String, @obj[:ID][0])
51
- end
52
-
53
- it "updates the ID field" do
54
- @obj.update_id
55
- assert_same(@obj[:ID][0], @obj[:ID][1])
56
-
57
- @obj[:ID] = 5
58
- @obj.update_id
59
- assert_same(@obj[:ID][0], @obj[:ID][1])
60
-
61
- @obj.update_id
62
- refute_same(@obj[:ID][0], @obj[:ID][1])
63
- end
64
- end
65
-
66
- describe "validation" do
67
- it "validates and corrects a missing ID entry" do
68
- @obj.validate do |msg, correctable|
69
- assert(correctable)
70
- assert_match(/ID.*be set/, msg)
71
- end
72
- refute_nil(@obj[:ID])
73
- end
74
-
75
- it "validates and corrects a missing ID entry when an Encrypt dictionary is set" do
76
- def (@doc).security_handler
77
- obj = Object.new
78
- def obj.encryption_key_valid?; true; end
79
- obj
80
- end
81
- @obj[:Encrypt] = {}
82
- @obj.validate do |msg, correctable|
83
- assert(correctable)
84
- assert_match(/ID.*Encrypt/, msg)
85
- end
86
- refute_nil(@obj[:ID])
87
- end
88
-
89
- it "corrects a missing Catalog entry" do
90
- @obj.delete(:Root)
91
- @obj.set_random_id
92
- def (@doc).add(val) HexaPDF::Object.new(val, oid: 3) end
93
-
94
- message = ''
95
- refute(@obj.validate(auto_correct: false) {|m, _| message = m })
96
- assert_match(/Catalog/, message)
97
- assert(@obj.validate)
98
- end
99
-
100
- it "fails if the Encrypt dictionary is set but no security handler is available" do
101
- def (@doc).security_handler; nil; end
102
- @obj[:Encrypt] = {}
103
- refute(@obj.validate)
104
- end
105
-
106
- it "fails if the Encrypt dictionary is set but the security handler's key is wrong" do
107
- def (@doc).security_handler
108
- obj = Object.new
109
- def obj.encryption_key_valid?; false; end
110
- obj
111
- end
112
- @obj[:Encrypt] = {}
113
- refute(@obj.validate)
114
- end
115
- end
116
- end