prawn 2.3.0 → 2.5.0

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 (203) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/prawn/document/bounding_box.rb +223 -143
  4. data/lib/prawn/document/column_box.rb +61 -26
  5. data/lib/prawn/document/internals.rb +25 -16
  6. data/lib/prawn/document/span.rb +21 -18
  7. data/lib/prawn/document.rb +273 -182
  8. data/lib/prawn/encoding.rb +2 -5
  9. data/lib/prawn/errors.rb +23 -34
  10. data/lib/prawn/font.rb +254 -139
  11. data/lib/prawn/font_metric_cache.rb +18 -16
  12. data/lib/prawn/fonts/afm.rb +99 -57
  13. data/lib/prawn/fonts/dfont.rb +7 -1
  14. data/lib/prawn/fonts/otf.rb +4 -1
  15. data/lib/prawn/fonts/to_unicode_cmap.rb +151 -0
  16. data/lib/prawn/fonts/ttc.rb +7 -2
  17. data/lib/prawn/fonts/ttf.rb +345 -107
  18. data/lib/prawn/fonts.rb +14 -0
  19. data/lib/prawn/graphics/blend_mode.rb +25 -28
  20. data/lib/prawn/graphics/cap_style.rb +9 -12
  21. data/lib/prawn/graphics/color.rb +75 -50
  22. data/lib/prawn/graphics/dash.rb +45 -42
  23. data/lib/prawn/graphics/join_style.rb +18 -12
  24. data/lib/prawn/graphics/patterns.rb +239 -110
  25. data/lib/prawn/graphics/transformation.rb +51 -44
  26. data/lib/prawn/graphics/transparency.rb +16 -40
  27. data/lib/prawn/graphics.rb +370 -260
  28. data/lib/prawn/grid.rb +219 -57
  29. data/lib/prawn/image_handler.rb +27 -10
  30. data/lib/prawn/images/image.rb +8 -10
  31. data/lib/prawn/images/jpg.rb +46 -20
  32. data/lib/prawn/images/png.rb +94 -42
  33. data/lib/prawn/images.rb +70 -81
  34. data/lib/prawn/measurement_extensions.rb +39 -8
  35. data/lib/prawn/measurements.rb +60 -5
  36. data/lib/prawn/outline.rb +120 -113
  37. data/lib/prawn/repeater.rb +52 -36
  38. data/lib/prawn/security/arcfour.rb +4 -4
  39. data/lib/prawn/security.rb +106 -98
  40. data/lib/prawn/soft_mask.rb +42 -30
  41. data/lib/prawn/stamp.rb +38 -42
  42. data/lib/prawn/text/box.rb +156 -105
  43. data/lib/prawn/text/formatted/arranger.rb +121 -41
  44. data/lib/prawn/text/formatted/box.rb +239 -163
  45. data/lib/prawn/text/formatted/fragment.rb +130 -14
  46. data/lib/prawn/text/formatted/line_wrap.rb +49 -38
  47. data/lib/prawn/text/formatted/parser.rb +116 -74
  48. data/lib/prawn/text/formatted/wrap.rb +25 -26
  49. data/lib/prawn/text/formatted.rb +75 -0
  50. data/lib/prawn/text.rb +456 -211
  51. data/lib/prawn/transformation_stack.rb +29 -10
  52. data/lib/prawn/utilities.rb +13 -13
  53. data/lib/prawn/version.rb +2 -1
  54. data/lib/prawn/view.rb +69 -54
  55. data/lib/prawn.rb +24 -18
  56. data.tar.gz.sig +0 -0
  57. metadata +55 -262
  58. metadata.gz.sig +3 -4
  59. data/.yardopts +0 -10
  60. data/Gemfile +0 -5
  61. data/Rakefile +0 -54
  62. data/manual/absolute_position.pdf +0 -0
  63. data/manual/basic_concepts/adding_pages.rb +0 -26
  64. data/manual/basic_concepts/basic_concepts.rb +0 -43
  65. data/manual/basic_concepts/creation.rb +0 -38
  66. data/manual/basic_concepts/cursor.rb +0 -32
  67. data/manual/basic_concepts/measurement.rb +0 -24
  68. data/manual/basic_concepts/origin.rb +0 -37
  69. data/manual/basic_concepts/other_cursor_helpers.rb +0 -39
  70. data/manual/basic_concepts/view.rb +0 -48
  71. data/manual/bounding_box/bounding_box.rb +0 -41
  72. data/manual/bounding_box/bounds.rb +0 -48
  73. data/manual/bounding_box/canvas.rb +0 -23
  74. data/manual/bounding_box/creation.rb +0 -22
  75. data/manual/bounding_box/indentation.rb +0 -45
  76. data/manual/bounding_box/nesting.rb +0 -52
  77. data/manual/bounding_box/russian_boxes.rb +0 -40
  78. data/manual/bounding_box/stretchy.rb +0 -29
  79. data/manual/contents.rb +0 -35
  80. data/manual/cover.rb +0 -43
  81. data/manual/document_and_page_options/background.rb +0 -25
  82. data/manual/document_and_page_options/document_and_page_options.rb +0 -34
  83. data/manual/document_and_page_options/metadata.rb +0 -25
  84. data/manual/document_and_page_options/page_margins.rb +0 -36
  85. data/manual/document_and_page_options/page_size.rb +0 -34
  86. data/manual/document_and_page_options/print_scaling.rb +0 -22
  87. data/manual/example_helper.rb +0 -8
  88. data/manual/graphics/blend_mode.rb +0 -52
  89. data/manual/graphics/circle_and_ellipse.rb +0 -21
  90. data/manual/graphics/color.rb +0 -22
  91. data/manual/graphics/common_lines.rb +0 -29
  92. data/manual/graphics/fill_and_stroke.rb +0 -41
  93. data/manual/graphics/fill_rules.rb +0 -37
  94. data/manual/graphics/gradients.rb +0 -43
  95. data/manual/graphics/graphics.rb +0 -64
  96. data/manual/graphics/helper.rb +0 -27
  97. data/manual/graphics/line_width.rb +0 -36
  98. data/manual/graphics/lines_and_curves.rb +0 -40
  99. data/manual/graphics/polygon.rb +0 -27
  100. data/manual/graphics/rectangle.rb +0 -20
  101. data/manual/graphics/rotate.rb +0 -25
  102. data/manual/graphics/scale.rb +0 -42
  103. data/manual/graphics/soft_masks.rb +0 -44
  104. data/manual/graphics/stroke_cap.rb +0 -30
  105. data/manual/graphics/stroke_dash.rb +0 -47
  106. data/manual/graphics/stroke_join.rb +0 -29
  107. data/manual/graphics/translate.rb +0 -28
  108. data/manual/graphics/transparency.rb +0 -33
  109. data/manual/how_to_read_this_manual.rb +0 -39
  110. data/manual/images/absolute_position.rb +0 -22
  111. data/manual/images/fit.rb +0 -20
  112. data/manual/images/horizontal.rb +0 -24
  113. data/manual/images/images.rb +0 -41
  114. data/manual/images/plain_image.rb +0 -17
  115. data/manual/images/scale.rb +0 -21
  116. data/manual/images/vertical.rb +0 -27
  117. data/manual/images/width_and_height.rb +0 -24
  118. data/manual/layout/boxes.rb +0 -26
  119. data/manual/layout/content.rb +0 -24
  120. data/manual/layout/layout.rb +0 -27
  121. data/manual/layout/simple_grid.rb +0 -22
  122. data/manual/outline/add_subsection_to.rb +0 -60
  123. data/manual/outline/insert_section_after.rb +0 -46
  124. data/manual/outline/outline.rb +0 -33
  125. data/manual/outline/sections_and_pages.rb +0 -66
  126. data/manual/repeatable_content/alternate_page_numbering.rb +0 -36
  127. data/manual/repeatable_content/page_numbering.rb +0 -55
  128. data/manual/repeatable_content/repeatable_content.rb +0 -35
  129. data/manual/repeatable_content/repeater.rb +0 -54
  130. data/manual/repeatable_content/stamp.rb +0 -40
  131. data/manual/security/encryption.rb +0 -28
  132. data/manual/security/permissions.rb +0 -41
  133. data/manual/security/security.rb +0 -28
  134. data/manual/table.rb +0 -16
  135. data/manual/text/alignment.rb +0 -43
  136. data/manual/text/color.rb +0 -24
  137. data/manual/text/column_box.rb +0 -30
  138. data/manual/text/fallback_fonts.rb +0 -41
  139. data/manual/text/font.rb +0 -40
  140. data/manual/text/font_size.rb +0 -44
  141. data/manual/text/font_style.rb +0 -22
  142. data/manual/text/formatted_callbacks.rb +0 -65
  143. data/manual/text/formatted_text.rb +0 -58
  144. data/manual/text/free_flowing_text.rb +0 -50
  145. data/manual/text/inline.rb +0 -40
  146. data/manual/text/kerning_and_character_spacing.rb +0 -38
  147. data/manual/text/leading.rb +0 -24
  148. data/manual/text/line_wrapping.rb +0 -60
  149. data/manual/text/paragraph_indentation.rb +0 -32
  150. data/manual/text/positioned_text.rb +0 -37
  151. data/manual/text/registering_families.rb +0 -51
  152. data/manual/text/rendering_and_color.rb +0 -36
  153. data/manual/text/right_to_left_text.rb +0 -54
  154. data/manual/text/rotation.rb +0 -47
  155. data/manual/text/single_usage.rb +0 -36
  156. data/manual/text/text.rb +0 -75
  157. data/manual/text/text_box_excess.rb +0 -35
  158. data/manual/text/text_box_extensions.rb +0 -48
  159. data/manual/text/text_box_overflow.rb +0 -49
  160. data/manual/text/utf8.rb +0 -27
  161. data/manual/text/win_ansi_charset.rb +0 -62
  162. data/prawn.gemspec +0 -57
  163. data/spec/data/curves.pdf +0 -66
  164. data/spec/extensions/encoding_helpers.rb +0 -11
  165. data/spec/prawn/document/bounding_box_spec.rb +0 -546
  166. data/spec/prawn/document/column_box_spec.rb +0 -75
  167. data/spec/prawn/document/security_spec.rb +0 -176
  168. data/spec/prawn/document_annotations_spec.rb +0 -76
  169. data/spec/prawn/document_destinations_spec.rb +0 -15
  170. data/spec/prawn/document_grid_spec.rb +0 -99
  171. data/spec/prawn/document_reference_spec.rb +0 -27
  172. data/spec/prawn/document_span_spec.rb +0 -36
  173. data/spec/prawn/document_spec.rb +0 -802
  174. data/spec/prawn/font_metric_cache_spec.rb +0 -54
  175. data/spec/prawn/font_spec.rb +0 -542
  176. data/spec/prawn/graphics/blend_mode_spec.rb +0 -63
  177. data/spec/prawn/graphics/transparency_spec.rb +0 -81
  178. data/spec/prawn/graphics_spec.rb +0 -837
  179. data/spec/prawn/graphics_stroke_styles_spec.rb +0 -229
  180. data/spec/prawn/image_handler_spec.rb +0 -53
  181. data/spec/prawn/images/jpg_spec.rb +0 -20
  182. data/spec/prawn/images/png_spec.rb +0 -283
  183. data/spec/prawn/images_spec.rb +0 -224
  184. data/spec/prawn/measurements_extensions_spec.rb +0 -24
  185. data/spec/prawn/outline_spec.rb +0 -412
  186. data/spec/prawn/repeater_spec.rb +0 -165
  187. data/spec/prawn/soft_mask_spec.rb +0 -74
  188. data/spec/prawn/stamp_spec.rb +0 -172
  189. data/spec/prawn/text/box_spec.rb +0 -1112
  190. data/spec/prawn/text/formatted/arranger_spec.rb +0 -466
  191. data/spec/prawn/text/formatted/box_spec.rb +0 -846
  192. data/spec/prawn/text/formatted/fragment_spec.rb +0 -343
  193. data/spec/prawn/text/formatted/line_wrap_spec.rb +0 -494
  194. data/spec/prawn/text/formatted/parser_spec.rb +0 -697
  195. data/spec/prawn/text_draw_text_spec.rb +0 -149
  196. data/spec/prawn/text_rendering_mode_spec.rb +0 -48
  197. data/spec/prawn/text_spacing_spec.rb +0 -95
  198. data/spec/prawn/text_spec.rb +0 -603
  199. data/spec/prawn/text_with_inline_formatting_spec.rb +0 -35
  200. data/spec/prawn/transformation_stack_spec.rb +0 -66
  201. data/spec/prawn/view_spec.rb +0 -63
  202. data/spec/prawn_manual_spec.rb +0 -35
  203. data/spec/spec_helper.rb +0 -48
