hexapdf 0.17.1 → 0.17.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1024 -0
  3. data/LICENSE +29 -0
  4. data/README.md +129 -0
  5. data/Rakefile +109 -0
  6. data/agpl-3.0.txt +661 -0
  7. data/examples/001-hello_world.rb +16 -0
  8. data/examples/002-graphics.rb +275 -0
  9. data/examples/003-arcs.rb +50 -0
  10. data/examples/004-optimizing.rb +23 -0
  11. data/examples/005-merging.rb +27 -0
  12. data/examples/006-standard_pdf_fonts.rb +73 -0
  13. data/examples/007-truetype.rb +42 -0
  14. data/examples/008-show_char_bboxes.rb +55 -0
  15. data/examples/009-text_layouter_alignment.rb +47 -0
  16. data/examples/010-text_layouter_inline_boxes.rb +64 -0
  17. data/examples/011-text_layouter_line_wrapping.rb +57 -0
  18. data/examples/012-text_layouter_styling.rb +122 -0
  19. data/examples/013-text_layouter_shapes.rb +176 -0
  20. data/examples/014-text_in_polygon.rb +60 -0
  21. data/examples/015-boxes.rb +76 -0
  22. data/examples/016-frame_automatic_box_placement.rb +90 -0
  23. data/examples/017-frame_text_flow.rb +60 -0
  24. data/examples/018-composer.rb +44 -0
  25. data/examples/019-acro_form.rb +88 -0
  26. data/examples/emoji-smile.png +0 -0
  27. data/examples/emoji-wink.png +0 -0
  28. data/examples/machupicchu.jpg +0 -0
  29. data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +66 -0
  30. data/lib/hexapdf/content/graphic_object/geom2d.rb +13 -0
  31. data/lib/hexapdf/version.rb +1 -1
  32. data/test/data/aes-test-vectors/CBCGFSbox-128-decrypt.data.gz +0 -0
  33. data/test/data/aes-test-vectors/CBCGFSbox-128-encrypt.data.gz +0 -0
  34. data/test/data/aes-test-vectors/CBCGFSbox-192-decrypt.data.gz +0 -0
  35. data/test/data/aes-test-vectors/CBCGFSbox-192-encrypt.data.gz +0 -0
  36. data/test/data/aes-test-vectors/CBCGFSbox-256-decrypt.data.gz +0 -0
  37. data/test/data/aes-test-vectors/CBCGFSbox-256-encrypt.data.gz +0 -0
  38. data/test/data/aes-test-vectors/CBCKeySbox-128-decrypt.data.gz +0 -0
  39. data/test/data/aes-test-vectors/CBCKeySbox-128-encrypt.data.gz +0 -0
  40. data/test/data/aes-test-vectors/CBCKeySbox-192-decrypt.data.gz +0 -0
  41. data/test/data/aes-test-vectors/CBCKeySbox-192-encrypt.data.gz +0 -0
  42. data/test/data/aes-test-vectors/CBCKeySbox-256-decrypt.data.gz +0 -0
  43. data/test/data/aes-test-vectors/CBCKeySbox-256-encrypt.data.gz +0 -0
  44. data/test/data/aes-test-vectors/CBCVarKey-128-decrypt.data.gz +0 -0
  45. data/test/data/aes-test-vectors/CBCVarKey-128-encrypt.data.gz +0 -0
  46. data/test/data/aes-test-vectors/CBCVarKey-192-decrypt.data.gz +0 -0
  47. data/test/data/aes-test-vectors/CBCVarKey-192-encrypt.data.gz +0 -0
  48. data/test/data/aes-test-vectors/CBCVarKey-256-decrypt.data.gz +0 -0
  49. data/test/data/aes-test-vectors/CBCVarKey-256-encrypt.data.gz +0 -0
  50. data/test/data/aes-test-vectors/CBCVarTxt-128-decrypt.data.gz +0 -0
  51. data/test/data/aes-test-vectors/CBCVarTxt-128-encrypt.data.gz +0 -0
  52. data/test/data/aes-test-vectors/CBCVarTxt-192-decrypt.data.gz +0 -0
  53. data/test/data/aes-test-vectors/CBCVarTxt-192-encrypt.data.gz +0 -0
  54. data/test/data/aes-test-vectors/CBCVarTxt-256-decrypt.data.gz +0 -0
  55. data/test/data/aes-test-vectors/CBCVarTxt-256-encrypt.data.gz +0 -0
  56. data/test/data/fonts/Ubuntu-Title.ttf +0 -0
  57. data/test/data/images/cmyk.jpg +0 -0
  58. data/test/data/images/fillbytes.jpg +0 -0
  59. data/test/data/images/gray.jpg +0 -0
  60. data/test/data/images/greyscale-1bit.png +0 -0
  61. data/test/data/images/greyscale-2bit.png +0 -0
  62. data/test/data/images/greyscale-4bit.png +0 -0
  63. data/test/data/images/greyscale-8bit.png +0 -0
  64. data/test/data/images/greyscale-alpha-8bit.png +0 -0
  65. data/test/data/images/greyscale-trns-8bit.png +0 -0
  66. data/test/data/images/greyscale-with-gamma1.0.png +0 -0
  67. data/test/data/images/greyscale-with-gamma1.5.png +0 -0
  68. data/test/data/images/indexed-1bit.png +0 -0
  69. data/test/data/images/indexed-2bit.png +0 -0
  70. data/test/data/images/indexed-4bit.png +0 -0
  71. data/test/data/images/indexed-8bit.png +0 -0
  72. data/test/data/images/indexed-alpha-4bit.png +0 -0
  73. data/test/data/images/indexed-alpha-8bit.png +0 -0
  74. data/test/data/images/rgb.jpg +0 -0
  75. data/test/data/images/truecolour-8bit.png +0 -0
  76. data/test/data/images/truecolour-alpha-8bit.png +0 -0
  77. data/test/data/images/truecolour-gama-chrm-8bit.png +0 -0
  78. data/test/data/images/truecolour-srgb-8bit.png +0 -0
  79. data/test/data/images/ycck.jpg +0 -0
  80. data/test/data/minimal.pdf +44 -0
  81. data/test/data/standard-security-handler/README +9 -0
  82. data/test/data/standard-security-handler/bothpwd-aes-128bit-V4.pdf +44 -0
  83. data/test/data/standard-security-handler/bothpwd-aes-256bit-V5.pdf +0 -0
  84. data/test/data/standard-security-handler/bothpwd-arc4-128bit-V2.pdf +43 -0
  85. data/test/data/standard-security-handler/bothpwd-arc4-128bit-V4.pdf +43 -0
  86. data/test/data/standard-security-handler/bothpwd-arc4-40bit-V1.pdf +0 -0
  87. data/test/data/standard-security-handler/nopwd-aes-128bit-V4.pdf +43 -0
  88. data/test/data/standard-security-handler/nopwd-aes-256bit-V5.pdf +0 -0
  89. data/test/data/standard-security-handler/nopwd-arc4-128bit-V2.pdf +43 -0
  90. data/test/data/standard-security-handler/nopwd-arc4-128bit-V4.pdf +43 -0
  91. data/test/data/standard-security-handler/nopwd-arc4-40bit-V1.pdf +43 -0
  92. data/test/data/standard-security-handler/ownerpwd-aes-128bit-V4.pdf +0 -0
  93. data/test/data/standard-security-handler/ownerpwd-aes-256bit-V5.pdf +43 -0
  94. data/test/data/standard-security-handler/ownerpwd-arc4-128bit-V2.pdf +43 -0
  95. data/test/data/standard-security-handler/ownerpwd-arc4-128bit-V4.pdf +43 -0
  96. data/test/data/standard-security-handler/ownerpwd-arc4-40bit-V1.pdf +43 -0
  97. data/test/data/standard-security-handler/userpwd-aes-128bit-V4.pdf +43 -0
  98. data/test/data/standard-security-handler/userpwd-aes-256bit-V5.pdf +43 -0
  99. data/test/data/standard-security-handler/userpwd-arc4-128bit-V2.pdf +0 -0
  100. data/test/data/standard-security-handler/userpwd-arc4-128bit-V4.pdf +0 -0
  101. data/test/data/standard-security-handler/userpwd-arc4-40bit-V1.pdf +43 -0
  102. data/test/hexapdf/common_tokenizer_tests.rb +236 -0
  103. data/test/hexapdf/content/common.rb +39 -0
  104. data/test/hexapdf/content/graphic_object/test_arc.rb +102 -0
  105. data/test/hexapdf/content/graphic_object/test_endpoint_arc.rb +90 -0
  106. data/test/hexapdf/content/graphic_object/test_geom2d.rb +79 -0
  107. data/test/hexapdf/content/graphic_object/test_solid_arc.rb +86 -0
  108. data/test/hexapdf/content/test_canvas.rb +1279 -0
  109. data/test/hexapdf/content/test_color_space.rb +176 -0
  110. data/test/hexapdf/content/test_graphics_state.rb +151 -0
  111. data/test/hexapdf/content/test_operator.rb +619 -0
  112. data/test/hexapdf/content/test_parser.rb +99 -0
  113. data/test/hexapdf/content/test_processor.rb +163 -0
  114. data/test/hexapdf/content/test_transformation_matrix.rb +64 -0
  115. data/test/hexapdf/document/test_files.rb +72 -0
  116. data/test/hexapdf/document/test_fonts.rb +60 -0
  117. data/test/hexapdf/document/test_images.rb +72 -0
  118. data/test/hexapdf/document/test_pages.rb +130 -0
  119. data/test/hexapdf/encryption/common.rb +87 -0
  120. data/test/hexapdf/encryption/test_aes.rb +129 -0
  121. data/test/hexapdf/encryption/test_arc4.rb +39 -0
  122. data/test/hexapdf/encryption/test_fast_aes.rb +17 -0
  123. data/test/hexapdf/encryption/test_fast_arc4.rb +12 -0
  124. data/test/hexapdf/encryption/test_identity.rb +21 -0
  125. data/test/hexapdf/encryption/test_ruby_aes.rb +23 -0
  126. data/test/hexapdf/encryption/test_ruby_arc4.rb +20 -0
  127. data/test/hexapdf/encryption/test_security_handler.rb +380 -0
  128. data/test/hexapdf/encryption/test_standard_security_handler.rb +322 -0
  129. data/test/hexapdf/filter/common.rb +53 -0
  130. data/test/hexapdf/filter/test_ascii85_decode.rb +59 -0
  131. data/test/hexapdf/filter/test_ascii_hex_decode.rb +38 -0
  132. data/test/hexapdf/filter/test_crypt.rb +21 -0
  133. data/test/hexapdf/filter/test_encryption.rb +24 -0
  134. data/test/hexapdf/filter/test_flate_decode.rb +44 -0
  135. data/test/hexapdf/filter/test_lzw_decode.rb +52 -0
  136. data/test/hexapdf/filter/test_predictor.rb +219 -0
  137. data/test/hexapdf/filter/test_run_length_decode.rb +32 -0
  138. data/test/hexapdf/font/cmap/test_parser.rb +102 -0
  139. data/test/hexapdf/font/cmap/test_writer.rb +66 -0
  140. data/test/hexapdf/font/encoding/test_base.rb +45 -0
  141. data/test/hexapdf/font/encoding/test_difference_encoding.rb +29 -0
  142. data/test/hexapdf/font/encoding/test_glyph_list.rb +59 -0
  143. data/test/hexapdf/font/encoding/test_zapf_dingbats_encoding.rb +16 -0
  144. data/test/hexapdf/font/test_cmap.rb +104 -0
  145. data/test/hexapdf/font/test_encoding.rb +27 -0
  146. data/test/hexapdf/font/test_invalid_glyph.rb +34 -0
  147. data/test/hexapdf/font/test_true_type_wrapper.rb +186 -0
  148. data/test/hexapdf/font/test_type1_wrapper.rb +107 -0
  149. data/test/hexapdf/font/true_type/common.rb +17 -0
  150. data/test/hexapdf/font/true_type/table/common.rb +27 -0
  151. data/test/hexapdf/font/true_type/table/test_cmap.rb +47 -0
  152. data/test/hexapdf/font/true_type/table/test_cmap_subtable.rb +141 -0
  153. data/test/hexapdf/font/true_type/table/test_directory.rb +30 -0
  154. data/test/hexapdf/font/true_type/table/test_glyf.rb +58 -0
  155. data/test/hexapdf/font/true_type/table/test_head.rb +56 -0
  156. data/test/hexapdf/font/true_type/table/test_hhea.rb +26 -0
  157. data/test/hexapdf/font/true_type/table/test_hmtx.rb +30 -0
  158. data/test/hexapdf/font/true_type/table/test_kern.rb +61 -0
  159. data/test/hexapdf/font/true_type/table/test_loca.rb +33 -0
  160. data/test/hexapdf/font/true_type/table/test_maxp.rb +50 -0
  161. data/test/hexapdf/font/true_type/table/test_name.rb +76 -0
  162. data/test/hexapdf/font/true_type/table/test_os2.rb +55 -0
  163. data/test/hexapdf/font/true_type/table/test_post.rb +78 -0
  164. data/test/hexapdf/font/true_type/test_builder.rb +42 -0
  165. data/test/hexapdf/font/true_type/test_font.rb +116 -0
  166. data/test/hexapdf/font/true_type/test_optimizer.rb +26 -0
  167. data/test/hexapdf/font/true_type/test_subsetter.rb +73 -0
  168. data/test/hexapdf/font/true_type/test_table.rb +48 -0
  169. data/test/hexapdf/font/type1/common.rb +6 -0
  170. data/test/hexapdf/font/type1/test_afm_parser.rb +65 -0
  171. data/test/hexapdf/font/type1/test_font.rb +104 -0
  172. data/test/hexapdf/font/type1/test_font_metrics.rb +22 -0
  173. data/test/hexapdf/font/type1/test_pfb_parser.rb +37 -0
  174. data/test/hexapdf/font_loader/test_from_configuration.rb +43 -0
  175. data/test/hexapdf/font_loader/test_from_file.rb +36 -0
  176. data/test/hexapdf/font_loader/test_standard14.rb +33 -0
  177. data/test/hexapdf/image_loader/test_jpeg.rb +93 -0
  178. data/test/hexapdf/image_loader/test_pdf.rb +47 -0
  179. data/test/hexapdf/image_loader/test_png.rb +259 -0
  180. data/test/hexapdf/layout/test_box.rb +154 -0
  181. data/test/hexapdf/layout/test_frame.rb +350 -0
  182. data/test/hexapdf/layout/test_image_box.rb +73 -0
  183. data/test/hexapdf/layout/test_inline_box.rb +71 -0
  184. data/test/hexapdf/layout/test_line.rb +206 -0
  185. data/test/hexapdf/layout/test_style.rb +790 -0
  186. data/test/hexapdf/layout/test_text_box.rb +140 -0
  187. data/test/hexapdf/layout/test_text_fragment.rb +375 -0
  188. data/test/hexapdf/layout/test_text_layouter.rb +758 -0
  189. data/test/hexapdf/layout/test_text_shaper.rb +62 -0
  190. data/test/hexapdf/layout/test_width_from_polygon.rb +109 -0
  191. data/test/hexapdf/task/test_dereference.rb +51 -0
  192. data/test/hexapdf/task/test_optimize.rb +162 -0
  193. data/test/hexapdf/test_composer.rb +258 -0
  194. data/test/hexapdf/test_configuration.rb +93 -0
  195. data/test/hexapdf/test_data_dir.rb +32 -0
  196. data/test/hexapdf/test_dictionary.rb +340 -0
  197. data/test/hexapdf/test_dictionary_fields.rb +269 -0
  198. data/test/hexapdf/test_document.rb +641 -0
  199. data/test/hexapdf/test_filter.rb +100 -0
  200. data/test/hexapdf/test_importer.rb +106 -0
  201. data/test/hexapdf/test_object.rb +258 -0
  202. data/test/hexapdf/test_parser.rb +645 -0
  203. data/test/hexapdf/test_pdf_array.rb +169 -0
  204. data/test/hexapdf/test_rectangle.rb +73 -0
  205. data/test/hexapdf/test_reference.rb +50 -0
  206. data/test/hexapdf/test_revision.rb +188 -0
  207. data/test/hexapdf/test_revisions.rb +196 -0
  208. data/test/hexapdf/test_serializer.rb +195 -0
  209. data/test/hexapdf/test_stream.rb +274 -0
  210. data/test/hexapdf/test_tokenizer.rb +80 -0
  211. data/test/hexapdf/test_type.rb +18 -0
  212. data/test/hexapdf/test_writer.rb +140 -0
  213. data/test/hexapdf/test_xref_section.rb +61 -0
  214. data/test/hexapdf/type/acro_form/test_appearance_generator.rb +795 -0
  215. data/test/hexapdf/type/acro_form/test_button_field.rb +308 -0
  216. data/test/hexapdf/type/acro_form/test_choice_field.rb +220 -0
  217. data/test/hexapdf/type/acro_form/test_field.rb +259 -0
  218. data/test/hexapdf/type/acro_form/test_form.rb +357 -0
  219. data/test/hexapdf/type/acro_form/test_signature_field.rb +38 -0
  220. data/test/hexapdf/type/acro_form/test_text_field.rb +201 -0
  221. data/test/hexapdf/type/acro_form/test_variable_text_field.rb +88 -0
  222. data/test/hexapdf/type/actions/test_launch.rb +24 -0
  223. data/test/hexapdf/type/actions/test_uri.rb +23 -0
  224. data/test/hexapdf/type/annotations/test_markup_annotation.rb +22 -0
  225. data/test/hexapdf/type/annotations/test_text.rb +34 -0
  226. data/test/hexapdf/type/annotations/test_widget.rb +225 -0
  227. data/test/hexapdf/type/test_annotation.rb +97 -0
  228. data/test/hexapdf/type/test_catalog.rb +48 -0
  229. data/test/hexapdf/type/test_cid_font.rb +61 -0
  230. data/test/hexapdf/type/test_file_specification.rb +141 -0
  231. data/test/hexapdf/type/test_font.rb +67 -0
  232. data/test/hexapdf/type/test_font_descriptor.rb +61 -0
  233. data/test/hexapdf/type/test_font_simple.rb +176 -0
  234. data/test/hexapdf/type/test_font_true_type.rb +31 -0
  235. data/test/hexapdf/type/test_font_type0.rb +120 -0
  236. data/test/hexapdf/type/test_font_type1.rb +142 -0
  237. data/test/hexapdf/type/test_font_type3.rb +26 -0
  238. data/test/hexapdf/type/test_form.rb +120 -0
  239. data/test/hexapdf/type/test_image.rb +261 -0
  240. data/test/hexapdf/type/test_info.rb +9 -0
  241. data/test/hexapdf/type/test_object_stream.rb +117 -0
  242. data/test/hexapdf/type/test_page.rb +598 -0
  243. data/test/hexapdf/type/test_page_tree_node.rb +315 -0
  244. data/test/hexapdf/type/test_resources.rb +209 -0
  245. data/test/hexapdf/type/test_trailer.rb +116 -0
  246. data/test/hexapdf/type/test_xref_stream.rb +143 -0
  247. data/test/hexapdf/utils/test_bit_field.rb +63 -0
  248. data/test/hexapdf/utils/test_bit_stream.rb +69 -0
  249. data/test/hexapdf/utils/test_graphics_helpers.rb +37 -0
  250. data/test/hexapdf/utils/test_lru_cache.rb +22 -0
  251. data/test/hexapdf/utils/test_object_hash.rb +120 -0
  252. data/test/hexapdf/utils/test_pdf_doc_encoding.rb +18 -0
  253. data/test/hexapdf/utils/test_sorted_tree_node.rb +239 -0
  254. data/test/test_helper.rb +58 -0
  255. metadata +263 -3
