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
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -96,6 +96,170 @@ module HexaPDF
96
96
  # See: PDF1.7 s8.6
97
97
  module ColorSpace
98
98
 
99
+ # Mapping of CSS Color Module Level 3 names to RGB values.
100
+ #
101
+ # Visual listing of all colors:
102
+ #
103
+ # #>pdf-big
104
+ # canvas.font("Helvetica", size: 8)
105
+ # map = HexaPDF::Content::ColorSpace::CSS_COLOR_NAMES
106
+ # map.each_slice(38).each_with_index do |slice, col|
107
+ # x = 10 + col * 100
108
+ # slice.each_with_index do |(name, rgb), row|
109
+ # canvas.fill_color(rgb).rectangle(x, 380 - row * 10, 10, 10).fill
110
+ # canvas.fill_color("black").text(name, at: [x + 15, 380 - row * 10 + 2])
111
+ # end
112
+ # end
113
+ CSS_COLOR_NAMES = {
114
+ "aliceblue" => [240, 248, 255],
115
+ "antiquewhite" => [250, 235, 215],
116
+ "aqua" => [0, 255, 255],
117
+ "aquamarine" => [127, 255, 212],
118
+ "azure" => [240, 255, 255],
119
+ "beige" => [245, 245, 220],
120
+ "bisque" => [255, 228, 196],
121
+ "black" => [0, 0, 0],
122
+ "blanchedalmond" => [255, 235, 205],
123
+ "blue" => [0, 0, 255],
124
+ "blueviolet" => [138, 43, 226],
125
+ "brown" => [165, 42, 42],
126
+ "burlywood" => [222, 184, 135],
127
+ "cadetblue" => [95, 158, 160],
128
+ "chartreuse" => [127, 255, 0],
129
+ "chocolate" => [210, 105, 30],
130
+ "coral" => [255, 127, 80],
131
+ "cornflowerblue" => [100, 149, 237],
132
+ "cornsilk" => [255, 248, 220],
133
+ "crimson" => [220, 20, 60],
134
+ "cyan" => [0, 255, 255],
135
+ "darkblue" => [0, 0, 139],
136
+ "darkcyan" => [0, 139, 139],
137
+ "darkgoldenrod" => [184, 134, 11],
138
+ "darkgray" => [169, 169, 169],
139
+ "darkgreen" => [0, 100, 0],
140
+ "darkgrey" => [169, 169, 169],
141
+ "darkkhaki" => [189, 183, 107],
142
+ "darkmagenta" => [139, 0, 139],
143
+ "darkolivegreen" => [85, 107, 47],
144
+ "darkorange" => [255, 140, 0],
145
+ "darkorchid" => [153, 50, 204],
146
+ "darkred" => [139, 0, 0],
147
+ "darksalmon" => [233, 150, 122],
148
+ "darkseagreen" => [143, 188, 143],
149
+ "darkslateblue" => [72, 61, 139],
150
+ "darkslategray" => [47, 79, 79],
151
+ "darkslategrey" => [47, 79, 79],
152
+ "darkturquoise" => [0, 206, 209],
153
+ "darkviolet" => [148, 0, 211],
154
+ "deeppink" => [255, 20, 147],
155
+ "deepskyblue" => [0, 191, 255],
156
+ "dimgray" => [105, 105, 105],
157
+ "dimgrey" => [105, 105, 105],
158
+ "dodgerblue" => [30, 144, 255],
159
+ "firebrick" => [178, 34, 34],
160
+ "floralwhite" => [255, 250, 240],
161
+ "forestgreen" => [34, 139, 34],
162
+ "fuchsia" => [255, 0, 255],
163
+ "gainsboro" => [220, 220, 220],
164
+ "ghostwhite" => [248, 248, 255],
165
+ "gold" => [255, 215, 0],
166
+ "goldenrod" => [218, 165, 32],
167
+ "gray" => [128, 128, 128],
168
+ "green" => [0, 128, 0],
169
+ "greenyellow" => [173, 255, 47],
170
+ "grey" => [128, 128, 128],
171
+ "honeydew" => [240, 255, 240],
172
+ "hotpink" => [255, 105, 180],
173
+ "indianred" => [205, 92, 92],
174
+ "indigo" => [75, 0, 130],
175
+ "ivory" => [255, 255, 240],
176
+ "khaki" => [240, 230, 140],
177
+ "lavender" => [230, 230, 250],
178
+ "lavenderblush" => [255, 240, 245],
179
+ "lawngreen" => [124, 252, 0],
180
+ "lemonchiffon" => [255, 250, 205],
181
+ "lightblue" => [173, 216, 230],
182
+ "lightcoral" => [240, 128, 128],
183
+ "lightcyan" => [224, 255, 255],
184
+ "lightgoldenrodyellow" => [250, 250, 210],
185
+ "lightgray" => [211, 211, 211],
186
+ "lightgreen" => [144, 238, 144],
187
+ "lightgrey" => [211, 211, 211],
188
+ "lightpink" => [255, 182, 193],
189
+ "lightsalmon" => [255, 160, 122],
190
+ "lightseagreen" => [32, 178, 170],
191
+ "lightskyblue" => [135, 206, 250],
192
+ "lightslategray" => [119, 136, 153],
193
+ "lightslategrey" => [119, 136, 153],
194
+ "lightsteelblue" => [176, 196, 222],
195
+ "lightyellow" => [255, 255, 224],
196
+ "lime" => [0, 255, 0],
197
+ "limegreen" => [50, 205, 50],
198
+ "linen" => [250, 240, 230],
199
+ "magenta" => [255, 0, 255],
200
+ "maroon" => [128, 0, 0],
201
+ "mediumaquamarine" => [102, 205, 170],
202
+ "mediumblue" => [0, 0, 205],
203
+ "mediumorchid" => [186, 85, 211],
204
+ "mediumpurple" => [147, 112, 219],
205
+ "mediumseagreen" => [60, 179, 113],
206
+ "mediumslateblue" => [123, 104, 238],
207
+ "mediumspringgreen" => [0, 250, 154],
208
+ "mediumturquoise" => [72, 209, 204],
209
+ "mediumvioletred" => [199, 21, 133],
210
+ "midnightblue" => [25, 25, 112],
211
+ "mintcream" => [245, 255, 250],
212
+ "mistyrose" => [255, 228, 225],
213
+ "moccasin" => [255, 228, 181],
214
+ "navajowhite" => [255, 222, 173],
215
+ "navy" => [0, 0, 128],
216
+ "oldlace" => [253, 245, 230],
217
+ "olive" => [128, 128, 0],
218
+ "olivedrab" => [107, 142, 35],
219
+ "orange" => [255, 165, 0],
220
+ "orangered" => [255, 69, 0],
221
+ "orchid" => [218, 112, 214],
222
+ "palegoldenrod" => [238, 232, 170],
223
+ "palegreen" => [152, 251, 152],
224
+ "paleturquoise" => [175, 238, 238],
225
+ "palevioletred" => [219, 112, 147],
226
+ "papayawhip" => [255, 239, 213],
227
+ "peachpuff" => [255, 218, 185],
228
+ "peru" => [205, 133, 63],
229
+ "pink" => [255, 192, 203],
230
+ "plum" => [221, 160, 221],
231
+ "powderblue" => [176, 224, 230],
232
+ "purple" => [128, 0, 128],
233
+ "red" => [255, 0, 0],
234
+ "rosybrown" => [188, 143, 143],
235
+ "royalblue" => [65, 105, 225],
236
+ "saddlebrown" => [139, 69, 19],
237
+ "salmon" => [250, 128, 114],
238
+ "sandybrown" => [244, 164, 96],
239
+ "seagreen" => [46, 139, 87],
240
+ "seashell" => [255, 245, 238],
241
+ "sienna" => [160, 82, 45],
242
+ "silver" => [192, 192, 192],
243
+ "skyblue" => [135, 206, 235],
244
+ "slateblue" => [106, 90, 205],
245
+ "slategray" => [112, 128, 144],
246
+ "slategrey" => [112, 128, 144],
247
+ "snow" => [255, 250, 250],
248
+ "springgreen" => [0, 255, 127],
249
+ "steelblue" => [70, 130, 180],
250
+ "tan" => [210, 180, 140],
251
+ "teal" => [0, 128, 128],
252
+ "thistle" => [216, 191, 216],
253
+ "tomato" => [255, 99, 71],
254
+ "turquoise" => [64, 224, 208],
255
+ "violet" => [238, 130, 238],
256
+ "wheat" => [245, 222, 179],
257
+ "white" => [255, 255, 255],
258
+ "whitesmoke" => [245, 245, 245],
259
+ "yellow" => [255, 255, 0],
260
+ "yellowgreen" => [154, 205, 50],
261
+ }.freeze
262
+
99
263
  # :call-seq:
