2

I'm generating PDF's using the Prawn Gem and I'm unable to find a way to move the cursor down after text_box expands from overflow text, similar to the way a regular text call would.

Text_box example

pad(5) {
  text_box payable, :at => [bounds.left, cursor], :width => 540, :height => 15, :overflow => :expand, inline_format: true
}

move_down(15)

pad(5) {
  text_box address, :at => [bounds.left, cursor], :width => 250, :height => 15, :overflow => :expand, inline_format: true
  text_box city, :at => [250, cursor], :width => 100, :height => 15, :overflow => :expand, inline_format: true
  text_box state, :at => [350, cursor], :width => 75, :height => 15, :overflow => :expand, inline_format: true
  text_box zip, :at => [425, cursor], :width => 110, :height => 15, :overflow => :expand, inline_format: true
}

So above, I have to pad and move_down from the text_box payable in order for the next set of text_boxes to be formatted correctly without overlapping. If I use a straight text call on the payable string then the cursor moves down after all of the text is rendered, as expected.

The reason I'm using text_box over regular text is so that I can position text side by side on the same line. While this works great for strings thats all fit on a single line, it doesn't seem to play out well if one of those areas expands the text_box downwards because the cursor just starts at the next text line instead of below the expanded text_box.

Any insight or suggestions would be appreciated, thanks!

cdouble.bhuck
  • 507
  • 1
  • 5
  • 19

1 Answers1

5

You've probably figured out something by now but I'm also new to Prawn and had the same question so hopefully this will help someone else. This example shows both a text box and a formatted text box. There is probably somehow a better way but this is working for me.

  txt1 = "u" * 250
  txt2 = "v" * 600
  txt3 = "w" * 100
  txt4 = "x" * 500
  txt5 = "y" * 200
  txt6 = "z" * 400

  stroke_horizontal_rule

  options = {:document=>@pdf, :at=>[0,cursor]}
  text_box(txt1, options)
  measure = Prawn::Text::Box.new(txt1, options)
  measure.render(:dry_run => true)
  move_down(measure.height)

  options = {:document=>@pdf, :at=>[0,cursor]}
  text_box(txt2, options)
  measure = Prawn::Text::Box.new(txt2, options)
  measure.render(:dry_run => true)
  move_down(measure.height)

  options = {:document=>@pdf, :at=>[0,cursor]}
  text_box(txt3, options)
  measure = Prawn::Text::Box.new(txt3, options)
  measure.render(:dry_run => true)
  move_down(measure.height)

  array = [{:text=>txt4, :size=>12}]
  options = {:document=>@pdf, :at=>[0,cursor]}
  formatted_text_box(array, options)
  measure = Prawn::Text::Formatted::Box.new(array, options)
  measure.render(:dry_run => true)
  move_down(measure.height)

  array = [{:text=>txt5, :size=>16}]
  options = {:document=>@pdf, :at=>[0,cursor]}
  formatted_text_box(array, options)
  measure = Prawn::Text::Formatted::Box.new(array, options)
  measure.render(:dry_run => true)
  move_down(measure.height)

  array = [{:text=>txt6, :size=>12}]
  options = {:document=>@pdf, :at=>[0,cursor]}
  formatted_text_box(array, options)
  measure = Prawn::Text::Formatted::Box.new(array, options)
  measure.render(:dry_run => true)
  move_down(measure.height)

  stroke_horizontal_rule
adg
  • 552
  • 1
  • 6
  • 17