@@ -1,65 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # The <code>:callback</code> option is also available for the formatted text
4
- # methods.
5
- #
6
- # This option accepts an object (or array of objects) on which two methods
7
- # will be called if defined: <code>render_behind</code> and
8
- # <code>render_in_front</code>. They are called before and after rendering the
9
- # text fragment and are passed the fragment as an argument.
10
- #
11
- # This example defines two new callback classes and provide callback objects
12
- # for the formatted_text
13
-
14
- require_relative '../example_helper'
15
-
16
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
17
- Prawn::ManualBuilder::Example.generate(filename) do
18
- class HighlightCallback
19
- def initialize(options)
20
- @color = options[:color]
21
- @document = options[:document]
22
- end
23
-
24
- def render_behind(fragment)
25
- original_color = @document.fill_color
26
- @document.fill_color = @color
27
- @document.fill_rectangle(
28
- fragment.top_left,
29
- fragment.width,
30
- fragment.height
31
- )
32
- @document.fill_color = original_color
33
- end
34
- end
35
-
36
- class ConnectedBorderCallback
37
- def initialize(options)
38
- @radius = options[:radius]
39
- @document = options[:document]
40
- end
41
-
42
- def render_in_front(fragment)
43
- @document.stroke_polygon(
44
- fragment.top_left, fragment.top_right,
45
- fragment.bottom_right, fragment.bottom_left
46
- )
47
-
48
- @document.fill_circle(fragment.top_left, @radius)
49
- @document.fill_circle(fragment.top_right, @radius)
50
- @document.fill_circle(fragment.bottom_right, @radius)
51
- @document.fill_circle(fragment.bottom_left, @radius)
52
- end
53
- end
54
-
55
- highlight = HighlightCallback.new(color: 'ffff00', document: self)
56
- border = ConnectedBorderCallback.new(radius: 2.5, document: self)
57
-
58
- formatted_text [
59
- { text: 'hello', callback: highlight },
60
- { text: ' ' },
61
- { text: 'world', callback: border },
62
- { text: ' ' },
63
- { text: 'hello world', callback: [highlight, border] }
64
- ], size: 20
65
- end
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # There are two other text methods available: <code>formatted_text</code> and
4
- # <code>formatted_text_box</code>.
5
- #
6
- # These are useful when the provided text has numerous portions that need to be
7
- # formatted differently. As you might imply from their names the first should
8
- # be used for free flowing text just like the <code>text</code> method and the
9
- # last should be used for positioned text just like <code>text_box</code>.
10
- #
11
- # The main difference between these methods and the <code>text</code> and
12
- # <code>text_box</code> methods is how the text is provided. The
13
- # <code>formatted_text</code> and <code>formatted_text_box</code> methods accept
14
- # an array of hashes. Each hash must provide a <code>:text</code> option which
15
- # is the text string and may provide the following options: <code>:styles</code>
16
- # (an array of symbols), <code>:size</code> (the font size),
17
- # <code>:character_spacing</code> (additional space between the characters),
18
- # <code>:font</code> (the name of a registered font), <code>:color</code> (the
19
- # same input accepted by <code>fill_color</code> and <code>stroke_color</code>),
20
- # <code>:link</code> (an URL to create a link), and <code>:local</code>
21
- # (a link to a local file).
22
-
23
- require_relative '../example_helper'
24
-
25
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
26
- Prawn::ManualBuilder::Example.generate(filename) do
27
- formatted_text [
28
- { text: 'Some bold. ', styles: [:bold] },
29
- { text: 'Some italic. ', styles: [:italic] },
30
- { text: 'Bold italic. ', styles: %i[bold italic] },
31
- { text: 'Bigger Text. ', size: 20 },
32
- { text: 'More spacing. ', character_spacing: 3 },
33
- { text: 'Different Font. ', font: 'Courier' },
34
- { text: 'Some coloring. ', color: 'FF00FF' },
35
- {
36
- text: 'Link to the wiki. ',
37
- color: '0000FF',
38
- link: 'https://github.com/prawnpdf/prawn/wiki'
39
- },
40
- {
41
- text: 'Link to a local file. ',
42
- color: '0000FF',
43
- local: './local_file.txt'
44
- }
45
- ]
46
-
47
- formatted_text_box(
48
- [
49
- { text: 'Just your regular' },
50
- { text: ' text_box ', font: 'Courier' },
51
- {
52
- text: 'with some additional formatting options added to the mix.',
53
- color: [50, 100, 0, 0], styles: [:italic]
54
- }
55
- ],
56
- at: [100, 100], width: 200, height: 100
57
- )
58
- end
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Text rendering can be as simple or as complex as you want.
4
- #
5
- # This example covers the most basic method: <code>text</code>. It is meant for
6
- # free flowing text. The provided string will flow according to the current
7
- # bounding box width and height. It will also flow onto the next page if the
8
- # bottom of the bounding box is reached.
9
- #
10
- # The text will start being rendered on the current cursor position. When it
11
- # finishes rendering, the cursor is left directly below the text.
12
- #
13
- # This example also shows text flowing across pages following the margin box and
14
- # other bounding boxes.
15
-
16
- require_relative '../example_helper'
17
-
18
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
19
- Prawn::ManualBuilder::Example.generate(filename) do
20
- move_cursor_to 50
21
- text 'This text will flow to the next page. ' * 20
22
-
23
- y_position = cursor - 50
24
- bounding_box([0, y_position], width: 200, height: 150) do
25
- transparent(0.5) { stroke_bounds }
26
- text 'This text will flow along this bounding box we created for it. ' * 5
27
- end
28
-
29
- bounding_box([300, y_position], width: 200, height: 150) do
30
- transparent(0.5) { stroke_bounds } # This will stroke on one page
31
-
32
- text 'Now look what happens when the free flowing text reaches the end ' \
33
- 'of a bounding box that is narrower than the margin box.' +
34
- ' . ' * 200 +
35
- 'It continues on the next page as if the previous bounding box ' \
36
- 'was cloned. If we want it to have the same border as the one on ' \
37
- 'the previous page we will need to stroke the boundaries again.'
38
-
39
- transparent(0.5) { stroke_bounds } # And this will stroke on the next
40
- end
41
-
42
- move_cursor_to 200
43
- span(350, position: :center) do
44
- text 'Span is a different kind of bounding box as it lets the text ' \
45
- "flow gracefully onto the next page. It doesn't matter if the text " \
46
- 'started on the middle of the previous page, when it flows to the ' \
47
- 'next page it will start at the beginning.' + ' _ ' * 500 +
48
- 'I told you it would start on the beginning of this page.'
49
- end
50
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Inline formatting gives you the option to format specific portions of a text.
4
- # It uses HTML-esque syntax inside the text string. Supported tags are:
5
- # <code>b</code> (bold), <code>i</code> (italic), <code>u</code> (underline),
6
- # <code>strikethrough</code>, <code>sub</code> (subscript), <code>sup</code>
7
- # (superscript)
8
- #
9
- # The following tags accept specific attributes: <code>font</code> accepts
10
- # <code>size</code>, <code>name</code>, and <code>character_spacing</code>;
11
- # <code>color</code> accepts <code>rgb</code> and <code>cmyk</code>;
12
- # <code>link</code> accepts <code>href</code> for external links.
13
-
14
- require_relative '../example_helper'
15
-
16
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
17
- Prawn::ManualBuilder::Example.generate(filename) do
18
- %w[b i u strikethrough sub sup].each do |tag|
19
- text "Just your regular text <#{tag}>except this portion</#{tag}> " \
20
- "is using the #{tag} tag",
21
- inline_format: true
22
- move_down 10
23
- end
24
-
25
- text "This <font size='18'>line</font> uses " \
26
- "<font name='Courier'>all the font tag</font> attributes in " \
27
- "<font character_spacing='2'>a single line</font>. ",
28
- inline_format: true
29
- move_down 10
30
-
31
- text "Coloring in <color rgb='FF00FF'>both RGB</color> " \
32
- "<color c='100' m='0' y='0' k='0'>and CMYK</color>",
33
- inline_format: true
34
- move_down 10
35
-
36
- text 'This an external link to the ' \
37
- "<u><link href='https://github.com/prawnpdf/prawn/wiki'>Prawn wiki" \
38
- '</link></u>',
39
- inline_format: true
40
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Kerning is the process of adjusting the spacing between characters in a
4
- # proportional font. It is usually done with specific letter pairs. We can
5
- # switch it on and off if it is available with the current font. Just pass a
6
- # boolean value to the <code>:kerning</code> option of the text methods.
7
- #
8
- # Character Spacing is the space between characters. It can be increased or
9
- # decreased and will have effect on the whole text. Just pass a number to the
10
- # <code>:character_spacing</code> option from the text methods.
11
-
12
- require_relative '../example_helper'
13
-
14
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
15
- Prawn::ManualBuilder::Example.generate(filename) do
16
- font_size(30) do
17
- text_box 'With kerning:', kerning: true, at: [0, y - 40]
18
- text_box 'Without kerning:', kerning: false, at: [0, y - 80]
19
-
20
- text_box 'Tomato', kerning: true, at: [250, y - 40]
21
- text_box 'Tomato', kerning: false, at: [250, y - 80]
22
-
23
- text_box 'WAR', kerning: true, at: [400, y - 40]
24
- text_box 'WAR', kerning: false, at: [400, y - 80]
25
-
26
- text_box 'F.', kerning: true, at: [500, y - 40]
27
- text_box 'F.', kerning: false, at: [500, y - 80]
28
- end
29
-
30
- move_down 80
31
-
32
- string = 'What have you done to the space between the characters?'
33
- [-2, -1, 0, 0.5, 1, 2].each do |spacing|
34
- move_down 20
35
- text "#{string} (character_spacing: #{spacing})",
36
- character_spacing: spacing
37
- end
38
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Leading is the additional space between lines of text.
4
- #
5
- # The leading can be set using the <code>default_leading</code> method which
6
- # applies to the rest of the document or until it is changed, or inline in the
7
- # text methods with the <code>:leading</code> option.
8
- #
9
- # The default leading is <code>0</code>.
10
-
11
- require_require '../example_helper'
12
-
13
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
14
- Prawn::ManualBuilder::Example.generate(filename) do
15
- string = 'Hey, what did you do with the space between my lines? ' * 10
16
- text string, leading: 0
17
-
18
- move_down 20
19
- default_leading 5
20
- text string
21
-
22
- move_down 20
23
- text string, leading: 10
24
- end
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Line wrapping happens on white space or hyphens. Soft hyphens can be used to
4
- # indicate where words can be hyphenated. Non-breaking spaces can be used to
5
- # display space without allowing for a break.
6
- #
7
- # For writing styles that do not make use of spaces, the zero width space serves
8
- # to mark word boundaries. Zero width spaces are available only with external
9
- # fonts.
10
-
11
- require_relative '../example_helper'
12
-
13
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
14
- Prawn::ManualBuilder::Example.generate(filename) do
15
- text "Hard hyphens:\n" \
16
- 'Slip-sliding away, slip sliding awaaaay. You know the ' \
17
- "nearer your destination the more you're slip-sliding away."
18
- move_down 20
19
-
20
- shy = Prawn::Text::SHY
21
- text "Soft hyphens:\n" \
22
- "Slip slid#{shy}ing away, slip slid#{shy}ing away. You know the " \
23
- "nearer your destinat#{shy}ion the more you're slip slid#{shy}ing away."
24
- move_down 20
25
-
26
- nbsp = Prawn::Text::NBSP
27
- text "Non-breaking spaces:\n" \
28
- "Slip#{nbsp}sliding away, slip#{nbsp}sliding awaaaay. You know the " \
29
- "nearer your destination the more you're slip#{nbsp}sliding away."
30
- move_down 20
31
-
32
- font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf", size: 16) do
33
- long_text = "No word boundaries:\n更可怕的是,"\
34
- '同质化竞争对手可以按照URL中后面这个ID来遍历您的DB中的内容,'\
35
- '写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事,'\
36
- '这样的话,你就非常被动了。更可怕的是,'\
37
- '同质化竞争对手可以按照URL中后面这个ID来遍历您的DB中的内容,'\
38
- '写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事,'\
39
- '这样的话,你就非常被动了。'
40
- text long_text
41
- move_down 20
42
-
43
- zwsp = Prawn::Text::ZWSP
44
- long_text = "Invisible word boundaries:\n更#{zwsp}可怕的#{zwsp}是,"\
45
- "#{zwsp}同质化#{zwsp}竞争#{zwsp}对#{zwsp}手#{zwsp}可以#{zwsp}按照#{zwsp}"\
46
- "URL#{zwsp}中#{zwsp}后面#{zwsp}这个#{zwsp}ID#{zwsp}来#{zwsp}遍历#{zwsp}"\
47
- "您的#{zwsp}DB#{zwsp}中的#{zwsp}内容,#{zwsp}写个#{zwsp}小爬虫#{zwsp}把"\
48
- "#{zwsp}你的#{zwsp}页面#{zwsp}上的#{zwsp}关#{zwsp}键#{zwsp}信#{zwsp}息顺"\
49
- "#{zwsp}次#{zwsp}爬#{zwsp}下来#{zwsp}也#{zwsp}不是#{zwsp}什么#{zwsp}"\
50
- "难事,#{zwsp}这样的话,#{zwsp}你#{zwsp}就#{zwsp}非常#{zwsp}被动了。"\
51
- "#{zwsp}更#{zwsp}可怕的#{zwsp}是,#{zwsp}同质化#{zwsp}竞争#{zwsp}对"\
52
- "#{zwsp}手#{zwsp}可以#{zwsp}按照#{zwsp}URL#{zwsp}中#{zwsp}后面#{zwsp}"\
53
- "这个#{zwsp}ID#{zwsp}来#{zwsp}遍历#{zwsp}您的#{zwsp}DB#{zwsp}中的#{zwsp}"\
54
- "内容,#{zwsp}写个#{zwsp}小爬虫#{zwsp}把#{zwsp}你的#{zwsp}页面#{zwsp}"\
55
- "上的#{zwsp}关#{zwsp}键#{zwsp}信#{zwsp}息顺#{zwsp}次#{zwsp}爬#{zwsp}下来"\
56
- "#{zwsp}也#{zwsp}不是#{zwsp}什么#{zwsp}难事,#{zwsp}这样的话,#{zwsp}你"\
57
- "#{zwsp}就#{zwsp}非常#{zwsp}被动了。"
58
- text long_text
59
- end
60
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Prawn strips all whitespace from the beginning and the end of strings so there
4
- # are two ways to indent paragraphs:
5
- #
6
- # One is to use non-breaking spaces which Prawn won't strip. One shortcut to
7
- # using them is the <code>Prawn::Text::NBSP</code>.
8
- #
9
- # The other is to use the <code>:indent_paragraphs</code> option with the text
10
- # methods. Just pass a number with the space to indent the first line in each
11
- # paragraph.
12
-
13
- require_relative '../example_helper'
14
-
15
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
16
- Prawn::ManualBuilder::Example.generate(filename) do
17
- # Using non-breaking spaces
18
- text ' ' * 10 + "This paragraph won't be indented. " * 10 +
19
- "\n#{Prawn::Text::NBSP * 10}" + 'This one will with NBSP. ' * 10
20
-
21
- move_down 20
22
- text 'This paragraph will be indented. ' * 10 +
23
- "\n" + 'This one will too. ' * 10,
24
- indent_paragraphs: 60
25
-
26
- move_down 20
27
-
28
- text 'FROM RIGHT TO LEFT:'
29
- text 'This paragraph will be indented. ' * 10 +
30
- "\n" + 'This one will too. ' * 10,
31
- indent_paragraphs: 60, direction: :rtl
32
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Sometimes we want the text on a specific position on the page. The
4
- # <code>text</code> method just won't help us.
5
- #
6
- # There are two other methods for this task: <code>draw_text</code> and
7
- # <code>text_box</code>.
8
- #
9
- # <code>draw_text</code> is very simple. It will render text starting at the
10
- # position provided to the <code>:at</code> option. It won't flow to a new line
11
- # even if it hits the document boundaries so it is best suited for short text.
12
- #
13
- # <code>text_box</code> gives us much more control over the output. Just provide
14
- # <code>:width</code> and <code>:height</code> options and the text will flow
15
- # accordingly. Even if you don't provide a <code>:width</code> option the text
16
- # will flow to a new line if it reaches the right border.
17
- #
18
- # Given that, <code>text_box</code> is the better option available.
19
-
20
- require_relative '../example_helper'
21
-
22
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
23
- Prawn::ManualBuilder::Example.generate(filename) do
24
- draw_text "This draw_text line is absolute positioned. However don't " \
25
- 'expect it to flow even if it hits the document border',
26
- at: [200, 300]
27
-
28
- text_box 'This is a text box, you can control where it will flow by ' \
29
- 'specifying the :height and :width options',
30
- at: [100, 250],
31
- height: 100,
32
- width: 100
33
-
34
- text_box 'Another text box with no :width option passed, so it will ' \
35
- 'flow to a new line whenever it reaches the right margin. ',
36
- at: [200, 100]
37
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Registering font families will help you when you want to use a font over and
4
- # over or if you would like to take advantage of the <code>:style</code> option
5
- # of the text methods and the <code>b</code> and <code>i</code> tags when using
6
- # inline formatting.
7
- #
8
- # To register a font family update the <code>font_families</code>
9
- # hash with the font path for each style you want to use.
10
-
11
- require_relative '../example_helper'
12
-
13
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
14
- Prawn::ManualBuilder::Example.generate(filename) do
15
- # Registering a single external font
16
- font_families.update(
17
- 'DejaVu Sans' => {
18
- normal: "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf"
19
- }
20
- )
21
-
22
- font('DejaVu Sans') do
23
- text 'Using the DejaVu Sans font providing only its name to the font method'
24
- end
25
- move_down 20
26
-
27
- # Registering a DFONT package
28
- font_path = "#{Prawn::DATADIR}/fonts/Panic+Sans.dfont"
29
- font_families.update(
30
- 'Panic Sans' => {
31
- normal: { file: font_path, font: 'PanicSans' },
32
- italic: { file: font_path, font: 'PanicSans-Italic' },
33
- bold: { file: font_path, font: 'PanicSans-Bold' },
34
- bold_italic: { file: font_path, font: 'PanicSans-BoldItalic' }
35
- }
36
- )
37
-
38
- font 'Panic Sans'
39
- text 'Also using Panic Sans by providing only its name'
40
- move_down 20
41
-
42
- text 'Taking <b>advantage</b> of the <i>inline formatting</i>',
43
- inline_format: true
44
- move_down 20
45
-
46
- %i[bold bold_italic italic normal].each do |style|
47
- text "Using the #{style} style option.",
48
- style: style
49
- move_down 10
50
- end
51
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # You have already seen how to set the text color using both inline formatting
4
- # and the format text methods. There is another way by using the graphics
5
- # methods <code>fill_color</code> and <code>stroke_color</code>.
6
- #
7
- # When reading the graphics reference you learned about fill and stroke. If you
8
- # haven't read it before, read it now before continuing.
9
- #
10
- # Text can be rendered by
11
- # being filled (the default mode) or just stroked or both filled and stroked.
12
- # This can be set using the <code>text_rendering_mode</code> method or the
13
- # <code>:mode</code> option on the text methods.
14
-
15
- require_relative '../example_helper'
16
-
17
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
18
- Prawn::ManualBuilder::Example.generate(filename) do
19
- fill_color '00ff00'
20
- stroke_color '0000ff'
21
-
22
- font_size(40) do
23
- # normal rendering mode: fill
24
- text 'This text is filled with green.'
25
- move_down 20
26
-
27
- # inline rendering mode: stroke
28
- text 'This text is stroked with blue', mode: :stroke
29
- move_down 20
30
-
31
- # block rendering mode: fill and stroke
32
- text_rendering_mode(:fill_stroke) do
33
- text 'This text is filled with green and stroked with blue'
34
- end
35
- end
36
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Prawn can be used with right-to-left text. The direction can be set
4
- # document-wide, on particular text, or on a text-box. Setting the direction to
5
- # <code>:rtl</code> automatically changes the default alignment to
6
- # <code>:right</code>
7
- #
8
- # You can even override direction on an individual fragment. The one caveat is
9
- # that two fragments going against the main direction cannot be placed next to
10
- # each other without appearing in the wrong order.
11
- #
12
- # Writing bidirectional text that combines both left-to-right and right-to-left
13
- # languages is easy using the <code>bidi</code> Ruby Gem and its
14
- # <code>render_visual</code> function. See https://github.com/elad/ruby-bidi for
15
- # instructions and an example using Prawn.
16
-
17
- require_relative '../example_helper'
18
-
19
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
20
- Prawn::ManualBuilder::Example.generate(filename) do
21
- # set the direction document-wide
22
- self.text_direction = :rtl
23
-
24
- font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf", size: 16) do
25
- long_text = '写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事写个'\
26
- '小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事写个小爬虫把你的页'\
27
- '面上的关键信息顺次爬下来也不是什么难事写个小'
28
- text long_text
29
- move_down 20
30
-
31
- text 'You can override the document direction.', direction: :ltr
32
- move_down 20
33
-
34
- formatted_text [
35
- { text: '更可怕的是,同质化竞争对手可以按照' },
36
- { text: 'URL', direction: :ltr },
37
- { text: '中后面这个' },
38
- { text: 'ID', direction: :ltr },
39
- { text: '来遍历您的' },
40
- { text: 'DB', direction: :ltr },
41
- { text: '中的内容,写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么'\
42
- '难事,这样的话,你就非常被动了。' }
43
- ]
44
- move_down 20
45
-
46
- formatted_text [
47
- { text: '更可怕的是,同质化竞争对手可以按照' },
48
- { text: 'this', direction: :ltr },
49
- { text: "won't", direction: :ltr, size: 24 },
50
- { text: 'work', direction: :ltr },
51
- { text: '中的内容,写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事' }
52
- ]
53
- end
54
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Rotating text is best avoided on free flowing text, so this example
4
- # will only use the <code>text_box</code> method as we can have much more
5
- # control over its output.
6
- #
7
- # To rotate text all we need to do is use the <code>:rotate</code> option
8
- # passing an angle in degrees and an optional <code>:rotate_around</code> to
9
- # indicate the origin of the rotation (the default is <code>:upper_left</code>).
10
-
11
- require_relative '../example_helper'
12
-
13
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
14
- Prawn::ManualBuilder::Example.generate(filename) do
15
- width = 100
16
- height = 60
17
- angle = 30
18
- x = 200
19
- y = cursor - 30
20
-
21
- stroke_rectangle [0, y], width, height
22
- text_box(
23
- 'This text was not rotated',
24
- at: [0, y], width: width, height: height
25
- )
26
-
27
- stroke_rectangle [0, y - 100], width, height
28
- text_box(
29
- 'This text was rotated around the center',
30
- at: [0, y - 100], width: width, height: height,
31
- rotate: angle, rotate_around: :center
32
- )
33
-
34
- %i[lower_left upper_left lower_right upper_right]
35
- .each_with_index do |corner, index|
36
- y -= 100 if index == 2
37
- stroke_rectangle [x + (index % 2) * 200, y], width, height
38
- text_box(
39
- "This text was rotated around the #{corner} corner.",
40
- at: [x + (index % 2) * 200, y],
41
- width: width,
42
- height: height,
43
- rotate: angle,
44
- rotate_around: corner
45
- )
46
- end
47
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # The PDF format has some built-in font support. If you want to use other fonts
4
- # in Prawn you need to embed the font file.
5
- #
6
- # Doing this for a single font is extremely simple. Remember the Styling font
7
- # example? Another use of the <code>font</code> method is to provide a font file
8
- # path and the font will be embedded in the document and set as the current
9
- # font.
10
- #
11
- # This is reasonable if a font is used only once, but, if a font used several
12
- # times, providing the path each time it is used becomes cumbersome. The example
13
- # on the next page shows a better way to deal with fonts which are used several
14
- # times in a document.
15
-
16
- require_relative '../example_helper'
17
-
18
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
19
- Prawn::ManualBuilder::Example.generate(filename) do
20
- # Using a TTF font file
21
- font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") do
22
- text 'Written with the DejaVu Sans TTF font.'
23
- end
24
- move_down 20
25
-
26
- text 'Written with the default font.'
27
- move_down 20
28
-
29
- # Using an DFONT font file
30
- font("#{Prawn::DATADIR}/fonts/Panic+Sans.dfont") do
31
- text 'Written with the Panic Sans DFONT font'
32
- end
33
- move_down 20
34
-
35
- text 'Written with the default font once more.'
36
- end