Class: Prawn::FlexibleTable
- Inherits:
-
Object
- Object
- Prawn::FlexibleTable
- 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
-
#column_widths ⇒ Object
readonly
:nodoc:.
Instance Method Summary collapse
-
#draw ⇒ Object
Draws the table onto the PDF document.
-
#initialize(data, document, options = {}) ⇒ FlexibleTable
constructor
Creates a new Document::FlexibleTable object.
-
#width ⇒ Object
Width of the table in PDF points.
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
orn
, wheren
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, ={}) 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. [: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 ], configuration.update() if padding = [:padding] C(:horizontal_padding => padding, :vertical_padding => padding) end if [:row_colors] == :pdf_writer C(:row_colors => ["ffffff","cccccc"]) end if [:row_colors] C(:original_row_colors => C(:row_colors)) end # Once we have all configuration setted... normalize_data check_rows_lengths calculate_column_widths([:column_widths], [:width]) end |
Instance Attribute Details
#column_widths ⇒ Object (readonly)
:nodoc:
74 75 76 |
# File 'lib/prawn/flexible-table.rb', line 74 def column_widths @column_widths end |
Instance Method Details
#draw ⇒ Object
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 |
#width ⇒ Object
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 |