100
264
  # ColorSpace.device_color_from_specification(gray) => color
101
265
  # ColorSpace.device_color_from_specification(r, g, b) => color
@@ -111,14 +275,32 @@ module HexaPDF
111
275
  # * Three numeric arguments specify an RGB color (see DeviceRGB::Color).
112
276
  # * A string in the format "RRGGBB" where "RR" is the hexadecimal number for the red, "GG"
113
277
  # for the green and "BB" for the blue color value also specifies an RGB color.
278
+ # * As does a string in the format "RGB" where "RR", "GG" and "BB" would be used as the
279
+ # hexadecimal numbers for the red, green and blue color values of an RGB color.
280
+ # * Any other string is treated as a CSS Color Module Level 3 color name, see
281
+ # https://www.w3.org/TR/css-color-3/#svg-color.
114
282
  # * Four numeric arguments specify a CMYK color (see DeviceCMYK::Color).
115
283
  # * An array is treated as if its items were specified separately as arguments.
116
284
  #
117
285
  # Note that it makes a difference whether integer or float values are used because the given
118
- # values are first normalized - see DeviceGray#color, DeviceRGB#color and DeviceCMYK#color.
286
+ # values are first normalized (expected range by the PDF specification is 0.0 - 1.0) - see
287
+ # DeviceGray#color, DeviceRGB#color and DeviceCMYK#color for details.
288
+ #
289
+ # For examples see HexaPDF::Content::Canvas#stroke_color.
119
290
  def self.device_color_from_specification(*spec)
