Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement Static Defined Headers #160

Open
wants to merge 7 commits into
base: master
Choose a base branch
from

Conversation

evangallup
Copy link

@evangallup evangallup commented Aug 11, 2024

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.

@gettalong
Copy link
Member

How does headers interact with header? You mention that header should be set to true. In the code I can see that this means there is one header row. Shouldn't header be set to the number of rows in headers if the latter is used? I.e. that headers also automatically sets (and overrides) header?

@evangallup
Copy link
Author

How does headers interact with header? You mention that header should be set to true. In the code I can see that this means there is one header row. Shouldn't header be set to the number of rows in headers if the latter is used? I.e. that headers also automatically sets (and overrides) header?

Yes, that's a good point and may be something that needs further documentation. I tried not to change the functionality of the header option directly, only adding the headers option will replace the headers on pages after the first. I tried to make that clear in my example, that the header should be included in both the main table data as the first row and specified in the headers option.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

2 participants