@@ -0,0 +1,88 @@
1
+ # # PDF Forms
2
+ #
3
+ # PDF files can be used for interactive forms, containing various types of form
4
+ # fields. HexaPDF supports the creation and processing of these forms.
5
+ #
6
+ # This example show-cases how to create the various form field types and their
7
+ # possible standard appearances.
8
+ #
9
+ # Usage:
10
+ # : `ruby acro_form.rb`
11
+ #
12
+
13
+ require 'hexapdf'
14
+
15
+ doc = HexaPDF::Document.new
16
+ page = doc.pages.add
17
+ canvas = page.canvas
18
+
19
+ canvas.font("Helvetica", size: 36)
20
+ canvas.text("Form Example", at: [50, 750])
21
+ form = doc.acro_form(create: true)
22
+
23
+ canvas.font_size(16)
24
+ canvas.text("Check boxes", at: [50, 650])
25
+ [:check, :circle, :cross, :diamond, :square, :star].each_with_index do |symbol, index|
26
+ cb = form.create_check_box("Checkbox #{index}")
27
+ widget = cb.create_widget(page, Rect: [200 + 50 * index, 640, 240 + 50 * index, 680])
28
+ widget.background_color(1 - 0.05 * index)
29
+ widget.marker_style(style: symbol, color: [0.166 * index, 0, 1 - 0.166 * index],
30
+ size: 7 * index)
31
+ cb.field_value = true
32
+ end
33
+
34
+ canvas.text("Radio buttons", at: [50, 550])
35
+ rb = form.create_radio_button("Radio")
36
+ [:check, :circle, :cross, :diamond, :square, :star].each_with_index do |symbol, index|
37
+ widget = rb.create_widget(page, value: :"button#{index}",
38
+ Rect: [200 + 50 * index, 540, 240 + 50 * index, 580])
39
+ widget.background_color(1 - 0.05 * index)
40
+ widget.marker_style(style: symbol, color: [0.166 * index, 0, 1 - 0.166 * index],
41
+ size: 7 * index)
42
+ end
43
+ rb.field_value = :button0
44
+
45
+ canvas.text("Text fields", at: [50, 450])
46
+
47
+ canvas.text("Single line", at: [70, 420])
48
+ tx = form.create_text_field("Single Line", font_size: 16)
49
+ widget = tx.create_widget(page, Rect: [200, 415, 500, 435])
50
+ tx.field_value = "A sample test string!"
51
+
52
+ canvas.text("Multiline", at: [70, 390])
53
+ tx = form.create_multiline_text_field("Multiline", font_size: 0, align: :right)
54
+ widget = tx.create_widget(page, Rect: [200, 325, 500, 405])
55
+ widget.border_style(color: 0, width: 1)
56
+ tx.field_value = "A sample test string! " * 30 + "\nNew line\n\nAnother line"
57
+
58
+ canvas.text("Password", at: [70, 300])
59
+ tx = form.create_password_field("Password", font_size: 16)
60
+ widget = tx.create_widget(page, Rect: [200, 295, 500, 315])
61
+
62
+ canvas.text("File select", at: [70, 270])
63
+ tx = form.create_file_select_field("File Select", font_size: 16)
64
+ widget = tx.create_widget(page, Rect: [200, 265, 500, 285])
65
+ tx.field_value = "path/to/file.pdf"
66
+
67
+ canvas.text("Comb", at: [70, 240])
68
+ tx = form.create_comb_text_field("Comb field", max_chars: 10, font_size: 16, align: :center)
69
+ widget = tx.create_widget(page, Rect: [200, 220, 500, 255])
70
+ widget.border_style(color: [30, 128, 0], width: 1)
71
+ tx.field_value = 'Hello'
72
+
73
+ canvas.text("Combo Box", at: [50, 170])
74
+ cb = form.create_combo_box("Combo Box", font_size: 12, editable: true,
75
+ option_items: ['Value 1', 'Another value', 'Choose me!'])
76
+ widget = cb.create_widget(page, Rect: [200, 150, 500, 185])
77
+ widget.border_style(width: 1)
78
+ cb.field_value = 'Another value'
79
+
80
+ canvas.text("List Box", at: [50, 120])
81
+ lb = form.create_list_box("List Box", font_size: 15, align: :center, multi_select: true,
82
+ option_items: 1.upto(7).map {|i| "Value #{i}" })
83
+ widget = lb.create_widget(page, Rect: [200, 50, 500, 135])
84
+ widget.border_style(width: 1)
85
+ lb.list_box_top_index = 1
86
+ lb.field_value = ['Value 6', 'Value 2']
87
+
88
+ doc.write('acro_form.pdf', optimize: true)
Binary file
Binary file
Binary file
@@ -43,6 +43,15 @@ module HexaPDF
43
43
  # This class describes an elliptical arc in endpoint parameterization. It allows one to
