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,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 <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
+ << /CF << /StdCF << /AuthEvent /DocOpen /CFM /V2 /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
+ 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><661ca7ec87f20561a30151a8a5843c75>] /Encrypt 8 0 R >>
41
+ startxref
42
+ 837
43
+ %%EOF
@@ -0,0 +1,43 @@
1
+ %PDF-1.3
2
+ %����
3
+ 1 0 obj
4
+ << /Pages 3 0 R /Type /Catalog >>
5
+ endobj
6
+ 2 0 obj
7
+ << /ModDate <37685a7cc84bd9593871ed21e68b49ed> >>
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
+ ��;bA�M�Q����yo^W0Hɋ�6Q� ��<6+�� 2z���0B-endstream
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 40 /O <2055c756c72e1ad702608e8196acad447ad32d17cff583235f6dd15fed7dab67> /P -4 /R 2 /U <8146f3ef018b3b0605e5906e43c29466b46e99d3a959b4b5a930d57f6b75532f> /V 1 >>
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><326c3f99b0e287c1f56d3e3ab4ea8094>] /Encrypt 8 0 R >>
41
+ startxref
42
+ 747
43
+ %%EOF
@@ -0,0 +1,43 @@
1
+ %PDF-1.7
2
+ %����
3
+ 1 0 obj
4
+ << /Extensions << /ADBE << /BaseVersion /1.7 /ExtensionLevel 8 >> >> /Pages 3 0 R /Type /Catalog >>
5
+ endobj
6
+ 2 0 obj
7
+ << /ModDate <455922159f89d1026308d41f22a451d85a5a669a0d5a1be0318f93344719d63d1bf506624cdfa3937cff6c2261e202fe> >>
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  ������g)�P� !���i�L6Ն�p��Z)"6�عF��:�v�2{��A$b����4)}Jq�}�m�zendstream
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 /AESV3 /Length 32 >> >> /Filter /Standard /Length 256 /O <c45f742ab136fcfcd2f087818c0b313173e48d71ea9dec2c81eb4901cf95fc6294e7fff6582866782d868d4e0d47f1a4> /OE <e830d8e49b1dbd2b51f5ee47e1e878aab7bef375ca5f958060797976066ffb3d> /P -4 /Perms <b9df61d4a12fe0a5999a83434c74150d> /R 6 /StmF /StdCF /StrF /StdCF /U <decb941205755642a6676045e8f2fd3e236a36dc0f289406d5f92024b237e3284f78784644c001a9ceda18e0930e59e9> /UE <6c6ed31bfd8b6a57925f0f9772e9f89020e4e5818dbaf49972b1d097ce76da6c> /V 5 >>
28
+ endobj
29
+ xref
30
+ 0 9
31
+ 0000000000 65535 f
32
+ 0000000015 00000 n
33
+ 0000000130 00000 n
34
+ 0000000259 00000 n
35
+ 0000000344 00000 n
36
+ 0000000424 00000 n
37
+ 0000000553 00000 n
38
+ 0000000620 00000 n
39
+ 0000000700 00000 n
40
+ trailer << /Info 2 0 R /Root 1 0 R /Size 9 /ID [<6790ffa610024e78369114311fc0df96><5f648b2e74202292047fe86bf8a5fd06>] /Encrypt 8 0 R >>
41
+ startxref
42
+ 1247
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 ( <\fxh[w\n5Q\036\006\r���) >>
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
+ ��GZP�)?�њR�L
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 <48c081f0c336098dedc672b1a9db79be8a725f1c5058c1f5f607568760fe00ff> /P -4 /R 3 /U <d8a5e98cfa55855f3e6b345754ec566d0122456a91bae5134273a6db134c87c4> /V 2 >>
28
+ endobj
29
+ xref
30
+ 0 9
31
+ 0000000000 65535 f
32
+ 0000000015 00000 n
33
+ 0000000064 00000 n
34
+ 0000000122 00000 n
35
+ 0000000207 00000 n
36
+ 0000000287 00000 n
37
+ 0000000387 00000 n
38
+ 0000000454 00000 n
39
+ 0000000534 00000 n
40
+ trailer << /Info 2 0 R /Root 1 0 R /Size 9 /ID [<6790ffa610024e78369114311fc0df96><39118f5697c8b03b4c9bbf209803ac6c>] /Encrypt 8 0 R >>
41
+ startxref
42
+ 741
43
+ %%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 ( <\fxh[w\n5Q\036\006\r���) >>
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
+ ��GZP�)?�њR�L
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 /V2 /Length 16 >> >> /Filter /Standard /Length 128 /O <48c081f0c336098dedc672b1a9db79be8a725f1c5058c1f5f607568760fe00ff> /P -4 /R 4 /StmF /StdCF /StrF /StdCF /U <d8a5e98cfa55855f3e6b345754ec566d0122456a91bae5134273a6db134c87c4> /V 4 >>
28
+ endobj
29
+ xref
30
+ 0 9
31
+ 0000000000 65535 f
32
+ 0000000015 00000 n
33
+ 0000000064 00000 n
34
+ 0000000122 00000 n
35
+ 0000000207 00000 n
36
+ 0000000287 00000 n
37
+ 0000000387 00000 n
38
+ 0000000454 00000 n
39
+ 0000000534 00000 n
40
+ trailer << /Info 2 0 R /Root 1 0 R /Size 9 /ID [<6790ffa610024e78369114311fc0df96><a65ce4ee60ce0ec3c085af5d116eba52>] /Encrypt 8 0 R >>
41
+ startxref
42
+ 830
43
+ %%EOF
@@ -0,0 +1,43 @@
1
+ %PDF-1.3
2
+ %����
3
+ 1 0 obj
4
+ << /Pages 3 0 R /Type /Catalog >>
5
+ endobj
6
+ 2 0 obj
7
+ << /ModDate <0be66c4cee690fdc183a03f22ef887f2> >>
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
+ s7%O\XB�3���P��'o�, t�r\E�+ӲO~��e���a�u��t�k endstream
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 40 /O <7cd7bfcb67cfd674ee7763f2b1de628f0c9dfbffeec502ca20f72fd75b53cf11> /P -4 /R 2 /U <2cf1aed973f9f587cffe98cabc1a4dc5590e190b745050abdef72d6faedf9e42> /V 1 >>
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><0aba54a06c2d675c8712aebe5a380bf3>] /Encrypt 8 0 R >>
41
+ startxref
42
+ 747
43
+ %%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 <fcf4da3e3e9aa585b3effe6447e0041898dc314aa36d93513110a923c73e7b0f55c95ddd59b3f1c8ad8a3b1a41d192a9> >>
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
+ ^�N�a��Rm�h��@_|no���.^��8g%m~^p�}^��a�ި|���TNٚ2�_��:y�MG}n�i�qwendstream
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 <12cf6ae199690f086a4ccd98a9158d8bd1316aad49fba55106a69442f36a603b> /P -4 /R 4 /StmF /StdCF /StrF /StdCF /U <9d374f31bbeda8b62c71680877bed2210122456a91bae5134273a6db134c87c4> /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><6ef50a8c59377b94b323ca57922f962a>] /Encrypt 8 0 R >>
41
+ startxref
42
+ 933
43
+ %%EOF
@@ -0,0 +1,43 @@
1
+ %PDF-1.7
2
+ %����
3
+ 1 0 obj
4
+ << /Extensions << /ADBE << /BaseVersion /1.7 /ExtensionLevel 8 >> >> /Pages 3 0 R /Type /Catalog >>
5
+ endobj
6
+ 2 0 obj
7
+ << /ModDate <b96936934c92f6becc11a0c5fa22e8dd9bc6e03ddd57ef3bf97bea18282fdf47f060dc40e90a8ac1ddaf2c1211327a16> >>
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
+ -�µi�#���yG��E����[�G�oE[z4k�_*_:z2�-m�"xт�^���5)G$�V:K�s&ۘAiE��ij�jWendstream
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 /AESV3 /Length 32 >> >> /Filter /Standard /Length 256 /O <371f521e2a1d5e550454704e52b598897491ff515d37b82648cf5f8f067b2076f271e7c6415ad9cef7a2f2683999a984> /OE <8a33575bdaef7c0bdae19fa684f26f1cb257c4efa3f30dd19196383cfe52de1b> /P -4 /Perms <003a9be14d9b17bf018c4b8cdb74934f> /R 6 /StmF /StdCF /StrF /StdCF /U <f8ad231585ebecdd9f64b5975bf57d1c3a0298937c1870abb91b93d920cddd878909d17f739201d1a7cde787148521e7> /UE <53452d54254f6bbabf566b41dd9302ae3863021efeb6af13adc6d512768d9829> /V 5 >>
28
+ endobj
29
+ xref
30
+ 0 9
31
+ 0000000000 65535 f
32
+ 0000000015 00000 n
33
+ 0000000130 00000 n
34
+ 0000000259 00000 n
35
+ 0000000344 00000 n
36
+ 0000000424 00000 n
37
+ 0000000553 00000 n
38
+ 0000000620 00000 n
39
+ 0000000700 00000 n
40
+ trailer << /Info 2 0 R /Root 1 0 R /Size 9 /ID [<6790ffa610024e78369114311fc0df96><ebca00a8b6842be1f05f9356799522b4>] /Encrypt 8 0 R >>
41
+ startxref
42
+ 1247
43
+ %%EOF
@@ -0,0 +1,43 @@
1
+ %PDF-1.3
2
+ %����
3
+ 1 0 obj
4
+ << /Pages 3 0 R /Type /Catalog >>
5
+ endobj
6
+ 2 0 obj
7
+ << /ModDate <6a8f7aee72b95ba745f34cb4d716b1f9> >>
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
+ ��<��.���:αu�g�>k|O,�.wq�د�m�qBZ{�I�~�y��endstream
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 40 /O <c94a371cecfd0749dece3d88358ef57d9c31b4312dcc0e8e6a30032b8fb0ab5b> /P -4 /R 2 /U <bf3574d85c47a8ae0f5e7f59d499a785944f96280b201f41ec92f6bf682dd20a> /V 1 >>
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><7fdb6c0379284bdb698f2c7884d09ff8>] /Encrypt 8 0 R >>
41
+ startxref
42
+ 747
43
+ %%EOF
@@ -0,0 +1,236 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'test_helper'
4
+
5
+ module CommonTokenizerTests
6
+ extend Minitest::Spec::DSL
7
+
8
+ it "next_token: returns all available kinds of tokens on next_token" do
9
+ create_tokenizer(<<-EOF.chomp.gsub(/^ {8}/, ''))
10
+ % Regular tokens
11
+ true false
12
+ 123 +17 -98 0 0059
13
+ 34.5 -3.62 +123.6 4. -.002 .002 0.0
14
+
15
+ % Keywords
16
+ obj endobj f* *f
17
+
18
+ % Specials
19
+ { }
20
+
21
+ % Literal string tests
22
+ (parenthese\\s ( ) and \\(\r
23
+ special \\0053\\053\\53characters\r (*!&}^% and \\
24
+ so \\\r
25
+ on).\\n)
26
+ ()
27
+
28
+ % Hex strings
29
+ <4E6F762073 686D6F7A20 6B612070
30
+ 6F702E>
31
+ < 901FA3 ><901fA>
32
+
33
+ % Names
34
+ /Name1
35
+ /ASomewhatLongerName
36
+ /A;Name_With-Various***Characters?
37
+ /1.2/$$
38
+ /@pattern
39
+ /.notdef
40
+ /lime#20Green
41
+ /paired#28#29parentheses
42
+ /The_Key_of_F#23_Minor
43
+ /A#42
44
+ /
45
+
46
+ % Arrays
47
+ [ 5 6 /Name ]
48
+ [5 6 /Name]
49
+
50
+ % Dictionaries
51
+ <</Name 5>>
52
+
53
+ % Test
54
+ EOF
55
+
56
+ expected_tokens = [
57
+ true, false,
58
+ 123, 17, -98, 0, 59,
59
+ 34.5, -3.62, 123.6, 4.0, -0.002, 0.002, 0.0,
60
+ 'obj', 'endobj', 'f*', '*f', '{', '}',
61
+ "parentheses ( ) and (\nspecial \0053++characters\n (*!&}^% and so on).\n", '',
62
+ "Nov shmoz ka pop.", "\x90\x1F\xA3", "\x90\x1F\xA0",
63
+ :Name1, :ASomewhatLongerName, :"A;Name_With-Various***Characters?",
64
+ :"1.2", :"$$", :"@pattern", :".notdef", :"lime Green", :"paired()parentheses",
65
+ :"The_Key_of_F#_Minor", :AB, :"",
66
+ '[', 5, 6, :Name, ']', '[', 5, 6, :Name, ']',
67
+ '<<', :Name, 5, '>>'
68
+ ].each {|t| t.force_encoding('BINARY') if t.respond_to?(:force_encoding) }
69
+
70
+ until expected_tokens.empty?
71
+ expected_token = expected_tokens.shift
72
+ token = @tokenizer.next_token
73
+ assert_equal(expected_token, token)
74
+ assert_equal(Encoding::BINARY, token.encoding) if token.kind_of?(String)
75
+ end
76
+ assert_equal(0, expected_tokens.length)
77
+ assert_equal(HexaPDF::Tokenizer::NO_MORE_TOKENS, @tokenizer.next_token)
78
+ end
79
+
80
+ it "next_token: should return name tokens in US-ASCII/UTF-8 or binary encoding" do
81
+ create_tokenizer("/ASomewhatLongerName")
82
+ token = @tokenizer.next_token
83
+ assert_equal(:ASomewhatLongerName, token)
84
+ assert_equal(Encoding::US_ASCII, token.encoding)
85
+
86
+ create_tokenizer("/Hößgang")
87
+ token = @tokenizer.next_token
88
+ assert_equal(:"Hößgang", token)
89
+ assert_equal(Encoding::UTF_8, token.encoding)
90
+
91
+ create_tokenizer('/H#c3#b6#c3#9fgang')
92
+ token = @tokenizer.next_token
93
+ assert_equal(:"Hößgang", token)
94
+ assert_equal(Encoding::UTF_8, token.encoding)
95
+
96
+ create_tokenizer('/H#E8lp')
97
+ token = @tokenizer.next_token
98
+ assert_equal("H\xE8lp".b.intern, token)
99
+ assert_equal(Encoding::BINARY, token.encoding)
100
+ end
101
+
102
+ it "next_token: fails on a greater than sign that is not part of a hex string" do
103
+ create_tokenizer(" >")
104
+ assert_raises(HexaPDF::MalformedPDFError) { @tokenizer.next_token }
105
+ end
106
+
107
+ it "next_token: fails on a missing greater than sign in a hex string" do
108
+ create_tokenizer("<ABCD")
109
+ assert_raises(HexaPDF::MalformedPDFError) { @tokenizer.next_token }
110
+ end
111
+
112
+ it "next_token: fails on unbalanced parentheses in a literal string" do
113
+ create_tokenizer("(href(test)")
114
+ assert_raises(HexaPDF::MalformedPDFError) { @tokenizer.next_token }
115
+ end
116
+
117
+ it "next_token: returns a PDF keyword for a solitary plus sign" do
118
+ create_tokenizer("+")
119
+ token = @tokenizer.next_token
120
+ assert_equal("+", token)
121
+ assert(token.kind_of?(HexaPDF::Tokenizer::Token))
122
+ end
123
+
124
+ it "next_token: should not fail when reading super long numbers" do
125
+ create_tokenizer("1" << "0" * 10_000)
126
+ assert_equal(10**10_000, @tokenizer.next_token)
127
+ end
128
+
129
+ it "next_object: works for all PDF object types, including array and dictionary" do
130
+ create_tokenizer(<<-EOF.chomp.gsub(/^ {8}/, ''))
131
+ true false null 123 34.5 (string) <4E6F76> /Name
132
+ [5 6 /Name] <</Name 5/Null null>>
133
+ EOF
134
+ assert_equal(true, @tokenizer.next_object)
135
+ assert_equal(false, @tokenizer.next_object)
136
+ assert_nil(@tokenizer.next_object)
137
+ assert_equal(123, @tokenizer.next_object)
138
+ assert_equal(34.5, @tokenizer.next_object)
139
+ assert_equal("string".b, @tokenizer.next_object)
140
+ assert_equal("Nov".b, @tokenizer.next_object)
141
+ assert_equal(:Name, @tokenizer.next_object)
142
+ assert_equal([5, 6, :Name], @tokenizer.next_object)
143
+ assert_equal({Name: 5}, @tokenizer.next_object)
144
+ end
145
+
146
+ it "next_object: allows keywords if the corresponding option is set" do
147
+ create_tokenizer("name")
148
+ obj = @tokenizer.next_object(allow_keyword: true)
149
+ assert_kind_of(HexaPDF::Tokenizer::Token, obj)
150
+ assert_equal('name', obj)
151
+ end
152
+
153
+ it "next_object: fails if the value is not a correct object" do
154
+ create_tokenizer("<< /name ] >>")
155
+ assert_raises(HexaPDF::MalformedPDFError) { @tokenizer.next_object }
156
+ create_tokenizer("other")
157
+ assert_raises(HexaPDF::MalformedPDFError) { @tokenizer.next_object }
158
+ create_tokenizer("<< (string) (key) >>")
159
+ assert_raises(HexaPDF::MalformedPDFError) { @tokenizer.next_object }
160
+ create_tokenizer("<< /NoValueForKey >>")
161
+ assert_raises(HexaPDF::MalformedPDFError) { @tokenizer.next_object }
162
+ end
163
+
164
+ it "next_object: fails for an array without closing bracket, encountering EOS" do
165
+ create_tokenizer("[1 2")
166
+ exception = assert_raises(HexaPDF::MalformedPDFError) { @tokenizer.next_object }
167
+ assert_match(/Unclosed array found/, exception.message)
168
+ end
169
+
170
+ it "next_object: fails for a dictionary without closing bracket, encountering EOS" do
171
+ create_tokenizer("<</Name 5")
172
+ exception = assert_raises(HexaPDF::MalformedPDFError) { @tokenizer.next_object }
173
+ assert_match(/must be PDF name objects.*EOS/, exception.message)
174
+ create_tokenizer("<</Name 5 /Other")
175
+ exception = assert_raises(HexaPDF::MalformedPDFError) { @tokenizer.next_object }
176
+ assert_match(/must be PDF name objects.*EOS/, exception.message)
177
+ end
178
+
179
+ it "returns the correct position on operations" do
180
+ create_tokenizer("hallo du" << " " * 50000 << "hallo du")
181
+ @tokenizer.next_token
182
+ assert_equal(5, @tokenizer.pos)
183
+
184
+ @tokenizer.skip_whitespace
185
+ assert_equal(6, @tokenizer.pos)
186
+
187
+ @tokenizer.next_byte
188
+ assert_equal(7, @tokenizer.pos)
189
+
190
+ @tokenizer.peek_token
191
+ assert_equal(7, @tokenizer.pos)
192
+
193
+ @tokenizer.next_token
194
+ assert_equal(8, @tokenizer.pos)
195
+
196
+ @tokenizer.next_token
197
+ assert_equal(50013, @tokenizer.pos)
198
+
199
+ @tokenizer.next_token
200
+ assert_equal(50016, @tokenizer.pos)
201
+
202
+ @tokenizer.next_token
203
+ assert_equal(50016, @tokenizer.pos)
204
+ end
205
+
206
+ it "returns the next byte" do
207
+ create_tokenizer('hallo')
208
+ assert_equal('h'.ord, @tokenizer.next_byte)
209
+ assert_equal('a'.ord, @tokenizer.next_byte)
210
+ end
211
+
212
+ it "returns the next token but doesn't advance the position on peek_token" do
213
+ create_tokenizer("hallo du")
214
+ 2.times do
215
+ assert_equal('hallo', @tokenizer.peek_token)
216
+ assert_equal(0, @tokenizer.pos)
217
+ end
218
+ end
219
+
220
+ it "next_xref_entry: works on correct entries" do
221
+ create_tokenizer("0000000001 00001 n \n0000000001 00032 f \n")
222
+ assert_equal([1, 1, 'n'], @tokenizer.next_xref_entry)
223
+ assert_equal([1, 32, 'f'], @tokenizer.next_xref_entry)
224
+ end
225
+
226
+ it "next_xref_entry: fails on invalidly formatted entries" do
227
+ create_tokenizer("0000000001 00001 g \n")
228
+ assert_raises(RuntimeError) { @tokenizer.next_xref_entry {|recoverable| refute(recoverable); raise } }
229
+ create_tokenizer("0000000001 00001 n\n")
230
+ assert_raises(RuntimeError) { @tokenizer.next_xref_entry {|recoverable| assert(recoverable); raise } }
231
+ create_tokenizer("0000000001 00001 n\r")
232
+ assert_raises(RuntimeError) { @tokenizer.next_xref_entry {|recoverable| assert(recoverable); raise } }
233
+ create_tokenizer("0000000001 00001 n\r\r")
234
+ assert_raises(RuntimeError) { @tokenizer.next_xref_entry {|recoverable| assert(recoverable); raise } }
235
+ end
236
+ end
@@ -0,0 +1,39 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'test_helper'
4
+ require 'hexapdf/content/processor'
5
+
6
+ module TestHelper
7
+
8
+ # Can be used to to record operators parsed from content streams.
9
+ class OperatorRecorder < HexaPDF::Content::Processor
10
+
11
+ undef :paint_xobject
12
+
13
+ attr_reader :recorded_ops
14
+
15
+ def initialize
16
+ super
17
+ operators.clear
18
+ @recorded_ops = []
19
+ end
20
+
21
+ def respond_to_missing?(*)
22
+ true
23
+ end
24
+
25
+ def method_missing(msg, *params)
26
+ @recorded_ops << (params.empty? ? [msg] : [msg, params])
27
+ end
28
+
29
+ end
30
+
31
+ # Asserts that the content string contains the operators.
32
+ def assert_operators(content, operators, only_names: false, range: 0..-1)
33
+ processor = TestHelper::OperatorRecorder.new
34
+ HexaPDF::Content::Parser.new.parse(content, processor)
35
+ result = processor.recorded_ops[range]
36
+ result.map!(&:first) if only_names
37
+ assert_equal(operators, result)
38
+ end
39
+ end