120
291
  spec.flatten!
121
- spec = spec[0].scan(/../).map!(&:hex) if spec.length == 1 && spec[0].kind_of?(String)
292
+ first_item = spec[0]
293
+ if spec.length == 1 && first_item.kind_of?(String)
294
+ spec = if first_item.match?(/\A\h{6}\z/)
295
+ first_item.scan(/../).map!(&:hex)
296
+ elsif first_item.match?(/\A\h{3}\z/)
297
+ first_item.each_char.map {|x| (x*2).hex}
298
+ elsif CSS_COLOR_NAMES.key?(first_item)
299
+ CSS_COLOR_NAMES[first_item]
300
+ else
301
+ raise ArgumentError, "Given string is neither a hex color nor a color name"
302
+ end
303
+ end
122
304
  GlobalConfiguration.constantize('color_space.map', for_components(spec)).new.color(*spec)
123
305
  end
124
306
 
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -40,11 +40,20 @@ module HexaPDF
40
40
  module Content
41
41
  module GraphicObject
42
42
 
43
- # This class describes an elliptical in center parameterization arc that is approximated using
43
+ # This class describes an elliptical arc in center parameterization that is approximated using
44
44
  # Bezier curves. It can be used to draw circles, circular arcs, ellipses and elliptical arcs,
45
45
  # all either in clockwise or counterclockwise direction and optionally inclined in respect to
46
46
  # the x-axis.
47
47
  #
48
+ # This graphic object is registered under the :arc key for use with the
49
+ # HexaPDF::Content::Canvas class.
50
+ #
51
+ # Examples:
52
+ #
53
+ # #>pdf-center
54
+ # arc = canvas.graphic_object(:arc, a: 100, b: 50).stroke
55
+ # arc.draw(canvas).stroke # or: canvas.draw(arc).stroke
56
+ #
48
57
  # See: ELL - https://spaceroots.org/documents/ellipse/elliptical-arc.pdf
49
58
  class Arc
50
59
 
@@ -62,36 +71,111 @@ module HexaPDF
62
71
  # The higher the value the better the approximation will be but it will also take longer
63
72
  # to compute. The value should not be lower than 4. Default value is 6 which already
64
73
  # provides a good approximation.
74
+ #
75
+ # Examples:
76
+ #
77
+ # #>pdf-center
78
+ # arc = canvas.graphic_object(:arc, cx: -50, a: 40, b: 40)
79
+ # arc.max_curves = 2
80
+ # canvas.draw(arc)
81
+ # arc.max_curves = 10
82
+ # canvas.draw(arc, cx: 50)
83
+ # canvas.stroke
65
84
  attr_accessor :max_curves
66
85
 
67
86
  # x-coordinate of center point
87
+ #
88
+ # Examples:
89
+ #
90
+ # #>pdf-center
91
+ # arc = canvas.graphic_object(:arc, a: 30, b: 20)
92
+ # canvas.draw(arc).stroke
93
+ # canvas.stroke_color("red").draw(arc, cx: -50).stroke
68
94
  attr_reader :cx