44
44
  # generate an arc from the current point to a given point, similar to Content::Canvas#line_to.
45
45
  #
46
+ # This graphic object is registered under the :endpoint_arc key for use with the
47
+ # HexaPDF::Content::Canvas class.
48
+ #
49
+ # Examples:
50
+ #
51
+ # #>pdf-center
52
+ # arc = canvas.graphic_object(:endpoint_arc, x: 50, y: 20, a: 30, b: 10).stroke
53
+ # arc.move_to(0, 0).draw(canvas).stroke # or: canvas.draw(arc).stroke
54
+ #
46
55
  # See: GraphicObject::Arc, ARC - https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes
47
56
  class EndpointArc
48
57
 
@@ -58,29 +67,86 @@ module HexaPDF
58
67
  end
59
68
 
60
69
  # x-coordinate of endpoint
70
+ #
71
+ # Examples:
72
+ #
73
+ # #>pdf-center
74
+ # arc = canvas.graphic_object(:endpoint_arc, x: 50, y: 20, a: 30, b: 20)
75
+ # canvas.move_to(0, 0).draw(arc).stroke
76
+ # canvas.stroke_color("red").move_to(0, 0).draw(arc, x: -50).stroke
61
77
  attr_reader :x
62
78
 
63
79
  # y-coordinate of endpoint
