Class: Prawn::FlexibleTable

Inherits:
Object
  • Object
show all
Includes:
Configurable
Defined in:
lib/prawn/flexible-table.rb,
lib/prawn/flexible-table/cell.rb

Overview

This class implements simple PDF flexible table generation.

Prawn tables have the following features:

* Can be generated with or without headers
* Can tweak horizontal and vertical padding of text
* Minimal styling support (borders / row background colors)
* Can be positioned by bounding boxes (left/center aligned) or an
  absolute x position
* Automated page-breaking as needed
* Column widths can be calculated automatically or defined explictly on a
  column by column basis
* Text alignment can be set for the whole table or by column
* Cells can have both rowspan and colspan attributes

The current implementation is a bit barebones, but covers most of the basic needs for PDF table generation. If you have feature requests, please share them at: groups.google.com/group/prawn-ruby

Defined Under Namespace

Classes: Cell, CellBlock, CellFake

Constant Summary collapse

NUMBER_PATTERN =

:nodoc:

/^-?(?:0|[1-9]\d*)(?:\.\d+(?:[eE][+-]?\d+)?)?$/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data, document, options = {}) ⇒ FlexibleTable

Creates a new Document::FlexibleTable object. This is generally called indirectly through Document#flexible_table but can also be used explictly.

The data argument is a two dimensional array of either string, FlexibleTable::Cell or hashes (with the options to create a Cell object), organized by row, e.g.:

[["r1-col1","r1-col2"],["r2-col2","r2-col2"]]

[ [ {:text => "r1-2 col1-2", :rowspan => 2, :colspan => 2}, "r1-col3"],
  [ {:text => "r2 col 3", :text_color => "EEAAFF" } ],
  [ "r3 col1", "r3 col2", "r3 col3" ] ]

As with all Prawn text drawing operations, strings must be UTF-8 encoded.

The following options are available for customizing your tables, with defaults shown in [] at the end of each description.

:headers

An array of table headers, either strings or Cells. [Empty]

:align_headers

Alignment of header text. Specify for entire header (:left) or by column ({ 0 => :right, 1 => :left}). If omitted, the header alignment is the same as the column alignment.

:header_text_color

Sets the text color of the headers

:header_color

Manually sets the header color

:font_size

The font size for the text cells . [12]

:horizontal_padding

The horizontal cell padding in PDF points [5]

:vertical_padding

The vertical cell padding in PDF points [5]

:padding

Horizontal and vertical cell padding (overrides both)

:border_width

With of border lines in PDF points [1]

:border_style

If set to :grid, fills in all borders. If set to :underline_header, underline header only. Otherwise, borders are drawn on columns only, not rows

:border_color

Sets the color of the borders.

:position

One of :left, :center or n, where n is an x-offset from the left edge of the current bounding box

:width:

A set width for the table, defaults to the sum of all column widths

:column_widths:

A hash of indices and widths in PDF points. E.g. { 0 => 50, 1 => 100 }

:row_colors

An array of row background colors which are used cyclicly.

:align

Alignment of text in columns, for entire table (:center) or by column ({ 0 => :left, 1 => :center})

Row colors are specified as html encoded values, e.g. [“ffffff”,“aaaaaa”,“ccaaff”]. You can also specify :row_colors => :pdf_writer if you wish to use the default color scheme from the PDF::Writer library.

See Document#flexible_table for typical usage, as directly using this class is not recommended unless you know why you want to do it.



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/prawn/flexible-table.rb', line 122

def initialize(data, document, options={})
  unless data.all? { |e| Array === e }
    raise Prawn::Errors::InvalidTableData,
      "data must be a two dimensional array of Prawn::Cells or strings"
  end

  @data     = data
  @document = document

  Prawn.verify_options [:font_size,:border_style, :border_width,
   :position, :headers, :row_colors, :align, :align_headers,
   :header_text_color, :border_color, :horizontal_padding,
   :vertical_padding, :padding, :column_widths, :width, :header_color ],
   options

  configuration.update(options)

  if padding = options[:padding]
    C(:horizontal_padding => padding, :vertical_padding => padding)
  end

  if options[:row_colors] == :pdf_writer
    C(:row_colors => ["ffffff","cccccc"])
  end

  if options[:row_colors]
    C(:original_row_colors => C(:row_colors))
  end

  # Once we have all configuration setted...
  normalize_data
  check_rows_lengths
  calculate_column_widths(options[:column_widths], options[:width])
end

Instance Attribute Details

#column_widthsObject (readonly)

:nodoc:



74
75
76
# File 'lib/prawn/flexible-table.rb', line 74

def column_widths
  @column_widths
end

Instance Method Details

#drawObject

Draws the table onto the PDF document



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
# File 'lib/prawn/flexible-table.rb', line 167

def draw
  @parent_bounds = @document.bounds
  case C(:position)
  when :center
    x = (@document.bounds.width - width) / 2.0
    dy = @document.bounds.absolute_top - @document.y
    @document.bounding_box [x, @parent_bounds.top], :width => width do
      @document.move_down(dy)
      generate_table
    end
  when Numeric
    x, y = C(:position), @document.y - @document.bounds.absolute_bottom
    @document.bounding_box([x,y], :width => width) { generate_table }
  else
    generate_table
  end
end

#widthObject

Width of the table in PDF points



161
162
163
# File 'lib/prawn/flexible-table.rb', line 161

def width
   @column_widths.inject(0) { |s,r| s + r }
end