prawn-table icon indicating copy to clipboard operation
prawn-table copied to clipboard

Implement Static Defined Headers

Open evangallup opened this issue 6 months ago • 2 comments

An issue we have run into recently when building a PDF from a large set of data is memory usage.

We can alleviate this issue by creating tables in smaller chunks of the data with something like the below

@table_data.each_slice(500).with_index do |batch, i|
  doc.table(batch, width: doc.bounds.width) do
    #styling
  end
end

After implementing the above our memory usage was lowered from ~2.5gb to about 600mb. Great, but it introduced an issue for us.

The formatting still works, we don't end up with random page breaks. This issue is that it breaks the ability to use the headers option, because after the first chunk of data the first line is no longer the actual header.

This PR implements a headers option which can be used like the below

header_data = [table_data.first]
table_data.each_slice(500).with_index do |batch, i|
  doc.table(batch, header: true, headers: header_data, width: doc.bounds.width) do
    # same styling as before
    # you can also independently style the header cells themselves
    headers.size = 8
    headers.borders = []
    headers.padding = [0, 5, 5, 0]

    # and the individual columns of the header
    headers.column(0).width = doc.bounds.width * 0.08

    # and the rows
    headers.row(0).font_style = :bold
  end
end

I'd like to get thoughts on this. I'm not sure if there is anything I'm missing here. I did try to generate the manual in this branch, but ran into some errors when doing so.

evangallup avatar Aug 11 '24 02:08 evangallup