80
+ #
81
+ # Examples:
82
+ #
83
+ # #>pdf-center
84
+ # arc = canvas.graphic_object(:endpoint_arc, x: 50, y: 20, a: 30, b: 20)
85
+ # canvas.move_to(0, 0).draw(arc).stroke
86
+ # canvas.stroke_color("red").move_to(0, 0).draw(arc, y: -20).stroke
64
87
  attr_reader :y
65
88
 
66
89
  # Length of semi-major axis
90
+ #
91
+ # Examples:
92
+ #
93
+ # #>pdf-center
94
+ # arc = canvas.graphic_object(:endpoint_arc, x: 50, y: 20, a: 30, b: 20)
95
+ # canvas.move_to(0, 0).draw(arc).stroke
96
+ # canvas.stroke_color("red").move_to(0, 0).draw(arc, a: 40).stroke
67
97
  attr_reader :a
68
98
 
69
99
  # Length of semi-minor axis
100
+ #
101
+ # Examples:
102
+ #
103
+ # #>pdf-center
104
+ # arc = canvas.graphic_object(:endpoint_arc, x: 50, y: 20, a: 30, b: 20)
105
+ # canvas.move_to(0, 0).draw(arc).stroke
106
+ # canvas.stroke_color("red").move_to(0, 0).draw(arc, b: 50).stroke
70
107
  attr_reader :b
