Module: PDF::Core::Text
- Defined in:
- lib/pdf/core/text.rb
Overview
:nodoc:
Defined Under Namespace
Classes: BadFontFamily
Constant Summary collapse
- VALID_OPTIONS =
These should be used as a base. Extensions may build on this list
%i[kerning size style].freeze
- MODES =
{ fill: 0, stroke: 1, fill_stroke: 2, invisible: 3, fill_clip: 4, stroke_clip: 5, fill_stroke_clip: 6, clip: 7 }.freeze
Instance Attribute Summary collapse
-
#skip_encoding ⇒ Object
readonly
Returns the value of attribute skip_encoding.
Instance Method Summary collapse
- #add_text_content(text, x, y, options) ⇒ Object
-
#character_spacing(amount = nil) ⇒ Object
Increases or decreases the space between characters.
-
#default_kerning(boolean) ⇒ Object
(also: #default_kerning=)
Call with a boolean to set the document-wide kerning setting.
-
#default_kerning? ⇒ Boolean
Retrieve the current default kerning setting.
-
#default_leading(number = nil) ⇒ Object
(also: #default_leading=)
Call with no argument to retrieve the current default leading.
-
#fallback_fonts(fallback_fonts = nil) ⇒ Object
(also: #fallback_fonts=)
Call with no argument to retrieve the current fallback fonts.
- #forget_text_rendering_mode! ⇒ Object
-
#horizontal_text_scaling(amount = nil) ⇒ Object
Set the horizontal scaling.
-
#process_text_options(options) ⇒ Object
Low level call to set the current font style and extract text options from an options hash.
-
#text_direction(direction = nil) ⇒ Object
(also: #text_direction=)
Call with no argument to retrieve the current text direction.
-
#text_rendering_mode(mode = nil) ⇒ Object
Call with no argument to retrieve the current text rendering mode.
-
#word_spacing(amount = nil) ⇒ Object
Increases or decreases the space between words.
Instance Attribute Details
#skip_encoding ⇒ Object (readonly)
Returns the value of attribute skip_encoding.
32 33 34 |
# File 'lib/pdf/core/text.rb', line 32 def skip_encoding @skip_encoding end |
Instance Method Details
#add_text_content(text, x, y, options) ⇒ Object
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 |
# File 'lib/pdf/core/text.rb', line 276 def add_text_content(text, x, y, ) chunks = font.encode_text(text, ) add_content "\nBT" if [:rotate] rad = [:rotate].to_f * Math::PI / 180 array = [ Math.cos(rad), Math.sin(rad), -Math.sin(rad), Math.cos(rad), x, y ] add_content "#{PDF::Core.real_params(array)} Tm" else add_content "#{PDF::Core.real_params([x, y])} Td" end chunks.each do |(subset, string)| font.add_to_current_page(subset) add_content [ PDF::Core.pdf_object(font.identifier_for(subset), true), PDF::Core.pdf_object(font_size, true), 'Tf' ].join(' ') operation = [:kerning] && string.is_a?(Array) ? 'TJ' : 'Tj' add_content "#{PDF::Core.pdf_object(string, true)} #{operation}" end add_content "ET\n" end |
#character_spacing(amount = nil) ⇒ Object
Increases or decreases the space between characters. For horizontal text, a positive value will increase the space. For veritical text, a positive value will decrease the space.
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 |
# File 'lib/pdf/core/text.rb', line 220 def character_spacing(amount = nil) if amount.nil? return defined?(@character_spacing) && @character_spacing || 0 end original_character_spacing = character_spacing if original_character_spacing == amount yield else @character_spacing = amount add_content "\n#{PDF::Core.real(amount)} Tc" yield add_content "\n#{PDF::Core.real(original_character_spacing)} Tc" @character_spacing = original_character_spacing end end |
#default_kerning(boolean) ⇒ Object Also known as: default_kerning=
Call with a boolean to set the document-wide kerning setting. This can be overridden using the :kerning text option when drawing text or a text box.
pdf.default_kerning = false
pdf.text('hello world') # text is not kerned
pdf.text('hello world', :kerning => true) # text is kerned
70 71 72 |
# File 'lib/pdf/core/text.rb', line 70 def default_kerning(boolean) @default_kerning = boolean end |
#default_kerning? ⇒ Boolean
Retrieve the current default kerning setting.
Defaults to true
56 57 58 59 60 |
# File 'lib/pdf/core/text.rb', line 56 def default_kerning? return true unless defined?(@default_kerning) @default_kerning end |
#default_leading(number = nil) ⇒ Object Also known as: default_leading=
Call with no argument to retrieve the current default leading.
Call with a number to set the document-wide text leading. This can be overridden using the :leading text option when drawing text or a text box.
pdf.default_leading = 7
pdf.text('hello world') # a leading of 7 is used
pdf.text('hello world', :leading => 0) # a leading of 0 is used
Defaults to 0
88 89 90 91 92 93 94 |
# File 'lib/pdf/core/text.rb', line 88 def default_leading(number = nil) if number.nil? defined?(@default_leading) && @default_leading || 0 else @default_leading = number end end |
#fallback_fonts(fallback_fonts = nil) ⇒ Object Also known as: fallback_fonts=
Call with no argument to retrieve the current fallback fonts.
Call with an array of font names. Each name must be the name of an AFM font or the name that was used to register a family of TTF fonts (see Prawn::Document#font_families). If present, then each glyph will be rendered using the first font that includes the glyph, starting with the current font and then moving through :fallback_fonts from left to right.
Call with an empty array to turn off fallback fonts
file = “#Prawn::DATADIR/fonts/gkai00mp.ttf” font_families = {
:normal => { :file => file, :font => 'Kai' }
} file = “#Prawn::DATADIR/fonts/Action Man.dfont” font_families[‘Action Man’] = {
:normal => { :file => file, :font => 'ActionMan' },
} fallback_fonts [‘Times-Roman’, ‘Kai’] font ‘Action Man’ text ‘hello ƒ 你好’ > hello prints in Action Man > ƒ prints in Times-Roman > 你好 prints in Kai
fallback_fonts [] # clears document-wide fallback fonts
Side effects:
-
Increased overhead when fallback fonts are declared as each glyph is checked to see whether it exists in the current font
160 161 162 163 164 165 166 |
# File 'lib/pdf/core/text.rb', line 160 def fallback_fonts(fallback_fonts = nil) if fallback_fonts.nil? defined?(@fallback_fonts) && @fallback_fonts || [] else @fallback_fonts = fallback_fonts end end |
#forget_text_rendering_mode! ⇒ Object
212 213 214 |
# File 'lib/pdf/core/text.rb', line 212 def forget_text_rendering_mode! @text_rendering_mode = :unknown end |
#horizontal_text_scaling(amount = nil) ⇒ Object
Set the horizontal scaling. amount is a number specifying the percentage of the normal width.
259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 |
# File 'lib/pdf/core/text.rb', line 259 def horizontal_text_scaling(amount = nil) if amount.nil? return defined?(@horizontal_text_scaling) && @horizontal_text_scaling || 100 end original_horizontal_text_scaling = horizontal_text_scaling if original_horizontal_text_scaling == amount yield else @horizontal_text_scaling = amount add_content "\n#{PDF::Core.real(amount)} Tz" yield add_content "\n#{PDF::Core.real(original_horizontal_text_scaling)} Tz" @horizontal_text_scaling = original_horizontal_text_scaling end end |
#process_text_options(options) ⇒ Object
Low level call to set the current font style and extract text options from an options hash. Should be called from within a save_font block
37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/pdf/core/text.rb', line 37 def () if [:style] raise BadFontFamily unless font.family font(font.family, style: [:style]) end # must compare against false to keep kerning on as default unless [:kerning] == false [:kerning] = font.has_kerning_data? end [:size] ||= font_size end |
#text_direction(direction = nil) ⇒ Object Also known as: text_direction=
Call with no argument to retrieve the current text direction.
Call with a symbol to set the document-wide text direction. This can be overridden using the :direction text option when drawing text or a text box.
pdf.text_direction = :rtl
pdf.text('hello world') # prints 'dlrow olleh'
pdf.text('hello world', :direction => :ltr) # prints 'hello world'
Valid directions are:
-
:ltr - left-to-right (default)
-
:rtl - right-to-left
Side effects:
-
When printing left-to-right, the default text alignment is :left
-
When printing right-to-left, the default text alignment is :right
118 119 120 121 122 123 124 |
# File 'lib/pdf/core/text.rb', line 118 def text_direction(direction = nil) if direction.nil? defined?(@text_direction) && @text_direction || :ltr else @text_direction = direction end end |
#text_rendering_mode(mode = nil) ⇒ Object
Call with no argument to retrieve the current text rendering mode.
Call with a symbol and block to temporarily change the current text rendering mode.
pdf.text_rendering_mode(:stroke) do
pdf.text('Outlined Text')
end
Valid modes are:
-
:fill - fill text (default)
-
:stroke - stroke text
-
:fill_stroke - fill, then stroke text
-
:invisible - invisible text
-
:fill_clip - fill text then add to path for clipping
-
:stroke_clip - stroke text then add to path for clipping
-
:fill_stroke_clip - fill then stroke text, then add to path for
clipping
-
:clip - add text to path for clipping
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
# File 'lib/pdf/core/text.rb', line 190 def text_rendering_mode(mode = nil) if mode.nil? return defined?(@text_rendering_mode) && @text_rendering_mode || :fill end unless MODES.key?(mode) raise ArgumentError, "mode must be between one of #{MODES.keys.join(', ')} (#{mode})" end original_mode = text_rendering_mode if original_mode == mode yield else @text_rendering_mode = mode add_content "\n#{MODES[mode]} Tr" yield add_content "\n#{MODES[original_mode]} Tr" @text_rendering_mode = original_mode end end |
#word_spacing(amount = nil) ⇒ Object
Increases or decreases the space between words. For horizontal text, a positive value will increase the space. For veritical text, a positive value will decrease the space.
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 |
# File 'lib/pdf/core/text.rb', line 241 def word_spacing(amount = nil) return defined?(@word_spacing) && @word_spacing || 0 if amount.nil? original_word_spacing = word_spacing if original_word_spacing == amount yield else @word_spacing = amount add_content "\n#{PDF::Core.real(amount)} Tw" yield add_content "\n#{PDF::Core.real(original_word_spacing)} Tw" @word_spacing = original_word_spacing end end |