69
95
 
70
96
  # y-coordinate of center point
97
+ #
98
+ # Examples:
99
+ #
100
+ # #>pdf-center
101
+ # arc = canvas.graphic_object(:arc, a: 30, b: 20)
102
+ # canvas.draw(arc).stroke
103
+ # canvas.stroke_color("red").draw(arc, cy: 50).stroke
71
104
  attr_reader :cy
72
105
 
73
- # Length of semi-major axis
106
+ # Length of semi-major axis which (without altering the #inclination) is parallel to the
107
+ # x-axis
108
+ #
109
+ # Examples:
110
+ #
111
+ # #>pdf-center
112
+ # arc = canvas.graphic_object(:arc, a: 30, b: 30)
113
+ # canvas.draw(arc).stroke
114
+ # canvas.stroke_color("red").draw(arc, a: 60).stroke
74
115
  attr_reader :a
75
116
 
76
- # Length of semi-minor axis
117
+ # Length of semi-minor axis which (without altering the #inclination) is parallel to the
118
+ # y-axis
119
+ #
120
+ # Examples:
121
+ #
122
+ # #>pdf-center
123
+ # arc = canvas.graphic_object(:arc, a: 30, b: 30)
124
+ # canvas.draw(arc).stroke
125
+ # canvas.stroke_color("red").draw(arc, b: 60).stroke
77
126
  attr_reader :b
78
127
 
79
- # Start angle in degrees
128
+ # Start angle of the arc in degrees
129
+ #
130
+ # Examples:
131
+ #
132
+ # #>pdf-center
133
+ # arc = canvas.graphic_object(:arc, a: 30, b: 30)
134
+ # canvas.draw(arc, start_angle: 45).stroke
80
135
  attr_reader :start_angle
81
136
 
82
- # End angle in degrees
137
+ # End angle of the arc in degrees
138
+ #
139
+ # Examples:
140
+ #
141
+ # #>pdf-center
142
+ # arc = canvas.graphic_object(:arc, a: 30, b: 30)
143
+ # canvas.draw(arc, end_angle: 160).stroke
83
144
  attr_reader :end_angle
84
145
 
85
- # Inclination in degrees of semi-major axis in respect to x-axis
146
+ # Inclination in degrees of the semi-major axis with respect to the x-axis
147
+ #
148
+ # Examples:
149
+ #
150
+ # #>pdf-center
151
+ # arc = canvas.graphic_object(:arc, a: 60, b: 30)
152
+ # canvas.draw(arc, inclination: 45).stroke
86
153
  attr_reader :inclination
87
154
 
88
155
  # Direction of arc - if +true+ in clockwise direction, else in counterclockwise direction
156
+ #
157
+ # This is needed when filling paths using the nonzero winding number rule to achieve
158
+ # different effects.
159
+ #
160
+ # Examples:
161
+ #
162
+ # #>pdf-center
163
+ # arc = canvas.graphic_object(:arc, a: 40, b: 40)
164
+ # canvas.draw(arc, cx: -50).draw(arc, cx: 50).
165
+ # draw(arc, cx: -50, b: 80).
166
+ # draw(arc, cx: 50, b: 80, clockwise: true).
167
+ # fill(:nonzero)
89
168
  attr_reader :clockwise
90
169
 
91
170
  # Creates an elliptical arc with default values (a counterclockwise unit circle at the
92
171
  # origin).
172
+ #
173
+ # Examples:
174
+ #
175
+ # #>pdf-center
176
+ # canvas.draw(:arc).stroke
93
177
  def initialize
94
- @max_curves = 6
178
+ @max_curves = nil
95
179
  @cx = @cy = 0
96
180
  @a = @b = 1
97
181
  @start_angle = 0
@@ -135,11 +219,25 @@ module HexaPDF
135
219
  end
136
220
 
137
221
  # Returns the start point of the elliptical arc.
222
+ #
223
+ # Examples:
224
+ #
225
+ # #>pdf-center
226
+ # arc = canvas.graphic_object(:arc, a: 40, b: 30, start_angle: 60)
227
+ # canvas.draw(arc).stroke
228
+ # canvas.fill_color("red").circle(*arc.start_point, 2).fill
138
229
  def start_point
139
230
  evaluate(@start_eta)
140
231
  end
141
232
 
142
233
  # Returns the end point of the elliptical arc.