71
108
 
72
109
  # Inclination in degrees of semi-major axis in respect to x-axis
110
+ #
111
+ # Examples:
112
+ #
113
+ # #>pdf-center
114
+ # arc = canvas.graphic_object(:endpoint_arc, x: 50, y: 20, a: 30, b: 20)
115
+ # canvas.move_to(0, 0).draw(arc).stroke
116
+ # canvas.stroke_color("red").move_to(0, 0).draw(arc, inclination: 45).stroke
73
117
  attr_reader :inclination
74
118
 
75
119
  # Large arc choice - if +true+ use the large arc (i.e. the one spanning more than 180
76
120
  # degrees), else the small arc
121
+ #
122
+ # Examples:
123
+ #
124
+ # #>pdf-center
125
+ # arc = canvas.graphic_object(:endpoint_arc, x: 50, y: 20, a: 30, b: 20)
126
+ # canvas.move_to(0, 0).draw(arc).stroke
127
+ # canvas.stroke_color("red").move_to(0, 0).draw(arc, large_arc: false, clockwise: true).stroke
77
128
  attr_reader :large_arc
78
129
 
79
130
  # Direction of arc - if +true+ in clockwise direction, else in counterclockwise direction
131
+ #
132
+ # This is needed, for example, when filling paths using the nonzero winding number rule to achieve
133
+ # different effects.
134
+ #
135
+ # Examples:
136
+ #
137
+ # #>pdf-center
138
+ # arc = canvas.graphic_object(:endpoint_arc, x: 50, y: 20, a: 30, b: 20)
139
+ # canvas.move_to(0, 0).draw(arc).stroke
140
+ # canvas.stroke_color("red").move_to(0, 0).draw(arc, clockwise: true).stroke
80
141
  attr_reader :clockwise
81
142
 
82
143
  # Creates an endpoint arc with default values x=0, y=0, a=0, b=0, inclination=0,
83
144
  # large_arc=true, clockwise=false (a line to the origin).
145
+ #
146
+ # Examples:
147
+ #
148
+ # #>pdf-center
149
+ # canvas.move_to(30, 30).draw(:endpoint_arc).stroke
84
150
  def initialize
85
151
  @x = @y = 0
86
152
  @a = @b = 0
@@ -57,9 +57,22 @@ module HexaPDF
57
57
  attr_accessor :object
58
58
 
59
59
  # The radius to use when drawing Geom2D::Point objects; defaults to 1
60
+ #
61
+ # Examples:
62
+ #
63
+ # #>pdf-center
64
+ # canvas.draw(:geom2d, object: ::Geom2D::Point(0, 0))
65
+ # canvas.draw(:geom2d, object: ::Geom2D::Point(50, 0), point_radius: 5)
60
66
  attr_accessor :point_radius
61
67
 
62
68
  # Specifies whether only paths should be drawn or if they should be stroked/filled too
69
+ # (default).
70
+ #
71
+ # Examples:
72
+ #
73
+ # #>pdf-center
74
+ # canvas.draw(:geom2d, object: ::Geom2D::Segment([0, 0], [0, 50]))
75
+ # canvas.draw(:geom2d, object: ::Geom2D::Segment([0, 0], [50, 0]), path_only: true)
63
76
  attr_accessor :path_only
64
77
 
65
78
  # Creates a Geom2D drawing support object.
@@ -37,6 +37,6 @@
37
37
  module HexaPDF
38
38
 
39
39
  # The version of HexaPDF.
40
- VERSION = '0.17.1'
40
+ VERSION = '0.17.2'
41
41
 