234
+ #
235
+ # Examples:
236
+ #
237
+ # #>pdf-center
238
+ # arc = canvas.graphic_object(:arc, a: 40, b: 30, end_angle: 245)
239
+ # canvas.draw(arc).stroke
240
+ # canvas.fill_color("red").circle(*arc.end_point, 2).fill
143
241
  def end_point
144
242
  evaluate(@end_eta)
145
243
  end
@@ -157,10 +255,10 @@ module HexaPDF
157
255
  # move the current point to the start point of the arc. Otherwise it is assumed that the
158
256
  # current point already coincides with the start point
159
257
  #
160
- # The #max_curves value is set to the value of the configuration option
161
- # 'graphic_object.arc.max_curves' before drawing.
258
+ # The #max_curves value, if not already changed, is set to the value of the configuration
259
+ # option 'graphic_object.arc.max_curves' before drawing.
162
260
  def draw(canvas, move_to_start: true)
163
- @max_curves = canvas.context.document.config['graphic_object.arc.max_curves']
261
+ @max_curves ||= canvas.context.document.config['graphic_object.arc.max_curves']
164
262
  canvas.move_to(*start_point) if move_to_start
165
263
  curves.each {|x, y, hash| canvas.curve_to(x, y, **hash) }
166
264
  end
@@ -183,7 +281,8 @@ module HexaPDF
183
281
  result = []
184
282
 
185
283
  # Number of curves to use, maximal segment angle is 2*PI/max_curves
186
- n = [@max_curves, ((@end_eta - @start_eta).abs / (2 * Math::PI / @max_curves)).ceil].min
284
+ max_curves = @max_curves || 6
285
+ n = [max_curves, ((@end_eta - @start_eta).abs / (2 * Math::PI / max_curves)).ceil].min
187
286
  d_eta = (@end_eta - @start_eta) / n
188
287
 
189
288
  alpha = Math.sin(d_eta) * (Math.sqrt(4 + 3 * Math.tan(d_eta / 2)**2) - 1) / 3
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -233,11 +233,16 @@ module HexaPDF
233
233
 
234
234
  # Converts the string into UTF-8 encoding, assuming it is a binary string. Otherwise +nil+ is
235
235
  # returned.
236
- def self.convert(str, _type, _document)
236
+ def self.convert(str, _type, document)
237
237
  return unless str.kind_of?(String) && str.encoding == Encoding::BINARY
238
238
 
239
239
  if str.getbyte(0) == 254 && str.getbyte(1) == 255
240
- str[2..-1].force_encoding(Encoding::UTF_16BE).encode(Encoding::UTF_8)
240
+ str = str[2..-1].force_encoding(Encoding::UTF_16BE)
241
+ if str.valid_encoding?
242
+ str.encode!(Encoding::UTF_8)
243
+ else
244
+ document.configuration['document.on_invalid_string'].call(str)
245
+ end
241
246
  else
242
247
  Utils::PDFDocEncoding.convert_to_utf8(str)
243
248
  end
@@ -349,9 +354,30 @@ module HexaPDF
349
354
 
350
355
  end
351
356
 
357
+ # Converter module for fields of type Integer.
358
+ module IntegerConverter
359
+
360
+ # This converter is usable if the +type+ is Integer.
361
+ def self.usable_for?(type)
362
+ type == Integer
363
+ end
364
+
365
+ # :nodoc:
366
+ def self.additional_types
367
+ end
368
+
369
+ # Converts a Float value into an Integer if the float is equal to its integer value. Otherwise
370
+ # returns +nil+
371
+ def self.convert(data, _type, _document)
372
+ return unless data.kind_of?(Float) && data == data.to_i
373
+ data.to_i
374
+ end
375
+
376
+ end
377
+
352
378
  Field.converters.replace([FileSpecificationConverter, DictionaryConverter, ArrayConverter,
353
379
  StringConverter, PDFByteStringConverter, DateConverter,
354
- RectangleConverter])
380
+ RectangleConverter, IntegerConverter])
355
381
 
356
382
  end
357
383
 
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -116,9 +116,9 @@ module HexaPDF
116
116
  end
117
117
 
118
118
  @document.pages.each do |page|
119
- page[:Annots]&.each do |annot|
119
+ page.each_annotation do |annot|
120
120
  next unless annot[:Subtype] == :FileAttachment
121
- spec = @document.deref(annot[:FS])
121
+ spec = annot[:FS]
122
122
  yield(spec) unless seen.key?(spec)
123
123
  seen[spec] = true
124
124
  end
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as