42
42
  end
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,44 @@
1
+ %PDF-1.2
2
+ %����
3
+ 1 0 obj
4
+ << /Pages 2 0 R /Type /Catalog >>
5
+ endobj
6
+ 2 0 obj
7
+ << /Count 1 /Kids [ 3 0 R ] /MediaBox [ 0 0 612 446 ] /Type /Pages >>
8
+ endobj
9
+ 3 0 obj
10
+ << /Contents 4 0 R /Parent 2 0 R /Resources 5 0 R /Type /Page >>
11
+ endobj
12
+ 4 0 obj
13
+ << /Length 51 >>
14
+ stream
15
+ BT
16
+ /F1 24 Tf
17
+ 1 0 0 1 260 254 Tm
18
+ (Hello World)Tj
19
+ ET
20
+ endstream
21
+ endobj
22
+ 5 0 obj
23
+ << /Font << /F1 6 0 R >> /ProcSet [ /PDF /Text ] >>
24
+ endobj
25
+ 6 0 obj
26
+ << /BaseFont /Helvetica /Name /F1 /Subtype /Type1 /Type /Font >>
27
+ endobj
28
+ 7 0 obj
29
+ <</ModDate (D:20150409164600)>>
30
+ endobj
31
+ xref
32
+ 0 8
33
+ 0000000000 65535 f
34
+ 0000000015 00000 n
35
+ 0000000064 00000 n
36
+ 0000000149 00000 n
37
+ 0000000229 00000 n
38
+ 0000000329 00000 n
39
+ 0000000396 00000 n
40
+ 0000000476 00000 n
41
+ trailer << /Root 1 0 R /Info 7 0 R /Size 8 /ID [<6790ffa610024e78369114311fc0df96><6790ffa610024e78369114311fc0df96>] >>
42
+ startxref
43
+ 523
44
+ %%EOF
@@ -0,0 +1,9 @@
1
+ These files have been created by encrypting the minimal.pdf file.
2
+ The used encryption algorithm as well as the key length is encoded
3
+ in the files name.
4
+
5
+ The prefix shows which if any password was used:
6
+ * nopwd: No password was set.
7
+ * userpwd: An user password of 'uhexapdf' has been set.
8
+ * ownerpwd: An owner password of 'ohexapdf' has been set.
9
+ * bothpwd: Both the above user and owner passwords have been set.
@@ -0,0 +1,44 @@
1
+ %PDF-1.6
2
+ %����
3
+ 1 0 obj
4
+ << /Pages 3 0 R /Type /Catalog >>
5
+ endobj
6
+ 2 0 obj
7
+ << /ModDate <b4286731bb75a1fb638cb333dfba06afb0e6e5e4f9b5229e8561312123942a87ee51ce88cecfa5ebfc6c4e6dd107ecb6> >>
8
+ endobj
9
+ 3 0 obj
10
+ << /Count 1 /Kids [ 4 0 R ] /MediaBox [ 0 0 612 446 ] /Type /Pages >>
11
+ endobj
12
+ 4 0 obj
13
+ << /Contents 5 0 R /Parent 3 0 R /Resources 6 0 R /Type /Page >>
14
+ endobj
15
+ 5 0 obj
16
+ << /Length 80 >>
17
+ stream
18
+ ��=����� ����3&���m���L
19
+ F}�&���o�}�����ɱH+L9�c������3��8�6�[�3d�q�Q���r�Iendstream
20
+ endobj
21
+ 6 0 obj
22
+ << /Font << /F1 7 0 R >> /ProcSet [ /PDF /Text ] >>
23
+ endobj
24
+ 7 0 obj
25
+ << /BaseFont /Helvetica /Name /F1 /Subtype /Type1 /Type /Font >>
26
+ endobj
27
+ 8 0 obj
28
+ << /CF << /StdCF << /AuthEvent /DocOpen /CFM /AESV2 /Length 16 >> >> /Filter /Standard /Length 128 /O <1517aad6ec33e7aaa17972b91854f2f7c05c11fc7fcafe7df725ffcfd4c55705> /P -4 /R 4 /StmF /StdCF /StrF /StdCF /U <6ccfb47c809a4bab70d578d957cee8240122456a91bae5134273a6db134c87c4> /V 4 >>
29
+ endobj
30
+ xref
31
+ 0 9
32
+ 0000000000 65535 f
33
+ 0000000015 00000 n
34
+ 0000000064 00000 n
35
+ 0000000193 00000 n
36
+ 0000000278 00000 n
37
+ 0000000358 00000 n
38
+ 0000000487 00000 n
39
+ 0000000554 00000 n
40
+ 0000000634 00000 n
41
+ trailer << /Info 2 0 R /Root 1 0 R /Size 9 /ID [<6790ffa610024e78369114311fc0df96><dfcc7658b36e2ba5673af5e16cf91f4e>] /Encrypt 8 0 R >>
42
+ startxref
43
+ 933
44
+ %%EOF
@@ -0,0 +1,43 @@
1
+ %PDF-1.4
2
+ %����
3
+ 1 0 obj
4
+ << /Pages 3 0 R /Type /Catalog >>
5
+ endobj
6
+ 2 0 obj
7
+ << /ModDate <a4edf0aa882dd1e784a1f0d956592496> >>
8
+ endobj
9
+ 3 0 obj
10
+ << /Count 1 /Kids [ 4 0 R ] /MediaBox [ 0 0 612 446 ] /Type /Pages >>
11
+ endobj
12
+ 4 0 obj
13
+ << /Contents 5 0 R /Parent 3 0 R /Resources 6 0 R /Type /Page >>
14
+ endobj
15
+ 5 0 obj
16
+ << /Length 51 >>
17
+ stream
18
+ ��&X*�2�Р#�b&�
19
  �X\4t��=���~YCa�4��K�v�l���endstream
20
+ endobj
21
+ 6 0 obj
22
+ << /Font << /F1 7 0 R >> /ProcSet [ /PDF /Text ] >>
23
+ endobj
24
+ 7 0 obj
25
+ << /BaseFont /Helvetica /Name /F1 /Subtype /Type1 /Type /Font >>
26
+ endobj
27
+ 8 0 obj
28
+ << /Filter /Standard /Length 128 /O <1517aad6ec33e7aaa17972b91854f2f7c05c11fc7fcafe7df725ffcfd4c55705> /P -4 /R 3 /U <6ccfb47c809a4bab70d578d957cee8240122456a91bae5134273a6db134c87c4> /V 2 >>
29
+ endobj
30
+ xref
31
+ 0 9
32
+ 0000000000 65535 f
33
+ 0000000015 00000 n
34
+ 0000000064 00000 n
35
+ 0000000129 00000 n
36
+ 0000000214 00000 n
37
+ 0000000294 00000 n
38
+ 0000000394 00000 n
39
+ 0000000461 00000 n
40
+ 0000000541 00000 n
41
+ trailer << /Info 2 0 R /Root 1 0 R /Size 9 /ID [<6790ffa610024e78369114311fc0df96><4b0eee51689dcb9ba602518b54b8c48d>] /Encrypt 8 0 R >>
42
+ startxref
43
+ 748
44
+ %%EOF
@@ -0,0 +1,43 @@
1
+ %PDF-1.5
2
+ %����
3
+ 1 0 obj
4
+ << /Pages 3 0 R /Type /Catalog >>
5
+ endobj
6
+ 2 0 obj
7
+ << /ModDate <a4edf0aa882dd1e784a1f0d956592496> >>
8
+ endobj
9
+ 3 0 obj
10
+ << /Count 1 /Kids [ 4 0 R ] /MediaBox [ 0 0 612 446 ] /Type /Pages >>
11
+ endobj
12
+ 4 0 obj
13
+ << /Contents 5 0 R /Parent 3 0 R /Resources 6 0 R /Type /Page >>
14
+ endobj
15
+ 5 0 obj
16
+ << /Length 51 >>
17
+ stream
18
+ ��&X*�2�Р#�b&�
19
  �X\4t��=���~YCa�4��K�v�l���endstream
20
+ endobj
21
+ 6 0 obj
22
+ << /Font << /F1 7 0 R >> /ProcSet [ /PDF /Text ] >>
23
+ endobj
24
+ 7 0 obj
25
+ << /BaseFont /Helvetica /Name /F1 /Subtype /Type1 /Type /Font >>
26
+ endobj
27
+ 8 0 obj
28
+ << /CF << /StdCF << /AuthEvent /DocOpen /CFM /V2 /Length 16 >> >> /Filter /Standard /Length 128 /O <1517aad6ec33e7aaa17972b91854f2f7c05c11fc7fcafe7df725ffcfd4c55705> /P -4 /R 4 /StmF /StdCF /StrF /StdCF /U <6ccfb47c809a4bab70d578d957cee8240122456a91bae5134273a6db134c87c4> /V 4 >>
29
+ endobj
30
+ xref
31
+ 0 9
32
+ 0000000000 65535 f
33
+ 0000000015 00000 n
34
+ 0000000064 00000 n
35
+ 0000000129 00000 n
36
+ 0000000214 00000 n
37
+ 0000000294 00000 n
38
+ 0000000394 00000 n
39
+ 0000000461 00000 n
40
+ 0000000541 00000 n
41
+ trailer << /Info 2 0 R /Root 1 0 R /Size 9 /ID [<6790ffa610024e78369114311fc0df96><c076b76a546e168a79166606212af08f>] /Encrypt 8 0 R >>
42
+ startxref
43
+ 837
44
+ %%EOF
@@ -0,0 +1,43 @@
1
+ %PDF-1.6
2
+ %����
3
+ 1 0 obj
4
+ << /Pages 3 0 R /Type /Catalog >>
5
+ endobj
6
+ 2 0 obj
7
+ << /ModDate <fbf7060c68ac30939db362469e7f0e1dde4c372fe75fb33db8f1f1d1cbde1d5448e3cf2279e902e3da77a6dbfe67a1e2> >>
8
+ endobj
9
+ 3 0 obj
10
+ << /Count 1 /Kids [ 4 0 R ] /MediaBox [ 0 0 612 446 ] /Type /Pages >>
11
+ endobj
12
+ 4 0 obj
13
+ << /Contents 5 0 R /Parent 3 0 R /Resources 6 0 R /Type /Page >>
14
+ endobj
15
+ 5 0 obj
16
+ << /Length 80 >>
17
+ stream
18
+ �L���j�
19
+ endobj
20
+ 6 0 obj
21
+ << /Font << /F1 7 0 R >> /ProcSet [ /PDF /Text ] >>
22
+ endobj
23
+ 7 0 obj
24
+ << /BaseFont /Helvetica /Name /F1 /Subtype /Type1 /Type /Font >>
25
+ endobj
26
+ 8 0 obj
27
+ << /CF << /StdCF << /AuthEvent /DocOpen /CFM /AESV2 /Length 16 >> >> /Filter /Standard /Length 128 /O <36451bd39d753b7c1d10922c28e6665aa4f3353fb0348b536893e3b1db5c579b> /P -4 /R 4 /StmF /StdCF /StrF /StdCF /U <21b497bba6ef18247f972715de1d12780122456a91bae5134273a6db134c87c4> /V 4 >>
28
+ endobj
29
+ xref
30
+ 0 9
31
+ 0000000000 65535 f
32
+ 0000000015 00000 n
33
+ 0000000064 00000 n
34
+ 0000000193 00000 n
35
+ 0000000278 00000 n
36
+ 0000000358 00000 n
37
+ 0000000487 00000 n
38
+ 0000000554 00000 n
39
+ 0000000634 00000 n
40
+ trailer << /Info 2 0 R /Root 1 0 R /Size 9 /ID [<6790ffa610024e78369114311fc0df96><0995393fccfd6be04530deefef6eaafd>] /Encrypt 8 0 R >>
41
+ startxref
42
+ 933
43
+ %%EOF
@@ -0,0 +1,43 @@
1
+ %PDF-1.4
2
+ %����
3
+ 1 0 obj
4
+ << /Pages 3 0 R /Type /Catalog >>
5
+ endobj
6
+ 2 0 obj
7
+ << /ModDate <05e6011e1e6068218845d13117a2ff4a> >>
8
+ endobj
9
+ 3 0 obj
10
+ << /Count 1 /Kids [ 4 0 R ] /MediaBox [ 0 0 612 446 ] /Type /Pages >>
11
+ endobj
12
+ 4 0 obj
13
+ << /Contents 5 0 R /Parent 3 0 R /Resources 6 0 R /Type /Page >>
14
+ endobj
15
+ 5 0 obj
16
+ << /Length 51 >>
17
+ stream
18
+ S�ޣg����S�U��;�㇟�i���g�Fe�<���5�q?��^#��ڄOendstream
19
+ endobj
20
+ 6 0 obj
21
+ << /Font << /F1 7 0 R >> /ProcSet [ /PDF /Text ] >>
22
+ endobj
23
+ 7 0 obj
24
+ << /BaseFont /Helvetica /Name /F1 /Subtype /Type1 /Type /Font >>
25
+ endobj
26
+ 8 0 obj
27
+ << /Filter /Standard /Length 128 /O <36451bd39d753b7c1d10922c28e6665aa4f3353fb0348b536893e3b1db5c579b> /P -4 /R 3 /U <21b497bba6ef18247f972715de1d12780122456a91bae5134273a6db134c87c4> /V 2 >>
28
+ endobj
29
+ xref
30
+ 0 9
31
+ 0000000000 65535 f
32
+ 0000000015 00000 n
33
+ 0000000064 00000 n
34
+ 0000000129 00000 n
35
+ 0000000214 00000 n
36
+ 0000000294 00000 n
37
+ 0000000394 00000 n
38
+ 0000000461 00000 n
39
+ 0000000541 00000 n
40
+ trailer << /Info 2 0 R /Root 1 0 R /Size 9 /ID [<6790ffa610024e78369114311fc0df96><4faaca305306e77695ef10973458e3e4>] /Encrypt 8 0 R >>
41
+ startxref
42
+ 748
43
+ %%EOF